Some mods may be broken due to the recent Alloyed Collective update.
Decompiled source of OopsAllGup v1.0.1
OopsAllGup.dll
Decompiled a year agousing System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using BepInEx.Logging; using EntityStates; using EntityStates.Gup; using HG.Reflection; using On.EntityStates.Gup; using On.RoR2; using RiskOfOptions; using RiskOfOptions.OptionConfigs; using RiskOfOptions.Options; using RoR2; using RoR2.ExpansionManagement; using UnityEngine; using UnityEngine.Networking; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: OptIn] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("OopsAllGup")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+d05a7845cf9be38a1892519457ef7b2d51d529bc")] [assembly: AssemblyProduct("OopsAllGup")] [assembly: AssemblyTitle("OopsAllGup")] [assembly: AssemblyVersion("1.0.0.0")] namespace OopsAllGup; internal class GupDetails : MonoBehaviour { public int livesLeft; public void CopyFrom(GupDetails gupDetails) { livesLeft = gupDetails.livesLeft; } } internal static class Log { private static ManualLogSource _logSource; internal static void Init(ManualLogSource logSource) { _logSource = logSource; } internal static void Debug(object data) { _logSource.LogDebug(data); } internal static void Error(object data) { _logSource.LogError(data); } internal static void Exception(Exception data) { _logSource.LogError((object)data); } internal static void Fatal(object data) { _logSource.LogFatal(data); } internal static void Info(object data) { _logSource.LogInfo(data); } internal static void Message(object data) { _logSource.LogMessage(data); } internal static void Warning(object data) { _logSource.LogWarning(data); } } [BepInPlugin("com.justinderby.oopsallgup", "OopsAllGup", "1.0.1")] [BepInDependency(/*Could not decode attribute arguments.*/)] public class OopsAllGup : BaseUnityPlugin { public const string GUID = "com.justinderby.oopsallgup"; public const string ModName = "OopsAllGup"; public const string Version = "1.0.1"; public static ConfigEntry<bool> ModEnabled; public static ConfigEntry<int> SplitCount; public static ConfigEntry<int> Lives; public static ConfigEntry<bool> KinForcesGup; public void Awake() { //IL_0094: Unknown result type (might be due to invalid IL or missing references) //IL_009e: Expected O, but got Unknown //IL_00a6: Unknown result type (might be due to invalid IL or missing references) //IL_00b0: Expected O, but got Unknown //IL_00b8: Unknown result type (might be due to invalid IL or missing references) //IL_00c2: Expected O, but got Unknown Log.Init(((BaseUnityPlugin)this).Logger); ModEnabled = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "ModEnabled", true, "Enable mod. (Default: true)"); SplitCount = ((BaseUnityPlugin)this).Config.Bind<int>("General", "SplitCount", 2, "When undergoing mitosis, how many should spawn. (Default: 2)"); Lives = ((BaseUnityPlugin)this).Config.Bind<int>("General", "Lives", 3, "How many lives a gup has. (Default: 3)"); KinForcesGup = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "OverrideArtifactOfKin", true, "When Artifact of Kin is enabled, force Gup as the monster. (Default: true)"); BaseSplitDeath.OnEnter += new hook_OnEnter(BaseSplitDeath_OnEnter); ClassicStageInfo.HandleSingleMonsterTypeArtifact += new hook_HandleSingleMonsterTypeArtifact(ClassicStageInfo_HandleSingleMonsterTypeArtifact); BodySplitter.PerformInternal += new hook_PerformInternal(BodySplitter_PerformInternal); try { if (RiskOfOptionsCompatibility.Enabled) { RiskOfOptionsCompatibility.InstallRiskOfOptions(); } } catch (Exception data) { Log.Exception(data); } } public void Destroy() { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Expected O, but got Unknown //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Expected O, but got Unknown BaseSplitDeath.OnEnter -= new hook_OnEnter(BaseSplitDeath_OnEnter); ClassicStageInfo.HandleSingleMonsterTypeArtifact -= new hook_HandleSingleMonsterTypeArtifact(ClassicStageInfo_HandleSingleMonsterTypeArtifact); BodySplitter.PerformInternal -= new hook_PerformInternal(BodySplitter_PerformInternal); } private CharacterSpawnCard GetGeepCard() { return LegacyResourcesAPI.Load<CharacterSpawnCard>("SpawnCards/CharacterSpawnCards/cscGeepBody"); } private CharacterSpawnCard GetGupCard() { return LegacyResourcesAPI.Load<CharacterSpawnCard>("SpawnCards/CharacterSpawnCards/cscGupBody"); } private void BaseSplitDeath_OnEnter(orig_OnEnter orig, BaseSplitDeath self) { orig.Invoke(self); if (NetworkServer.active && ModEnabled.Value && (self is GupDeath || self is GeepDeath)) { GupDetails gupDetails = ((EntityState)self).outer.commonComponents.characterBody.masterObject.gameObject.GetComponent<GupDetails>(); if (!Object.op_Implicit((Object)(object)gupDetails)) { gupDetails = ((EntityState)self).outer.commonComponents.characterBody.masterObject.gameObject.AddComponent<GupDetails>(); gupDetails.livesLeft = Lives.Value; Log.Debug($"Adding new life counter to gup. livesLeft = {gupDetails.livesLeft}"); } gupDetails.livesLeft--; if (gupDetails.livesLeft > 1) { Log.Debug($"Forcing a new split! livesLeft = {gupDetails.livesLeft}"); ForceGupSplit(self); } } } private void ForceGupSplit(BaseSplitDeath entity) { entity.characterSpawnCard = GetGeepCard(); entity.spawnCount = SplitCount.Value; } private void BodySplitter_PerformInternal(orig_PerformInternal orig, BodySplitter self, MasterSummon masterSummon) { if (!NetworkServer.active || !ModEnabled.Value) { orig.Invoke(self, masterSummon); return; } GupDetails detailsOldBody = self.body.masterObject.gameObject.GetComponent<GupDetails>(); if ((Object)(object)detailsOldBody == (Object)null) { Log.Error("Cannot find GupDetails on Gup!"); orig.Invoke(self, masterSummon); return; } Action<CharacterMaster> oldAction = masterSummon.preSpawnSetupCallback; masterSummon.preSpawnSetupCallback = (Action<CharacterMaster>)Delegate.Combine(masterSummon.preSpawnSetupCallback, (Action<CharacterMaster>)delegate(CharacterMaster characterMaster) { GupDetails gupDetails = ((Component)characterMaster).gameObject.GetComponent<GupDetails>(); if (!Object.op_Implicit((Object)(object)gupDetails)) { gupDetails = ((Component)characterMaster).gameObject.AddComponent<GupDetails>(); } gupDetails.CopyFrom(detailsOldBody); Log.Debug($"Copying over gup lives! livesLeft = {gupDetails.livesLeft}"); oldAction?.Invoke(characterMaster); }); orig.Invoke(self, masterSummon); } private void ClassicStageInfo_HandleSingleMonsterTypeArtifact(orig_HandleSingleMonsterTypeArtifact orig, DirectorCardCategorySelection monsterCategories, Xoroshiro128Plus rng) { //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_00cf: Unknown result type (might be due to invalid IL or missing references) //IL_00d4: Unknown result type (might be due to invalid IL or missing references) //IL_00db: 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_00e4: Unknown result type (might be due to invalid IL or missing references) //IL_00e9: Unknown result type (might be due to invalid IL or missing references) //IL_00f0: Unknown result type (might be due to invalid IL or missing references) //IL_00fc: Expected O, but got Unknown //IL_0113: Unknown result type (might be due to invalid IL or missing references) //IL_0118: Unknown result type (might be due to invalid IL or missing references) //IL_0134: Unknown result type (might be due to invalid IL or missing references) if (!NetworkServer.active) { orig.Invoke(monsterCategories, rng); return; } if (!ModEnabled.Value || !KinForcesGup.Value) { orig.Invoke(monsterCategories, rng); return; } if (!Run.instance.IsExpansionEnabled(((IEnumerable<ExpansionDef>)(object)ExpansionCatalog.expansionDefs).FirstOrDefault((Func<ExpansionDef, bool>)((ExpansionDef def) => def.nameToken == "DLC1_NAME")))) { Log.Warning("Survivors of the Void expansion not enabled; not enabling Gups with Artifact of Kin"); orig.Invoke(monsterCategories, rng); return; } monsterCategories.Clear(); int num = monsterCategories.AddCategory("Gup", 1f); CharacterSpawnCard gupCard = GetGupCard(); monsterCategories.AddCard(num, new DirectorCard { spawnCard = (SpawnCard)(object)gupCard, selectionWeight = 1, spawnDistance = (MonsterSpawnDistance)0, preventOverhead = false, minimumStageCompletions = 0 }); BodyIndex body = ((SpawnCard)gupCard).prefab.GetComponent<CharacterMaster>().bodyPrefab.GetComponent<CharacterBody>().bodyIndex; if (Object.op_Implicit((Object)(object)Stage.instance)) { Stage.instance.singleMonsterTypeBodyIndex = body; return; } Stage.onServerStageBegin += delegate(Stage stage) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) stage.singleMonsterTypeBodyIndex = body; }; } } internal class RiskOfOptionsCompatibility { private static bool? _enabled; public static bool Enabled { get { if (!_enabled.HasValue) { _enabled = Chainloader.PluginInfos.ContainsKey("com.rune580.riskofoptions"); } return _enabled.Value; } } public static void InstallRiskOfOptions() { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Expected O, but got Unknown //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Expected O, but got Unknown //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_0040: Expected O, but got Unknown //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Expected O, but got Unknown //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_0064: Expected O, but got Unknown //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Expected O, but got Unknown AddOption((BaseOption)new CheckBoxOption(OopsAllGup.ModEnabled)); AddOption((BaseOption)new CheckBoxOption(OopsAllGup.KinForcesGup)); AddOption((BaseOption)new IntSliderOption(OopsAllGup.Lives, new IntSliderConfig { min = 3, max = 50 })); AddOption((BaseOption)new IntSliderOption(OopsAllGup.SplitCount, new IntSliderConfig { min = 1, max = 50 })); ModSettingsManager.SetModDescription("Control how Gups split during a run.", "com.justinderby.oopsallgup", "OopsAllGup"); static void AddOption(BaseOption option) { ModSettingsManager.AddOption(option, "com.justinderby.oopsallgup", "OopsAllGup"); } } }