Decompiled source of Lacrimosum v1.4.1

BepInEx\Plugins\Lacrimosum.dll

Decompiled 3 months ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Resources;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using CSync.Extensions;
using CSync.Lib;
using GameNetcodeStuff;
using Lacrimosum.Assets;
using Lacrimosum.Helpers;
using Lacrimosum.ItemScripts;
using Lacrimosum.NetcodePatcher;
using Lacrimosum.Patching;
using LethalLib.Modules;
using Microsoft.CodeAnalysis;
using On;
using On.GameNetcodeStuff;
using TMPro;
using Unity.Netcode;
using UnityEngine;
using UnityEngine.Serialization;
using UnityEngine.UI;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: IgnoresAccessChecksTo("MMHOOK_Assembly-CSharp")]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("FragileDeviations")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.4.1.0")]
[assembly: AssemblyInformationalVersion("1.0.0+0c7a440b4cf25d0f23be4674045cdbd96c3a57bf")]
[assembly: AssemblyProduct("Lacrimosum")]
[assembly: AssemblyTitle("Lacrimosum")]
[assembly: NeutralResourcesLanguage("en-US")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.4.1.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
[module: NetcodePatchedAssembly]
internal class <Module>
{
	static <Module>()
	{
	}
}
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace Lacrimosum
{
	[BepInPlugin("fragiledeviations.lacrimosum", "Lacrimosum", "1.4.1")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency("com.sigurd.csync", "5.0.1")]
	internal class RoR2Plugin : BaseUnityPlugin
	{
		private const string PluginName = "Lacrimosum";

		private const string PluginVersion = "1.4.1";

		internal const string PluginGuid = "fragiledeviations.lacrimosum";

		internal static readonly string AssemblyLocation = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);

		internal static ManualLogSource ModConsole;

		internal static LacrimosumConfig ModConfig;

		private void Awake()
		{
			ModConsole = ((BaseUnityPlugin)this).Logger;
			ModConsole.LogInfo((object)"Loading fragiledeviations.lacrimosum...");
			ModConfig = new LacrimosumConfig(((BaseUnityPlugin)this).Config);
			ModConsole.LogInfo((object)"Config loaded for fragiledeviations.lacrimosum");
			NetcodePatcher();
			ModConsole.LogInfo((object)"Netcode patched for fragiledeviations.lacrimosum");
			ModAssets.Load();
			ModConsole.LogInfo((object)"Assets loaded for fragiledeviations.lacrimosum");
			PlayerEventTracker.Init();
			ModConsole.LogInfo((object)"PlayerEventTracker loaded");
			NetworkPrefabsHelper.Init();
			ModConsole.LogInfo((object)"NetworkPrefabsHelper loaded");
			MenuMusicReplacer.Init();
			ModConsole.LogInfo((object)"MenuMusicReplacer loaded");
			MineReplacement.Init();
			ModConsole.LogInfo((object)"MineReplacement loaded");
			ElevatorMusicReplacer.Init();
			ModConsole.LogInfo((object)"ElevatorMusicReplacer loaded");
			ModConsole.LogInfo((object)"Loaded fragiledeviations.lacrimosum!");
		}

		private static void NetcodePatcher()
		{
			Type[] types = Assembly.GetExecutingAssembly().GetTypes();
			for (int i = 0; i < types.Length; i++)
			{
				MethodInfo[] methods = types[i].GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic);
				foreach (MethodInfo methodInfo in methods)
				{
					if (methodInfo.GetCustomAttributes(typeof(RuntimeInitializeOnLoadMethodAttribute), inherit: false).Length != 0)
					{
						methodInfo.Invoke(null, null);
					}
				}
			}
		}
	}
	internal class LacrimosumConfig : SyncedConfig2<LacrimosumConfig>
	{
		private const string GeneralSection = "General";

		private const string ScrapSection = "Scrap";

		private const string ShopSection = "Shop Items";

		public ConfigEntry<bool> AlwaysReplaceMenuMusic { get; set; }

		public SyncedEntry<bool> AlwaysReplaceElevatorMusic { get; set; }

		public SyncedEntry<bool> DontOverrideMineCode { get; set; }

		[field: SyncedEntryField]
		public SyncedEntry<int> WilloWispSpawnWeight { get; set; }

		[field: SyncedEntryField]
		public SyncedEntry<int> GoatHoofSpawnWeight { get; set; }

		[field: SyncedEntryField]
		public SyncedEntry<float> GoatHoofSpeedIncrease { get; set; }

		[field: SyncedEntryField]
		public SyncedEntry<int> WhiteScrapSpawnWeight { get; set; }

		[field: SyncedEntryField]
		public SyncedEntry<int> GreenScrapSpawnWeight { get; set; }

		[field: SyncedEntryField]
		public SyncedEntry<int> RedScrapSpawnWeight { get; set; }

		[field: SyncedEntryField]
		public SyncedEntry<int> YellowScrapSpawnWeight { get; set; }

		[field: SyncedEntryField]
		public SyncedEntry<int> BungusSpawnWeight { get; set; }

		[field: SyncedEntryField]
		public SyncedEntry<int> BungusHealthIncrease { get; set; }

		[field: SyncedEntryField]
		public SyncedEntry<float> BungusHealInterval { get; set; }

		[field: SyncedEntryField]
		public SyncedEntry<float> BungusActivationTime { get; set; }

		[field: SyncedEntryField]
		public SyncedEntry<bool> BungusMode { get; set; }

		[field: SyncedEntryField]
		public SyncedEntry<int> RollOfPenniesSpawnWeight { get; set; }

		[field: SyncedEntryField]
		public SyncedEntry<int> RollOfPenniesValueIncrease { get; set; }

		[field: SyncedEntryField]
		public SyncedEntry<int> RollOfPenniesMaxValue { get; set; }

		[field: SyncedEntryField]
		public SyncedEntry<int> UkuleleSpawnWeight { get; set; }

		[field: SyncedEntryField]
		public SyncedEntry<int> GooboJrSpawnWeight { get; set; }

		[field: SyncedEntryField]
		public SyncedEntry<int> HappiestMaskSpawnWeight { get; set; }

		[field: SyncedEntryField]
		public SyncedEntry<bool> EnableShopItems { get; set; }

		[field: SyncedEntryField]
		public SyncedEntry<int> SaferSpacesPrice { get; set; }

		[field: SyncedEntryField]
		public SyncedEntry<float> SaferSpacesCooldown { get; set; }

		[field: SyncedEntryField]
		public SyncedEntry<int> PowerElixirPrice { get; set; }

		[field: SyncedEntryField]
		public SyncedEntry<int> PowerElixirHealthThreshold { get; set; }

		[field: SyncedEntryField]
		public SyncedEntry<float> PowerElixirHealPercentage { get; set; }

		public LacrimosumConfig(ConfigFile configFile)
			: base("fragiledeviations.lacrimosum")
		{
			AlwaysReplaceMenuMusic = configFile.Bind<bool>("General", "AlwaysReplaceMenuMusic", false, "Always replace the menu music with the RoR2 menu music.");
			AlwaysReplaceElevatorMusic = SyncedBindingExtensions.BindSyncedEntry<bool>(configFile, "General", "AlwaysReplaceElevatorMusic", false, "Always replace the elevator music with the RoR1 final stage theme.");
			DontOverrideMineCode = SyncedBindingExtensions.BindSyncedEntry<bool>(configFile, "General", "DontOverrideMineCode", false, "Don't override the mine explosion code. Having this enabled will make Safer Spaces unable to save you from mines.");
			WilloWispSpawnWeight = SyncedBindingExtensions.BindSyncedEntry<int>(configFile, "Scrap", "WilloWispSpawnWeight", 20, "Explode enemies on death, except you're the enemy");
			GoatHoofSpawnWeight = SyncedBindingExtensions.BindSyncedEntry<int>(configFile, "Scrap", "GoatHoofSpawnWeight", 20, "Increase movement speed.");
			GoatHoofSpeedIncrease = SyncedBindingExtensions.BindSyncedEntry<float>(configFile, "Scrap", "GoatHoofSpeedIncrease", 4.6f, "How much to increase movement speed by. The player's base speed is 4.6, for reference.");
			WhiteScrapSpawnWeight = SyncedBindingExtensions.BindSyncedEntry<int>(configFile, "Scrap", "WhiteScrapSpawnWeight", 40, "Does nothing.");
			GreenScrapSpawnWeight = SyncedBindingExtensions.BindSyncedEntry<int>(configFile, "Scrap", "GreenScrapSpawnWeight", 30, "Does nothing.");
			YellowScrapSpawnWeight = SyncedBindingExtensions.BindSyncedEntry<int>(configFile, "Scrap", "YellowScrapSpawnWeight", 20, "Does nothing.");
			RedScrapSpawnWeight = SyncedBindingExtensions.BindSyncedEntry<int>(configFile, "Scrap", "RedScrapSpawnWeight", 10, "Does nothing.");
			BungusSpawnWeight = SyncedBindingExtensions.BindSyncedEntry<int>(configFile, "Scrap", "BungusSpawnWeight", 20, "Heal when standing still.");
			BungusHealthIncrease = SyncedBindingExtensions.BindSyncedEntry<int>(configFile, "Scrap", "BungusHealthIncrease", 5, "How much health to increase per heal tick.");
			BungusHealInterval = SyncedBindingExtensions.BindSyncedEntry<float>(configFile, "Scrap", "BungusHealInterval", 1f, "How often to heal.");
			BungusActivationTime = SyncedBindingExtensions.BindSyncedEntry<float>(configFile, "Scrap", "BungusActivationTime", 1f, "How long to stand still before healing.");
			BungusMode = SyncedBindingExtensions.BindSyncedEntry<bool>(configFile, "Scrap", "BungusMode", false, "Rename the item to Bungus. If false, it's called Bustling Fungus.");
			RollOfPenniesSpawnWeight = SyncedBindingExtensions.BindSyncedEntry<int>(configFile, "Scrap", "RollOfPenniesSpawnWeight", 40, "Increases item value upon taking damage.");
			RollOfPenniesValueIncrease = SyncedBindingExtensions.BindSyncedEntry<int>(configFile, "Scrap", "RollOfPenniesValueIncrease", 20, "How much to increase item value by.");
			RollOfPenniesMaxValue = SyncedBindingExtensions.BindSyncedEntry<int>(configFile, "Scrap", "RollOfPenniesMaxValue", 100, "The maximum value the item can reach.");
			UkuleleSpawnWeight = SyncedBindingExtensions.BindSyncedEntry<int>(configFile, "Scrap", "UkuleleSpawnWeight", 30, "...and his music was electric.");
			GooboJrSpawnWeight = SyncedBindingExtensions.BindSyncedEntry<int>(configFile, "Scrap", "GooboJrSpawnWeight", 10, "Spawn a gummy clone of yourself. May not be friendly.");
			HappiestMaskSpawnWeight = SyncedBindingExtensions.BindSyncedEntry<int>(configFile, "Scrap", "HappiestMaskSpawnWeight", 10, "I hate this thing.");
			EnableShopItems = SyncedBindingExtensions.BindSyncedEntry<bool>(configFile, "Shop Items", "EnableShopItems", true, "Enable the shop items.");
			SaferSpacesPrice = SyncedBindingExtensions.BindSyncedEntry<int>(configFile, "Shop Items", "SaferSpacesPrice", 800, "Block one incoming hit. Recharges after a short delay.");
			SaferSpacesCooldown = SyncedBindingExtensions.BindSyncedEntry<float>(configFile, "Shop Items", "SaferSpacesCooldown", 3f, "How long to wait before recharging the block.");
			PowerElixirPrice = SyncedBindingExtensions.BindSyncedEntry<int>(configFile, "Shop Items", "PowerElixirPrice", 500, "Heal for a percentage of your health when you reach a certain health threshold.");
			PowerElixirHealthThreshold = SyncedBindingExtensions.BindSyncedEntry<int>(configFile, "Shop Items", "PowerElixirHealthThreshold", 25, "The health threshold to activate the item.");
			PowerElixirHealPercentage = SyncedBindingExtensions.BindSyncedEntry<float>(configFile, "Shop Items", "PowerElixirHealPercentage", 75f, "The percentage of health to heal when activated.");
			ConfigManager.Register<LacrimosumConfig>((SyncedConfig2<LacrimosumConfig>)this);
		}
	}
	public static class PluginInfo
	{
		public const string PLUGIN_GUID = "Lacrimosum";

		public const string PLUGIN_NAME = "Lacrimosum";

		public const string PLUGIN_VERSION = "1.0.0";
	}
}
namespace Lacrimosum.Patching
{
	internal static class ElevatorMusicReplacer
	{
		[CompilerGenerated]
		private static class <>O
		{
			public static hook_OnEnable <0>__OnElevatorEnable;

			public static hook_ShipLeave <1>__OnShipLeave;

			public static hook_Start <2>__OnTerminalStart;
		}

		private static bool _ranOnce;

		private static Terminal _terminal;

		public static void Init()
		{
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Expected O, but got Unknown
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0044: Unknown result type (might be due to invalid IL or missing references)
			//IL_004a: Expected O, but got Unknown
			//IL_006e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0073: Unknown result type (might be due to invalid IL or missing references)
			//IL_0079: Expected O, but got Unknown
			object obj = <>O.<0>__OnElevatorEnable;
			if (obj == null)
			{
				hook_OnEnable val = OnElevatorEnable;
				<>O.<0>__OnElevatorEnable = val;
				obj = (object)val;
			}
			MineshaftElevatorController.OnEnable += (hook_OnEnable)obj;
			RoR2Plugin.ModConsole.LogDebug((object)"ElevatorMusicReplacer: MineshaftElevatorController.OnEnable hooked!");
			object obj2 = <>O.<1>__OnShipLeave;
			if (obj2 == null)
			{
				hook_ShipLeave val2 = OnShipLeave;
				<>O.<1>__OnShipLeave = val2;
				obj2 = (object)val2;
			}
			StartOfRound.ShipLeave += (hook_ShipLeave)obj2;
			RoR2Plugin.ModConsole.LogDebug((object)"ElevatorMusicReplacer: StartOfRound.ShipLeave hooked!");
			object obj3 = <>O.<2>__OnTerminalStart;
			if (obj3 == null)
			{
				hook_Start val3 = OnTerminalStart;
				<>O.<2>__OnTerminalStart = val3;
				obj3 = (object)val3;
			}
			Terminal.Start += (hook_Start)obj3;
		}

		private static void OnTerminalStart(orig_Start orig, Terminal self)
		{
			orig.Invoke(self);
			_terminal = self;
		}

		private static void OnShipLeave(orig_ShipLeave orig, StartOfRound self)
		{
			orig.Invoke(self);
			_ranOnce = false;
		}

		private static void OnElevatorEnable(orig_OnEnable orig, MineshaftElevatorController self)
		{
			orig.Invoke(self);
			if (!_ranOnce)
			{
				if (SyncedEntry<bool>.op_Implicit(RoR2Plugin.ModConfig.AlwaysReplaceElevatorMusic))
				{
					self.elevatorJingleMusic.clip = ModAssets.ElevatorMusic;
					_ranOnce = true;
				}
				else if (new Random(_terminal.groupCredits * StartOfRound.Instance.connectedPlayersAmount).Next(0, 100) <= 2)
				{
					self.elevatorJingleMusic.clip = ModAssets.ElevatorMusic;
					_ranOnce = true;
				}
			}
		}
	}
	internal static class MenuMusicReplacer
	{
		[CompilerGenerated]
		private static class <>O
		{
			public static hook_Awake <0>__OnMenuAwake;
		}

		private static readonly Random Rnd = new Random();

		public static void Init()
		{
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Expected O, but got Unknown
			object obj = <>O.<0>__OnMenuAwake;
			if (obj == null)
			{
				hook_Awake val = OnMenuAwake;
				<>O.<0>__OnMenuAwake = val;
				obj = (object)val;
			}
			MenuManager.Awake += (hook_Awake)obj;
			RoR2Plugin.ModConsole.LogDebug((object)"MenuMusicReplacer: MenuManager.Awake hooked!");
		}

		private static void OnMenuAwake(orig_Awake orig, MenuManager self)
		{
			if (RoR2Plugin.ModConfig.AlwaysReplaceMenuMusic.Value)
			{
				ReplaceMenuMusic(self);
				ChangeMenuColors(self);
				AddLilGuy(self);
			}
			else if (Rnd.Next(0, 100) < 2)
			{
				ReplaceMenuMusic(self);
				ChangeMenuColors(self);
				AddLilGuy(self);
			}
			orig.Invoke(self);
		}

		private static void ChangeMenuColors(MenuManager menu)
		{
			//IL_0040: Unknown result type (might be due to invalid IL or missing references)
			//IL_0060: Unknown result type (might be due to invalid IL or missing references)
			Color color = default(Color);
			((Color)(ref color))..ctor(0f, 0.9822383f, 1f, 1f);
			GameObject gameObject = ((Component)menu.menuAnimator).gameObject;
			((Graphic)((Component)gameObject.transform.Find("VersionNum")).gameObject.GetComponent<TextMeshProUGUI>()).color = color;
			GameObject gameObject2 = ((Component)gameObject.transform.Find("MainButtons")).gameObject;
			((Graphic)gameObject2.GetComponent<Image>()).color = color;
			((Component)gameObject2.transform.Find("HeaderImage")).gameObject.GetComponent<Image>().sprite = ModAssets.BlueLogo;
		}

		private static void ReplaceMenuMusic(MenuManager menu)
		{
			menu.menuMusic = ModAssets.RoR2MenuMusic;
		}

		private static void AddLilGuy(MenuManager menu)
		{
			//IL_0045: Unknown result type (might be due to invalid IL or missing references)
			//IL_005a: Unknown result type (might be due to invalid IL or missing references)
			//IL_006e: Unknown result type (might be due to invalid IL or missing references)
			GameObject gameObject = ((Component)((Component)menu.menuAnimator).gameObject.transform.Find("MainButtons")).gameObject;
			RectTransform component = Object.Instantiate<GameObject>(ModAssets.LilGuyPrefab, gameObject.transform).GetComponent<RectTransform>();
			((Transform)component).localPosition = new Vector3(207.6f, 106.5756f, 0f);
			component.anchoredPosition = new Vector2(207.6f, -130.3f);
			component.sizeDelta = new Vector2(130f, -130.3f);
		}
	}
	internal static class MineReplacement
	{
		[CompilerGenerated]
		private static class <>O
		{
			public static hook_SpawnExplosion <0>__OnMineSpawnExplosion;
		}

		public static void Init()
		{
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Expected O, but got Unknown
			object obj = <>O.<0>__OnMineSpawnExplosion;
			if (obj == null)
			{
				hook_SpawnExplosion val = OnMineSpawnExplosion;
				<>O.<0>__OnMineSpawnExplosion = val;
				obj = (object)val;
			}
			Landmine.SpawnExplosion += (hook_SpawnExplosion)obj;
			RoR2Plugin.ModConsole.LogDebug((object)"MineReplacement: Landmine.SpawnExplosion hooked!");
		}

		private static void OnMineSpawnExplosion(orig_SpawnExplosion orig, Vector3 explosionPosition, bool spawnExplosionEffect, float killRange, float damageRange, int nonLethalDamage, float physicsForce, GameObject overridePrefab, bool goThroughCar)
		{
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			if (SyncedEntry<bool>.op_Implicit(RoR2Plugin.ModConfig.DontOverrideMineCode))
			{
				orig.Invoke(explosionPosition, spawnExplosionEffect, killRange, damageRange, nonLethalDamage, physicsForce, overridePrefab, goThroughCar);
			}
			else
			{
				Utilities.CreateExplosion(explosionPosition, spawnExplosionEffect, 100, killRange, damageRange, physicsForce.RoundToInt(), (CauseOfDeath)3);
			}
		}
	}
	internal static class NetworkPrefabsHelper
	{
		[CompilerGenerated]
		private static class <>O
		{
			public static hook_Start <0>__OnNetworkManagerStart;
		}

		public static readonly List<GameObject> NetworkPrefabs = new List<GameObject>();

		public static EnemyType MaskedEnemy;

		public static void Init()
		{
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Expected O, but got Unknown
			object obj = <>O.<0>__OnNetworkManagerStart;
			if (obj == null)
			{
				hook_Start val = OnNetworkManagerStart;
				<>O.<0>__OnNetworkManagerStart = val;
				obj = (object)val;
			}
			GameNetworkManager.Start += (hook_Start)obj;
		}

		private static void OnNetworkManagerStart(orig_Start orig, GameNetworkManager self)
		{
			orig.Invoke(self);
			foreach (NetworkPrefab prefab in NetworkManager.Singleton.NetworkConfig.Prefabs.Prefabs)
			{
				NetworkPrefabs.Add(prefab.Prefab);
			}
			FindRequiredPrefabs();
		}

		private static void FindRequiredPrefabs()
		{
			MaskedEnemy = NetworkPrefabs.Find((GameObject prefab) => ((Object)prefab).name == "MaskedPlayerEnemy").GetComponent<EnemyAI>().enemyType;
		}
	}
	internal static class PlayerEventTracker
	{
		[CompilerGenerated]
		private static class <>O
		{
			public static hook_SpawnDeadBody <0>__PlayerCorpseSpawned;

			public static hook_DamagePlayer <1>__PlayerDamaged;

			public static hook_Start <2>__PlayerStart;
		}

		public static void Init()
		{
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Expected O, but got Unknown
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0044: Unknown result type (might be due to invalid IL or missing references)
			//IL_004a: Expected O, but got Unknown
			//IL_006e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0073: Unknown result type (might be due to invalid IL or missing references)
			//IL_0079: Expected O, but got Unknown
			object obj = <>O.<0>__PlayerCorpseSpawned;
			if (obj == null)
			{
				hook_SpawnDeadBody val = PlayerCorpseSpawned;
				<>O.<0>__PlayerCorpseSpawned = val;
				obj = (object)val;
			}
			PlayerControllerB.SpawnDeadBody += (hook_SpawnDeadBody)obj;
			RoR2Plugin.ModConsole.LogDebug((object)"PlayerEventTracker: PlayerControllerB.SpawnDeadBody hooked!");
			object obj2 = <>O.<1>__PlayerDamaged;
			if (obj2 == null)
			{
				hook_DamagePlayer val2 = PlayerDamaged;
				<>O.<1>__PlayerDamaged = val2;
				obj2 = (object)val2;
			}
			PlayerControllerB.DamagePlayer += (hook_DamagePlayer)obj2;
			RoR2Plugin.ModConsole.LogDebug((object)"PlayerEventTracker: PlayerControllerB.DamagePlayer hooked!");
			object obj3 = <>O.<2>__PlayerStart;
			if (obj3 == null)
			{
				hook_Start val3 = PlayerStart;
				<>O.<2>__PlayerStart = val3;
				obj3 = (object)val3;
			}
			PlayerControllerB.Start += (hook_Start)obj3;
			RoR2Plugin.ModConsole.LogDebug((object)"PlayerEventTracker: PlayerControllerB.Start hooked!");
		}

		private static void PlayerDamaged(orig_DamagePlayer orig, PlayerControllerB self, int damageNumber, bool hasDamageSfx, bool callRPC, CauseOfDeath causeOfDeath, int deathAnimation, bool fallDamage, Vector3 force)
		{
			//IL_006e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0074: Unknown result type (might be due to invalid IL or missing references)
			//IL_015a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0160: Unknown result type (might be due to invalid IL or missing references)
			RoR2Plugin.ModConsole.LogDebug((object)(self.playerUsername + " damaged"));
			List<SaferSpaces> activeSpaces = SaferSpaces.ActiveSpaces;
			if (activeSpaces.Count == 0)
			{
				HandlePennies(self);
				RoR2Plugin.ModConsole.LogDebug((object)("HandlePennies for " + self.playerUsername));
				HandlePowerElixir(self, damageNumber);
				RoR2Plugin.ModConsole.LogDebug((object)("HandlePowerElixir for " + self.playerUsername));
				orig.Invoke(self, damageNumber, hasDamageSfx, callRPC, causeOfDeath, deathAnimation, fallDamage, force);
				RoR2Plugin.ModConsole.LogDebug((object)("Player " + self.playerUsername + " will take damage because no one is holding a Safer Spaces."));
			}
			foreach (SaferSpaces item in activeSpaces)
			{
				if (item.IsPlayerHolding(self))
				{
					if (item.CanBlock)
					{
						RoR2Plugin.ModConsole.LogDebug((object)("Player " + self.playerUsername + " will not take damage because " + ((Object)((Component)item).gameObject).name + " is holding a Safer Spaces."));
						item.PlaySound();
						item.StartCooldown();
					}
					else
					{
						HandlePennies(self);
						RoR2Plugin.ModConsole.LogDebug((object)("HandlePennies for " + self.playerUsername));
						HandlePowerElixir(self, damageNumber);
						RoR2Plugin.ModConsole.LogDebug((object)("HandlePowerElixir for " + self.playerUsername));
						orig.Invoke(self, damageNumber, hasDamageSfx, callRPC, causeOfDeath, deathAnimation, fallDamage, force);
						RoR2Plugin.ModConsole.LogDebug((object)("Player " + self.playerUsername + " will take damage because their safer spaces is on cooldown or is out of battery."));
					}
				}
			}
		}

		private static void PlayerCorpseSpawned(orig_SpawnDeadBody orig, PlayerControllerB self, int playerId, Vector3 bodyVelocity, int causeOfDeath, PlayerControllerB deadPlayerController, int deathAnimation, Transform overridePosition, Vector3 positionOffset)
		{
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			RoR2Plugin.ModConsole.LogDebug((object)(self.playerUsername + "'s corpse got spawned"));
			orig.Invoke(self, playerId, bodyVelocity, causeOfDeath, deadPlayerController, deathAnimation, overridePosition, positionOffset);
			HandleWillOWisp(self);
			RoR2Plugin.ModConsole.LogDebug((object)("HandleWillOWisp for " + self.playerUsername));
		}

		private static void PlayerStart(orig_Start orig, PlayerControllerB self)
		{
			RoR2Plugin.ModConsole.LogDebug((object)("Player " + self.playerUsername + " started!"));
			orig.Invoke(self);
			SetupBungusWard(self);
			SetupSaferSpacesBubble(self);
		}

		private static void SetupBungusWard(PlayerControllerB player)
		{
			GameObject obj = Object.Instantiate<GameObject>(ModAssets.BungusMushroomWardPrefab, ((Component)player).transform);
			((Object)obj).name = "MushroomWard";
			obj.SetActive(false);
			RoR2Plugin.ModConsole.LogDebug((object)("Set up BungusWard for " + player.playerUsername + "!"));
		}

		private static void SetupSaferSpacesBubble(PlayerControllerB player)
		{
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			GameObject obj = Object.Instantiate<GameObject>(ModAssets.SaferSpacesBubblePrefab, ((Component)player).transform);
			((Object)obj).name = "SaferSpacesBubble";
			obj.SetActive(false);
			obj.transform.localPosition = new Vector3(0f, 2.299524f, 0f);
			obj.transform.SetParent(player.playerGlobalHead, true);
			RoR2Plugin.ModConsole.LogDebug((object)("Set up SaferSpacesBubble for " + player.playerUsername + "!"));
		}

		private static void HandleWillOWisp(PlayerControllerB player)
		{
			if (WilloWisp.ActiveWisps.Count == 0)
			{
				return;
			}
			foreach (WilloWisp activeWisp in WilloWisp.ActiveWisps)
			{
				activeWisp.CheckPlayerDeath(player);
			}
		}

		private static void HandlePennies(PlayerControllerB player)
		{
			if (RollOfPennies.ActivePennies.Count == 0)
			{
				return;
			}
			foreach (RollOfPennies activePenny in RollOfPennies.ActivePennies)
			{
				activePenny.CheckDamagedPlayer(player);
			}
		}

		private static void HandlePowerElixir(PlayerControllerB player, int damage)
		{
			if (PowerElixir.ActiveElixirs.Count == 0)
			{
				return;
			}
			foreach (PowerElixir activeElixir in PowerElixir.ActiveElixirs)
			{
				activeElixir.CheckHealth(player, damage);
			}
		}
	}
}
namespace Lacrimosum.ItemScripts
{
	[AddComponentMenu("Lacrimosum/Bustling Fungus")]
	public class Bungus : ItemBehaviour
	{
		[Space(10f)]
		[Header("Bustling Fungus Settings")]
		[Tooltip("The amount of health to heal per second when in the zone.")]
		public int addedHealth = 10;

		[Tooltip("The time between each heal.")]
		public float healInterval = 1f;

		[Tooltip("How long the player must be standing for the zone to activate.")]
		public float activationTime = 3f;

		[Tooltip("The sound to play when the zone activates.")]
		public AudioClip activationSound;

		private bool _isHealing;

		private GameObject _mushroomWard;

		public override void OnNetworkSpawn()
		{
			((NetworkBehaviour)this).OnNetworkSpawn();
			addedHealth = SyncedEntry<int>.op_Implicit(RoR2Plugin.ModConfig.BungusHealthIncrease);
			healInterval = SyncedEntry<float>.op_Implicit(RoR2Plugin.ModConfig.BungusHealInterval);
			activationTime = SyncedEntry<float>.op_Implicit(RoR2Plugin.ModConfig.BungusActivationTime);
			if (SyncedEntry<bool>.op_Implicit(RoR2Plugin.ModConfig.BungusMode))
			{
				base.ScanNodeProperties.headerText = "Bungus";
			}
		}

		public override void GrabItem()
		{
			base.GrabItem();
			_mushroomWard = ((GrabbableObject)this).playerHeldBy.GetMushroomWard();
		}

		public override void Update()
		{
			((GrabbableObject)this).Update();
			if (Object.op_Implicit((Object)(object)((GrabbableObject)this).playerHeldBy))
			{
				if (((GrabbableObject)this).playerHeldBy.timeSincePlayerMoving > activationTime && !_isHealing)
				{
					StartHealServerRpc();
				}
				else if (((GrabbableObject)this).playerHeldBy.timeSincePlayerMoving < activationTime && _isHealing)
				{
					StopHealServerRpc();
				}
			}
		}

		[ServerRpc(RequireOwnership = false)]
		public void StartHealServerRpc()
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_008c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0096: Invalid comparison between Unknown and I4
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost))
				{
					ServerRpcParams val = default(ServerRpcParams);
					FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(3871419403u, val, (RpcDelivery)0);
					((NetworkBehaviour)this).__endSendServerRpc(ref val2, 3871419403u, val, (RpcDelivery)0);
				}
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost))
				{
					StartHealClientRpc();
				}
			}
		}

		[ClientRpc]
		public void StartHealClientRpc()
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_008c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0096: Invalid comparison between Unknown and I4
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost))
				{
					ClientRpcParams val = default(ClientRpcParams);
					FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(2151538089u, val, (RpcDelivery)0);
					((NetworkBehaviour)this).__endSendClientRpc(ref val2, 2151538089u, val, (RpcDelivery)0);
				}
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost))
				{
					_isHealing = true;
					base.AudioSource.PlayOneShot(activationSound);
					_mushroomWard.SetActive(true);
					((MonoBehaviour)this).StartCoroutine(HealRoutine());
				}
			}
		}

		[ServerRpc(RequireOwnership = false)]
		public void StopHealServerRpc()
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_008c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0096: Invalid comparison between Unknown and I4
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost))
				{
					ServerRpcParams val = default(ServerRpcParams);
					FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(1926513613u, val, (RpcDelivery)0);
					((NetworkBehaviour)this).__endSendServerRpc(ref val2, 1926513613u, val, (RpcDelivery)0);
				}
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost))
				{
					StopHealClientRpc();
				}
			}
		}

		[ClientRpc]
		public void StopHealClientRpc()
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_008c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0096: Invalid comparison between Unknown and I4
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost))
				{
					ClientRpcParams val = default(ClientRpcParams);
					FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(4147429621u, val, (RpcDelivery)0);
					((NetworkBehaviour)this).__endSendClientRpc(ref val2, 4147429621u, val, (RpcDelivery)0);
				}
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost))
				{
					_isHealing = false;
					_mushroomWard.SetActive(false);
				}
			}
		}

		private IEnumerator HealRoutine()
		{
			PlayerControllerB val = default(PlayerControllerB);
			while (_isHealing)
			{
				Collider[] array = Physics.OverlapSphere(((Component)this).transform.position, 3f, LayerMask.GetMask(new string[1] { "Player" }));
				Collider[] array2 = array;
				for (int i = 0; i < array2.Length; i++)
				{
					if (!((Component)array2[i]).TryGetComponent<PlayerControllerB>(ref val))
					{
						continue;
					}
					if (val.health != 100)
					{
						PlayerControllerB obj = val;
						obj.health += addedHealth;
						if (val.health > 100)
						{
							val.health = 100;
						}
						((GrabbableObject)this).playerHeldBy.criticallyInjured = false;
						if (Object.op_Implicit((Object)(object)((GrabbableObject)this).playerHeldBy.playerBodyAnimator))
						{
							((GrabbableObject)this).playerHeldBy.playerBodyAnimator.SetBool("Limp", false);
						}
						((GrabbableObject)this).playerHeldBy.bleedingHeavily = false;
					}
					yield return (object)new WaitForSeconds(healInterval);
				}
			}
		}

		public override void DiscardItem()
		{
			((GrabbableObject)this).DiscardItem();
			if (_isHealing)
			{
				StopHealServerRpc();
			}
			_mushroomWard.SetActive(false);
			_mushroomWard = null;
		}

		protected override void __initializeVariables()
		{
			base.__initializeVariables();
		}

		[RuntimeInitializeOnLoadMethod]
		internal static void InitializeRPCS_Bungus()
		{
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Expected O, but got Unknown
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Expected O, but got Unknown
			//IL_0047: Unknown result type (might be due to invalid IL or missing references)
			//IL_0051: Expected O, but got Unknown
			//IL_0062: Unknown result type (might be due to invalid IL or missing references)
			//IL_006c: Expected O, but got Unknown
			NetworkManager.__rpc_func_table.Add(3871419403u, new RpcReceiveHandler(__rpc_handler_3871419403));
			NetworkManager.__rpc_func_table.Add(2151538089u, new RpcReceiveHandler(__rpc_handler_2151538089));
			NetworkManager.__rpc_func_table.Add(1926513613u, new RpcReceiveHandler(__rpc_handler_1926513613));
			NetworkManager.__rpc_func_table.Add(4147429621u, new RpcReceiveHandler(__rpc_handler_4147429621));
		}

		private static void __rpc_handler_3871419403(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
		{
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				target.__rpc_exec_stage = (__RpcExecStage)1;
				((Bungus)(object)target).StartHealServerRpc();
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		private static void __rpc_handler_2151538089(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
		{
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				target.__rpc_exec_stage = (__RpcExecStage)2;
				((Bungus)(object)target).StartHealClientRpc();
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		private static void __rpc_handler_1926513613(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
		{
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				target.__rpc_exec_stage = (__RpcExecStage)1;
				((Bungus)(object)target).StopHealServerRpc();
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		private static void __rpc_handler_4147429621(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
		{
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				target.__rpc_exec_stage = (__RpcExecStage)2;
				((Bungus)(object)target).StopHealClientRpc();
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		protected internal override string __getTypeName()
		{
			return "Bungus";
		}
	}
	[AddComponentMenu("Lacrimosum/Paul's Goat Hoof")]
	public class GoatHoof : ItemBehaviour
	{
		[Space(10f)]
		[Header("Paul's Goat Hoof Settings")]
		[Tooltip("The amount of speed to add when held.")]
		public float addedSpeedPercent = 4.6f;

		public override void OnNetworkSpawn()
		{
			addedSpeedPercent = SyncedEntry<float>.op_Implicit(RoR2Plugin.ModConfig.GoatHoofSpeedIncrease);
		}

		public override void GrabItem()
		{
			base.GrabItem();
			if (((NetworkBehaviour)this).IsOwner)
			{
				AddSpeedServerRpc();
			}
		}

		[ServerRpc(RequireOwnership = false)]
		private void AddSpeedServerRpc()
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_008c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0096: Invalid comparison between Unknown and I4
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost))
				{
					ServerRpcParams val = default(ServerRpcParams);
					FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(2264686608u, val, (RpcDelivery)0);
					((NetworkBehaviour)this).__endSendServerRpc(ref val2, 2264686608u, val, (RpcDelivery)0);
				}
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost))
				{
					AddSpeedClientRpc();
				}
			}
		}

		[ClientRpc]
		private void AddSpeedClientRpc()
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_008c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0096: Invalid comparison between Unknown and I4
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost))
				{
					ClientRpcParams val = default(ClientRpcParams);
					FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(3950335989u, val, (RpcDelivery)0);
					((NetworkBehaviour)this).__endSendClientRpc(ref val2, 3950335989u, val, (RpcDelivery)0);
				}
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost))
				{
					PlayerControllerB playerHeldBy = ((GrabbableObject)this).playerHeldBy;
					playerHeldBy.movementSpeed += addedSpeedPercent;
				}
			}
		}

		public override void DiscardItem()
		{
			((GrabbableObject)this).DiscardItem();
			if (((NetworkBehaviour)this).IsOwner)
			{
				RemoveSpeedServerRpc();
			}
		}

		[ServerRpc(RequireOwnership = false)]
		private void RemoveSpeedServerRpc()
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_008c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0096: Invalid comparison between Unknown and I4
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost))
				{
					ServerRpcParams val = default(ServerRpcParams);
					FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(2013262870u, val, (RpcDelivery)0);
					((NetworkBehaviour)this).__endSendServerRpc(ref val2, 2013262870u, val, (RpcDelivery)0);
				}
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost))
				{
					RemoveSpeedClientRpc();
				}
			}
		}

		[ClientRpc]
		private void RemoveSpeedClientRpc()
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_008c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0096: Invalid comparison between Unknown and I4
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost))
				{
					ClientRpcParams val = default(ClientRpcParams);
					FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(2130733099u, val, (RpcDelivery)0);
					((NetworkBehaviour)this).__endSendClientRpc(ref val2, 2130733099u, val, (RpcDelivery)0);
				}
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost))
				{
					PlayerControllerB lastPlayerHeldBy = LastPlayerHeldBy;
					lastPlayerHeldBy.movementSpeed -= addedSpeedPercent;
				}
			}
		}

		protected override void __initializeVariables()
		{
			base.__initializeVariables();
		}

		[RuntimeInitializeOnLoadMethod]
		internal static void InitializeRPCS_GoatHoof()
		{
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Expected O, but got Unknown
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Expected O, but got Unknown
			//IL_0047: Unknown result type (might be due to invalid IL or missing references)
			//IL_0051: Expected O, but got Unknown
			//IL_0062: Unknown result type (might be due to invalid IL or missing references)
			//IL_006c: Expected O, but got Unknown
			NetworkManager.__rpc_func_table.Add(2264686608u, new RpcReceiveHandler(__rpc_handler_2264686608));
			NetworkManager.__rpc_func_table.Add(3950335989u, new RpcReceiveHandler(__rpc_handler_3950335989));
			NetworkManager.__rpc_func_table.Add(2013262870u, new RpcReceiveHandler(__rpc_handler_2013262870));
			NetworkManager.__rpc_func_table.Add(2130733099u, new RpcReceiveHandler(__rpc_handler_2130733099));
		}

		private static void __rpc_handler_2264686608(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
		{
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				target.__rpc_exec_stage = (__RpcExecStage)1;
				((GoatHoof)(object)target).AddSpeedServerRpc();
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		private static void __rpc_handler_3950335989(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
		{
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				target.__rpc_exec_stage = (__RpcExecStage)2;
				((GoatHoof)(object)target).AddSpeedClientRpc();
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		private static void __rpc_handler_2013262870(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
		{
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				target.__rpc_exec_stage = (__RpcExecStage)1;
				((GoatHoof)(object)target).RemoveSpeedServerRpc();
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		private static void __rpc_handler_2130733099(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
		{
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				target.__rpc_exec_stage = (__RpcExecStage)2;
				((GoatHoof)(object)target).RemoveSpeedClientRpc();
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		protected internal override string __getTypeName()
		{
			return "GoatHoof";
		}
	}
	[AddComponentMenu("Lacrimosum/Goobo Jr.")]
	public class GooboJr : ThrowableItemBehaviour
	{
		[Space(10f)]
		[Header("Goobo Jr. Settings")]
		[Tooltip("The material to apply to the masked enemy.")]
		public Material gooboJrMaterial;

		[Tooltip("The sounds to play when a Goobo is spawned.")]
		public AudioClip[] gooboSpawnSounds;

		public override void PlayDropSFX()
		{
			((GrabbableObject)this).PlayDropSFX();
			if (WasThrown && !(StartOfRound.Instance.currentLevel.PlanetName == "71 Gordion"))
			{
				SpawnMaskedEnemyServerRpc();
			}
		}

		[ServerRpc(RequireOwnership = false)]
		private void SpawnMaskedEnemyServerRpc()
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_008c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0096: Invalid comparison between Unknown and I4
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost))
				{
					ServerRpcParams val = default(ServerRpcParams);
					FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(3896560153u, val, (RpcDelivery)0);
					((NetworkBehaviour)this).__endSendServerRpc(ref val2, 3896560153u, val, (RpcDelivery)0);
				}
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost))
				{
					SpawnMaskedEnemyClientRpc();
				}
			}
		}

		[ClientRpc]
		private void SpawnMaskedEnemyClientRpc()
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_008c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0096: Invalid comparison between Unknown and I4
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fb: Unknown result type (might be due to invalid IL or missing references)
			//IL_0106: Unknown result type (might be due to invalid IL or missing references)
			//IL_0164: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager == null || !networkManager.IsListening)
			{
				return;
			}
			if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost))
			{
				ClientRpcParams val = default(ClientRpcParams);
				FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(3195257550u, val, (RpcDelivery)0);
				((NetworkBehaviour)this).__endSendClientRpc(ref val2, 3195257550u, val, (RpcDelivery)0);
			}
			if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 2 || (!networkManager.IsClient && !networkManager.IsHost))
			{
				return;
			}
			RoundManager.Instance.SpawnEnemyGameObject(((Component)this).transform.position, ((Component)this).transform.rotation.y, 0, NetworkPrefabsHelper.MaskedEnemy);
			MaskedPlayerEnemy[] array = Object.FindObjectsOfType<MaskedPlayerEnemy>();
			foreach (MaskedPlayerEnemy val3 in array)
			{
				if (!(Vector3.Distance(((Component)val3).transform.position, ((Component)this).transform.position) > 2f))
				{
					SkinnedMeshRenderer[] componentsInChildren = ((Component)val3).GetComponentsInChildren<SkinnedMeshRenderer>();
					for (int j = 0; j < componentsInChildren.Length; j++)
					{
						((Renderer)componentsInChildren[j]).material = gooboJrMaterial;
					}
				}
			}
			AudioSource.PlayClipAtPoint(gooboSpawnSounds[Random.Range(0, gooboSpawnSounds.Length)], ((Component)this).transform.position);
			base.NetworkObject.Despawn(true);
		}

		protected override void __initializeVariables()
		{
			base.__initializeVariables();
		}

		[RuntimeInitializeOnLoadMethod]
		internal static void InitializeRPCS_GooboJr()
		{
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Expected O, but got Unknown
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Expected O, but got Unknown
			NetworkManager.__rpc_func_table.Add(3896560153u, new RpcReceiveHandler(__rpc_handler_3896560153));
			NetworkManager.__rpc_func_table.Add(3195257550u, new RpcReceiveHandler(__rpc_handler_3195257550));
		}

		private static void __rpc_handler_3896560153(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
		{
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				target.__rpc_exec_stage = (__RpcExecStage)1;
				((GooboJr)(object)target).SpawnMaskedEnemyServerRpc();
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		private static void __rpc_handler_3195257550(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
		{
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				target.__rpc_exec_stage = (__RpcExecStage)2;
				((GooboJr)(object)target).SpawnMaskedEnemyClientRpc();
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		protected internal override string __getTypeName()
		{
			return "GooboJr";
		}
	}
	[AddComponentMenu("Lacrimosum/Happiest Mask")]
	public class HappiestMask : HauntedMaskItem
	{
		public override void OnNetworkSpawn()
		{
			base.mimicEnemy = NetworkPrefabsHelper.MaskedEnemy;
		}

		protected override void __initializeVariables()
		{
			((HauntedMaskItem)this).__initializeVariables();
		}

		protected internal override string __getTypeName()
		{
			return "HappiestMask";
		}
	}
	[AddComponentMenu("Lacrimosum/Item Behaviour")]
	public class ItemBehaviour : GrabbableObject
	{
		protected PlayerControllerB LastPlayerHeldBy;

		protected NetworkObject NetworkObject => ((Component)this).GetComponent<NetworkObject>();

		protected ScanNodeProperties ScanNodeProperties => ((Component)this).GetComponentInChildren<ScanNodeProperties>();

		protected AudioSource AudioSource => ((Component)this).GetComponent<AudioSource>();

		public override void GrabItem()
		{
			((GrabbableObject)this).GrabItem();
			LastPlayerHeldBy = base.playerHeldBy;
		}

		protected override void __initializeVariables()
		{
			((GrabbableObject)this).__initializeVariables();
		}

		protected internal override string __getTypeName()
		{
			return "ItemBehaviour";
		}
	}
	[AddComponentMenu("Lacrimosum/Power Elixir")]
	public class PowerElixir : ItemBehaviour
	{
		public static readonly List<PowerElixir> ActiveElixirs = new List<PowerElixir>();

		[Space(10f)]
		[Header("Power Elixir Settings")]
		[Tooltip("The amount of health the player must reach to activate.")]
		public int healthThreshold = 25;

		[Tooltip("The percentage of health to heal when activated.")]
		public float healPercentage = 75f;

		[Tooltip("The sounds to play when activated.")]
		public AudioClip[] activationSounds;

		public override void OnNetworkSpawn()
		{
			healthThreshold = SyncedEntry<int>.op_Implicit(RoR2Plugin.ModConfig.PowerElixirHealthThreshold);
			healPercentage = SyncedEntry<float>.op_Implicit(RoR2Plugin.ModConfig.PowerElixirHealPercentage);
		}

		public override void GrabItem()
		{
			base.GrabItem();
			ActiveElixirs.Add(this);
		}

		public override void DiscardItem()
		{
			((GrabbableObject)this).DiscardItem();
			ActiveElixirs.Remove(this);
		}

		public override void OnNetworkDespawn()
		{
			ActiveElixirs.Remove(this);
			((NetworkBehaviour)this).OnNetworkDespawn();
		}

		public override void OnDestroy()
		{
			ActiveElixirs.Remove(this);
			((NetworkBehaviour)this).OnDestroy();
		}

		public void CheckHealth(PlayerControllerB player, int damageNumber)
		{
			if (!((Object)(object)player != (Object)(object)((GrabbableObject)this).playerHeldBy) && player.health - damageNumber <= healthThreshold)
			{
				HealPlayerServerRpc();
			}
		}

		[ServerRpc(RequireOwnership = false)]
		private void HealPlayerServerRpc()
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_008c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0096: Invalid comparison between Unknown and I4
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost))
				{
					ServerRpcParams val = default(ServerRpcParams);
					FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(3543231861u, val, (RpcDelivery)0);
					((NetworkBehaviour)this).__endSendServerRpc(ref val2, 3543231861u, val, (RpcDelivery)0);
				}
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost))
				{
					HealPlayerClientRpc();
				}
			}
		}

		[ClientRpc]
		private void HealPlayerClientRpc()
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_008c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0096: Invalid comparison between Unknown and I4
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager == null || !networkManager.IsListening)
			{
				return;
			}
			if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost))
			{
				ClientRpcParams val = default(ClientRpcParams);
				FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(679042488u, val, (RpcDelivery)0);
				((NetworkBehaviour)this).__endSendClientRpc(ref val2, 679042488u, val, (RpcDelivery)0);
			}
			if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost))
			{
				float num = (float)((GrabbableObject)this).playerHeldBy.health * (healPercentage / 100f);
				if (num > 100f)
				{
					num = 100f;
				}
				int health = num.RoundToInt();
				base.AudioSource.PlayOneShot(activationSounds[Random.Range(0, activationSounds.Length)]);
				((GrabbableObject)this).playerHeldBy.health = health;
				((GrabbableObject)this).playerHeldBy.criticallyInjured = false;
				if (Object.op_Implicit((Object)(object)((GrabbableObject)this).playerHeldBy.playerBodyAnimator))
				{
					((GrabbableObject)this).playerHeldBy.playerBodyAnimator.SetBool("Limp", false);
				}
				((GrabbableObject)this).playerHeldBy.bleedingHeavily = false;
				((MonoBehaviour)this).StartCoroutine(Despawn());
			}
		}

		private IEnumerator Despawn()
		{
			yield return (object)new WaitForSeconds(1f);
			((GrabbableObject)this).DiscardItemServerRpc();
			base.NetworkObject.Despawn(true);
		}

		protected override void __initializeVariables()
		{
			base.__initializeVariables();
		}

		[RuntimeInitializeOnLoadMethod]
		internal static void InitializeRPCS_PowerElixir()
		{
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Expected O, but got Unknown
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Expected O, but got Unknown
			NetworkManager.__rpc_func_table.Add(3543231861u, new RpcReceiveHandler(__rpc_handler_3543231861));
			NetworkManager.__rpc_func_table.Add(679042488u, new RpcReceiveHandler(__rpc_handler_679042488));
		}

		private static void __rpc_handler_3543231861(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
		{
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				target.__rpc_exec_stage = (__RpcExecStage)1;
				((PowerElixir)(object)target).HealPlayerServerRpc();
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		private static void __rpc_handler_679042488(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
		{
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				target.__rpc_exec_stage = (__RpcExecStage)2;
				((PowerElixir)(object)target).HealPlayerClientRpc();
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		protected internal override string __getTypeName()
		{
			return "PowerElixir";
		}
	}
	[AddComponentMenu("Lacrimosum/Roll Of Pennies")]
	public class RollOfPennies : ItemBehaviour
	{
		public static readonly List<RollOfPennies> ActivePennies = new List<RollOfPennies>();

		[Space(10f)]
		[Header("Roll Of Pennies Settings")]
		[Tooltip("The amount of credits to add to the item's value upon taking damage.")]
		public int addedCredits = 10;

		[Tooltip("The cap for the item's value.")]
		public int maxCredits = 100;

		public override void OnNetworkSpawn()
		{
			((NetworkBehaviour)this).OnNetworkSpawn();
			addedCredits = SyncedEntry<int>.op_Implicit(RoR2Plugin.ModConfig.RollOfPenniesValueIncrease);
			maxCredits = SyncedEntry<int>.op_Implicit(RoR2Plugin.ModConfig.RollOfPenniesMaxValue);
		}

		public override void GrabItem()
		{
			base.GrabItem();
			ActivePennies.Add(this);
		}

		public void CheckDamagedPlayer(PlayerControllerB player)
		{
			if (!((Object)(object)player != (Object)(object)((GrabbableObject)this).playerHeldBy) && ((GrabbableObject)this).scrapValue < maxCredits)
			{
				AddCreditsServerRpc();
			}
		}

		[ServerRpc(RequireOwnership = false)]
		private void AddCreditsServerRpc()
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_008c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0096: Invalid comparison between Unknown and I4
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost))
				{
					ServerRpcParams val = default(ServerRpcParams);
					FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(3084010551u, val, (RpcDelivery)0);
					((NetworkBehaviour)this).__endSendServerRpc(ref val2, 3084010551u, val, (RpcDelivery)0);
				}
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost))
				{
					AddCreditsClientRpc();
				}
			}
		}

		[ClientRpc]
		private void AddCreditsClientRpc()
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_008c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0096: Invalid comparison between Unknown and I4
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost))
				{
					ClientRpcParams val = default(ClientRpcParams);
					FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(2286663356u, val, (RpcDelivery)0);
					((NetworkBehaviour)this).__endSendClientRpc(ref val2, 2286663356u, val, (RpcDelivery)0);
				}
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost))
				{
					((GrabbableObject)this).scrapValue = ((GrabbableObject)this).scrapValue + addedCredits;
					base.ScanNodeProperties.scrapValue = ((GrabbableObject)this).scrapValue;
					base.ScanNodeProperties.subText = $"Value: ${((GrabbableObject)this).scrapValue}";
				}
			}
		}

		public override void DiscardItem()
		{
			((GrabbableObject)this).DiscardItem();
			ActivePennies.Remove(this);
		}

		public override void OnNetworkDespawn()
		{
			ActivePennies.Remove(this);
			((NetworkBehaviour)this).OnNetworkDespawn();
		}

		public override void OnDestroy()
		{
			ActivePennies.Remove(this);
			((NetworkBehaviour)this).OnDestroy();
		}

		protected override void __initializeVariables()
		{
			base.__initializeVariables();
		}

		[RuntimeInitializeOnLoadMethod]
		internal static void InitializeRPCS_RollOfPennies()
		{
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Expected O, but got Unknown
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Expected O, but got Unknown
			NetworkManager.__rpc_func_table.Add(3084010551u, new RpcReceiveHandler(__rpc_handler_3084010551));
			NetworkManager.__rpc_func_table.Add(2286663356u, new RpcReceiveHandler(__rpc_handler_2286663356));
		}

		private static void __rpc_handler_3084010551(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
		{
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				target.__rpc_exec_stage = (__RpcExecStage)1;
				((RollOfPennies)(object)target).AddCreditsServerRpc();
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		private static void __rpc_handler_2286663356(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
		{
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				target.__rpc_exec_stage = (__RpcExecStage)2;
				((RollOfPennies)(object)target).AddCreditsClientRpc();
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		protected internal override string __getTypeName()
		{
			return "RollOfPennies";
		}
	}
	[AddComponentMenu("Lacrimosum/Safer Spaces")]
	public class SaferSpaces : ItemBehaviour
	{
		public static readonly List<SaferSpaces> ActiveSpaces = new List<SaferSpaces>();

		[Space(10f)]
		[Header("Safer Spaces Settings")]
		[Tooltip("The cooldown between each activation.")]
		public float cooldown = 3f;

		[Tooltip("A list of sounds to pick from when activated.")]
		public AudioClip[] activationSounds;

		[Tooltip("The sound to play when the cooldown ends.")]
		public AudioClip cooldownEndSound;

		[NonSerialized]
		public bool CanBlock = true;

		public override void OnNetworkSpawn()
		{
			((NetworkBehaviour)this).OnNetworkSpawn();
			cooldown = SyncedEntry<float>.op_Implicit(RoR2Plugin.ModConfig.SaferSpacesCooldown);
		}

		public override void GrabItem()
		{
			base.GrabItem();
			ActiveSpaces.Add(this);
			StartCooldown();
		}

		public bool IsPlayerHolding(PlayerControllerB player)
		{
			return (Object)(object)player == (Object)(object)((GrabbableObject)this).playerHeldBy;
		}

		public void PlaySound()
		{
			PlaySoundServerRpc();
		}

		[ServerRpc(RequireOwnership = false)]
		private void PlaySoundServerRpc()
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_008c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0096: Invalid comparison between Unknown and I4
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost))
				{
					ServerRpcParams val = default(ServerRpcParams);
					FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(4256016625u, val, (RpcDelivery)0);
					((NetworkBehaviour)this).__endSendServerRpc(ref val2, 4256016625u, val, (RpcDelivery)0);
				}
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost))
				{
					int index = Random.Range(0, activationSounds.Length);
					PlaySoundClientRpc(index);
				}
			}
		}

		[ClientRpc]
		private void PlaySoundClientRpc(int index)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_0099: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a3: Invalid comparison between Unknown and I4
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0071: Unknown result type (might be due to invalid IL or missing references)
			//IL_0089: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost))
				{
					ClientRpcParams val = default(ClientRpcParams);
					FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(1970247913u, val, (RpcDelivery)0);
					BytePacker.WriteValueBitPacked(val2, index);
					((NetworkBehaviour)this).__endSendClientRpc(ref val2, 1970247913u, val, (RpcDelivery)0);
				}
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost))
				{
					WalkieTalkie.TransmitOneShotAudio(base.AudioSource, activationSounds[index], 1f);
					base.AudioSource.PlayOneShot(activationSounds[index]);
				}
			}
		}

		public void StartCooldown()
		{
			CooldownServerRpc();
		}

		[ServerRpc(RequireOwnership = false)]
		private void CooldownServerRpc()
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_008c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0096: Invalid comparison between Unknown and I4
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost))
				{
					ServerRpcParams val = default(ServerRpcParams);
					FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(1450211957u, val, (RpcDelivery)0);
					((NetworkBehaviour)this).__endSendServerRpc(ref val2, 1450211957u, val, (RpcDelivery)0);
				}
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost))
				{
					CooldownClientRpc();
				}
			}
		}

		[ClientRpc]
		private void CooldownClientRpc()
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_008c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0096: Invalid comparison between Unknown and I4
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost))
				{
					ClientRpcParams val = default(ClientRpcParams);
					FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(2238259042u, val, (RpcDelivery)0);
					((NetworkBehaviour)this).__endSendClientRpc(ref val2, 2238259042u, val, (RpcDelivery)0);
				}
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost))
				{
					((MonoBehaviour)this).StartCoroutine(Cooldown());
				}
			}
		}

		private IEnumerator Cooldown()
		{
			((GrabbableObject)this).playerHeldBy.GetSaferSpacesBubble().SetActive(false);
			CanBlock = false;
			yield return (object)new WaitForSeconds(cooldown);
			((GrabbableObject)this).playerHeldBy.GetSaferSpacesBubble().SetActive(true);
			CanBlock = true;
			base.AudioSource.PlayOneShot(cooldownEndSound);
		}

		public override void DiscardItem()
		{
			((GrabbableObject)this).DiscardItem();
			ActiveSpaces.Remove(this);
			LastPlayerHeldBy.GetSaferSpacesBubble().SetActive(false);
			CanBlock = false;
		}

		public override void OnNetworkDespawn()
		{
			ActiveSpaces.Remove(this);
			LastPlayerHeldBy.GetSaferSpacesBubble().SetActive(false);
			CanBlock = false;
			((NetworkBehaviour)this).OnNetworkDespawn();
		}

		public override void OnDestroy()
		{
			ActiveSpaces.Remove(this);
			LastPlayerHeldBy.GetSaferSpacesBubble().SetActive(false);
			CanBlock = false;
			((NetworkBehaviour)this).OnDestroy();
		}

		protected override void __initializeVariables()
		{
			base.__initializeVariables();
		}

		[RuntimeInitializeOnLoadMethod]
		internal static void InitializeRPCS_SaferSpaces()
		{
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Expected O, but got Unknown
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Expected O, but got Unknown
			//IL_0047: Unknown result type (might be due to invalid IL or missing references)
			//IL_0051: Expected O, but got Unknown
			//IL_0062: Unknown result type (might be due to invalid IL or missing references)
			//IL_006c: Expected O, but got Unknown
			NetworkManager.__rpc_func_table.Add(4256016625u, new RpcReceiveHandler(__rpc_handler_4256016625));
			NetworkManager.__rpc_func_table.Add(1970247913u, new RpcReceiveHandler(__rpc_handler_1970247913));
			NetworkManager.__rpc_func_table.Add(1450211957u, new RpcReceiveHandler(__rpc_handler_1450211957));
			NetworkManager.__rpc_func_table.Add(2238259042u, new RpcReceiveHandler(__rpc_handler_2238259042));
		}

		private static void __rpc_handler_4256016625(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
		{
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				target.__rpc_exec_stage = (__RpcExecStage)1;
				((SaferSpaces)(object)target).PlaySoundServerRpc();
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		private static void __rpc_handler_1970247913(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
		{
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				int index = default(int);
				ByteUnpacker.ReadValueBitPacked(reader, ref index);
				target.__rpc_exec_stage = (__RpcExecStage)2;
				((SaferSpaces)(object)target).PlaySoundClientRpc(index);
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		private static void __rpc_handler_1450211957(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
		{
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				target.__rpc_exec_stage = (__RpcExecStage)1;
				((SaferSpaces)(object)target).CooldownServerRpc();
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		private static void __rpc_handler_2238259042(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
		{
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				target.__rpc_exec_stage = (__RpcExecStage)2;
				((SaferSpaces)(object)target).CooldownClientRpc();
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		protected internal override string __getTypeName()
		{
			return "SaferSpaces";
		}
	}
	[AddComponentMenu("Lacrimosum/Throwable Item Behaviour")]
	public class ThrowableItemBehaviour : ItemBehaviour
	{
		[Space(10f)]
		[Header("Throw Curve Settings")]
		public AnimationCurve itemFallCurve;

		public AnimationCurve itemVerticalFallCurveNoBounce;

		protected bool WasThrown;

		private RaycastHit _itemHit;

		private Ray _itemThrowRay;

		private const int StunGrenadeMask = 268437761;

		public override void ItemActivate(bool used, bool buttonDown = true)
		{
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			((GrabbableObject)this).ItemActivate(used, buttonDown);
			if (((NetworkBehaviour)this).IsOwner)
			{
				((GrabbableObject)this).playerHeldBy.DiscardHeldObject(true, (NetworkObject)null, GetGrenadeThrowDestination(), true);
				WasThrown = true;
			}
		}

		public override void FallWithCurve()
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_0041: Unknown result type (might be due to invalid IL or missing references)
			//IL_005b: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_007e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0084: Unknown result type (might be due to invalid IL or missing references)
			//IL_009a: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cb: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fb: Unknown result type (might be due to invalid IL or missing references)
			//IL_0105: Unknown result type (might be due to invalid IL or missing references)
			//IL_0136: Unknown result type (might be due to invalid IL or missing references)
			Vector3 val = ((GrabbableObject)this).startFallingPosition - ((GrabbableObject)this).targetFloorPosition;
			float magnitude = ((Vector3)(ref val)).magnitude;
			((Component)this).transform.rotation = Quaternion.Lerp(((Component)this).transform.rotation, Quaternion.Euler(((GrabbableObject)this).itemProperties.restingRotation.x, ((Component)this).transform.eulerAngles.y, ((GrabbableObject)this).itemProperties.restingRotation.z), 14f * Time.deltaTime / magnitude);
			((Component)this).transform.localPosition = Vector3.Lerp(((GrabbableObject)this).startFallingPosition, ((GrabbableObject)this).targetFloorPosition, itemFallCurve.Evaluate(((GrabbableObject)this).fallTime));
			((Component)this).transform.localPosition = Vector3.Lerp(new Vector3(((Component)this).transform.localPosition.x, ((GrabbableObject)this).startFallingPosition.y, ((Component)this).transform.localPosition.z), new Vector3(((Component)this).transform.localPosition.x, ((GrabbableObject)this).targetFloorPosition.y, ((Component)this).transform.localPosition.z), (magnitude > 5f) ? itemVerticalFallCurveNoBounce.Evaluate(((GrabbableObject)this).fallTime) : itemFallCurve.Evaluate(((GrabbableObject)this).fallTime));
			((GrabbableObject)this).fallTime = ((GrabbableObject)this).fallTime + Mathf.Abs(Time.deltaTime * 12f / magnitude);
		}

		private Vector3 GetGrenadeThrowDestination()
		{
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: 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_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0064: Unknown result type (might be due to invalid IL or missing references)
			//IL_0069: Unknown result type (might be due to invalid IL or missing references)
			//IL_006f: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ba: 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)
			//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)
			//IL_00d1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d2: 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)
			//IL_00e2: Unknown result type (might be due to invalid IL or missing references)
			//IL_012a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0105: Unknown result type (might be due to invalid IL or missing references)
			//IL_010a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0114: Unknown result type (might be due to invalid IL or missing references)
			//IL_0119: Unknown result type (might be due to invalid IL or missing references)
			Debug.DrawRay(((Component)((GrabbableObject)this).playerHeldBy.gameplayCamera).transform.position, ((Component)((GrabbableObject)this).playerHeldBy.gameplayCamera).transform.forward, Color.yellow, 15f);
			_itemThrowRay = new Ray(((Component)((GrabbableObject)this).playerHeldBy.gameplayCamera).transform.position, ((Component)((GrabbableObject)this).playerHeldBy.gameplayCamera).transform.forward);
			Vector3 val = ((!Physics.Raycast(_itemThrowRay, ref _itemHit, 12f, 268437761, (QueryTriggerInteraction)1)) ? ((Ray)(ref _itemThrowRay)).GetPoint(10f) : ((Ray)(ref _itemThrowRay)).GetPoint(((RaycastHit)(ref _itemHit)).distance - 0.05f));
			Debug.DrawRay(val, Vector3.down, Color.blue, 15f);
			_itemThrowRay = new Ray(val, Vector3.down);
			if (Physics.Raycast(_itemThrowRay, ref _itemHit, 30f, 268437761, (QueryTriggerInteraction)1))
			{
				return ((RaycastHit)(ref _itemHit)).point + Vector3.up * 0.05f;
			}
			return ((Ray)(ref _itemThrowRay)).GetPoint(30f);
		}

		public override void DiscardItem()
		{
			if ((Object)(object)((GrabbableObject)this).playerHeldBy != (Object)null)
			{
				((GrabbableObject)this).playerHeldBy.equippedUsableItemQE = false;
			}
			((GrabbableObject)this).isBeingUsed = false;
			((GrabbableObject)this).DiscardItem();
		}

		public override void PocketItem()
		{
			if ((Object)(object)((GrabbableObject)this).playerHeldBy != (Object)null)
			{
				((GrabbableObject)this).playerHeldBy.equippedUsableItemQE = false;
			}
			((GrabbableObject)this).isBeingUsed = false;
			((GrabbableObject)this).PocketItem();
		}

		public override void EquipItem()
		{
			((GrabbableObject)this).EquipItem();
			((GrabbableObject)this).playerHeldBy.equippedUsableItemQE = true;
		}

		public override void GrabItem()
		{
			base.GrabItem();
			WasThrown = false;
		}

		protected override void __initializeVariables()
		{
			base.__initializeVariables();
		}

		protected internal override string __getTypeName()
		{
			return "ThrowableItemBehaviour";
		}
	}
	[AddComponentMenu("Lacrimosum/Ukulele")]
	public class Ukulele : ItemBehaviour
	{
		public int shovelHitForce = 1;

		public bool reelingUp;

		public bool isHoldingButton;

		private RaycastHit _rayHit;

		private Coroutine _reelingUpCoroutine;

		private RaycastHit[] _objectsHitByShovel;

		private List<RaycastHit> _objectsHitByShovelList = new List<RaycastHit>();

		public AudioClip reelUp;

		public AudioClip swing;

		[FormerlySerializedAs("hitSFX")]
		public AudioClip[] hitSfx;

		public AudioSource shovelAudio;

		private PlayerControllerB _previousPlayerHeldBy;

		private const int ShovelMask = 1084754248;

		[Header("Ukulele Settings")]
		[Tooltip("The particles to play when the ukulele hits something")]
		public ParticleSystem zapEffect;

		public override void ItemActivate(bool used, bool buttonDown = true)
		{
			if ((Object)(object)((GrabbableObject)this).playerHeldBy == (Object)null)
			{
				return;
			}
			isHoldingButton = buttonDown;
			if (!reelingUp && buttonDown)
			{
				reelingUp = true;
				_previousPlayerHeldBy = ((GrabbableObject)this).playerHeldBy;
				if (_reelingUpCoroutine != null)
				{
					((MonoBehaviour)this).StopCoroutine(_reelingUpCoroutine);
				}
				_reelingUpCoroutine = ((MonoBehaviour)this).StartCoroutine(ReelUpShovel());
			}
		}

		private IEnumerator ReelUpShovel()
		{
			((GrabbableObject)this).playerHeldBy.activatingItem = true;
			((GrabbableObject)this).playerHeldBy.twoHanded = true;
			((GrabbableObject)this).playerHeldBy.playerBodyAnimator.ResetTrigger("shovelHit");
			((GrabbableObject)this).playerHeldBy.playerBodyAnimator.SetBool("reelingUp", true);
			shovelAudio.PlayOneShot(reelUp);
			ReelUpSfxServerRpc();
			yield return (object)new WaitForSeconds(0.35f);
			yield return (object)new WaitUntil((Func<bool>)(() => !isHoldingButton));
			SwingShovel(!((GrabbableObject)this).isHeld);
			yield return (object)new WaitForSeconds(0.13f);
			yield return (object)new WaitForEndOfFrame();
			HitShovel(!((GrabbableObject)this).isHeld);
			yield return (object)new WaitForSeconds(0.3f);
			reelingUp = false;
			_reelingUpCoroutine = null;
		}

		[ServerRpc]
		public void ReelUpSfxServerRpc()
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_00d2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00dc: Invalid comparison between Unknown and I4
			//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c2: Unknown result type (might be due to invalid IL or missing references)
			//IL_007a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0084: Invalid comparison between Unknown and I4
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager == null || !networkManager.IsListening)
			{
				return;
			}
			if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost))
			{
				if (((NetworkBehaviour)this).OwnerClientId != networkManager.LocalClientId)
				{
					if ((int)networkManager.LogLevel <= 1)
					{
						Debug.LogError((object)"Only the owner can invoke a ServerRpc that requires ownership!");
					}
					return;
				}
				ServerRpcParams val = default(ServerRpcParams);
				FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(865132708u, val, (RpcDelivery)0);
				((NetworkBehaviour)this).__endSendServerRpc(ref val2, 865132708u, val, (RpcDelivery)0);
			}
			if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost))
			{
				ReelUpSfxClientRpc();
			}
		}

		[ClientRpc]
		public void ReelUpSfxClientRpc()
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_008c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0096: Invalid comparison between Unknown and I4
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost))
				{
					ClientRpcParams val = default(ClientRpcParams);
					FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(3368577286u, val, (RpcDelivery)0);
					((NetworkBehaviour)this).__endSendClientRpc(ref val2, 3368577286u, val, (RpcDelivery)0);
				}
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost))
				{
					shovelAudio.PlayOneShot(reelUp);
				}
			}
		}

		public override void DiscardItem()
		{
			if ((Object)(object)((GrabbableObject)this).playerHeldBy != (Object)null)
			{
				((GrabbableObject)this).playerHeldBy.activatingItem = false;
			}
			((GrabbableObject)this).DiscardItem();
		}

		public void SwingShovel(bool cancel = false)
		{
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			_previousPlayerHeldBy.playerBodyAnimator.SetBool("reelingUp", false);
			if (!cancel)
			{
				shovelAudio.PlayOneShot(swing);
				_previousPlayerHeldBy.UpdateSpecialAnimationValue(true, (short)((Component)_previousPlayerHeldBy).transform.localEulerAngles.y, 0.4f, false);
			}
		}

		public void HitShovel(bool cancel = false)
		{
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			//IL_0065: Unknown result type (might be due to invalid IL or missing references)
			//IL_006f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0074: Unknown result type (might be due to invalid IL or missing references)
			//IL_008e: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fd: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ff: Unknown result type (might be due to invalid IL or missing references)
			//IL_0101: Unknown result type (might be due to invalid IL or missing references)
			//IL_035d: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ae: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b0: Unknown result type (might be due to invalid IL or missing references)
			//IL_011a: Unknown result type (might be due to invalid IL or missing references)
			//IL_011c: Unknown result type (might be due to invalid IL or missing references)
			//IL_02c2: Unknown result type (might be due to invalid IL or missing references)
			//IL_02c4: Unknown result type (might be due to invalid IL or missing references)
			//IL_0136: Unknown result type (might be due to invalid IL or missing references)
			//IL_0138: 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_014f: Unknown result type (might be due to invalid IL or missing references)
			//IL_016d: Unknown result type (might be due to invalid IL or missing references)
			//IL_016f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0173: Unknown result type (might be due to invalid IL or missing references)
			//IL_0178: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e1: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e6: 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_019b: Unknown result type (might be due to invalid IL or missing references)
			//IL_019f: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a4: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a8: Unknown result type (might be due to invalid IL or missing references)
			//IL_01be: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e8: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ea: Unknown result type (might be due to invalid IL or missing references)
			//IL_0226: Unknown result type (might be due to invalid IL or missing references)
			//IL_0228: Unknown result type (might be due to invalid IL or missing references)
			//IL_0251: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)_previousPlayerHeldBy == (Object)null)
			{
				Debug.LogError((object)"Previousplayerheldby is null on this client when HitShovel is called.");
				return;
			}
			_previousPlayerHeldBy.activatingItem = false;
			bool flag = false;
			bool flag2 = false;
			bool flag3 = false;
			int num = -1;
			if (!cancel)
			{
				_previousPlayerHeldBy.twoHanded = false;
				_objectsHitByShovel = Physics.SphereCastAll(((Component)_previousPlayerHeldBy.gameplayCamera).transform.position + ((Component)_previousPlayerHeldBy.gameplayCamera).transform.right * -0.35f, 0.8f, ((Component)_previousPlayerHeldBy.gameplayCamera).transform.forward, 1.5f, 1084754248, (QueryTriggerInteraction)2);
				_objectsHitByShovelList = _objectsHitByShovel.OrderBy((RaycastHit x) => ((RaycastHit)(ref x)).distance).ToList();
				List<EnemyAI> list = new List<EnemyAI>();
				IHittable val2 = default(IHittable);
				foreach (RaycastHit objectsHitByShovel in _objectsHitByShovelList)
				{
					RaycastHit val = objectsHitByShovel;
					if (((Component)((RaycastHit)(ref val)).transform).gameObject.layer != 8)
					{
						val = objectsHitByShovel;
						if (((Component)((RaycastHit)(ref val)).transform).gameObject.layer != 11)
						{
							val = objectsHitByShovel;
							if (!((Component)((RaycastHit)(ref val)).transform).TryGetComponent<IHittable>(ref val2))
							{
								continue;
							}
							val = objectsHitByShovel;
							if ((Object)(object)((RaycastHit)(ref val)).transform == (Object)(object)((Component)_previousPlayerHeldBy).transform)
							{
								continue;
							}
							val = objectsHitByShovel;
							if (!(((RaycastHit)(ref val)).point == Vector3.zero))
							{
								Vector3 position = ((Component)_previousPlayerHeldBy.gameplayCamera).transform.position;
								val = objectsHitByShovel;
								Vector3 point = ((RaycastHit)(ref val)).point;
								RaycastHit val3 = default(RaycastHit);
								int collidersAndRoomMaskAndDefault = StartOfRound.Instance.collidersAndRoomMaskAndDefault;
								if (Physics.Linecast(position, point, ref val3, collidersAndRoomMaskAndDefault, (QueryTriggerInteraction)1))
								{
									continue;
								}
							}
							flag = true;
							Vector3 forward = ((Component)_previousPlayerHeldBy.gameplayCamera).transform.forward;
							try
							{
								val = objectsHitByShovel;
								EnemyAICollisionDetect component = ((Component)((RaycastHit)(ref val)).transform).GetComponent<EnemyAICollisionDetect>();
								if (Object.op_Implicit((Object)(object)component))
								{
									if (Object.op_Implicit((Object)(object)component.mainScript) && !list.Contains(component.mainScript))
									{
										goto IL_0249;
									}
									continue;
								}
								val = objectsHitByShovel;
								if (!Object.op_Implicit((Object)(object)((Component)((RaycastHit)(ref val)).transform).GetComponent<PlayerControllerB>()))
								{
									goto IL_0249;
								}
								if (!flag3)
								{
									flag3 = true;
									goto IL_0249;
								}
								goto end_IL_01e8;
								IL_0249:
								bool flag4 = val2.Hit(shovelHitForce, forward, _previousPlayerHeldBy, true, 1);
								if (flag4 && (Object)(object)component != (Object)null)
								{
									list.Add(component.mainScript);
								}
								if (!flag2)
								{
									flag2 = flag4;
								}
								end_IL_01e8:;
							}
							ca