Decompiled source of Lethal Company Hide n Seek v1.4.0

LCHideAndSeekMod.dll

Decompiled a month ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Text;
using System.Text.RegularExpressions;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using GameNetcodeStuff;
using HarmonyLib;
using LCHideAndSeekMod.Core;
using LCHideAndSeekMod.Core.Configuration;
using LCHideAndSeekMod.Core.PlayerStats;
using LCHideAndSeekMod.Enums;
using LCHideAndSeekMod.Extensions;
using LethalConfig;
using LethalConfig.ConfigItems;
using MoreCompany.Cosmetics;
using TMPro;
using Unity.Collections;
using Unity.Netcode;
using UnityEngine;
using UnityEngine.AI;
using UnityEngine.InputSystem;
using UnityEngine.UI;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("LCHideAndSeekMod")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("LCHideAndSeekMod")]
[assembly: AssemblyCopyright("Copyright ©  2024")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("2c31fa94-da26-4c78-be27-a22e4a8196e8")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: AssemblyVersion("1.0.0.0")]
public class EndGameStatsUI : MonoBehaviour
{
	[CompilerGenerated]
	private sealed class <DisplayStats>d__11 : IEnumerator<object>, IDisposable, IEnumerator
	{
		private int <>1__state;

		private object <>2__current;

		public EndGameStatsUI <>4__this;

		private int <i>5__1;

		object IEnumerator<object>.Current
		{
			[DebuggerHidden]
			get
			{
				return <>2__current;
			}
		}

		object IEnumerator.Current
		{
			[DebuggerHidden]
			get
			{
				return <>2__current;
			}
		}

		[DebuggerHidden]
		public <DisplayStats>d__11(int <>1__state)
		{
			this.<>1__state = <>1__state;
		}

		[DebuggerHidden]
		void IDisposable.Dispose()
		{
			<>1__state = -2;
		}

		private bool MoveNext()
		{
			//IL_0073: Unknown result type (might be due to invalid IL or missing references)
			//IL_007d: Expected O, but got Unknown
			//IL_0147: Unknown result type (might be due to invalid IL or missing references)
			//IL_0151: Expected O, but got Unknown
			//IL_0179: Unknown result type (might be due to invalid IL or missing references)
			//IL_0183: Expected O, but got Unknown
			//IL_00ba: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c4: Expected O, but got Unknown
			//IL_0115: Unknown result type (might be due to invalid IL or missing references)
			//IL_011f: Expected O, but got Unknown
			switch (<>1__state)
			{
			default:
				return false;
			case 0:
				<>1__state = -1;
				((Behaviour)<>4__this.uiBase).enabled = true;
				((Behaviour)<>4__this.WinnerText).enabled = true;
				<>2__current = (object)new WaitForSeconds(0.5f);
				<>1__state = 1;
				return true;
			case 1:
				<>1__state = -1;
				<i>5__1 = 0;
				goto IL_0102;
			case 2:
				<>1__state = -1;
				((Behaviour)<>4__this.statTexts[<i>5__1]).enabled = true;
				<i>5__1++;
				goto IL_0102;
			case 3:
				<>1__state = -1;
				((Behaviour)<>4__this.RoundNumber).enabled = true;
				<>2__current = (object)new WaitForSeconds(0.2f);
				<>1__state = 4;
				return true;
			case 4:
				<>1__state = -1;
				((Behaviour)<>4__this.RoundTime).enabled = true;
				<>2__current = (object)new WaitForSeconds(3f);
				<>1__state = 5;
				return true;
			case 5:
				{
					<>1__state = -1;
					<>4__this.HideAll();
					return false;
				}
				IL_0102:
				if (<i>5__1 < 5)
				{
					((Behaviour)<>4__this.playerTexts[<i>5__1]).enabled = true;
					<>2__current = (object)new WaitForSeconds(1f);
					<>1__state = 2;
					return true;
				}
				<>2__current = (object)new WaitForSeconds(0.2f);
				<>1__state = 3;
				return true;
			}
		}

		bool IEnumerator.MoveNext()
		{
			//ILSpy generated this explicit interface implementation from .override directive in MoveNext
			return this.MoveNext();
		}

		[DebuggerHidden]
		void IEnumerator.Reset()
		{
			throw new NotSupportedException();
		}
	}

	public static EndGameStatsUI Instance;

	private List<TextMeshProUGUI> playerTexts = new List<TextMeshProUGUI>();

	private List<TextMeshProUGUI> statTexts = new List<TextMeshProUGUI>();

	private TextMeshProUGUI RoundNumber;

	private TextMeshProUGUI RoundTime;

	private TextMeshProUGUI WinnerText;

	private Image uiBase;

	public void Awake()
	{
		Instance = this;
		uiBase = ((Component)this).gameObject.GetComponentInChildren<Image>();
		TextMeshProUGUI[] componentsInChildren = ((Component)this).GetComponentsInChildren<TextMeshProUGUI>();
		for (int i = 0; i < 5; i++)
		{
			((TMP_Text)componentsInChildren[i]).maxVisibleLines = 4;
			playerTexts.Add(componentsInChildren[i]);
		}
		for (int num = 9; num > 4; num--)
		{
			((TMP_Text)componentsInChildren[num]).maxVisibleLines = 4;
			statTexts.Add(componentsInChildren[num]);
		}
		RoundNumber = componentsInChildren[10];
		RoundTime = componentsInChildren[11];
		WinnerText = componentsInChildren[12];
		HideAll();
	}

	private void HideAll()
	{
		((Behaviour)uiBase).enabled = false;
		foreach (TextMeshProUGUI playerText in playerTexts)
		{
			((Behaviour)playerText).enabled = false;
		}
		foreach (TextMeshProUGUI statText in statTexts)
		{
			((Behaviour)statText).enabled = false;
		}
		((Behaviour)RoundNumber).enabled = false;
		((Behaviour)RoundTime).enabled = false;
		((Behaviour)WinnerText).enabled = false;
	}

	public void Display()
	{
		FillWithStats();
		((MonoBehaviour)this).StartCoroutine(DisplayStats());
	}

	private void FillWithStats()
	{
		for (int i = 0; i < PlayerStatManager.Instance.Stats.Count; i++)
		{
			StatBase statBase = PlayerStatManager.Instance.Stats.ElementAt(i);
			((TMP_Text)playerTexts.ElementAt(i)).text = statBase.Player.playerUsername;
			((TMP_Text)statTexts.ElementAt(i)).text = $"Tier {statBase.GetTier()}: {statBase.GetComment()}";
		}
		((TMP_Text)RoundNumber).text = Convert.ToString(GameManager.RoundCount - 1);
		((TMP_Text)RoundTime).text = PlayerStatManager.Instance.MatchTime;
		int result = GameManager.Instance.Result;
		((TMP_Text)WinnerText).text = result switch
		{
			1 => "Seekers Win!", 
			0 => "Hiders Win!", 
			_ => "Draw!", 
		};
	}

	[IteratorStateMachine(typeof(<DisplayStats>d__11))]
	private IEnumerator DisplayStats()
	{
		//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
		return new <DisplayStats>d__11(0)
		{
			<>4__this = this
		};
	}

	public void OnDisable()
	{
		try
		{
			foreach (TextMeshProUGUI playerText in playerTexts)
			{
				((TMP_Text)playerText).text = "";
			}
			foreach (TextMeshProUGUI statText in statTexts)
			{
				((TMP_Text)statText).text = "";
			}
			((TMP_Text)RoundNumber).text = "";
			((TMP_Text)RoundTime).text = "";
			((TMP_Text)WinnerText).text = "";
		}
		catch (Exception)
		{
		}
	}
}
namespace LCHideAndSeekMod
{
	[BepInPlugin("Tibnan.LCHideAndSeekMod", "LCHideAndSeekMod", "1.4.0")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	public class ModBase : BaseUnityPlugin
	{
		public const string Guid = "Tibnan.LCHideAndSeekMod";

		private const string modName = "LCHideAndSeekMod";

		public const string Version = "1.4.0";

		public static ManualLogSource mls;

		private readonly Harmony harmony = new Harmony("Tibnan.LCHideAndSeekMod");

		public static ModBase Instance;

		public static Font ModFont;

		public static GameObject TPMineExplosion;

		public static GameObject TPMine;

		public static GameObject EndOfGameStatsBlue;

		public static GameObject EndOfGameStatsOrange;

		public static AnimationCurve MineSpawnCurve;

		private static bool moreCompanyPresent;

		public static bool MoreCompanyPresent => moreCompanyPresent;

		public void Awake()
		{
			if ((Object)(object)Instance == (Object)null)
			{
				Instance = this;
			}
			mls = Logger.CreateLogSource("LCHideAndSeekMod");
			harmony.PatchAll(Assembly.GetExecutingAssembly());
			AssetBundle val = AssetBundle.LoadFromFile(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "lchns"));
			ModFont = val.LoadAsset<Font>("Assets\\Prefabs\\PerfectDOSVGA437.ttf");
			TPMineExplosion = val.LoadAsset<GameObject>("Assets\\Prefabs\\TPMineExplosion.prefab");
			TPMine = val.LoadAsset<GameObject>("Assets\\Custom\\TPMineComplete.prefab");
			EndOfGameStatsBlue = val.LoadAsset<GameObject>("Assets\\Custom\\EndGameStats_blue.prefab");
			EndOfGameStatsOrange = val.LoadAsset<GameObject>("Assets\\Custom\\EndGameStats_orange.prefab");
			moreCompanyPresent = Harmony.HasAnyPatches("me.swipez.melonloader.morecompany");
			ConfigProcessor.AddConfigItems();
			mls.LogInfo((object)"LC Hide and Seek mod loaded.");
		}
	}
}
namespace LCHideAndSeekMod.Patches
{
	[HarmonyPatch(typeof(GameNetworkManager))]
	internal class GameNetworkManagerPatch
	{
		[HarmonyPatch("Start")]
		[HarmonyPostfix]
		public static void AddPrefabs(ref GameNetworkManager __instance)
		{
			((Component)__instance).gameObject.GetComponent<NetworkManager>().AddNetworkPrefab(ModBase.TPMine);
		}

		[HarmonyPatch("Disconnect")]
		[HarmonyPrefix]
		public static void Reset()
		{
			HNSValues.TPMines.Clear();
			GameManager.Instance = new GameManager();
			GameManager.RoundCount = 1;
			PlayerStatManager.Instance = null;
			ConfigProcessor.Reset();
			PlayerStatManager.Reset();
			HNSValues.FirstWeaponReceived = false;
		}
	}
	[HarmonyPatch(typeof(GrabbableObject))]
	public class GrabbableObjectPatch
	{
		[HarmonyPatch("LateUpdate")]
		[HarmonyPrefix]
		public static bool StopLateUpdate(GrabbableObject __instance)
		{
			if (!StartOfRound.Instance.inShipPhase)
			{
				return GameManager.Instance.Hiders.All((PlayerControllerB x) => (Object)(object)x.AsHNSPlayer().DisguiseObject != (Object)(object)__instance);
			}
			return true;
		}
	}
	[HarmonyPatch(typeof(HUDManager))]
	public class HUDManagerPatch
	{
		[HarmonyPatch("ApplyPenalty")]
		[HarmonyPrefix]
		public static bool StopPenalty(HUDManager __instance)
		{
			((Behaviour)__instance.endgameStatsAnimator).enabled = false;
			__instance.endgameStatsAnimator.Rebind();
			((Behaviour)__instance.endgameStatsAnimator).enabled = true;
			return false;
		}

		[HarmonyPatch("AddChatMessage")]
		[HarmonyPrefix]
		public static bool CheckWhisperMessage(ref string chatMessage, ref string nameOfUserWhoTyped, ref int playerWhoSent, ref bool dontRepeat)
		{
			if (chatMessage.StartsWith("/w "))
			{
				if (!StartOfRound.Instance.inShipPhase && (GameNetworkManager.Instance.localPlayerController.AsHNSPlayer().Role == PlayerRole.Seeker || (playerWhoSent != -1 && StartOfRound.Instance.allPlayerScripts[playerWhoSent].AsHNSPlayer().Role == PlayerRole.Seeker)))
				{
					return false;
				}
				chatMessage = chatMessage.Remove(0, 3);
				string text = chatMessage.TakeWhile((char c) => c != ' ').ToArray().Aggregate("", (string a, char b) => a + b);
				chatMessage = chatMessage.Replace(text, "");
				ModBase.mls.LogInfo((object)("Target player: " + text));
				if (GameNetworkManager.Instance.localPlayerController.playerUsername.ToLower().Contains(text) || playerWhoSent == -1)
				{
					AddWhisperMessage(chatMessage, nameOfUserWhoTyped, playerWhoSent, dontRepeat: true);
				}
				return false;
			}
			return true;
		}

		[HarmonyPatch("AddPlayerChatMessageClientRpc")]
		[HarmonyPostfix]
		public static void ForceSendMessage(ref string chatMessage, ref int playerId)
		{
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			if (playerId != -1 && Vector3.Distance(((Component)GameNetworkManager.Instance.localPlayerController).transform.position, ((Component)StartOfRound.Instance.allPlayerScripts[playerId]).transform.position) > 25f)
			{
				typeof(HUDManager).GetMethod("AddChatMessage", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(HUDManager.Instance, new object[4]
				{
					chatMessage,
					StartOfRound.Instance.allPlayerScripts[playerId].playerUsername,
					playerId,
					true
				});
			}
		}

		private static void AddWhisperMessage(string chatMessage, string nameOfUserWhoTyped, int playerWhoSent, bool dontRepeat)
		{
			if ((!dontRepeat || !(HUDManager.Instance.lastChatMessage == chatMessage)) && (int)GameNetworkManager.Instance.localPlayerController.playerClientId != playerWhoSent)
			{
				HUDManager.Instance.lastChatMessage = chatMessage;
				HUDManager.Instance.PingHUDElement(HUDManager.Instance.Chat, 4f, 1f, 0.2f);
				if (HUDManager.Instance.ChatMessageHistory.Count >= 4)
				{
					((TMP_Text)HUDManager.Instance.chatText).text.Remove(0, HUDManager.Instance.ChatMessageHistory[0].Length);
					HUDManager.Instance.ChatMessageHistory.Remove(HUDManager.Instance.ChatMessageHistory[0]);
				}
				StringBuilder stringBuilder = new StringBuilder(chatMessage);
				stringBuilder.Replace("[playerNum0]", StartOfRound.Instance.allPlayerScripts[0].playerUsername);
				stringBuilder.Replace("[playerNum1]", StartOfRound.Instance.allPlayerScripts[1].playerUsername);
				stringBuilder.Replace("[playerNum2]", StartOfRound.Instance.allPlayerScripts[2].playerUsername);
				stringBuilder.Replace("[playerNum3]", StartOfRound.Instance.allPlayerScripts[3].playerUsername);
				chatMessage = stringBuilder.ToString();
				string item = ((!string.IsNullOrEmpty(nameOfUserWhoTyped)) ? ("<color=#00FF00>" + nameOfUserWhoTyped + ": " + chatMessage + "'</color>") : ("<color=#7069ff>" + chatMessage + "</color>"));
				HUDManager.Instance.ChatMessageHistory.Add(item);
				((TMP_Text)HUDManager.Instance.chatText).text = "";
				for (int i = 0; i < HUDManager.Instance.ChatMessageHistory.Count; i++)
				{
					TextMeshProUGUI chatText = HUDManager.Instance.chatText;
					((TMP_Text)chatText).text = ((TMP_Text)chatText).text + "\n" + HUDManager.Instance.ChatMessageHistory[i];
				}
			}
		}

		[HarmonyPatch("Update")]
		[HarmonyPrefix]
		public static bool Update(ref HUDElement ___Clock)
		{
			if (ConfigProcessor.Config.AlwaysShowClock)
			{
				___Clock.targetAlpha = 1f;
			}
			if (ConfigProcessor.Config.QuickRefreshClock)
			{
				TimeOfDay.Instance.RefreshClockUI();
			}
			return true;
		}

		[HarmonyPatch("DisplayDaysLeft")]
		[HarmonyPrefix]
		public static bool StopDisplayDaysLeft(HUDManager __instance)
		{
			return false;
		}
	}
	[HarmonyPatch(typeof(KeyItem))]
	internal class KeyItemPatch
	{
		[HarmonyPatch("ItemActivate")]
		[HarmonyPrefix]
		public static bool LockDoorAndStopActivate(KeyItem __instance)
		{
			//IL_0034: 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_004e: Unknown result type (might be due to invalid IL or missing references)
			if (!((NetworkBehaviour)__instance).IsOwner || !ConfigProcessor.Config.DoorLockEnabled)
			{
				return true;
			}
			RaycastHit val = default(RaycastHit);
			if (Physics.Raycast(new Ray(((Component)((GrabbableObject)__instance).playerHeldBy.gameplayCamera).transform.position, ((Component)((GrabbableObject)__instance).playerHeldBy.gameplayCamera).transform.forward), ref val, 3f, 2816))
			{
				DoorLock component = ((Component)((RaycastHit)(ref val)).transform).GetComponent<DoorLock>();
				if ((Object)(object)component != (Object)null && !component.isLocked && !component.isPickingLock)
				{
					component.LockDoor(30f);
					((GrabbableObject)__instance).playerHeldBy.DespawnHeldObject();
					if (NetworkManager.Singleton.IsServer)
					{
						SendDoorLock(((NetworkBehaviour)component).NetworkObjectId);
					}
					else
					{
						RequestDoorLock(((NetworkBehaviour)component).NetworkObjectId);
					}
					return false;
				}
			}
			return true;
		}

		public static void SendDoorLock(ulong id)
		{
			//IL_004a: 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_0066: Unknown result type (might be due to invalid IL or missing references)
			DoorLock componentInChildren = ((Component)NetworkManager.Singleton.SpawnManager.SpawnedObjects[id]).gameObject.GetComponentInChildren<DoorLock>();
			if (!componentInChildren.isLocked)
			{
				componentInChildren.LockDoor(30f);
			}
			FastBufferWriter val = default(FastBufferWriter);
			((FastBufferWriter)(ref val))..ctor(8, (Allocator)2, -1);
			((FastBufferWriter)(ref val)).WriteValueSafe<ulong>(ref id, default(ForPrimitives));
			NetworkManager.Singleton.CustomMessagingManager.SendNamedMessageToAll("Tibnan.hnsmod_DoorLocked", val, (NetworkDelivery)2);
		}

		public static void RequestDoorLock(ulong id)
		{
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			FastBufferWriter val = default(FastBufferWriter);
			((FastBufferWriter)(ref val))..ctor(8, (Allocator)2, -1);
			((FastBufferWriter)(ref val)).WriteValue<ulong>(ref id, default(ForPrimitives));
			NetworkManager.Singleton.CustomMessagingManager.SendNamedMessage("Tibnan.hnsmod_ServerLockDoor", 0uL, val, (NetworkDelivery)2);
		}

		public static void ServerTransmitDoorLock(ulong _, FastBufferReader reader)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			ulong id = default(ulong);
			((FastBufferReader)(ref reader)).ReadValueSafe<ulong>(ref id, default(ForPrimitives));
			SendDoorLock(id);
		}

		public static void ClientLockDoor(ulong _, FastBufferReader reader)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			ulong key = default(ulong);
			((FastBufferReader)(ref reader)).ReadValueSafe<ulong>(ref key, default(ForPrimitives));
			DoorLock componentInChildren = ((Component)NetworkManager.Singleton.SpawnManager.SpawnedObjects[key]).gameObject.GetComponentInChildren<DoorLock>();
			if (!componentInChildren.isLocked)
			{
				componentInChildren.LockDoor(30f);
			}
		}
	}
	[HarmonyPatch(typeof(Landmine))]
	internal class LandminePatch
	{
		[CompilerGenerated]
		private sealed class <TPPlayerToRandomPos>d__3 : IEnumerator<object>, IDisposable, IEnumerator
		{
			private int <>1__state;

			private object <>2__current;

			public Landmine mine;

			public PlayerControllerB player;

			private Random <rnd>5__1;

			private Vector3 <vec>5__2;

			private Vector3 <tpPos>5__3;

			private int <i>5__4;

			private GameObject <explosion>5__5;

			object IEnumerator<object>.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			object IEnumerator.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			[DebuggerHidden]
			public <TPPlayerToRandomPos>d__3(int <>1__state)
			{
				this.<>1__state = <>1__state;
			}

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				<rnd>5__1 = null;
				<explosion>5__5 = null;
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				//IL_003b: Unknown result type (might be due to invalid IL or missing references)
				//IL_0040: 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_007b: Expected O, but got Unknown
				//IL_00e7: Unknown result type (might be due to invalid IL or missing references)
				//IL_00ec: Unknown result type (might be due to invalid IL or missing references)
				//IL_00f8: Unknown result type (might be due to invalid IL or missing references)
				//IL_0104: Unknown result type (might be due to invalid IL or missing references)
				//IL_010a: Unknown result type (might be due to invalid IL or missing references)
				//IL_0117: 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_0128: Unknown result type (might be due to invalid IL or missing references)
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					<i>5__4 = 0;
					break;
				case 1:
					<>1__state = -1;
					<explosion>5__5 = null;
					<i>5__4++;
					break;
				}
				if (<i>5__4 < 3)
				{
					<explosion>5__5 = Object.Instantiate<GameObject>(ModBase.TPMineExplosion, ((Component)mine).transform.position, Quaternion.identity, RoundManager.Instance.mapPropsContainer.transform);
					<explosion>5__5.SetActive(true);
					<>2__current = (object)new WaitForSeconds(0.5f);
					<>1__state = 1;
					return true;
				}
				<rnd>5__1 = new Random();
				<vec>5__2 = RoundManager.Instance.insideAINodes[<rnd>5__1.Next(0, RoundManager.Instance.insideAINodes.Length)].transform.position;
				<tpPos>5__3 = RoundManager.Instance.GetRandomNavMeshPositionInBoxPredictable(<vec>5__2, 10f, default(NavMeshHit), <rnd>5__1, -1, 1f);
				player.TeleportPlayer(<tpPos>5__3, false, 0f, false, true);
				if (NetworkManager.Singleton.IsServer && ((NetworkBehaviour)mine).NetworkObject.IsSpawned)
				{
					((NetworkBehaviour)mine).NetworkObject.Despawn(true);
				}
				return false;
			}

			bool IEnumerator.MoveNext()
			{
				//ILSpy generated this explicit interface implementation from .override directive in MoveNext
				return this.MoveNext();
			}

			[DebuggerHidden]
			void IEnumerator.Reset()
			{
				throw new NotSupportedException();
			}
		}

		[HarmonyPatch("Start")]
		[HarmonyPostfix]
		public static void RollTPMineChance(Landmine __instance)
		{
			//IL_005a: Unknown result type (might be due to invalid IL or missing references)
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0104: Unknown result type (might be due to invalid IL or missing references)
			//IL_010a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0121: Unknown result type (might be due to invalid IL or missing references)
			if (ConfigProcessor.Config.SpawnTPMines && NetworkManager.Singleton.IsServer && !HNSValues.TPMines.Contains(((NetworkBehaviour)__instance).NetworkObjectId) && new Random().Next(1, 3) == 2)
			{
				GameObject val = Object.Instantiate<GameObject>(ModBase.TPMine, ((Component)__instance).transform.position, Quaternion.identity);
				val.GetComponentInChildren<NetworkObject>().Spawn(true);
				HNSValues.TPMines.Add(((NetworkBehaviour)val.GetComponentInChildren<Landmine>()).NetworkObjectId);
				if (((NetworkBehaviour)__instance).NetworkObject.IsSpawned)
				{
					((NetworkBehaviour)__instance).NetworkObject.Despawn(true);
				}
				Landmine componentInChildren = val.GetComponentInChildren<Landmine>();
				Animator mineAnimator = componentInChildren.mineAnimator;
				mineAnimator.speed *= 10f;
				componentInChildren.mineAudio.volume = 0.25f;
				componentInChildren.mineFarAudio.volume = 0.25f;
				FastBufferWriter val2 = default(FastBufferWriter);
				((FastBufferWriter)(ref val2))..ctor(8, (Allocator)2, -1);
				ulong networkObjectId = ((NetworkBehaviour)componentInChildren).NetworkObjectId;
				((FastBufferWriter)(ref val2)).WriteValueSafe<ulong>(ref networkObjectId, default(ForPrimitives));
				NetworkManager.Singleton.CustomMessagingManager.SendNamedMessageToAll("Tibnan.hnsmod_TPMineSpawned", val2, (NetworkDelivery)2);
			}
		}

		[HarmonyPatch("PressMineServerRpc")]
		[HarmonyPostfix]
		public static void StopExplosionSpawnIfSpecial(Landmine __instance)
		{
			if (HNSValues.TPMines.Contains(((NetworkBehaviour)__instance).NetworkObjectId))
			{
				((MonoBehaviour)GameNetworkManager.Instance).StartCoroutine(TPPlayerToRandomPos(__instance, StartOfRound.Instance.allPlayerScripts.OrderBy((PlayerControllerB x) => Vector3.Distance(((Component)__instance).transform.position, ((Component)x).transform.position)).First()));
			}
		}

		[HarmonyPatch("SetOffMineAnimation")]
		[HarmonyPrefix]
		public static bool StopExplosion(Landmine __instance)
		{
			return !HNSValues.TPMines.Contains(((NetworkBehaviour)__instance).NetworkObjectId);
		}

		[IteratorStateMachine(typeof(<TPPlayerToRandomPos>d__3))]
		public static IEnumerator TPPlayerToRandomPos(Landmine mine, PlayerControllerB player)
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <TPPlayerToRandomPos>d__3(0)
			{
				mine = mine,
				player = player
			};
		}

		public static void AddMineToList(ulong _, FastBufferReader reader)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			ulong key = default(ulong);
			((FastBufferReader)(ref reader)).ReadValueSafe<ulong>(ref key, default(ForPrimitives));
			Landmine componentInChildren = ((Component)NetworkManager.Singleton.SpawnManager.SpawnedObjects[key]).gameObject.GetComponentInChildren<Landmine>();
			Animator mineAnimator = componentInChildren.mineAnimator;
			mineAnimator.speed *= 10f;
			componentInChildren.mineAudio.volume = 0.25f;
			componentInChildren.mineFarAudio.volume = 0.25f;
			HNSValues.TPMines.Add(((NetworkBehaviour)componentInChildren).NetworkObjectId);
		}
	}
	[HarmonyPatch(typeof(ManualCameraRenderer))]
	internal class ManualCameraRendererPatch
	{
		[HarmonyPatch("SwitchRadarTargetForward")]
		[HarmonyPrefix]
		public static bool StopSwitchForward()
		{
			return GameNetworkManager.Instance.localPlayerController.AsHNSPlayer().Role != PlayerRole.Seeker || ConfigProcessor.Config.LetSeekerSwitchCam;
		}

		[HarmonyPatch("SwitchRadarTargetAndSync")]
		[HarmonyPrefix]
		public static bool StopSwitch()
		{
			return GameNetworkManager.Instance.localPlayerController.AsHNSPlayer().Role != PlayerRole.Seeker || ConfigProcessor.Config.LetSeekerSwitchCam;
		}

		[HarmonyPatch("SwitchRadarTargetServerRpc")]
		[HarmonyPrefix]
		public static bool StopSwitchRPC()
		{
			return GameNetworkManager.Instance.localPlayerController.AsHNSPlayer().Role != PlayerRole.Seeker || ConfigProcessor.Config.LetSeekerSwitchCam;
		}
	}
	[HarmonyPatch(typeof(PlayerControllerB))]
	internal class PlayerControllerBPatch
	{
		private static bool controlsAdded;

		private static bool holdCompleted;

		[HarmonyPatch("ConnectClientToPlayerObject")]
		[HarmonyPostfix]
		public static void Setup(PlayerControllerB __instance)
		{
			//IL_018d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0197: Expected O, but got Unknown
			//IL_01ae: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b8: Expected O, but got Unknown
			//IL_01cf: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d9: Expected O, but got Unknown
			//IL_01f0: Unknown result type (might be due to invalid IL or missing references)
			//IL_01fa: Expected O, but got Unknown
			//IL_0211: Unknown result type (might be due to invalid IL or missing references)
			//IL_021b: Expected O, but got Unknown
			//IL_0232: Unknown result type (might be due to invalid IL or missing references)
			//IL_023c: Expected O, but got Unknown
			//IL_0253: Unknown result type (might be due to invalid IL or missing references)
			//IL_025d: Expected O, but got Unknown
			//IL_0274: Unknown result type (might be due to invalid IL or missing references)
			//IL_027e: Expected O, but got Unknown
			//IL_0295: Unknown result type (might be due to invalid IL or missing references)
			//IL_029f: Expected O, but got Unknown
			//IL_02b6: Unknown result type (might be due to invalid IL or missing references)
			//IL_02c0: Expected O, but got Unknown
			//IL_02d7: Unknown result type (might be due to invalid IL or missing references)
			//IL_02e1: Expected O, but got Unknown
			//IL_02f8: Unknown result type (might be due to invalid IL or missing references)
			//IL_0302: Expected O, but got Unknown
			//IL_0319: Unknown result type (might be due to invalid IL or missing references)
			//IL_0323: Expected O, but got Unknown
			//IL_033a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0344: Expected O, but got Unknown
			//IL_035b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0365: Expected O, but got Unknown
			//IL_037c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0386: Expected O, but got Unknown
			//IL_00e1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00eb: Expected O, but got Unknown
			//IL_0102: Unknown result type (might be due to invalid IL or missing references)
			//IL_010c: Expected O, but got Unknown
			//IL_0123: Unknown result type (might be due to invalid IL or missing references)
			//IL_012d: Expected O, but got Unknown
			//IL_0144: Unknown result type (might be due to invalid IL or missing references)
			//IL_014e: Expected O, but got Unknown
			//IL_0165: Unknown result type (might be due to invalid IL or missing references)
			//IL_016f: Expected O, but got Unknown
			((Component)__instance).gameObject.AddComponent<CustomUI>();
			GameObject val = Object.Instantiate<GameObject>((ConfigProcessor.Config.EndGameUIStyle == EndGameUIStyle.Blue) ? ModBase.EndOfGameStatsBlue : ModBase.EndOfGameStatsOrange);
			val.AddComponent<EndGameStatsUI>();
			if (NetworkManager.Singleton.IsServer)
			{
				MethodInfo method = typeof(StartOfRound).GetMethod("SpawnUnlockable", BindingFlags.Instance | BindingFlags.NonPublic);
				for (int i = 1; i < 8; i++)
				{
					if (i < 4)
					{
						method.Invoke(StartOfRound.Instance, new object[2] { i, false });
					}
					else
					{
						method.Invoke(StartOfRound.Instance, new object[2]
						{
							i + 20,
							false
						});
					}
				}
				NetworkManager.Singleton.CustomMessagingManager.RegisterNamedMessageHandler("Tibnan.hnsmod_ServerLockDoor", new HandleNamedMessageDelegate(KeyItemPatch.ServerTransmitDoorLock));
				NetworkManager.Singleton.CustomMessagingManager.RegisterNamedMessageHandler("Tibnan.hnsmod_ServerDisguiseClient", new HandleNamedMessageDelegate(HNSPlayerComponent.ServerDisguiseClient));
				NetworkManager.Singleton.CustomMessagingManager.RegisterNamedMessageHandler("Tibnan.hnsmod_ServerUnDisguiseClient", new HandleNamedMessageDelegate(HNSPlayerComponent.ServerUnDisguiseClient));
				NetworkManager.Singleton.CustomMessagingManager.RegisterNamedMessageHandler("Tibnan.hnsmod_ServerLockDisguiseRot", new HandleNamedMessageDelegate(HNSPlayerComponent.ServerLockDisguiseRotation));
				NetworkManager.Singleton.CustomMessagingManager.RegisterNamedMessageHandler("Tibnan.hnsmod_ServerPlayTaunt", new HandleNamedMessageDelegate(HNSPlayerComponent.ServerPlayTaunt));
			}
			else
			{
				NetworkManager.Singleton.CustomMessagingManager.RegisterNamedMessageHandler("Tibnan.hnsmod_ClientReceivesRoleMSG", new HandleNamedMessageDelegate(GameManager.SetRole));
				NetworkManager.Singleton.CustomMessagingManager.RegisterNamedMessageHandler("Tibnan.hnsmod_ClientRefreshPlayerComps", new HandleNamedMessageDelegate(GameManager.RefreshPlayerComps));
				NetworkManager.Singleton.CustomMessagingManager.RegisterNamedMessageHandler("Tibnan.hnsmod_ShowRoles", new HandleNamedMessageDelegate(GameManager.ShowRoles));
				NetworkManager.Singleton.CustomMessagingManager.RegisterNamedMessageHandler("Tibnan.hnsmod_EndGame", new HandleNamedMessageDelegate(GameManager.EndGameClient));
				NetworkManager.Singleton.CustomMessagingManager.RegisterNamedMessageHandler("Tibnan.hnsmod_ShotgunSpawned", new HandleNamedMessageDelegate(GameManager.GrabWeaponIfSeeker));
				NetworkManager.Singleton.CustomMessagingManager.RegisterNamedMessageHandler("Tibnan.hnsmod_ClientReceivesBroadcastMsg", new HandleNamedMessageDelegate(CustomUI.ProcessBroadcastMessage));
				NetworkManager.Singleton.CustomMessagingManager.RegisterNamedMessageHandler("Tibnan.hnsmod_RecalcTime", new HandleNamedMessageDelegate(GameManager.RecalcTime));
				NetworkManager.Singleton.CustomMessagingManager.RegisterNamedMessageHandler("Tibnan.hnsmod_ClientSwitchSuits", new HandleNamedMessageDelegate(GameManager.ClientSwitchSuits));
				NetworkManager.Singleton.CustomMessagingManager.RegisterNamedMessageHandler("Tibnan.hnsmod_TPMineSpawned", new HandleNamedMessageDelegate(LandminePatch.AddMineToList));
				NetworkManager.Singleton.CustomMessagingManager.RegisterNamedMessageHandler("Tibnan.hnsmod_DoorLocked", new HandleNamedMessageDelegate(KeyItemPatch.ClientLockDoor));
				NetworkManager.Singleton.CustomMessagingManager.RegisterNamedMessageHandler("Tibnan.hnsmod_ClientReceivePlayerStats", new HandleNamedMessageDelegate(PlayerStatManager.ClientSetPlayerStats));
				NetworkManager.Singleton.CustomMessagingManager.RegisterNamedMessageHandler("Tibnan.hnsmod_ClientReceiveServerConfig", new HandleNamedMessageDelegate(ConfigProcessor.ClientSetServerConfig));
				NetworkManager.Singleton.CustomMessagingManager.RegisterNamedMessageHandler("Tibnan.hnsmod_DisguiseClient", new HandleNamedMessageDelegate(HNSPlayerComponent.DisguiseClient));
				NetworkManager.Singleton.CustomMessagingManager.RegisterNamedMessageHandler("Tibnan.hnsmod_UnDisguiseClient", new HandleNamedMessageDelegate(HNSPlayerComponent.UnDisguiseClient));
				NetworkManager.Singleton.CustomMessagingManager.RegisterNamedMessageHandler("Tibnan.hnsmod_ClientLockDisguiseRot", new HandleNamedMessageDelegate(HNSPlayerComponent.ClientLockDisguiseRotation));
				NetworkManager.Singleton.CustomMessagingManager.RegisterNamedMessageHandler("Tibnan.hnsmod_ClientPlayTaunt", new HandleNamedMessageDelegate(HNSPlayerComponent.ClientPlayTaunt));
			}
			EditControls();
			if (ConfigProcessor.Config.DisplayWarning)
			{
				HUDManager.Instance.DisplayTip("Caution", string.Format("Playing Hide n Seek. Several core gameplay features disabled.\nVersion: {0}", "1.4.0"), false, false, "LC_Tip1");
			}
		}

		[HarmonyPatch("KillPlayer")]
		[HarmonyPrefix]
		public static bool StopKillPlayer()
		{
			HNSPlayerComponent component = ((Component)GameNetworkManager.Instance.localPlayerController).gameObject.GetComponent<HNSPlayerComponent>();
			if (component.Role == PlayerRole.Hider)
			{
				component.SetUndisguised();
			}
			return component.Role == PlayerRole.Hider || (component.Role == PlayerRole.Seeker && ConfigProcessor.Config.CanSeekerDie);
		}

		private static void OnDiscard(CallbackContext context)
		{
			if (ConfigProcessor.Config.DisguiseEnabled && !holdCompleted && !StartOfRound.Instance.inShipPhase)
			{
				HNSPlayerComponent hNSPlayerComponent = GameNetworkManager.Instance.localPlayerController.AsHNSPlayer();
				if (hNSPlayerComponent.Role != PlayerRole.Seeker)
				{
					hNSPlayerComponent.SetUndisguised();
				}
			}
		}

		private static void LockDisguiseRotation(CallbackContext context)
		{
			if (ConfigProcessor.Config.DisguiseEnabled)
			{
				holdCompleted = true;
				if (!StartOfRound.Instance.inShipPhase)
				{
					GameNetworkManager.Instance.localPlayerController.AsHNSPlayer().ToggleDisguiseRotation();
				}
			}
		}

		private static void OnItemGrab(CallbackContext context)
		{
			//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)
			if (!ConfigProcessor.Config.DisguiseEnabled || holdCompleted)
			{
				holdCompleted = false;
			}
			else if (!StartOfRound.Instance.inShipPhase)
			{
				PlayerControllerB localPlayerController = GameNetworkManager.Instance.localPlayerController;
				HNSPlayerComponent hNSPlayerComponent = localPlayerController.AsHNSPlayer();
				RaycastHit val = default(RaycastHit);
				if (hNSPlayerComponent.Role != PlayerRole.Seeker && Physics.Raycast(((Component)localPlayerController.gameplayCamera).transform.position, ((Component)localPlayerController.gameplayCamera).transform.forward, ref val, 5f, 1073742656) && ((Component)((RaycastHit)(ref val)).collider).gameObject.layer != 8 && ((Component)((RaycastHit)(ref val)).collider).tag == "PhysicsProp" && ((Component)((RaycastHit)(ref val)).collider).gameObject.TryGetComponent<GrabbableObject>(out GrabbableObject component) && component.grabbable)
				{
					component.grabbable = false;
					hNSPlayerComponent.SetDisguised(component);
				}
			}
		}

		private static void PlayTauntAudio(CallbackContext ctx)
		{
			if (!StartOfRound.Instance.inShipPhase)
			{
				GameNetworkManager.Instance.localPlayerController.AsHNSPlayer().PlayRandomTaunt();
			}
		}

		private static void EditControls()
		{
			//IL_004f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0054: Unknown result type (might be due to invalid IL or missing references)
			//IL_005d: 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)
			if (controlsAdded)
			{
				return;
			}
			InputActionMap val = IngamePlayerSettings.Instance.playerInput.actions.FindActionMap("Movement", false);
			val.Disable();
			try
			{
				InputAction val2 = InputActionSetupExtensions.AddAction(val, "Disguise", (InputActionType)1, (string)null, (string)null, (string)null, (string)null, (string)null);
				BindingSyntax val3 = InputActionSetupExtensions.AddBinding(val2, "<Keyboard>/h", (string)null, (string)null, (string)null);
				((BindingSyntax)(ref val3)).WithInteraction("Hold(duration=0.5)");
				val2.canceled += OnDiscard;
				val2.canceled += OnItemGrab;
				val2.performed += LockDisguiseRotation;
				InputAction val4 = InputActionSetupExtensions.AddAction(val, "Taunt", (InputActionType)1, (string)null, (string)null, (string)null, (string)null, (string)null);
				InputActionSetupExtensions.AddBinding(val4, "<Keyboard>/x", (string)null, (string)null, (string)null);
				val4.performed += PlayTauntAudio;
			}
			catch (Exception ex)
			{
				ModBase.mls.LogError((object)$"Error when editing controls for player: {ex.Message}");
			}
			finally
			{
				val.Enable();
			}
			controlsAdded = true;
		}

		[HarmonyPatch("BeginGrabObject")]
		[HarmonyPrefix]
		public static bool StopGrabObject(PlayerControllerB __instance)
		{
			HNSPlayerComponent hNSPlayerComponent = __instance.AsHNSPlayer();
			return StartOfRound.Instance.inShipPhase || !hNSPlayerComponent.IsDisguised;
		}
	}
	[HarmonyPatch(typeof(RoundManager))]
	internal class RoundManagerPatch
	{
		[HarmonyPatch("SpawnEnemyFromVent")]
		[HarmonyPrefix]
		public static bool StopSpawnEnemyFromVent(RoundManager __instance)
		{
			return false;
		}

		[HarmonyPatch("SpawnEnemyOnServer")]
		[HarmonyPrefix]
		public static bool StopSpawnEnemyOnServer(RoundManager __instance)
		{
			return false;
		}

		[HarmonyPatch("SpawnDaytimeEnemiesOutside")]
		[HarmonyPrefix]
		public static bool StopSpawnDaytimeEnemiesOutside(RoundManager __instance)
		{
			return false;
		}

		[HarmonyPatch("BeginEnemySpawning")]
		[HarmonyPrefix]
		public static bool StopBeginEnemySpawning(RoundManager __instance)
		{
			return false;
		}

		[HarmonyPatch("SpawnEnemiesOutside")]
		[HarmonyPrefix]
		public static bool StopSpawnEnemiesOutside(RoundManager __instance)
		{
			return false;
		}

		[HarmonyPatch("SpawnScrapInLevel")]
		[HarmonyPrefix]
		public static void RandomizeSpawnAmounts(RoundManager __instance)
		{
			if (NetworkManager.Singleton.IsServer && ConfigProcessor.Config.ScrapSpawnAmount != 0)
			{
				__instance.scrapAmountMultiplier = (float)ConfigProcessor.Config.ScrapSpawnAmount;
			}
		}

		[HarmonyPatch("SpawnMapObjects")]
		[HarmonyPrefix]
		public static void RandomizeLandmineAmounts(RoundManager __instance)
		{
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_0028: Expected O, but got Unknown
			if (NetworkManager.Singleton.IsServer && ConfigProcessor.Config.MineSpawnAmount != 0)
			{
				AnimationCurve val = new AnimationCurve();
				val.AddKey(1f, (float)ConfigProcessor.Config.MineSpawnAmount);
				__instance.currentLevel.spawnableMapObjects.ToList().Find((SpawnableMapObject x) => ((Object)x.prefabToSpawn).name.ToLower().Contains("landmine")).numberToSpawn = val;
			}
		}
	}
	[HarmonyPatch(typeof(ShotgunItem))]
	internal class ShotgunItemPatch
	{
		[HarmonyPatch("ShootGun")]
		[HarmonyPostfix]
		public static void ResetShells(ShotgunItem __instance)
		{
			__instance.shellsLoaded = 2;
		}

		[HarmonyPatch("ShootGun")]
		[HarmonyPostfix]
		public static void TryHitDoor(ShotgunItem __instance, ref Vector3 shotgunPosition, ref Vector3 shotgunForward)
		{
			//IL_0002: 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_000d: Unknown result type (might be due to invalid IL or missing references)
			RaycastHit val = default(RaycastHit);
			if (Physics.Raycast(new Ray(shotgunPosition, shotgunForward), ref val, 10f, 2816, (QueryTriggerInteraction)2))
			{
				DoorLockShotgunInteract componentInChildren = ((Component)((RaycastHit)(ref val)).transform).GetComponentInChildren<DoorLockShotgunInteract>();
				if ((Object)(object)componentInChildren != (Object)null)
				{
					componentInChildren.Hit(((GrabbableObject)__instance).playerHeldBy);
				}
			}
		}
	}
	[HarmonyPatch(typeof(StartMatchLever))]
	internal class StartMatchLeverPatch
	{
		[HarmonyPatch("LeverAnimation")]
		[HarmonyPrefix]
		public static bool CheckPlayerCount(StartMatchLever __instance)
		{
			ModBase.mls.LogWarning((object)("Checking player count... " + (StartOfRound.Instance.connectedPlayersAmount + 1)));
			bool flag = StartOfRound.Instance.connectedPlayersAmount > 0;
			if (!flag)
			{
				((Component)GameNetworkManager.Instance.localPlayerController).gameObject.GetComponent<CustomUI>().ShowLocalMessage("<color=red>At least 2 players are required to start.</color>", 2);
			}
			return flag;
		}
	}
	[HarmonyPatch(typeof(StartOfRound))]
	internal class StartOfRoundPatch
	{
		[HarmonyPatch("StartGame")]
		[HarmonyPostfix]
		public static void StartHNS(StartOfRound __instance)
		{
			StartOfRound.Instance.currentLevel.Enemies.ForEach(delegate(SpawnableEnemyWithRarity x)
			{
				x.enemyType.spawningDisabled = true;
			});
			if (NetworkManager.Singleton.IsServer)
			{
				GameManager.StartGame(StartOfRound.Instance.connectedPlayersAmount);
			}
		}

		[HarmonyPatch("EndOfGameClientRpc")]
		[HarmonyPostfix]
		public static void ResetPlayers(StartOfRound __instance)
		{
			PlayerControllerB[] allPlayerScripts = StartOfRound.Instance.allPlayerScripts;
			foreach (PlayerControllerB val in allPlayerScripts)
			{
				HNSPlayerComponent component = ((Component)val).gameObject.GetComponent<HNSPlayerComponent>();
				if ((Object)(object)component != (Object)null)
				{
					component.Role = PlayerRole.None;
				}
			}
			TimeOfDay.Instance.timeUntilDeadline = 3240f;
			HNSValues.TPMines.Clear();
			HNSValues.FirstWeaponReceived = false;
		}

		[HarmonyPatch("ShipLeaveAutomatically")]
		[HarmonyPrefix]
		public static void GrabShipLeaveTime(ref bool leavingOnMidnight)
		{
			GameManager.Instance.ShipLeavingEarly = true;
		}

		[HarmonyPatch("OnShipLandedMiscEvents")]
		[HarmonyPostfix]
		public static void AddDoorComponents()
		{
			ModBase.mls.LogInfo((object)"Adding door interact components.");
			DoorLock[] array = Object.FindObjectsOfType<DoorLock>();
			DoorLock[] array2 = array;
			foreach (DoorLock val in array2)
			{
				((Component)val).gameObject.AddComponent<DoorLockShotgunInteract>();
			}
			if (ConfigProcessor.Config.TPToEntranceEnabled)
			{
				RoundManager.FindMainEntranceScript(false).TeleportPlayer();
			}
		}

		[HarmonyPatch("ReviveDeadPlayers")]
		[HarmonyPostfix]
		public static void SwitchSuits()
		{
			UnlockableSuit.SwitchSuitForAllPlayers(0, false);
			if (ConfigProcessor.Config.StatsEnabled)
			{
				try
				{
					EndGameStatsUI.Instance.Display();
				}
				catch (Exception)
				{
				}
			}
		}

		[HarmonyPatch("OnClientConnect")]
		[HarmonyPostfix]
		public static void SendServerConfiguration(ref ulong clientId)
		{
			if (NetworkManager.Singleton.IsServer)
			{
				((MonoBehaviour)GameNetworkManager.Instance).StartCoroutine(ConfigProcessor.Config.TransferConfigTo(clientId));
			}
		}
	}
	[HarmonyPatch(typeof(TerminalAccessibleObject))]
	public class TerminalAccessibleObjectPatch
	{
		[HarmonyPatch("Update")]
		[HarmonyPrefix]
		public static bool BlockOriginal(TerminalAccessibleObject __instance)
		{
			return (Object)(object)__instance.mapRadarObject != (Object)null;
		}
	}
	[HarmonyPatch(typeof(Terminal))]
	internal class TerminalPatch
	{
		private protected static readonly Regex randomRegex = new Regex("(?i)r(a)?n(d)?o(m)?|rand|rnd");

		[HarmonyPatch("OnSubmit")]
		[HarmonyPrefix]
		public static bool CheckForModKeyword(Terminal __instance)
		{
			if (StartOfRound.Instance.inShipPhase)
			{
				string text = __instance.screenText.text.Substring(__instance.screenText.text.Length - __instance.textAdded).ToLower();
				ModBase.mls.LogInfo((object)"PARSED SENTENCE:");
				ModBase.mls.LogInfo((object)text);
				if (randomRegex.IsMatch(text))
				{
					int num = new Random().Next(1, 13);
					while (num == 11 || num == 3)
					{
						num = new Random().Next(1, 13);
					}
					StartOfRound.Instance.ChangeLevelServerRpc(num, __instance.groupCredits);
					__instance.screenText.text = "";
					__instance.QuitTerminal(true);
					return false;
				}
				return true;
			}
			return true;
		}
	}
	[HarmonyPatch(typeof(TimeOfDay))]
	internal class TimeOfDayPatch
	{
		[HarmonyPatch("UpdateProfitQuotaCurrentTime")]
		[HarmonyPrefix]
		public static bool StopUpdateProfitQuotaCurrentTime(TimeOfDay __instance)
		{
			return false;
		}

		[HarmonyPatch("SetShipLeaveEarlyClientRpc")]
		[HarmonyPrefix]
		public static bool StopShipLeaveEarly()
		{
			return !GameManager.Instance.ShipLeavingEarly;
		}
	}
}
namespace LCHideAndSeekMod.Extensions
{
	public static class GameObjectExtensions
	{
		public static bool TryGetComponent<T>(this GameObject go, out T component) where T : Component
		{
			component = go.GetComponent<T>();
			return (Object)(object)component != (Object)null;
		}

		public static bool TryGetComponentsInChildren<T>(this GameObject go, out T[] components) where T : Component
		{
			components = go.GetComponentsInChildren<T>();
			return components.Length != 0;
		}
	}
	public static class PlayerControllerBExtensions
	{
		public static HNSPlayerComponent AsHNSPlayer(this PlayerControllerB player)
		{
			return ((Component)player).gameObject.GetComponent<HNSPlayerComponent>();
		}
	}
}
namespace LCHideAndSeekMod.Enums
{
	public enum EndGameUIStyle
	{
		Orange,
		Blue
	}
	public enum GamemodeOption
	{
		DelayedWeapon,
		InstantWeapon
	}
	public enum GameResult
	{
		HiderWin,
		SeekerWin,
		None,
		Draw
	}
	public enum GameState
	{
		WaitingForPlayers,
		InGame,
		GameOver
	}
	public enum MineSpawnAmount
	{
		Standard = 0,
		SlightlyMore = 5,
		More = 10,
		MuchMore = 20
	}
	public enum ScrapSpawnAmount
	{
		Standard = 0,
		SlightlyMore = 3,
		More = 5,
		MuchMore = 7
	}
	public enum SeekerWeapon
	{
		Shotgun,
		Shovel,
		Both
	}
	public enum Suit
	{
		Orange,
		Green,
		Hazard,
		Pajama,
		Purple,
		Bee,
		Bunny
	}
	public enum WhisperFailReason
	{
		NoError,
		SendingAsSeeker,
		SendingToSeeker,
		TargetNotFound,
		SendingToSelf
	}
}
namespace LCHideAndSeekMod.Core
{
	internal class CustomUI : NetworkBehaviour
	{
		[CompilerGenerated]
		private sealed class <FadeTextOutCoroutine>d__19 : IEnumerator<object>, IDisposable, IEnumerator
		{
			private int <>1__state;

			private object <>2__current;

			public int duration;

			public CustomUI <>4__this;

			private float <alpha>5__1;

			object IEnumerator<object>.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			object IEnumerator.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			[DebuggerHidden]
			public <FadeTextOutCoroutine>d__19(int <>1__state)
			{
				this.<>1__state = <>1__state;
			}

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				//IL_005d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0067: Expected O, but got Unknown
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					<alpha>5__1 = 1f;
					((Graphic)<>4__this.canvasText).canvasRenderer.SetAlpha(<alpha>5__1);
					<>2__current = (object)new WaitForSeconds((float)duration);
					<>1__state = 1;
					return true;
				case 1:
					<>1__state = -1;
					break;
				case 2:
					<>1__state = -1;
					break;
				}
				if (<alpha>5__1 > 0f)
				{
					<alpha>5__1 -= 0.01f;
					((Graphic)<>4__this.canvasText).canvasRenderer.SetAlpha(<alpha>5__1);
					<>2__current = null;
					<>1__state = 2;
					return true;
				}
				<>4__this.Show(show: false);
				((Graphic)<>4__this.canvasText).canvasRenderer.SetAlpha(1f);
				<>4__this.updateOverridden = false;
				return false;
			}

			bool IEnumerator.MoveNext()
			{
				//ILSpy generated this explicit interface implementation from .override directive in MoveNext
				return this.MoveNext();
			}

			[DebuggerHidden]
			void IEnumerator.Reset()
			{
				throw new NotSupportedException();
			}
		}

		[CompilerGenerated]
		private sealed class <WaitForFade>d__14 : IEnumerator<object>, IDisposable, IEnumerator
		{
			private int <>1__state;

			private object <>2__current;

			public Action action;

			public int duration;

			public CustomUI <>4__this;

			object IEnumerator<object>.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			object IEnumerator.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			[DebuggerHidden]
			public <WaitForFade>d__14(int <>1__state)
			{
				this.<>1__state = <>1__state;
			}

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				//IL_0044: Unknown result type (might be due to invalid IL or missing references)
				//IL_004e: Expected O, but got Unknown
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					<>4__this.FadeOut(duration);
					<>2__current = (object)new WaitUntil((Func<bool>)(() => !<>4__this.canvasObject.activeInHierarchy));
					<>1__state = 1;
					return true;
				case 1:
					<>1__state = -1;
					action();
					return false;
				}
			}

			bool IEnumerator.MoveNext()
			{
				//ILSpy generated this explicit interface implementation from .override directive in MoveNext
				return this.MoveNext();
			}

			[DebuggerHidden]
			void IEnumerator.Reset()
			{
				throw new NotSupportedException();
			}
		}

		[CompilerGenerated]
		private sealed class <WaitForHNSComponent>d__8 : IEnumerator<object>, IDisposable, IEnumerator
		{
			private int <>1__state;

			private object <>2__current;

			public CustomUI <>4__this;

			object IEnumerator<object>.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			object IEnumerator.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			[DebuggerHidden]
			public <WaitForHNSComponent>d__8(int <>1__state)
			{
				this.<>1__state = <>1__state;
			}

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				//IL_0032: Unknown result type (might be due to invalid IL or missing references)
				//IL_003c: Expected O, but got Unknown
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					<>2__current = (object)new WaitUntil((Func<bool>)(() => (Object)(object)((Component)<>4__this.ownerPlayer).gameObject.GetComponent<HNSPlayerComponent>() != (Object)null));
					<>1__state = 1;
					return true;
				case 1:
					<>1__state = -1;
					ModBase.mls.LogInfo((object)"Assigning hns comp to ui");
					<>4__this.localHNSComponent = ((Component)<>4__this.ownerPlayer).gameObject.GetComponent<HNSPlayerComponent>();
					return false;
				}
			}

			bool IEnumerator.MoveNext()
			{
				//ILSpy generated this explicit interface implementation from .override directive in MoveNext
				return this.MoveNext();
			}

			[DebuggerHidden]
			void IEnumerator.Reset()
			{
				throw new NotSupportedException();
			}
		}

		private GameObject canvasObject;

		private GameObject canvasTextObject;

		private Text canvasText;

		private Coroutine fadeCoroutine;

		private PlayerControllerB ownerPlayer;

		private bool updateOverridden = false;

		private HNSPlayerComponent localHNSComponent;

		private void Awake()
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Expected O, but got Unknown
			//IL_0082: Unknown result type (might be due to invalid IL or missing references)
			//IL_008c: Expected O, but got Unknown
			//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_00e0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e5: 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_0139: Unknown result type (might be due to invalid IL or missing references)
			canvasObject = new GameObject();
			canvasObject.transform.parent = ((Component)this).transform;
			((Object)canvasObject).name = "CustomUICanvas";
			Canvas val = canvasObject.AddComponent<Canvas>();
			canvasObject.SetActive(false);
			val.renderMode = (RenderMode)0;
			canvasObject.AddComponent<CanvasScaler>();
			CanvasGroup val2 = canvasObject.AddComponent<CanvasGroup>();
			val2.blocksRaycasts = false;
			canvasObject.AddComponent<GraphicRaycaster>();
			canvasTextObject = new GameObject();
			((Object)canvasTextObject).name = "CustomUICanvasText";
			Text val3 = (canvasText = canvasTextObject.AddComponent<Text>());
			Transform transform = canvasTextObject.transform;
			Rect rect = ((Component)val).GetComponent<RectTransform>().rect;
			float num = ((Rect)(ref rect)).width / 2f - 10f;
			rect = ((Component)val).GetComponent<RectTransform>().rect;
			transform.localPosition = new Vector3(num, ((Rect)(ref rect)).height / 2f - 75f, 0f);
			val3.text = "";
			val3.font = ModBase.ModFont;
			val3.alignment = (TextAnchor)7;
			((Graphic)val3).rectTransform.sizeDelta = new Vector2(500f, 400f);
			val3.fontSize = 22;
			((Component)val3).transform.parent = canvasObject.transform;
			val3.supportRichText = true;
			ownerPlayer = GameNetworkManager.Instance.localPlayerController;
			((MonoBehaviour)this).StartCoroutine(WaitForHNSComponent());
		}

		[IteratorStateMachine(typeof(<WaitForHNSComponent>d__8))]
		private IEnumerator WaitForHNSComponent()
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <WaitForHNSComponent>d__8(0)
			{
				<>4__this = this
			};
		}

		public static void BroadcastMessage(string msg, int fadeDuration = 0, bool includeServer = true)
		{
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			//IL_003c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0056: Unknown result type (might be due to invalid IL or missing references)
			//IL_005c: Unknown result type (might be due to invalid IL or missing references)
			//IL_007e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0084: Unknown result type (might be due to invalid IL or missing references)
			//IL_009b: Unknown result type (might be due to invalid IL or missing references)
			if (NetworkManager.Singleton.IsServer)
			{
				char[] array = msg.ToCharArray();
				FastBufferWriter val = default(FastBufferWriter);
				((FastBufferWriter)(ref val))..ctor(4 + 2 * array.Length + 4, (Allocator)2, -1);
				int num = array.Length;
				((FastBufferWriter)(ref val)).WriteValueSafe<int>(ref num, default(ForPrimitives));
				for (int i = 0; i < array.Length; i++)
				{
					((FastBufferWriter)(ref val)).WriteValueSafe<char>(ref array[i], default(ForPrimitives));
				}
				((FastBufferWriter)(ref val)).WriteValueSafe<int>(ref fadeDuration, default(ForPrimitives));
				NetworkManager.Singleton.CustomMessagingManager.SendNamedMessageToAll("Tibnan.hnsmod_ClientReceivesBroadcastMsg", val, (NetworkDelivery)2);
				if (includeServer)
				{
					CustomUI component = ((Component)GameNetworkManager.Instance.localPlayerController).gameObject.GetComponent<CustomUI>();
					component.ShowLocalMessage(msg, fadeDuration);
				}
			}
		}

		public static void BroadcastMessage(string msg, int fadeDuration = 0, bool includeServer = true, params ulong[] clients)
		{
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			//IL_003c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0056: Unknown result type (might be due to invalid IL or missing references)
			//IL_005c: Unknown result type (might be due to invalid IL or missing references)
			//IL_007e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0084: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
			if (NetworkManager.Singleton.IsServer)
			{
				char[] array = msg.ToCharArray();
				FastBufferWriter val = default(FastBufferWriter);
				((FastBufferWriter)(ref val))..ctor(4 + 2 * array.Length + 4, (Allocator)2, -1);
				int num = array.Length;
				((FastBufferWriter)(ref val)).WriteValueSafe<int>(ref num, default(ForPrimitives));
				for (int i = 0; i < array.Length; i++)
				{
					((FastBufferWriter)(ref val)).WriteValueSafe<char>(ref array[i], default(ForPrimitives));
				}
				((FastBufferWriter)(ref val)).WriteValueSafe<int>(ref fadeDuration, default(ForPrimitives));
				foreach (ulong num2 in clients)
				{
					NetworkManager.Singleton.CustomMessagingManager.SendNamedMessage("Tibnan.hnsmod_ClientReceivesBroadcastMsg", num2, val, (NetworkDelivery)2);
				}
				if (includeServer)
				{
					CustomUI component = ((Component)GameNetworkManager.Instance.localPlayerController).gameObject.GetComponent<CustomUI>();
					component.ShowLocalMessage(msg, fadeDuration);
				}
			}
		}

		public static void ProcessBroadcastMessage(ulong _, FastBufferReader reader)
		{
			//IL_000d: 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_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			//IL_005b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0061: Unknown result type (might be due to invalid IL or missing references)
			string text = "";
			int num = default(int);
			((FastBufferReader)(ref reader)).ReadValueSafe<int>(ref num, default(ForPrimitives));
			char c = default(char);
			for (int i = 0; i < num; i++)
			{
				((FastBufferReader)(ref reader)).ReadValueSafe<char>(ref c, default(ForPrimitives));
				text += c;
			}
			int duration = default(int);
			((FastBufferReader)(ref reader)).ReadValueSafe<int>(ref duration, default(ForPrimitives));
			CustomUI component = ((Component)GameNetworkManager.Instance.localPlayerController).gameObject.GetComponent<CustomUI>();
			component.ShowLocalMessage(text, duration);
		}

		private void Update()
		{
			if (updateOverridden || !(ConfigProcessor.Config?.UIShow ?? false) || !GameManager.Instance.GameRunning)
			{
				return;
			}
			if (localHNSComponent.Role == PlayerRole.Hider)
			{
				if (ConfigProcessor.Config.DisguiseEnabled)
				{
					SetText(string.Format("<color=white>{0}\nPress H to {1}\nHold H to lock rotation: {2} \nRound {3}: Hiders left: {4}</color>", localHNSComponent.IsDisguised ? $"Disguised as {localHNSComponent.DisguiseName}:" : "Undisguised.", localHNSComponent.IsDisguised ? "Undisguise, X to taunt" : "Disguise", localHNSComponent.DisguiseUnRotatable ? "<color=red>LOCKED</color>" : "<color=green>UNLOCKED</color>", GameManager.RoundCount, GameManager.Instance.HidersCount), overrideUpdate: false);
				}
				else
				{
					SetText($"<color=white>Round {GameManager.RoundCount}: Hiders left: {GameManager.Instance.HidersCount}</color>", overrideUpdate: false);
				}
				Show(show: true);
			}
			else if (localHNSComponent.Role == PlayerRole.Seeker && TimeOfDay.Instance.shipLeavingAlertCalled)
			{
				SetText($"<color=red>Round {GameManager.RoundCount}: Hiders left: {GameManager.Instance.HidersCount}\nShip leaving at: {GameManager.Instance.ShipLeavingTime}</color>", overrideUpdate: false);
				Show(show: true);
			}
		}

		public void WaitUntilFadeThenDo(Action action, int duration = -1)
		{
			((MonoBehaviour)this).StartCoroutine(WaitForFade(action, duration));
		}

		[IteratorStateMachine(typeof(<WaitForFade>d__14))]
		private IEnumerator WaitForFade(Action action, int duration)
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <WaitForFade>d__14(0)
			{
				<>4__this = this,
				action = action,
				duration = duration
			};
		}

		public void SetText(string text, bool overrideUpdate = true)
		{
			canvasText.text = text;
			updateOverridden = overrideUpdate;
		}

		public void Show(bool show)
		{
			canvasObject.SetActive(show);
		}

		public void FadeOut(int duration = -1)
		{
			if (duration != -1)
			{
				if (fadeCoroutine != null)
				{
					((MonoBehaviour)this).StopCoroutine(fadeCoroutine);
				}
				fadeCoroutine = ((MonoBehaviour)this).StartCoroutine(FadeTextOutCoroutine(duration));
			}
		}

		public void ShowLocalMessage(string msg, int duration = 0)
		{
			SetText(msg);
			Show(show: true);
			FadeOut(duration);
		}

		[IteratorStateMachine(typeof(<FadeTextOutCoroutine>d__19))]
		private IEnumerator FadeTextOutCoroutine(int duration)
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <FadeTextOutCoroutine>d__19(0)
			{
				<>4__this = this,
				duration = duration
			};
		}
	}
	internal class DoorLockShotgunInteract : MonoBehaviour
	{
		private int health;

		private DoorLock mainScript;

		private void Awake()
		{
			mainScript = ((Component)this).gameObject.GetComponentInChildren<DoorLock>();
			health = ConfigProcessor.Config.DoorHits;
		}

		public void Hit(PlayerControllerB playerWhoHit)
		{
			if ((Object)(object)playerWhoHit == (Object)(object)GameNetworkManager.Instance.localPlayerController && mainScript.isLocked && health >= 1)
			{
				health--;
				if (health < 1)
				{
					mainScript.UnlockDoorSyncWithServer();
					mainScript.OpenOrCloseDoor(playerWhoHit);
					health = ConfigProcessor.Config.DoorHits;
				}
			}
		}
	}
	internal class GameManager : MonoBehaviour
	{
		public delegate void GameEndedHandler();

		[CompilerGenerated]
		private sealed class <GrabWeapon>d__32 : IEnumerator<object>, IDisposable, IEnumerator
		{
			private int <>1__state;

			private object <>2__current;

			public PlayerControllerB player;

			public NetworkObject nObject;

			public GameObject weapon;

			public bool delay;

			private Traverse <trav>5__1;

			private MethodInfo <mInfo>5__2;

			private IEnumerator <coroutine>5__3;

			object IEnumerator<object>.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			object IEnumerator.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			[DebuggerHidden]
			public <GrabWeapon>d__32(int <>1__state)
			{
				this.<>1__state = <>1__state;
			}

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				<trav>5__1 = null;
				<mInfo>5__2 = null;
				<coroutine>5__3 = null;
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				//IL_0140: 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_0096: Expected O, but got Unknown
				//IL_0068: Unknown result type (might be due to invalid IL or missing references)
				//IL_0072: Expected O, but got Unknown
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					if (!delay)
					{
						break;
					}
					if (ConfigProcessor.Config.GamemodeOption == GamemodeOption.DelayedWeapon)
					{
						<>2__current = (object)new WaitUntil((Func<bool>)(() => Utils.CalcHour(TimeOfDay.Instance.normalizedTimeOfDay, TimeOfDay.Instance.numberOfHours) >= 12));
						<>1__state = 1;
						return true;
					}
					<>2__current = (object)new WaitForSeconds(0.5f);
					<>1__state = 2;
					return true;
				case 1:
					<>1__state = -1;
					break;
				case 2:
					<>1__state = -1;
					break;
				}
				ModBase.mls.LogInfo((object)"Trying to grab spawned weapon on client");
				<trav>5__1 = Traverse.Create((object)player);
				<trav>5__1.Field("currentlyGrabbingObject").SetValue((object)weapon.GetComponent<GrabbableObject>());
				object? value = typeof(PlayerControllerB).GetField("currentlyGrabbingObject", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(player);
				((GrabbableObject)((value is GrabbableObject) ? value : null)).InteractItem();
				typeof(PlayerControllerB).GetMethod("GrabObjectServerRpc", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(player, new object[1] { (object)new NetworkObjectReference(nObject) });
				<mInfo>5__2 = typeof(PlayerControllerB).GetMethod("GrabObject", BindingFlags.Instance | BindingFlags.NonPublic);
				<coroutine>5__3 = (IEnumerator)<mInfo>5__2.Invoke(player, null);
				((MonoBehaviour)GameNetworkManager.Instance).StartCoroutine(<coroutine>5__3);
				return false;
			}

			bool IEnumerator.MoveNext()
			{
				//ILSpy generated this explicit interface implementation from .override directive in MoveNext
				return this.MoveNext();
			}

			[DebuggerHidden]
			void IEnumerator.Reset()
			{
				throw new NotSupportedException();
			}
		}

		[CompilerGenerated]
		private sealed class <GrantSeekerWeapons>d__18 : IEnumerator<object>, IDisposable, IEnumerator
		{
			private int <>1__state;

			private object <>2__current;

			public SeekerWeapon weapon;

			public GamemodeOption gamemode;

			public GameManager <>4__this;

			private GameObject <shovel>5__1;

			private GameObject <shotgun>5__2;

			private NetworkObject <shovelNO>5__3;

			private NetworkObject <shotgunNO>5__4;

			private PlayerControllerB <player>5__5;

			private FastBufferWriter <writer>5__6;

			private FastBufferWriter <writer>5__7;

			private Traverse <trav>5__8;

			private MethodInfo <mInfo>5__9;

			private IEnumerator <coroutine>5__10;

			private Traverse <trav>5__11;

			private MethodInfo <mInfo>5__12;

			private IEnumerator <coroutine>5__13;

			object IEnumerator<object>.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			object IEnumerator.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			[DebuggerHidden]
			public <GrantSeekerWeapons>d__18(int <>1__state)
			{
				this.<>1__state = <>1__state;
			}

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				<shovel>5__1 = null;
				<shotgun>5__2 = null;
				<shovelNO>5__3 = null;
				<shotgunNO>5__4 = null;
				<player>5__5 = null;
				<trav>5__8 = null;
				<mInfo>5__9 = null;
				<coroutine>5__10 = null;
				<trav>5__11 = null;
				<mInfo>5__12 = null;
				<coroutine>5__13 = null;
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				//IL_0539: Unknown result type (might be due to invalid IL or missing references)
				//IL_00a6: 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_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_0172: Unknown result type (might be due to invalid IL or missing references)
				//IL_0177: 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_0107: Unknown result type (might be due to invalid IL or missing references)
				//IL_0497: Unknown result type (might be due to invalid IL or missing references)
				//IL_04a1: Expected O, but got Unknown
				//IL_0218: Unknown result type (might be due to invalid IL or missing references)
				//IL_021d: 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_023f: 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_0299: Unknown result type (might be due to invalid IL or missing references)
				//IL_029e: 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_02c0: 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_0438: Unknown result type (might be due to invalid IL or missing references)
				//IL_0442: Expected O, but got Unknown
				//IL_03c0: Unknown result type (might be due to invalid IL or missing references)
				object? value2;
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					<shovel>5__1 = null;
					<shotgun>5__2 = null;
					<shovelNO>5__3 = null;
					<shotgunNO>5__4 = null;
					if (weapon == SeekerWeapon.Both)
					{
						<shovel>5__1 = Object.Instantiate<GameObject>(StartOfRound.Instance.allItemsList.itemsList.Find((Item x) => x.itemName == "Shovel").spawnPrefab, ((Component)GameNetworkManager.Instance.localPlayerController).transform.position, Quaternion.identity);
						<shotgun>5__2 = Object.Instantiate<GameObject>(StartOfRound.Instance.allItemsList.itemsList.Find((Item x) => x.itemName == "Shotgun").spawnPrefab, ((Component)GameNetworkManager.Instance.localPlayerController).transform.position, Quaternion.identity);
					}
					else if (weapon == SeekerWeapon.Shovel)
					{
						<shovel>5__1 = Object.Instantiate<GameObject>(StartOfRound.Instance.allItemsList.itemsList.Find((Item x) => x.itemName == "Shovel").spawnPrefab, ((Component)GameNetworkManager.Instance.localPlayerController).transform.position, Quaternion.identity);
					}
					else
					{
						<shotgun>5__2 = Object.Instantiate<GameObject>(StartOfRound.Instance.allItemsList.itemsList.Find((Item x) => x.itemName == "Shotgun").spawnPrefab, ((Component)GameNetworkManager.Instance.localPlayerController).transform.position, Quaternion.identity);
					}
					if ((Object)(object)<shovel>5__1 != (Object)null)
					{
						<shovelNO>5__3 = <shovel>5__1.GetComponent<NetworkObject>();
						<shovelNO>5__3.Spawn(false);
						<writer>5__6 = new FastBufferWriter(8, (Allocator)2, -1);
						ref FastBufferWriter reference = ref <writer>5__6;
						ulong networkObjectId = <shovelNO>5__3.NetworkObjectId;
						((FastBufferWriter)(ref reference)).WriteValueSafe<ulong>(ref networkObjectId, default(ForPrimitives));
						NetworkManager.Singleton.CustomMessagingManager.SendNamedMessageToAll("Tibnan.hnsmod_ShotgunSpawned", <writer>5__6, (NetworkDelivery)2);
					}
					if ((Object)(object)<shotgun>5__2 != (Object)null)
					{
						<shotgunNO>5__4 = <shotgun>5__2.GetComponent<NetworkObject>();
						<shotgunNO>5__4.Spawn(false);
						<writer>5__7 = new FastBufferWriter(8, (Allocator)2, -1);
						ref FastBufferWriter reference2 = ref <writer>5__7;
						ulong networkObjectId = <shotgunNO>5__4.NetworkObjectId;
						((FastBufferWriter)(ref reference2)).WriteValueSafe<ulong>(ref networkObjectId, default(ForPrimitives));
						NetworkManager.Singleton.CustomMessagingManager.SendNamedMessageToAll("Tibnan.hnsmod_ShotgunSpawned", <writer>5__7, (NetworkDelivery)2);
					}
					<player>5__5 = GameNetworkManager.Instance.localPlayerController;
					if (<player>5__5.AsHNSPlayer().Role == PlayerRole.Seeker)
					{
						ModBase.mls.LogInfo((object)"Grabbing weapon(s) on server");
						if ((Object)(object)<shovel>5__1 != (Object)null)
						{
							<trav>5__8 = Traverse.Create((object)<player>5__5);
							<trav>5__8.Field("currentlyGrabbingObject").SetValue((object)<shovel>5__1.GetComponent<GrabbableObject>());
							object? value = typeof(PlayerControllerB).GetField("currentlyGrabbingObject", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(<player>5__5);
							((GrabbableObject)((value is GrabbableObject) ? value : null)).InteractItem();
							typeof(PlayerControllerB).GetMethod("GrabObjectServerRpc", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(<player>5__5, new object[1] { (object)new NetworkObjectReference(<shovelNO>5__3) });
							<mInfo>5__9 = typeof(PlayerControllerB).GetMethod("GrabObject", BindingFlags.Instance | BindingFlags.NonPublic);
							<coroutine>5__10 = (IEnumerator)<mInfo>5__9.Invoke(<player>5__5, null);
							((MonoBehaviour)<>4__this).StartCoroutine(<coroutine>5__10);
							<trav>5__8 = null;
							<mInfo>5__9 = null;
							<coroutine>5__10 = null;
						}
						<>2__current = (object)new WaitForSeconds(0.5f);
						<>1__state = 1;
						return true;
					}
					break;
				case 1:
					<>1__state = -1;
					if (!((Object)(object)<shotgun>5__2 != (Object)null))
					{
						break;
					}
					if (gamemode == GamemodeOption.DelayedWeapon)
					{
						<>2__current = (object)new WaitUntil((Func<bool>)(() => Utils.CalcHour(TimeOfDay.Instance.normalizedTimeOfDay, TimeOfDay.Instance.numberOfHours) >= 12));
						<>1__state = 2;
						return true;
					}
					goto IL_04b1;
				case 2:
					{
						<>1__state = -1;
						goto IL_04b1;
					}
					IL_04b1:
					<trav>5__11 = Traverse.Create((object)<player>5__5);
					<trav>5__11.Field("currentlyGrabbingObject").SetValue((object)<shotgun>5__2.GetComponent<GrabbableObject>());
					value2 = typeof(PlayerControllerB).GetField("currentlyGrabbingObject", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(<player>5__5);
					((GrabbableObject)((value2 is GrabbableObject) ? value2 : null)).InteractItem();
					typeof(PlayerControllerB).GetMethod("GrabObjectServerRpc", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(<player>5__5, new object[1] { (object)new NetworkObjectReference(<shotgunNO>5__4) });
					<mInfo>5__12 = typeof(PlayerControllerB).GetMethod("GrabObject", BindingFlags.Instance | BindingFlags.NonPublic);
					<coroutine>5__13 = (IEnumerator)<mInfo>5__12.Invoke(<player>5__5, null);
					((MonoBehaviour)<>4__this).StartCoroutine(<coroutine>5__13);
					<trav>5__11 = null;
					<mInfo>5__12 = null;
					<coroutine>5__13 = null;
					break;
				}
				return false;
			}

			bool IEnumerator.MoveNext()
			{
				//ILSpy generated this explicit interface implementation from .override directive in MoveNext
				return this.MoveNext();
			}

			[DebuggerHidden]
			void IEnumerator.Reset()
			{
				throw new NotSupportedException();
			}
		}

		private GameObject obj;

		private PlayerControllerB seeker;

		private List<PlayerControllerB> hiders = new List<PlayerControllerB>();

		private GameState gameState = GameState.WaitingForPlayers;

		private GameResult gameResult = GameResult.None;

		private bool shipLeavingEarly = false;

		private bool twoPlayerMode;

		private string shipLeavingTime = "";

		private List<PlayerControllerB> activePlayers = new List<PlayerControllerB>();

		public static GameManager Instance = new GameManager();

		public static int RoundCount = 1;

		public bool GameRunning => gameState == GameState.InGame;

		public int HidersCount
		{
			get
			{
				if (NetworkManager.Singleton.IsServer)
				{
					return hiders.Count;
				}
				return hiders.Count((PlayerControllerB x) => !x.isPlayerDead && !x.disconnectedMidGame);
			}
		}

		public string ShipLeavingTime
		{
			get
			{
				return shipLeavingTime;
			}
			set
			{
				shipLeavingTime = value;
			}
		}

		public bool ShipLeavingEarly
		{
			get
			{
				return shipLeavingEarly;
			}
			set
			{
				shipLeavingEarly = value;
			}
		}

		public bool SeekerInTerminal => seeker.inTerminalMenu;

		public ReadOnlyCollection<PlayerControllerB> Hiders => hiders.AsReadOnly();

		public PlayerControllerB Seeker => seeker;

		public int Result => (int)gameResult;

		public ReadOnlyCollection<PlayerControllerB> Players => activePlayers.AsReadOnly();

		public event GameEndedHandler GameEnded;

		public void Update()
		{
			switch (gameState)
			{
			case GameState.WaitingForPlayers:
				break;
			case GameState.InGame:
				hiders.RemoveAll(delegate(PlayerControllerB x)
				{
					if (x.disconnectedMidGame)
					{
						activePlayers.Remove(x);
					}
					return x.isPlayerDead || x.disconnectedMidGame;
				});
				if (seeker.isPlayerDead || seeker.disconnectedMidGame)
				{
					gameResult = GameResult.HiderWin;
					if (hiders.Count < 1)
					{
						gameResult = GameResult.Draw;
					}
					gameState = GameState.GameOver;
				}
				else if (hiders.Count < 1)
				{
					gameResult = GameResult.SeekerWin;
					gameState = GameState.GameOver;
				}
				if (StartOfRound.Instance.shipIsLeaving || StartOfRound.Instance.shipLeftAutomatically)
				{
					gameResult = GameResult.HiderWin;
					gameState = GameState.GameOver;
				}
				if (ConfigProcessor.Config.StartShipEarly && hiders.Count == 1 && !shipLeavingEarly && !twoPlayerMode)
				{
					MakeShipLeaveEarly();
				}
				break;
			case GameState.GameOver:
				Instance.StopGame();
				break;
			}
		}

		private void MakeShipLeaveEarly()
		{
			//IL_0067: Unknown result type (might be due to invalid IL or missing references)
			TimeOfDay.Instance.SetShipLeaveEarlyClientRpc(TimeOfDay.Instance.normalizedTimeOfDay + 0.2f, 0);
			shipLeavingTime = Utils.CalcTime(TimeOfDay.Instance.normalizedTimeOfDay + 0.2f, TimeOfDay.Instance.numberOfHours);
			FastBufferWriter val = default(FastBufferWriter);
			((FastBufferWriter)(ref val))..ctor(4, (Allocator)2, -1);
			NetworkManager.Singleton.CustomMessagingManager.SendNamedMessage("Tibnan.hnsmod_RecalcTime", seeker.actualClientId, val, (NetworkDelivery)2);
			shipLeavingEarly = true;
		}

		private void StopGame()
		{
			//IL_0079: Unknown result type (might be due to invalid IL or missing references)
			//IL_007f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0095: Unknown result type (might be due to invalid IL or missing references)
			if ((gameState == GameState.GameOver && Object.FindObjectOfType<StartMatchLever>().triggerScript.interactable) || StartOfRound.Instance.shipIsLeaving || StartOfRound.Instance.shipLeftAutomatically)
			{
				ModBase.mls.LogInfo((object)("SENDING END MESSAGE WITH RESULT " + gameResult));
				FastBufferWriter val = default(FastBufferWriter);
				((FastBufferWriter)(ref val))..ctor(4, (Allocator)2, -1);
				((FastBufferWriter)(ref val)).WriteValueSafe<GameResult>(ref gameResult, default(ForEnums));
				NetworkManager.Singleton.CustomMessagingManager.SendNamedMessageToAll("Tibnan.hnsmod_EndGame", val, (NetworkDelivery)2);
				StartOfRound.Instance.EndGameClientRpc((int)GameNetworkManager.Instance.localPlayerController.playerClientId);
				gameState = GameState.WaitingForPlayers;
				EndGame(gameResult);
			}
		}

		[IteratorStateMachine(typeof(<GrantSeekerWeapons>d__18))]
		private IEnumerator GrantSeekerWeapons(SeekerWeapon weapon, GamemodeOption gamemode)
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <GrantSeekerWeapons>d__18(0)
			{
				<>4__this = this,
				weapon = weapon,
				gamemode = gamemode
			};
		}

		public static void StartGame(int playerCount)
		{
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Expected O, but got Unknown
			//IL_00c3: Unknown result type (might be due to invalid IL or missing references)
			//IL_037e: Unknown result type (might be due to invalid IL or missing references)
			Instance.obj = new GameObject("HNSManager");
			Instance = Instance.obj.AddComponent<GameManager>();
			Instance.twoPlayerMode = playerCount == 1;
			if (ConfigProcessor.Config.StatsEnabled)
			{
				MiscStat.Reset();
			}
			FastBufferWriter val = default(FastBufferWriter);
			((FastBufferWriter)(ref val))..ctor(4, (Allocator)2, -1);
			PlayerControllerB[] allPlayerScripts = StartOfRound.Instance.allPlayerScripts;
			foreach (PlayerControllerB val2 in allPlayerScripts)
			{
				if ((val2.isPlayerControlled || val2.isPlayerDead) && (Object)(object)val2.AsHNSPlayer() == (Object)null)
				{
					((Component)val2).gameObject.AddComponent<HNSPlayerComponent>();
				}
			}
			NetworkManager.Singleton.CustomMessagingManager.SendNamedMessageToAll("Tibnan.hnsmod_ClientRefreshPlayerComps", val, (NetworkDelivery)2);
			Instance.activePlayers = StartOfRound.Instance.allPlayerScripts.ToList().FindAll((PlayerControllerB x) => ((Component)x).gameObject.TryGetComponent<HNSPlayerComponent>(out HNSPlayerComponent _));
			foreach (PlayerControllerB activePlayer in Instance.activePlayers)
			{
				ModBase.mls.LogError((object)(activePlayer.playerUsername + " " + activePlayer.AsHNSPlayer().Role.ToString() + " CHANCE BEFORE SEEKER CHOOSE: " + activePlayer.AsHNSPlayer().SeekerChance));
			}
			Instance.ChooseSeeker();
			ModBase.mls.LogWarning((object)("Choosing seeker: " + Instance.seeker.playerUsername + " " + Instance.seeker.AsHNSPlayer().Role.ToString() + " " + Instance.seeker.AsHNSPlayer().SeekerChance));
			SendRoleMessage(Instance.seeker.playerClientId, PlayerRole.Seeker);
			Instance.activePlayers.ForEach(delegate(PlayerControllerB x)
			{
				HNSPlayerComponent hNSPlayerComponent2 = x.AsHNSPlayer();
				if (hNSPlayerComponent2.Role != PlayerRole.Seeker)
				{
					hNSPlayerComponent2.Role = PlayerRole.Hider;
					Instance.hiders.Add(x);
					SendRoleMessage(x.playerClientId, PlayerRole.Hider);
				}
			});
			Instance.AdjustChances();
			((MonoBehaviour)Instance).StartCoroutine(Instance.GrantSeekerWeapons(ConfigProcessor.Config.SeekerWeapon, ConfigProcessor.Config.GamemodeOption));
			Instance.SwitchSuits(ConfigProcessor.Config.SeekerSuit, ConfigProcessor.Config.HiderSuit);
			Instance.gameState = GameState.InGame;
			StartOfRound.Instance.mapScreen.SwitchRadarTargetClientRpc((int)Instance.seeker.playerClientId);
			if (ConfigProcessor.Config.StatsEnabled)
			{
				((Component)Instance).gameObject.AddComponent<PlayerStatManager>();
			}
			if (ConfigProcessor.Config.UIShow)
			{
				CustomUI component = ((Component)GameNetworkManager.Instance.localPlayerController).gameObject.GetComponent<CustomUI>();
				HNSPlayerComponent hNSPlayerComponent = GameNetworkManager.Instance.localPlayerController.AsHNSPlayer();
				component.ShowLocalMessage((hNSPlayerComponent.Role == PlayerRole.Seeker) ? "<color=red>You are a seeker.</color>" : "<color=white>You are a hider.</color>", 10);
			}
			NetworkManager.Singleton.CustomMessagingManager.SendNamedMessageToAll("Tibnan.hnsmod_ShowRoles", val, (NetworkDelivery)2);
		}

		private static void SendRoleMessage(ulong id, PlayerRole role)
		{
			//IL_0012: 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)
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_002b: 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)
			FastBufferWriter val = default(FastBufferWriter);
			((FastBufferWriter)(ref val))..ctor(12, (Allocator)2, -1);
			((FastBufferWriter)(ref val)).WriteValueSafe<ulong>(ref id, default(ForPrimitives));
			((FastBufferWriter)(ref val)).WriteValueSafe<PlayerRole>(ref role, default(ForEnums));
			NetworkManager.Singleton.CustomMessagingManager.SendNamedMessageToAll("Tibnan.hnsmod_ClientReceivesRoleMSG", val, (NetworkDelivery)2);
		}

		public static void SetRole(ulong _, FastBufferReader reader)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: 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)
			ulong num = default(ulong);
			((FastBufferReader)(ref reader)).ReadValue<ulong>(ref num, default(ForPrimitives));
			PlayerRole playerRole = default(PlayerRole);
			((FastBufferReader)(ref reader)).ReadValue<PlayerRole>(ref playerRole, default(ForEnums));
			PlayerControllerB val = StartOfRound.Instance.allPlayerScripts[num];
			val.AsHNSPlayer().Role = playerRole;
			ModBase.mls.LogInfo((object)(val.playerUsername + " " + ((Component)val).gameObject.GetComponent<HNSPlayerComponent>().Role));
			if (playerRole == PlayerRole.Seeker)
			{
				Instance.seeker = val;
			}
			else
			{
				Instance.hiders.Add(val);
			}
		}

		public static void ClientSwitchSuits(ulong _, FastBufferReader reader)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: 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)
			Suit seekerSuit = default(Suit);
			((FastBufferReader)(ref reader)).ReadValue<Suit>(ref seekerSuit, default(ForEnums));
			Suit hiderSuit = default(Suit);
			((FastBufferReader)(ref reader)).ReadValue<Suit>(ref hiderSuit, default(ForEnums));
			Instance.SwitchSuits(seekerSuit, hiderSuit, issuedByServer: true);
		}

		private void SwitchSuits(Suit seekerSuit, Suit hiderSuit, bool issuedByServer = false)
		{
			//IL_0098: 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_00ac: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c9: Unknown result type (might be due to invalid IL or missing references)
			if (!(ConfigProcessor.Config.UseCustomSuits || issuedByServer))
			{
				return;
			}
			int num = (int)seekerSuit;
			UnlockableSuit.SwitchSuitForPlayer(seeker, (num > 3) ? (num + 20) : num, true);
			num = (int)hiderSuit;
			foreach (PlayerControllerB hider in hiders)
			{
				UnlockableSuit.SwitchSuitForPlayer(hider, (num > 3) ? (num + 20) : num, true);
			}
			if (NetworkManager.Singleton.IsServer)
			{
				FastBufferWriter val = default(FastBufferWriter);
				((FastBufferWriter)(ref val))..ctor(8, (Allocator)2, -1);
				((FastBufferWriter)(ref val)).WriteValueSafe<Suit>(ref seekerSuit, default(ForEnums));
				((FastBufferWriter)(ref val)).WriteValueSafe<Suit>(ref hiderSuit, default(ForEnums));
				NetworkManager.Singleton.CustomMessagingManager.SendNamedMessageToAll("Tibnan.hnsmod_ClientSwitchSuits", val, (NetworkDelivery)2);
			}
		}

		private void ChooseSeeker()
		{
			activePlayers.RemoveAll((PlayerControllerB x) => x.disconnectedMidGame);
			if (ConfigProcessor.Config.ChanceBasedSeeker)
			{
				float num = activePlayers.Sum((PlayerControllerB x) => ((Component)x).gameObject.GetComponent<HNSPlayerComponent>().SeekerChance);
				float num2 = Random.Range(0.065f, num);
				float num3 = 0f;
				foreach (PlayerControllerB activePlayer in activePlayers)
				{
					num3 += activePlayer.AsHNSPlayer().SeekerChance;
					if (num3 >= num2)
					{
						seeker = activePlayer;
						break;
					}
				}
			}
			else
			{
				seeker = activePlayers.ElementAt(new Random().Next(0, activePlayers.Count));
			}
			seeker.AsHNSPlayer().Role = PlayerRole.Seeker;
		}

		private void AdjustChances()
		{
			if (!ConfigProcessor.Config.ChanceBasedSeeker)
			{
				return;
			}
			foreach (PlayerControllerB activePlayer in activePlayers)
			{
				HNSPlayerComponent hNSPlayerComponent = activePlayer.AsHNSPlayer();
				if (hNSPlayerComponent.Role == PlayerRole.Seeker)
				{
					hNSPlayerComponent.SeekerChance -= 0.3f;
					if (hNSPlayerComponent.SeekerChance < 0f)
					{
						hNSPlayerComponent.SeekerChance = 0f;
					}
				}
				else
				{
					hNSPlayerComponent.SeekerChance += 0.065f;
				}
				ModBase.mls.LogWarning((object)("CHANCE AFTER ADJUSTMENT: " + activePlayer.playerUsername + " " + hNSPlayerComponent.Role.ToString() + " " + hNSPlayerComponent.SeekerChance));
			}
		}

		private void ShowEndGameMessage(GameResult result)
		{
			CustomUI component = ((Component)GameNetworkManager.Instance.localPlayerController).gameObject.GetComponent<CustomUI>();
			HNSPlayerComponent hNSPlayerComponent = GameNetworkManager.Instance.localPlayerController.AsHNSPlayer();
			Object.FindObjectsOfType<HNSPlayerComponent>().ToList().ForEach(delegate(HNSPlayerComponent x)
			{
				ModBase.mls.LogWarning((object)(x.player.playerUsername + " " + x.Role));
			});
			switch (result)
			{
			case GameResult.Draw:
				component.ShowLocalMessage("<color=yellow>The game result was a draw!</color>", 5);
				break;
			case GameResult.SeekerWin:
				if (hNSPlayerComponent.Role == PlayerRole.Seeker)
				{
					component.ShowLocalMessage("<color=green>You won as the seeker!</color>", 5);
				}
				else
				{
					component.ShowLocalMessage("<color=red>The seeker won this round!</color>", 5);
				}
				break;
			case GameResult.HiderWin:
				if (hNSPlayerComponent.Role == PlayerRole.Hider)
				{
					component.ShowLocalMessage("<color=green>You won as one of the hiders!</color>", 5);
				}
				else
				{
					component.ShowLocalMessage("<color=red>The hiders won this round!</color>", 5);
				}
				break;
			case GameResult.None:
				break;
			}
		}

		public static void EndGameClient(ulong _, FastBufferReader reader)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			GameResult result = default(GameResult);
			((FastBufferReader)(ref reader)).ReadValueSafe<GameResult>(ref result, default(ForEnums));
			Instance.gameState = GameState.WaitingForPlayers;
			Instance.gameResult = result;
			Instance.EndGame(result);
		}

		private void EndGame(GameResult result)
		{
			//IL_006f: Unknown result type (might be due to invalid IL or missing references)
			foreach (PlayerControllerB activePlayer in Instance.activePlayers)
			{
				if ((Object)(object)activePlayer != (Object)null && !activePlayer.isPlayerDead)
				{
					if (NetworkManager.Singleton.IsServer)
					{
						activePlayer.AsHNSPlayer().SetUndisguised();
					}
					activePlayer.DropAllHeldItems(true, false);
					activePlayer.TeleportPlayer(StartOfRound.Instance.playerSpawnPositions[(uint)activePlayer.playerClientId].position, false, 0f, false, true);
				}
			}
			if (NetworkManager.Singleton.IsServer)
			{
				ShotgunItem[] array = Object.FindObjectsOfType<ShotgunItem>();
				ShotgunItem[] array2 = array;
				foreach (ShotgunItem val in array2)
				{
					((NetworkBehaviour)val).NetworkObject.Despawn(true);
				}
				Shovel[] array3 = Object.FindObjectsOfType<Shovel>();
				Shovel[] array4 = array3;
				foreach (Shovel val2 in array4)
				{
					((NetworkBehaviour)val2).NetworkObject.Despawn(true);
				}
				this.GameEnded?.Invoke();
			}
			if (ConfigProcessor.Config.UIShow)
			{
				Instance.ShowEndGameMessage(result);
				((Component)GameNetworkManager.Instance.localPlayerController).gameObject.GetComponent<CustomUI>().WaitUntilFadeThenDo(delegate
				{
					RoundCount++;
				}, 5);
			}
			else
			{
				RoundCount++;
			}
			hiders.Clear();
			shipLeavingTime = "";
		}

		public static void RefreshPlayerComps(ulong _, FastBufferReader __)
		{
			PlayerControllerB[] allPlayerScripts = StartOfRound.Instance.allPlayerScripts;
			foreach (PlayerControllerB val in allPlayerScripts)
			{
				if ((val.isPlayerControlled || val.isPlayerDead) && (Object)(object)val.AsHNSPlayer() == (Object)null)
				{
					((Component)val).gameObject.AddComponent<HNSPlayerComponent>();
					if (!Instance.activePlayers.Contains(val))
					{
						Instance.activePlayers.Add(val);
					}
				}
			}
		}

		public static void ShowRoles(ulong _, FastBufferReader __)
		{
			if (ConfigProcessor.Config.UIShow)
			{
				CustomUI component = ((Component)GameNetworkManager.Instance.localPlayerController).gameObject.GetComponent<CustomUI>();
				HNSPlayerComponent hNSPlayerComponent = GameNetworkManager.Instance.localPlayerController.AsHNSPlayer();
				component.ShowLocalMessage((hNSPlayerComponent.Role == PlayerRole.Seeker) ? "<color=red>You are a seeker.</color>" : "<color=white>You are a hider.</color>", 10);
			}
			Instance.gameState = GameState.InGame;
		}

		public static void GrabWeaponIfSeeker(ulong _, FastBufferReader reader)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			ulong key = default(ulong);
			((FastBufferReader)(ref reader)).ReadValueSafe<ulong>(ref key, default(ForPrimitives));
			NetworkObject val = NetworkManager.Singleton.SpawnManager.SpawnedObjects[key];
			GameObject gameObject = ((Component)val).gameObject;
			ModBase.mls.LogError((object)((Object)gameObject).name);
			PlayerControllerB localPlayerController = GameNetworkManager.Instance.localPlayerController;
			if (((Component)localPlayerController).gameObject.GetComponent<HNSPlayerComponent>().Role == PlayerRole.Seeker)
			{
				if (!HNSValues.FirstWeaponReceived)
				{
					((MonoBehaviour)GameNetworkManager.Instance).StartCoroutine(GrabWeapon(localPlayerController, val, gameObject, delay: false));
					HNSValues.FirstWeaponReceived = true;
				}
				else
				{
					((MonoBehaviour)GameNetworkManager.Instance).StartCoroutine(GrabWeapon(localPlayerController, val, gameObject, delay: true));
				}
			}
		}

		[IteratorStateMachine(typeof(<GrabWeapon>d__32))]
		private static IEnumerator GrabWeapon(PlayerControllerB player, NetworkObject nObject, GameObject weapon, bool delay)
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <GrabWeapon>d__32(0)
			{
				player = player,
				nObject = nObject,
				weapon = weapon,
				delay = delay
			};
		}

		public static void RecalcTime(ulong _, FastBufferReader __)
		{
			Instance.shipLeavingTime = Utils.CalcTime(TimeOfDay.Instance.normalizedTimeOfDay + 0.2f, TimeOfDay.Instance.numberOfHours);
		}
	}
	public enum PlayerRole
	{
		Hider,
		Seeker,
		None
	}
	public class HNSPlayerComponent : MonoBehaviour
	{
		public PlayerRole Role = PlayerRole.None;

		private float seekerChance = 0.5f;

		private GrabbableObject disguise;

		private Vector3 origRotationOffset;

		private Quaternion rotOffset;

		private bool disguiseLocked = false;

		private AudioSource disguiseTauntAudio;

		private List<AudioClip> disguiseAudios = new List<AudioClip>();

		public PlayerControllerB player;

		public float SeekerChance
		{
			get
			{
				return seekerChance;
			}
			set
			{
				seekerChance = value;
			}
		}

		public bool IsDisguised => (Object)(object)disguise != (Object)null;

		public bool DisguiseUnRotatable => disguiseLocked;

		public string DisguiseName => disguise.itemProperties.itemName;

		public GrabbableObject DisguiseObject => disguise;

		public bool DisguiseHasAudio => disguiseAudios.Count > 0;

		public void Awake()
		{
			player = ((Component)this).GetComponent<PlayerControllerB>();
			disguiseTauntAudio = ((Component)player).gameObject.AddComponent<AudioSource>();
			disguiseTauntAudio.maxDistance = 35f;
			disguiseTauntAudio.dopplerLevel = 0f;
			disguiseTauntAudio.priority = 129;
			disguiseTauntAudio.volume = 0.632f;
			disguiseTauntAudio.rolloffMode = (AudioRolloffMode)2;
			disguiseTauntAudio.velocityUpdateMode = (AudioVelocityUpdateMode)1;
			disguiseTauntAudio.spatialBlend = 1f;
			disguiseTauntAudio.spread = 25f;
			disguiseTauntAudio.playOnAwake = false;
			disguiseTauntAudio.outputAudioMixerGroup = player.itemAudio.outputAudioMixerGroup;
		}

		public void Update()
		{
			//IL_0030: 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_0050: Unknown result type (might be due to invalid IL or missing references)
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			//IL_006a: 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_0093: Unknown result type (might be due to invalid IL or missing references)
			//IL_0098: 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_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_00b6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d0: 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)
			if (!player.isPlayerDead && IsDisguised)
			{
				disguise.targetFloorPosition = ((Component)player).transform.position;
				((Component)disguise).transform.position = ((Component)player).transform.position + Vector3.up * disguise.itemProperties.verticalOffset;
				if (!disguiseLocked)
				{
					Quaternion rotation = ((Component)disguise).transform.rotation;
					Vector3 eulerAngles = ((Quaternion)(ref rotation)).eulerAngles;
					rotation = ((Component)player).transform.rotation;
					eulerAngles.y = ((Quaternion)(ref rotation)).eulerAngles.y;
					((Component)disguise).transform.rotation = Quaternion.Euler(eulerAngles);
				}
			}
		}

		public void SetDisguised(GrabbableObject disguise)
		{
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_0046: Unknown result type (might be due to invalid IL or missing references)
			//IL_004c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0098: Unknown result type (might be due to invalid IL or missing references)
			//IL_0073: Unknown result type (might be due to invalid IL or missing references)
			if (!IsDisguised)
			{
				FastBufferWriter val = default(FastBufferWriter);
				((FastBufferWriter)(ref val))..ctor(16, (Allocator)2, -1);
				((FastBufferWriter)(ref val)).WriteValueSafe<ulong>(ref player.playerClientId, default(ForPrimitives));
				ulong networkObjectId = ((NetworkBehaviour)disguise).NetworkObjectId;
				((FastBufferWriter)(ref val)).WriteValueSafe<ulong>(ref networkObjectId, default(ForPrimitives));
				if (NetworkManager.Singleton.IsServer)
				{
					NetworkManager.Singleton.CustomMessagingManager.SendNamedMessageToAll("Tibnan.hnsmod_DisguiseClient", val, (NetworkDelivery)2);
					SetPlayerDisguised(disguise);
				}
				else
				{
					NetworkManager.Singleton.CustomMessagingManager.SendNamedMessage("Tibnan.hnsmod_ServerDisguiseClient", 0uL, val, (NetworkDelivery)2);
				}
			}
		}

		private void SetPlayerDisguised(GrabbableObject disguise)
		{
			//IL_002e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0033: 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_005c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0067: 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_0072: 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_0083: 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_0089: Unknown result type (might be due to invalid IL or missing references)
			//IL_0090: Unknown result type (might be due to invalid IL or missing references)
			//IL_0095: 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_009b: Unknown result type (might be due to invalid IL or missing references)
			//IL_009c: Unknown result type (might be due to invalid IL or missing references)
			//IL_009d: Unknown result typ