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 KannasQualityofLife v0.2.2
KannaQoL.dll
Decompiled 2 years agousing System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using EntityStates; using EntityStates.Duplicator; using EntityStates.Scrapper; using IL.EntityStates.Duplicator; using Microsoft.CodeAnalysis; using Mono.Cecil.Cil; using MonoMod.Cil; using On.EntityStates.Duplicator; using On.RoR2; using R2API.Utils; using RoR2; using UnityEngine; using UnityEngine.Networking; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("KannaQoL")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("KannaQoL")] [assembly: AssemblyTitle("KannaQoL")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace SylmarDev.KannasQoL { public class KannasConfig { public static ConfigEntry<bool> enableFastScrapper; public static ConfigEntry<bool> enableBazaarScrapper; public static ConfigEntry<bool> enableSeerPing; public static ConfigEntry<bool> enableInstaTeleporter; public static ConfigEntry<bool> enableCleansingPool; public static ConfigEntry<bool> enableSingleFrog; public static ConfigEntry<int> frogStatueCost; public void Init(string configPath) { //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0011: 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_0047: Unknown result type (might be due to invalid IL or missing references) //IL_0062: Unknown result type (might be due to invalid IL or missing references) //IL_007d: Unknown result type (might be due to invalid IL or missing references) //IL_0098: Unknown result type (might be due to invalid IL or missing references) ConfigFile val = new ConfigFile(Path.Combine(configPath, "SylmarDev.KannasQualityofLife.cfg"), true); enableFastScrapper = val.Bind<bool>("Tweaks", "Enable Fast Scrapper", true, "Set to true to enable fast scrapper."); enableBazaarScrapper = val.Bind<bool>("Tweaks", "Enable Scrapper in Bazaar", true, "Set to true to put scrapper in the Bazaar in Time."); enableSeerPing = val.Bind<bool>("Tweaks", "Enable Seer Ping", true, "Set to true to ping Lunar Seers for destination."); enableInstaTeleporter = val.Bind<bool>("Tweaks", "Enable Instant Teleporter", true, "Set to true to instantly finish charging teleporter after boss is killed, with time adjusted."); enableCleansingPool = val.Bind<bool>("Tweaks", "Enable Cleansing Pool", true, "Set to true for guaranteed Cleansing Pool on Alphesian Sanctuary."); enableSingleFrog = val.Bind<bool>("Tweaks", "Enable Single Frog Pet", true, "Set to true to only pet the Glass Frog once for Deep Void Portal."); frogStatueCost = val.Bind<int>("Tweaks", "Frog Statue Cost", 10, "Required Lunar Coins per Glass Frog Pet."); } } [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInPlugin("SylmarDev.KannasQualityofLife", "KannasQualityofLife", "0.2.2")] [NetworkCompatibility(/*Could not decode attribute arguments.*/)] public class KannasQoL : BaseUnityPlugin { [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static Func<Instruction, bool> <>9__8_1; public static Func<Instruction, bool> <>9__8_2; public static Func<Instruction, bool> <>9__8_3; public static Func<Instruction, bool> <>9__8_4; public static Func<Instruction, bool> <>9__8_5; public static Func<Instruction, bool> <>9__8_6; public static Func<Instruction, bool> <>9__8_7; public static Func<Instruction, bool> <>9__8_8; public static Func<Instruction, bool> <>9__8_9; public static Manipulator <>9__8_0; internal void <Awake>b__8_0(ILContext il) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown //IL_0162: Unknown result type (might be due to invalid IL or missing references) //IL_0188: Unknown result type (might be due to invalid IL or missing references) //IL_01a0: Unknown result type (might be due to invalid IL or missing references) ILCursor val = new ILCursor(il); if (val.TryGotoNext(new Func<Instruction, bool>[9] { (Instruction x) => ILPatternMatchingExt.MatchCallOrCallvirt<EntityState>(x, "get_fixedAge"), (Instruction x) => ILPatternMatchingExt.MatchLdsfld(x, typeof(Duplicating).GetField("initialDelayDuration")), (Instruction x) => ILPatternMatchingExt.Match(x, OpCodes.Blt_Un_S), (Instruction x) => ILPatternMatchingExt.Match(x, OpCodes.Ldarg_0), (Instruction x) => ILPatternMatchingExt.MatchCallOrCallvirt<Duplicating>(x, "BeginCooking"), (Instruction x) => ILPatternMatchingExt.Match(x, OpCodes.Ldarg_0), (Instruction x) => ILPatternMatchingExt.MatchCallOrCallvirt<EntityState>(x, "get_fixedAge"), (Instruction x) => ILPatternMatchingExt.MatchLdsfld(x, typeof(Duplicating).GetField("initialDelayDuration")), (Instruction x) => ILPatternMatchingExt.MatchLdsfld(x, typeof(Duplicating).GetField("timeBetweenStartAndDropDroplet")) })) { int index = val.Index; val.Index = index + 1; val.Remove(); val.Emit<KannasQoL>(OpCodes.Ldsfld, "zeroInitialDelayDuration"); val.Index += 5; val.Remove(); val.Emit<KannasQoL>(OpCodes.Ldsfld, "zeroInitialDelayDuration"); val.Remove(); val.Emit<KannasQoL>(OpCodes.Ldsfld, "zeroTimeBetweenStartAndDropDroplet"); } else { Log.LogError("Printer couldn't shortcut"); } } internal bool <Awake>b__8_1(Instruction x) { return ILPatternMatchingExt.MatchCallOrCallvirt<EntityState>(x, "get_fixedAge"); } internal bool <Awake>b__8_2(Instruction x) { return ILPatternMatchingExt.MatchLdsfld(x, typeof(Duplicating).GetField("initialDelayDuration")); } internal bool <Awake>b__8_3(Instruction x) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) return ILPatternMatchingExt.Match(x, OpCodes.Blt_Un_S); } internal bool <Awake>b__8_4(Instruction x) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) return ILPatternMatchingExt.Match(x, OpCodes.Ldarg_0); } internal bool <Awake>b__8_5(Instruction x) { return ILPatternMatchingExt.MatchCallOrCallvirt<Duplicating>(x, "BeginCooking"); } internal bool <Awake>b__8_6(Instruction x) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) return ILPatternMatchingExt.Match(x, OpCodes.Ldarg_0); } internal bool <Awake>b__8_7(Instruction x) { return ILPatternMatchingExt.MatchCallOrCallvirt<EntityState>(x, "get_fixedAge"); } internal bool <Awake>b__8_8(Instruction x) { return ILPatternMatchingExt.MatchLdsfld(x, typeof(Duplicating).GetField("initialDelayDuration")); } internal bool <Awake>b__8_9(Instruction x) { return ILPatternMatchingExt.MatchLdsfld(x, typeof(Duplicating).GetField("timeBetweenStartAndDropDroplet")); } } public const string PluginAuthor = "SylmarDev"; public const string PluginName = "KannasQualityofLife"; public const string PluginGUID = "SylmarDev.KannasQualityofLife"; public const string PluginVersion = "0.2.2"; public static AssetBundle assets; public static float zeroInitialDelayDuration; public static float zeroTimeBetweenStartAndDropDroplet; public List<ScrapperLocation> slocations = new List<ScrapperLocation> { new ScrapperLocation { Position = new Vector3(-82.1f, -23.7f, -5.2f), Rotation = new Vector3(0f, 72.6f, 0f) }, new ScrapperLocation { Position = new Vector3(-95.1f, -25.2f, -45.2f), Rotation = new Vector3(0f, 72.6f, 0f) }, new ScrapperLocation { Position = new Vector3(-134.1f, -25.4f, -20.2f), Rotation = new Vector3(0f, 72.6f, 0f) }, new ScrapperLocation { Position = new Vector3(-122.1f, -23.7f, -5.2f), Rotation = new Vector3(0f, 72.6f, 0f) } }; public void Awake() { //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Expected O, but got Unknown //IL_00ae: Unknown result type (might be due to invalid IL or missing references) //IL_00b8: Expected O, but got Unknown //IL_0091: Unknown result type (might be due to invalid IL or missing references) //IL_009b: Expected O, but got Unknown //IL_007a: Unknown result type (might be due to invalid IL or missing references) //IL_007f: Unknown result type (might be due to invalid IL or missing references) //IL_0085: Expected O, but got Unknown //IL_00cb: Unknown result type (might be due to invalid IL or missing references) //IL_00d5: Expected O, but got Unknown //IL_00e8: Unknown result type (might be due to invalid IL or missing references) //IL_00f2: Expected O, but got Unknown //IL_0122: Unknown result type (might be due to invalid IL or missing references) //IL_012c: Expected O, but got Unknown //IL_0140: Unknown result type (might be due to invalid IL or missing references) //IL_014a: Expected O, but got Unknown Log.Init(((BaseUnityPlugin)this).Logger); new KannasConfig().Init(Paths.ConfigPath); Log.LogInfo("SylmarDev.KannasQualityofLife // ver 0.2.2"); Log.LogInfo("Loading Resources. . ."); Log.LogInfo("Assigning hooks. . ."); if (KannasConfig.enableFastScrapper.Value) { Stage.onStageStartGlobal += Stage_Start; Duplicating.BeginCooking += new hook_BeginCooking(Duplicating_BeginCooking); object obj = <>c.<>9__8_0; if (obj == null) { Manipulator val = delegate(ILContext il) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown //IL_0162: Unknown result type (might be due to invalid IL or missing references) //IL_0188: Unknown result type (might be due to invalid IL or missing references) //IL_01a0: Unknown result type (might be due to invalid IL or missing references) ILCursor val2 = new ILCursor(il); if (val2.TryGotoNext(new Func<Instruction, bool>[9] { (Instruction x) => ILPatternMatchingExt.MatchCallOrCallvirt<EntityState>(x, "get_fixedAge"), (Instruction x) => ILPatternMatchingExt.MatchLdsfld(x, typeof(Duplicating).GetField("initialDelayDuration")), (Instruction x) => ILPatternMatchingExt.Match(x, OpCodes.Blt_Un_S), (Instruction x) => ILPatternMatchingExt.Match(x, OpCodes.Ldarg_0), (Instruction x) => ILPatternMatchingExt.MatchCallOrCallvirt<Duplicating>(x, "BeginCooking"), (Instruction x) => ILPatternMatchingExt.Match(x, OpCodes.Ldarg_0), (Instruction x) => ILPatternMatchingExt.MatchCallOrCallvirt<EntityState>(x, "get_fixedAge"), (Instruction x) => ILPatternMatchingExt.MatchLdsfld(x, typeof(Duplicating).GetField("initialDelayDuration")), (Instruction x) => ILPatternMatchingExt.MatchLdsfld(x, typeof(Duplicating).GetField("timeBetweenStartAndDropDroplet")) })) { int index = val2.Index; val2.Index = index + 1; val2.Remove(); val2.Emit<KannasQoL>(OpCodes.Ldsfld, "zeroInitialDelayDuration"); val2.Index += 5; val2.Remove(); val2.Emit<KannasQoL>(OpCodes.Ldsfld, "zeroInitialDelayDuration"); val2.Remove(); val2.Emit<KannasQoL>(OpCodes.Ldsfld, "zeroTimeBetweenStartAndDropDroplet"); } else { Log.LogError("Printer couldn't shortcut"); } }; <>c.<>9__8_0 = val; obj = (object)val; } Duplicating.FixedUpdate += (Manipulator)obj; Duplicating.DropDroplet += new hook_DropDroplet(Duplicating_DropDroplet); } if (KannasConfig.enableBazaarScrapper.Value) { BazaarController.Awake += new hook_Awake(BazaarController_Awake); } if (KannasConfig.enableSeerPing.Value) { Util.GetBestBodyName += new hook_GetBestBodyName(Util_GetBestBodyName); } if (KannasConfig.enableInstaTeleporter.Value) { TeleporterInteraction.UpdateMonstersClear += new hook_UpdateMonstersClear(TeleporterInteraction_UpdateMonstersClear); } if (KannasConfig.enableCleansingPool.Value) { Stage.onStageStartGlobal += Stage_Start_CleansingPool; } if (KannasConfig.enableSingleFrog.Value) { FrogController.Pet += new hook_Pet(FrogController_Pet); } if (KannasConfig.frogStatueCost.Value != 1) { PurchaseInteraction.Awake += new hook_Awake(PurchaseInteraction_Awake); } Log.LogInfo("Awake done."); } private void Stage_onStageStartGlobal(Stage obj) { throw new NotImplementedException(); } private void Stage_Start(Stage self) { ((BaseUnityPlugin)this).Logger.Log((LogLevel)32, (object)"Called Stage_Start()"); WaitToBeginScrapping.duration = 0f; Scrapping.duration = 0f; ScrappingToIdle.duration = 0f; Duplicating.initialDelayDuration = 0.01f; Duplicating.timeBetweenStartAndDropDroplet = 0.01f; } private void Duplicating_BeginCooking(orig_BeginCooking orig, Duplicating self) { if (!NetworkServer.active) { orig.Invoke(self); } } private void Duplicating_DropDroplet(orig_DropDroplet orig, Duplicating self) { orig.Invoke(self); if (NetworkServer.active) { ((Component)((EntityState)self).outer).GetComponent<PurchaseInteraction>().Networkavailable = true; } } private void BazaarController_Awake(orig_Awake orig, BazaarController self) { orig.Invoke(self); bool active = NetworkServer.active; int num = 0; if (!active) { return; } foreach (ScrapperLocation slocation in slocations) { if (num >= PlayerCharacterMasterController.instances.Count) { break; } SpawnScrapper(slocation); num++; } } private void SpawnScrapper(ScrapperLocation location) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Expected O, but got Unknown //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_001f: 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_003a: Expected O, but got Unknown //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_0046: Unknown result type (might be due to invalid IL or missing references) DirectorPlacementRule val = new DirectorPlacementRule(); val.placementMode = (PlacementMode)0; SpawnCard val2 = Resources.Load<SpawnCard>("SpawnCards/InteractableSpawnCard/iscScrapper"); GameObject spawnedInstance = val2.DoSpawn(location.Position, Quaternion.identity, new DirectorSpawnRequest(val2, val, Run.instance.runRNG)).spawnedInstance; spawnedInstance.transform.eulerAngles = location.Rotation; NetworkServer.Spawn(spawnedInstance); } private string Util_GetBestBodyName(orig_GetBestBodyName orig, GameObject bodyObject) { if (((Object)bodyObject).name.Contains("SeerStation")) { string text = Language.GetString(SceneCatalog.GetSceneDef((SceneIndex)bodyObject.GetComponent<SeerStationController>().NetworktargetSceneDefIndex).portalSelectionMessageString).Substring(31).Trim(); Log.LogMessage(text); return "A dream of " + text.Split('<')[0] + " "; } return orig.Invoke(bodyObject); } private void TeleporterInteraction_UpdateMonstersClear(orig_UpdateMonstersClear orig, TeleporterInteraction self) { //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Invalid comparison between Unknown and I4 //IL_005e: 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) orig.Invoke(self); if (self.monstersCleared && Object.op_Implicit((Object)(object)self.holdoutZoneController) && (int)self.activationState == 2 && self.chargeFraction > 0.02f) { int displayChargePercent = TeleporterInteraction.instance.holdoutZoneController.displayChargePercent; float runStopwatch = Run.instance.GetRunStopwatch(); int num = Math.Min(Util.GetItemCountForTeam(self.holdoutZoneController.chargingTeam, Items.FocusConvergence.itemIndex, true, true), 3); float num2 = (100f - (float)displayChargePercent) / 100f * (TeleporterInteraction.instance.holdoutZoneController.baseChargeDuration / (1f + 0.3f * (float)num)); num2 = (float)Math.Round(num2, 2); float runStopwatch2 = runStopwatch + (float)Math.Round(num2, 2); Run.instance.SetRunStopwatch(runStopwatch2); TeleporterInteraction.instance.holdoutZoneController.FullyChargeHoldoutZone(); } } private void Stage_Start_CleansingPool(Stage self) { //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Expected O, but got Unknown //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Expected O, but got Unknown //IL_0073: Unknown result type (might be due to invalid IL or missing references) //IL_0092: Unknown result type (might be due to invalid IL or missing references) ((BaseUnityPlugin)this).Logger.Log((LogLevel)32, (object)"Called Stage_Start_CleansingPool()"); if (SceneInfo.instance.sceneDef.baseSceneName == "ancientloft") { DirectorPlacementRule val = new DirectorPlacementRule(); val.placementMode = (PlacementMode)0; SpawnCard val2 = Resources.Load<SpawnCard>("SpawnCards/InteractableSpawnCard/iscShrineCleanse"); Vector3 val3 = default(Vector3); ((Vector3)(ref val3))..ctor(-68f, 40.5f, 6.3f); GameObject spawnedInstance = val2.DoSpawn(val3, Quaternion.identity, new DirectorSpawnRequest(val2, val, Run.instance.runRNG)).spawnedInstance; spawnedInstance.transform.eulerAngles = new Vector3(0f, 0f, 0f); NetworkServer.Spawn(spawnedInstance); } } private void FrogController_Pet(orig_Pet orig, FrogController self, Interactor interactor) { self.maxPets = 1; Log.LogInfo(((Object)self.purchaseInteraction).name); orig.Invoke(self, interactor); } private void PurchaseInteraction_Awake(orig_Awake orig, PurchaseInteraction self) { orig.Invoke(self); AdjustFrogPrice(self); } private static void AdjustFrogPrice(PurchaseInteraction self) { //IL_0030: Unknown result type (might be due to invalid IL or missing references) if (((Object)self).name.StartsWith("FrogInteractable")) { self.cost = KannasConfig.frogStatueCost.Value; if (KannasConfig.frogStatueCost.Value == 0) { self.costType = (CostTypeIndex)0; } } } } public class ScrapperLocation { public Vector3 Position; public Vector3 Rotation; } internal static class Log { internal static ManualLogSource _logSource; internal static void Init(ManualLogSource logSource) { _logSource = logSource; } internal static void LogDebug(object data) { _logSource.LogDebug(data); } internal static void LogError(object data) { _logSource.LogError(data); } internal static void LogFatal(object data) { _logSource.LogFatal(data); } internal static void LogInfo(object data) { _logSource.LogInfo(data); } internal static void LogMessage(object data) { _logSource.LogMessage(data); } internal static void LogWarning(object data) { _logSource.LogWarning(data); } } }