Please disclose if your mod was created primarily 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 EnemyLoot v0.3.4
EnemyLoot/EnemyLoot.dll
Decompiled 9 months agousing System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using EnemyLoot.Behaviours; using EnemyLoot.Patches; using GameNetcodeStuff; using HarmonyLib; using LethalLib.Modules; using Unity.Netcode; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyTitle("EnemyLoot")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("HP")] [assembly: AssemblyProduct("EnemyLoot")] [assembly: AssemblyCopyright("Copyright © HP 2024")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("723169ed-f41c-427a-af4c-ee8bc5e1bacb")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: AssemblyVersion("1.0.0.0")] namespace EnemyLoot { [HarmonyPatch(typeof(PlayerControllerB))] public class Shop { [HarmonyPatch("Awake")] [HarmonyPostfix] private static void loadShopHost() { EnemyLoot.Instance.mls.LogMessage((object)("areItemsInShop for Host? " + EnemyLoot.Config.areItemsInShop.Value)); if (EnemyLoot.Config.areItemsInShop.Value) { TerminalNode val = ScriptableObject.CreateInstance<TerminalNode>(); val.clearPreviousText = true; val.displayText = "Can be used for teleportation"; Items.RegisterShopItem(EnemyLoot.blackOrb, (TerminalNode)null, (TerminalNode)null, val, 800); TerminalNode val2 = ScriptableObject.CreateInstance<TerminalNode>(); val2.clearPreviousText = true; val2.displayText = "Can be used to heal yourself"; Items.RegisterShopItem(EnemyLoot.whiteOrb, (TerminalNode)null, (TerminalNode)null, val2, 200); TerminalNode val3 = ScriptableObject.CreateInstance<TerminalNode>(); val3.clearPreviousText = true; val3.displayText = "Gives unlimited stamina and more walk speed"; Items.RegisterShopItem(EnemyLoot.orangeOrb, (TerminalNode)null, (TerminalNode)null, val3, 300); TerminalNode val4 = ScriptableObject.CreateInstance<TerminalNode>(); val4.clearPreviousText = true; val4.displayText = "Gives you semi-inviciblity"; Items.RegisterShopItem(EnemyLoot.Spoon, (TerminalNode)null, (TerminalNode)null, val4, 900); TerminalNode val5 = ScriptableObject.CreateInstance<TerminalNode>(); val5.clearPreviousText = true; val5.displayText = "@!&*@^*"; Items.RegisterShopItem(EnemyLoot.WeirdHead, (TerminalNode)null, (TerminalNode)null, val5, 800); TerminalNode val6 = ScriptableObject.CreateInstance<TerminalNode>(); val6.clearPreviousText = true; val6.displayText = "THE TOWN INSIDE ME"; Items.RegisterShopItem(EnemyLoot.guiltyGearCase, (TerminalNode)null, (TerminalNode)null, val6, 500); } } } [BepInPlugin("SilasMeyer.EnemyLoot", "EnemyLoot", "0.3.4")] public class EnemyLoot : BaseUnityPlugin { public const string modGUID = "SilasMeyer.EnemyLoot"; public const string modName = "EnemyLoot"; public const string modVersion = "0.3.4"; private readonly Harmony harmony = new Harmony("SilasMeyer.EnemyLoot"); public static EnemyLoot Instance; public static MyConfig Config; public static Item spiderEgg; public static Item guiltyGearCase; public static Item blackOrb; public static Item whiteOrb; public static Item orangeOrb; public static Item Spoon; public static Item SnakeEgg; public static Item WeirdHead; public static Item Eye; public static AssetBundle bundle; internal static SpoonBehaviour ScriptSpoon; internal static AudioClip guiltyGearSFX; internal static AudioClip blackOrbSpawnSFX; internal static AudioClip blackOrbTeleportSFX; internal static AudioClip blackOrbCDSFX; internal static AudioClip whiteOrbActivationSFX; internal static AudioClip whiteOrbDestroySFX; internal static AudioClip whiteOrbCDSFX; internal static AudioClip orangeOrbCDSFX; internal static AudioClip orangeOrbActivationSFX; internal static AudioClip SpoonCDSFX; internal static AudioClip SpoonActivationSFX; internal static AudioClip WeirdHeadNoEnemySFX; internal static AudioClip WeirdHeadTeleportSFX; internal static AudioClip WeirdHeadCDSFX; internal static List<AudioClip> WeirdHeadWhistles = new List<AudioClip>(); internal static List<AudioClip> WeirdHeadFlutes = new List<AudioClip>(); internal static List<AudioClip> WeirdHeadVoices = new List<AudioClip>(); internal static Sprite IconBase; internal static Sprite IconCD; internal static Sprite IconActive; public bool isOrangeOrbActive; internal ManualLogSource mls; private void Awake() { //IL_00ca: 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_00e8: 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_0194: Unknown result type (might be due to invalid IL or missing references) //IL_0199: Unknown result type (might be due to invalid IL or missing references) //IL_01b2: Unknown result type (might be due to invalid IL or missing references) //IL_01b7: Unknown result type (might be due to invalid IL or missing references) //IL_0271: Unknown result type (might be due to invalid IL or missing references) //IL_0276: Unknown result type (might be due to invalid IL or missing references) //IL_028f: Unknown result type (might be due to invalid IL or missing references) //IL_0294: Unknown result type (might be due to invalid IL or missing references) //IL_034e: Unknown result type (might be due to invalid IL or missing references) //IL_0353: Unknown result type (might be due to invalid IL or missing references) //IL_036c: Unknown result type (might be due to invalid IL or missing references) //IL_0371: Unknown result type (might be due to invalid IL or missing references) //IL_0417: Unknown result type (might be due to invalid IL or missing references) //IL_041c: Unknown result type (might be due to invalid IL or missing references) //IL_0435: Unknown result type (might be due to invalid IL or missing references) //IL_043a: Unknown result type (might be due to invalid IL or missing references) //IL_04f2: Unknown result type (might be due to invalid IL or missing references) //IL_04f7: Unknown result type (might be due to invalid IL or missing references) //IL_0510: Unknown result type (might be due to invalid IL or missing references) //IL_0515: Unknown result type (might be due to invalid IL or missing references) //IL_06ba: Unknown result type (might be due to invalid IL or missing references) //IL_06bf: Unknown result type (might be due to invalid IL or missing references) //IL_06d8: Unknown result type (might be due to invalid IL or missing references) //IL_06dd: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)Instance == (Object)null) { Instance = this; } Config = new MyConfig(((BaseUnityPlugin)this).Config); mls = Logger.CreateLogSource("SilasMeyer.EnemyLoot"); mls.LogMessage((object)"Loading EnemyLoot"); bundle = AssetBundle.LoadFromFile(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "enemyloot")); IconBase = bundle.LoadAsset<Sprite>("Assets/Items/Icons/EnemyLootIconBase.png"); IconCD = bundle.LoadAsset<Sprite>("Assets/Items/Icons/EnemyLootIconCD.png"); IconActive = bundle.LoadAsset<Sprite>("Assets/Items/Icons/EnemyLootIconActive.png"); spiderEgg = bundle.LoadAsset<Item>("Assets/Items/SpiderEggItem.asset"); spiderEgg.positionOffset = new Vector3(-0.2f, 0f, 0.3f); spiderEgg.rotationOffset = new Vector3(-90f, 0f, -10f); ((GrabbableObject)spiderEgg.spawnPrefab.GetComponent<PhysicsProp>()).grabbableToEnemies = true; NetworkPrefabs.RegisterNetworkPrefab(spiderEgg.spawnPrefab); Utilities.FixMixerGroups(spiderEgg.spawnPrefab); Items.RegisterScrap(spiderEgg, 0, (LevelTypes)(-1)); guiltyGearCase = bundle.LoadAsset<Item>("Assets/Items/GuiltyGearCaseItem.asset"); guiltyGearSFX = bundle.LoadAsset<AudioClip>("Assets/Audio/GuiltyGearTownInsideMe.mp3"); GuiltyGearCaseBehaviour guiltyGearCaseBehaviour = guiltyGearCase.spawnPrefab.AddComponent<GuiltyGearCaseBehaviour>(); ((GrabbableObject)guiltyGearCaseBehaviour).grabbable = true; ((GrabbableObject)guiltyGearCaseBehaviour).grabbableToEnemies = true; ((GrabbableObject)guiltyGearCaseBehaviour).itemProperties = guiltyGearCase; guiltyGearCase.rotationOffset = new Vector3(0f, 90f, 0f); guiltyGearCase.positionOffset = new Vector3(0.1f, 0f, -0.08f); NetworkPrefabs.RegisterNetworkPrefab(guiltyGearCase.spawnPrefab); Utilities.FixMixerGroups(guiltyGearCase.spawnPrefab); Items.RegisterScrap(guiltyGearCase, 3, (LevelTypes)(-1)); blackOrb = bundle.LoadAsset<Item>("Assets/Items/BlackOrbItem.asset"); blackOrbSpawnSFX = bundle.LoadAsset<AudioClip>("Assets/Audio/BlackOrbSpawnSFX.mp3"); blackOrbTeleportSFX = bundle.LoadAsset<AudioClip>("Assets/Audio/BlackOrbTeleportSFX.mp3"); blackOrbCDSFX = bundle.LoadAsset<AudioClip>("Assets/Audio/BlackOrbCDSFX.mp3"); BlackOrbBehaviour blackOrbBehaviour = blackOrb.spawnPrefab.AddComponent<BlackOrbBehaviour>(); ((GrabbableObject)blackOrbBehaviour).grabbable = true; ((GrabbableObject)blackOrbBehaviour).grabbableToEnemies = true; ((GrabbableObject)blackOrbBehaviour).itemProperties = blackOrb; blackOrb.rotationOffset = new Vector3(0f, 0f, 0f); blackOrb.positionOffset = new Vector3(-0.04f, 0.02f, -0.02f); NetworkPrefabs.RegisterNetworkPrefab(blackOrb.spawnPrefab); Utilities.FixMixerGroups(blackOrb.spawnPrefab); Items.RegisterScrap(blackOrb, 0, (LevelTypes)(-1)); whiteOrb = bundle.LoadAsset<Item>("Assets/Items/WhiteOrbItem.asset"); whiteOrbCDSFX = bundle.LoadAsset<AudioClip>("Assets/Audio/WhiteOrbCDSFX.mp3"); whiteOrbActivationSFX = bundle.LoadAsset<AudioClip>("Assets/Audio/WhiteOrbHealSFX.mp3"); whiteOrbDestroySFX = bundle.LoadAsset<AudioClip>("Assets/Audio/WhiteOrbDestroySFX.mp3"); WhiteOrbBehaviour whiteOrbBehaviour = whiteOrb.spawnPrefab.AddComponent<WhiteOrbBehaviour>(); ((GrabbableObject)whiteOrbBehaviour).grabbable = true; ((GrabbableObject)whiteOrbBehaviour).grabbableToEnemies = true; ((GrabbableObject)whiteOrbBehaviour).itemProperties = whiteOrb; whiteOrb.rotationOffset = new Vector3(0f, 0f, 0f); whiteOrb.positionOffset = new Vector3(-0.04f, 0.02f, -0.02f); NetworkPrefabs.RegisterNetworkPrefab(whiteOrb.spawnPrefab); Utilities.FixMixerGroups(whiteOrb.spawnPrefab); Items.RegisterScrap(whiteOrb, 0, (LevelTypes)(-1)); orangeOrb = bundle.LoadAsset<Item>("Assets/Items/OrangeOrbItem.asset"); orangeOrbActivationSFX = bundle.LoadAsset<AudioClip>("Assets/Audio/OrangeOrbActivationSFX.mp3"); orangeOrbCDSFX = bundle.LoadAsset<AudioClip>("Assets/Audio/OrangeOrbCDSFX.mp3"); OrangeOrbBehaviour orangeOrbBehaviour = orangeOrb.spawnPrefab.AddComponent<OrangeOrbBehaviour>(); ((GrabbableObject)orangeOrbBehaviour).grabbable = true; ((GrabbableObject)orangeOrbBehaviour).grabbableToEnemies = true; ((GrabbableObject)orangeOrbBehaviour).itemProperties = orangeOrb; orangeOrb.rotationOffset = new Vector3(0f, 0f, 0f); orangeOrb.positionOffset = new Vector3(-0.04f, 0.02f, -0.02f); NetworkPrefabs.RegisterNetworkPrefab(orangeOrb.spawnPrefab); Utilities.FixMixerGroups(orangeOrb.spawnPrefab); Items.RegisterScrap(orangeOrb, 0, (LevelTypes)(-1)); Spoon = bundle.LoadAsset<Item>("Assets/Items/SpoonItem.asset"); SpoonActivationSFX = bundle.LoadAsset<AudioClip>("Assets/Audio/SpoonActivateSFX.mp3"); SpoonCDSFX = bundle.LoadAsset<AudioClip>("Assets/Audio/SpoonCDSFX.mp3"); ScriptSpoon = Spoon.spawnPrefab.AddComponent<SpoonBehaviour>(); ((GrabbableObject)ScriptSpoon).grabbable = true; ((GrabbableObject)ScriptSpoon).grabbableToEnemies = true; ((GrabbableObject)ScriptSpoon).itemProperties = Spoon; Spoon.rotationOffset = new Vector3(0f, -70f, 0f); Spoon.positionOffset = new Vector3(0.03f, 0.03f, -0.03f); NetworkPrefabs.RegisterNetworkPrefab(Spoon.spawnPrefab); Utilities.FixMixerGroups(Spoon.spawnPrefab); Items.RegisterScrap(Spoon, 0, (LevelTypes)(-1)); WeirdHead = bundle.LoadAsset<Item>("Assets/Items/WeirdHeadItem.asset"); WeirdHeadTeleportSFX = bundle.LoadAsset<AudioClip>("Assets/Audio/HeadSwapSFX.mp3"); WeirdHeadWhistles.Add(bundle.LoadAsset<AudioClip>("Assets/Audio/HeadWhistle1.mp3")); WeirdHeadWhistles.Add(bundle.LoadAsset<AudioClip>("Assets/Audio/HeadWhistle2.mp3")); WeirdHeadWhistles.Add(bundle.LoadAsset<AudioClip>("Assets/Audio/HeadWhistle3.mp3")); WeirdHeadWhistles.Add(bundle.LoadAsset<AudioClip>("Assets/Audio/Headwhistle4.mp3")); WeirdHeadFlutes.Add(bundle.LoadAsset<AudioClip>("Assets/Audio/HeadFlute1.mp3")); WeirdHeadFlutes.Add(bundle.LoadAsset<AudioClip>("Assets/Audio/HeadFlute2.mp3")); WeirdHeadFlutes.Add(bundle.LoadAsset<AudioClip>("Assets/Audio/HeadFlute3.mp3")); WeirdHeadFlutes.Add(bundle.LoadAsset<AudioClip>("Assets/Audio/HeadFlute4.mp3")); WeirdHeadFlutes.Add(bundle.LoadAsset<AudioClip>("Assets/Audio/HeadFlute5.mp3")); WeirdHeadVoices.Add(bundle.LoadAsset<AudioClip>("Assets/Audio/HeadVoiceNiceTry.mp3")); WeirdHeadVoices.Add(bundle.LoadAsset<AudioClip>("Assets/Audio/HeadVoiceEscape.mp3")); WeirdHeadBehaviour weirdHeadBehaviour = WeirdHead.spawnPrefab.AddComponent<WeirdHeadBehaviour>(); ((GrabbableObject)weirdHeadBehaviour).grabbable = true; ((GrabbableObject)weirdHeadBehaviour).grabbableToEnemies = true; ((GrabbableObject)weirdHeadBehaviour).itemProperties = WeirdHead; WeirdHead.rotationOffset = new Vector3(20f, 150f, 0f); WeirdHead.positionOffset = new Vector3(-0.04f, 0.02f, -0.02f); NetworkPrefabs.RegisterNetworkPrefab(WeirdHead.spawnPrefab); Utilities.FixMixerGroups(WeirdHead.spawnPrefab); Items.RegisterScrap(WeirdHead, 0, (LevelTypes)(-1)); mls.LogMessage((object)"SilasMeyer.EnemyLoot has loaded succesfully."); harmony.PatchAll(typeof(Shop)); harmony.PatchAll(typeof(EnemyLoot)); harmony.PatchAll(typeof(MaskedDrop)); harmony.PatchAll(typeof(SpiderDrop)); harmony.PatchAll(typeof(HoarderBugDrop)); harmony.PatchAll(typeof(SnareFleaDrop)); harmony.PatchAll(typeof(BrakenDrop)); harmony.PatchAll(typeof(ThumperDrop)); harmony.PatchAll(typeof(SpoonDamagePatch)); harmony.PatchAll(typeof(ButlerDrop)); harmony.PatchAll(typeof(OrangeOrbSprintMeterPatch)); harmony.PatchAll(typeof(WeirdHeadSoundPatch)); harmony.PatchAll(typeof(ManeaterDrop)); harmony.PatchAll(typeof(PlayerTargetablePatch)); } } public class MyConfig { public readonly ConfigEntry<float> DebugLevel; public readonly ConfigEntry<bool> areItemsInShop; public readonly ConfigEntry<bool> SpiderDropSpiderEgg; public readonly ConfigEntry<bool> MaskedDropMask; public readonly ConfigEntry<bool> HoarderDropGuiltyGear; public readonly ConfigEntry<bool> BrackenDropBlackOrb; public readonly ConfigEntry<bool> SnareFleaDropWhiteOrb; public readonly ConfigEntry<bool> ThumperDropOrangeOrb; public readonly ConfigEntry<bool> ButlerDropSpoon; public readonly ConfigEntry<int> GuiltyGearSpawnRate; public MyConfig(ConfigFile cfg) { cfg.SaveOnConfigSet = false; areItemsInShop = cfg.Bind<bool>("1. General", "Activate Items in shop", false, "Adds the new items to the shop"); SpiderDropSpiderEgg = cfg.Bind<bool>("2. Drops", "Drop Spider Egg", true, "Spider drops egg on death"); MaskedDropMask = cfg.Bind<bool>("2. Drops", "Drop Mask", true, "Masked drops mask on death"); HoarderDropGuiltyGear = cfg.Bind<bool>("2. Drops", "Drop Guilty Gear Case", true, "Hoarder Bug can drop Guilty Gear Strive Case"); BrackenDropBlackOrb = cfg.Bind<bool>("2. Drops", "Drop Black Orb", true, "Braken can drop Black Orb"); SnareFleaDropWhiteOrb = cfg.Bind<bool>("2. Drops", "Drop White Orb", true, "Snare Flea can drop White Orb"); ThumperDropOrangeOrb = cfg.Bind<bool>("2. Drops", "Drop Orange Orb", true, "Thumper can drop Orange Orb"); ButlerDropSpoon = cfg.Bind<bool>("2. Drops", "Drop Spoon", true, "Butler can drop a spoon"); GuiltyGearSpawnRate = cfg.Bind<int>("3. Spawnrates", "Guilty Gear Spawnrate", 60, "Spawnrate in percent of the Guilty Gear drop when killing a Hoarder Bug. Enter a number from 0-100."); ClearOrphanedEntries(cfg); cfg.Save(); cfg.SaveOnConfigSet = true; } private static void ClearOrphanedEntries(ConfigFile cfg) { ((Dictionary<ConfigDefinition, string>)AccessTools.Property(typeof(ConfigFile), "OrphanedEntries").GetValue(cfg)).Clear(); } } } namespace EnemyLoot.Patches { [HarmonyPatch(typeof(ButlerEnemyAI))] internal class ButlerDrop { [HarmonyPatch("KillEnemy")] [HarmonyPostfix] private static void Patch(ButlerEnemyAI __instance) { //IL_0043: 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_005c: Unknown result type (might be due to invalid IL or missing references) //IL_0061: 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) //IL_00c1: Unknown result type (might be due to invalid IL or missing references) if (EnemyLoot.Config.ButlerDropSpoon.Value && NetworkManager.Singleton.IsServer) { EnemyLoot.Instance.mls.LogMessage((object)"Creating Spoon"); GameObject val = Object.Instantiate<GameObject>(EnemyLoot.Spoon.spawnPrefab, ((Component)__instance).transform.position + new Vector3(0f, 3f, 0f), Quaternion.identity); val.GetComponentInChildren<GrabbableObject>().fallTime = 0f; int scrapValue = new Random().Next(333, 444); val.GetComponentInChildren<GrabbableObject>().SetScrapValue(scrapValue); val.GetComponentInChildren<NetworkObject>().Spawn(false); RoundManager.Instance.SyncScrapValuesClientRpc((NetworkObjectReference[])(object)new NetworkObjectReference[1] { NetworkObjectReference.op_Implicit(val.GetComponent<NetworkObject>()) }, new int[1] { val.GetComponent<GrabbableObject>().scrapValue }); EnemyLoot.Instance.mls.LogMessage((object)"Spoon was created"); } } } [HarmonyPatch(typeof(MouthDogAI))] internal class EyelessDogDrop { [HarmonyPatch("KillEnemy")] [HarmonyPostfix] private static void Patch(MouthDogAI __instance) { //IL_0043: 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_005c: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_00ad: Unknown result type (might be due to invalid IL or missing references) //IL_00b2: Unknown result type (might be due to invalid IL or missing references) if (EnemyLoot.Config.SpiderDropSpiderEgg.Value && NetworkManager.Singleton.IsServer) { EnemyLoot.Instance.mls.LogMessage((object)"Try spawning eye"); GameObject val = Object.Instantiate<GameObject>(EnemyLoot.spiderEgg.spawnPrefab, ((Component)__instance).transform.position + new Vector3(0f, 3f, 0f), Quaternion.identity); val.GetComponentInChildren<GrabbableObject>().fallTime = 0f; int scrapValue = 666; val.GetComponentInChildren<GrabbableObject>().SetScrapValue(scrapValue); val.GetComponentInChildren<NetworkObject>().Spawn(false); RoundManager.Instance.SyncScrapValuesClientRpc((NetworkObjectReference[])(object)new NetworkObjectReference[1] { NetworkObjectReference.op_Implicit(val.GetComponent<NetworkObject>()) }, new int[1] { val.GetComponent<GrabbableObject>().scrapValue }); EnemyLoot.Instance.mls.LogMessage((object)"Eye was spawned"); } } } [HarmonyPatch(typeof(CaveDwellerAI))] internal class ManeaterDrop { [HarmonyPatch("KillEnemy")] [HarmonyPostfix] private static void Patch(CaveDwellerAI __instance) { //IL_0031: 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) //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_00aa: 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) if (NetworkManager.Singleton.IsServer) { EnemyLoot.Instance.mls.LogMessage((object)"Creating Weird Head"); GameObject val = Object.Instantiate<GameObject>(EnemyLoot.WeirdHead.spawnPrefab, ((Component)__instance).transform.position + new Vector3(0f, 3f, 0f), Quaternion.identity); val.GetComponentInChildren<GrabbableObject>().fallTime = 0f; int scrapValue = new Random().Next(400, 700); val.GetComponentInChildren<GrabbableObject>().SetScrapValue(scrapValue); val.GetComponentInChildren<NetworkObject>().Spawn(false); RoundManager.Instance.SyncScrapValuesClientRpc((NetworkObjectReference[])(object)new NetworkObjectReference[1] { NetworkObjectReference.op_Implicit(val.GetComponent<NetworkObject>()) }, new int[1] { val.GetComponent<GrabbableObject>().scrapValue }); EnemyLoot.Instance.mls.LogMessage((object)"Weird Head was created"); } } } [HarmonyPatch(typeof(FlowerSnakeEnemy))] internal class SnakeDrop { [HarmonyPatch("KillEnemy")] [HarmonyPostfix] private static void Patch(FlowerSnakeEnemy __instance) { //IL_0031: 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) //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_00a4: Unknown result type (might be due to invalid IL or missing references) //IL_00a9: Unknown result type (might be due to invalid IL or missing references) if (NetworkManager.Singleton.IsServer) { EnemyLoot.Instance.mls.LogMessage((object)"Try spawning SnakeEgg"); GameObject val = Object.Instantiate<GameObject>(EnemyLoot.SnakeEgg.spawnPrefab, ((Component)__instance).transform.position + new Vector3(0f, 3f, 0f), Quaternion.identity); val.GetComponentInChildren<GrabbableObject>().fallTime = 0f; int scrapValue = new Random().Next(10, 15); val.GetComponentInChildren<GrabbableObject>().SetScrapValue(scrapValue); val.GetComponentInChildren<NetworkObject>().Spawn(false); RoundManager.Instance.SyncScrapValuesClientRpc((NetworkObjectReference[])(object)new NetworkObjectReference[1] { NetworkObjectReference.op_Implicit(val.GetComponent<NetworkObject>()) }, new int[1] { val.GetComponent<GrabbableObject>().scrapValue }); EnemyLoot.Instance.mls.LogMessage((object)"SnakeEgg was spawned"); } } } [HarmonyPatch(typeof(FlowermanAI))] internal class BrakenDrop { [HarmonyPatch("KillEnemy")] [HarmonyPostfix] private static void Patch(FlowermanAI __instance) { //IL_0043: 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_005c: Unknown result type (might be due to invalid IL or missing references) //IL_0061: 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) //IL_00c1: Unknown result type (might be due to invalid IL or missing references) if (EnemyLoot.Config.BrackenDropBlackOrb.Value && NetworkManager.Singleton.IsServer) { EnemyLoot.Instance.mls.LogMessage((object)"Creating Black Orb"); GameObject val = Object.Instantiate<GameObject>(EnemyLoot.blackOrb.spawnPrefab, ((Component)__instance).transform.position + new Vector3(0f, 3f, 0f), Quaternion.identity); val.GetComponentInChildren<GrabbableObject>().fallTime = 0f; int scrapValue = new Random().Next(350, 400); val.GetComponentInChildren<GrabbableObject>().SetScrapValue(scrapValue); val.GetComponentInChildren<NetworkObject>().Spawn(false); RoundManager.Instance.SyncScrapValuesClientRpc((NetworkObjectReference[])(object)new NetworkObjectReference[1] { NetworkObjectReference.op_Implicit(val.GetComponent<NetworkObject>()) }, new int[1] { val.GetComponent<GrabbableObject>().scrapValue }); AudioSource component = val.GetComponent<AudioSource>(); component.clip = EnemyLoot.blackOrbSpawnSFX; component.Play(); EnemyLoot.Instance.mls.LogMessage((object)"Black Orb was created"); } } } [HarmonyPatch(typeof(BaboonBirdAI))] internal class HawkDrop { [HarmonyPatch("KillEnemy")] [HarmonyPostfix] private static void Patch(BaboonBirdAI __instance) { //IL_0043: 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_005c: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) //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) if (EnemyLoot.Config.ThumperDropOrangeOrb.Value && NetworkManager.Singleton.IsServer) { EnemyLoot.Instance.mls.LogMessage((object)"Creating feather"); GameObject val = Object.Instantiate<GameObject>(EnemyLoot.orangeOrb.spawnPrefab, ((Component)__instance).transform.position + new Vector3(0f, 3f, 0f), Quaternion.identity); val.GetComponentInChildren<GrabbableObject>().fallTime = 0f; int scrapValue = new Random().Next(90, 120); val.GetComponentInChildren<GrabbableObject>().SetScrapValue(scrapValue); val.GetComponentInChildren<NetworkObject>().Spawn(false); RoundManager.Instance.SyncScrapValuesClientRpc((NetworkObjectReference[])(object)new NetworkObjectReference[1] { NetworkObjectReference.op_Implicit(val.GetComponent<NetworkObject>()) }, new int[1] { val.GetComponent<GrabbableObject>().scrapValue }); EnemyLoot.Instance.mls.LogMessage((object)"feather was created"); } } } [HarmonyPatch(typeof(HoarderBugAI))] internal class HoarderBugDrop { [HarmonyPatch("KillEnemy")] [HarmonyPostfix] private static void Patch(HoarderBugAI __instance) { //IL_0064: Unknown result type (might be due to invalid IL or missing references) //IL_0078: 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_0082: Unknown result type (might be due to invalid IL or missing references) //IL_00d7: Unknown result type (might be due to invalid IL or missing references) //IL_00dc: Unknown result type (might be due to invalid IL or missing references) if (EnemyLoot.Config.HoarderDropGuiltyGear.Value && NetworkManager.Singleton.IsServer && new Random().Next(1, 101) <= EnemyLoot.Config.GuiltyGearSpawnRate.Value) { EnemyLoot.Instance.mls.LogMessage((object)"Try spawning Guilty Gear Case"); GameObject val = Object.Instantiate<GameObject>(EnemyLoot.guiltyGearCase.spawnPrefab, ((Component)__instance).transform.position + new Vector3(0f, 3f, 0f), Quaternion.identity); val.GetComponentInChildren<GrabbableObject>().fallTime = 0f; int scrapValue = new Random().Next(50, 90); val.GetComponentInChildren<GrabbableObject>().SetScrapValue(scrapValue); val.GetComponentInChildren<NetworkObject>().Spawn(false); RoundManager.Instance.SyncScrapValuesClientRpc((NetworkObjectReference[])(object)new NetworkObjectReference[1] { NetworkObjectReference.op_Implicit(val.GetComponent<NetworkObject>()) }, new int[1] { val.GetComponent<GrabbableObject>().scrapValue }); EnemyLoot.Instance.mls.LogMessage((object)"Guilty Gear Case was spawned"); } } } [HarmonyPatch(typeof(MaskedPlayerEnemy))] internal class MaskedDrop { private static Item _mask; [HarmonyPatch("KillEnemy")] [HarmonyPostfix] private static void Patch(MaskedPlayerEnemy __instance) { //IL_0043: 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_005c: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) //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) if (NetworkManager.Singleton.IsServer && !EnemyLoot.Config.MaskedDropMask.Value) { EnemyLoot.Instance.mls.LogMessage((object)"Try getting Mask"); GameObject val = Object.Instantiate<GameObject>(GetMask().spawnPrefab, ((Component)__instance).transform.position + new Vector3(0f, 3f, 0f), Quaternion.identity); val.GetComponentInChildren<GrabbableObject>().fallTime = 0f; int scrapValue = new Random().Next(40, 60); val.GetComponentInChildren<GrabbableObject>().SetScrapValue(scrapValue); val.GetComponentInChildren<NetworkObject>().Spawn(false); RoundManager.Instance.SyncScrapValuesClientRpc((NetworkObjectReference[])(object)new NetworkObjectReference[1] { NetworkObjectReference.op_Implicit(val.GetComponent<NetworkObject>()) }, new int[1] { val.GetComponent<GrabbableObject>().scrapValue }); EnemyLoot.Instance.mls.LogMessage((object)"Mask was spawned"); } } private static Item GetMask() { if ((Object)(object)_mask == (Object)null) { _mask = StartOfRound.Instance.allItemsList.itemsList.First((Item m) => ((Object)m).name == "ComedyMask"); } EnemyLoot.Instance.mls.LogMessage((object)(((object)_mask)?.ToString() + ": Found Mask")); return _mask; } } [HarmonyPatch(typeof(CentipedeAI))] internal class SnareFleaDrop { [HarmonyPatch("KillEnemy")] [HarmonyPostfix] private static void Patch(CentipedeAI __instance) { //IL_0043: 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_005c: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) //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) if (EnemyLoot.Config.SnareFleaDropWhiteOrb.Value && NetworkManager.Singleton.IsServer) { EnemyLoot.Instance.mls.LogMessage((object)"Creating White Orb"); GameObject val = Object.Instantiate<GameObject>(EnemyLoot.whiteOrb.spawnPrefab, ((Component)__instance).transform.position + new Vector3(0f, 3f, 0f), Quaternion.identity); val.GetComponentInChildren<GrabbableObject>().fallTime = 0f; int scrapValue = new Random().Next(30, 50); val.GetComponentInChildren<GrabbableObject>().SetScrapValue(scrapValue); val.GetComponentInChildren<NetworkObject>().Spawn(false); RoundManager.Instance.SyncScrapValuesClientRpc((NetworkObjectReference[])(object)new NetworkObjectReference[1] { NetworkObjectReference.op_Implicit(val.GetComponent<NetworkObject>()) }, new int[1] { val.GetComponent<GrabbableObject>().scrapValue }); EnemyLoot.Instance.mls.LogMessage((object)"White Orb was created"); } } } [HarmonyPatch(typeof(SandSpiderAI))] internal class SpiderDrop { [HarmonyPatch("KillEnemy")] [HarmonyPostfix] private static void Patch(SandSpiderAI __instance) { //IL_0043: 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_005c: Unknown result type (might be due to invalid IL or missing references) //IL_0061: 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) //IL_00c1: Unknown result type (might be due to invalid IL or missing references) if (EnemyLoot.Config.SpiderDropSpiderEgg.Value && NetworkManager.Singleton.IsServer) { EnemyLoot.Instance.mls.LogMessage((object)"Try spawning egg"); GameObject val = Object.Instantiate<GameObject>(EnemyLoot.spiderEgg.spawnPrefab, ((Component)__instance).transform.position + new Vector3(0f, 3f, 0f), Quaternion.identity); val.GetComponentInChildren<GrabbableObject>().fallTime = 0f; int scrapValue = new Random().Next(300, 350); val.GetComponentInChildren<GrabbableObject>().SetScrapValue(scrapValue); val.GetComponentInChildren<NetworkObject>().Spawn(false); RoundManager.Instance.SyncScrapValuesClientRpc((NetworkObjectReference[])(object)new NetworkObjectReference[1] { NetworkObjectReference.op_Implicit(val.GetComponent<NetworkObject>()) }, new int[1] { val.GetComponent<GrabbableObject>().scrapValue }); EnemyLoot.Instance.mls.LogMessage((object)"Egg was spawned"); } } } [HarmonyPatch(typeof(CrawlerAI))] internal class ThumperDrop { [HarmonyPatch("KillEnemy")] [HarmonyPostfix] private static void Patch(CrawlerAI __instance) { //IL_0043: 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_005c: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) //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) if (EnemyLoot.Config.ThumperDropOrangeOrb.Value && NetworkManager.Singleton.IsServer) { EnemyLoot.Instance.mls.LogMessage((object)"Creating Orange Orb"); GameObject val = Object.Instantiate<GameObject>(EnemyLoot.orangeOrb.spawnPrefab, ((Component)__instance).transform.position + new Vector3(0f, 3f, 0f), Quaternion.identity); val.GetComponentInChildren<GrabbableObject>().fallTime = 0f; int scrapValue = new Random().Next(90, 120); val.GetComponentInChildren<GrabbableObject>().SetScrapValue(scrapValue); val.GetComponentInChildren<NetworkObject>().Spawn(false); RoundManager.Instance.SyncScrapValuesClientRpc((NetworkObjectReference[])(object)new NetworkObjectReference[1] { NetworkObjectReference.op_Implicit(val.GetComponent<NetworkObject>()) }, new int[1] { val.GetComponent<GrabbableObject>().scrapValue }); EnemyLoot.Instance.mls.LogMessage((object)"Orange Orb was created"); } } } } namespace EnemyLoot.Behaviours { internal class BlackOrbBehaviour : PhysicsProp { private int activationCounter; private bool _isTimerRunning; private AudioSource audioSource; private PlayerControllerB player; private Vector3 playerShipTeleportPosition; private Vector3 playerOrbTeleportPosition; internal EntranceTeleport[] EntranceArray; private bool _wasInsideBeforeTeleport; private bool _isSavedTeleportPositionInside; private int EntranceIndex; private const int ExitIndex = 0; public override void ItemActivate(bool used, bool buttonDown = true) { //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Unknown result type (might be due to invalid IL or missing references) player = ((GrabbableObject)this).playerHeldBy; playerShipTeleportPosition = StartOfRound.Instance.playerSpawnPositions[0].position; EntranceArray = Object.FindObjectsOfType<EntranceTeleport>(false); EntranceIndex = EntranceArray.Length / 2; ((GrabbableObject)this).ItemActivate(used, buttonDown); if (buttonDown) { if (!_isTimerRunning) { activationCounter++; ((MonoBehaviour)this).StartCoroutine(orbTeleport()); } else { audioSource = ((Component)this).gameObject.GetComponent<AudioSource>(); audioSource.clip = EnemyLoot.blackOrbCDSFX; audioSource.Play(); } } } public override void SetControlTipsForItem() { string[] array = new string[2] { "Drop Black Orb : [G]", "Activate Black Orb : [LMB]" }; if (_isTimerRunning) { array[1] = "Black Orb on cooldown"; } HUDManager.Instance.ChangeControlTipMultiple(array, false, (Item)null); } private IEnumerator orbTeleport() { _isTimerRunning = true; audioSource = ((Component)this).gameObject.GetComponent<AudioSource>(); audioSource.clip = EnemyLoot.blackOrbTeleportSFX; audioSource.Play(); yield return (object)new WaitForSeconds(4.5f); _wasInsideBeforeTeleport = player.isInsideFactory; if (activationCounter == 1) { playerOrbTeleportPosition = ((Component)player).transform.position; _isSavedTeleportPositionInside = _wasInsideBeforeTeleport; if (_wasInsideBeforeTeleport) { EntranceArray[0].TeleportPlayer(); } player.TeleportPlayer(playerShipTeleportPosition, false, 0f, false, true); } else { if (_wasInsideBeforeTeleport && !_isSavedTeleportPositionInside) { EntranceArray[0].TeleportPlayer(); } else if (!_wasInsideBeforeTeleport && _isSavedTeleportPositionInside) { EntranceArray[EntranceIndex].TeleportPlayer(); } player.TeleportPlayer(playerOrbTeleportPosition, false, 0f, false, true); ((GrabbableObject)this).SetControlTipsForItem(); yield return (object)new WaitForSeconds(60f); activationCounter = 0; } _isTimerRunning = false; } } internal class WeirdHeadBehaviour : PhysicsProp { private int activationCounter; private bool _isTimerRunning; private AudioSource _audioSource; private PlayerControllerB _player; public Vector3 EnemyPosition; public Vector3 PlayerPosition; private static List<EnemyAI> _enemyList = new List<EnemyAI>(); public EnemyAI Enemy; internal EntranceTeleport[] EntranceArray; private bool _wasInsideBeforeTeleport; private static Dictionary<int, AudioSource> _audioSourceMap = new Dictionary<int, AudioSource>(); private static Random random = new Random(); private int _searchCounter; public override void ItemActivate(bool used, bool buttonDown = true) { //IL_0137: Unknown result type (might be due to invalid IL or missing references) //IL_013c: Unknown result type (might be due to invalid IL or missing references) //IL_014d: Unknown result type (might be due to invalid IL or missing references) //IL_0152: Unknown result type (might be due to invalid IL or missing references) _player = ((GrabbableObject)this).playerHeldBy; EntranceArray = Object.FindObjectsOfType<EntranceTeleport>(false); ((GrabbableObject)this).ItemActivate(used, buttonDown); if (!buttonDown) { return; } _enemyList = RoundManager.Instance.SpawnedEnemies; _searchCounter = 0; do { if (_enemyList == null || _enemyList.Count == 0) { EnemyLoot.Instance.mls.LogMessage((object)"No enemy exists"); return; } int index = random.Next(_enemyList.Count); Enemy = _enemyList[index]; EnemyLoot.Instance.mls.LogMessage((object)("Found: " + ((object)Enemy).GetType().Name + " | SearchCounter: " + _searchCounter)); } while (!IsEnemyTypeValid(Enemy) && _searchCounter < 5); if (_searchCounter >= 5) { EnemyLoot.Instance.mls.LogMessage((object)"Tried finding valid enemy - failed"); return; } if ((Object)(object)Enemy == (Object)null) { _audioSource = ((Component)this).gameObject.GetComponent<AudioSource>(); _audioSource.clip = EnemyLoot.WeirdHeadNoEnemySFX; return; } EnemyPosition = ((Component)Enemy).transform.position; PlayerPosition = ((Component)_player).transform.position; if (!_isTimerRunning) { activationCounter++; ((MonoBehaviour)this).StartCoroutine(orbTeleport()); return; } _audioSource = ((Component)this).gameObject.GetComponent<AudioSource>(); int index2 = new Random().Next(EnemyLoot.WeirdHeadWhistles.Count); _audioSource.clip = EnemyLoot.WeirdHeadWhistles[index2]; _audioSource.Play(); } private bool IsEnemyTypeValid(EnemyAI _enemy) { _searchCounter++; switch (((object)_enemy).GetType().Name) { case "DoublewingAI": case "RedLocustBees": case "ButlerBeesEnemyAI": case "DocileLocustBeesAI": case "SandWormAI": case "DressGirlAI": case "FlowerSnakeEnemy": return false; default: return true; } } private IEnumerator orbTeleport() { _isTimerRunning = true; _audioSource = ((Component)this).gameObject.GetComponent<AudioSource>(); _audioSource.clip = EnemyLoot.WeirdHeadTeleportSFX; _audioSource.Play(); _wasInsideBeforeTeleport = _player.isInsideFactory; SpawnableEnemyWithRarity _enemyToSpawn = null; bool _IsOutsideEnemy = false; ((GrabbableObject)this).SetControlTipsForItem(); yield return (object)new WaitForSeconds(0.5f); if (_wasInsideBeforeTeleport && Enemy.isOutside) { EntranceArray[0].TeleportPlayer(); } else if (!_wasInsideBeforeTeleport && !Enemy.isOutside) { EntranceArray[EntranceArray.Length / 2].TeleportPlayer(); } _player.TeleportPlayer(EnemyPosition, false, 0f, false, true); RoundManager.Instance.DespawnEnemyOnServer(((NetworkBehaviour)Enemy).NetworkObject); if (!Enemy.enemyType.isOutsideEnemy) { foreach (SpawnableEnemyWithRarity enemy in RoundManager.Instance.currentLevel.Enemies) { EnemyLoot.Instance.mls.LogMessage((object)("Index of: " + ((Object)enemy.enemyType).name + " | " + RoundManager.Instance.currentLevel.Enemies.IndexOf(enemy))); if ((Object)(object)enemy.enemyType == (Object)(object)Enemy.enemyType) { _enemyToSpawn = enemy; break; } } } else { foreach (SpawnableEnemyWithRarity outsideEnemy in RoundManager.Instance.currentLevel.OutsideEnemies) { EnemyLoot.Instance.mls.LogMessage((object)("Index of: " + ((Object)outsideEnemy.enemyType).name + " | " + RoundManager.Instance.currentLevel.Enemies.IndexOf(outsideEnemy))); if ((Object)(object)outsideEnemy.enemyType == (Object)(object)Enemy.enemyType) { _enemyToSpawn = outsideEnemy; _IsOutsideEnemy = true; break; } } } if (_enemyToSpawn != null) { if (!_IsOutsideEnemy) { RoundManager.Instance.SpawnEnemyOnServer(PlayerPosition, PlayerPosition.y, RoundManager.Instance.currentLevel.Enemies.IndexOf(_enemyToSpawn)); } EnemyLoot.Instance.mls.LogMessage((object)(Enemy.enemyType.enemyName + "should have been spawned")); EnemyLoot.Instance.mls.LogMessage((object)(((Object)_enemyToSpawn.enemyType).name + " was spawned")); ((GrabbableObject)this).SetControlTipsForItem(); yield return (object)new WaitForSeconds(10f); } else { EnemyLoot.Instance.mls.LogMessage((object)"Wasn't able to spawn Enemy"); } _isTimerRunning = false; ((GrabbableObject)this).SetControlTipsForItem(); } public override void GrabItem() { ((GrabbableObject)this).GrabItem(); WeirdHeadSoundPatch.WasPickedUp = true; EnemyLoot.Instance.mls.LogMessage((object)"Picked Up Head"); _audioSource = ((Component)this).gameObject.GetComponent<AudioSource>(); int instanceID = ((Object)((Component)this).gameObject).GetInstanceID(); _audioSourceMap[instanceID] = _audioSource; } public override void Update() { ((GrabbableObject)this).Update(); } public static AudioSource GetRandomAudioSource() { if (_audioSourceMap.Count == 0) { return null; } Random random = new Random(); return _audioSourceMap.ElementAt(random.Next(0, _audioSourceMap.Count)).Value; } public override void SetControlTipsForItem() { string[] array = new string[2] { "Drop Weird Head : [G]", "Weird Head is sleeping" }; if (_isTimerRunning) { array[1] = "Weird Head on cooldown"; } else if (RoundManager.Instance.SpawnedEnemies.Count > 0) { array[1] = "Activate Weird Head : [LMB]"; } HUDManager.Instance.ChangeControlTipMultiple(array, false, (Item)null); } public override void OnDestroy() { ((NetworkBehaviour)this).OnDestroy(); WeirdHeadSoundPatch.WasPickedUp = false; } public override void DiscardItem() { ((GrabbableObject)this).DiscardItem(); WeirdHeadSoundPatch.WasPickedUp = false; EnemyLoot.Instance.mls.LogMessage((object)"Drop Item"); } } [HarmonyPatch(typeof(SoundManager))] internal class WeirdHeadSoundPatch { public static bool WasPickedUp; public static bool OnCooldown; public static AudioSource AudioSource; public static WeirdHeadBehaviour itemInPatch; [HarmonyPatch("Update")] [HarmonyPostfix] private static void Patch() { if (WasPickedUp && !OnCooldown) { EnemyLoot.Instance.mls.LogMessage((object)"Playing Sound"); ((MonoBehaviour)SoundManager.Instance).StartCoroutine(PlayHeadSound()); } } private static IEnumerator PlayHeadSound() { OnCooldown = true; int minValue = 60; int maxValue = 120; EnemyLoot.Instance.mls.LogMessage((object)"In Sound function"); Random random = new Random(); int counter = random.Next(minValue, maxValue); int index = random.Next(EnemyLoot.WeirdHeadFlutes.Count); NetworkManager _networkManager = NetworkManager.Singleton; yield return (object)new WaitForSeconds((float)(counter / 2)); if (_networkManager.IsServer) { RpcPlaySoundOnServer(EnemyLoot.WeirdHeadFlutes[index]); } else { RpcPlaySoundOnClients(EnemyLoot.WeirdHeadFlutes[index]); } yield return (object)new WaitForSeconds((float)(counter / 2)); OnCooldown = false; } [ClientRpc] private static void RpcPlaySoundOnClients(AudioClip audioClip) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) AudioSource obj = new GameObject("GlobalAudioSource").AddComponent<AudioSource>(); obj.clip = audioClip; obj.spatialBlend = 0f; obj.volume = 1.2f; obj.Play(); Object.Destroy((Object)(object)((Component)obj).gameObject, audioClip.length); } [ServerRpc] public static void RpcPlaySoundOnServer(AudioClip audioClip) { RpcPlaySoundOnClients(audioClip); } } [HarmonyPatch(typeof(EnemyAI))] [HarmonyPatch("PlayerIsTargetable")] internal class PlayerTargetablePatch { private static bool Prefix(ref bool overrideInsideFactoryCheck) { overrideInsideFactoryCheck = true; return true; } } [HarmonyPatch(typeof(EnemyAI))] [HarmonyPatch("PlayerIsTargetable")] internal class PlayerInvinciblePatch { private static bool Prefix(ref bool __result) { __result = false; EnemyLoot.Instance.mls.LogMessage((object)"Player is invicible"); return false; } } internal class SpoonBehaviour : GrabbableObject { private bool _isTimerRunning; private int _activationCounter; private AudioSource _audioSource; private PlayerControllerB _player; private int _healthBefore; private bool _isSpoonActive; private bool _isSpoonBeingHeld; public bool IsSpoonActive { get { return _isSpoonActive; } set { _isSpoonActive = value; } } public bool IsSpoonBeingHeld { get { return _isSpoonBeingHeld; } set { _isSpoonBeingHeld = value; } } public override void ItemActivate(bool used, bool buttonDown = true) { ((GrabbableObject)this).ItemActivate(used, buttonDown); if (buttonDown) { _player = base.playerHeldBy; if (!_isTimerRunning) { _activationCounter++; ((MonoBehaviour)this).StartCoroutine(Activation()); } else { _audioSource = ((Component)this).gameObject.GetComponent<AudioSource>(); _audioSource.clip = EnemyLoot.SpoonCDSFX; _audioSource.Play(); } } } public override void EquipItem() { ((GrabbableObject)this).EquipItem(); _isSpoonBeingHeld = true; if (IsSpoonActive) { _healthBefore = _player.health; _player.health = 100; HUDManager.Instance.UpdateHealthUI(_player.health, false); } } public override void DiscardItem() { ((GrabbableObject)this).DiscardItem(); _isSpoonBeingHeld = false; if (IsSpoonActive) { _player.health = _healthBefore; HUDManager.Instance.UpdateHealthUI(_player.health, false); } } public override void PocketItem() { ((GrabbableObject)this).PocketItem(); _isSpoonBeingHeld = false; if (IsSpoonActive) { _player.health = _healthBefore; HUDManager.Instance.UpdateHealthUI(_player.health, false); } } public override void OnDestroy() { ((NetworkBehaviour)this).OnDestroy(); _isSpoonBeingHeld = false; } public override void SetControlTipsForItem() { EnemyLoot.Instance.mls.LogInfo((object)"Setting Controltips"); string[] array = new string[2] { "Drop Spoon : [G]", "Activate Spoon : [LMB]" }; if (_isSpoonActive) { array[1] = "Spoon is active"; } else if (_isTimerRunning) { array[1] = "Spoon on cooldown"; } HUDManager.Instance.ChangeControlTipMultiple(array, false, (Item)null); } public PlayerControllerB GetHoldingPlayer() { return base.playerHeldBy; } private IEnumerator Activation() { _isTimerRunning = true; _audioSource = ((Component)this).gameObject.GetComponent<AudioSource>(); _audioSource.clip = EnemyLoot.SpoonActivationSFX; _audioSource.Play(); _healthBefore = _player.health; if ((Object)(object)_player != (Object)null) { _isSpoonActive = true; _player.health = 100; HUDManager.Instance.UpdateHealthUI(_player.health, false); ((GrabbableObject)this).SetControlTipsForItem(); } yield return (object)new WaitForSeconds(10f); if ((Object)(object)_player != (Object)null) { _isSpoonActive = false; _player.health = _healthBefore; HUDManager.Instance.UpdateHealthUI(_player.health, false); ((GrabbableObject)this).SetControlTipsForItem(); } yield return (object)new WaitForSeconds(30f); _isTimerRunning = false; ((GrabbableObject)this).SetControlTipsForItem(); } } [HarmonyPatch(typeof(PlayerControllerB))] internal class SpoonDamagePatch { [HarmonyPatch("DamagePlayer")] [HarmonyPostfix] private static void Patch(PlayerControllerB __instance, int damageNumber) { if ((Object)(object)__instance != (Object)null) { GrabbableObject currentlyHeldObjectServer = __instance.currentlyHeldObjectServer; if (currentlyHeldObjectServer != null && (currentlyHeldObjectServer as SpoonBehaviour).IsSpoonActive) { __instance.health += damageNumber; HUDManager.Instance.UpdateHealthUI(__instance.health, false); } } } } internal class GuiltyGearCaseBehaviour : GrabbableObject { private bool isTimerRunning; public override void ItemActivate(bool used, bool buttonDown = true) { ((GrabbableObject)this).ItemActivate(used, buttonDown); if (buttonDown && !isTimerRunning) { ((MonoBehaviour)this).StartCoroutine(play()); } } private IEnumerator play() { isTimerRunning = true; ((Component)this).gameObject.GetComponent<AudioSource>().PlayOneShot(EnemyLoot.guiltyGearSFX); yield return (object)new WaitForSeconds(3.5f); isTimerRunning = false; } public override void SetControlTipsForItem() { string[] array = new string[2] { "Drop Guilty Gear Case : [G]", "Play music : [LMB]" }; HUDManager.Instance.ChangeControlTipMultiple(array, false, (Item)null); } } internal class OrangeOrbBehaviour : PhysicsProp { private bool isTimerRunning; private int activationCounter; private float bonusMovementSpeed; private AudioSource audioSource; private PlayerControllerB player; public override void ItemActivate(bool used, bool buttonDown = true) { ((GrabbableObject)this).ItemActivate(used, buttonDown); if (buttonDown) { player = ((GrabbableObject)this).playerHeldBy; bonusMovementSpeed = player.movementSpeed * 0.5f; if (!isTimerRunning) { activationCounter++; ((MonoBehaviour)this).StartCoroutine(Activation()); } else { audioSource = ((Component)this).gameObject.GetComponent<AudioSource>(); audioSource.clip = EnemyLoot.orangeOrbCDSFX; audioSource.Play(); } } } public override void SetControlTipsForItem() { string[] array = new string[2] { "Drop Orange Orb : [G]", "Activate Orange Orb : [LMB]" }; if (OrangeOrbSprintMeterPatch.IsOrangeOrbActive) { array[1] = "Orange Orb is active"; } else if (isTimerRunning) { array[1] = "Orange on cooldown"; } HUDManager.Instance.ChangeControlTipMultiple(array, false, (Item)null); } private IEnumerator Activation() { isTimerRunning = true; audioSource = ((Component)this).gameObject.GetComponent<AudioSource>(); audioSource.clip = EnemyLoot.orangeOrbActivationSFX; audioSource.Play(); if ((Object)(object)player != (Object)null) { PlayerControllerB obj = player; obj.movementSpeed += bonusMovementSpeed; player.sprintMeter = 1f; OrangeOrbSprintMeterPatch.IsOrangeOrbActive = true; } ((GrabbableObject)this).SetControlTipsForItem(); yield return (object)new WaitForSeconds(15f); if ((Object)(object)player != (Object)null) { PlayerControllerB obj2 = player; obj2.movementSpeed -= bonusMovementSpeed; OrangeOrbSprintMeterPatch.IsOrangeOrbActive = false; } ((GrabbableObject)this).SetControlTipsForItem(); yield return (object)new WaitForSeconds(45f); isTimerRunning = false; } } [HarmonyPatch(typeof(PlayerControllerB))] internal class OrangeOrbSprintMeterPatch { public static bool IsOrangeOrbActive; [HarmonyPatch("Update")] [HarmonyPostfix] private static void infinite_Sprint_Patch(ref float ___sprintMeter) { if (IsOrangeOrbActive) { ___sprintMeter = 1f; } } } internal class WhiteOrbBehaviour : GrabbableObject { private bool isTimerRunning; private int activationCounter; private AudioSource audioSource; private PlayerControllerB player; private int healAmount = 30; public override void ItemActivate(bool used, bool buttonDown = true) { ((GrabbableObject)this).ItemActivate(used, buttonDown); if (!buttonDown) { return; } player = base.playerHeldBy; if (activationCounter >= 2) { audioSource = ((Component)this).gameObject.GetComponent<AudioSource>(); audioSource.clip = EnemyLoot.whiteOrbDestroySFX; audioSource.Play(); ((GrabbableObject)this).DestroyObjectInHand(base.playerHeldBy); } else if (!isTimerRunning) { if (player.health < 100) { activationCounter++; ((MonoBehaviour)this).StartCoroutine(heal()); } else { CoolDown(); } } else { CoolDown(); } } private void CoolDown() { audioSource = ((Component)this).gameObject.GetComponent<AudioSource>(); audioSource.clip = EnemyLoot.whiteOrbCDSFX; audioSource.Play(); } public override void SetControlTipsForItem() { string[] array = new string[2] { "Drop White Orb : [G]", "Activate White Orb : [LMB]" }; HUDManager.Instance.ChangeControlTipMultiple(array, false, (Item)null); } private IEnumerator heal() { isTimerRunning = true; audioSource = ((Component)this).gameObject.GetComponent<AudioSource>(); audioSource.clip = EnemyLoot.whiteOrbActivationSFX; audioSource.Play(); yield return (object)new WaitForSeconds(2.2f); if ((Object)(object)player != (Object)null) { if (player.health + healAmount > 100) { player.health = 100; } else { PlayerControllerB obj = player; obj.health += healAmount; } HUDManager.Instance.UpdateHealthUI(player.health, false); } yield return (object)new WaitForSeconds(2.8f); if (activationCounter >= 2) { audioSource = ((Component)this).gameObject.GetComponent<AudioSource>(); audioSource.clip = EnemyLoot.whiteOrbDestroySFX; audioSource.Play(); yield return (object)new WaitForSeconds(4.2f); ((GrabbableObject)this).DestroyObjectInHand(base.playerHeldBy); } isTimerRunning = false; } } }