Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of VanillaUpgrades v1.0.3
VanillaUpgrades.dll
Decompiled a year agousing System; using System.CodeDom.Compiler; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; using System.Globalization; using System.Linq; using System.Reflection; using System.Reflection.Emit; using System.Resources; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using HarmonyLib; using Photon.Pun; using UnityEngine; using UnityEngine.SceneManagement; using VanillaUpgrades.Classes; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: AssemblyTitle("VanillaUpgrades")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("VanillaUpgrades")] [assembly: AssemblyCopyright("Copyright © 2024")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("5e12a72d-c200-488d-940a-653d1003d96e")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: AssemblyVersion("1.0.0.0")] namespace VanillaUpgrades { [BepInPlugin("bulletbot.vanillaupgrades", "VanillaUpgrades", "1.0.3")] internal class Plugin : BaseUnityPlugin { private const string modGUID = "bulletbot.vanillaupgrades"; private const string modName = "VanillaUpgrades"; private const string modVer = "1.0.3"; internal static Plugin instance; internal ManualLogSource logger; private readonly Harmony harmony = new Harmony("bulletbot.vanillaupgrades"); internal List<UpgradeItem> upgradeItems; internal static float UpgradeValueIncrease(float upgradeValueIncrease, string itemAssetName) { if ((Object)(object)VanillaUpgradesManager.instance == (Object)null) { return upgradeValueIncrease; } UpgradeItem upgradeItem = instance.upgradeItems.FirstOrDefault((UpgradeItem x) => x.name == itemAssetName); if (upgradeItem == null) { return upgradeValueIncrease; } float num = upgradeItem.GetConfig<float>("Price Increase Scaling"); if (num < 0f) { num = upgradeValueIncrease; } return num; } internal bool Upgrade(ItemToggle itemToggle) { if ((Object)(object)VanillaUpgradesManager.instance == (Object)null) { return true; } UpgradeItem upgradeItem = upgradeItems.FirstOrDefault((UpgradeItem x) => x.name == ((Component)itemToggle).gameObject.GetComponent<ItemAttributes>().item.itemAssetName); if (upgradeItem == null) { return true; } if (upgradeItem.GetConfig<bool>("Allow Team Upgrades")) { foreach (PlayerAvatar item in SemiFunc.PlayerGetAll()) { VanillaUpgradesManager.instance.Upgrade(upgradeItem.name, SemiFunc.PlayerGetSteamID(item)); } } else { VanillaUpgradesManager.instance.Upgrade(upgradeItem.name, SemiFunc.PlayerGetSteamID(SemiFunc.PlayerAvatarGetFromPhotonID((int)AccessTools.Field(typeof(ItemToggle), "playerTogglePhotonID").GetValue(itemToggle)))); } return false; } private void Awake() { instance = this; logger = Logger.CreateLogSource("VanillaUpgrades"); upgradeItems = new List<UpgradeItem>(); Item[] array = Resources.LoadAll<Item>("items/"); foreach (Item item in array) { UpgradeItem upgradeItem = new UpgradeItem(); if (upgradeItem.Init(item)) { upgradeItems.Add(upgradeItem); } } SceneManager.activeSceneChanged += delegate { //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Expected O, but got Unknown if (!((Object)(object)RunManager.instance == (Object)null) && !((Object)(object)RunManager.instance.levelCurrent == (Object)(object)RunManager.instance.levelMainMenu) && !((Object)(object)RunManager.instance.levelCurrent == (Object)(object)RunManager.instance.levelLobbyMenu)) { GameObject val = new GameObject("Vanilla Upgrades Manager"); PhotonView val2 = val.AddComponent<PhotonView>(); val2.ViewID = 1864; val.AddComponent<VanillaUpgradesManager>(); } }; logger.LogMessage((object)"VanillaUpgrades has started."); harmony.PatchAll(); } } } namespace VanillaUpgrades.Properties { [GeneratedCode("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] [DebuggerNonUserCode] [CompilerGenerated] internal class Resources { private static ResourceManager resourceMan; private static CultureInfo resourceCulture; [EditorBrowsable(EditorBrowsableState.Advanced)] internal static ResourceManager ResourceManager { get { if (resourceMan == null) { ResourceManager resourceManager = new ResourceManager("VanillaUpgrades.Properties.Resources", typeof(Resources).Assembly); resourceMan = resourceManager; } return resourceMan; } } [EditorBrowsable(EditorBrowsableState.Advanced)] internal static CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } internal Resources() { } } } namespace VanillaUpgrades.Patches { [HarmonyPatch(typeof(ItemAttributes))] internal class ItemAttributesPatch { [HarmonyPatch("GetValue")] [HarmonyTranspiler] private static IEnumerable<CodeInstruction> GetValueTranspiler(IEnumerable<CodeInstruction> instructions) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0009: Expected O, but got Unknown //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Expected O, but got Unknown //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Expected O, but got Unknown //IL_007c: Unknown result type (might be due to invalid IL or missing references) //IL_0082: Expected O, but got Unknown //IL_009d: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Expected O, but got Unknown //IL_00c0: Unknown result type (might be due to invalid IL or missing references) //IL_00c6: Expected O, but got Unknown CodeMatcher val = new CodeMatcher(instructions, (ILGenerator)null); val.MatchForward(true, (CodeMatch[])(object)new CodeMatch[2] { new CodeMatch((OpCode?)OpCodes.Ldsfld, (object)AccessTools.Field(typeof(ShopManager), "instance"), (string)null), new CodeMatch((OpCode?)OpCodes.Ldfld, (object)AccessTools.Field(typeof(ShopManager), "upgradeValueIncrease"), (string)null) }); val.Advance(1); val.Insert((CodeInstruction[])(object)new CodeInstruction[3] { new CodeInstruction(OpCodes.Ldarg_0, (object)null), new CodeInstruction(OpCodes.Ldfld, (object)AccessTools.Field(typeof(ItemAttributes), "itemAssetName")), new CodeInstruction(OpCodes.Call, (object)AccessTools.Method(typeof(Plugin), "UpgradeValueIncrease", (Type[])null, (Type[])null)) }); return val.InstructionEnumeration(); } } [HarmonyPatch(typeof(ItemUpgradeMapPlayerCount))] internal class ItemUpgradeMapPlayerCountPatch { [HarmonyPatch("Upgrade")] [HarmonyPrefix] private static bool Upgrade(ItemToggle ___itemToggle) { return Plugin.instance.Upgrade(___itemToggle); } } [HarmonyPatch(typeof(ItemUpgradePlayerTumbleLaunch))] internal class ItemUpgradePlayerTumbleLaunchPatch { [HarmonyPatch("Upgrade")] [HarmonyPrefix] private static bool Upgrade(ItemToggle ___itemToggle) { return Plugin.instance.Upgrade(___itemToggle); } } [HarmonyPatch(typeof(ItemUpgradePlayerSprintSpeed))] internal class ItemUpgradePlayerSprintSpeedPatch { [HarmonyPatch("Upgrade")] [HarmonyPrefix] private static bool Upgrade(ItemToggle ___itemToggle) { return Plugin.instance.Upgrade(___itemToggle); } } [HarmonyPatch(typeof(ItemUpgradePlayerGrabRange))] internal class ItemUpgradePlayerGrabRangePatch { [HarmonyPatch("Upgrade")] [HarmonyPrefix] private static bool Upgrade(ItemToggle ___itemToggle) { return Plugin.instance.Upgrade(___itemToggle); } } [HarmonyPatch(typeof(ItemUpgradePlayerExtraJump))] internal class ItemUpgradePlayerExtraJumpPatch { [HarmonyPatch("Upgrade")] [HarmonyPrefix] private static bool Upgrade(ItemToggle ___itemToggle) { return Plugin.instance.Upgrade(___itemToggle); } } [HarmonyPatch(typeof(ItemUpgradePlayerHealth))] internal class ItemUpgradePlayerHealthPatch { [HarmonyPatch("Upgrade")] [HarmonyPrefix] private static bool Upgrade(ItemToggle ___itemToggle) { return Plugin.instance.Upgrade(___itemToggle); } } [HarmonyPatch(typeof(ItemUpgradePlayerEnergy))] internal class ItemUpgradePlayerEnergyPatch { [HarmonyPatch("Upgrade")] [HarmonyPrefix] private static bool Upgrade(ItemToggle ___itemToggle) { return Plugin.instance.Upgrade(___itemToggle); } } [HarmonyPatch(typeof(ItemUpgradePlayerGrabStrength))] internal class ItemUpgradePlayerGrabStrengthPatch { [HarmonyPatch("Upgrade")] [HarmonyPrefix] private static bool Upgrade(ItemToggle ___itemToggle) { return Plugin.instance.Upgrade(___itemToggle); } } [HarmonyPatch(typeof(ShopManager))] internal class ShopManagerPatch { [HarmonyPatch("GetAllItemsFromStatsManager")] [HarmonyTranspiler] private static IEnumerable<CodeInstruction> GetAllItemsFromStatsManagerTranspiler(IEnumerable<CodeInstruction> instructions) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0009: Expected O, but got Unknown //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Expected O, but got Unknown //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Expected O, but got Unknown //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_0062: Expected O, but got Unknown //IL_009b: Unknown result type (might be due to invalid IL or missing references) //IL_00a1: Expected O, but got Unknown //IL_00af: Unknown result type (might be due to invalid IL or missing references) //IL_00b5: Expected O, but got Unknown //IL_00d2: Unknown result type (might be due to invalid IL or missing references) //IL_00d8: Expected O, but got Unknown //IL_00f5: Unknown result type (might be due to invalid IL or missing references) //IL_00fb: Expected O, but got Unknown //IL_0103: Unknown result type (might be due to invalid IL or missing references) //IL_0109: Expected O, but got Unknown //IL_0125: Unknown result type (might be due to invalid IL or missing references) //IL_012b: Expected O, but got Unknown //IL_014c: Unknown result type (might be due to invalid IL or missing references) //IL_0152: Expected O, but got Unknown //IL_016f: Unknown result type (might be due to invalid IL or missing references) //IL_0175: Expected O, but got Unknown //IL_0190: Unknown result type (might be due to invalid IL or missing references) //IL_0196: Expected O, but got Unknown //IL_01b3: Unknown result type (might be due to invalid IL or missing references) //IL_01b9: Expected O, but got Unknown CodeMatcher val = new CodeMatcher(instructions, (ILGenerator)null); val.MatchForward(false, (CodeMatch[])(object)new CodeMatch[3] { new CodeMatch((OpCode?)OpCodes.Br, (object)null, (string)null), new CodeMatch((OpCode?)OpCodes.Ldloca_S, (object)null, (string)null), new CodeMatch((OpCode?)OpCodes.Call, (object)AccessTools.Method(typeof(Dictionary<string, Item>.ValueCollection.Enumerator), "get_Current", (Type[])null, (Type[])null), (string)null) }); object operand = val.Operand; val.MatchForward(true, (CodeMatch[])(object)new CodeMatch[2] { new CodeMatch((OpCode?)OpCodes.Call, (object)AccessTools.Method(typeof(Dictionary<string, Item>.ValueCollection.Enumerator), "get_Current", (Type[])null, (Type[])null), (string)null), new CodeMatch((OpCode?)OpCodes.Stloc_1, (object)null, (string)null) }); val.Advance(1); val.Insert((CodeInstruction[])(object)new CodeInstruction[3] { new CodeInstruction(OpCodes.Ldloc_1, (object)null), new CodeInstruction(OpCodes.Call, (object)AccessTools.Method(typeof(ShopManagerPatch), "GetAllItemsFromStatsManager", (Type[])null, (Type[])null)), new CodeInstruction(OpCodes.Brtrue, operand) }); val.MatchForward(true, (CodeMatch[])(object)new CodeMatch[2] { new CodeMatch((OpCode?)OpCodes.Ldarg_0, (object)null, (string)null), new CodeMatch((OpCode?)OpCodes.Ldfld, (object)AccessTools.Field(typeof(ShopManager), "upgradeValueIncrease"), (string)null) }); val.Advance(1); val.Insert((CodeInstruction[])(object)new CodeInstruction[3] { new CodeInstruction(OpCodes.Ldloc_1, (object)null), new CodeInstruction(OpCodes.Ldfld, (object)AccessTools.Field(typeof(Item), "itemAssetName")), new CodeInstruction(OpCodes.Call, (object)AccessTools.Method(typeof(Plugin), "UpgradeValueIncrease", (Type[])null, (Type[])null)) }); return val.InstructionEnumeration(); } private static bool GetAllItemsFromStatsManager(Item item) { if ((Object)(object)VanillaUpgradesManager.instance == (Object)null) { return false; } UpgradeItem upgradeItem = Plugin.instance.upgradeItems.FirstOrDefault((UpgradeItem x) => x.name == item.itemAssetName); return upgradeItem != null && !upgradeItem.GetConfig<bool>("Enabled"); } } [HarmonyPatch(typeof(StatsManager))] internal class StatsManagerPatch { [HarmonyPatch("Start")] [HarmonyPrefix] private static void StartPrefix(StatsManager __instance) { foreach (UpgradeItem upgradeItem in Plugin.instance.upgradeItems) { __instance.dictionaryOfDictionaries.Add("appliedPlayerUpgrade" + upgradeItem.saveName, upgradeItem.appliedPlayerUpgrades); } } [HarmonyPatch("Start")] [HarmonyPostfix] private static void StartPostfix(StatsManager __instance) { foreach (UpgradeItem upgradeItem in Plugin.instance.upgradeItems) { if (__instance.dictionaryOfDictionaries.TryGetValue("playerUpgrade" + upgradeItem.saveName, out var value)) { upgradeItem.playerUpgrades = value; } } } } } namespace VanillaUpgrades.Classes { internal class UpgradeItem { internal string name; internal Dictionary<string, int> playerUpgrades; internal Dictionary<string, int> appliedPlayerUpgrades; internal string saveName; internal MethodInfo updateRightAway; internal string sectionName; private Dictionary<string, ConfigEntryBase> configEntries; public bool AddConfig<T>(string key, T defaultValue, string description = "") { //IL_0071: Unknown result type (might be due to invalid IL or missing references) //IL_007b: Expected O, but got Unknown //IL_00bb: Unknown result type (might be due to invalid IL or missing references) //IL_00c5: Expected O, but got Unknown if (configEntries.ContainsKey(key)) { Plugin.instance.logger.LogWarning((object)("A config entry with the key '" + key + "' already exists. Duplicates are not allowed.")); return false; } ConfigEntryBase val = null; val = (ConfigEntryBase)(object)((defaultValue is int) ? ((BaseUnityPlugin)Plugin.instance).Config.Bind<T>(sectionName, key, defaultValue, new ConfigDescription(description, (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 1000), Array.Empty<object>())) : ((!(defaultValue is float)) ? ((BaseUnityPlugin)Plugin.instance).Config.Bind<T>(sectionName, key, defaultValue, description) : ((BaseUnityPlugin)Plugin.instance).Config.Bind<T>(sectionName, key, defaultValue, new ConfigDescription(description, (AcceptableValueBase)(object)new AcceptableValueRange<float>(-1f, 100000f), Array.Empty<object>())))); configEntries.Add(key, val); return true; } public T GetConfig<T>(string key) { if (!configEntries.TryGetValue(key, out var value)) { Plugin.instance.logger.LogWarning((object)("A config entry with the key '" + key + "' does not exist. Returning default value.")); return default(T); } if (value is ConfigEntry<T> val) { return val.Value; } Plugin.instance.logger.LogWarning((object)("Type mismatch for config entry '" + key + "'. Expected: " + value.SettingType.FullName + ", but got: " + typeof(T).FullName + ". Returning default value.")); return default(T); } public int GetAmount(string steamId = null) { if (steamId != null) { return playerUpgrades.ContainsKey(steamId) ? playerUpgrades[steamId] : 0; } PlayerAvatar val = SemiFunc.PlayerAvatarLocal(); if ((Object)(object)val != (Object)null) { steamId = SemiFunc.PlayerGetSteamID(val); } return (steamId != null && playerUpgrades.ContainsKey(steamId)) ? playerUpgrades[steamId] : 0; } internal bool Init(Item item) { name = item.itemAssetName; string text = "Item Upgrade "; if (!name.StartsWith(text)) { return false; } string text2 = name.Replace(text, ""); bool flag = true; switch (text2) { case "Player Health": saveName = text2.Replace("Player ", ""); break; case "Player Energy": saveName = "Stamina"; break; case "Player Extra Jump": saveName = new string((from x in text2.Replace("Player ", "") where !char.IsWhiteSpace(x) select x).ToArray()); break; case "Player Tumble Launch": saveName = "Launch"; break; case "Map Player Count": saveName = new string(text2.Where((char x) => !char.IsWhiteSpace(x)).ToArray()); flag = false; break; case "Player Sprint Speed": saveName = "Speed"; break; case "Player Grab Strength": saveName = "Strength"; break; case "Player Grab Range": saveName = "Range"; break; } if (saveName == null) { return false; } if (flag) { text2 = text2.Replace("Player ", ""); } updateRightAway = AccessTools.Method(typeof(PunManager), "Update" + new string(text2.Where((char x) => !char.IsWhiteSpace(x)).ToArray()) + "RightAway", (Type[])null, (Type[])null); sectionName = text2; AddConfig("Enabled", defaultValue: true, "Whether the upgrade item can be spawned to the shop."); AddConfig("Max Amount", item.maxAmount, "The maximum number of times the upgrade item can appear in the truck."); AddConfig("Max Amount In Shop", item.maxAmountInShop, "The maximum number of times the upgrade item can appear in the shop."); AddConfig("Minimum Price", item.value.valueMin, "The minimum cost to purchase the upgrade item.\nThe default price multiplier is set to 4. (Note: Other mods may modify this multiplier, affecting this upgrade item's price.)"); AddConfig("Maximum Price", item.value.valueMax, "The maximum cost to purchase the upgrade item.\nThe default price multiplier is set to 4. (Note: Other mods may modify this multiplier, affecting this upgrade item's price.)"); AddConfig("Price Increase Scaling", -1f, "The scale of the price increase based on the total number of upgrade item purchased.\nDefault scaling is set to 0.5. (Note: This value may be modified by other mods that adjust the game's default scaling.)\nSet to -1 to use the default scaling."); AddConfig("Max Purchase Amount", item.maxPurchase ? item.maxPurchaseAmount : 0, "The maximum number of times the upgrade item can be purchased before it is no longer available in the shop.\nSet to 0 to disable the limit."); AddConfig("Allow Team Upgrades", defaultValue: false, "Whether the upgrade item applies to the entire team instead of just one player."); AddConfig("Sync Host Upgrades", defaultValue: false, "Whether the host should sync the item upgrade for the entire team."); AddConfig("Starting Amount", 0, "The number of times the upgrade item is applied at the start of the game."); item.maxAmount = GetConfig<int>("Max Amount"); item.maxAmountInShop = GetConfig<int>("Max Amount In Shop"); item.maxPurchaseAmount = GetConfig<int>("Max Purchase Amount"); item.maxPurchase = item.maxPurchaseAmount > 0; item.value = ScriptableObject.CreateInstance<Value>(); item.value.valueMin = GetConfig<float>("Minimum Price"); item.value.valueMax = GetConfig<float>("Maximum Price"); return true; } internal UpgradeItem() { playerUpgrades = new Dictionary<string, int>(); appliedPlayerUpgrades = new Dictionary<string, int>(); configEntries = new Dictionary<string, ConfigEntryBase>(); } } internal class VanillaUpgradesManager : MonoBehaviour { internal static VanillaUpgradesManager instance; internal PhotonView photonView; private bool checkPlayerUpgrades; private void Awake() { instance = this; photonView = ((Component)this).GetComponent<PhotonView>(); if (SemiFunc.IsMasterClientOrSingleplayer()) { ((MonoBehaviour)this).StartCoroutine("WaitUntilLevel"); } } private void FixedUpdate() { if (!checkPlayerUpgrades) { return; } foreach (UpgradeItem upgradeItem in Plugin.instance.upgradeItems) { int config = upgradeItem.GetConfig<int>("Starting Amount"); if (config >= 0) { foreach (PlayerAvatar item in SemiFunc.PlayerGetAll()) { string text = SemiFunc.PlayerGetSteamID(item); if (!upgradeItem.appliedPlayerUpgrades.ContainsKey(text)) { upgradeItem.appliedPlayerUpgrades[text] = 0; } if (upgradeItem.appliedPlayerUpgrades[text] != config) { Upgrade(upgradeItem.name, text, config - upgradeItem.appliedPlayerUpgrades[text]); upgradeItem.appliedPlayerUpgrades[text] = config; } } } if (!upgradeItem.GetConfig<bool>("Sync Host Upgrades")) { continue; } int amount = upgradeItem.GetAmount(); foreach (PlayerAvatar item2 in from x in SemiFunc.PlayerGetAll() where (Object)(object)x != (Object)(object)SemiFunc.PlayerAvatarLocal() select x) { string steamId = SemiFunc.PlayerGetSteamID(item2); int amount2 = upgradeItem.GetAmount(steamId); int num = amount - amount2; if (num != 0) { Upgrade(upgradeItem.name, steamId, num); } } } } private IEnumerator WaitUntilLevel() { yield return (object)new WaitUntil((Func<bool>)(() => SemiFunc.LevelGenDone())); checkPlayerUpgrades = true; } internal void Upgrade(string upgradeItemName, string steamId, int amount = 1) { UpgradeItem upgradeItem = Plugin.instance.upgradeItems.FirstOrDefault((UpgradeItem x) => x.name == upgradeItemName); if (upgradeItem != null) { upgradeItem.playerUpgrades[steamId] += amount; if (SemiFunc.IsMasterClientOrSingleplayer()) { upgradeItem.updateRightAway.Invoke(PunManager.instance, new object[1] { steamId }); } if (SemiFunc.IsMasterClient()) { photonView.RPC("UpgradeRPC", (RpcTarget)1, new object[3] { upgradeItemName, steamId, upgradeItem.playerUpgrades[steamId] }); } } } [PunRPC] internal void UpgradeRPC(string upgradeItemName, string steamId, int amount) { UpgradeItem upgradeItem = Plugin.instance.upgradeItems.FirstOrDefault((UpgradeItem x) => x.name == upgradeItemName); if (upgradeItem != null) { upgradeItem.playerUpgrades[steamId] = amount; upgradeItem.updateRightAway.Invoke(PunManager.instance, new object[1] { steamId }); } } } }