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 MoreUpgrades v1.4.5
MoreUpgrades.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.Bootstrap; using BepInEx.Configuration; using BepInEx.Logging; using CustomColors; using HarmonyLib; using MoreUpgrades.Classes; using MoreUpgrades.Properties; using Photon.Pun; using REPOLib.Modules; using TMPro; using UnityEngine; using UnityEngine.Events; using UnityEngine.SceneManagement; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: AssemblyTitle("MoreUpgrades")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("MoreUpgrades")] [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 MoreUpgrades { [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInPlugin("bulletbot.moreupgrades", "MoreUpgrades", "1.4.5")] internal class Plugin : BaseUnityPlugin { internal static class CustomColors { internal const string modGUID = "x753.CustomColors"; internal static bool IsLoaded() { return Chainloader.PluginInfos.ContainsKey("x753.CustomColors"); } internal static void OnAwake() { instance.PatchAll("CustomColorsPatches"); } } private const string modGUID = "bulletbot.moreupgrades"; private const string modName = "MoreUpgrades"; private const string modVer = "1.4.5"; internal static Plugin instance; internal ManualLogSource logger; private readonly Harmony harmony = new Harmony("bulletbot.moreupgrades"); internal AssetBundle assetBundle; internal List<UpgradeItem> upgradeItems; private void PatchAll(string name) { foreach (Type item in from t in Assembly.GetExecutingAssembly().GetTypes() where t.Namespace == "MoreUpgrades." + name select t) { harmony.PatchAll(item); } } private GameObject GetVisualsFromComponent(Component component) { //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Expected O, but got Unknown GameObject val = null; if (((object)component).GetType() == typeof(EnemyParent)) { EnemyParent val2 = (EnemyParent)(object)((component is EnemyParent) ? component : null); Enemy val3 = (Enemy)AccessTools.Field(typeof(EnemyParent), "Enemy").GetValue(component); try { val = ((Component)val2.EnableObject.gameObject.GetComponentInChildren<Animator>()).gameObject; } catch { } if ((Object)(object)val == (Object)null) { try { val = ((Component)((Component)val3).GetComponent<EnemyVision>().VisionTransform).gameObject; } catch { } } if ((Object)(object)val == (Object)null) { val = ((Component)val3).gameObject; } } else if (((object)component).GetType() == typeof(PlayerAvatar)) { PlayerAvatar val4 = (PlayerAvatar)(object)((component is PlayerAvatar) ? component : null); val = ((Component)val4.playerAvatarVisuals).gameObject; } return val; } internal void AddEnemyToMap(Component component, string enemyName = null) { //IL_0153: Unknown result type (might be due to invalid IL or missing references) UpgradeItem upgradeItem = upgradeItems.FirstOrDefault((UpgradeItem x) => x.name == "Map Enemy Tracker"); if (upgradeItem == null) { return; } EnemyParent val = (EnemyParent)(object)((component is EnemyParent) ? component : null); if (val != null && enemyName == null) { enemyName = val.enemyName; } if ((from x in upgradeItem.GetConfig<string>("Exclude Enemies").Split(new char[1] { ',' }) select x.Trim() into x where !string.IsNullOrEmpty(x) select x).Contains(enemyName)) { return; } GameObject visuals = GetVisualsFromComponent(component); List<(GameObject, Color)> variable = upgradeItem.GetVariable<List<(GameObject, Color)>>("AddToMap"); List<GameObject> variable2 = upgradeItem.GetVariable<List<GameObject>>("RemoveFromMap"); if (!((Object)(object)visuals == (Object)null) && !variable.Any(((GameObject, Color) x) => (Object)(object)x.Item1 == (Object)(object)visuals)) { if (variable2.Contains(visuals)) { variable2.Remove(visuals); } variable.Add((visuals, upgradeItem.GetConfig<Color>("Color"))); } } internal void RemoveEnemyFromMap(Component component, string enemyName = null) { UpgradeItem upgradeItem = upgradeItems.FirstOrDefault((UpgradeItem x) => x.name == "Map Enemy Tracker"); if (upgradeItem == null) { return; } EnemyParent val = (EnemyParent)(object)((component is EnemyParent) ? component : null); if (val != null && enemyName == null) { enemyName = val.enemyName; } if ((from x in upgradeItem.GetConfig<string>("Exclude Enemies").Split(new char[1] { ',' }) select x.Trim() into x where !string.IsNullOrEmpty(x) select x).Contains(enemyName)) { return; } GameObject visuals = GetVisualsFromComponent(component); List<(GameObject, Color)> variable = upgradeItem.GetVariable<List<(GameObject, Color)>>("AddToMap"); List<GameObject> variable2 = upgradeItem.GetVariable<List<GameObject>>("RemoveFromMap"); if ((Object)(object)visuals == (Object)null || variable2.Contains(visuals)) { return; } if (variable.Any(((GameObject, Color) x) => (Object)(object)x.Item1 == (Object)(object)visuals)) { variable.RemoveAll(((GameObject, Color) x) => (Object)(object)x.Item1 == (Object)(object)visuals); } variable2.Add(visuals); } internal void AddPlayerToMap(PlayerAvatar playerAvatar) { //IL_00b6: Unknown result type (might be due to invalid IL or missing references) //IL_00bb: Unknown result type (might be due to invalid IL or missing references) //IL_00fb: Unknown result type (might be due to invalid IL or missing references) //IL_00ed: Unknown result type (might be due to invalid IL or missing references) //IL_00f2: Unknown result type (might be due to invalid IL or missing references) UpgradeItem upgradeItem = upgradeItems.FirstOrDefault((UpgradeItem x) => x.name == "Map Player Tracker"); if (upgradeItem == null) { return; } GameObject visuals = GetVisualsFromComponent((Component)(object)playerAvatar); List<(GameObject, Color)> variable = upgradeItem.GetVariable<List<(GameObject, Color)>>("AddToMap"); List<GameObject> variable2 = upgradeItem.GetVariable<List<GameObject>>("RemoveFromMap"); if (!((Object)(object)visuals == (Object)null) && !variable.Any(((GameObject, Color) x) => (Object)(object)x.Item1 == (Object)(object)visuals)) { if (variable2.Contains(visuals)) { variable2.Remove(visuals); } Color item = upgradeItem.GetConfig<Color>("Color"); if (upgradeItem.GetConfig<bool>("Player Color")) { item = (Color)AccessTools.Field(typeof(PlayerAvatarVisuals), "color").GetValue(playerAvatar.playerAvatarVisuals); } variable.Add((visuals, item)); } } internal void RemovePlayerToMap(PlayerAvatar playerAvatar) { UpgradeItem upgradeItem = upgradeItems.FirstOrDefault((UpgradeItem x) => x.name == "Map Player Tracker"); if (upgradeItem == null) { return; } GameObject visuals = GetVisualsFromComponent((Component)(object)playerAvatar); List<(GameObject, Color)> variable = upgradeItem.GetVariable<List<(GameObject, Color)>>("AddToMap"); List<GameObject> variable2 = upgradeItem.GetVariable<List<GameObject>>("RemoveFromMap"); if ((Object)(object)visuals == (Object)null || variable2.Contains(visuals)) { return; } if (variable.Any(((GameObject, Color) x) => (Object)(object)x.Item1 == (Object)(object)visuals)) { variable.RemoveAll(((GameObject, Color) x) => (Object)(object)x.Item1 == (Object)(object)visuals); } variable2.Add(visuals); } internal static float ItemValueMultiplier(float itemValueMultiplier, string itemAssetName) { if ((Object)(object)MoreUpgradesManager.instance == (Object)null) { return itemValueMultiplier; } return (instance.upgradeItems.FirstOrDefault((UpgradeItem x) => x.fullName == itemAssetName) != null) ? 1f : itemValueMultiplier; } internal static float UpgradeValueIncrease(float upgradeValueIncrease, string itemAssetName) { if ((Object)(object)MoreUpgradesManager.instance == (Object)null) { return upgradeValueIncrease; } UpgradeItem upgradeItem = instance.upgradeItems.FirstOrDefault((UpgradeItem x) => x.fullName == itemAssetName); if (upgradeItem == null) { return upgradeValueIncrease; } float num = (upgradeItem.HasConfig("Price Increase Scaling") ? upgradeItem.GetConfig<float>("Price Increase Scaling") : upgradeItem.upgradeItemBase.priceIncreaseScaling); if (num < 0f) { num = upgradeValueIncrease; } return num; } private void Awake() { //IL_0224: Unknown result type (might be due to invalid IL or missing references) //IL_032e: Unknown result type (might be due to invalid IL or missing references) instance = this; logger = Logger.CreateLogSource("MoreUpgrades"); assetBundle = AssetBundle.LoadFromMemory(Resources.moreupgrades); if ((Object)(object)assetBundle == (Object)null) { logger.LogError((object)"Something went wrong when loading the asset bundle."); return; } upgradeItems = new List<UpgradeItem>(); UpgradeItem sprintUsage = new UpgradeItem(new UpgradeItemBase { name = "Sprint Usage", maxAmount = 10, maxAmountInShop = 2, minPrice = 9000f, maxPrice = 14000f }); sprintUsage.AddConfig("Scaling Factor", 0.1f, "Formula: energySprintDrain / (1 + (upgradeAmount * scalingFactor))"); UpgradeItem upgradeItem2 = sprintUsage; upgradeItem2.onFixedUpdate = (Action)Delegate.Combine(upgradeItem2.onFixedUpdate, (Action)delegate { int amount = sprintUsage.GetAmount(); if ((Object)(object)PlayerController.instance != (Object)null && amount != 0) { if (!sprintUsage.HasVariable("OriginalEnergySprintDrain")) { sprintUsage.AddVariable("OriginalEnergySprintDrain", PlayerController.instance.EnergySprintDrain); } float variable8 = sprintUsage.GetVariable<float>("OriginalEnergySprintDrain"); PlayerController.instance.EnergySprintDrain = variable8 / (1f + (float)amount * sprintUsage.GetConfig<float>("Scaling Factor")); } }); upgradeItems.Add(sprintUsage); UpgradeItem valuableCount = new UpgradeItem(new UpgradeItemBase { name = "Valuable Count", minPrice = 30000f, maxPrice = 40000f, maxPurchaseAmount = 1, priceIncreaseScaling = 0f }); valuableCount.AddConfig("Display Total Value", defaultValue: true, "Whether to display the total value next to the valuable counter."); UpgradeItem upgradeItem3 = valuableCount; upgradeItem3.onInit = (Action)Delegate.Combine(upgradeItem3.onInit, (Action)delegate { valuableCount.AddVariable("CurrentValuables", new List<ValuableObject>()); valuableCount.AddVariable("Changed", value: false); valuableCount.AddVariable("PreviousCount", 0); valuableCount.AddVariable("PreviousValue", 0); valuableCount.AddVariable("TextLength", 0); }); UpgradeItem upgradeItem4 = valuableCount; upgradeItem4.onUpdate = (Action)Delegate.Combine(upgradeItem4.onUpdate, (Action)delegate { //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_0064: Expected O, but got Unknown if (!SemiFunc.RunIsLobby() && !SemiFunc.RunIsShop() && (Object)(object)MissionUI.instance != (Object)null && valuableCount.GetAmount() != 0) { TextMeshProUGUI val5 = (TextMeshProUGUI)AccessTools.Field(typeof(MissionUI), "Text").GetValue(MissionUI.instance); string text = (string)AccessTools.Field(typeof(MissionUI), "messagePrev").GetValue(MissionUI.instance); List<ValuableObject> variable3 = valuableCount.GetVariable<List<ValuableObject>>("CurrentValuables"); bool variable4 = valuableCount.GetVariable<bool>("Changed"); int variable5 = valuableCount.GetVariable<int>("PreviousCount"); int variable6 = valuableCount.GetVariable<int>("PreviousValue"); int variable7 = valuableCount.GetVariable<int>("TextLength"); int count = variable3.Count; bool config = valuableCount.GetConfig<bool>("Display Total Value"); int num3 = (config ? variable3.Select((ValuableObject x) => (int)x.dollarValueCurrent).Sum() : 0); if (!Utility.IsNullOrWhiteSpace(((TMP_Text)val5).text) && (variable4 || variable5 != count || variable6 != num3)) { string text2 = ((TMP_Text)val5).text; if (!variable4 && (variable5 != count || variable6 != num3)) { text2 = text2.Substring(0, text2.Length - variable7); } string text3 = $"\nValuables: <b>{count}</b>" + (config ? (" (<color=#558B2F>$</color><b>" + SemiFunc.DollarGetString(num3) + "</b>)") : ""); text2 += text3; valuableCount.SetVariable("PreviousCount", count); valuableCount.SetVariable("PreviousValue", num3); valuableCount.SetVariable("TextLength", text3.Length); ((TMP_Text)val5).text = text2; AccessTools.Field(typeof(MissionUI), "messagePrev").SetValue(MissionUI.instance, text2); if (variable4) { valuableCount.SetVariable("Changed", value: false); } } } }); upgradeItems.Add(valuableCount); UpgradeItem mapEnemyTracker = new UpgradeItem(new UpgradeItemBase { name = "Map Enemy Tracker", minPrice = 50000f, maxPrice = 60000f, maxPurchaseAmount = 1, priceIncreaseScaling = 0f }); mapEnemyTracker.AddConfig("Arrow Icon", defaultValue: true, "Whether the icon should appear as an arrow showing direction instead of a dot."); mapEnemyTracker.AddConfig<Color>("Color", Color.red, "The color of the icon."); mapEnemyTracker.AddConfig("Exclude Enemies", "", "Exclude specific enemies from displaying their icon by listing their names.\nExample: 'Gnome, Clown', seperated by commas."); UpgradeItem upgradeItem5 = mapEnemyTracker; upgradeItem5.onInit = (Action)Delegate.Combine(upgradeItem5.onInit, (Action)delegate { mapEnemyTracker.AddVariable("AddToMap", new List<(GameObject, Color)>()); mapEnemyTracker.AddVariable("RemoveFromMap", new List<GameObject>()); }); UpgradeItem upgradeItem6 = mapEnemyTracker; upgradeItem6.onUpdate = (Action)Delegate.Combine(upgradeItem6.onUpdate, (Action)delegate { if (!SemiFunc.RunIsLobby() && !SemiFunc.RunIsShop()) { UpdateTracker(mapEnemyTracker); } }); upgradeItems.Add(mapEnemyTracker); UpgradeItem mapPlayerTracker = new UpgradeItem(new UpgradeItemBase { name = "Map Player Tracker", minPrice = 30000f, maxPrice = 40000f, maxPurchaseAmount = 1, priceIncreaseScaling = 0f }); mapPlayerTracker.AddConfig("Arrow Icon", defaultValue: true, "Whether the icon should appear as an arrow showing direction instead of a dot."); mapPlayerTracker.AddConfig("Player Color", defaultValue: false, "Whether the icon should be colored as the player."); mapPlayerTracker.AddConfig<Color>("Color", Color.blue, "The color of the icon."); UpgradeItem upgradeItem7 = mapPlayerTracker; upgradeItem7.onInit = (Action)Delegate.Combine(upgradeItem7.onInit, (Action)delegate { mapPlayerTracker.AddVariable("AddToMap", new List<(GameObject, Color)>()); mapPlayerTracker.AddVariable("RemoveFromMap", new List<GameObject>()); }); UpgradeItem upgradeItem8 = mapPlayerTracker; upgradeItem8.onUpdate = (Action)Delegate.Combine(upgradeItem8.onUpdate, (Action)delegate { UpdateTracker(mapPlayerTracker); }); upgradeItems.Add(mapPlayerTracker); 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 val3 = new GameObject("More Upgrades Manager"); PhotonView val4 = val3.AddComponent<PhotonView>(); val4.ViewID = 1863; val3.AddComponent<MoreUpgradesManager>(); } }; logger.LogMessage((object)"MoreUpgrades has started."); PatchAll("Patches"); if (CustomColors.IsLoaded()) { CustomColors.OnAwake(); } void UpdateTracker(UpgradeItem upgradeItem) { //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_0080: Unknown result type (might be due to invalid IL or missing references) //IL_0082: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)SemiFunc.PlayerAvatarLocal() != (Object)null && upgradeItem.GetAmount() != 0) { List<(GameObject, Color)> variable = upgradeItem.GetVariable<List<(GameObject, Color)>>("AddToMap"); for (int num = variable.Count - 1; num >= 0; num--) { var (val, color) = variable[num]; variable.RemoveAt(num); MapCustom component = val.GetComponent<MapCustom>(); if (!((Object)(object)component != (Object)null)) { component = val.AddComponent<MapCustom>(); component.color = color; component.sprite = (upgradeItem.GetConfig<bool>("Arrow Icon") ? assetBundle.LoadAsset<Sprite>("Map Tracker") : SemiFunc.PlayerAvatarLocal().playerDeathHead.mapCustom.sprite); } } List<GameObject> variable2 = upgradeItem.GetVariable<List<GameObject>>("RemoveFromMap"); for (int num2 = variable2.Count - 1; num2 >= 0; num2--) { GameObject val2 = variable2[num2]; variable2.RemoveAt(num2); MapCustom component2 = val2.GetComponent<MapCustom>(); if (!((Object)(object)component2 == (Object)null)) { Object.Destroy((Object)(object)((Component)component2.mapCustomEntity).gameObject); Object.Destroy((Object)(object)component2); } } } } } } } namespace MoreUpgrades.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("MoreUpgrades.Properties.Resources", typeof(Resources).Assembly); resourceMan = resourceManager; } return resourceMan; } } [EditorBrowsable(EditorBrowsableState.Advanced)] internal static CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } internal static byte[] moreupgrades { get { object @object = ResourceManager.GetObject("moreupgrades", resourceCulture); return (byte[])@object; } } internal Resources() { } } } namespace MoreUpgrades.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 //IL_00f5: Unknown result type (might be due to invalid IL or missing references) //IL_00fb: Expected O, but got Unknown //IL_011c: Unknown result type (might be due to invalid IL or missing references) //IL_0122: Expected O, but got Unknown //IL_013f: Unknown result type (might be due to invalid IL or missing references) //IL_0145: Expected O, but got Unknown //IL_0160: Unknown result type (might be due to invalid IL or missing references) //IL_0166: Expected O, but got Unknown //IL_0183: Unknown result type (might be due to invalid IL or missing references) //IL_0189: 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), "itemValueMultiplier"), (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), "ItemValueMultiplier", (Type[])null, (Type[])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(PlayerAvatar))] internal class PlayerAvatarPatch { [HarmonyPatch("LateStart")] [HarmonyPostfix] private static void LateStart(PlayerAvatar __instance) { if (!((Object)(object)MoreUpgradesManager.instance == (Object)null) && !((Object)(object)__instance == (Object)(object)SemiFunc.PlayerAvatarLocal())) { Plugin.instance.AddPlayerToMap(__instance); } } [HarmonyPatch("ReviveRPC")] [HarmonyPostfix] private static void ReviveRPC(PlayerAvatar __instance) { if (!((Object)(object)MoreUpgradesManager.instance == (Object)null) && !((Object)(object)__instance == (Object)(object)SemiFunc.PlayerAvatarLocal())) { Plugin.instance.AddPlayerToMap(__instance); } } [HarmonyPatch("PlayerDeathRPC")] [HarmonyPostfix] private static void PlayerDeathRPC(PlayerAvatar __instance) { if (!((Object)(object)MoreUpgradesManager.instance == (Object)null) && !((Object)(object)__instance == (Object)(object)SemiFunc.PlayerAvatarLocal())) { Plugin.instance.RemovePlayerToMap(__instance); Plugin.instance.RemoveEnemyFromMap((Component)(object)__instance); } } [HarmonyPatch("SetColorRPC")] [HarmonyPostfix] private static void SetColorRPC(PlayerAvatar __instance) { if (!((Object)(object)MoreUpgradesManager.instance == (Object)null) && !((Object)(object)__instance == (Object)(object)SemiFunc.PlayerAvatarLocal())) { UpgradeItem upgradeItem = Plugin.instance.upgradeItems.FirstOrDefault((UpgradeItem x) => x.name == "Map Player Tracker"); if (upgradeItem != null && upgradeItem.GetConfig<bool>("Player Color")) { Plugin.instance.RemovePlayerToMap(__instance); Plugin.instance.AddPlayerToMap(__instance); } } } } [HarmonyPatch(typeof(EnemySlowMouth))] internal class EnemySlowMouthPatch { [HarmonyPatch("UpdateStateRPC")] [HarmonyPostfix] private static void UpdateStateRPC(EnemySlowMouth __instance, Enemy ___enemy) { //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Expected O, but got Unknown //IL_005b: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Expected O, but got Unknown //IL_0062: Unknown result type (might be due to invalid IL or missing references) //IL_0067: 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_006b: Invalid comparison between Unknown and I4 //IL_00b5: Unknown result type (might be due to invalid IL or missing references) //IL_00b8: Invalid comparison between Unknown and I4 if ((Object)(object)MoreUpgradesManager.instance == (Object)null || (Object)(object)___enemy == (Object)null) { return; } PlayerAvatar val = (PlayerAvatar)AccessTools.Field(typeof(EnemySlowMouth), "playerTarget").GetValue(__instance); EnemyParent val2 = (EnemyParent)AccessTools.Field(typeof(Enemy), "EnemyParent").GetValue(___enemy); State currentState = __instance.currentState; if ((int)currentState == 9) { Plugin.instance.RemoveEnemyFromMap((Component)(object)val2); if (!((Object)(object)val == (Object)(object)SemiFunc.PlayerAvatarLocal())) { Plugin.instance.RemovePlayerToMap(val); Plugin.instance.AddEnemyToMap((Component)(object)val, val2.enemyName); } } else if ((int)currentState == 11) { Plugin.instance.AddEnemyToMap((Component)(object)val2); if (!((Object)(object)val == (Object)(object)SemiFunc.PlayerAvatarLocal())) { Plugin.instance.AddPlayerToMap(val); Plugin.instance.RemoveEnemyFromMap((Component)(object)val, val2.enemyName); } } } } [HarmonyPatch(typeof(EnemyParent))] internal class EnemyParentPatch { [HarmonyPatch("SpawnRPC")] [HarmonyPostfix] private static void SpawnRPC(EnemyParent __instance) { if (!((Object)(object)MoreUpgradesManager.instance == (Object)null)) { Plugin.instance.AddEnemyToMap((Component)(object)__instance); } } [HarmonyPatch("DespawnRPC")] [HarmonyPostfix] private static void DespawnRPC(EnemyParent __instance) { if (!((Object)(object)MoreUpgradesManager.instance == (Object)null)) { Plugin.instance.RemoveEnemyFromMap((Component)(object)__instance); } } } [HarmonyPatch(typeof(EnemyHealth))] internal class EnemyHealthPatch { [HarmonyPatch("DeathRPC")] [HarmonyPostfix] private static void DeathRPC(EnemyHealth __instance, Enemy ___enemy) { //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Expected O, but got Unknown if (!((Object)(object)MoreUpgradesManager.instance == (Object)null)) { Plugin.instance.RemoveEnemyFromMap((Component)(EnemyParent)AccessTools.Field(typeof(Enemy), "EnemyParent").GetValue(___enemy)); } } } [HarmonyPatch(typeof(MissionUIPatch))] internal class MissionUIPatch { [HarmonyPatch(typeof(MissionUI), "MissionText")] [HarmonyTranspiler] private static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions) { //IL_0003: 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_0036: Expected O, but got Unknown //IL_0064: Unknown result type (might be due to invalid IL or missing references) //IL_006a: Expected O, but got Unknown return new CodeMatcher(instructions, (ILGenerator)null).MatchForward(false, (CodeMatch[])(object)new CodeMatch[1] { new CodeMatch((OpCode?)OpCodes.Stfld, (object)AccessTools.Field(typeof(MissionUI), "messagePrev"), (string)null) }).Advance(1).Insert((CodeInstruction[])(object)new CodeInstruction[1] { new CodeInstruction(OpCodes.Call, (object)AccessTools.Method(typeof(MissionUIPatch), "MissionText", (Type[])null, (Type[])null)) }) .InstructionEnumeration(); } private static void MissionText() { if (!((Object)(object)MoreUpgradesManager.instance == (Object)null)) { Plugin.instance.upgradeItems.FirstOrDefault((UpgradeItem x) => x.name == "Valuable Count")?.SetVariable("Changed", value: true); } } } [HarmonyPatch(typeof(StatsManager))] internal class StatsManagerPatch { [HarmonyPatch("Start")] [HarmonyPrefix] private static void Start(StatsManager __instance) { foreach (UpgradeItem upgradeItem in Plugin.instance.upgradeItems) { __instance.dictionaryOfDictionaries.Add("playerUpgradeModded" + upgradeItem.saveName, upgradeItem.playerUpgrades); __instance.dictionaryOfDictionaries.Add("appliedPlayerUpgradeModded" + upgradeItem.saveName, upgradeItem.appliedPlayerUpgrades); } } [HarmonyPatch("FetchPlayerUpgrades")] [HarmonyTranspiler] private static IEnumerable<CodeInstruction> FetchPlayerUpgradesTranspiler(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_0048: Unknown result type (might be due to invalid IL or missing references) //IL_004e: Expected O, but got Unknown //IL_0060: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Expected O, but got Unknown //IL_009f: Unknown result type (might be due to invalid IL or missing references) //IL_00a5: Expected O, but got Unknown //IL_00b3: Unknown result type (might be due to invalid IL or missing references) //IL_00b9: Expected O, but got Unknown //IL_00de: Unknown result type (might be due to invalid IL or missing references) //IL_00e4: Expected O, but got Unknown //IL_0101: Unknown result type (might be due to invalid IL or missing references) //IL_0107: Expected O, but got Unknown //IL_010f: Unknown result type (might be due to invalid IL or missing references) //IL_0115: Expected O, but got Unknown //IL_0132: Unknown result type (might be due to invalid IL or missing references) //IL_0138: Expected O, but got Unknown //IL_0140: Unknown result type (might be due to invalid IL or missing references) //IL_0146: Expected O, but got Unknown CodeMatcher val = new CodeMatcher(instructions, (ILGenerator)null); val.MatchForward(false, (CodeMatch[])(object)new CodeMatch[3] { new CodeMatch((OpCode?)OpCodes.Ldloca_S, (object)null, (string)null), new CodeMatch((OpCode?)OpCodes.Call, (object)AccessTools.Method(typeof(KeyValuePair<string, Dictionary<string, int>>), "get_Key", (Type[])null, (Type[])null), (string)null), new CodeMatch((OpCode?)OpCodes.Ldstr, (object)"playerUpgrade", (string)null) }); object operand = val.Operand; val.MatchForward(true, (CodeMatch[])(object)new CodeMatch[2] { new CodeMatch((OpCode?)OpCodes.Callvirt, (object)AccessTools.Method(typeof(string), "Trim", (Type[])null, (Type[])null), (string)null), new CodeMatch((OpCode?)OpCodes.Stloc_S, (object)null, (string)null) }); object operand2 = val.Operand; val.Advance(1); val.Insert((CodeInstruction[])(object)new CodeInstruction[5] { new CodeInstruction(OpCodes.Ldloca_S, operand), new CodeInstruction(OpCodes.Call, (object)AccessTools.Method(typeof(KeyValuePair<string, Dictionary<string, int>>), "get_Key", (Type[])null, (Type[])null)), new CodeInstruction(OpCodes.Ldloc_S, operand2), new CodeInstruction(OpCodes.Call, (object)AccessTools.Method(typeof(StatsManagerPatch), "FetchPlayerUpgrades", (Type[])null, (Type[])null)), new CodeInstruction(OpCodes.Stloc_S, operand2) }); return val.InstructionEnumeration(); } private static string FetchPlayerUpgrades(string key, string text) { string prefix = "playerUpgradeModded"; if ((Object)(object)MoreUpgradesManager.instance == (Object)null || !key.StartsWith(prefix)) { return text; } UpgradeItem upgradeItem = Plugin.instance.upgradeItems.FirstOrDefault((UpgradeItem x) => x.saveName == key.Substring(prefix.Length)); if (upgradeItem == null) { return text; } return upgradeItem.HasConfig("Display Name") ? upgradeItem.GetConfig<string>("Display Name") : upgradeItem.name; } } [HarmonyPatch(typeof(ValuableObject))] internal class ValuableObjectPatch { [HarmonyPatch("Start")] [HarmonyPostfix] private static void Start(ValuableObject __instance) { if ((Object)(object)MoreUpgradesManager.instance == (Object)null) { return; } UpgradeItem upgradeItem = Plugin.instance.upgradeItems.FirstOrDefault((UpgradeItem x) => x.name == "Valuable Count"); if (upgradeItem != null) { List<ValuableObject> variable = upgradeItem.GetVariable<List<ValuableObject>>("CurrentValuables"); if (!variable.Contains(__instance)) { variable.Add(__instance); } } } } [HarmonyPatch(typeof(PhysGrabObject))] internal class PhysGrabObjectPatch { [HarmonyPatch("OnDestroy")] [HarmonyPostfix] private static void OnDestroy(PhysGrabObject __instance) { if ((Object)(object)MoreUpgradesManager.instance == (Object)null) { return; } ValuableObject component = ((Component)__instance).gameObject.GetComponent<ValuableObject>(); if ((Object)(object)component == (Object)null) { return; } UpgradeItem upgradeItem = Plugin.instance.upgradeItems.FirstOrDefault((UpgradeItem x) => x.name == "Valuable Count"); if (upgradeItem != null) { List<ValuableObject> variable = upgradeItem.GetVariable<List<ValuableObject>>("CurrentValuables"); if (variable.Contains(component)) { variable.Remove(component); } } } } [HarmonyPatch(typeof(ItemUpgrade))] internal class ItemUpgradePatch { [HarmonyPatch("Start")] [HarmonyPostfix] private static void Start(ItemUpgrade __instance) { //IL_0055: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Expected O, but got Unknown //IL_006c: Unknown result type (might be due to invalid IL or missing references) //IL_0076: Expected O, but got Unknown if ((Object)(object)MoreUpgradesManager.instance == (Object)null) { return; } GameObject gameObject = ((Component)__instance).gameObject; UpgradeItem upgradeItem = Plugin.instance.upgradeItems.FirstOrDefault((UpgradeItem x) => x.fullName == gameObject.GetComponent<ItemAttributes>().item.itemAssetName); if (upgradeItem == null) { return; } __instance.upgradeEvent = new UnityEvent(); __instance.upgradeEvent.AddListener((UnityAction)delegate { if (upgradeItem.HasConfig("Allow Team Upgrades") && upgradeItem.GetConfig<bool>("Allow Team Upgrades")) { foreach (PlayerAvatar item in SemiFunc.PlayerGetAll()) { MoreUpgradesManager.instance.Upgrade(upgradeItem.name, SemiFunc.PlayerGetSteamID(item)); } return; } MoreUpgradesManager.instance.Upgrade(upgradeItem.name, SemiFunc.PlayerGetSteamID(SemiFunc.PlayerAvatarGetFromPhotonID((int)AccessTools.Field(typeof(ItemToggle), "playerTogglePhotonID").GetValue(gameObject.GetComponent<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 //IL_01d5: Unknown result type (might be due to invalid IL or missing references) //IL_01db: Expected O, but got Unknown //IL_01fc: Unknown result type (might be due to invalid IL or missing references) //IL_0202: Expected O, but got Unknown //IL_021f: Unknown result type (might be due to invalid IL or missing references) //IL_0225: Expected O, but got Unknown //IL_0240: Unknown result type (might be due to invalid IL or missing references) //IL_0246: Expected O, but got Unknown //IL_0263: Unknown result type (might be due to invalid IL or missing references) //IL_0269: 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), "itemValueMultiplier"), (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), "ItemValueMultiplier", (Type[])null, (Type[])null)) }); 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)MoreUpgradesManager.instance == (Object)null) { return false; } UpgradeItem upgradeItem = Plugin.instance.upgradeItems.FirstOrDefault((UpgradeItem x) => x.fullName == item.itemAssetName); return upgradeItem != null && upgradeItem.HasConfig("Enabled") && !upgradeItem.GetConfig<bool>("Enabled"); } } } namespace MoreUpgrades.CustomColorsPatches { [HarmonyPatch(typeof(ModdedColorPlayerAvatar))] internal class ModdedColorPlayerAvatarPatch { [HarmonyPatch("ModdedSetColorRPC")] [HarmonyPostfix] private static void ModdedSetColorRPC(ModdedColorPlayerAvatar __instance) { PlayerAvatar avatar = __instance.avatar; if (!((Object)(object)MoreUpgradesManager.instance == (Object)null) && !((Object)(object)avatar == (Object)(object)SemiFunc.PlayerAvatarLocal())) { UpgradeItem upgradeItem = Plugin.instance.upgradeItems.FirstOrDefault((UpgradeItem x) => x.name == "Map Player Tracker"); if (upgradeItem != null && upgradeItem.GetConfig<bool>("Player Color")) { Plugin.instance.RemovePlayerToMap(avatar); Plugin.instance.AddPlayerToMap(avatar); } } } } } namespace MoreUpgrades.Classes { public static class MoreUpgradesLib { public static bool IsManagerActive() { return (Object)(object)MoreUpgradesManager.instance != (Object)null; } public static IReadOnlyList<UpgradeItem> GetCoreUpgradeItems() { return Plugin.instance.upgradeItems.Where((UpgradeItem x) => x.modGUID == null).ToList(); } public static IReadOnlyList<UpgradeItem> GetUpgradeItemsByMod(string modGUID) { return Plugin.instance.upgradeItems.Where((UpgradeItem x) => x.modGUID == modGUID).ToList(); } public static UpgradeItem Register(string modGUID, Item item, GameObject prefab, UpgradeItemBase upgradeItemBase) { if (string.IsNullOrEmpty(modGUID)) { Plugin.instance.logger.LogWarning((object)"Couldn't register the upgrade item because the modGUID is not valid."); return null; } if ((Object)(object)Plugin.instance.assetBundle == (Object)null) { Plugin.instance.logger.LogWarning((object)(modGUID + ": Couldn't register the upgrade item because the core mod failed to start. Contact the mod creator.")); return null; } if ((Object)(object)item == (Object)null || (Object)(object)prefab == (Object)null) { Plugin.instance.logger.LogWarning((object)(modGUID + ": Couldn't register the upgrade item because the item or prefab are not valid.")); return null; } string name = upgradeItemBase.name; if (string.IsNullOrEmpty(name)) { Plugin.instance.logger.LogWarning((object)(modGUID + ": Couldn't register the upgrade item because the base name is not valid.")); return null; } if (Plugin.instance.upgradeItems.Any((UpgradeItem x) => x.name.ToLower().Trim() == name.ToLower().Trim())) { Plugin.instance.logger.LogWarning((object)(modGUID + ": An upgrade item with the name '" + name.Trim() + "' already exists. Duplicate upgrade items are not allowed.")); return null; } UpgradeItem upgradeItem = new UpgradeItem(upgradeItemBase, modGUID, item, prefab); Plugin.instance.upgradeItems.Add(upgradeItem); return upgradeItem; } } internal class MoreUpgradesManager : MonoBehaviour { internal static MoreUpgradesManager instance; internal PhotonView photonView; private bool checkPlayerUpgrades; private void Awake() { instance = this; photonView = ((Component)this).GetComponent<PhotonView>(); foreach (UpgradeItem upgradeItem in Plugin.instance.upgradeItems) { upgradeItem.variables.Clear(); upgradeItem.onInit?.Invoke(); } if (SemiFunc.IsMasterClientOrSingleplayer()) { ((MonoBehaviour)this).StartCoroutine("WaitUntilLevel"); } } private void LateUpdate() { foreach (UpgradeItem upgradeItem in Plugin.instance.upgradeItems) { upgradeItem.onLateUpdate?.Invoke(); } } private void FixedUpdate() { foreach (UpgradeItem upgradeItem in Plugin.instance.upgradeItems) { if (checkPlayerUpgrades) { if (upgradeItem.HasConfig("Starting Amount")) { 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.HasConfig("Sync Host Upgrades") && upgradeItem.GetConfig<bool>("Sync Host Upgrades")) { 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); } } } } upgradeItem.onFixedUpdate?.Invoke(); } } private void Update() { foreach (UpgradeItem upgradeItem in Plugin.instance.upgradeItems) { upgradeItem.onUpdate?.Invoke(); } } private IEnumerator WaitUntilLevel() { yield return (object)new WaitUntil((Func<bool>)(() => SemiFunc.LevelGenDone())); checkPlayerUpgrades = true; if (!SemiFunc.IsMasterClient()) { yield break; } foreach (UpgradeItem upgradeItem in Plugin.instance.upgradeItems) { foreach (PlayerAvatar playerAvatar in SemiFunc.PlayerGetAll()) { string steamId = SemiFunc.PlayerGetSteamID(playerAvatar); photonView.RPC("UpgradeRPC", (RpcTarget)4, new object[3] { upgradeItem.name, steamId, upgradeItem.GetAmount(steamId) }); } } } 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 ((Object)(object)SemiFunc.PlayerAvatarGetFromSteamID(steamId) == (Object)(object)SemiFunc.PlayerAvatarLocal()) { upgradeItem.onChanged?.Invoke(); } if (GameManager.Multiplayer()) { photonView.RPC("UpgradeRPC", (RpcTarget)(SemiFunc.IsMasterClient() ? 1 : 2), 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.playerUpgrades[steamId] = amount; if ((Object)(object)SemiFunc.PlayerAvatarGetFromSteamID(steamId) == (Object)(object)SemiFunc.PlayerAvatarLocal()) { upgradeItem.onChanged?.Invoke(); } if (SemiFunc.IsMasterClient()) { photonView.RPC("UpgradeRPC", (RpcTarget)1, new object[3] { upgradeItemName, steamId, amount }); } } } } public class UpgradeItem { internal string saveName; internal string sectionName; internal UpgradeItemBase upgradeItemBase; private Dictionary<string, ConfigEntryBase> configEntries; internal Dictionary<string, int> playerUpgrades; internal Dictionary<string, int> appliedPlayerUpgrades; internal Dictionary<string, object> variables; public Action onInit; public Action onLateUpdate; public Action onFixedUpdate; public Action onUpdate; public Action onChanged; public string name { get; private set; } public string fullName { get; private set; } public string modGUID { get; private set; } public bool HasConfig(string key) { ConfigEntryBase value; return configEntries.TryGetValue(key, out value); } 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 bool AddConfig<T>(string key, T defaultValue, ConfigDescription description = null) { if (configEntries.ContainsKey(key)) { Plugin.instance.logger.LogWarning((object)("A config entry with the key '" + key + "' already exists. Duplicates are not allowed.")); return false; } configEntries.Add(key, (ConfigEntryBase)(object)((BaseUnityPlugin)Plugin.instance).Config.Bind<T>(sectionName, key, defaultValue, description)); return true; } public bool AddConfig(string key, ConfigEntryBase value) { if (configEntries.ContainsKey(key)) { Plugin.instance.logger.LogWarning((object)("A config entry with the key '" + key + "' already exists. Duplicates are not allowed.")); return false; } configEntries.Add(key, value); return true; } public bool SetConfig<T>(string key, T value) { if (!configEntries.TryGetValue(key, out var value2)) { Plugin.instance.logger.LogWarning((object)("A config entry with the key '" + key + "' does not exist. Returning default value.")); return false; } if (value2 is ConfigEntry<T> val) { val.Value = value; return true; } Plugin.instance.logger.LogWarning((object)("Type mismatch for config entry '" + key + "'. Expected: " + value2.SettingType.FullName + ", but got: " + typeof(T).FullName + ". Returning default value.")); return false; } 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 bool HasVariable(string key) { object value; return variables.TryGetValue(key, out value); } public bool AddVariable<T>(string key, T value) { if (HasVariable(key)) { Plugin.instance.logger.LogWarning((object)("A variable with the key '" + key + "' already exists. Duplicates are not allowed.")); return false; } variables.Add(key, value); return true; } public bool SetVariable<T>(string key, T value) { if (!variables.TryGetValue(key, out var value2)) { Plugin.instance.logger.LogWarning((object)("A variable with the key '" + key + "' does not exist.")); return false; } if (value2 is T) { variables[key] = value; return true; } Plugin.instance.logger.LogWarning((object)("Type mismatch for variable '" + key + "'. Expected: " + value2.GetType().FullName + ", but got: " + typeof(T).FullName + ".")); return false; } public T GetVariable<T>(string key) { if (!variables.TryGetValue(key, out var value)) { Plugin.instance.logger.LogWarning((object)("A variable with the key '" + key + "' does not exist. Returning default value.")); return default(T); } if (value is T result) { return result; } Plugin.instance.logger.LogWarning((object)("Type mismatch for variable '" + key + "'. Expected: " + value.GetType().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 UpgradeItem(UpgradeItemBase upgradeItemBase, string modGUID = null, Item modItem = null, GameObject modPrefab = null) { UpgradeItem upgradeItem = this; name = upgradeItemBase.name; fullName = "Modded Item Upgrade Player " + name; this.modGUID = modGUID; saveName = new string(name.Where((char x) => !char.IsWhiteSpace(x)).ToArray()); sectionName = name + ((!Utility.IsNullOrWhiteSpace(modGUID)) ? (" (" + modGUID + ")") : ""); this.upgradeItemBase = upgradeItemBase; configEntries = new Dictionary<string, ConfigEntryBase>(); playerUpgrades = new Dictionary<string, int>(); appliedPlayerUpgrades = new Dictionary<string, int>(); variables = new Dictionary<string, object>(); TryAddConfig<bool>("Enabled", defaultValue: true, "Whether the upgrade item can be spawned to the shop."); TryAddConfig<int>("Max Amount", upgradeItemBase.maxAmount, "The maximum number of times the upgrade item can appear in the truck."); TryAddConfig<int>("Max Amount In Shop", upgradeItemBase.maxAmountInShop, "The maximum number of times the upgrade item can appear in the shop."); TryAddConfig<float>("Minimum Price", upgradeItemBase.minPrice, "The minimum cost to purchase the upgrade item."); TryAddConfig<float>("Maximum Price", upgradeItemBase.maxPrice, "The maximum cost to purchase the upgrade item."); TryAddConfig<float>("Price Increase Scaling", upgradeItemBase.priceIncreaseScaling, "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."); TryAddConfig<int>("Max Purchase Amount", upgradeItemBase.maxPurchaseAmount, "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."); TryAddConfig<bool>("Allow Team Upgrades", defaultValue: false, "Whether the upgrade item applies to the entire team instead of just one player."); TryAddConfig<bool>("Sync Host Upgrades", defaultValue: false, "Whether the host should sync the item upgrade for the entire team."); TryAddConfig<int>("Starting Amount", 0, "The number of times the upgrade item is applied at the start of the game."); TryAddConfig<string>("Display Name", name, "The display name of the upgrade item."); Item val = modItem ?? Plugin.instance.assetBundle.LoadAsset<Item>(name); ((Object)val).name = fullName; val.itemAssetName = fullName; val.itemName = (HasConfig("Display Name") ? GetConfig<string>("Display Name") : name) + " Upgrade"; val.maxAmount = (HasConfig("Max Amount") ? GetConfig<int>("Max Amount") : upgradeItemBase.maxAmount); val.maxAmountInShop = (HasConfig("Max Amount In Shop") ? GetConfig<int>("Max Amount In Shop") : upgradeItemBase.maxAmountInShop); val.maxPurchaseAmount = (HasConfig("Max Purchase Amount") ? GetConfig<int>("Max Purchase Amount") : upgradeItemBase.maxPurchaseAmount); val.maxPurchase = val.maxPurchaseAmount > 0; val.value = ScriptableObject.CreateInstance<Value>(); val.value.valueMin = (HasConfig("Minimum Price") ? GetConfig<float>("Minimum Price") : upgradeItemBase.minPrice); val.value.valueMax = (HasConfig("Maximum Price") ? GetConfig<float>("Maximum Price") : upgradeItemBase.maxPrice); GameObject val2 = modPrefab ?? Plugin.instance.assetBundle.LoadAsset<GameObject>(name + " Prefab"); ((Object)val2).name = fullName; val2.GetComponent<ItemAttributes>().item = val; val.prefab = val2; Items.RegisterItem(val); void TryAddConfig<T>(string key, T defaultValue, string description = "") { if (!upgradeItemBase.excludeConfigs.Contains(key)) { AddConfig(key, defaultValue, description); } } } } public class UpgradeItemBase { public string name = null; public int maxAmount = 1; public int maxAmountInShop = 1; public float minPrice = 1000f; public float maxPrice = 1000f; public int maxPurchaseAmount = 0; public float priceIncreaseScaling = -1f; public List<string> excludeConfigs = new List<string>(); } }