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 Quality of life improvements v1.0.14
Mods/QOL_Improvements.dll
Decompiled 5 months agousing System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using HarmonyLib; using Il2CppRUMBLE.Managers; using Il2CppRUMBLE.MoveSystem; using Il2CppRUMBLE.Players; using Il2CppRUMBLE.Players.Subsystems; using Il2CppSystem.Collections.Generic; using MelonLoader; using Park_dingdong; using RumbleModUI; using RumbleModdingAPI; using RumbleSoundsOnSceneChange; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: MelonInfo(typeof(Class1), "QOL_improvements", "1.0.14", "Hasenparty", null)] [assembly: VerifyLoaderVersion(0, 6, 6)] [assembly: MelonGame("Buckethead Entertainment", "RUMBLE")] [assembly: MelonColor(255, 49, 36, 1)] [assembly: MelonAuthorColor(255, 49, 36, 1)] [assembly: AssemblyTitle("QOL_improvements")] [assembly: AssemblyDescription("Quality of life improvements")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("QOL_improvements")] [assembly: AssemblyCopyright("Copyright © 2024")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("8a963fb7-1e48-40b8-8a0c-a3a7d95dafd3")] [assembly: AssemblyFileVersion("1.0.14")] [assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] [assembly: AssemblyVersion("1.0.14.0")] namespace Park_dingdong; public static class BuildInfo { public const string ModName = "QOL_improvements"; public const string ModVersion = "1.0.14"; public const string Description = "Quality of life improvements"; public const string Author = "Hasenparty"; public const string Company = ""; } public class Validation : ValidationParameters { private int Length; public Validation(int i) { Length = i; } public override bool DoValidation(string Input) { if (Input.Length == Length) { return true; } return false; } } public class Class1 : MelonMod { [HarmonyPatch(typeof(Structure), "OnFetchFromPool")] public static class StructureRespawn { private static void Postfix(ref Structure __instance) { //IL_00d0: Unknown result type (might be due to invalid IL or missing references) //IL_00d5: Unknown result type (might be due to invalid IL or missing references) //IL_0104: Unknown result type (might be due to invalid IL or missing references) //IL_0109: Unknown result type (might be due to invalid IL or missing references) //IL_012d: Unknown result type (might be due to invalid IL or missing references) //IL_0138: Unknown result type (might be due to invalid IL or missing references) //IL_0144: Unknown result type (might be due to invalid IL or missing references) //IL_014f: Unknown result type (might be due to invalid IL or missing references) //IL_017d: Unknown result type (might be due to invalid IL or missing references) //IL_0182: Unknown result type (might be due to invalid IL or missing references) string name = ((Object)((Component)__instance.processableComponent).gameObject).name; GameObject gameObject = ((Component)__instance.processableComponent).gameObject; if ((!(scenename == "Map1") && !(scenename == "Map0")) || Players.GetEnemyPlayers().Count == 0) { return; } switch (name) { default: if (!(name == "Ball")) { break; } goto case "Pillar"; case "Pillar": case "Disc": case "Wall": case "RockCube": local_player_pos = ((Component)((Component)Players.GetLocalPlayer().Controller).gameObject.transform.GetChild(1)).gameObject.transform.position; opponent_player_pos = ((Component)((Component)Players.GetEnemyPlayers()[0].Controller).gameObject.transform.GetChild(1)).gameObject.transform.position; if ((Object)(object)gameObject != (Object)null && (Object)(object)gameObject.transform != (Object)null) { float num = Vector3.Distance(local_player_pos, gameObject.transform.position); float num2 = Vector3.Distance(opponent_player_pos, gameObject.transform.position); if (num < 3f && num2 > 3f) { structures_lookup[gameObject] = Vector3.Distance(local_player_pos, opponent_player_pos); time_lookup[gameObject] = 0f; } } else { MelonLogger.Msg("Smh went wrong please talk to the developer, 2"); } break; } } } public GameObject Name; public static string scenename; private Mod Mod = new Mod(); private ModSetting<bool> Sound; private ModSetting<bool> Name_tag; private ModSetting<int> NameTag_Mode; private ModSetting<bool> Debug_test; public static List<Player> Players; public static int newint = 1; public static int oldint = 1; public int health = 0; public int prevhealth = 0; public Stopwatch stopwatch = new Stopwatch(); public GameObject Enemy_Name; public static float range_dist; public Stopwatch timer = new Stopwatch(); public static List<float> distance = new List<float>(); public static bool running = false; public static Vector3 local_player_pos; public static Vector3 opponent_player_pos; public static float all; public static Dictionary<GameObject, float> structures_lookup = new Dictionary<GameObject, float>(); public static Dictionary<GameObject, float> time_lookup = new Dictionary<GameObject, float>(); public override void OnLateInitializeMelon() { UI.instance.UI_Initialized += OnUIInit; } public static List<float> ReadFile(string filePath) { List<float> list = new List<float>(); try { string[] source = File.ReadAllLines(filePath); return source.Where((string line) => !string.IsNullOrWhiteSpace(line)).Select(delegate(string line) { if (!float.TryParse(line.Replace(".", ","), out var result)) { throw new FormatException("Unable to parse '" + line + "' as a Float."); } return result; }).ToList(); } catch (Exception ex) { MelonLogger.Error((object)ex); MelonLogger.Msg("Please talk to the Developer. Something went wrong!"); return new List<float>(); } } public static float ReadAverage(string filePath) { List<float> list = ReadFile(filePath); if (list.Count != 0) { all = 0f; foreach (float item in list) { all += item; } all /= list.Count; return all; } return 0f; } public void OnUIInit() { //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Expected O, but got Unknown //IL_0070: Unknown result type (might be due to invalid IL or missing references) //IL_007a: Expected O, but got Unknown //IL_0092: Unknown result type (might be due to invalid IL or missing references) //IL_009c: Expected O, but got Unknown //IL_00b3: Unknown result type (might be due to invalid IL or missing references) //IL_00bd: Expected O, but got Unknown //IL_00d5: Unknown result type (might be due to invalid IL or missing references) //IL_00df: Expected O, but got Unknown try { Mod.ModName = "QOL_improvements"; Mod.ModVersion = "1.0.14"; Mod.SetFolder("QOL"); Mod.AddDescription("Description", "", "Quality of life improvements", new Tags { IsSummary = true }); Sound = Mod.AddToList("Sound", true, 1, "Ring if player joins park and also give output if player leaves.", new Tags()); Name_tag = Mod.AddToList("Name Tag", true, 2, "Shows the nametag of the opponent in matches if the player got hit.", new Tags()); NameTag_Mode = Mod.AddToList("Name tag Setting", 3, "0 = Above Head\n1 = On Hand\n3 = Custom, ps it only works for above head will fix in future", new Tags()); Debug_test = Mod.AddToList("Debug test", true, 4, "A new Debug mode for generating a pie chart this is unfinished and may malfunction.", new Tags()); Mod.GetFromFile(); Mod.ModSaved += Save; UI.instance.AddMod(Mod); MelonLogger.Msg("Added Mod"); } catch (Exception ex) { MelonLogger.Msg("Smh went wrong please talk to the developer, 2"); MelonLogger.Msg((object)ex); } } private void Save() { MelonLogger.Msg("Succesfully Saved"); } public override void OnSceneWasLoaded(int buildIndex, string sceneName) { scenename = sceneName; running = false; stopwatch.Start(); if (scenename != "Loader") { if (File.Exists("UserData\\QOL\\spawn_dist.txt")) { range_dist = ReadAverage("UserData\\QOL\\spawn_dist.txt"); } else { MelonLogger.Error("File not found: UserData\\QOL\\spawn_dist.txt"); range_dist = 0f; } float[] array = new float[6] { 0f, 2f, 6.1f, 8f, 15f, 11f }; float value = array.OrderBy((float n) => Math.Abs(n - range_dist)).First(); int num = Array.IndexOf(array, value); MelonLogger.Msg(range_dist + " / " + value + " / " + num); } structures_lookup = new Dictionary<GameObject, float>(); time_lookup = new Dictionary<GameObject, float>(); } public override void OnFixedUpdate() { if (!string.IsNullOrEmpty(scenename) && Calls.IsInitialized() && Calls.IsMapInitialized()) { switch (scenename) { case "Map0": case "Map1": HandleDebugMode(); HandleNameTag_main(); break; case "Park": HandleSound(); break; } } } private void HandleDebugMode() { //IL_00d1: Unknown result type (might be due to invalid IL or missing references) //IL_00d6: Unknown result type (might be due to invalid IL or missing references) //IL_00ac: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Unknown result type (might be due to invalid IL or missing references) //IL_008f: Unknown result type (might be due to invalid IL or missing references) //IL_00b1: Unknown result type (might be due to invalid IL or missing references) //IL_019e: Unknown result type (might be due to invalid IL or missing references) //IL_01af: Unknown result type (might be due to invalid IL or missing references) if (!(bool)((ModSetting)Debug_test).SavedValue) { return; } List<Player> enemyPlayers = Players.GetEnemyPlayers(); if (enemyPlayers == null || enemyPlayers.Count <= 0) { return; } try { Player obj = Players.GetEnemyPlayers()[0]; Vector3? obj2; if (obj == null) { obj2 = null; } else { PlayerController controller = obj.Controller; if (controller == null) { obj2 = null; } else { GameObject gameObject = ((Component)controller).gameObject; if (gameObject == null) { obj2 = null; } else { Transform child = gameObject.transform.GetChild(1); obj2 = ((child != null) ? new Vector3?(child.position) : null); } } } opponent_player_pos = (Vector3)(((??)obj2) ?? Vector3.zero); } catch (Exception ex) { MelonLogger.Error("Failed to get opponent position: " + ex.Message); opponent_player_pos = Vector3.zero; } foreach (KeyValuePair<GameObject, float> item in time_lookup.ToList()) { time_lookup[item.Key] += 0.1f; if (item.Value >= 70f) { structures_lookup.Remove(item.Key); time_lookup.Remove(item.Key); } } foreach (KeyValuePair<GameObject, float> item2 in structures_lookup.ToList()) { if (Vector3.Distance(opponent_player_pos, item2.Key.transform.position) < 2f) { MelonLogger.Msg((object)item2.Value); File.AppendAllText("UserData\\QOL\\spawn_dist.txt", $"{item2.Value}\n"); time_lookup.Remove(item2.Key); structures_lookup.Remove(item2.Key); } } } public void HandleNameTag_main() { List<Player> enemyPlayers = Players.GetEnemyPlayers(); if (enemyPlayers != null && enemyPlayers.Count > 0 && (bool)((ModSetting)Name_tag).SavedValue) { switch ((int)((ModSetting)NameTag_Mode).SavedValue) { case 0: HandleNameTag_head(); break; case 1: HandleNameTag_hand(); break; case 3: break; default: HandleNameTag_head(); break; } } } private void HandleNameTag_head() { Player val = Players.GetEnemyPlayers()[0]; PlayerData data = val.Data; health = ((data != null) ? data.HealthPoints : 0); if (health != prevhealth) { prevhealth = health; stopwatch.Restart(); PlayerController controller = val.Controller; if (controller != null) { GameObject gameObject = ((Component)controller).gameObject; if (gameObject != null) { Transform child = gameObject.transform.GetChild(9); if (child != null) { PlayerNameTag component = ((Component)child).GetComponent<PlayerNameTag>(); if (component != null) { component.FadePlayerNameTag(true); } } } } } if (!(stopwatch.Elapsed.TotalSeconds >= 2.0)) { return; } prevhealth = health; stopwatch.Reset(); PlayerController controller2 = val.Controller; if (controller2 == null) { return; } GameObject gameObject2 = ((Component)controller2).gameObject; if (gameObject2 == null) { return; } Transform child2 = gameObject2.transform.GetChild(9); if (child2 != null) { PlayerNameTag component2 = ((Component)child2).GetComponent<PlayerNameTag>(); if (component2 != null) { component2.FadePlayerNameTag(false); } } } public void HandleNameTag_hand() { try { MelonLogger.Msg("Not working for f sake"); } catch (Exception ex) { MelonLogger.Msg((object)ex); } } private void HandleSound() { if ((bool)((ModSetting)Sound).SavedValue) { PlayerManager playerManager = Managers.GetPlayerManager(); Players = ((playerManager != null) ? playerManager.AllPlayers : null) ?? new List<Player>(); newint = Players.Count; if (newint > oldint) { AdditionalSounds.PlaySound("\\QOL\\bell.mp3"); } else if (newint < oldint) { AdditionalSounds.PlaySound("\\QOL\\end.mp3"); } oldint = newint; } } }