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 DLCSpawnPoolFixer v1.3.4
SpawnPoolFixer.dll
Decompiled 9 months agousing System; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Configuration; using HG; using Mono.Cecil.Cil; using MonoMod.Cil; using On.RoR2; using R2API.Utils; using RoR2; using RoR2.Navigation; using UnityEngine; using UnityEngine.AddressableAssets; using WolfoFixes; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("SpawnPoolFixer")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+57c3cb6cb60558b2813cc26adbb8d1801cb3f0ab")] [assembly: AssemblyProduct("SpawnPoolFixer")] [assembly: AssemblyTitle("SpawnPoolFixer")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] namespace SpawnPoolFixer; public class WConfig { public static ConfigFile ConfigFile = new ConfigFile(Paths.ConfigPath + "\\Wolfo.SpawnPoolFixer.cfg", true); public static ConfigEntry<float> cfgStage1Weight; public static ConfigEntry<bool> cfgSotV_EnemyRemovals; public static ConfigEntry<bool> WORMREMOVAL; public static ConfigEntry<bool> cfgLoopSeers; public static void InitConfig() { cfgStage1Weight = ConfigFile.Bind<float>("Config", "Plains Roost weight", 0.75f, "They are counted as 2 stages due to the 2 variants, so they essentially have double the weight."); cfgSotV_EnemyRemovals = ConfigFile.Bind<bool>("Config", "SotV enemy removals", true, "SotV replaced various enemies with new enemies.\nThis feature was removed in the new spawn pool system."); WORMREMOVAL = ConfigFile.Bind<bool>("Config", "SotV Meadows Worm removal", false, "SotV replaced Magma Worms on Sky Meadows with XI Construct. "); cfgLoopSeers = ConfigFile.Bind<bool>("Config", "Remove Pre Loop Destination from Seers during loops", true, "You can get PreLoop variants of stages that have loop variants as Lunar Seer Destinations.\nVanilla : True\nThis was confirmed a funny quirk so it probably wont be removed.\nBut it looks like a bug so this removes it"); } } [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInPlugin("Wolfo.DLCSpawnPoolFixer", "DLCSpawnPoolFixer", "1.3.4")] [NetworkCompatibility(/*Could not decode attribute arguments.*/)] public class SotsSpawnPoolFix : BaseUnityPlugin { public void Awake() { //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_0096: Unknown result type (might be due to invalid IL or missing references) //IL_009b: Unknown result type (might be due to invalid IL or missing references) //IL_014e: Unknown result type (might be due to invalid IL or missing references) //IL_0158: Expected O, but got Unknown //IL_015e: Unknown result type (might be due to invalid IL or missing references) //IL_0163: 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_017c: Unknown result type (might be due to invalid IL or missing references) //IL_0190: Unknown result type (might be due to invalid IL or missing references) //IL_0195: Unknown result type (might be due to invalid IL or missing references) //IL_019f: Unknown result type (might be due to invalid IL or missing references) //IL_01a9: Unknown result type (might be due to invalid IL or missing references) //IL_01aa: Unknown result type (might be due to invalid IL or missing references) //IL_01b4: Unknown result type (might be due to invalid IL or missing references) //IL_01b9: Unknown result type (might be due to invalid IL or missing references) //IL_01c8: Unknown result type (might be due to invalid IL or missing references) //IL_01cd: Unknown result type (might be due to invalid IL or missing references) //IL_01dc: Unknown result type (might be due to invalid IL or missing references) //IL_01e1: Unknown result type (might be due to invalid IL or missing references) WConfig.InitConfig(); FixSotsSpawnpools(); SceneCollection val = Addressables.LoadAssetAsync<SceneCollection>((object)"RoR2/Base/SceneGroups/sgStage1.asset").WaitForCompletion(); ((SceneEntry)(ref val._sceneEntries[0])).weight = WConfig.cfgStage1Weight.Value; ((SceneEntry)(ref val._sceneEntries[1])).weight = WConfig.cfgStage1Weight.Value; ((SceneEntry)(ref val._sceneEntries[2])).weight = WConfig.cfgStage1Weight.Value; ((SceneEntry)(ref val._sceneEntries[3])).weight = WConfig.cfgStage1Weight.Value; SceneCollection val2 = Addressables.LoadAssetAsync<SceneCollection>((object)"RoR2/Base/SceneGroups/loopSgStage1.asset").WaitForCompletion(); ((SceneEntry)(ref val2._sceneEntries[0])).weight = WConfig.cfgStage1Weight.Value; ((SceneEntry)(ref val2._sceneEntries[1])).weight = WConfig.cfgStage1Weight.Value; ((SceneEntry)(ref val2._sceneEntries[2])).weight = WConfig.cfgStage1Weight.Value; ((SceneEntry)(ref val2._sceneEntries[3])).weight = WConfig.cfgStage1Weight.Value; SceneDirector.onGenerateInteractableCardSelection += FixWrongRadarTowers; ExtraActions.onMonsterDCCS = (Action<DirectorCardCategorySelection>)Delegate.Combine(ExtraActions.onMonsterDCCS, new Action<DirectorCardCategorySelection>(RemoveMonsterBasedOnSotVReplacement)); BazaarController.IsUnlockedBeforeLooping += new hook_IsUnlockedBeforeLooping(NoPreLoopPostLoop); Addressables.LoadAssetAsync<InteractableSpawnCard>((object)"32c40c2b1da4a4244871ef499447ac1a").WaitForCompletion().maxSpawnsPerStage = 1; Addressables.LoadAssetAsync<InteractableSpawnCard>((object)"c6c8f501bfa87e54294f9b0bb9db3da4").WaitForCompletion().maxSpawnsPerStage = 1; CharacterSpawnCard obj = Addressables.LoadAssetAsync<CharacterSpawnCard>((object)"f7aba48d470b1594281c0eab455a12dd").WaitForCompletion(); ((SpawnCard)obj).forbiddenFlags = (NodeFlags)(((SpawnCard)obj).forbiddenFlags & 0xFE); NodeGraph val3 = Addressables.LoadAssetAsync<NodeGraph>((object)"RoR2/DLC1/itancientloft/itancientloft_GroundNodeGraph.asset").WaitForCompletion(); NodeGraph val4 = Addressables.LoadAssetAsync<NodeGraph>((object)"RoR2/DLC1/itmoon/itmoon_GroundNodeGraph.asset").WaitForCompletion(); NodeGraph val5 = Addressables.LoadAssetAsync<NodeGraph>((object)"RoR2/DLC1/voidraid/voidraid_GroundNodeGraph.asset").WaitForCompletion(); for (int i = 0; i < val3.nodes.Length; i++) { ref NodeFlags flags = ref val3.nodes[i].flags; flags = (NodeFlags)((uint)flags | 1u); } for (int j = 0; j < val4.nodes.Length; j++) { ref NodeFlags flags2 = ref val4.nodes[j].flags; flags2 = (NodeFlags)((uint)flags2 | 1u); } for (int k = 0; k < val5.nodes.Length; k++) { ref NodeFlags flags3 = ref val5.nodes[k].flags; flags3 = (NodeFlags)((uint)flags3 | 1u); } } private bool NoPreLoopPostLoop(orig_IsUnlockedBeforeLooping orig, BazaarController self, SceneDef sceneDef) { if (WConfig.cfgLoopSeers.Value && Object.op_Implicit((Object)(object)sceneDef.loopedSceneDef) && Run.instance.stageClearCount >= 5) { return false; } return orig.Invoke(self, sceneDef); } private void SotV_EnemyRemovals(ILContext il) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Expected O, but got Unknown ILCursor val = new ILCursor(il); if (val.TryGotoNext((MoveType)0, new Func<Instruction, bool>[1] { (Instruction x) => ILPatternMatchingExt.MatchStfld(x, "RoR2.ClassicStageInfo", "modifiableMonsterCategories") })) { val.EmitDelegate<Func<DirectorCardCategorySelection, DirectorCardCategorySelection>>((Func<DirectorCardCategorySelection, DirectorCardCategorySelection>)delegate(DirectorCardCategorySelection dccs) { RemoveMonsterBasedOnSotVReplacement(dccs); return dccs; }); } else { Debug.LogWarning((object)"IL Failed: SotV_EnemyRemovals"); } } public static void RemoveMonsterBasedOnSotVReplacement(DirectorCardCategorySelection dccs) { if (!WConfig.cfgSotV_EnemyRemovals.Value || !Object.op_Implicit((Object)(object)Run.instance) || !Run.instance.IsExpansionEnabled(DLCS.DLC1)) { return; } switch (SceneInfo.instance.sceneDef.baseSceneName) { case "golemplains": RemoveCard(dccs, 2, "fish"); break; case "frozenwall": RemoveCard(dccs, 2, "Lemurian"); RemoveCard(dccs, 2, "Wisp"); break; case "dampcavesimple": RemoveCard(dccs, 1, "GreaterWisp"); break; case "shipgraveyard": RemoveCard(dccs, 2, "Beetle"); break; case "rootjungle": RemoveCard(dccs, 1, "LemurianBruiser"); RemoveCard(dccs, 2, "Lemurian"); break; case "skymeadow": if (WConfig.WORMREMOVAL.Value) { RemoveCard(dccs, 0, "MagmaWorm"); } break; } } public static void RemoveCard(DirectorCardCategorySelection dccs, int cat, string card) { string text = ""; switch (cat) { case 2: text = "Basic Monsters"; break; case 1: text = "Minibosses"; break; case 0: text = "Champions"; break; } cat = dccs.FindCategoryIndexByName(text); if (cat != -1) { int num = FindSpawnCard(dccs.categories[cat].cards, card); if (num != -1) { Debug.Log((object)("SotV Removals : Removed " + card + " from " + (object)SceneInfo.instance.sceneDef)); ArrayUtils.ArrayRemoveAtAndResize<DirectorCard>(ref dccs.categories[cat].cards, num, 1); return; } } Debug.LogWarning((object)("Failed to remove " + card + " from " + (object)SceneInfo.instance.sceneDef)); } public static int FindSpawnCard(DirectorCard[] insert, string LookingFor) { for (int i = 0; i < insert.Length; i++) { if (((Object)insert[i].spawnCard).name.EndsWith(LookingFor)) { return i; } } Debug.LogWarning((object)("Couldn't find " + LookingFor)); return -1; } private void FixWrongRadarTowers(SceneDirector scene, DirectorCardCategorySelection dccs) { //IL_0023: 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) //IL_00c8: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_00af: Unknown result type (might be due to invalid IL or missing references) //IL_009f: Unknown result type (might be due to invalid IL or missing references) int num = dccs.FindCategoryIndexByName("Rare"); if (num == -1) { return; } Category val = dccs.categories[num]; for (int i = 0; i < val.cards.Length; i++) { if (Object.op_Implicit((Object)(object)val.cards[i].forbiddenUnlockableDef)) { string cachedName = SceneInfo.instance.sceneDef.cachedName; if (cachedName.StartsWith("habitat")) { UnlockableDef unlockableDef = UnlockableCatalog.GetUnlockableDef("Logs.Stages." + cachedName); Debug.Log((object)("Automatic Radar Scanner fix for " + (object)unlockableDef)); val.cards[i].forbiddenUnlockableDef = unlockableDef; } val.cards[i].selectionWeight = 10000; } } } public static void FixSotsSpawnpools() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000b: 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) //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0040: 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) DccsPool val = Addressables.LoadAssetAsync<DccsPool>((object)"RoR2/DLC2/artifactworld02/dpArtifactWorld02Monsters.asset").WaitForCompletion(); ((PoolEntry)val.poolCategories[0].includedIfConditionsMet[0]).dccs = Addressables.LoadAssetAsync<DirectorCardCategorySelection>((object)"RoR2/DLC2/artifactworld02/dccsArtifactWorld02Monsters_DLC1.asset").WaitForCompletion(); DirectorCardCategorySelection val2 = Addressables.LoadAssetAsync<DirectorCardCategorySelection>((object)"RoR2/DLC2/village/dccsVillageInteractables_DLC2.asset").WaitForCompletion(); val2.categories[5].cards[3].minimumStageCompletions = 1; } }