using 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, 50);
}
}
}
[BepInPlugin("SilasMeyer.EnemyLoot", "EnemyLoot", "0.3.2")]
public class EnemyLoot : BaseUnityPlugin
{
public const string modGUID = "SilasMeyer.EnemyLoot";
public const string modName = "EnemyLoot";
public const string modVersion = "0.3.2";
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_017f: Unknown result type (might be due to invalid IL or missing references)
//IL_0184: Unknown result type (might be due to invalid IL or missing references)
//IL_019d: Unknown result type (might be due to invalid IL or missing references)
//IL_01a2: Unknown result type (might be due to invalid IL or missing references)
//IL_025c: Unknown result type (might be due to invalid IL or missing references)
//IL_0261: Unknown result type (might be due to invalid IL or missing references)
//IL_027a: Unknown result type (might be due to invalid IL or missing references)
//IL_027f: Unknown result type (might be due to invalid IL or missing references)
//IL_0339: Unknown result type (might be due to invalid IL or missing references)
//IL_033e: Unknown result type (might be due to invalid IL or missing references)
//IL_0357: Unknown result type (might be due to invalid IL or missing references)
//IL_035c: Unknown result type (might be due to invalid IL or missing references)
//IL_0402: Unknown result type (might be due to invalid IL or missing references)
//IL_0407: Unknown result type (might be due to invalid IL or missing references)
//IL_0420: Unknown result type (might be due to invalid IL or missing references)
//IL_0425: Unknown result type (might be due to invalid IL or missing references)
//IL_04dd: Unknown result type (might be due to invalid IL or missing references)
//IL_04e2: Unknown result type (might be due to invalid IL or missing references)
//IL_04fb: Unknown result type (might be due to invalid IL or missing references)
//IL_0500: Unknown result type (might be due to invalid IL or missing references)
//IL_06a5: Unknown result type (might be due to invalid IL or missing references)
//IL_06aa: Unknown result type (might be due to invalid IL or missing references)
//IL_06c3: Unknown result type (might be due to invalid IL or missing references)
//IL_06c8: 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);
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(SpoonPatch));
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;
public bool _isHoldingSpoon;
public override void ItemActivate(bool used, bool buttonDown = true)
{
((GrabbableObject)this).ItemActivate(used, buttonDown);
if (buttonDown)
{
_player = base.playerHeldBy;
SpoonPatch.IsPlayerHoldingSpoon = true;
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();
SpoonPatch.IsPlayerHoldingSpoon = true;
if (SpoonPatch.IsSpoonActive)
{
_healthBefore = _player.health;
_player.health = 100;
HUDManager.Instance.UpdateHealthUI(_player.health, false);
}
}
public override void SetControlTipsForItem()
{
string[] array = new string[2] { "Drop Spoon : [G]", "Activate Spoon : [LMB]" };
if (SpoonPatch.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)
{
SpoonPatch.IsSpoonActive = true;
SpoonPatch.Player = _player;
SpoonPatch.IsPlayerHoldingSpoon = true;
_player.health = 100;
((GrabbableObject)EnemyLoot.ScriptSpoon).itemProperties.itemIcon = EnemyLoot.IconActive;
((GrabbableObject)this).SetControlTipsForItem();
}
yield return (object)new WaitForSeconds(10f);
if ((Object)(object)_player != (Object)null)
{
SpoonPatch.IsSpoonActive = false;
SpoonPatch.Player = null;
_player.health = _healthBefore;
HUDManager.Instance.UpdateHealthUI(_player.health, false);
((GrabbableObject)EnemyLoot.ScriptSpoon).itemProperties.itemIcon = EnemyLoot.IconCD;
((GrabbableObject)this).SetControlTipsForItem();
}
yield return (object)new WaitForSeconds(30f);
_isTimerRunning = false;
((GrabbableObject)this).SetControlTipsForItem();
((GrabbableObject)EnemyLoot.ScriptSpoon).itemProperties.itemIcon = EnemyLoot.IconBase;
}
}
[HarmonyPatch(typeof(PlayerControllerB))]
internal class SpoonPatch
{
public static bool IsSpoonActive;
public static PlayerControllerB Player;
public static bool IsPlayerHoldingSpoon;
[HarmonyPatch("DamagePlayer")]
[HarmonyPostfix]
private static void Patch(int damageNumber)
{
if (IsSpoonActive && IsPlayerHoldingSpoon && (Object)(object)Player != (Object)null)
{
PlayerControllerB player = Player;
player.health += damageNumber;
HUDManager.Instance.UpdateHealthUI(Player.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;
}
}
}