RUMBLE does not support other mod managers. If you want to use a manager, you must use the RUMBLE Mod Manager, a manager specifically designed for this game.
Decompiled source of TournamentScoringMod v1.0.1
Mods/tournamentScoring.dll
Decompiled 5 months agousing System; using System.Diagnostics; using System.IO; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using Il2CppRUMBLE.Managers; using Il2CppRUMBLE.Players; using Il2CppRUMBLE.Utilities; using Il2CppTMPro; using MelonLoader; using Microsoft.CodeAnalysis; using RumbleModdingAPI; using UnityEngine; using tournamentScore; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: MelonInfo(typeof(main), "RUMBLE Tournament Scoring", "1.0.0", "davisg", null)] [assembly: MelonGame("Buckethead Entertainment", "RUMBLE")] [assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] [assembly: AssemblyCompany("tournamentScoring")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("tournamentScoring")] [assembly: AssemblyTitle("tournamentScoring")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace tournamentScore { public class main : MelonMod { private int localMatchWins = 0; private int remoteMatchWins = 0; private int localRoundsInLosses = 0; private int remoteRoundsInLosses = 0; private int localRoundWinsThisMatch = 0; private int remoteRoundWinsThisMatch = 0; private GameObject scoreboardGO; private TextMeshPro scoreboardText; private string currentScene = ""; private bool scoreboardSpawned = false; private Vector3 pendingPosition; private float spawnTimer = 0f; private bool spawnCountdownActive = false; private string logPath = "UserData/tournament_score_log.txt"; public override void OnLateInitializeMelon() { Calls.onMatchStarted += OnMatchStarted; Calls.onRoundEnded += OnRoundEnded; Calls.onMatchEnded += OnMatchEnded; } public override void OnSceneWasLoaded(int buildIndex, string sceneName) { //IL_00c6: Unknown result type (might be due to invalid IL or missing references) //IL_00b0: Unknown result type (might be due to invalid IL or missing references) //IL_00cb: Unknown result type (might be due to invalid IL or missing references) currentScene = sceneName; scoreboardSpawned = false; spawnCountdownActive = false; spawnTimer = 0f; MelonLogger.Msg("[DEBUG] Scene loaded: " + sceneName); if (sceneName == "Gym") { MelonLogger.Msg("[DEBUG] Gym loaded. Resetting scores and hiding scoreboard."); ResetScore(); if ((Object)(object)scoreboardGO != (Object)null) { scoreboardGO.SetActive(false); } } else if (sceneName == "Map0" || sceneName == "Map1") { pendingPosition = ((sceneName == "Map0") ? new Vector3(-10f, 5f, 0f) : new Vector3(12f, 5f, 0f)); MelonLogger.Msg("[DEBUG] Preparing to spawn scoreboard after delay..."); spawnCountdownActive = true; } } private void ResetScore() { localMatchWins = 0; remoteMatchWins = 0; localRoundsInLosses = 0; remoteRoundsInLosses = 0; LogScore(); UpdateScoreboardText(); MelonLogger.Msg("[DEBUG] Scoreboard and tournament scores reset to 0(0)-0(0)."); } public override void OnUpdate() { //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_00a4: Unknown result type (might be due to invalid IL or missing references) //IL_00a9: Unknown result type (might be due to invalid IL or missing references) //IL_00ae: Unknown result type (might be due to invalid IL or missing references) if (spawnCountdownActive) { spawnTimer += Time.deltaTime; if (spawnTimer >= 5f && !scoreboardSpawned) { SpawnScoreboard(); } } if (scoreboardSpawned && (Object)(object)scoreboardGO != (Object)null && (Object)(object)scoreboardText != (Object)null) { Camera val = Camera.main; if ((Object)(object)val != (Object)null) { scoreboardGO.transform.rotation = Quaternion.LookRotation(scoreboardGO.transform.position - ((Component)val).transform.position); } } if (Input.GetKeyDown((KeyCode)114)) { MelonLogger.Msg("[DEBUG] Reset key pressed. Resetting score manually!"); ResetScore(); } } private void SpawnScoreboard() { //IL_011a: Unknown result type (might be due to invalid IL or missing references) //IL_0130: Unknown result type (might be due to invalid IL or missing references) //IL_013a: Unknown result type (might be due to invalid IL or missing references) //IL_0162: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_00aa: Unknown result type (might be due to invalid IL or missing references) //IL_00c0: Unknown result type (might be due to invalid IL or missing references) //IL_00ca: Unknown result type (might be due to invalid IL or missing references) //IL_00e5: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)scoreboardGO == (Object)null) { scoreboardGO = Create.NewText("scoreboardText", 3f, Color.white, Vector3.zero, Quaternion.identity); if ((Object)(object)scoreboardGO != (Object)null) { scoreboardText = scoreboardGO.GetComponent<TextMeshPro>(); ((TMP_Text)scoreboardText).alignment = (TextAlignmentOptions)514; ((TMP_Text)scoreboardText).enableWordWrapping = false; ((TMP_Text)scoreboardText).fontSize = 3f; ((TMP_Text)scoreboardText).text = "0(0)-0(0)"; scoreboardGO.transform.position = pendingPosition; scoreboardGO.transform.localScale = Vector3.one * 5f; MelonLogger.Msg($"[DEBUG] Scoreboard spawned at {scoreboardGO.transform.position}"); } else { MelonLogger.Error("[ERROR] Failed to create scoreboard."); } } else { scoreboardGO.transform.position = pendingPosition; scoreboardGO.transform.localScale = Vector3.one * 5f; scoreboardGO.SetActive(true); MelonLogger.Msg($"[DEBUG] Reusing existing scoreboard. New position: {scoreboardGO.transform.position}"); } scoreboardSpawned = true; UpdateScoreboardText(); } private void OnMatchStarted() { MelonLogger.Msg("[DEBUG] Match started. Resetting round wins."); localRoundWinsThisMatch = 0; remoteRoundWinsThisMatch = 0; } private void OnRoundEnded() { try { PlayerManager instance = Singleton<PlayerManager>.instance; Player val = ((instance != null) ? instance.localPlayer : null); PlayerData val2 = ((val != null) ? val.Data : null); if (val == null || val2 == null) { MelonLogger.Warning("[WARNING] Missing local player data. Skipping round tracking."); return; } if (val2.HealthPoints > 0) { localRoundWinsThisMatch++; } else { remoteRoundWinsThisMatch++; } MelonLogger.Msg($"[DEBUG] Round ended. LocalRounds: {localRoundWinsThisMatch}, RemoteRounds: {remoteRoundWinsThisMatch}"); } catch (Exception ex) { MelonLogger.Error("[ERROR] Exception in OnRoundEnded: " + ex); } } private void OnMatchEnded() { try { bool flag = Players.IsHost(); if (localRoundWinsThisMatch > remoteRoundWinsThisMatch) { localMatchWins++; if (flag && remoteRoundWinsThisMatch > 0) { remoteRoundsInLosses++; MelonLogger.Msg("[DEBUG] Opponent was client and won rounds. Incrementing opponent parentheses."); } } else { remoteMatchWins++; if (!flag && localRoundWinsThisMatch > 0) { localRoundsInLosses++; MelonLogger.Msg("[DEBUG] Local was client and won rounds. Incrementing local parentheses."); } } MelonLogger.Msg($"[DEBUG] Match ended. Score: {localMatchWins}({localRoundsInLosses})-{remoteMatchWins}({remoteRoundsInLosses})"); LogScore(); UpdateScoreboardText(); } catch (Exception ex) { MelonLogger.Error("[ERROR] Exception in OnMatchEnded: " + ex); } } private void LogScore() { try { string text = $"===SCORING===\n{localMatchWins}({localRoundsInLosses})-{remoteMatchWins}({remoteRoundsInLosses})"; MelonLogger.Msg("[RUMBLE Tournament Scoring] " + text); string directoryName = Path.GetDirectoryName(logPath); if (!Directory.Exists(directoryName)) { Directory.CreateDirectory(directoryName); } File.WriteAllText(logPath, text); } catch (Exception ex) { MelonLogger.Error("[ERROR] Error writing to score file: " + ex); } } private void UpdateScoreboardText() { if (!((Object)(object)scoreboardText == (Object)null)) { ((TMP_Text)scoreboardText).text = $"{localMatchWins}({localRoundsInLosses})-{remoteMatchWins}({remoteRoundsInLosses})"; } } } }