Decompiled source of HazardControl v1.0.1

HazardControl.dll

Decompiled 2 weeks ago
using System;
using System.Collections;
using System.Diagnostics;
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.Configuration;
using BepInEx.Logging;
using GameNetcodeStuff;
using HarmonyLib;
using HazardControl.Behaviors;
using HazardControl.NetcodePatcher;
using Microsoft.CodeAnalysis;
using Unity.Netcode;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("HazardControl")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyDescription("Disable mines and turrets for your own safety.")]
[assembly: AssemblyFileVersion("1.0.1.0")]
[assembly: AssemblyInformationalVersion("1.0.1+8bec0ad44cf86643d71ff16693628a2935aa435a")]
[assembly: AssemblyProduct("HazardControl")]
[assembly: AssemblyTitle("HazardControl")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.1.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
[module: NetcodePatchedAssembly]
internal class <Module>
{
	static <Module>()
	{
	}
}
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace HazardControl
{
	[BepInPlugin("HazardControl", "HazardControl", "1.0.1")]
	[BepInProcess("Lethal Company.exe")]
	public class Plugin : BaseUnityPlugin
	{
		private static Harmony _globalHarmony;

		internal static ManualLogSource Log { get; private set; }

		internal static PluginConfigStruct GameConfig { get; private set; }

		private void Awake()
		{
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_002f: Expected O, but got Unknown
			Log = ((BaseUnityPlugin)this).Logger;
			((BaseUnityPlugin)this).Logger.LogInfo((object)"Plugin HazardControl is loaded!");
			PatchNetwork();
			_globalHarmony = new Harmony("HazardControl");
			_globalHarmony.PatchAll();
			PluginConfigStruct gameConfig = default(PluginConfigStruct);
			gameConfig.TurretsKey = ((BaseUnityPlugin)this).Config.Bind<bool>("Keys", "TurretsKey", true, "Allows the use of keys to disable turrets.");
			gameConfig.MinesKey = ((BaseUnityPlugin)this).Config.Bind<bool>("Keys", "MinesKey", true, "Allows the use of keys to disable mines.");
			gameConfig.KeyUseProbability = ((BaseUnityPlugin)this).Config.Bind<int>("Keys", "KeyUseProbability", 80, "Probability (0-100) to consume a key when used.");
			gameConfig.TurretsZap = ((BaseUnityPlugin)this).Config.Bind<bool>("Zap", "TurretsZap", true, "Allows the use of ZapGun to temporarily disable turrets.");
			gameConfig.MinesZap = ((BaseUnityPlugin)this).Config.Bind<bool>("Zap", "MinesZap", true, "Allows the use of ZapGun to trigger mines.");
			gameConfig.EnemiesTriggerMines = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "EnemiesTriggerMines", true, "Enemies can trigger mines when they walk on it.");
			GameConfig = gameConfig;
			((BaseUnityPlugin)this).Config.SaveOnConfigSet = false;
		}

		private static void PatchNetwork()
		{
			try
			{
				Type[] types = Assembly.GetExecutingAssembly().GetTypes();
				foreach (Type type in types)
				{
					MethodInfo[] methods = type.GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic);
					foreach (MethodInfo methodInfo in methods)
					{
						if (methodInfo.GetCustomAttributes(typeof(RuntimeInitializeOnLoadMethodAttribute), inherit: false).Length != 0)
						{
							Log.LogInfo((object)("Initialize network patch for " + type.FullName));
							methodInfo.Invoke(null, null);
						}
					}
				}
			}
			catch (Exception)
			{
			}
		}
	}
	internal struct PluginConfigStruct
	{
		public ConfigEntry<bool> TurretsKey;

		public ConfigEntry<bool> MinesKey;

		public ConfigEntry<int> KeyUseProbability;

		public ConfigEntry<bool> TurretsZap;

		public ConfigEntry<bool> MinesZap;

		public ConfigEntry<bool> EnemiesTriggerMines;
	}
	public static class PluginInfo
	{
		public const string PLUGIN_GUID = "HazardControl";

		public const string PLUGIN_NAME = "HazardControl";

		public const string PLUGIN_VERSION = "1.0.1";
	}
}
namespace HazardControl.Patches
{
	[HarmonyPatch(typeof(KeyItem))]
	internal class KeyItemPatch
	{
		[HarmonyPatch("ItemActivate")]
		[HarmonyPostfix]
		public static void ItemActivate(ref KeyItem __instance, bool used, bool buttonDown = true)
		{
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_0048: Unknown result type (might be due to invalid IL or missing references)
			//IL_004d: Unknown result type (might be due to invalid IL or missing references)
			//IL_006f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0074: Unknown result type (might be due to invalid IL or missing references)
			//IL_0148: 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_0154: 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_0174: Unknown result type (might be due to invalid IL or missing references)
			//IL_0179: 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_01b8: Unknown result type (might be due to invalid IL or missing references)
			//IL_01bd: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e1: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d1: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d6: Unknown result type (might be due to invalid IL or missing references)
			//IL_0239: Unknown result type (might be due to invalid IL or missing references)
			//IL_023e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0252: Unknown result type (might be due to invalid IL or missing references)
			//IL_0257: Unknown result type (might be due to invalid IL or missing references)
			//IL_02cf: Unknown result type (might be due to invalid IL or missing references)
			//IL_02d4: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)((GrabbableObject)__instance).playerHeldBy == (Object)null || !((NetworkBehaviour)__instance).IsOwner)
			{
				return;
			}
			RaycastHit? val = null;
			RaycastHit[] array = Physics.RaycastAll(new Ray(((Component)((GrabbableObject)__instance).playerHeldBy.gameplayCamera).transform.position, ((Component)((GrabbableObject)__instance).playerHeldBy.gameplayCamera).transform.forward), 3f, 2097152);
			for (int i = 0; i < array.Length; i++)
			{
				RaycastHit value = array[i];
				bool flag = ((Component)((RaycastHit)(ref value)).transform).gameObject.layer != 21;
				if (!flag)
				{
					bool flag2;
					switch (((Object)((RaycastHit)(ref value)).transform).name)
					{
					case "Landmine":
					case "TurretContainer":
					case "TurretScript":
						flag2 = true;
						break;
					default:
						flag2 = false;
						break;
					}
					flag = !flag2;
				}
				if (!flag)
				{
					val = value;
					break;
				}
			}
			if (!val.HasValue)
			{
				Plugin.Log.LogDebug((object)$"[Landmine/Turret] Raycast failed, IsOwner={((NetworkBehaviour)__instance).IsOwner}, IsHeld={(Object)(object)((GrabbableObject)__instance).playerHeldBy != (Object)null}");
				return;
			}
			Vector3 position = ((Component)((GrabbableObject)__instance).playerHeldBy.gameplayCamera).transform.position;
			RaycastHit value2 = val.Value;
			float num = Vector3.Distance(position, ((RaycastHit)(ref value2)).transform.position);
			ManualLogSource log = Plugin.Log;
			value2 = val.Value;
			string name = ((Object)((RaycastHit)(ref value2)).transform).name;
			value2 = val.Value;
			log.LogDebug((object)$"[Landmine/Turret] GameObject hit {name} in layer {((Component)((RaycastHit)(ref value2)).transform).gameObject.layer} at a distance of {num}");
			value2 = val.Value;
			Landmine obj = ((Component)((RaycastHit)(ref value2)).transform).GetComponentInChildren<Landmine>();
			if (obj == null)
			{
				value2 = val.Value;
				obj = ((Component)((RaycastHit)(ref value2)).transform).GetComponent<Landmine>();
			}
			Landmine val2 = obj;
			if ((Object)(object)val2 != (Object)null && !val2.hasExploded && val2.mineActivated)
			{
				val2.ToggleMine(false);
				((Behaviour)val2.mineAnimator).enabled = false;
				if (Random.RandomRangeInt(0, 100) < Plugin.GameConfig.KeyUseProbability.Value)
				{
					((GrabbableObject)__instance).playerHeldBy.DespawnHeldObject();
				}
				return;
			}
			value2 = val.Value;
			Turret obj2 = ((Component)((RaycastHit)(ref value2)).transform).GetComponentInChildren<Turret>();
			if (obj2 == null)
			{
				value2 = val.Value;
				obj2 = ((Component)((RaycastHit)(ref value2)).transform).GetComponent<Turret>();
			}
			Turret val3 = obj2;
			if ((Object)(object)val3 != (Object)null && val3.turretActive)
			{
				val3.ToggleTurretEnabled(false);
				if (Random.RandomRangeInt(0, 100) < Plugin.GameConfig.KeyUseProbability.Value)
				{
					((GrabbableObject)__instance).playerHeldBy.DespawnHeldObject();
				}
			}
			else
			{
				ManualLogSource log2 = Plugin.Log;
				object arg = val2?.hasExploded;
				value2 = val.Value;
				log2.LogDebug((object)$"[Landmine/Turret] Could not find a landmine or a turret component :( HasExploded={arg} GOLayer={((Component)((RaycastHit)(ref value2)).transform).gameObject.layer}");
			}
		}
	}
	[HarmonyPatch(typeof(Landmine))]
	internal class LandminePatch
	{
		[HarmonyPatch("OnTriggerEnter")]
		[HarmonyPrefix]
		private static bool PreOnTriggerEnter(ref Landmine __instance)
		{
			return __instance.mineActivated;
		}

		[HarmonyPatch("OnTriggerEnter")]
		[HarmonyPostfix]
		private static void OnTriggerEnter(ref Landmine __instance, Collider other)
		{
			if (!__instance.hasExploded && !((double)__instance.pressMineDebounceTimer > 0.0) && !((Component)other).CompareTag("Player") && !((Component)other).CompareTag("PhysicsProp") && !((Component)other).tag.StartsWith("PlayerRagdoll") && NetworkManager.Singleton.IsServer && Plugin.GameConfig.EnemiesTriggerMines.Value && ((Component)other).gameObject.layer == 19)
			{
				__instance.pressMineDebounceTimer = 0.5f;
				__instance.PressMineServerRpc();
			}
		}

		[HarmonyPatch("OnTriggerExit")]
		[HarmonyPostfix]
		private static void OnTriggerExit(ref Landmine __instance, Collider other)
		{
			if (!__instance.hasExploded && __instance.mineActivated && !((Component)other).CompareTag("Player") && !((Component)other).CompareTag("PhysicsProp") && !((Component)other).tag.StartsWith("PlayerRagdoll") && NetworkManager.Singleton.IsServer && Plugin.GameConfig.EnemiesTriggerMines.Value && ((Component)other).gameObject.layer == 19)
			{
				__instance.TriggerMineOnLocalClientByExiting();
			}
		}

		[HarmonyPatch("ToggleMineEnabledLocalClient")]
		[HarmonyPostfix]
		private static void ToggleMineEnabledLocalClient(ref Landmine __instance)
		{
			if (((Behaviour)__instance.mineAnimator).enabled != __instance.mineActivated)
			{
				((Behaviour)__instance.mineAnimator).enabled = __instance.mineActivated;
			}
		}
	}
	[HarmonyPatch(typeof(PatcherTool))]
	internal class PatcherToolPatch
	{
		[HarmonyPatch("Start")]
		[HarmonyPostfix]
		public static void Start(ref PatcherTool __instance)
		{
			PatcherTool obj = __instance;
			obj.anomalyMask |= 0x200000;
		}
	}
	[HarmonyPatch(typeof(StartOfRound))]
	public class StartOfRoundPatch
	{
		[HarmonyPatch("Awake")]
		[HarmonyPostfix]
		private static void Awake()
		{
			//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00be: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00dd: 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_010d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0127: Unknown result type (might be due to invalid IL or missing references)
			//IL_0137: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e7: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ec: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f4: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ff: 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_0215: Unknown result type (might be due to invalid IL or missing references)
			//IL_022c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0237: Unknown result type (might be due to invalid IL or missing references)
			//IL_0247: Unknown result type (might be due to invalid IL or missing references)
			GameObject[] array = Resources.FindObjectsOfTypeAll<GameObject>().Where(delegate(GameObject o)
			{
				switch (((Object)o).name)
				{
				case "Landmine":
				case "TurretScript":
				case "TurretContainer":
					return true;
				default:
					return false;
				}
			}).ToArray();
			foreach (GameObject val in array)
			{
				switch (((Object)val).name)
				{
				case "TurretContainer":
					if (Plugin.GameConfig.TurretsKey.Value)
					{
						GameObject val3 = new GameObject("PickableZone", new Type[3]
						{
							typeof(InteractTrigger),
							typeof(DisarmTurret),
							typeof(BoxCollider)
						})
						{
							layer = 9,
							tag = "InteractTrigger"
						};
						val3.transform.position = val.transform.position;
						val3.transform.parent = val.transform;
						BoxCollider component2 = val3.GetComponent<BoxCollider>();
						component2.size = new Vector3(0.75f, 2f, 1f);
						component2.center = new Vector3(0f, 1f, 0f);
						((Collider)component2).excludeLayers = LayerMask.op_Implicit(2097152);
						((Collider)component2).isTrigger = true;
					}
					break;
				case "TurretScript":
					if (Plugin.GameConfig.TurretsZap.Value)
					{
						val.gameObject.AddComponent<ShockableTurret>();
					}
					break;
				case "Landmine":
					if (val.GetComponent<Landmine>() != null && Plugin.GameConfig.MinesZap.Value)
					{
						val.gameObject.AddComponent<ShockableMine>();
					}
					if (val.GetComponent<Landmine>() == null && Plugin.GameConfig.MinesKey.Value)
					{
						GameObject val2 = new GameObject("PickableZone", new Type[3]
						{
							typeof(InteractTrigger),
							typeof(DisarmMine),
							typeof(BoxCollider)
						})
						{
							layer = 9,
							tag = "InteractTrigger"
						};
						val2.transform.position = val.transform.position;
						val2.transform.parent = val.transform;
						BoxCollider component = val2.GetComponent<BoxCollider>();
						component.size = Vector3.one;
						component.center = Vector3.zero;
						((Collider)component).excludeLayers = LayerMask.op_Implicit(2097152);
						((Collider)component).isTrigger = true;
					}
					break;
				}
			}
			((Component)StartOfRound.Instance).gameObject.AddComponent<HazardControlConfigSync>();
		}
	}
}
namespace HazardControl.Behaviors
{
	[RequireComponent(typeof(InteractTrigger))]
	internal class DisarmMine : NetworkBehaviour
	{
		private Landmine mine;

		private InteractTrigger mineTrigger;

		public void Awake()
		{
			mineTrigger = ((Component)this).GetComponent<InteractTrigger>();
			((Behaviour)mineTrigger).enabled = true;
			mineTrigger.interactable = false;
			mineTrigger.touchTrigger = false;
			mineTrigger.disableTriggerMesh = false;
			mineTrigger.disabledHoverTip = "Armed";
			mineTrigger.hoverTip = mineTrigger.disabledHoverTip;
		}

		private void Update()
		{
			if (mine == null)
			{
				Transform parent = ((Component)this).transform.parent;
				object obj = ((parent != null) ? ((Component)parent).GetComponent<Landmine>() : null);
				if (obj == null)
				{
					Transform parent2 = ((Component)this).transform.parent;
					obj = ((parent2 != null) ? ((Component)parent2).GetComponentInChildren<Landmine>() : null);
				}
				mine = (Landmine)obj;
			}
			if (!Object.op_Implicit((Object)(object)mine))
			{
				return;
			}
			if (mine.hasExploded)
			{
				mineTrigger.disabledHoverTip = "";
			}
			else if (mine.mineActivated)
			{
				if (GameNetworkManager.Instance == null || GameNetworkManager.Instance.localPlayerController == null)
				{
					return;
				}
				mineTrigger.disabledHoverTip = ((GameNetworkManager.Instance.localPlayerController.currentlyHeldObjectServer == null || GameNetworkManager.Instance.localPlayerController.currentlyHeldObjectServer.itemProperties.itemId != 14) ? "Armed" : ((!StartOfRound.Instance.localPlayerUsingController) ? "Disarm: [ LMB ]" : "Disarm: [R-trigger]"));
			}
			else
			{
				mineTrigger.disabledHoverTip = "Disarmed";
			}
			mineTrigger.hoverTip = mineTrigger.disabledHoverTip;
		}

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

		protected internal override string __getTypeName()
		{
			return "DisarmMine";
		}
	}
	[RequireComponent(typeof(InteractTrigger))]
	internal class DisarmTurret : NetworkBehaviour
	{
		private Turret turret;

		private InteractTrigger turretTrigger;

		public void Awake()
		{
			turretTrigger = ((Component)this).GetComponent<InteractTrigger>();
			((Behaviour)turretTrigger).enabled = true;
			turretTrigger.interactable = false;
			turretTrigger.touchTrigger = false;
			turretTrigger.disableTriggerMesh = false;
			turretTrigger.disabledHoverTip = "";
			turretTrigger.hoverTip = turretTrigger.disabledHoverTip;
		}

		private void Update()
		{
			if (turret == null)
			{
				Transform parent = ((Component)this).transform.parent;
				object obj = ((parent != null) ? ((Component)parent).GetComponent<Turret>() : null);
				if (obj == null)
				{
					Transform parent2 = ((Component)this).transform.parent;
					obj = ((parent2 != null) ? ((Component)parent2).GetComponentInChildren<Turret>() : null);
				}
				turret = (Turret)obj;
			}
			if (!Object.op_Implicit((Object)(object)turret))
			{
				return;
			}
			if (turret.turretActive)
			{
				if (GameNetworkManager.Instance == null || GameNetworkManager.Instance.localPlayerController == null)
				{
					return;
				}
				turretTrigger.disabledHoverTip = ((GameNetworkManager.Instance.localPlayerController.currentlyHeldObjectServer == null || GameNetworkManager.Instance.localPlayerController.currentlyHeldObjectServer.itemProperties.itemId != 14) ? "" : ((!StartOfRound.Instance.localPlayerUsingController) ? "Deactivate: [ LMB ]" : "Deactivate: [R-trigger]"));
			}
			else
			{
				turretTrigger.disabledHoverTip = "Deactivated";
			}
			turretTrigger.hoverTip = turretTrigger.disabledHoverTip;
		}

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

		protected internal override string __getTypeName()
		{
			return "DisarmTurret";
		}
	}
	public class HazardControlConfigSync : NetworkBehaviour
	{
		private bool configReceived;

		public override void OnNetworkSpawn()
		{
			((NetworkBehaviour)this).OnNetworkSpawn();
			if (!((NetworkBehaviour)this).IsServer)
			{
				Plugin.Log.LogDebug((object)"Asking server for updated configuration...");
				RequestConfigSyncServerRpc();
			}
		}

		[ServerRpc(RequireOwnership = false)]
		public void RequestConfigSyncServerRpc()
		{
			//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)base.__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost))
				{
					ServerRpcParams val = default(ServerRpcParams);
					FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(2562435258u, val, (RpcDelivery)0);
					((NetworkBehaviour)this).__endSendServerRpc(ref val2, 2562435258u, val, (RpcDelivery)0);
				}
				if ((int)base.__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost))
				{
					HazardControlConfig hazardControlConfig = default(HazardControlConfig);
					hazardControlConfig.TurretsKey = Plugin.GameConfig.TurretsKey.Value;
					hazardControlConfig.MinesKey = Plugin.GameConfig.MinesKey.Value;
					hazardControlConfig.KeyUseProbability = Plugin.GameConfig.KeyUseProbability.Value;
					hazardControlConfig.MinesZap = Plugin.GameConfig.MinesZap.Value;
					hazardControlConfig.TurretsZap = Plugin.GameConfig.TurretsZap.Value;
					hazardControlConfig.EnemiesTriggerMines = Plugin.GameConfig.EnemiesTriggerMines.Value;
					HazardControlConfig config = hazardControlConfig;
					Plugin.Log.LogDebug((object)"[Sync] A client requested a config update.");
					ConfigSyncClientRpc(config);
				}
			}
		}

		[ClientRpc]
		public void ConfigSyncClientRpc(HazardControlConfig config)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b1: 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_007d: 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_0097: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				if ((int)base.__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost))
				{
					ClientRpcParams val = default(ClientRpcParams);
					FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(2808763528u, val, (RpcDelivery)0);
					((FastBufferWriter)(ref val2)).WriteValueSafe<HazardControlConfig>(ref config, default(ForStructs));
					((NetworkBehaviour)this).__endSendClientRpc(ref val2, 2808763528u, val, (RpcDelivery)0);
				}
				if ((int)base.__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost) && !((NetworkBehaviour)this).IsServer && !configReceived)
				{
					Plugin.GameConfig.TurretsKey.Value = config.TurretsKey;
					Plugin.GameConfig.MinesKey.Value = config.MinesKey;
					Plugin.GameConfig.KeyUseProbability.Value = config.KeyUseProbability;
					Plugin.GameConfig.MinesZap.Value = config.MinesZap;
					Plugin.GameConfig.TurretsZap.Value = config.TurretsZap;
					Plugin.GameConfig.EnemiesTriggerMines.Value = config.EnemiesTriggerMines;
					Plugin.Log.LogDebug((object)"Configuration synchronized!");
					configReceived = true;
				}
			}
		}

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

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

		private static void __rpc_handler_2562435258(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;
				((HazardControlConfigSync)(object)target).RequestConfigSyncServerRpc();
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		private static void __rpc_handler_2808763528(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
		{
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: 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_005e: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				HazardControlConfig config = default(HazardControlConfig);
				((FastBufferReader)(ref reader)).ReadValueSafe<HazardControlConfig>(ref config, default(ForStructs));
				target.__rpc_exec_stage = (__RpcExecStage)2;
				((HazardControlConfigSync)(object)target).ConfigSyncClientRpc(config);
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		protected internal override string __getTypeName()
		{
			return "HazardControlConfigSync";
		}
	}
	public struct HazardControlConfig : INetworkSerializeByMemcpy
	{
		public bool TurretsKey;

		public bool MinesKey;

		public int KeyUseProbability;

		public bool TurretsZap;

		public bool MinesZap;

		public bool EnemiesTriggerMines;
	}
	internal class ShockableMine : NetworkBehaviour, IShockableWithGun
	{
		private bool mineShocked;

		private GrabbableObject shockedBy;

		public bool CanBeShocked()
		{
			Landmine component = ((Component)this).GetComponent<Landmine>();
			if (component.mineActivated)
			{
				return !component.hasExploded;
			}
			return false;
		}

		public float GetDifficultyMultiplier()
		{
			return 0.25f;
		}

		public NetworkObject GetNetworkObject()
		{
			return ((NetworkBehaviour)this).NetworkObject;
		}

		public Vector3 GetShockablePosition()
		{
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			return ((Component)this).gameObject.transform.position;
		}

		public Transform GetShockableTransform()
		{
			return ((Component)this).gameObject.transform;
		}

		public void ShockWithGun(PlayerControllerB shockedByPlayer)
		{
			mineShocked = true;
			RoundManager.Instance.FlickerLights(false, false);
			if (((NetworkBehaviour)shockedByPlayer).IsOwner)
			{
				shockedBy = shockedByPlayer.currentlyHeldObjectServer;
				((MonoBehaviour)this).StartCoroutine(AutoStopShocking());
			}
		}

		public void StopShockingWithGun()
		{
			if (mineShocked)
			{
				mineShocked = false;
				RoundManager.Instance.FlickerLights(false, false);
			}
		}

		private IEnumerator AutoStopShocking()
		{
			yield return (object)new WaitForSeconds(0.5f);
			RoundManager.Instance.FlickerLights(true, false);
			((Component)this).GetComponent<Landmine>().TriggerMineOnLocalClientByExiting();
			PatcherTool val = (PatcherTool)shockedBy;
			if ((int)val != 0)
			{
				val.StopShockingAnomalyOnClient(false);
			}
		}

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

		protected internal override string __getTypeName()
		{
			return "ShockableMine";
		}
	}
	internal class ShockableTurret : NetworkBehaviour, IShockableWithGun
	{
		private DateTime? startedAt;

		private Coroutine disabledTurret;

		public bool CanBeShocked()
		{
			return true;
		}

		public float GetDifficultyMultiplier()
		{
			return 0.25f;
		}

		public NetworkObject GetNetworkObject()
		{
			return ((NetworkBehaviour)this).NetworkObject;
		}

		public Vector3 GetShockablePosition()
		{
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			return ((Component)this).gameObject.transform.position;
		}

		public Transform GetShockableTransform()
		{
			return ((Component)this).gameObject.transform;
		}

		public void ShockWithGun(PlayerControllerB shockedByPlayer)
		{
			RoundManager.Instance.FlickerLights(true, false);
			if (((Component)this).GetComponent<Turret>().turretActive && ((NetworkBehaviour)shockedByPlayer).IsOwner)
			{
				startedAt = DateTime.Now;
				((Component)this).GetComponent<Turret>().ToggleTurretEnabled(false);
			}
		}

		public void StopShockingWithGun()
		{
			if (startedAt.HasValue)
			{
				TimeSpan timeSpan = DateTime.Now - startedAt.Value;
				if (disabledTurret != null)
				{
					((MonoBehaviour)this).StopCoroutine(disabledTurret);
				}
				disabledTurret = ((MonoBehaviour)this).StartCoroutine(ReenableIn((int)(timeSpan.TotalSeconds * 10.0)));
				startedAt = null;
			}
		}

		private IEnumerator ReenableIn(int waitFor)
		{
			yield return (object)new WaitForSeconds((float)waitFor);
			RoundManager.Instance.FlickerLights(true, false);
			((Component)this).GetComponent<Turret>().ToggleTurretEnabled(true);
		}

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

		protected internal override string __getTypeName()
		{
			return "ShockableTurret";
		}
	}
}
namespace HazardControl.NetcodePatcher
{
	[AttributeUsage(AttributeTargets.Module)]
	internal class NetcodePatchedAssemblyAttribute : Attribute
	{
	}
}