using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Diagnostics; using System.Net.Http; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using System.Text; using System.Text.Json; using System.Text.Json.Serialization; using System.Threading.Tasks; using Assets.Scripts.Actors; using Assets.Scripts.Actors.Player; using Assets.Scripts.Game.Combat; using Assets.Scripts.Game.Combat.ConstantAttacks; using Assets.Scripts.Game.MapGeneration; using Assets.Scripts.Inventory__Items__Pickups; using Assets.Scripts.Inventory__Items__Pickups.AbilitiesPassive; using Assets.Scripts.Inventory__Items__Pickups.AbilitiesPassive.Implementations; using Assets.Scripts.Inventory__Items__Pickups.Chests; using Assets.Scripts.Inventory__Items__Pickups.Interactables; using Assets.Scripts.Inventory__Items__Pickups.Items; using Assets.Scripts.Inventory__Items__Pickups.Items.ItemImplementations; using Assets.Scripts.Inventory__Items__Pickups.Pickups; using Assets.Scripts.Inventory__Items__Pickups.Stats; using Assets.Scripts.Inventory__Items__Pickups.Upgrades; using Assets.Scripts.Inventory__Items__Pickups.Weapons; using Assets.Scripts.Managers; using Assets.Scripts.Menu.Shop; using Assets.Scripts.Saves___Serialization.Progression.Achievements; using Assets.Scripts.Saves___Serialization.Progression.Unlocks; using Assets.Scripts.Steam; using Assets.Scripts.Steam.LeaderboardsNew; using Assets.Scripts.UI.HUD; using Assets.Scripts.UI.InGame.Rewards; using Assets.Scripts.UI.InGame.Rewards.Effects; using BepInEx; using BepInEx.Core.Logging.Interpolation; using BepInEx.Logging; using BepInEx.Unity.IL2CPP; using HarmonyLib; using Il2CppInterop.Runtime; using Il2CppInterop.Runtime.Injection; using Il2CppInterop.Runtime.InteropTypes; using Il2CppInterop.Runtime.InteropTypes.Arrays; using Il2CppSystem; using Il2CppSystem.Collections.Generic; using Inventory__Items__Pickups.Xp_and_Levels; using Steamworks; using TMPro; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = "")] [assembly: AssemblyCompany("MegaBonkMod")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("MegaBonkMod")] [assembly: AssemblyTitle("MegaBonkMod")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] namespace MegaBonkMod; public class ModGui : MonoBehaviour { internal static readonly ConcurrentQueue MainThread = new ConcurrentQueue(); private bool _visible; private bool _authenticated; private bool _promptVisible; private string _passwordInput = ""; private const string Password = "kittens"; internal static bool ChartDisabled; internal static bool NeedVersionPatch; internal static bool UpdateAvailable; private GameObject _statsParent; private GameObject _damageWindow; private GameObject _statsWindowObj; private GameObject _questsWindow; private Vector2 _winPos = new Vector2(20f, 20f); private bool _dragging; private Vector2 _dragOffset; private bool _powerupOpen = true; private const float FastFallSpeed = 15f; private const float FastFallRampTime = 0.2f; private float _fastFallTimer; private const float WinW = 440f; private const float PadX = 8f; private const float LineH = 22f; public ModGui(IntPtr ptr) : base(ptr) { }//IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Unknown result type (might be due to invalid IL or missing references) private unsafe void Update() { //IL_02fa: Unknown result type (might be due to invalid IL or missing references) //IL_030b: Unknown result type (might be due to invalid IL or missing references) //IL_0351: Unknown result type (might be due to invalid IL or missing references) //IL_0361: Unknown result type (might be due to invalid IL or missing references) //IL_0363: Unknown result type (might be due to invalid IL or missing references) //IL_0368: Unknown result type (might be due to invalid IL or missing references) //IL_036d: Unknown result type (might be due to invalid IL or missing references) //IL_0392: Unknown result type (might be due to invalid IL or missing references) //IL_0394: Unknown result type (might be due to invalid IL or missing references) //IL_0399: Unknown result type (might be due to invalid IL or missing references) //IL_039e: Unknown result type (might be due to invalid IL or missing references) //IL_0076: Unknown result type (might be due to invalid IL or missing references) //IL_007b: Unknown result type (might be due to invalid IL or missing references) //IL_02a1: Unknown result type (might be due to invalid IL or missing references) //IL_02a6: Unknown result type (might be due to invalid IL or missing references) //IL_02a8: Unknown result type (might be due to invalid IL or missing references) //IL_02b8: Unknown result type (might be due to invalid IL or missing references) //IL_02bf: Unknown result type (might be due to invalid IL or missing references) //IL_02ce: Unknown result type (might be due to invalid IL or missing references) //IL_02d5: Unknown result type (might be due to invalid IL or missing references) Action result; while (MainThread.TryDequeue(out result)) { try { result(); } catch { } } if (NeedVersionPatch) { string version = Application.version; foreach (TextMeshProUGUI item in Object.FindObjectsOfType()) { if (((TMP_Text)item).text != null && ((TMP_Text)item).text.Contains(version)) { BepInPlugin val = (BepInPlugin)Attribute.GetCustomAttribute(typeof(Plugin), typeof(BepInPlugin)); string text = (((int)val == 0) ? null : ((object)val.Version)?.ToString()) ?? "?"; ((TMP_Text)item).text = "Mod v" + text + " | " + ((TMP_Text)item).text; NeedVersionPatch = false; break; } } } if (Input.GetKeyDown((KeyCode)282)) { if (_authenticated) { _visible = !_visible; } else { _promptVisible = !_promptVisible; _passwordInput = ""; } } if (_promptVisible && !_authenticated) { string inputString = Input.inputString; for (int i = 0; i < inputString.Length; i++) { char c = inputString[i]; switch (c) { case '\b': if (_passwordInput.Length > 0) { _passwordInput = _passwordInput.Substring(0, _passwordInput.Length - 1); } break; case '\n': case '\r': if (_passwordInput == "kittens") { _authenticated = true; _promptVisible = false; _visible = true; } else { _passwordInput = ""; } break; default: _passwordInput += c; break; } } } if (Input.GetKeyDown((KeyCode)283) && !ChartDisabled) { ToggleDamageChart(); } try { PlayerMovement instance = PlayerMovement.Instance; if ((Object)(object)instance != (Object)null) { if (*(byte*)(void*)(((Il2CppObjectBase)instance).Pointer + 223) == 0 && MyInputManager.GetButton(MyInputManager.Slide)) { _fastFallTimer = Mathf.Min(_fastFallTimer + Time.deltaTime, 0.2f); float num = _fastFallTimer / 0.2f; float num2 = 15f * (num * num); if (num2 > 0.01f) { Rigidbody component = ((Component)instance).GetComponent(); if ((Object)(object)component != (Object)null) { Vector3 velocity = component.velocity; if (velocity.y <= 0f) { component.velocity = new Vector3(velocity.x, Mathf.Min(velocity.y, 0f - num2), velocity.z); } } } } else { _fastFallTimer = 0f; } } } catch { } if (!_visible) { return; } float x = Input.mousePosition.x; float num3 = (float)Screen.height - Input.mousePosition.y; Vector2 val2 = default(Vector2); ((Vector2)(ref val2))..ctor(x, num3); if (Input.GetMouseButtonDown(0)) { Rect val3 = default(Rect); ((Rect)(ref val3))..ctor(_winPos.x, _winPos.y, 440f, 26f); if (((Rect)(ref val3)).Contains(val2)) { _dragging = true; _dragOffset = val2 - _winPos; } } if (Input.GetMouseButtonUp(0)) { _dragging = false; } if (_dragging && Input.GetMouseButton(0)) { _winPos = val2 - _dragOffset; } } internal void ResetChartCache() { _statsParent = null; } private void ToggleDamageChart() { //IL_014d: 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_0177: Unknown result type (might be due to invalid IL or missing references) //IL_018c: Unknown result type (might be due to invalid IL or missing references) try { if ((Object)(object)_statsParent == (Object)null) { _statsParent = GameObject.Find("GameUI/GameUI/DeathScreen/StatsWindows"); if ((Object)(object)_statsParent != (Object)null) { Transform obj = _statsParent.transform.Find("W_Damage"); _damageWindow = ((obj != null) ? ((Component)obj).gameObject : null); Transform obj2 = _statsParent.transform.Find("W_Stats"); _statsWindowObj = ((obj2 != null) ? ((Component)obj2).gameObject : null); Transform obj3 = _statsParent.transform.Find("W_Quests"); _questsWindow = ((obj3 != null) ? ((Component)obj3).gameObject : null); } } if ((Object)(object)_statsParent == (Object)null) { return; } bool flag = !_statsParent.activeSelf; _statsParent.SetActive(flag); if ((Object)(object)_statsWindowObj != (Object)null) { _statsWindowObj.SetActive(!flag); } if ((Object)(object)_questsWindow != (Object)null) { _questsWindow.SetActive(!flag); } if (flag) { GameOverDamageSourcesUi componentInChildren = _statsParent.GetComponentInChildren(); if ((Object)(object)componentInChildren != (Object)null) { componentInChildren.Start(); } RectTransform component = _statsParent.GetComponent(); if ((Object)(object)component != (Object)null) { component.anchorMin = new Vector2(0f, 0.5f); component.anchorMax = new Vector2(0f, 0.5f); component.pivot = new Vector2(0f, 0.5f); component.anchoredPosition = new Vector2(20f, 0f); } } } catch { } } private void OnGUI() { //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_00b6: Unknown result type (might be due to invalid IL or missing references) //IL_00e1: Unknown result type (might be due to invalid IL or missing references) //IL_0118: Unknown result type (might be due to invalid IL or missing references) //IL_018b: Unknown result type (might be due to invalid IL or missing references) //IL_01ca: Unknown result type (might be due to invalid IL or missing references) //IL_02b8: Unknown result type (might be due to invalid IL or missing references) //IL_02ff: Unknown result type (might be due to invalid IL or missing references) //IL_0238: Unknown result type (might be due to invalid IL or missing references) //IL_022a: Unknown result type (might be due to invalid IL or missing references) //IL_034c: Unknown result type (might be due to invalid IL or missing references) //IL_023d: Unknown result type (might be due to invalid IL or missing references) //IL_0240: Unknown result type (might be due to invalid IL or missing references) //IL_0258: Unknown result type (might be due to invalid IL or missing references) //IL_0270: Unknown result type (might be due to invalid IL or missing references) //IL_0287: Unknown result type (might be due to invalid IL or missing references) if (UpdateAvailable) { float num = 420f; float num2 = 36f; float num3 = ((float)Screen.width - num) / 2f; float num4 = 8f; GUI.Box(new Rect(num3, num4, num, num2), ""); GUI.Label(new Rect(num3 + 8f, num4 + 8f, num - 16f, 20f), "!! MegaBonk Mod is outdated — please update to the latest version !!"); } if (_promptVisible && !_authenticated) { float num5 = 240f; float num6 = 72f; float num7 = ((float)Screen.width - num5) / 2f; float num8 = ((float)Screen.height - num6) / 2f; GUI.Box(new Rect(num7, num8, num5, num6), "Mod Menu Password"); GUI.Label(new Rect(num7 + 8f, num8 + 26f, num5 - 16f, 22f), new string('*', _passwordInput.Length)); GUI.Label(new Rect(num7 + 8f, num8 + 50f, num5 - 16f, 18f), "Type password + Enter"); } else { if (!_visible) { return; } float x = _winPos.x; float y = _winPos.y; float num9 = 424f; float num10 = x + 8f; float num11 = 32f; num11 += 22f; if (_powerupOpen) { num11 += 88f; } num11 += 26f; num11 += 30f; GUI.Box(new Rect(x, y, 440f, num11), "MegaBonk Mod"); float num12 = y + 22f + 6f; GUIStyle button = GUI.skin.button; _ = GUI.skin.toggle; _powerupOpen = GUI.Toggle(new Rect(num10, num12, num9, 22f), _powerupOpen, (_powerupOpen ? "[-] " : "[+] ") + "Spawn Powerup", button); num12 += 24f; if (_powerupOpen) { PickupManager instance = PickupManager.Instance; PlayerMovement instance2 = PlayerMovement.Instance; Vector3 pos = (((Object)(object)instance2 != (Object)null) ? ((Component)instance2).transform.position : Vector3.zero); SpawnPowerupRow(instance, pos, num10, ref num12, num9, (EPickup)2, "Health", (EPickup)3, "Nuke"); SpawnPowerupRow(instance, pos, num10, ref num12, num9, (EPickup)4, "Clock", (EPickup)5, "Shield"); SpawnPowerupRow(instance, pos, num10, ref num12, num9, (EPickup)6, "Rage", (EPickup)7, "Haste"); SpawnPowerupRow(instance, pos, num10, ref num12, num9, (EPickup)8, "Stonks", (EPickup)9, "Magnet"); } float num13 = (num9 - 4f) / 2f; if (GUI.Button(new Rect(num10, num12, num13, 22f), "+1000 XP")) { GameManager instance3 = GameManager.Instance; PlayerInventory val = ((instance3 != null) ? instance3.GetPlayerInventory() : null); if (val != null) { val.AddXp(1000); } } if (GUI.Button(new Rect(num10 + num13 + 4f, num12, num13, 22f), "+1000 Gold")) { GameManager instance4 = GameManager.Instance; PlayerInventory val2 = ((instance4 != null) ? instance4.GetPlayerInventory() : null); if (val2 != null) { val2.ChangeGold(1000); } } num12 += 26f; GUI.Label(new Rect(num10, num12 + 4f, num9, 22f), "F1 to toggle | F2 dmg chart | Drag title bar"); } } private static void SpawnPowerupRow(PickupManager pm, Vector3 pos, float x, ref float y, float cw, EPickup left, string leftLabel, EPickup right, string rightLabel) { //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Unknown result type (might be due to invalid IL or missing references) //IL_006b: Unknown result type (might be due to invalid IL or missing references) float num = (cw - 4f) / 2f; if (GUI.Button(new Rect(x, y, num, 22f), leftLabel) && (Object)(object)pm != (Object)null) { pm.SpawnPickup(left, pos, 1, false, 0f); } if (GUI.Button(new Rect(x + num + 4f, y, num, 22f), rightLabel) && (Object)(object)pm != (Object)null) { pm.SpawnPickup(right, pos, 1, false, 0f); } y += 22f; } } [HarmonyPatch(typeof(RunUnlockables), "Init")] internal static class Patch_RunUnlockables_Init { [HarmonyPostfix] private static void Postfix() { RemoveItemCaps(); CacheAndApplyStatBlacklist(); CacheAndApplyShrineStatBlacklist(); } internal static void RemoveItemCaps() { //IL_003f: 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) Dictionary> availableItems = RunUnlockables.availableItems; if (availableItems == null) { return; } Enumerator> enumerator = availableItems.GetEnumerator(); while (enumerator.MoveNext()) { KeyValuePair> current = enumerator.Current; if (current.Value == null) { continue; } Enumerator enumerator2 = current.Value.GetEnumerator(); while (enumerator2.MoveNext()) { ItemData current2 = enumerator2.Current; if (Plugin.ActiveUncappedItems.Contains(current2.eItem)) { current2.maxAmount = Plugin.GetItemCap(current2.eItem); current2.maxAmountPerRun = 9999; } } } } private static void CacheAndApplyStatBlacklist() { //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_002b: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Expected I4, but got Unknown //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_005a: Unknown result type (might be due to invalid IL or missing references) List upgradableStatsChaosAndGamble = EncounterUtility.upgradableStatsChaosAndGamble; if (upgradableStatsChaosAndGamble == null) { return; } if (Plugin.FullStatPool.Count == 0) { Enumerator enumerator = upgradableStatsChaosAndGamble.GetEnumerator(); while (enumerator.MoveNext()) { EStat current = enumerator.Current; Plugin.FullStatPool.Add((int)current); } } foreach (int blacklistedStat in Plugin.BlacklistedStats) { EStat val = (EStat)blacklistedStat; if (upgradableStatsChaosAndGamble.Contains(val)) { upgradableStatsChaosAndGamble.Remove(val); } } } private static void CacheAndApplyShrineStatBlacklist() { //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_002b: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Expected I4, but got Unknown //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_005a: Unknown result type (might be due to invalid IL or missing references) List upgradableStatsShrines = EncounterUtility.upgradableStatsShrines; if (upgradableStatsShrines == null) { return; } if (Plugin.FullShrineStatPool.Count == 0) { Enumerator enumerator = upgradableStatsShrines.GetEnumerator(); while (enumerator.MoveNext()) { EStat current = enumerator.Current; Plugin.FullShrineStatPool.Add((int)current); } } foreach (int blacklistedShrineStat in Plugin.BlacklistedShrineStats) { EStat val = (EStat)blacklistedShrineStat; if (upgradableStatsShrines.Contains(val)) { upgradableStatsShrines.Remove(val); } } } } [HarmonyPatch(typeof(RunUnlockables), "OnNewRunStarted")] internal static class Patch_RunUnlockables_OnNewRunStarted { [HarmonyPostfix] private static void Postfix() { Patch_RunUnlockables_Init.RemoveItemCaps(); } } [HarmonyPatch(typeof(MicrowaveItemButton), "SelectUpgrade")] internal static class Patch_MicrowaveItemButton_SelectUpgrade { [HarmonyPrefix] private unsafe static void Prefix(MicrowaveItemButton __instance) { //IL_001f: 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) long num = *(long*)(void*)(((Il2CppObjectBase)__instance).Pointer + 104); if (num == 0L) { return; } EItem item = (EItem)(*(int*)(num + 84)); if (Plugin.ActiveUncappedItems.Contains(item)) { int num2 = *(int*)(num + 112); if (num2 > 0) { *(int*)(num + 112) = num2 + 1; } } } } [HarmonyPatch(typeof(ItemGrandmasSecretTonic), "OnInitOrAmountChanged")] internal static class Patch_GrandmasTonic_SizeCap { private const float BaseRadius = 4f; private const float RadiusPerAmount = 2f; private const float MaxRadius = 16f; private const int MaxStacks = 6; [HarmonyPrefix] private unsafe static void Prefix(ItemGrandmasSecretTonic __instance) { *(float*)(void*)(((Il2CppObjectBase)__instance).Pointer + 60) = 16f; } [HarmonyPostfix] private unsafe static void Postfix(ItemGrandmasSecretTonic __instance) { *(float*)(void*)(((Il2CppObjectBase)__instance).Pointer + 52) = 4f; *(float*)(void*)(((Il2CppObjectBase)__instance).Pointer + 56) = 2f; *(float*)(void*)(((Il2CppObjectBase)__instance).Pointer + 60) = 16f; int num = *(int*)(void*)(((Il2CppObjectBase)__instance).Pointer + 24); *(float*)(void*)(((Il2CppObjectBase)__instance).Pointer + 64) = Math.Min(4f + (float)num * 2f, 16f); DataManager instance = DataManager.Instance; ItemData val = ((instance != null) ? instance.GetItem((EItem)11) : null); if (!((Object)(object)val == (Object)null)) { int maxAmount = (val.maxAmountPerRun = 6); val.maxAmount = maxAmount; } } } [HarmonyPatch(typeof(ItemSpicyMeatball), "OnInitOrAmountChanged")] internal static class Patch_SpicyMeatball_Radius { private const float BaseRadius = 8f; private const float RadiusPerAmount = 4f; private const float MaxRadius = 32f; [HarmonyPrefix] private unsafe static void Prefix(ItemSpicyMeatball __instance) { *(float*)(void*)(((Il2CppObjectBase)__instance).Pointer + 56) = 32f; } [HarmonyPostfix] private unsafe static void Postfix(ItemSpicyMeatball __instance) { *(float*)(void*)(((Il2CppObjectBase)__instance).Pointer + 48) = 8f; *(float*)(void*)(((Il2CppObjectBase)__instance).Pointer + 52) = 4f; *(float*)(void*)(((Il2CppObjectBase)__instance).Pointer + 56) = 32f; int num = *(int*)(void*)(((Il2CppObjectBase)__instance).Pointer + 24); *(float*)(void*)(((Il2CppObjectBase)__instance).Pointer + 60) = Math.Min(8f + (float)num * 4f, 32f); } } [HarmonyPatch(typeof(ItemBobLantern), "OnInitOrAmountChanged")] internal static class Patch_BobLantern_FireRate { [HarmonyPostfix] private unsafe static void Postfix(ItemBobLantern __instance) { *(float*)(void*)(((Il2CppObjectBase)__instance).Pointer + 60) /= 2f; } } [HarmonyPatch(typeof(ItemBrassKnuckles), "OnInitOrAmountChanged")] internal static class Patch_BrassKnuckles_SizeCap { [HarmonyPrefix] private unsafe static void Prefix(ItemBrassKnuckles __instance) { *(float*)(void*)(((Il2CppObjectBase)__instance).Pointer + 56) = float.MaxValue; } } [HarmonyPatch(typeof(ItemBackpack), "OnInitOrAmountChanged")] internal static class Patch_ItemBackpack_Projectiles { [HarmonyPrefix] private unsafe static void Prefix(ItemBackpack __instance) { *(int*)(void*)(((Il2CppObjectBase)__instance).Pointer + 24) *= 2; } [HarmonyPostfix] private unsafe static void Postfix(ItemBackpack __instance) { *(int*)(void*)(((Il2CppObjectBase)__instance).Pointer + 24) /= 2; } } [HarmonyPatch(typeof(ItemData), "CompareTo", new Type[] { typeof(UnlockableBase) })] internal static class Patch_ItemData_CompareTo_SuckyMagnet { private static readonly HashSet SortsFirst = new HashSet { (EItem)33, (EItem)40, (EItem)32, (EItem)55, (EItem)56, (EItem)19, (EItem)38, (EItem)82, (EItem)7, (EItem)0 }; private static readonly HashSet SortsLast = new HashSet { (EItem)58, (EItem)1, (EItem)2, (EItem)43, (EItem)72, (EItem)8, (EItem)59, (EItem)4, (EItem)42, (EItem)23 }; [HarmonyPrefix] private static bool Prefix(ItemData __instance, UnlockableBase other, ref int __result) { //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_0055: Unknown result type (might be due to invalid IL or missing references) ItemData val = (ItemData)(object)((other is ItemData) ? other : null); if (val == null) { return true; } if (__instance.rarity != val.rarity) { return true; } bool flag = SortsFirst.Contains(__instance.eItem); bool flag2 = SortsFirst.Contains(val.eItem); bool flag3 = SortsLast.Contains(__instance.eItem); bool flag4 = SortsLast.Contains(val.eItem); if (flag && !flag2) { __result = -1; return false; } if (flag2 && !flag) { __result = 1; return false; } if (flag3 && !flag4) { __result = 1; return false; } if (flag4 && !flag3) { __result = -1; return false; } if (flag3 && flag4) { __result = 0; return false; } return true; } } [HarmonyPatch(typeof(MyAchievements), "CanToggleActivation")] internal static class Patch_CanToggleActivation_NonToggleable { [HarmonyPrefix] private static bool Prefix(UnlockableBase unlockable, ref bool __result) { DataManager instance = DataManager.Instance; if ((Object)(object)instance == (Object)null) { return true; } if ((Object)(object)unlockable == (Object)(object)instance.GetItem((EItem)40) || (Object)(object)unlockable == (Object)(object)instance.GetItem((EItem)33) || (Object)(object)unlockable == (Object)(object)instance.GetItem((EItem)32) || (Object)(object)unlockable == (Object)(object)instance.GetItem((EItem)55) || (Object)(object)unlockable == (Object)(object)instance.GetItem((EItem)56) || (Object)(object)unlockable == (Object)(object)instance.GetItem((EItem)19)) { __result = false; return false; } if ((Object)(object)unlockable == (Object)(object)instance.GetItem((EItem)72) || (Object)(object)unlockable == (Object)(object)instance.GetItem((EItem)8) || (Object)(object)unlockable == (Object)(object)instance.GetItem((EItem)59) || (Object)(object)unlockable == (Object)(object)instance.GetItem((EItem)4) || (Object)(object)unlockable == (Object)(object)instance.GetItem((EItem)42) || (Object)(object)unlockable == (Object)(object)instance.GetItem((EItem)23)) { __result = true; return false; } if ((Object)(object)unlockable == (Object)(object)instance.GetItem((EItem)38) || (Object)(object)unlockable == (Object)(object)instance.GetItem((EItem)82) || (Object)(object)unlockable == (Object)(object)instance.GetItem((EItem)7) || (Object)(object)unlockable == (Object)(object)instance.GetItem((EItem)0)) { __result = false; return false; } return true; } } [HarmonyPatch(typeof(MyAchievements), "IsAvailable")] internal static class Patch_IsAvailable_ForcedItems { [HarmonyPrefix] private static bool Prefix(UnlockableBase unlockable, ref bool __result) { //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_0028: Unknown result type (might be due to invalid IL or missing references) DataManager instance = DataManager.Instance; if ((Object)(object)instance == (Object)null) { return true; } foreach (EItem forcedPoolItem in Plugin.ForcedPoolItems) { if ((Object)(object)unlockable == (Object)(object)instance.GetItem(forcedPoolItem)) { __result = true; return false; } } return true; } } [HarmonyPatch(typeof(DataManager), "Load")] internal static class Patch_DataManager_Load { [HarmonyPostfix] private unsafe static void Postfix(DataManager __instance) { //IL_0644: Unknown result type (might be due to invalid IL or missing references) //IL_0649: Unknown result type (might be due to invalid IL or missing references) //IL_064c: Unknown result type (might be due to invalid IL or missing references) //IL_02bd: Unknown result type (might be due to invalid IL or missing references) //IL_02c0: Unknown result type (might be due to invalid IL or missing references) //IL_0306: Unknown result type (might be due to invalid IL or missing references) //IL_0309: Unknown result type (might be due to invalid IL or missing references) //IL_051c: Unknown result type (might be due to invalid IL or missing references) //IL_051f: Unknown result type (might be due to invalid IL or missing references) //IL_0567: Unknown result type (might be due to invalid IL or missing references) //IL_056e: Invalid comparison between Unknown and I4 List allTomes = __instance.GetAllTomes(); if (allTomes != null) { for (int i = 0; i < allTomes.Count; i++) { ((UnlockableBase)allTomes[i]).canAlwaysToggle = true; } } List allWeapons = __instance.GetAllWeapons(); if (allWeapons != null) { for (int j = 0; j < allWeapons.Count; j++) { ((UnlockableBase)allWeapons[j]).canAlwaysToggle = true; UpgradeData upgradeData = allWeapons[j].upgradeData; if (((upgradeData != null) ? upgradeData.upgradeModifiers : null) != null) { AddUpgradeStat(upgradeData.upgradeModifiers, (EStat)18, 0.1f); AddUpgradeStat(upgradeData.upgradeModifiers, (EStat)19, 0.2f); RemoveStat(upgradeData.upgradeModifiers, 24); } } } ItemData item = __instance.GetItem((EItem)58); if ((Object)(object)item != (Object)null) { ((UnlockableBase)item).canAlwaysToggle = true; } ItemData item2 = __instance.GetItem((EItem)85); ItemData item3 = __instance.GetItem((EItem)44); if ((Object)(object)item2 != (Object)null) { item2.rarity = (EItemRarity)3; } if ((Object)(object)item3 != (Object)null) { item3.rarity = (EItemRarity)2; } ItemData item4 = __instance.GetItem((EItem)45); ItemData item5 = __instance.GetItem((EItem)2); if ((Object)(object)item4 != (Object)null) { item4.rarity = (EItemRarity)2; } if ((Object)(object)item5 != (Object)null) { item5.rarity = (EItemRarity)1; ((UnlockableBase)item5).canAlwaysToggle = true; } ItemData item6 = __instance.GetItem((EItem)33); ItemData item7 = __instance.GetItem((EItem)40); if ((Object)(object)item6 != (Object)null) { item6.rarity = (EItemRarity)2; ((UnlockableBase)item6).canAlwaysToggle = false; ((UnlockableBase)item6).sortingPriority = -1000; } if ((Object)(object)item7 != (Object)null) { item7.rarity = (EItemRarity)1; ((UnlockableBase)item7).canAlwaysToggle = false; } ItemData item8 = __instance.GetItem((EItem)34); ItemData item9 = __instance.GetItem((EItem)43); if ((Object)(object)item8 != (Object)null) { item8.rarity = (EItemRarity)0; ((UnlockableBase)item8).canAlwaysToggle = false; } if ((Object)(object)item9 != (Object)null) { item9.rarity = (EItemRarity)3; ((UnlockableBase)item9).canAlwaysToggle = true; } ItemData item10 = __instance.GetItem((EItem)1); if ((Object)(object)item10 != (Object)null) { ((UnlockableBase)item10).canAlwaysToggle = true; } ItemData item11 = __instance.GetItem((EItem)32); ItemData item12 = __instance.GetItem((EItem)55); ItemData item13 = __instance.GetItem((EItem)56); ItemData item14 = __instance.GetItem((EItem)19); if ((Object)(object)item11 != (Object)null) { ((UnlockableBase)item11).canAlwaysToggle = false; } if ((Object)(object)item12 != (Object)null) { ((UnlockableBase)item12).canAlwaysToggle = false; } if ((Object)(object)item13 != (Object)null) { ((UnlockableBase)item13).canAlwaysToggle = false; } if ((Object)(object)item14 != (Object)null) { ((UnlockableBase)item14).canAlwaysToggle = false; } ItemData item15 = __instance.GetItem((EItem)72); ItemData item16 = __instance.GetItem((EItem)8); if ((Object)(object)item15 != (Object)null) { ((UnlockableBase)item15).canAlwaysToggle = true; } if ((Object)(object)item16 != (Object)null) { item16.rarity = (EItemRarity)1; ((UnlockableBase)item16).canAlwaysToggle = true; } EItem[] array = new EItem[4]; RuntimeHelpers.InitializeArray(array, (RuntimeFieldHandle)/*OpCode not supported: LdMemberToken*/); EItem[] array2 = (EItem[])(object)array; foreach (EItem val in array2) { ItemData item17 = __instance.GetItem(val); if ((Object)(object)item17 != (Object)null) { ((UnlockableBase)item17).canAlwaysToggle = true; } } EItem[] array3 = new EItem[4]; RuntimeHelpers.InitializeArray(array3, (RuntimeFieldHandle)/*OpCode not supported: LdMemberToken*/); array2 = (EItem[])(object)array3; foreach (EItem val2 in array2) { ItemData item18 = __instance.GetItem(val2); if ((Object)(object)item18 != (Object)null) { ((UnlockableBase)item18).canAlwaysToggle = false; } } List unsortedCharacterData = __instance.unsortedCharacterData; if (unsortedCharacterData != null) { for (int l = 0; l < unsortedCharacterData.Count; l++) { CharacterData val3 = unsortedCharacterData[l]; if (((val3 != null) ? val3.statModifiers : null) == null) { continue; } List statModifiers = val3.statModifiers; float num = 0f; float num2 = 0f; float num3 = 0f; for (int m = 0; m < statModifiers.Count; m++) { StatModifier val4 = statModifiers[m]; if (val4 != null) { int num4 = *(int*)(void*)(((Il2CppObjectBase)val4).Pointer + 16); float num5 = *(float*)(void*)(((Il2CppObjectBase)val4).Pointer + 24); switch (num4) { case 25: num += num5; break; case 26: num2 += num5; break; case 29: num3 += num5; break; } } } float num6 = 0.2f - num; float value = 3f - num2; float value2 = 5f - num3; if (num6 > 0.001f) { AppendFlat(val3.statModifiers, (EStat)25, num6); } if (Math.Abs(value) > 0.001f) { AppendFlat(val3.statModifiers, (EStat)26, value); } if (Math.Abs(value2) > 0.001f) { AppendFlat(val3.statModifiers, (EStat)29, value2); } float num7 = 0f; for (int n = 0; n < statModifiers.Count; n++) { StatModifier val5 = statModifiers[n]; if (val5 != null && *(int*)(void*)(((Il2CppObjectBase)val5).Pointer + 16) == 2) { num7 += *(float*)(void*)(((Il2CppObjectBase)val5).Pointer + 24); } } if (num7 < 1f) { AppendFlat(val3.statModifiers, (EStat)2, 10f); } } } EWeapon[] array4 = (EWeapon[])(object)new EWeapon[2] { (EWeapon)6, (EWeapon)3 }; foreach (EWeapon val6 in array4) { WeaponData weapon = __instance.GetWeapon(val6); object obj; if (weapon == null) { obj = null; } else { UpgradeData upgradeData2 = weapon.upgradeData; obj = ((upgradeData2 != null) ? upgradeData2.upgradeModifiers : null); } if (obj == null) { continue; } bool flag = false; for (int num8 = 0; num8 < weapon.upgradeData.upgradeModifiers.Count; num8++) { StatModifier val7 = weapon.upgradeData.upgradeModifiers[num8]; if (val7 != null && (int)val7.stat == 16) { val7.modification = 2f; flag = true; break; } } if (!flag) { AddUpgradeStat(weapon.upgradeData.upgradeModifiers, (EStat)16, 2f); } } try { IntPtr intPtr = IL2CPP.il2cpp_class_from_name(IL2CPP.il2cpp_class_get_image(IL2CPP.il2cpp_object_get_class(((Il2CppObjectBase)__instance).Pointer)), "Assets.Scripts.Game.Combat", "CombatScaling"); if (intPtr != IntPtr.Zero) { IntPtr intPtr2 = *(IntPtr*)(void*)(intPtr + 184); if (intPtr2 != IntPtr.Zero) { *(float*)(void*)(intPtr2 + 12) = 0f; } } } catch { } foreach (EItem forcedPoolItem in Plugin.ForcedPoolItems) { ItemData item19 = __instance.GetItem(forcedPoolItem); if ((Object)(object)item19 != (Object)null) { item19.inItemPool = true; ((UnlockableBase)item19).isEnabled = true; } } } private unsafe static void RemoveStat(List mods, int statInt) { for (int num = mods.Count - 1; num >= 0; num--) { StatModifier val = mods[num]; if (val != null && *(int*)(void*)(((Il2CppObjectBase)val).Pointer + 16) == statInt) { mods.RemoveAt(num); } } } private static void AppendFlat(List mods, EStat stat, float value) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Expected O, but got Unknown //IL_0007: Unknown result type (might be due to invalid IL or missing references) StatModifier val = new StatModifier(); val.stat = stat; val.modifyType = (EStatModifyType)2; val.modification = value; mods.Add(val); } private static void AddUpgradeStat(List mods, EStat stat, float modification) { //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Expected O, but got Unknown //IL_0028: Unknown result type (might be due to invalid IL or missing references) for (int i = 0; i < mods.Count; i++) { if (mods[i].stat == stat) { return; } } StatModifier val = new StatModifier(); val.stat = stat; val.modifyType = (EStatModifyType)2; val.modification = modification; mods.Add(val); } } [HarmonyPatch(typeof(InteractableChest), "Start")] internal static class Patch_Chest_MinimapIcon { [HarmonyPostfix] private static void Postfix(InteractableChest __instance) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Invalid comparison between Unknown and I4 //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Invalid comparison between Unknown and I4 //IL_0062: Unknown result type (might be due to invalid IL or missing references) //IL_006a: Unknown result type (might be due to invalid IL or missing references) //IL_0074: Unknown result type (might be due to invalid IL or missing references) Color color = default(Color); if ((int)__instance.chestType == 0) { ((Color)(ref color))..ctor(0.55f, 0.28f, 0.08f); } else { if ((int)__instance.chestType != 2 && (int)__instance.chestType != 3) { return; } ((Color)(ref color))..ctor(1f, 0.85f, 0.1f); } Transform icon = __instance.icon; if (!((Object)(object)icon == (Object)null)) { IconColorHelper.ApplyColor(((Component)icon).gameObject, color); icon.localScale *= 0.5f; } } } [HarmonyPatch(typeof(InteractableMicrowave), "Start")] internal static class Patch_Microwave_Start { [HarmonyPostfix] private static void Postfix(InteractableMicrowave __instance) { MicrowaveIconHelper.ApplyMicrowaveColor(__instance, scaleDown: true); } } [HarmonyPatch(typeof(InteractableMicrowave), "set_rarity")] internal static class Patch_Microwave_SetRarity { [HarmonyPostfix] private static void Postfix(InteractableMicrowave __instance) { MicrowaveIconHelper.ApplyMicrowaveColor(__instance); } } internal static class MicrowaveIconHelper { private const int MinimapIconOffset = 216; internal unsafe static void ApplyMicrowaveColor(InteractableMicrowave instance, bool scaleDown = false) { //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Expected O, but got Unknown GameObject val = instance.minimapIcon; if ((Object)(object)val == (Object)null) { IntPtr intPtr = *(IntPtr*)(void*)(((Il2CppObjectBase)instance).Pointer + 216); if (intPtr == IntPtr.Zero) { return; } val = new GameObject(intPtr); } IconColorHelper.ApplyColor(val, IconColorHelper.MicrowaveRarityColor(instance.rarity)); if (scaleDown) { Transform transform = val.transform; transform.localScale *= 0.5f; } } } internal static class IconColorHelper { internal static Color MicrowaveRarityColor(EItemRarity rarity) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Expected I4, but got Unknown //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_003c: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Unknown result type (might be due to invalid IL or missing references) //IL_0060: Unknown result type (might be due to invalid IL or missing references) return (Color)((rarity - 1) switch { 0 => new Color(0.5f, 0.75f, 1f), 1 => new Color(0.8f, 0.6f, 1f), 2 => new Color(1f, 0.95f, 0.6f), _ => Color.white, }); } internal static Color ShadyGuyRarityColor(EItemRarity rarity) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Expected I4, but got Unknown //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_003c: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_0070: Unknown result type (might be due to invalid IL or missing references) //IL_006a: Unknown result type (might be due to invalid IL or missing references) //IL_006f: Unknown result type (might be due to invalid IL or missing references) return (Color)((rarity - 1) switch { 0 => new Color(0.1f, 0.25f, 0.7f), 1 => new Color(0.35f, 0.05f, 0.6f), 2 => new Color(0.7f, 0.5f, 0.05f), _ => new Color(0.6f, 0.6f, 0.6f), }); } internal static void ApplyColor(GameObject go, Color color) { //IL_0032: Unknown result type (might be due to invalid IL or missing references) Renderer val = go.GetComponent(); if ((Object)(object)val == (Object)null) { val = go.GetComponentInChildren(); } if (!((Object)(object)val == (Object)null)) { Material material = val.material; material.mainTexture = (Texture)(object)Texture2D.whiteTexture; material.color = color; } } } [HarmonyPatch(typeof(BaseInteractable), "Start")] internal static class Patch_BaseInteractable_Start { [HarmonyPostfix] private static void Postfix(BaseInteractable __instance) { //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0065: Unknown result type (might be due to invalid IL or missing references) //IL_008e: Unknown result type (might be due to invalid IL or missing references) InteractableShrineCursed val = ((Il2CppObjectBase)__instance).TryCast(); if ((Object)(object)val != (Object)null) { ApplyShrineColor(val.minimapIcon, 88, ((Il2CppObjectBase)val).Pointer, new Color(1f, 0.4f, 0.4f)); return; } InteractableShrineChallenge val2 = ((Il2CppObjectBase)__instance).TryCast(); if ((Object)(object)val2 != (Object)null) { ApplyShrineColor(val2.minimapIcon, 88, ((Il2CppObjectBase)val2).Pointer, new Color(1f, 0.4f, 0.7f)); return; } InteractableShrineMagnet val3 = ((Il2CppObjectBase)__instance).TryCast(); if ((Object)(object)val3 != (Object)null) { ApplyShrineColor(val3.minimapIcon, 88, ((Il2CppObjectBase)val3).Pointer, Color.black); } } private unsafe static void ApplyShrineColor(GameObject icon, int offset, IntPtr ptr, Color color) { //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Expected O, but got Unknown if ((Object)(object)icon == (Object)null) { IntPtr intPtr = *(IntPtr*)(void*)(ptr + offset); if (intPtr == IntPtr.Zero) { return; } icon = new GameObject(intPtr); } IconColorHelper.ApplyColor(icon, color); Transform transform = icon.transform; transform.localScale *= 0.5f; } } [HarmonyPatch(typeof(InteractableShadyGuy), "Start")] internal static class Patch_ShadyGuy_Start { [HarmonyPostfix] private static void Postfix(InteractableShadyGuy __instance) { //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0049: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Unknown result type (might be due to invalid IL or missing references) Transform parent = ((Component)__instance).transform.parent; if ((Object)(object)parent == (Object)null) { return; } for (int i = 0; i < parent.childCount; i++) { Transform child = parent.GetChild(i); if (((Component)child).gameObject.layer == 14) { IconColorHelper.ApplyColor(((Component)child).gameObject, IconColorHelper.ShadyGuyRarityColor(__instance.rarity)); child.localScale *= 0.5f; break; } } } } [HarmonyPatch] internal static class Patch_MicrowaveSpawnCount { private static MethodBase TargetMethod() { return AccessTools.Method(typeof(RandomObjectPlacer), "RandomObjectSpawner", new Type[2] { typeof(RandomMapObject), typeof(float) }, (Type[])null); } [HarmonyPrefix] private static void Prefix(RandomMapObject randomObject) { if (((randomObject != null) ? randomObject.prefabs : null) == null) { return; } foreach (GameObject item in (Il2CppArrayBase)(object)randomObject.prefabs) { if (!((Object)(object)item == (Object)null) && ((Object)item).name.IndexOf("Microwave", StringComparison.OrdinalIgnoreCase) >= 0) { randomObject.amount = 2; randomObject.maxAmount = 3; break; } } } } [HarmonyPatch(typeof(InteractableShrineGreed), "Interact")] internal static class Patch_ShrineGreed_Stats { private static readonly ManualLogSource Log = Logger.CreateLogSource("MegaBonkMod.ShrineGreed"); private static bool _wasNotDone; [HarmonyPrefix] private static void Prefix(InteractableShrineGreed __instance) { _wasNotDone = !__instance.done; } [HarmonyPostfix] private static void Postfix(InteractableShrineGreed __instance) { if (_wasNotDone && __instance.done) { Apply((EStat)32, 0.05f, (EStatModifyType)0); Apply((EStat)30, 0.05f, (EStatModifyType)2); } } private static void Apply(EStat stat, float amount, EStatModifyType modType = 2) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Expected O, but got Unknown //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_001b: 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_0027: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_006a: Unknown result type (might be due to invalid IL or missing references) //IL_0070: Expected O, but got Unknown //IL_007f: Unknown result type (might be due to invalid IL or missing references) try { StatModifier val = new StatModifier(); val.stat = stat; val.modifyType = modType; val.modification = amount; new EffectStat { effectType = (EEncounterEffect)0, statModifier = val, permanent = true }.ApplyEffect(); try { UiManager instance = UiManager.Instance; if (instance != null) { ScoreUi scoreUi = instance.scoreUi; if (scoreUi != null) { scoreUi.AddScore(val, true, true, 1f); } } } catch { } } catch (Exception ex) { bool flag = default(bool); BepInExErrorLogInterpolatedStringHandler val2 = new BepInExErrorLogInterpolatedStringHandler(14, 2, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val2).AppendLiteral("Apply "); ((BepInExLogInterpolatedStringHandler)val2).AppendFormatted(stat); ((BepInExLogInterpolatedStringHandler)val2).AppendLiteral(" threw: "); ((BepInExLogInterpolatedStringHandler)val2).AppendFormatted(ex); } Log.LogError(val2); } } } [HarmonyPatch(typeof(InteractablePot), "SpawnStuff")] internal static class Patch_InteractablePot_SpawnStuff { private static readonly EPickup[] Powerups; [HarmonyPrefix] private static void Prefix(ref EPickup ePickup) { if ((int)ePickup == 2) { ePickup = Powerups[Random.Range(0, Powerups.Length)]; } } static Patch_InteractablePot_SpawnStuff() { EPickup[] array = new EPickup[8]; RuntimeHelpers.InitializeArray(array, (RuntimeFieldHandle)/*OpCode not supported: LdMemberToken*/); Powerups = (EPickup[])(object)array; } } [HarmonyPatch(typeof(PlayerHealth), "OnPickup")] internal static class Patch_PlayerHealth_OnPickup_FullHeal { [HarmonyPrefix] private static bool Prefix(PlayerHealth __instance, Pickup pickup) { //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Invalid comparison between Unknown and I4 if ((Object)(object)pickup == (Object)null || (int)pickup.ePickup != 2) { return true; } __instance.Heal((float)__instance.maxHp, false); return false; } } [HarmonyPatch(typeof(ItemInventory), "AddItem", new Type[] { typeof(EItem), typeof(int) })] internal static class Patch_GoldenRing_Add { [HarmonyPostfix] private static void Postfix(EItem eItem, int count) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0003: Invalid comparison between Unknown and I4 if ((int)eItem != 79) { return; } try { PlayerInventory playerInventory = MapController.GetPlayerInventory((CharacterData)null); if (playerInventory != null) { playerInventory.banishes += count; } } catch { } } } [HarmonyPatch(typeof(ItemInventory), "RemoveItem", new Type[] { typeof(EItem), typeof(bool) })] internal static class Patch_GoldenRing_Remove { [HarmonyPostfix] private static void Postfix(EItem eItem) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0003: Invalid comparison between Unknown and I4 if ((int)eItem != 79) { return; } try { PlayerInventory playerInventory = MapController.GetPlayerInventory((CharacterData)null); if (playerInventory != null) { playerInventory.banishes = Math.Max(0, playerInventory.banishes - 1); } } catch { } } } [HarmonyPatch(typeof(ItemEchoShard), "GetExtraShards")] internal static class Patch_EchoShard_Overflow { [HarmonyPostfix] private static void Postfix(ItemEchoShard __instance, ref int __result) { float chance = __instance.chance; if (!(chance <= 1f)) { int num = (int)chance; float num2 = chance - (float)num; __result = num + ((Random.value < num2) ? 1 : 0); } } } [HarmonyPatch(typeof(Leaderboards), "UploadScore")] internal static class Patch_Leaderboard_UploadScore_Entry { private static readonly ManualLogSource Log = Logger.CreateLogSource("MegaBonkMod.LbUpload"); private static int _lastScore; private static float _lastTime = -999f; [HarmonyPrefix] private unsafe static bool Prefix(int score) { //IL_0065: Unknown result type (might be due to invalid IL or missing references) //IL_006c: Expected O, but got Unknown try { if (score == _lastScore && Time.realtimeSinceStartup - _lastTime < 5f) { return false; } _lastScore = score; _lastTime = Time.realtimeSinceStartup; int character = 0; PlayerMovement instance = PlayerMovement.Instance; if ((Object)(object)instance != (Object)null) { character = *(int*)(void*)(((Il2CppObjectBase)instance).Pointer + 440); } LeaderboardRelay.SendBothBoards(score, character); } catch (Exception ex) { bool flag = default(bool); BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(16, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Capture failed: "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(ex.Message); } Log.LogWarning(val); } return false; } } [HarmonyPatch(typeof(SteamLeaderboardsManagerNew), "QueueLeaderboardUpload")] internal static class Patch_Leaderboard_Queue { [HarmonyPrefix] private static bool Prefix() { return false; } } [HarmonyPatch(typeof(EffectManager), "SpawnTornadoes")] internal static class Patch_DisableTornadoes { [HarmonyPrefix] private static bool Prefix() { return false; } } [HarmonyPatch(typeof(SteamLeaderboardsManagerNew), "UploadLeaderboardScore")] internal static class Patch_Leaderboard_UploadDirect { [HarmonyPrefix] private static bool Prefix() { return false; } } [HarmonyPatch(typeof(Leaderboards), "CanShowScore")] internal static class Patch_CanShowScore { [HarmonyPrefix] private static bool Prefix(int score, ref string s, ref bool __result) { s = score.ToString("N0"); __result = true; return false; } } [HarmonyPatch(typeof(SteamLeaderboardsManagerNew), "DownloadLeaderboardEntries")] internal static class Patch_Leaderboard_Download { private static readonly ManualLogSource Log = Logger.CreateLogSource("MegaBonkMod.LbDownload"); [HarmonyPrefix] private static bool Prefix(string lbName) { //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Expected O, but got Unknown if (!LeaderboardRelay.Enabled) { return true; } SteamLeaderboardNew val = FindBoard(lbName); if (val != null) { bool flag = default(bool); BepInExInfoLogInterpolatedStringHandler val2 = new BepInExInfoLogInterpolatedStringHandler(42, 2, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val2).AppendLiteral("Starting fetch for board '"); ((BepInExLogInterpolatedStringHandler)val2).AppendFormatted(val.lbName); ((BepInExLogInterpolatedStringHandler)val2).AppendLiteral("' (requested '"); ((BepInExLogInterpolatedStringHandler)val2).AppendFormatted(lbName); ((BepInExLogInterpolatedStringHandler)val2).AppendLiteral("')"); } Log.LogInfo(val2); LeaderboardInjector.BeginFetch(val); } return true; } internal static SteamLeaderboardNew FindBoard(string lbName) { SteamLeaderboardNew leaderboardKillsAllTime = SteamLeaderboardsManagerNew.leaderboardKillsAllTime; SteamLeaderboardNew leaderboardKillsWeekly = SteamLeaderboardsManagerNew.leaderboardKillsWeekly; if (leaderboardKillsAllTime != null && (leaderboardKillsAllTime.lbName == lbName || leaderboardKillsAllTime.lbNameFriends == lbName)) { return leaderboardKillsAllTime; } if (leaderboardKillsWeekly != null && (leaderboardKillsWeekly.lbName == lbName || leaderboardKillsWeekly.lbNameFriends == lbName)) { return leaderboardKillsWeekly; } return null; } } [HarmonyPatch(typeof(SteamLeaderboardNew), "OnDownloadResultsGlobal")] internal static class Patch_OnDownloadResultsGlobal { [HarmonyPostfix] private static void Postfix(SteamLeaderboardNew __instance) { if (LeaderboardRelay.Enabled) { LeaderboardInjector.ReplaceEntriesIfReady(__instance); } } } [HarmonyPatch(typeof(SteamLeaderboardNew), "OnDownloadResultsFriends")] internal static class Patch_OnDownloadResultsFriends { [HarmonyPostfix] private static void Postfix(SteamLeaderboardNew __instance) { if (!LeaderboardRelay.Enabled) { return; } SteamLeaderboardNew leaderboardKillsAllTime = SteamLeaderboardsManagerNew.leaderboardKillsAllTime; SteamLeaderboardNew leaderboardKillsWeekly = SteamLeaderboardsManagerNew.leaderboardKillsWeekly; if (__instance == leaderboardKillsAllTime || __instance == leaderboardKillsWeekly) { LeaderboardInjector.ServerEntry[] cachedEntries = LeaderboardInjector.CachedEntries; if (cachedEntries != null && cachedEntries.Length != 0) { __instance.friendsEntries = LeaderboardInjector.BuildFriendsList(cachedEntries); } } } } internal static class LeaderboardRelay { private static readonly ManualLogSource Log = Logger.CreateLogSource("MegaBonkMod.Leaderboard"); private static string Base => Plugin.LeaderboardServer.TrimEnd('/'); internal static bool Enabled => !string.IsNullOrEmpty(Plugin.LeaderboardServer); internal static void SendBothBoards(int score, int character) { Send("kills", score, character); } internal static void Send(string board, int score, int character) { if (!Enabled) { return; } Task.Run((Func)async delegate { bool flag = default(bool); try { ulong steamID = SteamUser.GetSteamID().m_SteamID; string name = SteamFriends.GetPersonaName(); string content = $"{{\"board\":\"{board}\",\"score\":{score},\"steamId\":\"{steamID}\",\"name\":{JsonSerializer.Serialize(name)},\"characterIndex\":{character},\"modVersion\":\"{"1.3.10"}\",\"timestamp\":{DateTimeOffset.UtcNow.ToUnixTimeSeconds()}}}"; using HttpClient client = new HttpClient { Timeout = TimeSpan.FromSeconds(5.0) }; StringContent content2 = new StringContent(content, Encoding.UTF8, "application/json"); await client.PostAsync(Base + "/submit", content2); BepInExInfoLogInterpolatedStringHandler val = new BepInExInfoLogInterpolatedStringHandler(33, 4, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Submitted score "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(score); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" char="); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(character); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" on '"); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(board); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("' as "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(name); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("."); } Log.LogInfo(val); } catch (Exception ex) { BepInExWarningLogInterpolatedStringHandler val2 = new BepInExWarningLogInterpolatedStringHandler(32, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val2).AppendLiteral("Leaderboard server unreachable: "); ((BepInExLogInterpolatedStringHandler)val2).AppendFormatted(ex.Message); } Log.LogWarning(val2); } }); } internal static async Task FetchEntries(string board, int count = 20) { if (!Enabled) { return ""; } try { using HttpClient client = new HttpClient { Timeout = TimeSpan.FromSeconds(5.0) }; return await client.GetStringAsync($"{Base}/entries?board={Uri.EscapeDataString(board)}&count={count}"); } catch { return ""; } } } [HarmonyPatch(typeof(ProjectileBluetooth), "HitTarget")] internal static class Patch_BT_HitTarget_ElementFix { internal static bool Active; [HarmonyPrefix] private static void Prefix() { Active = true; } [HarmonyPostfix] private static void Postfix() { Active = false; } } [HarmonyPatch] internal static class Patch_GetDamageContainer_BluetoothFix { private static MethodBase TargetMethod() { return AccessTools.Method(typeof(WeaponUtility), "GetDamageContainer", new Type[5] { typeof(WeaponBase), AccessTools.TypeByName("ProjectileBase"), AccessTools.TypeByName("Enemy"), typeof(Vector3), typeof(float) }, (Type[])null); } [HarmonyPostfix] private static void Postfix(DamageContainer __result) { if (Patch_BT_HitTarget_ElementFix.Active && __result != null) { __result.element = (EElement)1; } } } internal static class LeaderboardInjector { internal class ServerEntry { [JsonPropertyName("score")] public int Score { get; set; } [JsonPropertyName("steamId")] public string SteamId { get; set; } = ""; [JsonPropertyName("name")] public string Name { get; set; } = ""; [JsonPropertyName("characterIndex")] public int CharacterIndex { get; set; } } private static readonly ManualLogSource Log = Logger.CreateLogSource("MegaBonkMod.LbInject"); private static volatile ServerEntry[] _cache = null; private static volatile bool _fetching = false; private static volatile SteamLeaderboardNew _pending = null; internal static ServerEntry[] CachedEntries => _cache; internal static bool IsFetching => _fetching; internal static void BeginFetch(SteamLeaderboardNew lb) { if (_fetching) { return; } _fetching = true; Task.Run((Func)async delegate { try { ServerEntry[] entries = Parse(await LeaderboardRelay.FetchEntries("kills", 50)); ModGui.MainThread.Enqueue(delegate { //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Expected O, but got Unknown _cache = entries; _fetching = false; bool flag2 = default(bool); BepInExInfoLogInterpolatedStringHandler val2 = new BepInExInfoLogInterpolatedStringHandler(32, 1, ref flag2); if (flag2) { ((BepInExLogInterpolatedStringHandler)val2).AppendLiteral("Fetch 'kills' complete: "); ((BepInExLogInterpolatedStringHandler)val2).AppendFormatted(entries.Length); ((BepInExLogInterpolatedStringHandler)val2).AppendLiteral(" entries"); } Log.LogInfo(val2); SteamLeaderboardNew pending = _pending; _pending = null; if (pending != null && entries.Length != 0) { Replace(pending, entries); } }); } catch (Exception ex) { _fetching = false; bool flag = default(bool); BepInExErrorLogInterpolatedStringHandler val = new BepInExErrorLogInterpolatedStringHandler(21, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Fetch 'kills' error: "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(ex.Message); } Log.LogError(val); } }); } internal static void ReplaceEntriesIfReady(SteamLeaderboardNew lb) { SteamLeaderboardNew leaderboardKillsAllTime = SteamLeaderboardsManagerNew.leaderboardKillsAllTime; SteamLeaderboardNew leaderboardKillsWeekly = SteamLeaderboardsManagerNew.leaderboardKillsWeekly; if (lb == leaderboardKillsAllTime || lb == leaderboardKillsWeekly) { if (_cache != null) { Replace(lb, _cache); } else { _pending = lb; } } } private static void Replace(SteamLeaderboardNew lb, ServerEntry[] entries) { //IL_0159: Unknown result type (might be due to invalid IL or missing references) //IL_0160: Expected O, but got Unknown //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_0054: Expected O, but got Unknown //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0119: Unknown result type (might be due to invalid IL or missing references) //IL_011f: Expected O, but got Unknown //IL_00cb: Unknown result type (might be due to invalid IL or missing references) //IL_00d2: Expected O, but got Unknown for (int i = 0; i < entries.Length; i++) { if (ulong.TryParse(entries[i].SteamId, out var result) && result != 0L) { SteamFriends.RequestUserInformation(new CSteamID(result), true); } } lb.globalEntries = BuildList(entries); lb.friendsEntries = BuildFriendsList(entries); bool flag = default(bool); BepInExInfoLogInterpolatedStringHandler val = new BepInExInfoLogInterpolatedStringHandler(64, 3, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Replaced global("); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(entries.Length); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(") + friends("); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(lb.friendsEntries.Count); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(") on '"); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(lb.lbName); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("', invoking A_LeaderboardReady"); } Log.LogInfo(val); try { Action a_LeaderboardReady = SteamLeaderboardNew.A_LeaderboardReady; if ((Delegate)(object)a_LeaderboardReady == (Delegate)null) { BepInExWarningLogInterpolatedStringHandler val2 = new BepInExWarningLogInterpolatedStringHandler(33, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val2).AppendLiteral("A_LeaderboardReady is null for '"); ((BepInExLogInterpolatedStringHandler)val2).AppendFormatted(lb.lbName); ((BepInExLogInterpolatedStringHandler)val2).AppendLiteral("'"); } Log.LogWarning(val2); return; } a_LeaderboardReady.Invoke(lb); val = new BepInExInfoLogInterpolatedStringHandler(36, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("A_LeaderboardReady invoked OK for '"); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(lb.lbName); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("'"); } Log.LogInfo(val); } catch (Exception ex) { BepInExErrorLogInterpolatedStringHandler val3 = new BepInExErrorLogInterpolatedStringHandler(28, 3, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val3).AppendLiteral("A_LeaderboardReady threw "); ((BepInExLogInterpolatedStringHandler)val3).AppendFormatted(ex.GetType().Name); ((BepInExLogInterpolatedStringHandler)val3).AppendLiteral(": "); ((BepInExLogInterpolatedStringHandler)val3).AppendFormatted(ex.Message); ((BepInExLogInterpolatedStringHandler)val3).AppendLiteral("\n"); ((BepInExLogInterpolatedStringHandler)val3).AppendFormatted(ex.StackTrace); } Log.LogError(val3); } } internal static List BuildList(ServerEntry[] entries) { //IL_0041: Unknown result type (might be due to invalid IL or missing references) //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_0076: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_007b: Unknown result type (might be due to invalid IL or missing references) //IL_0084: Unknown result type (might be due to invalid IL or missing references) //IL_008e: Expected O, but got Unknown List val = new List(); if (entries == null) { return val; } for (int i = 0; i < entries.Length; i++) { ServerEntry serverEntry = entries[i]; ulong result; ulong num = (ulong.TryParse(serverEntry.SteamId, out result) ? result : 0); int[] array = new int[64]; array[1] = serverEntry.CharacterIndex; LeaderboardEntry_t val2 = default(LeaderboardEntry_t); val2.m_steamIDUser = new CSteamID(num); val2.m_nGlobalRank = i + 1; val2.m_nScore = serverEntry.Score; val2.m_cDetails = array.Length; LeaderboardEntry_t val3 = val2; val.Add(new LeaderboardEntry(val3, Il2CppStructArray.op_Implicit(array))); } return val; } private static HashSet GetSteamFriendIds() { //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Expected O, but got Unknown //IL_0007: 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) HashSet hashSet = new HashSet(); try { hashSet.Add(SteamUser.GetSteamID().m_SteamID); int friendCount = SteamFriends.GetFriendCount((EFriendFlags)4); for (int i = 0; i < friendCount; i++) { hashSet.Add(SteamFriends.GetFriendByIndex(i, (EFriendFlags)4).m_SteamID); } } catch (Exception ex) { bool flag = default(bool); BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(19, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("GetSteamFriendIds: "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(ex.Message); } Log.LogWarning(val); } return hashSet; } internal static List BuildFriendsList(ServerEntry[] entries) { HashSet steamFriendIds = GetSteamFriendIds(); List list = new List(); foreach (ServerEntry serverEntry in entries) { if (ulong.TryParse(serverEntry.SteamId, out var result) && steamFriendIds.Contains(result)) { list.Add(serverEntry); } } return BuildList(list.ToArray()); } private static ServerEntry[] Parse(string json) { if (string.IsNullOrEmpty(json) || json == "[]") { return new ServerEntry[0]; } try { return JsonSerializer.Deserialize(json) ?? new ServerEntry[0]; } catch { return new ServerEntry[0]; } } } [HarmonyPatch(typeof(ItemCreditCardGreen), "OnInitOrAmountChanged")] internal static class Patch_CreditCardGreen_ChestCost { [HarmonyPostfix] private static void Postfix(ItemCreditCardGreen __instance) { __instance.chestPriceIncreasePerAmount = 0.02f; } } [HarmonyPatch(typeof(ItemCreditCardGreen), "GetDescription")] internal static class Patch_CreditCardGreen_Desc { [HarmonyPostfix] private static void Postfix(ref string __result) { if (__result != null) { __result = __result.Replace("10%", "2%").Replace("10 %", "2%"); } } } [HarmonyPatch(typeof(ItemBase), "GetDescription")] internal static class Patch_Backpack_Desc { [HarmonyPostfix] private static void Postfix(ref string __result) { if (__result != null) { __result = __result.Replace("+1 Projectile Count", "+2 Projectile Count").Replace("+1 projectile count", "+2 projectile count"); } } } [HarmonyPatch(typeof(ItemCursedDoll), "OnInitOrAmountChanged")] internal static class Patch_CursedDoll_Buff { [HarmonyPostfix] private unsafe static void Postfix(ItemCursedDoll __instance) { IntPtr pointer = ((Il2CppObjectBase)__instance).Pointer; int num = *(int*)(void*)(pointer + 24); *(float*)(void*)(pointer + 52) = 0.5f; *(int*)(void*)(pointer + 56) = 7; *(int*)(void*)(pointer + 48) = 7 * num; } } [HarmonyPatch(typeof(ItemCursedDoll), "GetDescription")] internal static class Patch_CursedDoll_Desc { [HarmonyPostfix] private static void Postfix(ref string __result) { if (__result != null) { __result = __result.Replace("30%", "50%").Replace("30 %", "50%"); } } } [HarmonyPatch(typeof(SaveManager), "Init")] internal static class Patch_SaveManager_Init_LockUploadOff { [HarmonyPostfix] private static void Postfix(SaveManager __instance) { SteamUploadLocker.ForceOff(__instance); } } [HarmonyPatch(typeof(SaveManager), "SaveConfig")] internal static class Patch_SaveManager_SaveConfig_LockUploadOff { [HarmonyPrefix] private static void Prefix(SaveManager __instance) { SteamUploadLocker.ForceOff(__instance); } } internal static class SteamUploadLocker { internal const string FieldName = "upload_score_to_leaderboard"; internal unsafe static void ForceOff(SaveManager sm) { if ((Object)(object)sm == (Object)null) { return; } IntPtr pointer = ((Il2CppObjectBase)sm).Pointer; if (pointer == IntPtr.Zero) { return; } IntPtr intPtr = *(IntPtr*)(void*)(pointer + 32); if (!(intPtr == IntPtr.Zero)) { IntPtr intPtr2 = *(IntPtr*)(void*)(intPtr + 24); if (!(intPtr2 == IntPtr.Zero)) { *(int*)(void*)(intPtr2 + 68) = 0; } } } } [HarmonyPatch(typeof(BetterSetting), "SetSetting")] internal static class Patch_BetterSetting_SetSetting_DisableUpload { [HarmonyPostfix] private static void Postfix(BetterSetting __instance, string settingName) { if (!(settingName != "upload_score_to_leaderboard")) { TextMeshProUGUI t_disabledText = __instance.t_disabledText; if ((Object)(object)t_disabledText != (Object)null) { ((TMP_Text)t_disabledText).text = "Disabled"; } GameObject disabledOverlay = __instance.disabledOverlay; if ((Object)(object)disabledOverlay != (Object)null) { disabledOverlay.SetActive(true); } } } } [HarmonyPatch(typeof(CurrentSettings), "BetterUpdateCfSettings")] internal static class Patch_CurrentSettings_BetterUpdateCfSettings_BlockUpload { [HarmonyPrefix] private static bool Prefix(string settingName) { return settingName != "upload_score_to_leaderboard"; } } [HarmonyPatch(typeof(PassiveAbilityZooma), "Init")] internal static class Patch_Zooma_Init_Projectiles { private static readonly MethodInfo _setStat = AccessTools.Method(typeof(PassiveAbility), "SetStat", (Type[])null, (Type[])null); private static Action _handler; [HarmonyPostfix] private static void Postfix(PassiveAbilityZooma __instance) { if (_handler != null) { PlayerXp.A_LevelUp -= Action.op_Implicit(_handler); } _handler = delegate(int level) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Expected O, but got Unknown try { StatModifier val = new StatModifier(); val.stat = (EStat)16; val.modifyType = (EStatModifyType)2; val.modification = 0.25f * (float)level; _setStat.Invoke(__instance, new object[1] { val }); } catch { } }; PlayerXp.A_LevelUp += Action.op_Implicit(_handler); } } [HarmonyPatch(typeof(ItemGoldenShield), "OnPlayerTakeDamage")] internal static class Patch_GoldenShield_NoKevinReduction { [HarmonyPrefix] private static void Prefix(DamageContainer dc) { if (dc != null && dc.damageSource == ItemKevin.damageSource) { dc.damageSource = ""; } } } [HarmonyPatch(typeof(MainMenu), "Start")] internal static class Patch_MainMenu_Start_Version { private static readonly ManualLogSource Log = Logger.CreateLogSource("MegaBonkMod.Version"); [HarmonyPostfix] private static void Postfix() { ModGui.MainThread.Enqueue(delegate { ModGui.NeedVersionPatch = true; }); CheckVersionAsync(); } private static void CheckVersionAsync() { Task.Run((Func)async delegate { bool flag = default(bool); try { using HttpClient client = new HttpClient { Timeout = TimeSpan.FromSeconds(5.0) }; using JsonDocument jsonDocument = JsonDocument.Parse(await client.GetStringAsync(Plugin.LeaderboardServer.TrimEnd('/') + "/version")); if (jsonDocument.RootElement.TryGetProperty("required", out var value)) { string text = value.GetString() ?? ""; if (!string.IsNullOrEmpty(text) && text != "1.3.10") { BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(30, 2, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Mod outdated: local="); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted("1.3.10"); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" required="); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(text); } Log.LogWarning(val); ModGui.MainThread.Enqueue(delegate { ModGui.UpdateAvailable = true; }); } else { BepInExInfoLogInterpolatedStringHandler val2 = new BepInExInfoLogInterpolatedStringHandler(17, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val2).AppendLiteral("Mod version OK ("); ((BepInExLogInterpolatedStringHandler)val2).AppendFormatted("1.3.10"); ((BepInExLogInterpolatedStringHandler)val2).AppendLiteral(")"); } Log.LogInfo(val2); } } } catch (Exception ex) { BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(22, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Version check failed: "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(ex.Message); } Log.LogWarning(val); } }); } } [HarmonyPatch(typeof(GameOverDamageSourcesUi), "Start")] internal static class Patch_GameOverDamageSourcesUi_Start { [HarmonyPrefix] private static void Prefix() { GameObject val = GameObject.Find("GameUI/GameUI/DeathScreen/StatsWindows/W_Damage/WindowLayers/Content/ScrollRect/ContentEntries"); if (!((Object)(object)val == (Object)null)) { Transform transform = val.transform; for (int num = transform.childCount - 1; num >= 3; num--) { Object.Destroy((Object)(object)((Component)transform.GetChild(num)).gameObject); } } } } [HarmonyPatch(typeof(GameManager), "StartPlaying")] internal static class Patch_GameManager_StartPlaying_Chart { [HarmonyPostfix] private static void Postfix() { ModGui.ChartDisabled = false; Object.FindObjectOfType()?.ResetChartCache(); } } [HarmonyPatch(typeof(GameManager), "OnDied")] internal static class Patch_GameManager_OnDied_Chart { [HarmonyPostfix] private static void Postfix() { ModGui.ChartDisabled = true; } } [HarmonyPatch(typeof(CombatScaling), "GetStageHpMultiplier")] internal static class Patch_CombatScaling_HpMultiplier { [HarmonyPostfix] private static void Postfix(ref float __result) { __result = 2f * __result - 1f; } } [HarmonyPatch(typeof(CombatScaling), "GetStageDamageMultiplier")] internal static class Patch_CombatScaling_DamageMultiplier { [HarmonyPostfix] private static void Postfix(ref float __result) { __result = 2f * __result - 1f; } } [BepInPlugin("com.megabonk.mod", "MegaBonk Mod", "1.3.10")] public class Plugin : BasePlugin { internal static string LeaderboardServer = "http://67.5.111.0:9000"; internal const string ModVersion = "1.3.10"; internal const bool PatchGrandmasTonic = true; internal static readonly HashSet ActiveUncappedItems = new HashSet { (EItem)41, (EItem)26, (EItem)25 }; internal static readonly HashSet ForcedPoolItems = new HashSet { (EItem)7, (EItem)38, (EItem)82, (EItem)55, (EItem)19, (EItem)56, (EItem)33 }; internal static readonly HashSet BlacklistedStats = new HashSet { 0, 1, 2, 3, 4, 5, 10, 11, 24, 25, 29 }; internal static readonly HashSet BlacklistedShrineStats = new HashSet { 0, 1, 2, 3, 4, 5, 10, 11, 24, 25, 29 }; internal static readonly List FullStatPool = new List(); internal static readonly List FullShrineStatPool = new List(); internal static ManualLogSource Log { get; private set; } public override void Load() { //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_006e: Expected O, but got Unknown Log = ((BasePlugin)this).Log; LeaderboardServer = ((BasePlugin)this).Config.Bind("Leaderboard", "ServerUrl", "http://67.5.111.0:9000", "DO NOT CHANGE THIS. Only modify if you are the server host running locally (use http://localhost:9000).").Value; ClassInjector.RegisterTypeInIl2Cpp(); new Harmony("com.megabonk.mod").PatchAll(typeof(Plugin).Assembly); ((BasePlugin)this).AddComponent(); ManualLogSource log = Log; bool flag = default(bool); BepInExInfoLogInterpolatedStringHandler val = new BepInExInfoLogInterpolatedStringHandler(29, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("[MegaBonkMod] Loaded. Server="); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(LeaderboardServer); } log.LogInfo(val); } internal static int GetItemCap(EItem item) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0003: Invalid comparison between Unknown and I4 //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Invalid comparison between Unknown and I4 //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Invalid comparison between Unknown and I4 if ((int)item != 25) { if ((int)item != 26) { if ((int)item == 41) { return 2; } return 5; } return 3; } return 10; } } internal static class SpaceNoodleState { internal static readonly Dictionary ExtraTargetPos = new Dictionary(); internal static readonly Dictionary> ExtraRenderers = new Dictionary>(); internal static readonly Collider[] Buf = (Collider[])(object)new Collider[64]; internal static MethodInfo HitEnemyMi; } [HarmonyPatch(typeof(LaserBeamAttack), "FixedUpdate")] internal static class Patch_SpaceNoodle_ExtraPhysics { private unsafe static void Postfix(LaserBeamAttack __instance) { //IL_00b0: Unknown result type (might be due to invalid IL or missing references) //IL_00c5: Unknown result type (might be due to invalid IL or missing references) //IL_0179: Unknown result type (might be due to invalid IL or missing references) //IL_017e: 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) if (((ConstantAttack)__instance).weaponBase == null) { return; } int num = WeaponUtility.GetAttackQuantity(((ConstantAttack)__instance).weaponBase) - 1; IntPtr pointer = ((Il2CppObjectBase)__instance).Pointer; byte num2 = *(byte*)(void*)(((Il2CppObjectBase)__instance).Pointer + 100); nint num3 = *(nint*)(void*)(((Il2CppObjectBase)__instance).Pointer + 80); if (num2 == 0 || num <= 0 || num3 == 0) { SpaceNoodleState.ExtraTargetPos[pointer] = Array.Empty(); return; } GameManager instance = GameManager.Instance; if ((Object)(object)((instance != null) ? instance.player : null) == (Object)null) { return; } HashSet hashSet = new HashSet(); if (num3 != ((Il2CppObjectBase)__instance).Pointer) { IntPtr intPtr = *(IntPtr*)(num3 + 80); if (intPtr != (IntPtr)0) { hashSet.Add(intPtr); } } int num4 = Physics.OverlapSphereNonAlloc(((Component)instance.player).transform.position, 30f, Il2CppReferenceArray.op_Implicit(SpaceNoodleState.Buf), LayerMask.op_Implicit(instance.whatIsEnemy)); if ((object)SpaceNoodleState.HitEnemyMi == null) { SpaceNoodleState.HitEnemyMi = AccessTools.Method(typeof(LaserBeamAttack), "HitEnemy", (Type[])null, (Type[])null); } List list = new List(num); *(IntPtr*)(void*)(((Il2CppObjectBase)__instance).Pointer + 80) = ((Il2CppObjectBase)__instance).Pointer; object[] array = new object[1]; for (int i = 0; i < num4; i++) { if (list.Count >= num) { break; } Collider val = SpaceNoodleState.Buf[i]; if ((Object)(object)val == (Object)null) { continue; } Rigidbody attachedRigidbody = val.attachedRigidbody; if (!((Object)(object)attachedRigidbody == (Object)null)) { IntPtr pointer2 = ((Il2CppObjectBase)attachedRigidbody).Pointer; if (hashSet.Add(pointer2)) { array[0] = val; SpaceNoodleState.HitEnemyMi.Invoke(__instance, array); Bounds bounds = val.bounds; list.Add(((Bounds)(ref bounds)).center); } } } *(nint*)(void*)(((Il2CppObjectBase)__instance).Pointer + 80) = num3; SpaceNoodleState.ExtraTargetPos[pointer] = list.ToArray(); } } [HarmonyPatch(typeof(LaserBeamAttack), "Update")] internal static class Patch_SpaceNoodle_ExtraVisual { private static void Postfix(LaserBeamAttack __instance) { //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_0090: Unknown result type (might be due to invalid IL or missing references) //IL_00a2: Unknown result type (might be due to invalid IL or missing references) //IL_00e9: Unknown result type (might be due to invalid IL or missing references) //IL_00ee: Unknown result type (might be due to invalid IL or missing references) //IL_0123: Unknown result type (might be due to invalid IL or missing references) //IL_0128: Unknown result type (might be due to invalid IL or missing references) //IL_0132: Unknown result type (might be due to invalid IL or missing references) //IL_0137: Unknown result type (might be due to invalid IL or missing references) //IL_0115: Unknown result type (might be due to invalid IL or missing references) //IL_013c: Unknown result type (might be due to invalid IL or missing references) //IL_0167: Unknown result type (might be due to invalid IL or missing references) //IL_0174: Unknown result type (might be due to invalid IL or missing references) IntPtr pointer = ((Il2CppObjectBase)__instance).Pointer; SpaceNoodleState.ExtraTargetPos.TryGetValue(pointer, out var value); int num = ((value != null) ? value.Length : 0); if (!SpaceNoodleState.ExtraRenderers.TryGetValue(pointer, out var value2)) { value2 = new List(); SpaceNoodleState.ExtraRenderers[pointer] = value2; } while (value2.Count < num) { LineRenderer val = new GameObject("SpaceNoodleExtraBeam").AddComponent(); if ((Object)(object)__instance.linerenderer != (Object)null) { ((Renderer)val).sharedMaterial = ((Renderer)__instance.linerenderer).sharedMaterial; val.widthMultiplier = __instance.linerenderer.widthMultiplier; val.startColor = __instance.linerenderer.startColor; val.endColor = __instance.linerenderer.endColor; } val.positionCount = 2; val.useWorldSpace = true; value2.Add(val); } Vector3 val2; if ((Object)(object)__instance.laserStart != (Object)null) { val2 = __instance.laserStart.transform.position; } else { GameManager instance = GameManager.Instance; MyPlayer val3 = ((instance != null) ? instance.player : null); val2 = (((Object)(object)val3 != (Object)null) ? (((Component)val3).transform.position + Vector3.up * 1.2f) : ((Component)__instance).transform.position); } for (int i = 0; i < value2.Count; i++) { LineRenderer val4 = value2[i]; if (!((Object)(object)val4 == (Object)null)) { if (i < num) { ((Renderer)val4).enabled = true; val4.SetPosition(0, val2); val4.SetPosition(1, value[i]); } else { ((Renderer)val4).enabled = false; } } } } } [HarmonyPatch(typeof(LaserBeamAttack), "OnDestroy")] internal static class Patch_SpaceNoodle_Cleanup { private static void Postfix(LaserBeamAttack __instance) { IntPtr pointer = ((Il2CppObjectBase)__instance).Pointer; SpaceNoodleState.ExtraTargetPos.Remove(pointer); if (!SpaceNoodleState.ExtraRenderers.TryGetValue(pointer, out var value)) { return; } foreach (LineRenderer item in value) { if ((Object)(object)item != (Object)null && (Object)(object)((Component)item).gameObject != (Object)null) { Object.Destroy((Object)(object)((Component)item).gameObject); } } SpaceNoodleState.ExtraRenderers.Remove(pointer); } }