Decompiled source of LandMinePlacer v1.0.1

LandminePlacer.dll

Decompiled 10 months ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using GameNetcodeStuff;
using LethalLib.Modules;
using Microsoft.CodeAnalysis;
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: AssemblyCompany("alexandre v1")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyDescription("A Lethal Company mod that add a new item for placing mine")]
[assembly: AssemblyFileVersion("1.0.1.0")]
[assembly: AssemblyInformationalVersion("1.0.1+ac4d446e9022637c087d5c57673a7e20d77e5b30")]
[assembly: AssemblyProduct("Landmine Placer")]
[assembly: AssemblyTitle("LandminePlacer")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.1.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
internal class <Module>
{
	static <Module>()
	{
		NetworkVariableSerializationTypes.InitializeSerializer_UnmanagedByMemcpy<bool>();
		NetworkVariableSerializationTypes.InitializeEqualityChecker_UnmanagedIEquatable<bool>();
	}
}
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 LandminePlacer
{
	public static class Config
	{
		public static ConfigEntry<bool> InfiniteLandmines { get; private set; }

		public static ConfigEntry<int> MaxLandmines { get; private set; }

		public static ConfigEntry<int> LandminePlacerSpawnChance { get; private set; }

		public static ConfigEntry<bool> LandminePlacerInShop { get; private set; }

		public static ConfigEntry<int> LandminePlacerShopPrice { get; private set; }

		public static void Load()
		{
			ConfigFile configFile = Plugin.ConfigFile;
			InfiniteLandmines = configFile.Bind<bool>("Landmine Placer", "InfiniteLandmines", false, "Infinite landmines, true = infinite, false = use MaxLandmines");
			MaxLandmines = configFile.Bind<int>("Landmine Placer", "MaxLandmines", 1, "Max landmines per LandminePlacer, only used if InfiniteLandmines is false");
			LandminePlacerSpawnChance = configFile.Bind<int>("Landmine Placer", "LandminePlacerSpawnChance", 80, "Chance of a LandminePlacer item spawning, higher = more common");
			LandminePlacerInShop = configFile.Bind<bool>("Landmine Placer", "LandminePlacerInShop", false, "Whether or not the LandminePlacer should be in the shop, true = in shop, false = not in shop");
			LandminePlacerShopPrice = configFile.Bind<int>("Landmine Placer", "LandminePlacerShopPrice", 70, "Price of the LandminePlacer in the shop, only used if LandminePlacerInShop is true");
		}
	}
	public class LandminePlacer : PhysicsProp
	{
		private readonly NetworkVariable<int> _maxLandmines = new NetworkVariable<int>(0, (NetworkVariableReadPermission)0, (NetworkVariableWritePermission)0);

		private readonly NetworkVariable<bool> _infiniteLandmines = new NetworkVariable<bool>(false, (NetworkVariableReadPermission)0, (NetworkVariableWritePermission)0);

		private readonly NetworkVariable<int> _landminesPlaced = new NetworkVariable<int>(0, (NetworkVariableReadPermission)0, (NetworkVariableWritePermission)0);

		public override void OnNetworkSpawn()
		{
			((GrabbableObject)this).Start();
			if (((NetworkBehaviour)this).IsHost)
			{
				_maxLandmines.Value = Config.MaxLandmines?.Value ?? 3;
				_infiniteLandmines.Value = Config.InfiniteLandmines?.Value ?? false;
				UpdateGrabTooltipClientRpc(_landminesPlaced.Value, _maxLandmines.Value, _infiniteLandmines.Value);
			}
		}

		public override void ItemActivate(bool used, bool buttonDown = true)
		{
			((GrabbableObject)this).ItemActivate(used, buttonDown);
			if (((NetworkBehaviour)this).IsOwner)
			{
				TryPlaceLandmine(buttonDown);
			}
		}

		public override void EquipItem()
		{
			UpdateItemTooltip(_landminesPlaced.Value, _maxLandmines.Value, _infiniteLandmines.Value);
			((GrabbableObject)this).EquipItem();
		}

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

		public void TryPlaceLandmine(bool buttonDown)
		{
			if (!buttonDown)
			{
				return;
			}
			if (IsPlayer())
			{
				if (CanPlaceLandmine())
				{
					PlaceLandMine(((Component)((GrabbableObject)this).playerHeldBy).transform);
					LandminePlacedServerRpc();
				}
				else
				{
					DestroyObjectInHandClientRpc();
				}
			}
			else
			{
				PlaceLandMine(((Component)((GrabbableObject)this).parentObject).transform);
				LandminePlacedServerRpc();
			}
		}

		private void PlaceLandMine(Transform userTransform)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			Vector3 position = userTransform.position;
			Vector3 position2 = position + userTransform.forward * 1.5f;
			PlaceLandmineAtServerRpc(position2);
		}

		[ServerRpc(RequireOwnership = false)]
		private void PlaceLandmineAtServerRpc(Vector3 position)
		{
			//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_0089: 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_00cf: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager == null || !networkManager.IsListening)
			{
				return;
			}
			if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost))
			{
				ServerRpcParams val = default(ServerRpcParams);
				FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(3176384049u, val, (RpcDelivery)0);
				((FastBufferWriter)(ref val2)).WriteValueSafe(ref position);
				((NetworkBehaviour)this).__endSendServerRpc(ref val2, 3176384049u, val, (RpcDelivery)0);
			}
			if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost))
			{
				GameObject val3 = Object.Instantiate<GameObject>(Plugin.Landmine, position, Quaternion.identity);
				val3.SetActive(true);
				NetworkObject component = val3.GetComponent<NetworkObject>();
				if ((Object)(object)component == (Object)null)
				{
					Plugin.Log.LogError((object)"NetworkObject is missing on the instantiated landmine.");
				}
				else
				{
					component.Spawn(false);
				}
			}
		}

		[ServerRpc(RequireOwnership = false)]
		private void LandminePlacedServerRpc()
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_008c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0096: Invalid comparison between Unknown and I4
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager == null || !networkManager.IsListening)
			{
				return;
			}
			if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost))
			{
				ServerRpcParams val = default(ServerRpcParams);
				FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(2175429515u, val, (RpcDelivery)0);
				((NetworkBehaviour)this).__endSendServerRpc(ref val2, 2175429515u, val, (RpcDelivery)0);
			}
			if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost) && !_infiniteLandmines.Value)
			{
				NetworkVariable<int> landminesPlaced = _landminesPlaced;
				int value = landminesPlaced.Value;
				landminesPlaced.Value = value + 1;
				if (_landminesPlaced.Value >= _maxLandmines.Value)
				{
					DestroyObjectInHandClientRpc();
				}
				else
				{
					Plugin.Log.LogInfo((object)$"Landmines placed count {_landminesPlaced} !");
				}
				UpdateItemTooltip(_landminesPlaced.Value, _maxLandmines.Value, _infiniteLandmines.Value);
			}
		}

		[ClientRpc]
		private void DestroyObjectInHandClientRpc()
		{
			//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(2794258110u, val, (RpcDelivery)0);
					((NetworkBehaviour)this).__endSendClientRpc(ref val2, 2794258110u, val, (RpcDelivery)0);
				}
				if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost))
				{
					((GrabbableObject)this).DestroyObjectInHand(((GrabbableObject)this).playerHeldBy);
				}
			}
		}

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

		[ClientRpc]
		public void UpdateGrabTooltipClientRpc(int landminesPlaced, int maxLandmines, bool infiniteLandmines)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_00c1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cb: 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_007e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0097: 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_00b1: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager == null || !networkManager.IsListening)
			{
				return;
			}
			if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost))
			{
				ClientRpcParams val = default(ClientRpcParams);
				FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(417443870u, val, (RpcDelivery)0);
				BytePacker.WriteValueBitPacked(val2, landminesPlaced);
				BytePacker.WriteValueBitPacked(val2, maxLandmines);
				((FastBufferWriter)(ref val2)).WriteValueSafe<bool>(ref infiniteLandmines, default(ForPrimitives));
				((NetworkBehaviour)this).__endSendClientRpc(ref val2, 417443870u, val, (RpcDelivery)0);
			}
			if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost))
			{
				if (!infiniteLandmines)
				{
					((GrabbableObject)this).customGrabTooltip = $"{maxLandmines - landminesPlaced} Landmines remaining";
				}
				else
				{
					((GrabbableObject)this).customGrabTooltip = "Infinite Landmines";
				}
			}
		}

		public void UpdateItemTooltip(int landminesPlaced, int maxLandmines, bool infiniteLandmines = false)
		{
			PlayerControllerB localPlayerController = GameNetworkManager.Instance.localPlayerController;
			if ((Object)(object)localPlayerController == (Object)null)
			{
				return;
			}
			if (localPlayerController.playerActions?.m_Movement_Use == null || (Object)(object)((GrabbableObject)this).itemProperties == (Object)null)
			{
				Plugin.Log.LogError((object)"Cannot update ItemTooltip, One of the required objects is null.");
				return;
			}
			string text = ((!_infiniteLandmines.Value) ? $"{_maxLandmines.Value - _landminesPlaced.Value} Landmines remaining" : null);
			List<string> list = new List<string>();
			if (text != null)
			{
				list.Add(text);
			}
			string bindingDisplayString = InputActionRebindingExtensions.GetBindingDisplayString(localPlayerController.playerActions.m_Movement_Use, 0, (DisplayStringOptions)0);
			list.Add(string.Format("Press {0} to place a landmine", "[" + bindingDisplayString + "]"));
			((GrabbableObject)this).itemProperties.toolTips = list.ToArray();
		}

		private bool IsPlayer()
		{
			return (Object)(object)((GrabbableObject)this).playerHeldBy != (Object)null && !((GrabbableObject)this).isHeldByEnemy;
		}

		private bool CanPlaceLandmine()
		{
			return _landminesPlaced.Value < _maxLandmines.Value || _infiniteLandmines.Value;
		}

		public void InitProperties(PhysicsProp prop)
		{
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0044: Unknown result type (might be due to invalid IL or missing references)
			//IL_004b: 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)
			//IL_012f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0134: Unknown result type (might be due to invalid IL or missing references)
			((GrabbableObject)this).grabbable = ((GrabbableObject)prop).grabbable;
			((GrabbableObject)this).isHeld = ((GrabbableObject)prop).isHeld;
			((GrabbableObject)this).isHeldByEnemy = ((GrabbableObject)prop).isHeldByEnemy;
			((GrabbableObject)this).deactivated = ((GrabbableObject)prop).deactivated;
			((GrabbableObject)this).parentObject = ((GrabbableObject)prop).parentObject;
			((GrabbableObject)this).targetFloorPosition = ((GrabbableObject)prop).targetFloorPosition;
			((GrabbableObject)this).startFallingPosition = ((GrabbableObject)prop).startFallingPosition;
			((GrabbableObject)this).floorYRot = ((GrabbableObject)prop).floorYRot;
			((GrabbableObject)this).fallTime = ((GrabbableObject)prop).fallTime;
			((GrabbableObject)this).hasHitGround = ((GrabbableObject)prop).hasHitGround;
			((GrabbableObject)this).scrapValue = ((GrabbableObject)prop).scrapValue;
			((GrabbableObject)this).itemUsedUp = ((GrabbableObject)prop).itemUsedUp;
			((GrabbableObject)this).playerHeldBy = ((GrabbableObject)prop).playerHeldBy;
			((GrabbableObject)this).isPocketed = ((GrabbableObject)prop).isPocketed;
			((GrabbableObject)this).isBeingUsed = ((GrabbableObject)prop).isBeingUsed;
			((GrabbableObject)this).isInElevator = ((GrabbableObject)prop).isInElevator;
			((GrabbableObject)this).isInShipRoom = ((GrabbableObject)prop).isInShipRoom;
			((GrabbableObject)this).isInFactory = ((GrabbableObject)prop).isInFactory;
			((GrabbableObject)this).useCooldown = ((GrabbableObject)prop).useCooldown;
			((GrabbableObject)this).currentUseCooldown = ((GrabbableObject)prop).currentUseCooldown;
			((GrabbableObject)this).itemProperties = ((GrabbableObject)prop).itemProperties;
			((GrabbableObject)this).insertedBattery = ((GrabbableObject)prop).insertedBattery;
			((GrabbableObject)this).customGrabTooltip = ((GrabbableObject)prop).customGrabTooltip;
			((GrabbableObject)this).propBody = ((GrabbableObject)prop).propBody;
			((GrabbableObject)this).propColliders = ((GrabbableObject)prop).propColliders;
			((GrabbableObject)this).originalScale = ((GrabbableObject)prop).originalScale;
			((GrabbableObject)this).wasOwnerLastFrame = ((GrabbableObject)prop).wasOwnerLastFrame;
			((GrabbableObject)this).mainObjectRenderer = ((GrabbableObject)prop).mainObjectRenderer;
			((GrabbableObject)this).isSendingItemRPC = ((GrabbableObject)prop).isSendingItemRPC;
			((GrabbableObject)this).scrapPersistedThroughRounds = ((GrabbableObject)prop).scrapPersistedThroughRounds;
			((GrabbableObject)this).heldByPlayerOnServer = ((GrabbableObject)prop).heldByPlayerOnServer;
			((GrabbableObject)this).radarIcon = ((GrabbableObject)prop).radarIcon;
			((GrabbableObject)this).reachedFloorTarget = ((GrabbableObject)prop).reachedFloorTarget;
			((GrabbableObject)this).grabbableToEnemies = ((GrabbableObject)prop).grabbableToEnemies;
			((GrabbableObject)this).hasBeenHeld = ((GrabbableObject)prop).hasBeenHeld;
		}

		public override string __getTypeName()
		{
			return "LandminePlacer";
		}

		protected override void __initializeVariables()
		{
			if (_maxLandmines == null)
			{
				throw new Exception("LandminePlacer._maxLandmines cannot be null. All NetworkVariableBase instances must be initialized.");
			}
			((NetworkVariableBase)_maxLandmines).Initialize((NetworkBehaviour)(object)this);
			((NetworkBehaviour)this).__nameNetworkVariable((NetworkVariableBase)(object)_maxLandmines, "_maxLandmines");
			((NetworkBehaviour)this).NetworkVariableFields.Add((NetworkVariableBase)(object)_maxLandmines);
			if (_infiniteLandmines == null)
			{
				throw new Exception("LandminePlacer._infiniteLandmines cannot be null. All NetworkVariableBase instances must be initialized.");
			}
			((NetworkVariableBase)_infiniteLandmines).Initialize((NetworkBehaviour)(object)this);
			((NetworkBehaviour)this).__nameNetworkVariable((NetworkVariableBase)(object)_infiniteLandmines, "_infiniteLandmines");
			((NetworkBehaviour)this).NetworkVariableFields.Add((NetworkVariableBase)(object)_infiniteLandmines);
			if (_landminesPlaced == null)
			{
				throw new Exception("LandminePlacer._landminesPlaced cannot be null. All NetworkVariableBase instances must be initialized.");
			}
			((NetworkVariableBase)_landminesPlaced).Initialize((NetworkBehaviour)(object)this);
			((NetworkBehaviour)this).__nameNetworkVariable((NetworkVariableBase)(object)_landminesPlaced, "_landminesPlaced");
			((NetworkBehaviour)this).NetworkVariableFields.Add((NetworkVariableBase)(object)_landminesPlaced);
			((PhysicsProp)this).__initializeVariables();
		}

		[RuntimeInitializeOnLoadMethod]
		internal static void InitializeRPCS_LandminePlacer()
		{
			//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
			NetworkManager.__rpc_func_table.Add(3176384049u, new RpcReceiveHandler(__rpc_handler_3176384049));
			NetworkManager.__rpc_func_table.Add(2175429515u, new RpcReceiveHandler(__rpc_handler_2175429515));
			NetworkManager.__rpc_func_table.Add(2794258110u, new RpcReceiveHandler(__rpc_handler_2794258110));
			NetworkManager.__rpc_func_table.Add(1836362747u, new RpcReceiveHandler(__rpc_handler_1836362747));
			NetworkManager.__rpc_func_table.Add(417443870u, new RpcReceiveHandler(__rpc_handler_417443870));
		}

		private static void __rpc_handler_3176384049(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
		{
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			//IL_0041: Unknown result type (might be due to invalid IL or missing references)
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				Vector3 position = default(Vector3);
				((FastBufferReader)(ref reader)).ReadValueSafe(ref position);
				target.__rpc_exec_stage = (__RpcExecStage)1;
				((LandminePlacer)(object)target).PlaceLandmineAtServerRpc(position);
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

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

		private static void __rpc_handler_2794258110(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;
				((LandminePlacer)(object)target).DestroyObjectInHandClientRpc();
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

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

		private static void __rpc_handler_417443870(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
		{
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_0030: Unknown result type (might be due to invalid IL or missing references)
			//IL_0049: Unknown result type (might be due to invalid IL or missing references)
			//IL_004f: Unknown result type (might be due to invalid IL or missing references)
			//IL_005e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0080: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				int landminesPlaced = default(int);
				ByteUnpacker.ReadValueBitPacked(reader, ref landminesPlaced);
				int maxLandmines = default(int);
				ByteUnpacker.ReadValueBitPacked(reader, ref maxLandmines);
				bool infiniteLandmines = default(bool);
				((FastBufferReader)(ref reader)).ReadValueSafe<bool>(ref infiniteLandmines, default(ForPrimitives));
				target.__rpc_exec_stage = (__RpcExecStage)2;
				((LandminePlacer)(object)target).UpdateGrabTooltipClientRpc(landminesPlaced, maxLandmines, infiniteLandmines);
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		protected internal override string __getTypeName()
		{
			return "LandminePlacer";
		}
	}
	[BepInPlugin("alexandre_v1.LandminePlacer", "Landmine Placer", "1.0.1")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInProcess("Lethal Company.exe")]
	public class Plugin : BaseUnityPlugin
	{
		private static GameObject _landmine;

		public Item placeableLandmineItem;

		internal static ManualLogSource Log;

		public static ConfigFile ConfigFile;

		public static GameObject Landmine => TryToGetLandMine();

		private void Awake()
		{
			Log = Logger.CreateLogSource("alexandre_v1.LandminePlacer");
			ConfigFile = ((BaseUnityPlugin)this).Config;
			Config.Load();
			PatchMod();
			InitLandminePlacer();
			Log.LogInfo((object)"Plugin alexandre_v1.LandminePlacer is loaded!");
		}

		private static void PatchMod()
		{
			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 InitLandminePlacer()
		{
			string text = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) ?? throw new InvalidOperationException(), "landmine_placer");
			AssetBundle val = AssetBundle.LoadFromFile(text);
			placeableLandmineItem = val.LoadAsset<Item>("Assets/Mods/LandminePlacer/LandminePlacer.asset");
			if ((Object)(object)placeableLandmineItem == (Object)null)
			{
				Log.LogError((object)"Could not load LandminePlacer item");
				return;
			}
			GameObject spawnPrefab = placeableLandmineItem.spawnPrefab;
			if ((Object)(object)spawnPrefab == (Object)null)
			{
				Log.LogError((object)"Could not load LandminePlacer prefab");
				return;
			}
			PhysicsProp component = spawnPrefab.GetComponent<PhysicsProp>();
			if ((Object)(object)component == (Object)null)
			{
				Log.LogError((object)"PhysicsProp is missing on the landmine prefab.");
				return;
			}
			LandminePlacer landminePlacer = spawnPrefab.AddComponent<LandminePlacer>();
			if ((Object)(object)landminePlacer == (Object)null)
			{
				Log.LogError((object)"Could not add LandminePlacer script to prefab");
				return;
			}
			if ((Object)(object)component != (Object)null)
			{
				landminePlacer.InitProperties(component);
				Object.Destroy((Object)(object)component);
			}
			else
			{
				Log.LogError((object)"PhysicsProp is missing on the landmine prefab.");
			}
			NetworkPrefabs.RegisterNetworkPrefab(placeableLandmineItem.spawnPrefab);
			int value = Config.LandminePlacerSpawnChance.Value;
			Items.RegisterItem(placeableLandmineItem);
			Items.RegisterScrap(placeableLandmineItem, value, (LevelTypes)(-1));
			if (Config.LandminePlacerInShop.Value)
			{
				Items.RegisterShopItem(placeableLandmineItem, Config.LandminePlacerShopPrice.Value);
			}
		}

		private static GameObject TryToGetLandMine()
		{
			if ((Object)(object)_landmine != (Object)null)
			{
				return _landmine;
			}
			SpawnableMapObject[] spawnableMapObjects = RoundManager.Instance.spawnableMapObjects;
			if (spawnableMapObjects.Length == 0)
			{
				return null;
			}
			RoundManager.Instance.spawnableMapObjects = spawnableMapObjects;
			SpawnableMapObject[] array = spawnableMapObjects;
			int num = 0;
			if (num < array.Length)
			{
				SpawnableMapObject val = array[num];
				if ((Object)(object)val.prefabToSpawn.GetComponentInChildren<Landmine>() != (Object)null)
				{
					_landmine = val.prefabToSpawn;
					return _landmine;
				}
				Log.LogError((object)"Could not find default landmine prefab");
				return null;
			}
			Log.LogError((object)"Could not find default landmine prefab");
			return null;
		}
	}
	public static class PluginInfo
	{
		public const string PluginGuid = "alexandre_v1.LandminePlacer";

		public const string PluginName = "Landmine Placer";

		public const string PluginVersion = "1.0.1";
	}
}