Decompiled source of SCPequipment v1.0.0

Amnestics.dll

Decompiled 9 hours ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Serialization;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using Amnestics.Behaviour;
using Amnestics.Misc;
using Amnestics.NetcodePatcher;
using Amnestics.Util;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using CSync.Extensions;
using CSync.Lib;
using CustomItemBehaviourLibrary.AbstractItems;
using HarmonyLib;
using LethalLib.Modules;
using Microsoft.CodeAnalysis;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.0.0.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 Amnestics
{
	[BepInPlugin("com.github.WhiteSpike.Amnestics", "Amnestics", "1.0.0")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	public class Plugin : BaseUnityPlugin
	{
		internal static readonly Harmony harmony = new Harmony("com.github.WhiteSpike.Amnestics");

		internal static readonly ManualLogSource mls = Logger.CreateLogSource("Amnestics");

		public static PluginConfig Config;

		private void Awake()
		{
			//IL_017a: Unknown result type (might be due to invalid IL or missing references)
			//IL_017f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0195: Unknown result type (might be due to invalid IL or missing references)
			//IL_019a: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b0: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b5: Unknown result type (might be due to invalid IL or missing references)
			Config = new PluginConfig(((BaseUnityPlugin)this).Config);
			IEnumerable<Type> enumerable;
			try
			{
				enumerable = Assembly.GetExecutingAssembly().GetTypes();
			}
			catch (ReflectionTypeLoadException ex)
			{
				enumerable = ex.Types.Where((Type t) => t != null);
			}
			foreach (Type item in enumerable)
			{
				MethodInfo[] methods = item.GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic);
				MethodInfo[] array = methods;
				foreach (MethodInfo methodInfo in array)
				{
					object[] customAttributes = methodInfo.GetCustomAttributes(typeof(RuntimeInitializeOnLoadMethodAttribute), inherit: false);
					if (customAttributes.Length != 0)
					{
						methodInfo.Invoke(null, null);
					}
				}
			}
			string text = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "amnestics");
			AssetBundle val = AssetBundle.LoadFromFile(text);
			string text2 = "Assets/Amnestics/";
			Item val2 = ScriptableObject.CreateInstance<Item>();
			((Object)val2).name = "amnesticsItemProperties";
			val2.allowDroppingAheadOfPlayer = SyncedEntry<bool>.op_Implicit(Config.DROP_AHEAD_PLAYER);
			val2.canBeGrabbedBeforeGameStart = SyncedEntry<bool>.op_Implicit(Config.GRABBED_BEFORE_START);
			val2.canBeInspected = false;
			val2.creditsWorth = SyncedEntry<int>.op_Implicit(Config.PRICE);
			val2.verticalOffset = 0.04f;
			val2.restingRotation = new Vector3(-90f, 0f, 0f);
			val2.rotationOffset = new Vector3(0f, 90f, 0f);
			val2.positionOffset = new Vector3(0f, 0.12f, 0.02f);
			val2.weight = 0.99f + (float)(SyncedEntry<int>.op_Implicit(Config.WEIGHT) - 1) / 100f;
			val2.twoHanded = false;
			val2.itemIcon = val.LoadAsset<Sprite>(text2 + "Icon.png");
			val2.spawnPrefab = val.LoadAsset<GameObject>(text2 + "Amnestics.prefab");
			val2.dropSFX = val.LoadAsset<AudioClip>(text2 + "Drop.ogg");
			val2.grabSFX = val.LoadAsset<AudioClip>(text2 + "Grab.ogg");
			val2.pocketSFX = val.LoadAsset<AudioClip>(text2 + "Pocket.ogg");
			val2.throwSFX = val.LoadAsset<AudioClip>(text2 + "Throw.ogg");
			val2.highestSalePercentage = SyncedEntry<int>.op_Implicit(Config.HIGHEST_SALE_PERCENTAGE);
			val2.itemName = "Amnestics";
			val2.itemSpawnsOnGround = true;
			val2.isConductiveMetal = SyncedEntry<bool>.op_Implicit(Config.CONDUCTIVE);
			val2.requiresBattery = false;
			val2.batteryUsage = 0f;
			AmnesticsBehaviour amnesticsBehaviour = val2.spawnPrefab.AddComponent<AmnesticsBehaviour>();
			((GrabbableObject)amnesticsBehaviour).itemProperties = val2;
			((GrabbableObject)amnesticsBehaviour).grabbable = true;
			((GrabbableObject)amnesticsBehaviour).grabbableToEnemies = true;
			NetworkPrefabs.RegisterNetworkPrefab(val2.spawnPrefab);
			TerminalNode val3 = SetupInfoNode();
			Items.RegisterShopItem(val2, (TerminalNode)null, (TerminalNode)null, val3, val2.creditsWorth);
			mls.LogInfo((object)"Amnestics 1.0.0 has been loaded successfully.");
		}

		internal static TerminalNode SetupInfoNode()
		{
			TerminalNode val = ScriptableObject.CreateInstance<TerminalNode>();
			val.displayText = val.displayText + GetDisplayInfo() + "\n";
			val.clearPreviousText = true;
			return val;
		}

		public static string GetDisplayInfo()
		{
			return "Recharges items' battery life when interacting";
		}
	}
	public static class PluginInfo
	{
		public const string PLUGIN_GUID = "Amnestics";

		public const string PLUGIN_NAME = "Amnestics";

		public const string PLUGIN_VERSION = "1.0.0";
	}
}
namespace Amnestics.Util
{
	internal static class Constants
	{
		internal const string ITEM_SCAN_NODE_KEY_FORMAT = "Enable scan node of {0}";

		internal const bool ITEM_SCAN_NODE_DEFAULT = true;

		internal const string ITEM_SCAN_NODE_DESCRIPTION = "Shows a scan node on the item when scanning";

		internal const string AMNESTICS_PRICE_KEY = "Amnestics price";

		internal const int AMNESTICS_PRICE_DEFAULT = 50;

		internal const string AMNESTICS_PRICE_DESCRIPTION = "Price for Amnestics.";

		internal const string AMNESTICS_WEIGHT_KEY = "Item weight";

		internal const int AMNESTICS_WEIGHT_DEFAULT = 5;

		internal const string AMNESTICS_WEIGHT_DESCRIPTION = "Weight (in lbs)";

		internal const string AMNESTICS_TWO_HANDED_KEY = "Two Handed Item";

		internal const bool AMNESTICS_TWO_HANDED_DEFAULT = true;

		internal const string AMNESTICS_TWO_HANDED_DESCRIPTION = "One or two handed item.";

		internal const string AMNESTICS_CONDUCTIVE_KEY = "Conductive";

		internal const bool AMNESTICS_CONDUCTIVE_DEFAULT = true;

		internal const string AMNESTICS_CONDUCTIVE_DESCRIPTION = "Wether it attracts lightning to the item or not. (Or other mechanics that rely on item being conductive)";

		internal const string AMNESTICS_DROP_AHEAD_PLAYER_KEY = "Drop ahead of player when dropping";

		internal const bool AMNESTICS_DROP_AHEAD_PLAYER_DEFAULT = false;

		internal const string AMNESTICS_DROP_AHEAD_PLAYER_DESCRIPTION = "If on, the item will drop infront of the player. Otherwise, drops underneath them and slightly infront.";

		internal const string AMNESTICS_GRABBED_BEFORE_START_KEY = "Grabbable before game start";

		internal const bool AMNESTICS_GRABBED_BEFORE_START_DEFAULT = false;

		internal const string AMNESTICS_GRABBED_BEFORE_START_DESCRIPTION = "Allows wether the item can be grabbed before hand or not";

		internal const string AMNESTICS_HIGHEST_SALE_PERCENTAGE_KEY = "Highest Sale Percentage";

		internal const int AMNESTICS_HIGHEST_SALE_PERCENTAGE_DEFAULT = 50;

		internal const string AMNESTICS_HIGHEST_SALE_PERCENTAGE_DESCRIPTION = "Maximum percentage of sale allowed when this item is selected for a sale.";

		internal const string AMNESTICS_USAGES_KEY = "Recharge Usages";

		internal const int AMNESTICS_USAGES_DEFAULT = 1;

		internal const string AMNESTICS_USAGES_DESCRIPTION = "Amount of times the item can be used to recharge your sanity";

		internal const string AMNESTICS_RECHARGE_PERCENTAGE_KEY = "Recharge Percentage";

		internal const int AMNESTICS_RECHARGE_PERCENTAGE_DEFAULT = 100;

		internal const string AMNESTICS_RECHARGE_PERCENTAGE_DESCRIPTION = "Amount (%) of sanity recharge it provides to the item when used";

		internal const string AMNESTICS_RECHARGE_OVERTIME_KEY = "Recharge over time";

		internal const float AMNESTICS_RECHARGE_OVERTIME_DEFAULT = 10f;

		internal const string AMNESTICS_RECHARGE_OVERTIME_DESCRIPTION = "Amount of time (in seconds) where you replenish sanity after consuming the item.";

		internal const string AMNESTICS_RECHARGE_OVERTIME_RATE_KEY = "Recharge overtime rate";

		internal const float AMNESTICS_RECHARGE_OVERTIME_RATE_DEFAULT = 3f;

		internal const string AMNESTICS_RECHARGE_OVERTIME_RATE_DESCRIPTION = "Rate of which you gain sanity after consuming the item during the recharge over time buff";

		internal const string AMNESTICS_DESTROY_KEY = "Destroy Item when Exausted";

		internal const bool AMNESTICS_DESTROY_DEFAULT = true;

		internal const string AMNESTICS_DESTROY_DESCRIPTION = "When you can no longer recharge sanity with the ammnestics, the ammnestics get cleared from your inventory";

		internal static readonly string AMNESTICS_SCAN_NODE_KEY = string.Format("Enable scan node of {0}", "Amnestics");
	}
}
namespace Amnestics.Misc
{
	[DataContract]
	public class PluginConfig : SyncedConfig2<PluginConfig>
	{
		[field: SyncedEntryField]
		public SyncedEntry<bool> SCAN_NODE { get; set; }

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

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

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

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

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

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

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

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

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

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

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

		public PluginConfig(ConfigFile cfg)
			: base("com.github.WhiteSpike.Amnestics")
		{
			string text = "Amnestics";
			PRICE = SyncedBindingExtensions.BindSyncedEntry<int>(cfg, text, "Amnestics price", 50, "Price for Amnestics.");
			WEIGHT = SyncedBindingExtensions.BindSyncedEntry<int>(cfg, text, "Item weight", 5, "Weight (in lbs)");
			SCAN_NODE = SyncedBindingExtensions.BindSyncedEntry<bool>(cfg, text, Constants.AMNESTICS_SCAN_NODE_KEY, true, "Shows a scan node on the item when scanning");
			DROP_AHEAD_PLAYER = SyncedBindingExtensions.BindSyncedEntry<bool>(cfg, text, "Drop ahead of player when dropping", false, "If on, the item will drop infront of the player. Otherwise, drops underneath them and slightly infront.");
			CONDUCTIVE = SyncedBindingExtensions.BindSyncedEntry<bool>(cfg, text, "Conductive", true, "Wether it attracts lightning to the item or not. (Or other mechanics that rely on item being conductive)");
			GRABBED_BEFORE_START = SyncedBindingExtensions.BindSyncedEntry<bool>(cfg, text, "Grabbable before game start", false, "Allows wether the item can be grabbed before hand or not");
			HIGHEST_SALE_PERCENTAGE = SyncedBindingExtensions.BindSyncedEntry<int>(cfg, text, "Highest Sale Percentage", 50, "Maximum percentage of sale allowed when this item is selected for a sale.");
			USAGES = SyncedBindingExtensions.BindSyncedEntry<int>(cfg, text, "Recharge Usages", 1, "Amount of times the item can be used to recharge your sanity");
			RECHARGE_PERCENTAGE = SyncedBindingExtensions.BindSyncedEntry<int>(cfg, text, "Recharge Percentage", 100, "Amount (%) of sanity recharge it provides to the item when used");
			RECHARGE_OVERTIME = SyncedBindingExtensions.BindSyncedEntry<float>(cfg, text, "Recharge over time", 10f, "Amount of time (in seconds) where you replenish sanity after consuming the item.");
			RECHARGE_OVERTIME_RATE = SyncedBindingExtensions.BindSyncedEntry<float>(cfg, text, "Recharge overtime rate", 3f, "Rate of which you gain sanity after consuming the item during the recharge over time buff");
			DESTROY = SyncedBindingExtensions.BindSyncedEntry<bool>(cfg, text, "Destroy Item when Exausted", true, "When you can no longer recharge sanity with the ammnestics, the ammnestics get cleared from your inventory");
			ConfigManager.Register<PluginConfig>((SyncedConfig2<PluginConfig>)this);
		}
	}
	internal static class Metadata
	{
		public const string GUID = "com.github.WhiteSpike.Amnestics";

		public const string NAME = "Amnestics";

		public const string VERSION = "1.0.0";
	}
}
namespace Amnestics.Behaviour
{
	internal class AmnesticsBehaviour : ReplenishSanityBehaviour
	{
		internal const string ITEM_NAME = "Amnestics";

		protected bool KeepScanNode => SyncedEntry<bool>.op_Implicit(Plugin.Config.SCAN_NODE);

		public override void Start()
		{
			((GrabbableObject)this).Start();
			if (!KeepScanNode)
			{
				Object.Destroy((Object)(object)((Component)this).gameObject.GetComponentInChildren<ScanNodeProperties>());
			}
			base.rechargeUsages = SyncedEntry<int>.op_Implicit(Plugin.Config.USAGES);
			base.sanityReplenish = (float)SyncedEntry<int>.op_Implicit(Plugin.Config.RECHARGE_PERCENTAGE) / 100f;
			base.sanityOvertime = SyncedEntry<float>.op_Implicit(Plugin.Config.RECHARGE_OVERTIME);
			base.sanityOvertimeReplenish = SyncedEntry<float>.op_Implicit(Plugin.Config.RECHARGE_OVERTIME_RATE);
			base.destroyUponExaustion = SyncedEntry<bool>.op_Implicit(Plugin.Config.DESTROY);
		}

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

		protected internal override string __getTypeName()
		{
			return "AmnesticsBehaviour";
		}
	}
}
namespace System.Runtime.CompilerServices
{
	[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]
	internal sealed class IgnoresAccessChecksToAttribute : Attribute
	{
		public IgnoresAccessChecksToAttribute(string assemblyName)
		{
		}
	}
}
namespace Amnestics.NetcodePatcher
{
	[AttributeUsage(AttributeTargets.Module)]
	internal class NetcodePatchedAssemblyAttribute : Attribute
	{
	}
}

Batteries.dll

Decompiled 9 hours ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Serialization;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using Batteries.Behaviour;
using Batteries.Misc;
using Batteries.NetcodePatcher;
using Batteries.Util;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Configuration;
using BepInEx.Logging;
using CSync.Extensions;
using CSync.Lib;
using CustomItemBehaviourLibrary.AbstractItems;
using CustomItemBehaviourLibrary.Compatibility;
using HarmonyLib;
using LethalLib.Modules;
using Microsoft.CodeAnalysis;
using MoreShipUpgrades.UpgradeComponents.TierUpgrades.Player;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.0.0.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 CustomItemBehaviourLibrary.Compatibility
{
	internal static class LategameCompatibility
	{
		public static bool Enabled => Chainloader.PluginInfos.ContainsKey("com.malco.lethalcompany.moreshipupgrades");

		public static float GetGrabDistance()
		{
			return MechanicalArms.GetIncreasedGrabDistance(GameNetworkManager.Instance.localPlayerController.grabDistance);
		}
	}
}
namespace Batteries
{
	[BepInPlugin("com.github.WhiteSpike.Batteries", "Batteries", "1.0.0")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	public class Plugin : BaseUnityPlugin
	{
		internal static readonly Harmony harmony = new Harmony("com.github.WhiteSpike.Batteries");

		internal static readonly ManualLogSource mls = Logger.CreateLogSource("Batteries");

		public static PluginConfig Config;

		private void Awake()
		{
			//IL_016e: 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_0189: Unknown result type (might be due to invalid IL or missing references)
			//IL_018e: 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_01a9: Unknown result type (might be due to invalid IL or missing references)
			Config = new PluginConfig(((BaseUnityPlugin)this).Config);
			IEnumerable<Type> enumerable;
			try
			{
				enumerable = Assembly.GetExecutingAssembly().GetTypes();
			}
			catch (ReflectionTypeLoadException ex)
			{
				enumerable = ex.Types.Where((Type t) => t != null);
			}
			foreach (Type item in enumerable)
			{
				MethodInfo[] methods = item.GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic);
				MethodInfo[] array = methods;
				foreach (MethodInfo methodInfo in array)
				{
					object[] customAttributes = methodInfo.GetCustomAttributes(typeof(RuntimeInitializeOnLoadMethodAttribute), inherit: false);
					if (customAttributes.Length != 0)
					{
						methodInfo.Invoke(null, null);
					}
				}
			}
			string text = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "batteries");
			AssetBundle val = AssetBundle.LoadFromFile(text);
			string text2 = "Assets/Batteries/";
			Item val2 = ScriptableObject.CreateInstance<Item>();
			((Object)val2).name = "batteriesItemProperties";
			val2.allowDroppingAheadOfPlayer = SyncedEntry<bool>.op_Implicit(Config.DROP_AHEAD_PLAYER);
			val2.canBeGrabbedBeforeGameStart = SyncedEntry<bool>.op_Implicit(Config.GRABBED_BEFORE_START);
			val2.canBeInspected = false;
			val2.creditsWorth = SyncedEntry<int>.op_Implicit(Config.PRICE);
			val2.restingRotation = new Vector3(0f, 0f, 0f);
			val2.rotationOffset = new Vector3(0f, 0f, 180f);
			val2.positionOffset = new Vector3(0f, 0.15f, -0.04f);
			val2.weight = 0.99f + (float)(SyncedEntry<int>.op_Implicit(Config.WEIGHT) - 1) / 100f;
			val2.twoHanded = false;
			val2.itemIcon = val.LoadAsset<Sprite>(text2 + "Icon.png");
			val2.spawnPrefab = val.LoadAsset<GameObject>(text2 + "Battery.prefab");
			val2.dropSFX = val.LoadAsset<AudioClip>(text2 + "Drop.ogg");
			val2.grabSFX = val.LoadAsset<AudioClip>(text2 + "Grab.ogg");
			val2.pocketSFX = val.LoadAsset<AudioClip>(text2 + "Pocket.ogg");
			val2.throwSFX = val.LoadAsset<AudioClip>(text2 + "Throw.ogg");
			val2.highestSalePercentage = SyncedEntry<int>.op_Implicit(Config.HIGHEST_SALE_PERCENTAGE);
			val2.itemName = "Batteries";
			val2.itemSpawnsOnGround = true;
			val2.isConductiveMetal = SyncedEntry<bool>.op_Implicit(Config.CONDUCTIVE);
			val2.requiresBattery = false;
			val2.batteryUsage = 0f;
			BatteriesBehaviour batteriesBehaviour = val2.spawnPrefab.AddComponent<BatteriesBehaviour>();
			((GrabbableObject)batteriesBehaviour).itemProperties = val2;
			((GrabbableObject)batteriesBehaviour).grabbable = true;
			((GrabbableObject)batteriesBehaviour).grabbableToEnemies = true;
			NetworkPrefabs.RegisterNetworkPrefab(val2.spawnPrefab);
			TerminalNode val3 = SetupInfoNode();
			Items.RegisterShopItem(val2, (TerminalNode)null, (TerminalNode)null, val3, val2.creditsWorth);
			Item val4 = Object.Instantiate<Item>(val2);
			((Object)val4).name = "scrapBatteriesItemProperties";
			val4.isScrap = true;
			val4.minValue = SyncedEntry<int>.op_Implicit(Config.MINIMUM_SCRAP_VALUE);
			val4.maxValue = SyncedEntry<int>.op_Implicit(Config.MAXIMUM_SCRAP_VALUE);
			val4.itemName = "Scrap Batteries";
			val4.spawnPrefab = val.LoadAsset<GameObject>(text2 + "ScrapBattery.prefab");
			batteriesBehaviour = val4.spawnPrefab.AddComponent<BatteriesBehaviour>();
			((GrabbableObject)batteriesBehaviour).itemProperties = val4;
			((GrabbableObject)batteriesBehaviour).grabbable = true;
			((GrabbableObject)batteriesBehaviour).grabbableToEnemies = true;
			NetworkPrefabs.RegisterNetworkPrefab(val4.spawnPrefab);
			Items.RegisterScrap(val4, SyncedEntry<int>.op_Implicit(Config.RARITY), (LevelTypes)(-1));
			mls.LogInfo((object)"Batteries 1.0.0 has been loaded successfully.");
		}

		internal static TerminalNode SetupInfoNode()
		{
			TerminalNode val = ScriptableObject.CreateInstance<TerminalNode>();
			val.displayText = val.displayText + GetDisplayInfo() + "\n";
			val.clearPreviousText = true;
			return val;
		}

		public static string GetDisplayInfo()
		{
			return "Recharges items' battery life when interacting";
		}
	}
	public static class PluginInfo
	{
		public const string PLUGIN_GUID = "Batteries";

		public const string PLUGIN_NAME = "Batteries";

		public const string PLUGIN_VERSION = "1.0.0";
	}
}
namespace Batteries.Util
{
	internal static class Constants
	{
		internal const string ITEM_SCAN_NODE_KEY_FORMAT = "Enable scan node of {0}";

		internal const bool ITEM_SCAN_NODE_DEFAULT = true;

		internal const string ITEM_SCAN_NODE_DESCRIPTION = "Shows a scan node on the item when scanning";

		internal const string BATTERIES_PRICE_KEY = "Batteries price";

		internal const int BATTERIES_PRICE_DEFAULT = 50;

		internal const string BATTERIES_PRICE_DESCRIPTION = "Price for Batteries.";

		internal const string BATTERIES_WEIGHT_KEY = "Item weight";

		internal const int BATTERIES_WEIGHT_DEFAULT = 5;

		internal const string BATTERIES_WEIGHT_DESCRIPTION = "Weight (in lbs)";

		internal const string BATTERIES_TWO_HANDED_KEY = "Two Handed Item";

		internal const bool BATTERIES_TWO_HANDED_DEFAULT = true;

		internal const string BATTERIES_TWO_HANDED_DESCRIPTION = "One or two handed item.";

		internal const string BATTERIES_CONDUCTIVE_KEY = "Conductive";

		internal const bool BATTERIES_CONDUCTIVE_DEFAULT = true;

		internal const string BATTERIES_CONDUCTIVE_DESCRIPTION = "Wether it attracts lightning to the item or not. (Or other mechanics that rely on item being conductive)";

		internal const string BATTERIES_DROP_AHEAD_PLAYER_KEY = "Drop ahead of player when dropping";

		internal const bool BATTERIES_DROP_AHEAD_PLAYER_DEFAULT = false;

		internal const string BATTERIES_DROP_AHEAD_PLAYER_DESCRIPTION = "If on, the item will drop infront of the player. Otherwise, drops underneath them and slightly infront.";

		internal const string BATTERIES_GRABBED_BEFORE_START_KEY = "Grabbable before game start";

		internal const bool BATTERIES_GRABBED_BEFORE_START_DEFAULT = false;

		internal const string BATTERIES_GRABBED_BEFORE_START_DESCRIPTION = "Allows wether the item can be grabbed before hand or not";

		internal const string BATTERIES_HIGHEST_SALE_PERCENTAGE_KEY = "Highest Sale Percentage";

		internal const int BATTERIES_HIGHEST_SALE_PERCENTAGE_DEFAULT = 50;

		internal const string BATTERIES_HIGHEST_SALE_PERCENTAGE_DESCRIPTION = "Maximum percentage of sale allowed when this item is selected for a sale.";

		internal const string BATTERIES_RARITY_KEY = "Scrap Rarity";

		internal const int BATTERIES_RARITY_DEFAULT = 100;

		internal const string BATTERIES_RARITY_DESCRIPTION = "Spawn Weight of the item spawning as a scrap";

		internal const string BATTERIES_MINIMUM_SCRAP_VALUE_KEY = "Minimum Scrap Value";

		internal const int BATTERIES_MINIMUM_SCRAP_VALUE_DEFAULT = 25;

		internal const string BATTERIES_MINIMUM_SCRAP_VALUE_DESCRIPTION = "Minimum value that the scrap version can have. (Before the scrap multipler (0.4))";

		internal const string BATTERIES_MAXIMUM_SCRAP_VALUE_KEY = "Maximum Scrap Value";

		internal const int BATTERIES_MAXIMUM_SCRAP_VALUE_DEFAULT = 35;

		internal const string BATTERIES_MAXIMUM_SCRAP_VALUE_DESCRIPTION = "Maximum value that the scrap version can have. (Before the scrap multipler (0.4))";

		internal const string BATTERIES_USAGES_KEY = "Recharge Usages";

		internal const int BATTERIES_USAGES_DEFAULT = 1;

		internal const string BATTERIES_USAGES_DESCRIPTION = "Amount of times the item can be used to recharge items";

		internal const string BATTERIES_RECHARGE_PERCENTAGE_KEY = "Recharge Percentage";

		internal const int BATTERIES_RECHARGE_PERCENTAGE_DEFAULT = 100;

		internal const string BATTERIES_RECHARGE_PERCENTAGE_DESCRIPTION = "Amount (%) of recharge it provides to the item when used";

		internal const string BATTERIES_OVERCHARGE_KEY = "Overcharge Battery Life";

		internal const bool BATTERIES_OVERCHARGE_DEFAULT = false;

		internal const string BATTERIES_OVERCHARGE_DESCRIPTION = "Wether the battery life of the recharged item can exceed 100%";

		internal const string BATTERIES_DESTROY_KEY = "Destroy Item when Exausted";

		internal const bool BATTERIES_DESTROY_DEFAULT = true;

		internal const string BATTERIES_DESTROY_DESCRIPTION = "When you can no longer recharge items with the battery, the battery gets cleared from your inventory";

		internal static readonly string BATTERIES_SCAN_NODE_KEY = string.Format("Enable scan node of {0}", "Batteries");
	}
}
namespace Batteries.Misc
{
	[DataContract]
	public class PluginConfig : SyncedConfig2<PluginConfig>
	{
		[field: SyncedEntryField]
		public SyncedEntry<bool> SCAN_NODE { get; set; }

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

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

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

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

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

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

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

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

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

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

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

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

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

		public PluginConfig(ConfigFile cfg)
			: base("com.github.WhiteSpike.Batteries")
		{
			string text = "Batteries";
			PRICE = SyncedBindingExtensions.BindSyncedEntry<int>(cfg, text, "Batteries price", 50, "Price for Batteries.");
			WEIGHT = SyncedBindingExtensions.BindSyncedEntry<int>(cfg, text, "Item weight", 5, "Weight (in lbs)");
			SCAN_NODE = SyncedBindingExtensions.BindSyncedEntry<bool>(cfg, text, Constants.BATTERIES_SCAN_NODE_KEY, true, "Shows a scan node on the item when scanning");
			DROP_AHEAD_PLAYER = SyncedBindingExtensions.BindSyncedEntry<bool>(cfg, text, "Drop ahead of player when dropping", false, "If on, the item will drop infront of the player. Otherwise, drops underneath them and slightly infront.");
			CONDUCTIVE = SyncedBindingExtensions.BindSyncedEntry<bool>(cfg, text, "Conductive", true, "Wether it attracts lightning to the item or not. (Or other mechanics that rely on item being conductive)");
			GRABBED_BEFORE_START = SyncedBindingExtensions.BindSyncedEntry<bool>(cfg, text, "Grabbable before game start", false, "Allows wether the item can be grabbed before hand or not");
			HIGHEST_SALE_PERCENTAGE = SyncedBindingExtensions.BindSyncedEntry<int>(cfg, text, "Highest Sale Percentage", 50, "Maximum percentage of sale allowed when this item is selected for a sale.");
			RARITY = SyncedBindingExtensions.BindSyncedEntry<int>(cfg, text, "Scrap Rarity", 100, "Spawn Weight of the item spawning as a scrap");
			MINIMUM_SCRAP_VALUE = SyncedBindingExtensions.BindSyncedEntry<int>(cfg, text, "Minimum Scrap Value", 25, "Minimum value that the scrap version can have. (Before the scrap multipler (0.4))");
			MAXIMUM_SCRAP_VALUE = SyncedBindingExtensions.BindSyncedEntry<int>(cfg, text, "Maximum Scrap Value", 35, "Maximum value that the scrap version can have. (Before the scrap multipler (0.4))");
			USAGES = SyncedBindingExtensions.BindSyncedEntry<int>(cfg, text, "Recharge Usages", 1, "Amount of times the item can be used to recharge items");
			RECHARGE_PERCENTAGE = SyncedBindingExtensions.BindSyncedEntry<int>(cfg, text, "Recharge Percentage", 100, "Amount (%) of recharge it provides to the item when used");
			OVERCHARGE = SyncedBindingExtensions.BindSyncedEntry<bool>(cfg, text, "Overcharge Battery Life", false, "Wether the battery life of the recharged item can exceed 100%");
			DESTROY = SyncedBindingExtensions.BindSyncedEntry<bool>(cfg, text, "Destroy Item when Exausted", true, "When you can no longer recharge items with the battery, the battery gets cleared from your inventory");
			ConfigManager.Register<PluginConfig>((SyncedConfig2<PluginConfig>)this);
		}
	}
	internal static class Metadata
	{
		public const string GUID = "com.github.WhiteSpike.Batteries";

		public const string NAME = "Batteries";

		public const string VERSION = "1.0.0";
	}
}
namespace Batteries.Behaviour
{
	internal class BatteriesBehaviour : ReplenishBatteryBehaviour
	{
		internal const string ITEM_NAME = "Batteries";

		private RaycastHit hit;

		protected bool KeepScanNode => SyncedEntry<bool>.op_Implicit(Plugin.Config.SCAN_NODE);

		public override void Start()
		{
			((GrabbableObject)this).Start();
			if (((GrabbableObject)this).itemProperties.isScrap)
			{
				((Component)this).gameObject.GetComponentInChildren<ScanNodeProperties>().nodeType = 2;
			}
			if (!KeepScanNode)
			{
				Object.Destroy((Object)(object)((Component)this).gameObject.GetComponentInChildren<ScanNodeProperties>());
			}
			base.rechargeUsages = SyncedEntry<int>.op_Implicit(Plugin.Config.USAGES);
			base.rechargePercentage = (float)SyncedEntry<int>.op_Implicit(Plugin.Config.RECHARGE_PERCENTAGE) / 100f;
			base.canOvercharge = SyncedEntry<bool>.op_Implicit(Plugin.Config.OVERCHARGE);
			base.destroyUponOutOfUsages = SyncedEntry<bool>.op_Implicit(Plugin.Config.DESTROY);
		}

		protected override bool CanRechargeItem(GrabbableObject grabbableObject)
		{
			return grabbableObject.itemProperties.requiresBattery && grabbableObject.insertedBattery.charge + base.rechargePercentage <= (base.canOvercharge ? float.MaxValue : 1f);
		}

		protected override bool CanRechargeItems()
		{
			return base.rechargeUsages > 0f;
		}

		protected override GrabbableObject GrabItemToRecharge()
		{
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			float grabDistance = ((GrabbableObject)this).playerHeldBy.grabDistance;
			if (LategameCompatibility.Enabled)
			{
				grabDistance = LategameCompatibility.GetGrabDistance();
			}
			if (!Physics.Raycast(((GrabbableObject)this).playerHeldBy.interactRay, ref hit, grabDistance, ((GrabbableObject)this).playerHeldBy.interactableObjectsMask) || ((Component)((RaycastHit)(ref hit)).collider).gameObject.layer == 8 || ((Component)((RaycastHit)(ref hit)).collider).gameObject.layer == 30)
			{
				return null;
			}
			return ((Component)((Component)((RaycastHit)(ref hit)).collider).transform).gameObject.GetComponent<GrabbableObject>();
		}

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

		protected internal override string __getTypeName()
		{
			return "BatteriesBehaviour";
		}
	}
}
namespace System.Runtime.CompilerServices
{
	[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]
	internal sealed class IgnoresAccessChecksToAttribute : Attribute
	{
		public IgnoresAccessChecksToAttribute(string assemblyName)
		{
		}
	}
}
namespace Batteries.NetcodePatcher
{
	[AttributeUsage(AttributeTargets.Module)]
	internal class NetcodePatchedAssemblyAttribute : Attribute
	{
	}
}

ChargeableJailbird.dll

Decompiled 9 hours ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Logging;
using ChargeableJailbird.Behaviours;
using ChargeableJailbird.NetcodePatcher;
using GameNetcodeStuff;
using LethalLib.Modules;
using Microsoft.CodeAnalysis;
using Unity.Netcode;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: IgnoresAccessChecksTo("Assembly-CSharp")]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("ChargeableJailbird")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+8674ec67b29b04305150a5c7ddd419e611ff36b0")]
[assembly: AssemblyProduct("a Recharge-able jailbird for lethal company")]
[assembly: AssemblyTitle("ChargeableJailbird")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.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 ChargeableJailbird
{
	public static class MyPluginInfo
	{
		public const string PLUGIN_GUID = "com.elmish.lethalcompany.chargeablejailbird";

		public const string PLUGIN_NAME = "ChargeableJailbird";

		public const string PLUGIN_VERSION = "1.0.0";
	}
	[BepInPlugin("com.elmish.lethalcompany.chargeablejailbird", "ChargeableJailbird", "1.0.0")]
	public class Plugin : BaseUnityPlugin
	{
		internal static ManualLogSource Logger;

		private static Item jailbirditemprops;

		private void Awake()
		{
			Logger = ((BaseUnityPlugin)this).Logger;
			Logger.LogInfo((object)"Plugin com.elmish.lethalcompany.chargeablejailbird is loaded!");
			LoadAssetBundle();
			Patch();
		}

		private void Patch()
		{
			Type[] types = Assembly.GetExecutingAssembly().GetTypes();
			Type[] array = types;
			foreach (Type type in array)
			{
				MethodInfo[] methods = type.GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic);
				MethodInfo[] array2 = methods;
				foreach (MethodInfo methodInfo in array2)
				{
					object[] customAttributes = methodInfo.GetCustomAttributes(typeof(RuntimeInitializeOnLoadMethodAttribute), inherit: false);
					if (customAttributes.Length != 0)
					{
						methodInfo.Invoke(null, null);
					}
				}
			}
		}

		private void LoadAssetBundle()
		{
			using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("ChargeableJailbird.Resources.jailbirdassets"))
			{
				AssetBundle val = AssetBundle.LoadFromStream(stream);
				if ((Object)(object)val == (Object)null)
				{
					Logger.LogError((object)"JAILBIRD BUNDLE IS NULL");
					return;
				}
				jailbirditemprops = val.LoadAsset<Item>("JailbirdItemProps");
				if ((Object)(object)jailbirditemprops == (Object)null)
				{
					Logger.LogError((object)"JAILBIRD ITEM IS NULL");
					return;
				}
				ChargeableJailbird.Behaviours.ChargeableJailbird chargeableJailbird = jailbirditemprops.spawnPrefab.AddComponent<ChargeableJailbird.Behaviours.ChargeableJailbird>();
				((GrabbableObject)chargeableJailbird).itemProperties = jailbirditemprops;
				((GrabbableObject)chargeableJailbird).grabbable = true;
				chargeableJailbird.reelUpSFX = val.LoadAsset<AudioClip>("ShovelReelUp");
				chargeableJailbird.swingSFX[0] = val.LoadAsset<AudioClip>("Jailbirdswing1");
				chargeableJailbird.swingSFX[1] = val.LoadAsset<AudioClip>("ShovelSwing");
				chargeableJailbird.hitSFX = (AudioClip[])(object)new AudioClip[1];
				chargeableJailbird.hitSFX[0] = val.LoadAsset<AudioClip>("Normal_Hit");
				chargeableJailbird.jailbirdAudio = ((Component)jailbirditemprops.spawnPrefab.transform).GetComponent<AudioSource>();
				chargeableJailbird.jailbirdAudio.spatialize = true;
			}
			Utilities.FixMixerGroups(jailbirditemprops.spawnPrefab);
			TerminalNode val2 = ScriptableObject.CreateInstance<TerminalNode>();
			val2.clearPreviousText = true;
			val2.displayText = "???";
			Items.RegisterShopItem(jailbirditemprops, (TerminalNode)null, (TerminalNode)null, val2, 300);
			NetworkPrefabs.RegisterNetworkPrefab(jailbirditemprops.spawnPrefab);
			Logger.LogInfo((object)"successfully set-up item");
		}
	}
}
namespace ChargeableJailbird.Behaviours
{
	public class ChargeableJailbird : GrabbableObject
	{
		public int shovelHitForce = 3;

		public bool reelingUp;

		public bool isHoldingButton;

		private RaycastHit rayHit;

		private Coroutine reelingUpCoroutine;

		private RaycastHit[] objectsHitByShovel;

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

		public AudioClip reelUpSFX;

		public AudioClip[] swingSFX = (AudioClip[])(object)new AudioClip[2];

		public AudioClip[] hitSFX;

		public AudioSource jailbirdAudio;

		private PlayerControllerB previousPlayerHeldBy;

		private int shovelMask = 1084754248;

		private GameObject blueGlow;

		public override void Start()
		{
			((GrabbableObject)this).Start();
			blueGlow = ((Component)((Component)this).transform.Find("jailbird/Mesh_Jailbird/blue_glow")).gameObject;
			base.insertedBattery.charge = 1f;
			Plugin.Logger.LogMessage((object)"new jailbird created");
		}

		public override void GrabItem()
		{
			((GrabbableObject)this).GrabItem();
			if ((double)base.insertedBattery.charge == 0.5)
			{
				base.insertedBattery.charge = 0.001f;
			}
		}

		public override void ItemActivate(bool used, bool buttonDown = true)
		{
			if ((Object)(object)base.playerHeldBy == (Object)null)
			{
				return;
			}
			isHoldingButton = buttonDown;
			if (!reelingUp && buttonDown)
			{
				reelingUp = true;
				previousPlayerHeldBy = base.playerHeldBy;
				if (reelingUpCoroutine != null)
				{
					((MonoBehaviour)this).StopCoroutine(reelingUpCoroutine);
				}
				reelingUpCoroutine = ((MonoBehaviour)this).StartCoroutine(reelUpShovel());
			}
		}

		private IEnumerator reelUpShovel()
		{
			base.playerHeldBy.activatingItem = true;
			base.playerHeldBy.twoHanded = true;
			base.playerHeldBy.playerBodyAnimator.ResetTrigger("shovelHit");
			base.playerHeldBy.playerBodyAnimator.SetBool("reelingUp", true);
			jailbirdAudio.PlayOneShot(reelUpSFX);
			ReelUpSFXServerRpc();
			yield return (object)new WaitForSeconds(0.35f);
			yield return (object)new WaitUntil((Func<bool>)(() => !isHoldingButton || !base.isHeld));
			SwingSFXServerRpc();
			yield return (object)new WaitForSeconds((shovelHitForce == 3) ? 0.15f : 0f);
			SwingShovel(!base.isHeld);
			yield return (object)new WaitForSeconds(0.13f);
			yield return (object)new WaitForEndOfFrame();
			HitShovel(!base.isHeld);
			yield return (object)new WaitForSeconds(0.3f);
			reelingUp = false;
			reelingUpCoroutine = null;
		}

		public override void DiscardItem()
		{
			if ((Object)(object)base.playerHeldBy != (Object)null)
			{
				base.playerHeldBy.activatingItem = false;
			}
			if (base.insertedBattery.charge < 0.5f)
			{
				base.insertedBattery.charge = 0.5f;
			}
			((GrabbableObject)this).DiscardItem();
		}

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

		public void HitShovel(bool cancel = false)
		{
			//IL_0063: Unknown result type (might be due to invalid IL or missing references)
			//IL_0078: Unknown result type (might be due to invalid IL or missing references)
			//IL_0082: Unknown result type (might be due to invalid IL or missing references)
			//IL_0087: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
			//IL_045b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0109: Unknown result type (might be due to invalid IL or missing references)
			//IL_010e: Unknown result type (might be due to invalid IL or missing references)
			//IL_012c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0131: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f7: Unknown result type (might be due to invalid IL or missing references)
			//IL_01fc: Unknown result type (might be due to invalid IL or missing references)
			//IL_015d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0162: Unknown result type (might be due to invalid IL or missing references)
			//IL_0219: Unknown result type (might be due to invalid IL or missing references)
			//IL_021e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0186: Unknown result type (might be due to invalid IL or missing references)
			//IL_018b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0241: Unknown result type (might be due to invalid IL or missing references)
			//IL_0246: Unknown result type (might be due to invalid IL or missing references)
			//IL_024a: Unknown result type (might be due to invalid IL or missing references)
			//IL_024f: Unknown result type (might be due to invalid IL or missing references)
			//IL_02bc: Unknown result type (might be due to invalid IL or missing references)
			//IL_02c1: Unknown result type (might be due to invalid IL or missing references)
			//IL_026b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0278: Unknown result type (might be due to invalid IL or missing references)
			//IL_027d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0281: Unknown result type (might be due to invalid IL or missing references)
			//IL_02cc: Unknown result type (might be due to invalid IL or missing references)
			//IL_02d1: Unknown result type (might be due to invalid IL or missing references)
			//IL_0329: Unknown result type (might be due to invalid IL or missing references)
			//IL_032e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0368: 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, shovelMask, (QueryTriggerInteraction)2);
				objectsHitByShovelList = objectsHitByShovel.OrderBy((RaycastHit x) => ((RaycastHit)(ref x)).distance).ToList();
				List<EnemyAI> list = new List<EnemyAI>();
				IHittable val2 = default(IHittable);
				for (int i = 0; i < objectsHitByShovelList.Count; i++)
				{
					RaycastHit val = objectsHitByShovelList[i];
					if (((Component)((RaycastHit)(ref val)).transform).gameObject.layer != 8)
					{
						val = objectsHitByShovelList[i];
						if (((Component)((RaycastHit)(ref val)).transform).gameObject.layer != 11)
						{
							val = objectsHitByShovelList[i];
							if (!((Component)((RaycastHit)(ref val)).transform).TryGetComponent<IHittable>(ref val2))
							{
								continue;
							}
							val = objectsHitByShovelList[i];
							if ((Object)(object)((RaycastHit)(ref val)).transform == (Object)(object)((Component)previousPlayerHeldBy).transform)
							{
								continue;
							}
							val = objectsHitByShovelList[i];
							if (!(((RaycastHit)(ref val)).point == Vector3.zero))
							{
								Vector3 position = ((Component)previousPlayerHeldBy.gameplayCamera).transform.position;
								RaycastHit val3 = objectsHitByShovelList[i];
								if (Physics.Linecast(position, ((RaycastHit)(ref val3)).point, ref val, StartOfRound.Instance.collidersAndRoomMaskAndDefault, (QueryTriggerInteraction)1))
								{
									continue;
								}
							}
							flag = true;
							Vector3 forward = ((Component)previousPlayerHeldBy.gameplayCamera).transform.forward;
							try
							{
								val = objectsHitByShovelList[i];
								EnemyAICollisionDetect component = ((Component)((RaycastHit)(ref val)).transform).GetComponent<EnemyAICollisionDetect>();
								if ((Object)(object)component != (Object)null)
								{
									if (!((Object)(object)component.mainScript == (Object)null) && !list.Contains(component.mainScript))
									{
										goto IL_035f;
									}
									continue;
								}
								val = objectsHitByShovelList[i];
								if (!((Object)(object)((Component)((RaycastHit)(ref val)).transform).GetComponent<PlayerControllerB>() != (Object)null))
								{
									goto IL_035f;
								}
								if (!flag3)
								{
									flag3 = true;
									goto IL_035f;
								}
								goto end_IL_02c3;
								IL_035f:
								bool flag4 = val2.Hit(shovelHitForce, forward, previousPlayerHeldBy, true, 1);
								if (flag4 && (Object)(object)component != (Object)null)
								{
									list.Add(component.mainScript);
									if (shovelHitForce == 3)
									{
										StunEnemiesServerRpc(((NetworkBehaviour)component.mainScript).NetworkObjectId);
									}
									HitEnemyWithShovelServerRpc();
								}
								if (!flag2)
								{
									flag2 = flag4;
								}
								end_IL_02c3:;
							}
							catch (Exception arg)
							{
								Debug.Log((object)$"Exception caught when hitting object with shovel from player #{previousPlayerHeldBy.playerClientId}: {arg}");
							}
							continue;
						}
					}
					val = objectsHitByShovelList[i];
					if (((RaycastHit)(ref val)).collider.isTrigger)
					{
						continue;
					}
					flag = true;
					val = objectsHitByShovelList[i];
					string tag = ((Component)((RaycastHit)(ref val)).collider).gameObject.tag;
					for (int j = 0; j < StartOfRound.Instance.footstepSurfaces.Length; j++)
					{
						if (StartOfRound.Instance.footstepSurfaces[j].surfaceTag == tag)
						{
							num = j;
							break;
						}
					}
				}
			}
			if (flag)
			{
				RoundManager.PlayRandomClip(jailbirdAudio, hitSFX, true, 1f, 0, 1000);
				Object.FindObjectOfType<RoundManager>().PlayAudibleNoise(((Component)this).transform.position, 17f, 0.8f, 0, false, 0);
				if (!flag2 && num != -1)
				{
					jailbirdAudio.PlayOneShot(StartOfRound.Instance.footstepSurfaces[num].hitSurfaceSFX);
					WalkieTalkie.TransmitOneShotAudio(jailbirdAudio, StartOfRound.Instance.footstepSurfaces[num].hitSurfaceSFX, 1f);
				}
				base.playerHeldBy.playerBodyAnimator.SetTrigger("shovelHit");
				HitShovelServerRpc(num);
			}
		}

		private void HitSurfaceWithShovel(int hitSurfaceID)
		{
			try
			{
				jailbirdAudio.PlayOneShot(StartOfRound.Instance.footstepSurfaces[hitSurfaceID].hitSurfaceSFX);
				WalkieTalkie.TransmitOneShotAudio(jailbirdAudio, StartOfRound.Instance.footstepSurfaces[hitSurfaceID].hitSurfaceSFX, 1f);
			}
			catch (Exception ex)
			{
				Plugin.Logger.LogError((object)ex);
			}
		}

		public void OnJailbirdHit()
		{
			if (shovelHitForce == 3)
			{
				base.insertedBattery.charge = 0.001f;
				shovelHitForce = 1;
				blueGlow.SetActive(false);
			}
		}

		public override void ChargeBatteries()
		{
			((GrabbableObject)this).ChargeBatteries();
			if (base.insertedBattery.charge == 1f)
			{
				shovelHitForce = 3;
				blueGlow.SetActive(true);
			}
		}

		public void TryStunEnemy(ulong enemyID)
		{
			RoundManager.Instance.RefreshEnemiesList();
			foreach (EnemyAI spawnedEnemy in RoundManager.Instance.SpawnedEnemies)
			{
				if (((NetworkBehaviour)spawnedEnemy).NetworkObjectId == enemyID)
				{
					Plugin.Logger.LogMessage((object)$"found enemy with id {enemyID}");
					spawnedEnemy.SetEnemyStunned(true, 4.5f, (PlayerControllerB)null);
					return;
				}
			}
			Plugin.Logger.LogError((object)$"could not find enemy with id {enemyID}");
		}

		[ServerRpc]
		public void HitEnemyWithShovelServerRpc()
		{
			//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(4051162151u, val, (RpcDelivery)0);
				((NetworkBehaviour)this).__endSendServerRpc(ref val2, 4051162151u, val, (RpcDelivery)0);
			}
			if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost))
			{
				HitEnemyWithShovelClientRpc();
			}
		}

		[ClientRpc]
		public void HitEnemyWithShovelClientRpc()
		{
			//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(749202693u, val, (RpcDelivery)0);
					((NetworkBehaviour)this).__endSendClientRpc(ref val2, 749202693u, val, (RpcDelivery)0);
				}
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost))
				{
					OnJailbirdHit();
				}
			}
		}

		[ServerRpc]
		public void HitShovelServerRpc(int hitSurfaceID)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_00df: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e9: 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_00b7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cf: Unknown result type (might be due to invalid IL or missing references)
			//IL_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(3129188199u, val, (RpcDelivery)0);
				BytePacker.WriteValueBitPacked(val2, hitSurfaceID);
				((NetworkBehaviour)this).__endSendServerRpc(ref val2, 3129188199u, val, (RpcDelivery)0);
			}
			if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost))
			{
				HitShovelClientRpc(hitSurfaceID);
			}
		}

		[ClientRpc]
		public void HitShovelClientRpc(int hitSurfaceID)
		{
			//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(9340190u, val, (RpcDelivery)0);
					BytePacker.WriteValueBitPacked(val2, hitSurfaceID);
					((NetworkBehaviour)this).__endSendClientRpc(ref val2, 9340190u, val, (RpcDelivery)0);
				}
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost))
				{
					HitSurfaceWithShovel(hitSurfaceID);
				}
			}
		}

		[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(3945880777u, val, (RpcDelivery)0);
				((NetworkBehaviour)this).__endSendServerRpc(ref val2, 3945880777u, 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(2997558882u, val, (RpcDelivery)0);
					((NetworkBehaviour)this).__endSendClientRpc(ref val2, 2997558882u, val, (RpcDelivery)0);
				}
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost))
				{
					jailbirdAudio.PlayOneShot(reelUpSFX);
				}
			}
		}

		[ServerRpc]
		public void SwingSFXServerRpc()
		{
			//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(907157750u, val, (RpcDelivery)0);
				((NetworkBehaviour)this).__endSendServerRpc(ref val2, 907157750u, val, (RpcDelivery)0);
			}
			if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost))
			{
				SwingSFXClientRpc();
			}
		}

		[ClientRpc]
		public void SwingSFXClientRpc()
		{
			//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(3430652948u, val, (RpcDelivery)0);
					((NetworkBehaviour)this).__endSendClientRpc(ref val2, 3430652948u, val, (RpcDelivery)0);
				}
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost))
				{
					jailbirdAudio.PlayOneShot(swingSFX[(shovelHitForce != 3) ? 1u : 0u]);
				}
			}
		}

		[ServerRpc]
		public void StunEnemiesServerRpc(ulong enemyID)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_00df: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e9: 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_00b7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cf: Unknown result type (might be due to invalid IL or missing references)
			//IL_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(3625734691u, val, (RpcDelivery)0);
				BytePacker.WriteValueBitPacked(val2, enemyID);
				((NetworkBehaviour)this).__endSendServerRpc(ref val2, 3625734691u, val, (RpcDelivery)0);
			}
			if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost))
			{
				StunEnemiesClientRpc(enemyID);
			}
		}

		[ClientRpc]
		public void StunEnemiesClientRpc(ulong enemyID)
		{
			//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(1610222793u, val, (RpcDelivery)0);
					BytePacker.WriteValueBitPacked(val2, enemyID);
					((NetworkBehaviour)this).__endSendClientRpc(ref val2, 1610222793u, val, (RpcDelivery)0);
				}
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost))
				{
					TryStunEnemy(enemyID);
				}
			}
		}

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

		[RuntimeInitializeOnLoadMethod]
		internal static void InitializeRPCS_ChargeableJailbird()
		{
			//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
			//IL_007d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0087: Expected O, but got Unknown
			//IL_0098: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a2: Expected O, but got Unknown
			//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bd: Expected O, but got Unknown
			//IL_00ce: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d8: Expected O, but got Unknown
			//IL_00e9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f3: Expected O, but got Unknown
			//IL_0104: Unknown result type (might be due to invalid IL or missing references)
			//IL_010e: Expected O, but got Unknown
			NetworkManager.__rpc_func_table.Add(4051162151u, new RpcReceiveHandler(__rpc_handler_4051162151));
			NetworkManager.__rpc_func_table.Add(749202693u, new RpcReceiveHandler(__rpc_handler_749202693));
			NetworkManager.__rpc_func_table.Add(3129188199u, new RpcReceiveHandler(__rpc_handler_3129188199));
			NetworkManager.__rpc_func_table.Add(9340190u, new RpcReceiveHandler(__rpc_handler_9340190));
			NetworkManager.__rpc_func_table.Add(3945880777u, new RpcReceiveHandler(__rpc_handler_3945880777));
			NetworkManager.__rpc_func_table.Add(2997558882u, new RpcReceiveHandler(__rpc_handler_2997558882));
			NetworkManager.__rpc_func_table.Add(907157750u, new RpcReceiveHandler(__rpc_handler_907157750));
			NetworkManager.__rpc_func_table.Add(3430652948u, new RpcReceiveHandler(__rpc_handler_3430652948));
			NetworkManager.__rpc_func_table.Add(3625734691u, new RpcReceiveHandler(__rpc_handler_3625734691));
			NetworkManager.__rpc_func_table.Add(1610222793u, new RpcReceiveHandler(__rpc_handler_1610222793));
		}

		private static void __rpc_handler_4051162151(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
		{
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_0076: Unknown result type (might be due to invalid IL or missing references)
			//IL_008c: Unknown result type (might be due to invalid IL or missing references)
			//IL_004b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0055: Invalid comparison between Unknown and I4
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager == null || !networkManager.IsListening)
			{
				return;
			}
			if (rpcParams.Server.Receive.SenderClientId != target.OwnerClientId)
			{
				if ((int)networkManager.LogLevel <= 1)
				{
					Debug.LogError((object)"Only the owner can invoke a ServerRpc that requires ownership!");
				}
			}
			else
			{
				target.__rpc_exec_stage = (__RpcExecStage)1;
				((ChargeableJailbird)(object)target).HitEnemyWithShovelServerRpc();
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		private static void __rpc_handler_749202693(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;
				((ChargeableJailbird)(object)target).HitEnemyWithShovelClientRpc();
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		private static void __rpc_handler_3129188199(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
		{
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_0070: Unknown result type (might be due to invalid IL or missing references)
			//IL_0083: Unknown result type (might be due to invalid IL or missing references)
			//IL_009d: Unknown result type (might be due to invalid IL or missing references)
			//IL_004b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0055: Invalid comparison between Unknown and I4
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager == null || !networkManager.IsListening)
			{
				return;
			}
			if (rpcParams.Server.Receive.SenderClientId != target.OwnerClientId)
			{
				if ((int)networkManager.LogLevel <= 1)
				{
					Debug.LogError((object)"Only the owner can invoke a ServerRpc that requires ownership!");
				}
			}
			else
			{
				int hitSurfaceID = default(int);
				ByteUnpacker.ReadValueBitPacked(reader, ref hitSurfaceID);
				target.__rpc_exec_stage = (__RpcExecStage)1;
				((ChargeableJailbird)(object)target).HitShovelServerRpc(hitSurfaceID);
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		private static void __rpc_handler_9340190(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 hitSurfaceID = default(int);
				ByteUnpacker.ReadValueBitPacked(reader, ref hitSurfaceID);
				target.__rpc_exec_stage = (__RpcExecStage)2;
				((ChargeableJailbird)(object)target).HitShovelClientRpc(hitSurfaceID);
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		private static void __rpc_handler_3945880777(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
		{
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_0076: Unknown result type (might be due to invalid IL or missing references)
			//IL_008c: Unknown result type (might be due to invalid IL or missing references)
			//IL_004b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0055: Invalid comparison between Unknown and I4
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager == null || !networkManager.IsListening)
			{
				return;
			}
			if (rpcParams.Server.Receive.SenderClientId != target.OwnerClientId)
			{
				if ((int)networkManager.LogLevel <= 1)
				{
					Debug.LogError((object)"Only the owner can invoke a ServerRpc that requires ownership!");
				}
			}
			else
			{
				target.__rpc_exec_stage = (__RpcExecStage)1;
				((ChargeableJailbird)(object)target).ReelUpSFXServerRpc();
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		private static void __rpc_handler_2997558882(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;
				((ChargeableJailbird)(object)target).ReelUpSFXClientRpc();
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		private static void __rpc_handler_907157750(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
		{
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_0076: Unknown result type (might be due to invalid IL or missing references)
			//IL_008c: Unknown result type (might be due to invalid IL or missing references)
			//IL_004b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0055: Invalid comparison between Unknown and I4
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager == null || !networkManager.IsListening)
			{
				return;
			}
			if (rpcParams.Server.Receive.SenderClientId != target.OwnerClientId)
			{
				if ((int)networkManager.LogLevel <= 1)
				{
					Debug.LogError((object)"Only the owner can invoke a ServerRpc that requires ownership!");
				}
			}
			else
			{
				target.__rpc_exec_stage = (__RpcExecStage)1;
				((ChargeableJailbird)(object)target).SwingSFXServerRpc();
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		private static void __rpc_handler_3430652948(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;
				((ChargeableJailbird)(object)target).SwingSFXClientRpc();
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		private static void __rpc_handler_3625734691(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
		{
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_0070: Unknown result type (might be due to invalid IL or missing references)
			//IL_0083: Unknown result type (might be due to invalid IL or missing references)
			//IL_009d: Unknown result type (might be due to invalid IL or missing references)
			//IL_004b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0055: Invalid comparison between Unknown and I4
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager == null || !networkManager.IsListening)
			{
				return;
			}
			if (rpcParams.Server.Receive.SenderClientId != target.OwnerClientId)
			{
				if ((int)networkManager.LogLevel <= 1)
				{
					Debug.LogError((object)"Only the owner can invoke a ServerRpc that requires ownership!");
				}
			}
			else
			{
				ulong enemyID = default(ulong);
				ByteUnpacker.ReadValueBitPacked(reader, ref enemyID);
				target.__rpc_exec_stage = (__RpcExecStage)1;
				((ChargeableJailbird)(object)target).StunEnemiesServerRpc(enemyID);
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		private static void __rpc_handler_1610222793(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)
			{
				ulong enemyID = default(ulong);
				ByteUnpacker.ReadValueBitPacked(reader, ref enemyID);
				target.__rpc_exec_stage = (__RpcExecStage)2;
				((ChargeableJailbird)(object)target).StunEnemiesClientRpc(enemyID);
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		protected internal override string __getTypeName()
		{
			return "ChargeableJailbird";
		}
	}
}
namespace System.Runtime.CompilerServices
{
	[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]
	internal sealed class IgnoresAccessChecksToAttribute : Attribute
	{
		public IgnoresAccessChecksToAttribute(string assemblyName)
		{
		}
	}
}
namespace ChargeableJailbird.NetcodePatcher
{
	[AttributeUsage(AttributeTargets.Module)]
	internal class NetcodePatchedAssemblyAttribute : Attribute
	{
	}
}

ReindogFan1372.Pincers.dll

Decompiled 9 hours ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Configuration;
using BepInEx.Logging;
using CustomItemBehaviourLibrary.AbstractItems;
using GameNetcodeStuff;
using HarmonyLib;
using LethalLevelLoader;
using Microsoft.CodeAnalysis;
using Pincers.Patches;
using TMPro;
using Unity.Netcode;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = "")]
[assembly: IgnoresAccessChecksTo("AmazingAssets.TerrainToMesh")]
[assembly: IgnoresAccessChecksTo("Assembly-CSharp-firstpass")]
[assembly: IgnoresAccessChecksTo("Assembly-CSharp")]
[assembly: IgnoresAccessChecksTo("ClientNetworkTransform")]
[assembly: IgnoresAccessChecksTo("CustomItemBehaviourLibrary")]
[assembly: IgnoresAccessChecksTo("DissonanceVoip")]
[assembly: IgnoresAccessChecksTo("Facepunch Transport for Netcode for GameObjects")]
[assembly: IgnoresAccessChecksTo("Facepunch.Steamworks.Win64")]
[assembly: IgnoresAccessChecksTo("LethalLevelLoader")]
[assembly: IgnoresAccessChecksTo("Unity.AI.Navigation")]
[assembly: IgnoresAccessChecksTo("Unity.Animation.Rigging")]
[assembly: IgnoresAccessChecksTo("Unity.Animation.Rigging.DocCodeExamples")]
[assembly: IgnoresAccessChecksTo("Unity.Burst")]
[assembly: IgnoresAccessChecksTo("Unity.Burst.Unsafe")]
[assembly: IgnoresAccessChecksTo("Unity.Collections")]
[assembly: IgnoresAccessChecksTo("Unity.Collections.LowLevel.ILSupport")]
[assembly: IgnoresAccessChecksTo("Unity.InputSystem")]
[assembly: IgnoresAccessChecksTo("Unity.InputSystem.ForUI")]
[assembly: IgnoresAccessChecksTo("Unity.Jobs")]
[assembly: IgnoresAccessChecksTo("Unity.Mathematics")]
[assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.Common")]
[assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.MetricTypes")]
[assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetStats")]
[assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetStatsMonitor.Component")]
[assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetStatsMonitor.Configuration")]
[assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetStatsMonitor.Implementation")]
[assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetStatsReporting")]
[assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetworkProfiler.Runtime")]
[assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetworkSolutionInterface")]
[assembly: IgnoresAccessChecksTo("Unity.Netcode.Components")]
[assembly: IgnoresAccessChecksTo("Unity.Netcode.Runtime")]
[assembly: IgnoresAccessChecksTo("Unity.Networking.Transport")]
[assembly: IgnoresAccessChecksTo("Unity.ProBuilder.Csg")]
[assembly: IgnoresAccessChecksTo("Unity.ProBuilder")]
[assembly: IgnoresAccessChecksTo("Unity.ProBuilder.KdTree")]
[assembly: IgnoresAccessChecksTo("Unity.ProBuilder.Poly2Tri")]
[assembly: IgnoresAccessChecksTo("Unity.ProBuilder.Stl")]
[assembly: IgnoresAccessChecksTo("Unity.Profiling.Core")]
[assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.Core.Runtime")]
[assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.Core.ShaderLibrary")]
[assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.HighDefinition.Config.Runtime")]
[assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.HighDefinition.Runtime")]
[assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.ShaderGraph.ShaderGraphLibrary")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Authentication")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core.Analytics")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core.Configuration")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core.Device")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core.Environments")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core.Environments.Internal")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core.Internal")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core.Networking")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core.Registration")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core.Scheduler")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core.Telemetry")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core.Threading")]
[assembly: IgnoresAccessChecksTo("Unity.Services.QoS")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Relay")]
[assembly: IgnoresAccessChecksTo("Unity.TextMeshPro")]
[assembly: IgnoresAccessChecksTo("Unity.Timeline")]
[assembly: IgnoresAccessChecksTo("Unity.VisualEffectGraph.Runtime")]
[assembly: IgnoresAccessChecksTo("UnityEngine.ARModule")]
[assembly: IgnoresAccessChecksTo("UnityEngine.NVIDIAModule")]
[assembly: IgnoresAccessChecksTo("UnityEngine.UI")]
[assembly: AssemblyCompany("ReindogFan1372.Pincers")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("Pincers")]
[assembly: AssemblyTitle("ReindogFan1372.Pincers")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableAttribute : Attribute
	{
		public readonly byte[] NullableFlags;

		public NullableAttribute(byte P_0)
		{
			NullableFlags = new byte[1] { P_0 };
		}

		public NullableAttribute(byte[] P_0)
		{
			NullableFlags = P_0;
		}
	}
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableContextAttribute : Attribute
	{
		public readonly byte Flag;

		public NullableContextAttribute(byte P_0)
		{
			Flag = P_0;
		}
	}
}
namespace Pincers
{
	[BepInPlugin("ReindogFan1372.Pincers", "Pincers", "1.0.0")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	public class Pincers : BaseUnityPlugin
	{
		public static Pincers Instance { get; private set; }

		internal static ManualLogSource Logger { get; private set; }

		internal static Harmony? Harmony { get; set; }

		internal static MyModConfig PincersModConfig { get; private set; }

		private void Awake()
		{
			Logger = ((BaseUnityPlugin)this).Logger;
			Instance = this;
			PincersModConfig = new MyModConfig(((BaseUnityPlugin)this).Config);
			AssetBundleLoader.AddOnExtendedModLoadedListener((Action<ExtendedMod>)OnExtendedModRegistered, "ReindogFan1372Pincer", "PincerMod");
			Patch();
			Logger.LogInfo((object)"ReindogFan1372.Pincers v1.0.0 has loaded!");
		}

		internal static void Patch()
		{
			//IL_000d: 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)
			//IL_0018: Expected O, but got Unknown
			if (Harmony == null)
			{
				Harmony = new Harmony("ReindogFan1372.Pincers");
			}
			Logger.LogDebug((object)"Patching...");
			Harmony.PatchAll(typeof(PincerDepositItemDesk));
			Harmony.PatchAll(typeof(PincerGrabPlace));
			Harmony.PatchAll(typeof(PincerGrabPatch));
			TrySoftPatch("com.github.WhiteSpike.CustomItemBehaviourLibrary", typeof(ContainerPatch));
			Logger.LogDebug((object)"Finished patching!");
		}

		internal static void Unpatch()
		{
			Logger.LogDebug((object)"Unpatching...");
			Harmony? harmony = Harmony;
			if (harmony != null)
			{
				harmony.UnpatchSelf();
			}
			Logger.LogDebug((object)"Finished unpatching!");
		}

		internal static void TrySoftPatch(string pluginName, Type type)
		{
			if (Chainloader.PluginInfos.ContainsKey(pluginName))
			{
				Harmony.CreateClassProcessor(type, true).Patch();
				Logger.LogInfo((object)(pluginName + "found, enabling compatability patch."));
			}
		}

		internal static void OnExtendedModRegistered(ExtendedMod myMod)
		{
			//IL_00c5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cc: Expected O, but got Unknown
			//IL_00d3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00da: Expected O, but got Unknown
			if ((Object)(object)myMod == (Object)null)
			{
				return;
			}
			foreach (ExtendedItem extendedItem in myMod.ExtendedItems)
			{
				if (extendedItem.Item.itemName == "Pincers")
				{
					extendedItem.Item.creditsWorth = PincersModConfig.price.Value;
					extendedItem.Item.twoHanded = PincersModConfig.twoHanded.Value;
					extendedItem.Item.isScrap = PincersModConfig.isScrap.Value;
					if (PincersModConfig.isScrap.Value)
					{
						int value = PincersModConfig.spawnWeight.Value;
						StringWithRarity item = new StringWithRarity("Vanilla", value);
						StringWithRarity item2 = new StringWithRarity("Custom", value);
						extendedItem.LevelMatchingProperties.levelTags.Clear();
						extendedItem.LevelMatchingProperties.levelTags.TrimExcess();
						extendedItem.LevelMatchingProperties.levelTags.Add(item2);
						extendedItem.LevelMatchingProperties.levelTags.Add(item);
					}
				}
			}
		}
	}
	internal class MyModConfig
	{
		public readonly ConfigEntry<bool> twoHanded;

		public readonly ConfigEntry<bool> isScrap;

		public readonly ConfigEntry<int> spawnWeight;

		public readonly ConfigEntry<int> price;

		public readonly ConfigEntry<bool> twoHandedPickup;

		public readonly ConfigEntry<bool> twoHandedPickupNatural;

		public MyModConfig(ConfigFile cfg)
		{
			cfg.SaveOnConfigSet = false;
			twoHanded = cfg.Bind<bool>("Pincers", "require two handed?", false, "should the Pincers be two handed?");
			isScrap = cfg.Bind<bool>("Pincers", "is scrap??", false, "should the Pincers be able to be found inside dungeons");
			spawnWeight = cfg.Bind<int>("Pincers", "Spawn Weight", 0, "if marked as scrap, how rare should the Pincers be? 30-40 is roughly normal vanilla weighting for standard scrap");
			price = cfg.Bind<int>("Pincers", "Price of the item", 70, "If purchasable, how much should the item cost to buy?");
			twoHandedPickup = cfg.Bind<bool>("Pincers", "Become Two Handed when picking up an item?", true, "Should the Pincers switch to two handed when picking up an item?");
			twoHandedPickupNatural = cfg.Bind<bool>("Pincers", "Become Two Handed only when picking up a two-handed item?", true, "Should the Pincers only switch to two handed when picking up a naturally two handed item? (Requires Two Handed Pickup Enabled)");
			ClearOrphanedEntries(cfg);
			cfg.Save();
			cfg.SaveOnConfigSet = true;
		}

		private static void ClearOrphanedEntries(ConfigFile cfg)
		{
			PropertyInfo propertyInfo = AccessTools.Property(typeof(ConfigFile), "OrphanedEntries");
			Dictionary<ConfigDefinition, string> dictionary = (Dictionary<ConfigDefinition, string>)propertyInfo.GetValue(cfg);
			dictionary.Clear();
		}
	}
	public static class MyPluginInfo
	{
		public const string PLUGIN_GUID = "ReindogFan1372.Pincers";

		public const string PLUGIN_NAME = "Pincers";

		public const string PLUGIN_VERSION = "1.0.0";
	}
}
namespace Pincers.Patches
{
	[HarmonyPatch(typeof(ContainerBehaviour))]
	public class ContainerPatch
	{
		[HarmonyPatch("StoreItemInContainer")]
		[HarmonyPrefix]
		public static bool StoreItemInContainerPrefix(ref PlayerControllerB playerInteractor, ContainerBehaviour __instance)
		{
			//IL_005e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0063: 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_006c: 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_0075: Unknown result type (might be due to invalid IL or missing references)
			//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ab: 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_00c1: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)playerInteractor.currentlyHeldObjectServer == (Object)null)
			{
				return true;
			}
			PincersObject pincersObject = default(PincersObject);
			if (!((Component)playerInteractor.currentlyHeldObjectServer).TryGetComponent<PincersObject>(ref pincersObject))
			{
				return true;
			}
			if ((Object)(object)pincersObject.objectHeldByPincers == (Object)null)
			{
				return true;
			}
			Collider container = (Collider)(object)__instance.container;
			Vector3 val = RoundManager.RandomPointInBounds(container.bounds);
			Bounds bounds = container.bounds;
			val.y = ((Bounds)(ref bounds)).max.y;
			val.y += pincersObject.objectHeldByPincers.itemProperties.verticalOffset;
			val = ((Component)((Component)__instance).GetComponent<NetworkObject>()).transform.InverseTransformPoint(val);
			GrabbableObject objectHeldByPincers = pincersObject.objectHeldByPincers;
			playerInteractor.DiscardHeldObject(true, ((Component)__instance).GetComponent<NetworkObject>(), val, false);
			objectHeldByPincers.EnableItemMeshes(!__instance.makeItemsInvisible);
			__instance.UpdateContainerWeightServerRpc();
			return false;
		}
	}
	public class PincersObject : GrabbableObject
	{
		[HideInInspector]
		public GrabbableObject objectHeldByPincers;

		public Transform holdPoint;

		[HideInInspector]
		public AudioSource pincerAudioSource;

		public AudioClip pincerGrabClip;

		public AudioClip pincerDropClip;

		public void Awake()
		{
		}

		public override void Start()
		{
			((GrabbableObject)this).Start();
		}

		public override void OnNetworkSpawn()
		{
			((NetworkBehaviour)this).OnNetworkSpawn();
			pincerAudioSource = ((Component)this).GetComponent<AudioSource>();
			base.itemProperties.twoHanded = Pincers.PincersModConfig.twoHanded.Value;
		}

		public override void LateUpdate()
		{
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0049: 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_0076: Unknown result type (might be due to invalid IL or missing references)
			//IL_007b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0082: Unknown result type (might be due to invalid IL or missing references)
			//IL_0087: Unknown result type (might be due to invalid IL or missing references)
			//IL_0088: Unknown result type (might be due to invalid IL or missing references)
			//IL_008d: 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_009f: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
			((GrabbableObject)this).LateUpdate();
			if ((Object)(object)objectHeldByPincers != (Object)null)
			{
				((Component)objectHeldByPincers).transform.rotation = holdPoint.rotation;
				((Component)objectHeldByPincers).transform.Rotate(base.itemProperties.rotationOffset);
				((Component)objectHeldByPincers).transform.position = holdPoint.position;
				Vector3 positionOffset = base.itemProperties.positionOffset;
				positionOffset = holdPoint.rotation * positionOffset;
				Transform transform = ((Component)objectHeldByPincers).transform;
				transform.position += positionOffset;
			}
		}

		public override void EnableItemMeshes(bool enable)
		{
			((GrabbableObject)this).EnableItemMeshes(enable);
			if ((Object)(object)objectHeldByPincers == (Object)null)
			{
				return;
			}
			MeshRenderer[] componentsInChildren = ((Component)objectHeldByPincers).GetComponentsInChildren<MeshRenderer>();
			for (int i = 0; i < componentsInChildren.Length; i++)
			{
				if (!((Component)componentsInChildren[i]).gameObject.CompareTag("DoNotSet") && !((Component)componentsInChildren[i]).gameObject.CompareTag("InteractTrigger"))
				{
					((Renderer)componentsInChildren[i]).enabled = enable;
				}
			}
			SkinnedMeshRenderer[] componentsInChildren2 = ((Component)objectHeldByPincers).GetComponentsInChildren<SkinnedMeshRenderer>();
			for (int j = 0; j < componentsInChildren2.Length; j++)
			{
				((Renderer)componentsInChildren2[j]).enabled = enable;
				Debug.Log((object)("DISABLING/ENABLING SKINNEDMESH: " + ((Object)((Component)componentsInChildren2[j]).gameObject).name));
			}
		}

		public void PincerGrabTwoHanded(bool toggle)
		{
			if (Pincers.PincersModConfig.twoHandedPickup.Value && ((NetworkBehaviour)this).IsOwner)
			{
				base.itemProperties.twoHanded = toggle;
				if (Object.op_Implicit((Object)(object)base.playerHeldBy))
				{
					base.playerHeldBy.twoHanded = toggle;
				}
				HUDManager.Instance.ClearControlTips();
				((Behaviour)HUDManager.Instance.holdingTwoHandedItem).enabled = toggle;
				((GrabbableObject)this).SetControlTipsForItem();
				SyncPincerTwoHandedServerRpc(toggle);
			}
		}

		[ServerRpc(RequireOwnership = false)]
		public void SyncPincerTwoHandedServerRpc(bool toggle)
		{
			SyncPincerTwoHandedClientRpc(toggle);
		}

		[ClientRpc]
		public void SyncPincerTwoHandedClientRpc(bool toggle)
		{
			if (!((NetworkBehaviour)this).IsOwner)
			{
				base.itemProperties.twoHanded = toggle;
				if (Object.op_Implicit((Object)(object)base.playerHeldBy))
				{
					base.playerHeldBy.twoHanded = toggle;
				}
			}
		}
	}
	[HarmonyPatch(typeof(PlayerControllerB))]
	public class PincerGrabPatch
	{
		[HarmonyPatch("BeginGrabObject")]
		[HarmonyPrefix]
		public static bool BeginGrabObjectPrefix(Camera ___gameplayCamera, float ___grabDistance, int ___interactableObjectsMask, float ___sinkingValue, bool ___inSpecialInteractAnimation, PlayerControllerB __instance)
		{
			//IL_0059: 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_006e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0075: 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_00e7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f3: 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_0102: Unknown result type (might be due to invalid IL or missing references)
			//IL_02c1: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)__instance.currentlyHeldObjectServer == (Object)null)
			{
				return true;
			}
			PincersObject pincersObject = default(PincersObject);
			if (!((Component)__instance.currentlyHeldObjectServer).TryGetComponent<PincersObject>(ref pincersObject))
			{
				return true;
			}
			if ((Object)(object)pincersObject.objectHeldByPincers != (Object)null)
			{
				return false;
			}
			__instance.interactRay = new Ray(((Component)___gameplayCamera).transform.position, ((Component)___gameplayCamera).transform.forward);
			if (!Physics.Raycast(__instance.interactRay, ref __instance.hit, ___grabDistance, ___interactableObjectsMask) || ((Component)((RaycastHit)(ref __instance.hit)).collider).gameObject.layer == 8 || !(((Component)((RaycastHit)(ref __instance.hit)).collider).tag == "PhysicsProp") || ___sinkingValue > 0.73f || Physics.Linecast(((Component)___gameplayCamera).transform.position, ((Component)((RaycastHit)(ref __instance.hit)).collider).transform.position + ((Component)__instance).transform.up * 0.16f, 1073741824, (QueryTriggerInteraction)1))
			{
				return false;
			}
			__instance.currentlyGrabbingObject = ((Component)((Component)((RaycastHit)(ref __instance.hit)).collider).transform).gameObject.GetComponent<GrabbableObject>();
			if (!GameNetworkManager.Instance.gameHasStarted && !__instance.currentlyGrabbingObject.itemProperties.canBeGrabbedBeforeGameStart && (Object)(object)StartOfRound.Instance.testRoom == (Object)null)
			{
				return false;
			}
			if ((Object)(object)__instance.currentlyGrabbingObject == (Object)null || ___inSpecialInteractAnimation || __instance.currentlyGrabbingObject.isHeld || __instance.currentlyGrabbingObject.isPocketed)
			{
				return false;
			}
			NetworkObject networkObject = ((NetworkBehaviour)__instance.currentlyGrabbingObject).NetworkObject;
			if ((Object)(object)networkObject == (Object)null || !networkObject.IsSpawned)
			{
				return false;
			}
			if (__instance.currentlyGrabbingObject.grabbable)
			{
				__instance.isGrabbingObjectAnimation = true;
				((Behaviour)__instance.cursorIcon).enabled = false;
				((TMP_Text)__instance.cursorTip).text = "";
				__instance.carryWeight = Mathf.Clamp(__instance.carryWeight + (__instance.currentlyGrabbingObject.itemProperties.weight - 1f), 1f, 10f);
				if (__instance.currentlyGrabbingObject.itemProperties.grabAnimationTime > 0f)
				{
					__instance.grabObjectAnimationTime = __instance.currentlyGrabbingObject.itemProperties.grabAnimationTime;
				}
				else
				{
					__instance.grabObjectAnimationTime = 0.4f;
				}
				if (!__instance.isTestingPlayer)
				{
					__instance.GrabObjectServerRpc(NetworkObjectReference.op_Implicit(networkObject));
				}
				if (__instance.grabObjectCoroutine != null)
				{
					((MonoBehaviour)__instance).StopCoroutine(__instance.grabObjectCoroutine);
				}
				__instance.grabObjectCoroutine = ((MonoBehaviour)__instance).StartCoroutine(GrabObjectPincerFix(__instance));
			}
			return false;
		}

		[HarmonyPatch("GrabObjectClientRpc")]
		[HarmonyPrefix]
		public static bool GrabObjectClientRpcPrefix(bool grabValidated, NetworkObjectReference grabbedObject, PlayerControllerB __instance)
		{
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0030: Invalid comparison between Unknown and I4
			//IL_0090: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = ((NetworkBehaviour)__instance).NetworkManager;
			if ((Object)(object)networkManager == (Object)null || !networkManager.IsListening)
			{
				return true;
			}
			if ((int)((NetworkBehaviour)__instance).__rpc_exec_stage != 2 || (!networkManager.IsClient && !networkManager.IsHost))
			{
				return true;
			}
			if ((Object)(object)__instance.currentlyHeldObjectServer == (Object)null)
			{
				return true;
			}
			PincersObject pincersObject = default(PincersObject);
			if (!((Component)__instance.currentlyHeldObjectServer).TryGetComponent<PincersObject>(ref pincersObject))
			{
				return true;
			}
			GrabbableObject componentInChildren = ((Component)NetworkObjectReference.op_Implicit(grabbedObject)).gameObject.GetComponentInChildren<GrabbableObject>();
			if (grabValidated)
			{
				componentInChildren.EnablePhysics(false);
				componentInChildren.hasHitGround = false;
				componentInChildren.isInFactory = __instance.isInsideFactory;
				__instance.SetItemInElevator(__instance.isInHangarShipRoom, __instance.isInElevator, componentInChildren);
				if (!((NetworkBehaviour)__instance).IsOwner)
				{
					componentInChildren.parentObject = pincersObject.holdPoint;
					__instance.isHoldingObject = true;
					__instance.carryWeight = Mathf.Clamp(__instance.carryWeight + (componentInChildren.itemProperties.weight - 1f), 1f, 10f);
					if ((Object)(object)componentInChildren.itemProperties.grabSFX != (Object)null)
					{
						__instance.itemAudio.PlayOneShot(componentInChildren.itemProperties.grabSFX, 1f);
						pincersObject.pincerAudioSource.PlayOneShot(pincersObject.pincerGrabClip, 1f);
					}
					if ((Object)(object)componentInChildren.playerHeldBy != (Object)null)
					{
						Debug.Log((object)$"playerHeldBy on grabbed object: {componentInChildren.playerHeldBy}");
					}
					else
					{
						Debug.Log((object)"grabbed object playerHeldBy is null");
					}
				}
			}
			else
			{
				Debug.Log((object)$"Player #{__instance.playerClientId}: Was grabbing object {((NetworkBehaviour)componentInChildren).NetworkObjectId} validated by server? : {grabValidated}");
				if (((NetworkBehaviour)__instance).IsOwner)
				{
					Debug.Log((object)"Local client got grab invalidated");
					__instance.grabInvalidated = true;
				}
			}
			pincersObject.objectHeldByPincers = componentInChildren;
			return false;
		}

		public static IEnumerator GrabObjectPincerFix(PlayerControllerB __instance)
		{
			PincersObject pincer = default(PincersObject);
			if ((Object)(object)__instance.currentlyHeldObjectServer == (Object)null || !((Component)__instance.currentlyHeldObjectServer).TryGetComponent<PincersObject>(ref pincer))
			{
				yield break;
			}
			__instance.grabbedObjectValidated = false;
			yield return (object)new WaitForSeconds(0.1f);
			__instance.currentlyGrabbingObject.parentObject = pincer.holdPoint;
			if ((Object)(object)__instance.currentlyGrabbingObject.itemProperties.grabSFX != (Object)null)
			{
				__instance.itemAudio.PlayOneShot(__instance.currentlyGrabbingObject.itemProperties.grabSFX, 1f);
				pincer.pincerAudioSource.PlayOneShot(pincer.pincerGrabClip, 1f);
			}
			while (!__instance.currentlyGrabbingObject.wasOwnerLastFrame && !__instance.grabInvalidated)
			{
				Debug.Log((object)$"grabInvalidated: {__instance.grabInvalidated}");
				yield return null;
			}
			if (__instance.grabInvalidated)
			{
				__instance.grabInvalidated = false;
				Debug.Log((object)("Grab was invalidated on object: " + ((Object)__instance.currentlyGrabbingObject).name));
				if ((Object)(object)__instance.currentlyGrabbingObject.playerHeldBy != (Object)null)
				{
					Debug.Log((object)$"playerHeldBy on currentlyGrabbingObject 2: {__instance.currentlyGrabbingObject.playerHeldBy}");
				}
				if ((Object)(object)__instance.currentlyGrabbingObject.parentObject == (Object)(object)__instance.localItemHolder)
				{
					if ((Object)(object)__instance.currentlyGrabbingObject.playerHeldBy != (Object)null)
					{
						Debug.Log((object)$"Grab invalidated; giving grabbed object to the client who got it first; {__instance.currentlyGrabbingObject.playerHeldBy}");
						__instance.currentlyGrabbingObject.parentObject = __instance.currentlyGrabbingObject.playerHeldBy.serverItemHolder;
					}
					else
					{
						Debug.Log((object)"Grab invalidated; no other client has possession of it, so set its parent object to null.");
						__instance.currentlyGrabbingObject.parentObject = null;
					}
				}
				__instance.SetSpecialGrabAnimationBool(false, (GrabbableObject)(object)pincer);
				if ((Object)(object)__instance.currentlyHeldObjectServer != (Object)null)
				{
				}
				__instance.carryWeight = Mathf.Clamp(__instance.carryWeight - (__instance.currentlyGrabbingObject.itemProperties.weight - 1f), 1f, 10f);
				__instance.isGrabbingObjectAnimation = false;
				__instance.currentlyGrabbingObject = null;
				yield break;
			}
			pincer.objectHeldByPincers = __instance.currentlyGrabbingObject;
			__instance.grabbedObjectValidated = true;
			if (Pincers.PincersModConfig.twoHandedPickupNatural.Value)
			{
				if (pincer.objectHeldByPincers.itemProperties.twoHanded)
				{
					pincer.PincerGrabTwoHanded(toggle: true);
				}
			}
			else
			{
				pincer.PincerGrabTwoHanded(toggle: true);
			}
			__instance.isHoldingObject = true;
			yield return (object)new WaitForSeconds(__instance.grabObjectAnimationTime - 0.2f);
			__instance.isGrabbingObjectAnimation = false;
		}

		[HarmonyPatch("DiscardHeldObject")]
		[HarmonyPrefix]
		public static bool DiscardHeldObjectPrefix(ref bool placeObject, ref NetworkObject parentObjectTo, ref Vector3 placePosition, ref bool matchRotationOfParent, PlayerControllerB __instance)
		{
			//IL_0245: Unknown result type (might be due to invalid IL or missing references)
			//IL_024a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0254: Unknown result type (might be due to invalid IL or missing references)
			//IL_0259: Unknown result type (might be due to invalid IL or missing references)
			//IL_025e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0263: Unknown result type (might be due to invalid IL or missing references)
			//IL_026d: Unknown result type (might be due to invalid IL or missing references)
			//IL_008a: Unknown result type (might be due to invalid IL or missing references)
			//IL_008f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0099: Unknown result type (might be due to invalid IL or missing references)
			//IL_009e: Unknown result type (might be due to invalid IL or missing references)
			//IL_00af: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
			//IL_05c2: Unknown result type (might be due to invalid IL or missing references)
			//IL_05c8: Unknown result type (might be due to invalid IL or missing references)
			//IL_05ca: Unknown result type (might be due to invalid IL or missing references)
			//IL_05cf: Unknown result type (might be due to invalid IL or missing references)
			//IL_05dd: Unknown result type (might be due to invalid IL or missing references)
			//IL_05e2: Unknown result type (might be due to invalid IL or missing references)
			//IL_05e6: Unknown result type (might be due to invalid IL or missing references)
			//IL_04bb: Unknown result type (might be due to invalid IL or missing references)
			//IL_04e8: Unknown result type (might be due to invalid IL or missing references)
			//IL_04ef: Unknown result type (might be due to invalid IL or missing references)
			//IL_04f5: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ab: 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_02ba: Unknown result type (might be due to invalid IL or missing references)
			//IL_02bf: 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_02c9: Unknown result type (might be due to invalid IL or missing references)
			//IL_02d3: Unknown result type (might be due to invalid IL or missing references)
			//IL_02d8: Unknown result type (might be due to invalid IL or missing references)
			//IL_014a: 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_0159: Unknown result type (might be due to invalid IL or missing references)
			//IL_015e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0163: Unknown result type (might be due to invalid IL or missing references)
			//IL_0168: Unknown result type (might be due to invalid IL or missing references)
			//IL_0172: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fc: 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_010b: 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_0126: Unknown result type (might be due to invalid IL or missing references)
			//IL_012b: Unknown result type (might be due to invalid IL or missing references)
			//IL_061d: Unknown result type (might be due to invalid IL or missing references)
			//IL_061f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0624: Unknown result type (might be due to invalid IL or missing references)
			//IL_0605: Unknown result type (might be due to invalid IL or missing references)
			//IL_0607: Unknown result type (might be due to invalid IL or missing references)
			//IL_060c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0552: Unknown result type (might be due to invalid IL or missing references)
			//IL_0558: Unknown result type (might be due to invalid IL or missing references)
			//IL_055a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0543: Unknown result type (might be due to invalid IL or missing references)
			//IL_042b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0430: Unknown result type (might be due to invalid IL or missing references)
			//IL_0414: Unknown result type (might be due to invalid IL or missing references)
			//IL_0419: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f7: Unknown result type (might be due to invalid IL or missing references)
			//IL_01fc: Unknown result type (might be due to invalid IL or missing references)
			//IL_0206: Unknown result type (might be due to invalid IL or missing references)
			//IL_020b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0210: Unknown result type (might be due to invalid IL or missing references)
			//IL_0215: Unknown result type (might be due to invalid IL or missing references)
			//IL_021f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0224: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b0: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b5: Unknown result type (might be due to invalid IL or missing references)
			//IL_01bf: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c4: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c9: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ce: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d8: Unknown result type (might be due to invalid IL or missing references)
			//IL_01dd: Unknown result type (might be due to invalid IL or missing references)
			//IL_055f: Unknown result type (might be due to invalid IL or missing references)
			//IL_056d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0572: Unknown result type (might be due to invalid IL or missing references)
			//IL_0576: Unknown result type (might be due to invalid IL or missing references)
			//IL_0435: Unknown result type (might be due to invalid IL or missing references)
			//IL_0441: Unknown result type (might be due to invalid IL or missing references)
			//IL_045f: Unknown result type (might be due to invalid IL or missing references)
			//IL_048c: Unknown result type (might be due to invalid IL or missing references)
			//IL_04a0: Unknown result type (might be due to invalid IL or missing references)
			//IL_062e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0644: Unknown result type (might be due to invalid IL or missing references)
			//IL_0667: Unknown result type (might be due to invalid IL or missing references)
			//IL_0674: Unknown result type (might be due to invalid IL or missing references)
			//IL_05ad: Unknown result type (might be due to invalid IL or missing references)
			//IL_05af: Unknown result type (might be due to invalid IL or missing references)
			//IL_05b4: Unknown result type (might be due to invalid IL or missing references)
			//IL_0593: Unknown result type (might be due to invalid IL or missing references)
			//IL_0595: Unknown result type (might be due to invalid IL or missing references)
			//IL_059a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0326: Unknown result type (might be due to invalid IL or missing references)
			//IL_032b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0337: Unknown result type (might be due to invalid IL or missing references)
			//IL_039c: Unknown result type (might be due to invalid IL or missing references)
			//IL_03a1: Unknown result type (might be due to invalid IL or missing references)
			//IL_03a6: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)__instance.currentlyHeldObjectServer == (Object)null)
			{
				return true;
			}
			PincersObject pincersObject = default(PincersObject);
			if (!((Component)__instance.currentlyHeldObjectServer).TryGetComponent<PincersObject>(ref pincersObject))
			{
				return true;
			}
			if ((Object)(object)pincersObject.objectHeldByPincers == (Object)null)
			{
				return true;
			}
			if (!placeObject)
			{
				Transform val = null;
				Ray val2 = default(Ray);
				if (pincersObject.objectHeldByPincers.itemProperties.allowDroppingAheadOfPlayer)
				{
					((Ray)(ref val2))..ctor(pincersObject.holdPoint.position + Vector3.up * 0.4f, ((Component)__instance.gameplayCamera).transform.forward);
					if (Physics.Raycast(val2, ref __instance.hit, 4f, 1342179585, (QueryTriggerInteraction)1))
					{
						val = ((Component)((RaycastHit)(ref __instance.hit)).collider).gameObject.transform;
						Debug.DrawRay(pincersObject.holdPoint.position + Vector3.up * 0.4f, ((Component)__instance.gameplayCamera).transform.forward * 1.7f, Color.yellow, 3f);
					}
					else
					{
						((Ray)(ref val2))..ctor(pincersObject.holdPoint.position + Vector3.up * 0.4f, -Vector3.up);
						if (Physics.Raycast(val2, ref __instance.hit, 4f, 1342179585, (QueryTriggerInteraction)1))
						{
							val = ((Component)((RaycastHit)(ref __instance.hit)).collider).gameObject.transform;
							Debug.DrawRay(pincersObject.holdPoint.position + Vector3.up * 0.4f, -Vector3.up * 1.7f, Color.yellow, 3f);
						}
						else
						{
							Debug.DrawRay(pincersObject.holdPoint.position + Vector3.up * 0.4f, -Vector3.up * 1.7f, Color.red, 3f);
						}
					}
				}
				else
				{
					((Ray)(ref val2))..ctor(pincersObject.holdPoint.position + Vector3.up * 0.4f, -Vector3.up);
					if (Physics.Raycast(val2, ref __instance.hit, 4f, 1342179585, (QueryTriggerInteraction)1))
					{
						val = ((Component)((RaycastHit)(ref __instance.hit)).collider).gameObject.transform;
						Debug.DrawRay(pincersObject.holdPoint.position + Vector3.up * 0.4f, -Vector3.up * 1.7f, Color.yellow, 3f);
					}
				}
				if ((Object)(object)val != (Object)null)
				{
					PlayerPhysicsRegion componentInChildren = ((Component)val).GetComponentInChildren<PlayerPhysicsRegion>();
					if ((Object)(object)componentInChildren != (Object)null && componentInChildren.allowDroppingItems && componentInChildren.itemDropCollider.ClosestPoint(((RaycastHit)(ref __instance.hit)).point) == ((RaycastHit)(ref __instance.hit)).point)
					{
						NetworkObject component = ((Component)val).GetComponent<NetworkObject>();
						if ((Object)(object)component != (Object)null)
						{
							Debug.Log((object)"parenting item to physics parent");
							placePosition = ((Component)component).transform.InverseTransformPoint(((Ray)(ref val2)).GetPoint(Mathf.Clamp(((RaycastHit)(ref __instance.hit)).distance - 0.3f, 0.01f, 500f)));
							parentObjectTo = component;
							placeObject = true;
							matchRotationOfParent = false;
						}
						else
						{
							Debug.LogError((object)("Error: physics region transform does not have network object?: " + ((Object)((Component)val).gameObject).name));
						}
					}
				}
			}
			if (placeObject)
			{
				if ((Object)(object)parentObjectTo == (Object)null)
				{
					__instance.throwingObject = true;
					placePosition = ((!__instance.isInElevator) ? StartOfRound.Instance.propsContainer.InverseTransformPoint(placePosition) : StartOfRound.Instance.elevatorTransform.InverseTransformPoint(placePosition));
					int num = (int)((Component)__instance).transform.localEulerAngles.y;
					__instance.SetObjectAsNoLongerHeld(__instance.isInElevator, __instance.isInHangarShipRoom, placePosition, pincersObject.objectHeldByPincers, num);
					pincersObject.PincerGrabTwoHanded(toggle: false);
					__instance.ThrowObjectServerRpc(NetworkObjectReference.op_Implicit(((Component)pincersObject.objectHeldByPincers).gameObject.GetComponent<NetworkObject>()), __instance.isInElevator, __instance.isInHangarShipRoom, placePosition, num);
				}
				else
				{
					__instance.PlaceGrabbableObject(((Component)parentObjectTo).transform, placePosition, matchRotationOfParent, pincersObject.objectHeldByPincers);
					pincersObject.PincerGrabTwoHanded(toggle: false);
					__instance.PlaceObjectServerRpc(NetworkObjectReference.op_Implicit(((Component)pincersObject.objectHeldByPincers).gameObject.GetComponent<NetworkObject>()), NetworkObjectReference.op_Implicit(parentObjectTo), placePosition, matchRotationOfParent);
				}
				return false;
			}
			__instance.throwingObject = true;
			bool flag = __instance.isInElevator;
			Bounds bounds;
			Vector3 val4;
			if (!__instance.isInElevator)
			{
				Vector3 val3 = ((!pincersObject.objectHeldByPincers.itemProperties.allowDroppingAheadOfPlayer) ? pincersObject.objectHeldByPincers.GetItemFloorPosition(default(Vector3)) : __instance.DropItemAheadOfPlayer());
				bounds = __instance.playersManager.shipBounds.bounds;
				if (!((Bounds)(ref bounds)).Contains(val3))
				{
					val4 = __instance.playersManager.propsContainer.InverseTransformPoint(val3);
				}
				else
				{
					flag = true;
					val4 = __instance.playersManager.elevatorTransform.InverseTransformPoint(val3);
				}
			}
			else
			{
				Vector3 itemFloorPosition = pincersObject.objectHeldByPincers.GetItemFloorPosition(default(Vector3));
				bounds = __instance.playersManager.shipBounds.bounds;
				if (!((Bounds)(ref bounds)).Contains(itemFloorPosition))
				{
					flag = false;
					val4 = __instance.playersManager.propsContainer.InverseTransformPoint(itemFloorPosition);
				}
				else
				{
					val4 = __instance.playersManager.elevatorTransform.InverseTransformPoint(itemFloorPosition);
				}
			}
			int num2 = (int)((Component)__instance).transform.localEulerAngles.y;
			__instance.SetObjectAsNoLongerHeld(flag, __instance.isInHangarShipRoom, val4, pincersObject.objectHeldByPincers, num2);
			pincersObject.PincerGrabTwoHanded(toggle: false);
			__instance.ThrowObjectServerRpc(NetworkObjectReference.op_Implicit(((NetworkBehaviour)pincersObject.objectHeldByPincers).NetworkObject), flag, __instance.isInHangarShipRoom, val4, num2);
			return false;
		}

		[HarmonyPatch("PlaceObjectClientRpc")]
		[HarmonyPrefix]
		public static bool PlaceObjectClientRpcPrefix(ref NetworkObjectReference parentObjectReference, Vector3 placePositionOffset, bool matchRotationOfParent, ref NetworkObjectReference grabbedObject, PlayerControllerB __instance)
		{
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: Invalid comparison between Unknown and I4
			//IL_0104: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f3: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = ((NetworkBehaviour)__instance).NetworkManager;
			if ((Object)(object)networkManager == (Object)null || !networkManager.IsListening)
			{
				return true;
			}
			if ((int)((NetworkBehaviour)__instance).__rpc_exec_stage != 2 || (!networkManager.IsClient && !networkManager.IsHost))
			{
				return true;
			}
			if ((Object)(object)__instance.currentlyHeldObjectServer == (Object)null)
			{
				return true;
			}
			PincersObject pincersObject = default(PincersObject);
			if (!((Component)__instance.currentlyHeldObjectServer).TryGetComponent<PincersObject>(ref pincersObject))
			{
				return true;
			}
			if ((Object)(object)pincersObject.objectHeldByPincers == (Object)null)
			{
				return true;
			}
			NetworkObject val = default(NetworkObject);
			if (((NetworkObjectReference)(ref grabbedObject)).TryGet(ref val, (NetworkManager)null))
			{
				GrabbableObject component = ((Component)val).GetComponent<GrabbableObject>();
				if (!((NetworkBehaviour)__instance).IsOwner)
				{
					NetworkObject val2 = default(NetworkObject);
					if (((NetworkObjectReference)(ref parentObjectReference)).TryGet(ref val2, (NetworkManager)null))
					{
						__instance.PlaceGrabbableObject(((Component)val2).transform, placePositionOffset, matchRotationOfParent, component);
					}
					else
					{
						__instance.PlaceGrabbableObject((Transform)null, placePositionOffset, matchRotationOfParent, component);
						Debug.LogError((object)$"Reference to parent object when placing was missing. object: {component} placed by {((Object)((Component)__instance).gameObject).name}");
					}
				}
				if (!component.itemProperties.syncDiscardFunction)
				{
					component.playerHeldBy = null;
				}
				else
				{
					Debug.LogError((object)"The server did not have a reference to the held object (when attempting to PLACE object on client.)");
				}
				if (((NetworkBehaviour)__instance).IsOwner)
				{
					__instance.throwingObject = false;
				}
				pincersObject.objectHeldByPincers = null;
				pincersObject.pincerAudioSource.PlayOneShot(pincersObject.pincerDropClip, 1f);
			}
			return false;
		}

		[HarmonyPatch("ThrowObjectClientRpc")]
		[HarmonyPrefix]
		public static bool ThrowObjectClientRpcPrefix(bool droppedInElevator, bool droppedInShipRoom, Vector3 targetFloorPosition, ref NetworkObjectReference grabbedObject, int floorYRot, PlayerControllerB __instance)
		{
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: Invalid comparison between Unknown and I4
			//IL_00db: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = ((NetworkBehaviour)__instance).NetworkManager;
			if ((Object)(object)networkManager == (Object)null || !networkManager.IsListening)
			{
				return true;
			}
			if ((int)((NetworkBehaviour)__instance).__rpc_exec_stage != 2 || (!networkManager.IsClient && !networkManager.IsHost))
			{
				return true;
			}
			if ((Object)(object)__instance.currentlyHeldObjectServer == (Object)null)
			{
				return true;
			}
			PincersObject pincersObject = default(PincersObject);
			if (!((Component)__instance.currentlyHeldObjectServer).TryGetComponent<PincersObject>(ref pincersObject))
			{
				return true;
			}
			if ((Object)(object)pincersObject.objectHeldByPincers == (Object)null)
			{
				return true;
			}
			NetworkObject val = default(NetworkObject);
			if (((NetworkObjectReference)(ref grabbedObject)).TryGet(ref val, (NetworkManager)null))
			{
				GrabbableObject component = ((Component)val).GetComponent<GrabbableObject>();
				if (!((NetworkBehaviour)__instance).IsOwner)
				{
					__instance.SetObjectAsNoLongerHeld(droppedInElevator, droppedInShipRoom, targetFloorPosition, component, -1);
				}
				if (!component.itemProperties.syncDiscardFunction)
				{
					component.playerHeldBy = null;
				}
			}
			else
			{
				Debug.LogError((object)"The server did not have a reference to the held object (when attempting to THROW on client.)");
			}
			if (((NetworkBehaviour)__instance).IsOwner)
			{
				__instance.throwingObject = false;
			}
			pincersObject.objectHeldByPincers = null;
			pincersObject.pincerAudioSource.PlayOneShot(pincersObject.pincerDropClip, 1f);
			return false;
		}

		[HarmonyPatch("SetObjectAsNoLongerHeld")]
		[HarmonyPrefix]
		public static bool SetObjectAsNoLongerHeldPrefix(bool droppedInElevator, bool droppedInShipRoom, Vector3 targetFloorPosition, GrabbableObject dropObject, int floorYRot, PlayerControllerB __instance)
		{
			//IL_00be: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fe: Unknown result type (might be due to invalid IL or missing references)
			//IL_0104: 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)
			if ((Object)(object)__instance.currentlyHeldObjectServer == (Object)null)
			{
				return true;
			}
			PincersObject pincersObject = default(PincersObject);
			if (!((Component)__instance.currentlyHeldObjectServer).TryGetComponent<PincersObject>(ref pincersObject))
			{
				return true;
			}
			if ((Object)(object)pincersObject.objectHeldByPincers == (Object)null)
			{
				return true;
			}
			dropObject.heldByPlayerOnServer = false;
			dropObject.parentObject = null;
			if (droppedInElevator)
			{
				((Component)dropObject).transform.SetParent(__instance.playersManager.elevatorTransform, true);
			}
			else
			{
				((Component)dropObject).transform.SetParent(__instance.playersManager.propsContainer, true);
			}
			__instance.SetItemInElevator(droppedInShipRoom, droppedInElevator, dropObject);
			dropObject.EnablePhysics(true);
			dropObject.EnableItemMeshes(true);
			((Component)dropObject).transform.localScale = dropObject.originalScale;
			dropObject.isHeld = false;
			dropObject.isPocketed = false;
			dropObject.fallTime = 0f;
			dropObject.startFallingPosition = ((Component)dropObject).transform.parent.InverseTransformPoint(((Component)dropObject).transform.position);
			dropObject.targetFloorPosition = targetFloorPosition;
			dropObject.floorYRot = floorYRot;
			__instance.carryWeight = Mathf.Clamp(__instance.carryWeight - (dropObject.itemProperties.weight - 1f), 1f, 10f);
			return false;
		}

		[HarmonyPatch("PlaceGrabbableObject")]
		[HarmonyPrefix]
		public static bool PlaceGrabbableObjectPrefix(Transform parentObject, Vector3 positionOffset, bool matchRotationOfParent, GrabbableObject placeObject, PlayerControllerB __instance)
		{
			//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ac: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c9: 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_0106: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)__instance.currentlyHeldObjectServer == (Object)null)
			{
				return true;
			}
			PincersObject pincersObject = default(PincersObject);
			if (!((Component)__instance.currentlyHeldObjectServer).TryGetComponent<PincersObject>(ref pincersObject))
			{
				return true;
			}
			if ((Object)(object)pincersObject.objectHeldByPincers == (Object)null)
			{
				return true;
			}
			placeObject.EnablePhysics(true);
			placeObject.EnableItemMeshes(true);
			placeObject.isHeld = false;
			placeObject.isPocketed = false;
			placeObject.heldByPlayerOnServer = false;
			__instance.SetItemInElevator(__instance.isInHangarShipRoom, __instance.isInElevator, placeObject);
			placeObject.parentObject = null;
			((Component)placeObject).transform.SetParent(parentObject, true);
			placeObject.startFallingPosition = ((Component)placeObject).transform.localPosition;
			((Component)placeObject).transform.localScale = placeObject.originalScale;
			((Component)placeObject).transform.localPosition = positionOffset;
			placeObject.targetFloorPosition = positionOffset;
			if (!matchRotationOfParent)
			{
				placeObject.fallTime = 0f;
			}
			else
			{
				((Component)placeObject).transform.localEulerAngles = new Vector3(0f, 0f, 0f);
				placeObject.fallTime = 1.1f;
			}
			placeObject.OnPlaceObject();
			__instance.carryWeight = Mathf.Clamp(__instance.carryWeight - (placeObject.itemProperties.weight - 1f), 1f, 10f);
			return false;
		}
	}
	[HarmonyPatch(typeof(PlaceableObjectsSurface))]
	public class PincerGrabPlace
	{
		[HarmonyPatch("PlaceObject")]
		[HarmonyPrefix]
		public static bool PlaceObjectPrefix(PlayerControllerB playerWhoTriggered, PlaceableObjectsSurface __instance)
		{
			//IL_0099: Unknown result type (might be due to invalid IL or missing references)
			//IL_009e: Unknown result type (might be due to invalid IL or missing references)
			//IL_009f: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a0: 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_00d2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d8: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)playerWhoTriggered.currentlyHeldObjectServer == (Object)null)
			{
				return true;
			}
			PincersObject pincersObject = default(PincersObject);
			if (!((Component)playerWhoTriggered.currentlyHeldObjectServer).TryGetComponent<PincersObject>(ref pincersObject))
			{
				return true;
			}
			if ((Object)(object)pincersObject.objectHeldByPincers == (Object)null)
			{
				return true;
			}
			if (!playerWhoTriggered.isHoldingObject || playerWhoTriggered.isGrabbingObjectAnimation || !((Object)(object)playerWhoTriggered.currentlyHeldObjectServer != (Object)null))
			{
				return false;
			}
			Debug.Log((object)"Placing object in storage");
			Vector3 val = __instance.itemPlacementPosition(((Component)playerWhoTriggered.gameplayCamera).transform, pincersObject.objectHeldByPincers);
			if (!(val == Vector3.zero))
			{
				if ((Object)(object)__instance.parentTo != (Object)null)
				{
					val = ((Component)__instance.parentTo).transform.InverseTransformPoint(val);
				}
				playerWhoTriggered.DiscardHeldObject(true, __instance.parentTo, val, false);
				Debug.Log((object)"discard held object called from placeobject");
			}
			return false;
		}
	}
	[HarmonyPatch(typeof(DepositItemsDesk))]
	public class PincerDepositItemDesk
	{
		[HarmonyPatch("PlaceItemOnCounter")]
		[HarmonyPrefix]
		public static bool PlaceItemOnCounterPrefix(PlayerControllerB playerWhoTriggered, DepositItemsDesk __instance)
		{
			//IL_0096: Unknown result type (might be due to invalid IL or missing references)
			//IL_009b: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
			//IL_00af: Unknown result type (might be due to invalid IL or missing references)
			//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_00c4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ce: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00dd: Unknown result type (might be due to invalid IL or missing references)
			//IL_012b: Unknown result type (might be due to invalid IL or missing references)
			//IL_012d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0132: Unknown result type (might be due to invalid IL or missing references)
			//IL_0145: Unknown result type (might be due to invalid IL or missing references)
			//IL_0158: 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_0102: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)playerWhoTriggered.currentlyHeldObjectServer == (Object)null)
			{
				return true;
			}
			PincersObject pincersObject = default(PincersObject);
			if (!((Component)playerWhoTriggered.currentlyHeldObjectServer).TryGetComponent<PincersObject>(ref pincersObject))
			{
				return true;
			}
			if ((Object)(object)pincersObject.objectHeldByPincers == (Object)null)
			{
				return true;
			}
			if (((Component)__instance.deskObjectsContainer).GetComponentsInChildren<GrabbableObject>().Length < 12 && !__instance.inGrabbingObjectsAnimation && (Object)(object)GameNetworkManager.Instance != (Object)null && (Object)(object)playerWhoTriggered == (Object)(object)GameNetworkManager.Instance.localPlayerController)
			{
				Vector3 val = RoundManager.RandomPointInBounds(((Collider)__instance.triggerCollider).bounds);
				Bounds bounds = ((Collider)__instance.triggerCollider).bounds;
				val.y = ((Bounds)(ref bounds)).min.y;
				RaycastHit val2 = default(RaycastHit);
				if (Physics.Raycast(new Ray(val + Vector3.up * 3f, Vector3.down), ref val2, 8f, 1048640, (QueryTriggerInteraction)2))
				{
					val = ((RaycastHit)(ref val2)).point;
				}
				val.y += pincersObject.objectHeldByPincers.itemProperties.verticalOffset;
				val = ((Component)__instance.deskObjectsContainer).transform.InverseTransformPoint(val);
				__instance.AddObjectToDeskServerRpc(NetworkObjectReference.op_Implicit(((Component)pincersObject.objectHeldByPincers).gameObject.GetComponent<NetworkObject>()));
				playerWhoTriggered.DiscardHeldObject(true, __instance.deskObjectsContainer, val, false);
				Debug.Log((object)"discard held object called from deposit items desk");
			}
			return false;
		}
	}
}
namespace System.Runtime.CompilerServices
{
	[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]
	internal sealed class IgnoresAccessChecksToAttribute : Attribute
	{
		public IgnoresAccessChecksToAttribute(string assemblyName)
		{
		}
	}
}

SCPContainer.dll

Decompiled 9 hours ago
using System;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Serialization;
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 CustomItemBehaviourLibrary.AbstractItems;
using GameNetcodeStuff;
using HarmonyLib;
using LethalCompanyInputUtils.Api;
using LethalLib.Extras;
using LethalLib.Modules;
using Microsoft.CodeAnalysis;
using SCPContainer.Behaviour;
using SCPContainer.Compat;
using SCPContainer.Input;
using SCPContainer.Misc;
using SCPContainer.NetcodePatcher;
using SCPContainer.Util;
using Unity.Netcode;
using UnityEngine;
using UnityEngine.InputSystem;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.0.0.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.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableAttribute : Attribute
	{
		public readonly byte[] NullableFlags;

		public NullableAttribute(byte P_0)
		{
			NullableFlags = new byte[1] { P_0 };
		}

		public NullableAttribute(byte[] P_0)
		{
			NullableFlags = P_0;
		}
	}
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableContextAttribute : Attribute
	{
		public readonly byte Flag;

		public NullableContextAttribute(byte P_0)
		{
			Flag = P_0;
		}
	}
	[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 SCPContainer
{
	[BepInPlugin("com.github.WhiteSpike.SCPContainer", "SCP Container", "1.0.0")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	public class Plugin : BaseUnityPlugin
	{
		internal static readonly Harmony harmony = new Harmony("com.github.WhiteSpike.SCPContainer");

		internal static readonly ManualLogSource mls = Logger.CreateLogSource("SCP Container");

		public static PluginConfig Config;

		private void Awake()
		{
			//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ac: 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_00c6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00db: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e0: Unknown result type (might be due to invalid IL or missing references)
			//IL_0168: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b8: Unknown result type (might be due to invalid IL or missing references)
			//IL_02bd: Unknown result type (might be due to invalid IL or missing references)
			//IL_02de: Unknown result type (might be due to invalid IL or missing references)
			//IL_02e3: Unknown result type (might be due to invalid IL or missing references)
			//IL_02f4: Unknown result type (might be due to invalid IL or missing references)
			//IL_02f9: Unknown result type (might be due to invalid IL or missing references)
			//IL_02fe: Unknown result type (might be due to invalid IL or missing references)
			//IL_0308: Expected O, but got Unknown
			//IL_0311: Unknown result type (might be due to invalid IL or missing references)
			//IL_0316: Unknown result type (might be due to invalid IL or missing references)
			//IL_0327: Expected O, but got Unknown
			Config = new PluginConfig(((BaseUnityPlugin)this).Config);
			string text = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "scpcontainer");
			AssetBundle val = AssetBundle.LoadFromFile(text);
			string text2 = "Assets/SCP Container/";
			Item val2 = ScriptableObject.CreateInstance<Item>();
			((Object)val2).name = "SCPContainerItemProperties";
			val2.allowDroppingAheadOfPlayer = SyncedEntry<bool>.op_Implicit(Config.DROP_AHEAD_PLAYER);
			val2.canBeGrabbedBeforeGameStart = SyncedEntry<bool>.op_Implicit(Config.GRABBED_BEFORE_START);
			val2.canBeInspected = false;
			val2.creditsWorth = SyncedEntry<int>.op_Implicit(Config.PRICE);
			val2.floorYOffset = 0;
			val2.restingRotation = new Vector3(0f, 0f, 0f);
			val2.rotationOffset = new Vector3(0f, 90f, 0f);
			val2.positionOffset = new Vector3(0f, -0.35f, 0.3f);
			val2.verticalOffset = 0f;
			val2.weight = 0.99f + (float)SyncedEntry<int>.op_Implicit(Config.WEIGHT) / 100f;
			val2.isScrap = false;
			val2.twoHanded = true;
			val2.itemIcon = val.LoadAsset<Sprite>(text2 + "Icon.png");
			val2.spawnPrefab = val.LoadAsset<GameObject>(text2 + "SCPContainer.prefab");
			val2.spawnPrefab.transform.localScale = new Vector3(0.7f, 0.7f, 0.7f);
			val2.dropSFX = val.LoadAsset<AudioClip>(text2 + "Drop.ogg");
			val2.grabSFX = val.LoadAsset<AudioClip>(text2 + "Grab.ogg");
			val2.pocketSFX = val.LoadAsset<AudioClip>(text2 + "Pocket.ogg");
			val2.throwSFX = val.LoadAsset<AudioClip>(text2 + "Throw.ogg");
			val2.highestSalePercentage = SyncedEntry<int>.op_Implicit(Config.HIGHEST_SALE_PERCENTAGE);
			val2.itemName = "SCP Container";
			val2.itemSpawnsOnGround = true;
			val2.isConductiveMetal = SyncedEntry<bool>.op_Implicit(Config.CONDUCTIVE);
			val2.requiresBattery = false;
			val2.batteryUsage = 0f;
			val2.twoHandedAnimation = true;
			val2.grabAnim = "HoldJetpack";
			ScpContainerBehaviour scpContainerBehaviour = val2.spawnPrefab.AddComponent<ScpContainerBehaviour>();
			((GrabbableObject)scpContainerBehaviour).itemProperties = val2;
			((GrabbableObject)scpContainerBehaviour).grabbable = true;
			((GrabbableObject)scpContainerBehaviour).grabbableToEnemies = true;
			Utilities.FixMixerGroups(val2.spawnPrefab);
			NetworkPrefabs.RegisterNetworkPrefab(val2.spawnPrefab);
			TerminalNode val3 = SetupInfoNode();
			Items.RegisterShopItem(val2, (TerminalNode)null, (TerminalNode)null, val3, val2.creditsWorth);
			if (SyncedEntry<bool>.op_Implicit(Config.SCRAP))
			{
				AnimationCurve curve = new AnimationCurve((Keyframe[])(object)new Keyframe[3]
				{
					new Keyframe(0f, 0f),
					new Keyframe(1f - Config.RARITY.Value, 1f),
					new Keyframe(1f, 1f)
				});
				SpawnableMapObjectDef val4 = ScriptableObject.CreateInstance<SpawnableMapObjectDef>();
				val4.spawnableMapObject = new SpawnableMapObject
				{
					prefabToSpawn = val2.spawnPrefab
				};
				MapObjects.RegisterMapObject(val4, (LevelTypes)(-1), (Func<SelectableLevel, AnimationCurve>)((SelectableLevel _) => curve));
			}
			InputUtilsCompat.Init();
			harmony.PatchAll(typeof(Keybinds));
			mls.LogInfo((object)"SCP Container 1.0.0 has been loaded successfully.");
		}

		internal static TerminalNode SetupInfoNode()
		{
			TerminalNode val = ScriptableObject.CreateInstance<TerminalNode>();
			val.displayText = val.displayText + GetDisplayInfo() + "\n";
			val.clearPreviousText = true;
			return val;
		}

		public static string GetDisplayInfo()
		{
			return $"A portable container which has a maximum capacity of {Config.MAXIMUM_AMOUNT_ITEMS.Value}" + $" and reduces the effective weight of the inserted items by {Config.WEIGHT_REDUCTION_MULTIPLIER.Value * 100f} %.\n" + " Helps subjudgate negative effects from item carried within\n" + $"It weighs {Config.WEIGHT.Value} lbs";
		}
	}
	public static class PluginInfo
	{
		public const string PLUGIN_GUID = "SCPContainer";

		public const string PLUGIN_NAME = "SCPContainer";

		public const string PLUGIN_VERSION = "1.0.0";
	}
}
namespace SCPContainer.Util
{
	internal static class Constants
	{
		internal const string ITEM_SCAN_NODE_KEY_FORMAT = "Enable scan node of {0}";

		internal const bool ITEM_SCAN_NODE_DEFAULT = true;

		internal const string ITEM_SCAN_NODE_DESCRIPTION = "Shows a scan node on the item when scanning";

		internal const string SCP_CONTAINER_PRICE_KEY = "SCP Container price";

		internal const int SCP_CONTAINER_PRICE_DEFAULT = 500;

		internal const string SCP_CONTAINER_PRICE_DESCRIPTION = "Price for SCP Container.";

		internal const string SCP_CONTAINER_WEIGHT_KEY = "Item weight";

		internal const int SCP_CONTAINER_WEIGHT_DEFAULT = 15;

		internal const string SCP_CONTAINER_WEIGHT_DESCRIPTION = "Weight (in lbs)";

		internal const string SCP_CONTAINER_CONDUCTIVE_KEY = "Conductive";

		internal const bool SCP_CONTAINER_CONDUCTIVE_DEFAULT = true;

		internal const string SCP_CONTAINER_CONDUCTIVE_DESCRIPTION = "Wether it attracts lightning to the item or not. (Or other mechanics that rely on item being conductive)";

		internal const string SCP_CONTAINER_DROP_AHEAD_PLAYER_KEY = "Drop ahead of player when dropping";

		internal const bool SCP_CONTAINER_DROP_AHEAD_PLAYER_DEFAULT = true;

		internal const string SCP_CONTAINER_DROP_AHEAD_PLAYER_DESCRIPTION = "If on, the item will drop infront of the player. Otherwise, drops underneath them and slightly infront.";

		internal const string SCP_CONTAINER_GRABBED_BEFORE_START_KEY = "Grabbable before game start";

		internal const bool SCP_CONTAINER_GRABBED_BEFORE_START_DEFAULT = true;

		internal const string SCP_CONTAINER_GRABBED_BEFORE_START_DESCRIPTION = "Allows wether the item can be grabbed before hand or not";

		internal const string SCP_CONTAINER_HIGHEST_SALE_PERCENTAGE_KEY = "Highest Sale Percentage";

		internal const int SCP_CONTAINER_HIGHEST_SALE_PERCENTAGE_DEFAULT = 50;

		internal const string SCP_CONTAINER_HIGHEST_SALE_PERCENTAGE_DESCRIPTION = "Maximum percentage of sale allowed when this item is selected for a sale.";

		internal const string SCP_CONTAINER_MAXIMUM_AMOUNT_ITEMS_KEY = "Maximum amount of items for SCP Container";

		internal const int SCP_CONTAINER_MAXIMUM_AMOUNT_ITEMS_DEFAULT = 4;

		internal const string SCP_CONTAINER_MAXIMUM_AMOUNT_ITEMS_DESCRIPTION = "Amount of items allowed before the SCP Container is considered full";

		internal const string SCP_CONTAINER_RARITY_KEY = "Spawn Chance of the SCP Container Item";

		internal const float SCP_CONTAINER_RARITY_DEFAULT = 0.1f;

		internal const string SCP_CONTAINER_RARITY_DESCRIPTION = "How likely it is for a SCP Container item to spawn when landing on a moon. (0.1 = 10%)";

		internal const string SCP_CONTAINER_WEIGHT_REDUCTION_MULTIPLIER_KEY = "Weight reduction multiplier for SCP Container";

		internal const float SCP_CONTAINER_WEIGHT_REDUCTION_MULTIPLIER_DEFAULT = 0.7f;

		internal const string SCP_CONTAINER_WEIGHT_REDUCTION_MUTLIPLIER_DESCRIPTION = "How much an item's weight will be ignored to the SCP Container's total weight";

		internal const string SCP_CONTAINER_SCRAP_KEY = "Scrap Item";

		internal const bool SCP_CONTAINER_SCRAP_DEFAULT = false;

		internal const string SCP_CONTAINER_SCRAP_DESCRIPTION = "If true, it can spawn inside the facility. It won't have a scrap value to be sold for The Company.";

		internal const string DROP_ALL_ITEMS_SCP_CONTAINER_KEYBIND_NAME = "Drop all items from container";

		internal const string DROP_ALL_ITEMS_SCP_CONTAINER_DEFAULT_KEYBIND = "<Mouse>/middleButton";

		internal static readonly string SCP_CONTAINER_SCAN_NODE_KEY = string.Format("Enable scan node of {0}", "SCP Container");
	}
}
namespace SCPContainer.Misc
{
	[DataContract]
	public class PluginConfig : SyncedConfig2<PluginConfig>
	{
		[field: SyncedEntryField]
		public SyncedEntry<bool> SCAN_NODE { get; set; }

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

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

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

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

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

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

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

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

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

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

		public PluginConfig(ConfigFile cfg)
			: base("com.github.WhiteSpike.SCPContainer")
		{
			string text = "SCP Container";
			PRICE = SyncedBindingExtensions.BindSyncedEntry<int>(cfg, text, "SCP Container price", 500, "Price for SCP Container.");
			WEIGHT = SyncedBindingExtensions.BindSyncedEntry<int>(cfg, text, "Item weight", 15, "Weight (in lbs)");
			SCAN_NODE = SyncedBindingExtensions.BindSyncedEntry<bool>(cfg, text, Constants.SCP_CONTAINER_SCAN_NODE_KEY, true, "Shows a scan node on the item when scanning");
			DROP_AHEAD_PLAYER = SyncedBindingExtensions.BindSyncedEntry<bool>(cfg, text, "Drop ahead of player when dropping", true, "If on, the item will drop infront of the player. Otherwise, drops underneath them and slightly infront.");
			CONDUCTIVE = SyncedBindingExtensions.BindSyncedEntry<bool>(cfg, text, "Conductive", true, "Wether it attracts lightning to the item or not. (Or other mechanics that rely on item being conductive)");
			GRABBED_BEFORE_START = SyncedBindingExtensions.BindSyncedEntry<bool>(cfg, text, "Grabbable before game start", true, "Allows wether the item can be grabbed before hand or not");
			HIGHEST_SALE_PERCENTAGE = SyncedBindingExtensions.BindSyncedEntry<int>(cfg, text, "Highest Sale Percentage", 50, "Maximum percentage of sale allowed when this item is selected for a sale.");
			MAXIMUM_AMOUNT_ITEMS = SyncedBindingExtensions.BindSyncedEntry<int>(cfg, text, "Maximum amount of items for SCP Container", 4, "Amount of items allowed before the SCP Container is considered full");
			WEIGHT_REDUCTION_MULTIPLIER = SyncedBindingExtensions.BindSyncedEntry<float>(cfg, text, "Weight reduction multiplier for SCP Container", 0.7f, "How much an item's weight will be ignored to the SCP Container's total weight");
			SCRAP = SyncedBindingExtensions.BindSyncedEntry<bool>(cfg, text, "Scrap Item", false, "If true, it can spawn inside the facility. It won't have a scrap value to be sold for The Company.");
			RARITY = SyncedBindingExtensions.BindSyncedEntry<float>(cfg, text, "Spawn Chance of the SCP Container Item", 0.1f, "How likely it is for a SCP Container item to spawn when landing on a moon. (0.1 = 10%)");
			ConfigManager.Register<PluginConfig>((SyncedConfig2<PluginConfig>)this);
		}
	}
	internal static class Metadata
	{
		public const string GUID = "com.github.WhiteSpike.SCPContainer";

		public const string NAME = "SCP Container";

		public const string VERSION = "1.0.0";
	}
	internal static class Tools
	{
		internal enum NodeType
		{
			GENERAL,
			DANGER,
			SCRAP
		}

		private static GameObject CreateCanvasScanNode(ref GameObject objectToAddScanNode)
		{
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = Object.Instantiate<GameObject>(GameObject.CreatePrimitive((PrimitiveType)3), objectToAddScanNode.transform.position, Quaternion.Euler(Vector3.zero), objectToAddScanNode.transform);
			((Object)val).name = "ScanNode";
			val.layer = LayerMask.NameToLayer("ScanNode");
			Object.Destroy((Object)(object)val.GetComponent<MeshRenderer>());
			Object.Destroy((Object)(object)val.GetComponent<MeshFilter>());
			return val;
		}

		private static void AddScanNode(GameObject objectToAddScanNode, NodeType nodeType, string header = "LGU Scan Node", string subText = "Used for LGU stuff", int creatureScanID = -1, int minRange = 2, int maxRange = 7)
		{
			GameObject val = CreateCanvasScanNode(ref objectToAddScanNode);
			ScanNodeProperties scanNodeProperties = val.AddComponent<ScanNodeProperties>();
			ChangeScanNode(ref scanNodeProperties, nodeType, header, subText, creatureScanID, 0, minRange, maxRange);
		}

		public static void AddGeneralScanNode(GameObject objectToAddScanNode, string header = "LGU Scan Node", string subText = "Used for LGU stuff", int creatureScanID = -1, int minRange = 2, int maxRange = 7)
		{
			AddScanNode(objectToAddScanNode, NodeType.GENERAL, header, subText, creatureScanID, minRange, maxRange);
		}

		public static void ChangeScanNode(ref ScanNodeProperties scanNodeProperties, NodeType nodeType, string header = "LGU Scan Node", string subText = "Used for LGU stuff", int creatureScanID = -1, int scrapValue = 0, int minRange = 2, int maxRange = 7)
		{
			scanNodeProperties.headerText = header;
			scanNodeProperties.subText = subText;
			scanNodeProperties.nodeType = (int)nodeType;
			scanNodeProperties.creatureScanID = creatureScanID;
			scanNodeProperties.scrapValue = scrapValue;
			scanNodeProperties.minRange = minRange;
			scanNodeProperties.maxRange = maxRange;
		}
	}
}
namespace SCPContainer.Input
{
	internal class IngameKeybinds : LcInputActions
	{
		public static IngameKeybinds Instance;

		[InputAction("<Mouse>/middleButton", Name = "Drop all items from container")]
		public InputAction SCPContainerKey { get; set; }

		internal static InputActionAsset GetAsset()
		{
			return ((LcInputActions)Instance).Asset;
		}
	}
	[HarmonyPatch]
	internal static class Keybinds
	{
		public static InputActionAsset Asset;

		public static InputActionMap ActionMap;

		public static InputAction SCPContainerAction;

		public static PlayerControllerB localPlayerController => StartOfRound.Instance?.localPlayerController;

		[HarmonyPatch(typeof(PreInitSceneScript), "Awake")]
		[HarmonyPrefix]
		public static void AddToKeybindMenu()
		{
			//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)
			Asset = InputUtilsCompat.Asset;
			ActionMap = Asset.actionMaps[0];
			SCPContainerAction = InputUtilsCompat.SCPContainerKey;
		}

		[HarmonyPatch(typeof(StartOfRound), "OnEnable")]
		[HarmonyPostfix]
		public static void OnEnable()
		{
			Asset.Enable();
			SCPContainerAction.performed += OnSCPContainerActionActionPerformed;
		}

		[HarmonyPatch(typeof(StartOfRound), "OnDisable")]
		[HarmonyPostfix]
		public static void OnDisable()
		{
			Asset.Disable();
			SCPContainerAction.performed -= OnSCPContainerActionActionPerformed;
		}

		private static void OnSCPContainerActionActionPerformed(CallbackContext context)
		{
			if (!((Object)(object)localPlayerController == (Object)null) && localPlayerController.isPlayerControlled && (!((NetworkBehaviour)localPlayerController).IsServer || localPlayerController.isHostPlayerObject) && Object.op_Implicit((Object)(object)localPlayerController.currentlyHeldObjectServer))
			{
				ScpContainerBehaviour component = ((Component)localPlayerController.currentlyHeldObjectServer).GetComponent<ScpContainerBehaviour>();
				if (Object.op_Implicit((Object)(object)component))
				{
					((ContainerBehaviour)component).UpdateContainerDrop();
				}
			}
		}
	}
}
namespace SCPContainer.Compat
{
	public static class InputUtilsCompat
	{
		internal static InputActionAsset Asset => IngameKeybinds.GetAsset();

		public static InputAction SCPContainerKey => IngameKeybinds.Instance.SCPContainerKey;

		internal static void Init()
		{
			IngameKeybinds.Instance = new IngameKeybinds();
		}
	}
}
namespace SCPContainer.Behaviour
{
	internal class ScpContainerBehaviour : ContainerBehaviour
	{
		internal const string ITEM_NAME = "SCP Container";

		internal const string ITEM_DESCRIPTION = "Allows carrying dangerous items";

		protected bool KeepScanNode => SyncedEntry<bool>.op_Implicit(Plugin.Config.SCAN_NODE);

		public override void Start()
		{
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			((ContainerBehaviour)this).Start();
			if (!KeepScanNode)
			{
				Object.Destroy((Object)(object)((Component)this).gameObject.GetComponentInChildren<ScanNodeProperties>());
			}
			PluginConfig config = Plugin.Config;
			base.maximumAmountItems = config.MAXIMUM_AMOUNT_ITEMS.Value;
			base.weightReduceMultiplier = config.WEIGHT_REDUCTION_MULTIPLIER.Value;
			base.restriction = (Restrictions)2;
			base.maximumWeightAllowed = 0f;
			base.noiseRange = 0f;
			base.sloppiness = 1f;
			base.lookSensitivityDrawback = 1f;
			base.makeItemsInvisible = true;
			base.playSounds = false;
			base.wheelsClip = Array.Empty<AudioClip>();
		}

		protected override bool ShowDepositPrompts()
		{
			PlayerControllerB localPlayerController = GameNetworkManager.Instance.localPlayerController;
			return localPlayerController.isHoldingObject && (Object)(object)((GrabbableObject)this).playerHeldBy != (Object)(object)localPlayerController;
		}

		protected override void SetupScanNodeProperties()
		{
			ScanNodeProperties scanNodeProperties = ((Component)this).GetComponentInChildren<ScanNodeProperties>();
			if ((Object)(object)scanNodeProperties != (Object)null)
			{
				Tools.ChangeScanNode(ref scanNodeProperties, (Tools.NodeType)scanNodeProperties.nodeType, "SCP Container", "Allows carrying dangerous items");
			}
			else
			{
				Tools.AddGeneralScanNode(((Component)this).gameObject, "SCP Container", "Allows carrying dangerous items");
			}
		}

		protected override string[] SetupContainerTooltips()
		{
			string bindingDisplayString = InputActionRebindingExtensions.GetBindingDisplayString(IngameKeybinds.Instance.SCPContainerKey, (DisplayStringOptions)0, (string)null);
			return new string[1] { "Drop all items: [" + bindingDisplayString + "]" };
		}

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

		protected internal override string __getTypeName()
		{
			return "ScpContainerBehaviour";
		}
	}
}
namespace System.Runtime.CompilerServices
{
	[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]
	internal sealed class IgnoresAccessChecksToAttribute : Attribute
	{
		public IgnoresAccessChecksToAttribute(string assemblyName)
		{
		}
	}
}
namespace SCPContainer.NetcodePatcher
{
	[AttributeUsage(AttributeTargets.Module)]
	internal class NetcodePatchedAssemblyAttribute : Attribute
	{
	}
}