using System.Collections.Generic; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using BepInEx; using HarmonyLib; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyCompany("AllUpgradesMod")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("AllUpgradesMod")] [assembly: AssemblyTitle("AllUpgradesMod")] [assembly: AssemblyVersion("1.0.0.0")] namespace AllUpgradesMod; [BepInPlugin("com.pmadd.unlimitedupgrades", "Unlimited Upgrades Mod", "1.0.0")] public class UnlimitedUpgradesPlugin : BaseUnityPlugin { private void Awake() { //IL_0005: Unknown result type (might be due to invalid IL or missing references) new Harmony("com.pmadd.unlimitedupgrades").PatchAll(); ((BaseUnityPlugin)this).Logger.LogInfo((object)"Unlimited Upgrades Mod loaded successfully!"); } } [HarmonyPatch(typeof(Faction), "ApplyTraitsTo")] public static class Faction_ApplyTraitsTo_Patch { public static void Prefix(Faction __instance, Unit u) { if ((Object)(object)u != (Object)null && (Object)(object)u.modifiers != (Object)null) { u.modifiers.statMaxSlotted = 100; } } } [HarmonyPatch(typeof(CUIFleetConfigPanel), "PopulatePanelWithFaction")] public static class CUIFleetConfigPanel_PopulatePanelWithFaction_Patch { public static Dictionary ScrollOffsets = new Dictionary(); public static bool Prefix(CUIFleetConfigPanel __instance, Faction f) { if ((Object)(object)f == (Object)null) { return true; } ((Behaviour)__instance.numUnitsLabel).enabled = false; if (Object.op_Implicit((Object)(object)__instance.unitBlueprint)) { ((UIWidget)__instance.wireframeTexture).mainTexture = (Texture)(object)__instance.unitBlueprint.hudOutlineTexture; __instance.descriptionLabel.text = __instance.unitBlueprint.description; int num = 0; for (int i = 0; i < f.currentFleet.Count; i++) { if ((Object)(object)((Component)f.currentFleet[i]).GetComponent().blueprint == (Object)(object)__instance.unitBlueprint) { num++; } } if (num > 1) { __instance.headerLabel.text = num + "x " + __instance.unitBlueprint.displayName + "S"; } else { __instance.headerLabel.text = "1x " + __instance.unitBlueprint.displayName; } } UnitConfig configByID = f.GetConfigByID(__instance.unitConfigTag); if (configByID != null) { if (!ScrollOffsets.TryGetValue(__instance.unitConfigTag, out var value)) { value = 0; ScrollOffsets[__instance.unitConfigTag] = 0; } int num2 = configByID.unitModifiers.Count + 1; int num3 = Mathf.Max(0, num2 - __instance.modifierButtons.Count); if (value > num3) { value = num3; ScrollOffsets[__instance.unitConfigTag] = value; } for (int j = 0; j < __instance.modifierButtons.Count; j++) { int num4 = value + j; ((CUIFleetConfigButton)__instance.modifierButtons[j]).index = num4; UnitModifier modifier = null; if (num4 < configByID.unitModifiers.Count) { modifier = configByID.unitModifiers[num4]; } __instance.modifierButtons[j].SetModifier(modifier); } for (int k = 0; k < configByID.weaponAssignments.Count; k++) { if (k < __instance.weaponButtons.Count) { __instance.weaponButtons[k].SetBlueprint(configByID.weaponAssignments[k].weaponBlueprint); } } } else { Debug.LogError((object)"Null unit config!"); } return false; } } [HarmonyPatch(typeof(CUIFleetConfigPanel), "Update")] public static class CUIFleetConfigPanel_Update_Patch { public static void Postfix(CUIFleetConfigPanel __instance) { if (Controls.menuMouseControl) { UICamera.selectedObject = null; } GameObject hoveredObject = UICamera.hoveredObject; if ((Object)(object)hoveredObject != (Object)null) { CUIFleetConfigPanelModifierButton component = hoveredObject.GetComponent(); if ((Object)(object)component != (Object)null && (Object)(object)((CUIFleetConfigButton)component).configPanel == (Object)(object)__instance) { float axis = Input.GetAxis("Mouse ScrollWheel"); if (axis != 0f) { Scroll(__instance, (!(axis > 0f)) ? 1 : (-1)); } } } GameObject selectedObject = UICamera.selectedObject; if (!((Object)(object)selectedObject != (Object)null)) { return; } CUIFleetConfigPanelModifierButton component2 = selectedObject.GetComponent(); if (!((Object)(object)component2 != (Object)null) || !((Object)(object)((CUIFleetConfigButton)component2).configPanel == (Object)(object)__instance)) { return; } int num = __instance.modifierButtons.IndexOf(component2); if (num == __instance.modifierButtons.Count - 1) { if (Input.GetKeyDown((KeyCode)275) || Input.GetKeyDown((KeyCode)100) || Controls.player.GetButtonDown("Menu Right")) { Scroll(__instance, 1); } } else if (num == 0 && (Input.GetKeyDown((KeyCode)276) || Input.GetKeyDown((KeyCode)97) || Controls.player.GetButtonDown("Menu Left"))) { Scroll(__instance, -1); } } private static void Scroll(CUIFleetConfigPanel panel, int direction) { UnitConfig configByID = Campaign.playerFaction.GetConfigByID(panel.unitConfigTag); if (configByID != null) { CUIFleetConfigPanel_PopulatePanelWithFaction_Patch.ScrollOffsets.TryGetValue(panel.unitConfigTag, out var value); int num = configByID.unitModifiers.Count + 1; int num2 = Mathf.Max(0, num - panel.modifierButtons.Count); int num3 = Mathf.Clamp(value + direction, 0, num2); if (num3 != value) { CUIFleetConfigPanel_PopulatePanelWithFaction_Patch.ScrollOffsets[panel.unitConfigTag] = num3; panel.Populate(); AudioMenu.playToggle = true; } } } } [HarmonyPatch(typeof(CUIFleetConfigModifierPanel), "OnModifierButtonClicked")] public static class CUIFleetConfigModifierPanel_OnModifierButtonClicked_Patch { public static bool Prefix(CUIFleetConfigModifierPanel __instance, CUIModifierButton button) { //IL_00d3: Unknown result type (might be due to invalid IL or missing references) //IL_00e2: Unknown result type (might be due to invalid IL or missing references) //IL_00e7: Unknown result type (might be due to invalid IL or missing references) //IL_00f4: Unknown result type (might be due to invalid IL or missing references) //IL_00bc: Unknown result type (might be due to invalid IL or missing references) if (button.isLocked) { if (Campaign.playerFaction.CanPurchaseModifier(button.prefab)) { MethodInfo? method = typeof(CUIFleetConfigModifierPanel).GetMethod("Purchase", BindingFlags.Instance | BindingFlags.NonPublic); typeof(CUIFleetConfigModifierPanel).GetField("_nextPurchasedModifier", BindingFlags.Static | BindingFlags.NonPublic).SetValue(null, button.prefab); typeof(CUIFleetConfigModifierPanel).GetField("_nextButton", BindingFlags.Static | BindingFlags.NonPublic).SetValue(null, button); method.Invoke(__instance, null); } else if (Campaign.playerFaction.upgradeTokens < button.prefab.upgradeTokenCost) { CUIFavorWidget.lastFlashTime = Time.time; Messenger.Broadcast("RequestToast", $"THIS UPGRADE REQUIRES {button.prefab.upgradeTokenCost} FAVOR", CockpitToast.notificationColor); AudioCockpit.PlayNegatory(); } return false; } if ((button.prefab.allowedUnitTypes & CUIFleetConfigModifierPanel.nextBlueprint.prefab.unitType) == 0) { Messenger.Broadcast("RequestToast", "THIS UPGRADE CANNOT BE EQUIPPED ON THIS CLASS OF WARSHIP", CockpitToast.notificationColor); AudioCockpit.PlayNegatory(); return false; } UnitConfig configByID = Campaign.playerFaction.GetConfigByID(CUIFleetConfigModifierPanel.nextTag); if (configByID != null) { if (configByID.unitModifiers.Contains(button.prefab)) { configByID.unitModifiers.Remove(button.prefab); AudioMenu.playCancel = true; } else { int nextModifierIndex = CUIFleetConfigModifierPanel.nextModifierIndex; if (nextModifierIndex >= 0 && nextModifierIndex < configByID.unitModifiers.Count && (Object)(object)configByID.unitModifiers[nextModifierIndex] == (Object)null) { configByID.unitModifiers[nextModifierIndex] = button.prefab; } else { configByID.unitModifiers.Add(button.prefab); } AudioMenu.playUpgradeEquipped = true; } Campaign.SavePlayerFaction(false); __instance.Populate(); } return false; } } [HarmonyPatch(typeof(CUIFleetConfigModifierPanel), "OnConfirmPurchaseClicked")] public static class CUIFleetConfigModifierPanel_OnConfirmPurchaseClicked_Patch { public static bool Prefix(CUIFleetConfigModifierPanel __instance) { //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Expected O, but got Unknown //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Expected O, but got Unknown //IL_0051: 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) //IL_0065: Unknown result type (might be due to invalid IL or missing references) UnitModifier val = (UnitModifier)typeof(CUIFleetConfigModifierPanel).GetField("_nextPurchasedModifier", BindingFlags.Static | BindingFlags.NonPublic).GetValue(null); CUIModifierButton val2 = (CUIModifierButton)typeof(CUIFleetConfigModifierPanel).GetField("_nextButton", BindingFlags.Static | BindingFlags.NonPublic).GetValue(null); Campaign.playerFaction.PurchaseModifier(val); if ((val.allowedUnitTypes & CUIFleetConfigModifierPanel.nextBlueprint.prefab.unitType) != 0) { AudioMenu.playUpgradeEquipped = true; UnitConfig configByID = Campaign.playerFaction.GetConfigByID(CUIFleetConfigModifierPanel.nextTag); if (configByID != null) { int nextModifierIndex = CUIFleetConfigModifierPanel.nextModifierIndex; if (nextModifierIndex >= 0 && nextModifierIndex < configByID.unitModifiers.Count && (Object)(object)configByID.unitModifiers[nextModifierIndex] == (Object)null) { configByID.unitModifiers[nextModifierIndex] = val; } else { configByID.unitModifiers.Add(val); } } } else { AudioMenu.playUpgradePurchased = true; } Campaign.SavePlayerFaction(false); Game.Instance.menuSubstate = (MenuSubstate)262144; CUIFleetConfigMenu.Instance.state = (State)2; __instance.Populate(); if ((Object)(object)val2 != (Object)null) { UICamera.selectedObject = ((Component)val2).gameObject; } return false; } } [HarmonyPatch(typeof(UnitModifier), "AddNewInstanceTo")] public static class UnitModifier_AddNewInstanceTo_Patch { public static bool Prefix(UnitModifier prefab, Unit u, ref UnitModifier __result) { //IL_0015: 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_0035: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)prefab == (Object)null || (Object)(object)u == (Object)null) { return true; } if ((prefab.allowedUnitTypes & u.unitType) == 0) { Debug.LogWarning((object)$"Blocking incompatible modifier {((Object)prefab).name} from being added to unit {((Object)u).name} (type: {u.unitType})"); __result = null; return false; } return true; } }