Decompiled source of CoDZ Multiplayer v1.0.0

CoDZ_Multiplayer.dll

Decompiled 4 months ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Security;
using System.Security.Permissions;
using Atlas;
using Atlas.MappingComponents.Sandbox;
using BepInEx;
using BepInEx.Logging;
using CustomScripts;
using CustomScripts.Gamemode;
using CustomScripts.Gamemode.GMDebug;
using CustomScripts.Managers;
using CustomScripts.Multiplayer;
using CustomScripts.Objects;
using CustomScripts.Objects.Weapons;
using CustomScripts.Player;
using CustomScripts.Powerups;
using CustomScripts.Powerups.Perks;
using CustomScripts.Zombie;
using FistVR;
using H3MP;
using H3MP.Networking;
using H3MP.Scripts;
using HarmonyLib;
using OtherLoader;
using Sodalite.Api;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.UI;
using Valve.VR;

[assembly: AssemblyTitle("CustomScripts")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("CustomScripts")]
[assembly: AssemblyCopyright("Copyright ©  2021")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("7ac675fa-8ffe-4c1b-8787-a764e1845c24")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
namespace CustomScripts
{
	[RequireComponent(typeof(IPurchasable))]
	public class CanPurchaseTextChanger : MonoBehaviour
	{
		private IPurchasable _purchasable;

		private IRequiresPower _requiresPower;

		[SerializeField]
		private List<Text> _texts;

		private void Start()
		{
			_purchasable = ((Component)this).GetComponent<IPurchasable>();
			_requiresPower = ((Component)this).GetComponent<IRequiresPower>();
			GMgr.OnPointsChanged = (Action)Delegate.Combine(GMgr.OnPointsChanged, new Action(UpdateTexts));
			GMgr.OnPowerEnabled = (Action)Delegate.Combine(GMgr.OnPowerEnabled, new Action(UpdateTexts));
			UpdateTexts();
		}

		private void UpdateTexts()
		{
			//IL_004d: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e3: Unknown result type (might be due to invalid IL or missing references)
			//IL_015d: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c3: Unknown result type (might be due to invalid IL or missing references)
			if (_requiresPower != null && !_requiresPower.IsPowered)
			{
				for (int i = 0; i < _texts.Count; i++)
				{
					_texts[i].text = "No power";
					((Graphic)_texts[i]).color = MonoBehaviourSingleton<GameRefs>.Instance.CannotBuyColor;
				}
			}
			else if (_purchasable.IsOneTimeOnly && _purchasable.AlreadyBought)
			{
				for (int j = 0; j < _texts.Count; j++)
				{
					_texts[j].text = "Out of stock";
					((Graphic)_texts[j]).color = MonoBehaviourSingleton<GameRefs>.Instance.CannotBuyColor;
				}
			}
			else if (MonoBehaviourSingleton<GMgr>.Instance.Points >= _purchasable.PurchaseCost)
			{
				for (int k = 0; k < _texts.Count; k++)
				{
					Text obj = _texts[k];
					string text = _purchasable.PurchaseCost.ToString();
					_texts[k].text = text;
					obj.text = text;
					((Graphic)_texts[k]).color = MonoBehaviourSingleton<GameRefs>.Instance.CanBuyColor;
				}
			}
			else
			{
				for (int l = 0; l < _texts.Count; l++)
				{
					Text obj2 = _texts[l];
					string text = _purchasable.PurchaseCost.ToString();
					_texts[l].text = text;
					obj2.text = text;
					((Graphic)_texts[l]).color = MonoBehaviourSingleton<GameRefs>.Instance.CannotBuyColor;
				}
			}
		}

		private void OnDestroy()
		{
			GMgr.OnPointsChanged = (Action)Delegate.Remove(GMgr.OnPointsChanged, new Action(UpdateTexts));
			GMgr.OnPowerEnabled = (Action)Delegate.Remove(GMgr.OnPowerEnabled, new Action(UpdateTexts));
		}
	}
}
namespace CustomScripts.Gamemode.GMDebug
{
	public class CheatItemSpawner : MonoBehaviour
	{
		private void Awake()
		{
			RoundManager.OnGameStarted = (Action)Delegate.Combine(RoundManager.OnGameStarted, new Action(TrySpawning));
		}

		private void OnDrawGizmos()
		{
			//IL_0015: 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_005b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0060: Unknown result type (might be due to invalid IL or missing references)
			//IL_0061: Unknown result type (might be due to invalid IL or missing references)
			//IL_0062: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_0069: 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_0070: Unknown result type (might be due to invalid IL or missing references)
			//IL_0075: Unknown result type (might be due to invalid IL or missing references)
			Gizmos.color = new Color(0.4f, 0.4f, 0.9f, 0.5f);
			Gizmos.matrix = ((Component)this).transform.localToWorldMatrix;
			Vector3 val = default(Vector3);
			((Vector3)(ref val))..ctor(0f, 0.7f, 0.25f);
			Vector3 val2 = default(Vector3);
			((Vector3)(ref val2))..ctor(2.3f, 1.2f, 0.5f);
			Vector3 forward = Vector3.forward;
			Gizmos.DrawCube(val, val2);
			Gizmos.DrawLine(val, val + forward * 0.5f);
		}

		public void TrySpawning()
		{
			if (GameSettings.ItemSpawnerEnabled)
			{
				((MonoBehaviour)this).StartCoroutine(InitializeAsync());
			}
		}

		private IEnumerator InitializeAsync()
		{
			yield return null;
			GameObject itemSpawner = IM.Prefab_ItemSpawner;
			Object.Instantiate<GameObject>(itemSpawner, ((Component)this).transform.position, ((Component)this).transform.rotation).SetActive(true);
			Object.Destroy((Object)(object)this);
		}

		private void OnDestroy()
		{
			RoundManager.OnGameStarted = (Action)Delegate.Remove(RoundManager.OnGameStarted, new Action(TrySpawning));
		}
	}
}
namespace CustomScripts
{
	public static class Delegates
	{
		public delegate void VoidDelegate();
	}
	public static class Extensions
	{
		public static void Shuffle<T>(this IList<T> list)
		{
			Random random = new Random();
			int num = list.Count;
			while (num > 1)
			{
				num--;
				int index = random.Next(num + 1);
				T value = list[index];
				list[index] = list[num];
				list[num] = value;
			}
		}
	}
	public interface IModifier
	{
		void ApplyModifier();
	}
	public interface IPowerUp : IModifier
	{
		void Spawn(Vector3 pos);
	}
	public abstract class PowerUp : MonoBehaviour, IPowerUp, IModifier
	{
		public AudioClip ApplyAudio;

		public abstract void ApplyModifier();

		public abstract void OnCollect();

		public abstract void Spawn(Vector3 pos);

		public void SyncData()
		{
			if (!Networking.IsSolo())
			{
				int indexOf = MonoBehaviourSingleton<PowerUpManager>.Instance.GetIndexOf(this);
				if (Networking.IsHostOrSolo())
				{
					MonoBehaviourSingleton<CodZNetworking>.Instance.PowerUpCollected_Send(indexOf);
				}
				else
				{
					MonoBehaviourSingleton<CodZNetworking>.Instance.Client_PowerUpCollected_Send(indexOf);
				}
			}
		}
	}
	public interface IPurchasable
	{
		int PurchaseCost { get; }

		bool IsOneTimeOnly { get; }

		bool AlreadyBought { get; }
	}
	public interface IRequiresPower
	{
		bool IsPowered { get; }
	}
	public interface ITrap
	{
		void OnEnemyEntered(ZombieController controller);
	}
	public class MonoBehaviourSingleton<T> : MonoBehaviour where T : Component
	{
		public static T Instance { get; private set; }

		public virtual void Awake()
		{
			if ((Object)(object)Instance == (Object)null)
			{
				Instance = (T)(object)((this is T) ? this : null);
			}
			else
			{
				Object.Destroy((Object)(object)((Component)this).gameObject);
			}
		}
	}
	public class Speech : MonoBehaviour
	{
		public AudioClip RaygunRolled;

		public AudioClip T33Rolled;

		public AudioClip JuggernogConsumed;

		public AudioClip GettingHit;

		public AudioClip BeingRevived;

		public AudioClip BuyingStaminUp;

		public AudioClip DoublePointsPickedUp;

		public AudioClip UsingPackAPunch;

		public AudioClip Barricading;

		public AudioClip RoundEnd;

		public AudioClip StartingGame;

		public AudioClip SwitchingPower;

		private void Awake()
		{
			MysteryBox.WeaponSpawnedEvent = (Action<WeaponData>)Delegate.Combine(MysteryBox.WeaponSpawnedEvent, new Action<WeaponData>(OnWeaponSpawned));
			JuggerNogPerkBottle.ConsumedEvent = (Action)Delegate.Combine(JuggerNogPerkBottle.ConsumedEvent, new Action(OnJuggernogConsumed));
			StaminUpPerkBottle.ConsumedEvent = (Action)Delegate.Combine(StaminUpPerkBottle.ConsumedEvent, new Action(OnStaminUpConsumed));
			PlayerData.GettingHitEvent = (Action)Delegate.Combine(PlayerData.GettingHitEvent, new Action(OnGettingHit));
			PlayerSpawner.BeingRevivedEvent = (Action)Delegate.Combine(PlayerSpawner.BeingRevivedEvent, new Action(OnBeingRevived));
			PowerUpDoublePoints.PickedUpEvent = (Action)Delegate.Combine(PowerUpDoublePoints.PickedUpEvent, new Action(OnDoublePointsPickedUp));
			PackAPunch.PurchaseEvent = (Action)Delegate.Combine(PackAPunch.PurchaseEvent, new Action(OnPackAPunchPurchase));
			RoundManager.OnRoundChanged = (Action)Delegate.Combine(RoundManager.OnRoundChanged, new Action(OnRoundChanged));
			RoundManager.OnGameStarted = (Action)Delegate.Combine(RoundManager.OnGameStarted, new Action(OnGameStarted));
			GMgr.OnPowerEnabled = (Action)Delegate.Combine(GMgr.OnPowerEnabled, new Action(OnPowerTurnedOn));
		}

		private void Start()
		{
			Window.BarricadedEvent = (Action)Delegate.Combine(Window.BarricadedEvent, new Action(OnBarricading));
		}

		private void OnGameStarted()
		{
			if (Random.Range(0, 2000) == 0)
			{
				MonoBehaviourSingleton<AudioManager>.Instance.Play(StartingGame, 0.5f, 9f);
				RoundManager.OnGameStarted = (Action)Delegate.Remove(RoundManager.OnGameStarted, new Action(OnGameStarted));
			}
		}

		private void OnRoundChanged()
		{
			if (Random.Range(0, 2500) == 0)
			{
				MonoBehaviourSingleton<AudioManager>.Instance.Play(RoundEnd, 0.5f, 9f);
				RoundManager.OnRoundChanged = (Action)Delegate.Remove(RoundManager.OnRoundChanged, new Action(OnRoundChanged));
			}
		}

		private void OnBarricading()
		{
			if (Random.Range(0, 3000) == 0)
			{
				MonoBehaviourSingleton<AudioManager>.Instance.Play(Barricading, 0.5f, 1f);
				Window.BarricadedEvent = (Action)Delegate.Remove(Window.BarricadedEvent, new Action(OnBarricading));
			}
		}

		private void OnPackAPunchPurchase()
		{
			if (Random.Range(0, 1500) == 0)
			{
				MonoBehaviourSingleton<AudioManager>.Instance.Play(UsingPackAPunch, 0.5f, 1f);
				PackAPunch.PurchaseEvent = (Action)Delegate.Remove(PackAPunch.PurchaseEvent, new Action(OnPackAPunchPurchase));
			}
		}

		private void OnWeaponSpawned(WeaponData weapon)
		{
			if (Random.Range(0, 850) == 0)
			{
				if (weapon.Id == "aftr_raygunmk1")
				{
					MonoBehaviourSingleton<AudioManager>.Instance.Play(RaygunRolled, 0.5f);
					MysteryBox.WeaponSpawnedEvent = (Action<WeaponData>)Delegate.Remove(MysteryBox.WeaponSpawnedEvent, new Action<WeaponData>(OnWeaponSpawned));
				}
				if (weapon.Id == "TT33")
				{
					MonoBehaviourSingleton<AudioManager>.Instance.Play(T33Rolled, 0.5f);
					MysteryBox.WeaponSpawnedEvent = (Action<WeaponData>)Delegate.Remove(MysteryBox.WeaponSpawnedEvent, new Action<WeaponData>(OnWeaponSpawned));
				}
			}
		}

		private void OnJuggernogConsumed()
		{
			if (Random.Range(0, 1000) == 0)
			{
				MonoBehaviourSingleton<AudioManager>.Instance.Play(JuggernogConsumed, 0.5f, 3f);
				JuggerNogPerkBottle.ConsumedEvent = (Action)Delegate.Remove(JuggerNogPerkBottle.ConsumedEvent, new Action(OnJuggernogConsumed));
			}
		}

		private void OnStaminUpConsumed()
		{
			if (Random.Range(0, 1000) == 0)
			{
				MonoBehaviourSingleton<AudioManager>.Instance.Play(BuyingStaminUp, 0.5f, 3f);
				StaminUpPerkBottle.ConsumedEvent = (Action)Delegate.Remove(StaminUpPerkBottle.ConsumedEvent, new Action(OnStaminUpConsumed));
			}
		}

		private void OnGettingHit()
		{
			if (Random.Range(0, 2000) == 0)
			{
				MonoBehaviourSingleton<AudioManager>.Instance.Play(GettingHit, 0.5f, 1f);
				PlayerData.GettingHitEvent = (Action)Delegate.Remove(PlayerData.GettingHitEvent, new Action(OnGettingHit));
			}
		}

		private void OnBeingRevived()
		{
			if (Random.Range(0, 1000) == 0)
			{
				MonoBehaviourSingleton<AudioManager>.Instance.Play(BeingRevived, 0.5f, 1f);
				PlayerSpawner.BeingRevivedEvent = (Action)Delegate.Remove(PlayerSpawner.BeingRevivedEvent, new Action(OnBeingRevived));
			}
		}

		private void OnDoublePointsPickedUp()
		{
			if (Random.Range(0, 1500) == 0)
			{
				MonoBehaviourSingleton<AudioManager>.Instance.Play(DoublePointsPickedUp, 0.5f, 1.5f);
				PowerUpDoublePoints.PickedUpEvent = (Action)Delegate.Remove(PowerUpDoublePoints.PickedUpEvent, new Action(OnDoublePointsPickedUp));
			}
		}

		private void OnPowerTurnedOn()
		{
			if (Random.Range(0, 1000) == 0)
			{
				MonoBehaviourSingleton<AudioManager>.Instance.Play(SwitchingPower, 0.5f, 1.5f);
				GMgr.OnPowerEnabled = (Action)Delegate.Remove(GMgr.OnPowerEnabled, new Action(OnPowerTurnedOn));
			}
		}

		private void OnDestroy()
		{
			MysteryBox.WeaponSpawnedEvent = (Action<WeaponData>)Delegate.Remove(MysteryBox.WeaponSpawnedEvent, new Action<WeaponData>(OnWeaponSpawned));
			JuggerNogPerkBottle.ConsumedEvent = (Action)Delegate.Remove(JuggerNogPerkBottle.ConsumedEvent, new Action(OnJuggernogConsumed));
			StaminUpPerkBottle.ConsumedEvent = (Action)Delegate.Remove(StaminUpPerkBottle.ConsumedEvent, new Action(OnStaminUpConsumed));
			PlayerData.GettingHitEvent = (Action)Delegate.Remove(PlayerData.GettingHitEvent, new Action(OnGettingHit));
			PlayerSpawner.BeingRevivedEvent = (Action)Delegate.Remove(PlayerSpawner.BeingRevivedEvent, new Action(OnBeingRevived));
			PowerUpDoublePoints.PickedUpEvent = (Action)Delegate.Remove(PowerUpDoublePoints.PickedUpEvent, new Action(OnDoublePointsPickedUp));
			PackAPunch.PurchaseEvent = (Action)Delegate.Remove(PackAPunch.PurchaseEvent, new Action(OnPackAPunchPurchase));
			Window.BarricadedEvent = (Action)Delegate.Remove(Window.BarricadedEvent, new Action(OnBarricading));
			RoundManager.OnRoundChanged = (Action)Delegate.Remove(RoundManager.OnRoundChanged, new Action(OnRoundChanged));
			RoundManager.OnGameStarted = (Action)Delegate.Remove(RoundManager.OnGameStarted, new Action(OnGameStarted));
			GMgr.OnPowerEnabled = (Action)Delegate.Remove(GMgr.OnPowerEnabled, new Action(OnPowerTurnedOn));
		}
	}
	public class StartSpawner : MonoBehaviour
	{
		public ItemSpawner WeaponSpawner;

		public ItemSpawner AmmoSpawner;

		public void Spawn()
		{
			WeaponSpawner.SpawnItem();
			AmmoSpawner.SpawnItem();
		}
	}
}
namespace CustomScripts.Gamemode.GMDebug
{
	public class CustomItemSpawner : MonoBehaviour
	{
		public string ObjectId;

		[HideInInspector]
		public GameObject SpawnedObject;

		private void OnDrawGizmos()
		{
			//IL_0015: 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_002f: Unknown result type (might be due to invalid IL or missing references)
			Gizmos.color = new Color(0f, 0f, 0.6f, 0.5f);
			Gizmos.matrix = ((Component)this).transform.localToWorldMatrix;
			Gizmos.DrawSphere(Vector3.zero, 0.1f);
		}

		public GameObject Spawn()
		{
			//IL_0020: 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)
			FVRObject val = IM.OD[ObjectId];
			GameObject gameObject = ((AnvilAsset)val).GetGameObject();
			GameObject val2 = Object.Instantiate<GameObject>(gameObject, ((Component)this).transform.position, ((Component)this).transform.rotation);
			val2.SetActive(true);
			SpawnedObject = val2;
			return val2;
		}
	}
}
public class DisableOnAwake : MonoBehaviour
{
	private void Awake()
	{
		((Component)this).gameObject.SetActive(false);
	}
}
namespace CustomScripts.Gamemode.GMDebug
{
	public class ErrorShower : MonoBehaviourSingleton<ErrorShower>
	{
		public Text ErrorText;

		public void Show(string message)
		{
			ErrorText.text = message;
			((Component)ErrorText).gameObject.SetActive(true);
		}
	}
	public class CustomDebug : MonoBehaviour
	{
		public Transform Point;

		public PowerUpCarpenter Carpenter;

		public PowerUpInstaKill InstaKill;

		public PowerUpDeathMachine DeathMachine;

		public PowerUpMaxAmmo MaxAmmo;

		public PowerUpDoublePoints DoublePoints;

		public PowerUpNuke Nuke;

		public Blockade TrapBlockade;

		public ElectroTrap ElectroTrap;

		public Teleport TeleportToSecondArea;

		public Teleport TeleportToMainArea;

		public DeadShotPerkBottle DeadShotPerkBottle;

		public Text IFFText;

		public Text LayerText;

		private bool _forcingSpecialEnemy;

		public GameObject Prefab;

		private void Update()
		{
			//IL_003c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0042: Expected O, but got Unknown
			//IL_0044: 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)
			if (Input.GetKeyDown((KeyCode)97))
			{
				MonoBehaviourSingleton<RoundManager>.Instance.StartGame();
			}
			if (Input.GetKeyDown((KeyCode)98) && MonoBehaviourSingleton<ZombieManager>.Instance.ExistingZombies.Count > 0)
			{
				Damage val = new Damage();
				val.Class = (DamageClass)1;
				val.Dam_Piercing += 1f;
				val.Dam_TotalKinetic = 60000f;
				val.hitNormal = Vector3.back;
			}
			if (Input.GetKeyDown((KeyCode)100))
			{
				DeadShotPerkBottle.ApplyModifier();
			}
			if (Input.GetKeyDown((KeyCode)101))
			{
				((MonoBehaviour)this).StartCoroutine(MonoBehaviourSingleton<PlayerData>.Instance.ActivateStun());
			}
			if (Input.GetKeyDown((KeyCode)109))
			{
				MonoBehaviourSingleton<GMgr>.Instance.AddPoints(300);
			}
			if (Input.GetKeyDown((KeyCode)107))
			{
			}
			if (Input.GetKeyDown((KeyCode)108))
			{
				ElectroTrap.OnLeverPull();
			}
			if (Input.GetKeyDown((KeyCode)47))
			{
				MonoBehaviourSingleton<GMgr>.Instance.TurnOnPower();
			}
			if (Input.GetKeyDown((KeyCode)105))
			{
				Debug.Log((object)"I pressed");
				int index = Random.Range(0, GameRefs.Windows.Count);
				if (!GameRefs.Windows[index].IsBroken())
				{
					GameRefs.Windows[index].TearPlank();
				}
			}
			if (Input.GetKeyDown((KeyCode)111))
			{
				int index2 = Random.Range(0, GameRefs.Windows.Count);
				if (!GameRefs.Windows[index2].IsFullyRepaired())
				{
					GameRefs.Windows[index2].RepairWindow();
				}
			}
			if (Input.GetKeyDown((KeyCode)109))
			{
				SpawnTestObject();
			}
			IFFText.text = "IFF: " + GM.CurrentPlayerBody.GetPlayerIFF();
		}

		public void SpawnCarpenter()
		{
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			Carpenter.Spawn(Point.position);
		}

		public void SpawnInstaKill()
		{
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			InstaKill.Spawn(Point.position);
		}

		public void SpawnDeathMachine()
		{
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			DeathMachine.Spawn(Point.position);
		}

		public void SpawnMaxAmmo()
		{
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			MaxAmmo.Spawn(Point.position);
		}

		public void SpawnDoublePoints()
		{
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			DoublePoints.Spawn(Point.position);
		}

		public void SpawnNuke()
		{
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			Nuke.Spawn(Point.position);
		}

		public void KillRandom()
		{
			if (MonoBehaviourSingleton<ZombieManager>.Instance.ExistingZombies.Count > 0)
			{
				MonoBehaviourSingleton<ZombieManager>.Instance.ExistingZombies[0].OnHit(99999f);
			}
		}

		public void ToggleForceSpecialRound()
		{
			if (_forcingSpecialEnemy)
			{
				MonoBehaviourSingleton<RoundManager>.Instance.SpecialRoundInterval = 8;
				_forcingSpecialEnemy = false;
			}
			else
			{
				MonoBehaviourSingleton<RoundManager>.Instance.SpecialRoundInterval = 1;
				_forcingSpecialEnemy = true;
			}
		}

		public void SpawnTestObject()
		{
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			Object.Instantiate<GameObject>(Prefab, Point.position, Quaternion.identity);
		}
	}
}
namespace CustomScripts
{
	public class EndPanel : MonoBehaviourSingleton<EndPanel>
	{
		public Text KillsText;

		public Text RoundText;

		public void UpdatePanel()
		{
			KillsText.text = "Kills: " + MonoBehaviourSingleton<GMgr>.Instance.Kills;
			RoundText.text = "Rounds: " + MonoBehaviourSingleton<RoundManager>.Instance.RoundNumber;
		}
	}
	public class GameRefs : MonoBehaviourSingleton<GameRefs>
	{
		public Color CanBuyColor;

		public Color CannotBuyColor;

		[HideInInspector]
		public Transform Player;

		[SerializeField]
		private Transform DebugPlayer;

		[HideInInspector]
		public Transform PlayerHead;

		[SerializeField]
		private Transform DebugPlayerHead;

		private List<Window> _windows;

		private MysteryBox _mysteryBox;

		private MysteryBoxMover _mysteryBoxMover;

		private Radio _radio;

		private PackAPunch _packAPunch;

		public static List<Window> Windows => MonoBehaviourSingleton<GameRefs>.Instance._windows;

		public static MysteryBox MysteryBox => MonoBehaviourSingleton<GameRefs>.Instance._mysteryBox;

		public static MysteryBoxMover MysteryBoxMover => MonoBehaviourSingleton<GameRefs>.Instance._mysteryBoxMover;

		public static Radio Radio => MonoBehaviourSingleton<GameRefs>.Instance._radio;

		public static PackAPunch PackAPunch => MonoBehaviourSingleton<GameRefs>.Instance._packAPunch;

		public override void Awake()
		{
			base.Awake();
			Player = DebugPlayer;
			PlayerHead = DebugPlayerHead;
			_mysteryBox = Object.FindObjectOfType<MysteryBox>();
			_mysteryBoxMover = Object.FindObjectOfType<MysteryBoxMover>();
			_radio = Object.FindObjectOfType<Radio>();
			_packAPunch = Object.FindObjectOfType<PackAPunch>();
			_windows = Object.FindObjectsOfType<Window>().ToList();
		}

		private IEnumerator Start()
		{
			while ((Object)(object)GM.CurrentPlayerBody == (Object)null)
			{
				yield return null;
			}
			Player = ((Component)GM.CurrentPlayerBody).transform;
			PlayerHead = ((Component)GM.CurrentPlayerBody.Head).transform;
		}

		public bool IsPlayerClose(Transform pos, float dist)
		{
			//IL_0002: 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)
			return Vector3.Distance(pos.position, Player.position) <= dist;
		}
	}
	public class GameSettings : MonoBehaviourSingleton<GameSettings>
	{
		public static Action OnSettingsChanged;

		public static bool HardMode;

		public static bool SpecialRoundDisabled;

		public static bool ItemSpawnerEnabled;

		public static bool WeakerEnemiesEnabled;

		public static bool WonderWeaponEnabled;

		public Text OptionDescriptionText;

		private void Start()
		{
			OptionDescriptionText.text = "Call of Duty\nZOMBIES";
			if (Random.Range(0, 500) == 0)
			{
				switch (Random.Range(0, 7))
				{
				case 0:
					OptionDescriptionText.text = "You are my sunshine,\nMy only sunshine";
					break;
				case 1:
					OptionDescriptionText.text = "I missed you";
					break;
				case 2:
					OptionDescriptionText.text = "Play with me";
					break;
				case 3:
					OptionDescriptionText.text = "It's just a game, mostly";
					break;
				case 4:
					OptionDescriptionText.text = "I have granted kids to hell";
					break;
				case 5:
					OptionDescriptionText.text = "It's only partially your fault";
					break;
				}
			}
		}

		public void RestoreDefaultSettings()
		{
			HardMode = false;
			ItemSpawnerEnabled = false;
			SpecialRoundDisabled = false;
			WeakerEnemiesEnabled = false;
			WonderWeaponEnabled = false;
			OptionDescriptionText.text = "Default settings restored.";
			if (OnSettingsChanged != null)
			{
				OnSettingsChanged();
			}
		}

		public void DifficultyNormalClicked()
		{
			HardMode = false;
			if (OnSettingsChanged != null)
			{
				OnSettingsChanged();
			}
			OptionDescriptionText.text = "Normal mode: Normal Enemy speed, HP and numbers.";
		}

		public void DifficultyHardClicked()
		{
			HardMode = true;
			if (OnSettingsChanged != null)
			{
				OnSettingsChanged();
			}
			OptionDescriptionText.text = "Hard mode: Increased Enemy speed, HP and numbers.";
		}

		public void EnableSpecialRoundClicked()
		{
			SpecialRoundDisabled = false;
			if (OnSettingsChanged != null)
			{
				OnSettingsChanged();
			}
			OptionDescriptionText.text = "Special round inspired by Hellhounds, occurs every 8 rounds.";
		}

		public void DisableSpecialRoundClicked()
		{
			SpecialRoundDisabled = true;
			if (OnSettingsChanged != null)
			{
				OnSettingsChanged();
			}
			OptionDescriptionText.text = "Special round disabled.";
		}

		public void EnableItemSpawnerClicked()
		{
			ItemSpawnerEnabled = true;
			if (OnSettingsChanged != null)
			{
				OnSettingsChanged();
			}
			OptionDescriptionText.text = "Item Spawner will appear at the starting location. Scoring will be disabled for that game.";
		}

		public void DisableItemSpawnerClicked()
		{
			ItemSpawnerEnabled = false;
			if (OnSettingsChanged != null)
			{
				OnSettingsChanged();
			}
			OptionDescriptionText.text = "No Item Spawner. Scoring enabled";
		}

		public void EnableWeakerEnemiesClicked()
		{
			WeakerEnemiesEnabled = true;
			if (OnSettingsChanged != null)
			{
				OnSettingsChanged();
			}
			OptionDescriptionText.text = "Enemies have reduced HP";
		}

		public void DisableWeakerEnemiesClicked()
		{
			WeakerEnemiesEnabled = false;
			if (OnSettingsChanged != null)
			{
				OnSettingsChanged();
			}
			OptionDescriptionText.text = "Enemies have normal HP";
		}

		public void EnableWonderWeaponsClicked()
		{
			WonderWeaponEnabled = true;
			if (OnSettingsChanged != null)
			{
				OnSettingsChanged();
			}
			OptionDescriptionText.text = "Wonder weapons might spawn in MysteryBox. If playing Multiplayer, check first in other scenes if modded weapons work correctly for both players.";
		}

		public void DisableWonderWeaponsClicked()
		{
			WonderWeaponEnabled = false;
			if (OnSettingsChanged != null)
			{
				OnSettingsChanged();
			}
			OptionDescriptionText.text = "Wonder weapons will not spawn in MysteryBox";
		}

		public void ToggleBackgroundMusic()
		{
			if (OnSettingsChanged != null)
			{
				OnSettingsChanged();
			}
		}
	}
	public class GameSettingsPanel : MonoBehaviour
	{
		public Text DifficultyNormalText;

		public Text DifficultyHardText;

		public Text SpecialRoundEnabledText;

		public Text SpecialRoundDisabledText;

		public Text ItemSpawnerEnabledText;

		public Text ItemSpawnerDisabledText;

		public Text WeakerZombiesEnabledText;

		public Text WeakerZombiesDisabledText;

		public Text WonderWeaponsEnabledText;

		public Text WonderWeaponsDisabledText;

		public Color EnabledColor;

		public Color DisabledColor;

		private void Awake()
		{
			GameSettings.OnSettingsChanged = (Action)Delegate.Combine(GameSettings.OnSettingsChanged, new Action(UpdateText));
		}

		private void Start()
		{
			UpdateText();
		}

		private void OnDestroy()
		{
			GameSettings.OnSettingsChanged = (Action)Delegate.Remove(GameSettings.OnSettingsChanged, new Action(UpdateText));
		}

		private void UpdateText()
		{
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_0069: Unknown result type (might be due to invalid IL or missing references)
			//IL_005e: Unknown result type (might be due to invalid IL or missing references)
			//IL_008f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0084: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
			//IL_00db: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d0: Unknown result type (might be due to invalid IL or missing references)
			//IL_0101: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f6: Unknown result type (might be due to invalid IL or missing references)
			//IL_0127: Unknown result type (might be due to invalid IL or missing references)
			//IL_011c: Unknown result type (might be due to invalid IL or missing references)
			//IL_014d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0142: Unknown result type (might be due to invalid IL or missing references)
			//IL_0173: Unknown result type (might be due to invalid IL or missing references)
			//IL_0168: Unknown result type (might be due to invalid IL or missing references)
			((Graphic)DifficultyNormalText).color = ((!GameSettings.HardMode) ? EnabledColor : DisabledColor);
			((Graphic)DifficultyHardText).color = ((!GameSettings.HardMode) ? DisabledColor : EnabledColor);
			((Graphic)SpecialRoundEnabledText).color = ((!GameSettings.SpecialRoundDisabled) ? EnabledColor : DisabledColor);
			((Graphic)SpecialRoundDisabledText).color = ((!GameSettings.SpecialRoundDisabled) ? DisabledColor : EnabledColor);
			((Graphic)ItemSpawnerEnabledText).color = ((!GameSettings.ItemSpawnerEnabled) ? DisabledColor : EnabledColor);
			((Graphic)ItemSpawnerDisabledText).color = ((!GameSettings.ItemSpawnerEnabled) ? EnabledColor : DisabledColor);
			((Graphic)WeakerZombiesEnabledText).color = ((!GameSettings.WeakerEnemiesEnabled) ? DisabledColor : EnabledColor);
			((Graphic)WeakerZombiesDisabledText).color = ((!GameSettings.WeakerEnemiesEnabled) ? EnabledColor : DisabledColor);
			((Graphic)WonderWeaponsEnabledText).color = ((!GameSettings.WonderWeaponEnabled) ? DisabledColor : EnabledColor);
			((Graphic)WonderWeaponsDisabledText).color = ((!GameSettings.WonderWeaponEnabled) ? EnabledColor : DisabledColor);
		}
	}
	public class GameStart : MonoBehaviourSingleton<GameStart>
	{
		private void OnDrawGizmos()
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			Gizmos.color = Color.red;
			Gizmos.DrawSphere(((Component)this).transform.position, 0.5f);
		}
	}
	public class LeverWrapper : MonoBehaviour
	{
		public UnityEvent LeverToggleEvent;

		public UnityEvent LeverOnEvent;

		public UnityEvent LeverOffEvent;

		public UnityEvent LeverHoldStartEvent;

		public UnityEvent LeverHoldEndEvent;

		private TrapLever _lever;

		private bool _isOn;

		private bool _isHeld;

		private void Awake()
		{
			_lever = ((Component)this).GetComponent<TrapLever>();
			_lever.MessageTargets.Add(((Component)this).gameObject);
		}

		private void Update()
		{
			if (!_isHeld && ((FVRInteractiveObject)_lever).IsHeld)
			{
				OnHoldStart();
			}
			else if (_isHeld && !((FVRInteractiveObject)_lever).IsHeld)
			{
				OnHoldEnd();
			}
		}

		private void OnHoldStart()
		{
			_isHeld = true;
			if (LeverHoldStartEvent != null)
			{
				LeverHoldStartEvent.Invoke();
			}
		}

		private void OnHoldEnd()
		{
			_isHeld = false;
			if (LeverHoldEndEvent != null)
			{
				LeverHoldEndEvent.Invoke();
			}
		}

		public void ON()
		{
			if (!_isOn)
			{
				_isOn = true;
				if (LeverToggleEvent != null)
				{
					LeverToggleEvent.Invoke();
				}
				if (LeverOnEvent != null)
				{
					LeverOnEvent.Invoke();
				}
			}
		}

		public void OFF()
		{
			if (_isOn)
			{
				_isOn = false;
				if (LeverToggleEvent != null)
				{
					LeverToggleEvent.Invoke();
				}
				if (LeverOffEvent != null)
				{
					LeverOffEvent.Invoke();
				}
			}
		}
	}
}
namespace CustomScripts.Gamemode
{
	public class PointsView : MonoBehaviour
	{
		public Text PointsText;

		private void Awake()
		{
			GMgr.OnPointsChanged = (Action)Delegate.Combine(GMgr.OnPointsChanged, new Action(OnPointsChanged));
		}

		private void Start()
		{
			OnPointsChanged();
		}

		private void OnDestroy()
		{
			GMgr.OnPointsChanged = (Action)Delegate.Remove(GMgr.OnPointsChanged, new Action(OnPointsChanged));
		}

		private void OnPointsChanged()
		{
			PointsText.text = "Points: " + MonoBehaviourSingleton<GMgr>.Instance.Points;
		}
	}
	public class RoundView : MonoBehaviour
	{
		public Text RoundText;

		private void Awake()
		{
			RoundManager.OnRoundChanged = (Action)Delegate.Remove(RoundManager.OnRoundChanged, new Action(UpdateRoundText));
			RoundManager.OnRoundChanged = (Action)Delegate.Combine(RoundManager.OnRoundChanged, new Action(UpdateRoundText));
		}

		private void Start()
		{
			UpdateRoundText();
		}

		private void OnDestroy()
		{
			RoundManager.OnRoundChanged = (Action)Delegate.Remove(RoundManager.OnRoundChanged, new Action(UpdateRoundText));
		}

		private void UpdateRoundText()
		{
			RoundText.text = "Round: " + MonoBehaviourSingleton<RoundManager>.Instance.RoundNumber;
		}
	}
}
public class Location : MonoBehaviour
{
	public List<Transform> ZombieSpawnPoints;

	public List<Transform> SpecialZombieSpawnPoints;

	private void Start()
	{
		if (ZombieSpawnPoints.Count == 0)
		{
			Debug.LogError((object)"ZombieSpawnPoints is empty, zombies don't have a place to spawn");
		}
		if (SpecialZombieSpawnPoints.Count == 0)
		{
			Debug.LogError((object)"SpecialZombieSpawnPoints is empty, special zombies don't have a place to spawn");
		}
	}
}
namespace CustomScripts.Gamemode
{
	public class MagazineWrapper : MonoBehaviour
	{
		private FVRFireArmMagazine _magazine;

		private FVRFireArmClip _clip;

		private Speedloader _speedloader;

		public FireArmRoundClass RoundClass;

		public void Initialize(FVRFireArmMagazine magazine)
		{
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			_magazine = magazine;
			RoundClass = magazine.DefaultLoadingPattern.Classes[0];
		}

		public void InitialzieWithAmmo(FVRFireArmMagazine magazine, FireArmRoundClass roundClass)
		{
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			_magazine = magazine;
			RoundClass = roundClass;
		}

		public void InitialzieWithAmmo(FVRFireArmClip clip, FireArmRoundClass roundClass)
		{
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			_clip = clip;
			RoundClass = roundClass;
		}

		public void InitialzieWithAmmo(Speedloader speedloader, FireArmRoundClass roundClass)
		{
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			_speedloader = speedloader;
			RoundClass = roundClass;
		}
	}
}
namespace CustomScripts
{
	public class GMgr : MonoBehaviourSingleton<GMgr>
	{
		public static Action OnPointsChanged;

		public static Action OnPowerEnabled;

		[HideInInspector]
		public List<Blockade> Blockades;

		[HideInInspector]
		public int Points;

		[HideInInspector]
		public int TotalPoints;

		[HideInInspector]
		public bool GameStarted = false;

		[HideInInspector]
		public bool GameEnded = false;

		public bool PowerEnabled;

		public Transform PowerSwitchLever;

		[HideInInspector]
		public int Kills;

		private Harmony _harmony;

		public override void Awake()
		{
			base.Awake();
			_harmony = Harmony.CreateAndPatchAll(typeof(PlayerData), (string)null);
			_harmony.PatchAll(typeof(PlayerSpawner));
			_harmony.PatchAll(typeof(ZombieManager));
		}

		public void PowerLeverPulled()
		{
			if (Networking.IsSolo())
			{
				TurnOnPower();
			}
			else if (Networking.IsHost())
			{
				MonoBehaviourSingleton<CodZNetworking>.Instance.CustomData_Send(3);
			}
			else
			{
				MonoBehaviourSingleton<CodZNetworking>.Instance.Client_CustomData_Send(3);
			}
		}

		public void TurnOnPower()
		{
			//IL_0069: Unknown result type (might be due to invalid IL or missing references)
			Debug.Log((object)"Turning on power");
			if (!PowerEnabled)
			{
				PowerEnabled = true;
				MonoBehaviourSingleton<AudioManager>.Instance.Play(MonoBehaviourSingleton<AudioManager>.Instance.PowerOnSound, 0.4f);
				if (OnPowerEnabled != null)
				{
					OnPowerEnabled();
				}
				PowerSwitchLever.localEulerAngles = new Vector3(0f, 45f, 0f);
			}
		}

		public void AddPoints(int amount)
		{
			float num = (float)amount * MonoBehaviourSingleton<PlayerData>.Instance.MoneyModifier;
			MonoBehaviourSingleton<PlayerData>.Instance.MoneyModifier.ToString();
			amount = (int)num;
			Points += amount;
			TotalPoints += amount;
			if (OnPointsChanged != null)
			{
				OnPointsChanged();
			}
		}

		public bool TryRemovePoints(int amount)
		{
			if (Points >= amount)
			{
				Points -= amount;
				if (OnPointsChanged != null)
				{
					OnPointsChanged();
				}
				return true;
			}
			return false;
		}

		public void RemovePoints(int amount)
		{
			Points -= amount;
			if (OnPointsChanged != null)
			{
				OnPointsChanged();
			}
		}

		public void KillPlayer()
		{
			if (!GameEnded)
			{
				GM.CurrentPlayerBody.KillPlayer(false);
			}
		}

		public void EndGame()
		{
			if (GameEnded)
			{
				return;
			}
			GameEnded = true;
			MonoBehaviourSingleton<AudioManager>.Instance.PlayMusic(MonoBehaviourSingleton<AudioManager>.Instance.EndMusic, 0.25f, 1f);
			MonoBehaviourSingleton<EndPanel>.Instance.UpdatePanel();
			if (Networking.IsHostOrSolo())
			{
				for (int num = MonoBehaviourSingleton<ZombieManager>.Instance.ExistingZombies.Count - 1; num >= 0; num--)
				{
					MonoBehaviourSingleton<ZombieManager>.Instance.ExistingZombies[num].OnHit(9999f);
				}
			}
		}

		private void OnDestroy()
		{
			_harmony.UnpatchSelf();
		}
	}
	public class PowerUpManager : MonoBehaviourSingleton<PowerUpManager>
	{
		public float ChanceForAmmo = 2.5f;

		public float ChanceForPowerUp = 6f;

		public float AmmoCooldownTime;

		public float PowerUpCooldownTime;

		public PowerUpMaxAmmo MaxAmmo;

		public List<PowerUp> PowerUps;

		private readonly List<int> _randomIndexes = new List<int>();

		private bool _isPowerUpCooldown;

		private bool _isMaxAmmoCooldown;

		public int GetIndexOf(PowerUp powerUp)
		{
			return PowerUps.IndexOf(powerUp);
		}

		private void Start()
		{
			if (Networking.IsHostOrSolo())
			{
				RoundManager.OnZombieKilled = (Action<GameObject>)Delegate.Remove(RoundManager.OnZombieKilled, new Action<GameObject>(RollForPowerUp));
				RoundManager.OnZombieKilled = (Action<GameObject>)Delegate.Combine(RoundManager.OnZombieKilled, new Action<GameObject>(RollForPowerUp));
				ShuffleIndexes();
			}
		}

		private void OnDestroy()
		{
			RoundManager.OnZombieKilled = (Action<GameObject>)Delegate.Remove(RoundManager.OnZombieKilled, new Action<GameObject>(RollForPowerUp));
		}

		public void RollForPowerUp(GameObject spawnPos)
		{
			//IL_007b: 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)
			if ((Networking.ServerRunning() && Networking.IsClient()) || _isPowerUpCooldown)
			{
				return;
			}
			float num = Random.Range(0f, 100f);
			if (num < ChanceForPowerUp)
			{
				if (_randomIndexes.Count == 0)
				{
					ShuffleIndexes();
				}
				SpawnPowerUp(PowerUps[_randomIndexes[0]], spawnPos.transform.position);
				MonoBehaviourSingleton<CodZNetworking>.Instance.PowerUpSpawned_Send(_randomIndexes[0], spawnPos.transform.position);
				_randomIndexes.RemoveAt(0);
			}
		}

		private void ShuffleIndexes()
		{
			_randomIndexes.Clear();
			for (int i = 0; i < PowerUps.Count; i++)
			{
				_randomIndexes.Add(i);
			}
			_randomIndexes.Shuffle();
		}

		public void SpawnPowerUp(PowerUp powerUp, Vector3 pos)
		{
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)powerUp == (Object)null)
			{
				Debug.LogWarning((object)"PowerUp spawn failed! PowerUp == null");
				return;
			}
			((MonoBehaviour)this).StartCoroutine(PowerUpCooldown());
			powerUp.Spawn(pos + Vector3.up);
		}

		private IEnumerator PowerUpCooldown()
		{
			_isPowerUpCooldown = true;
			yield return (object)new WaitForSeconds(PowerUpCooldownTime);
			_isPowerUpCooldown = false;
		}
	}
	public class RoundManager : MonoBehaviourSingleton<RoundManager>
	{
		public static Action RoundStarted;

		public static Action RoundEnded;

		public static Action OnRoundChanged;

		public static Action OnZombiesLeftChanged;

		public static Action<GameObject> OnZombieKilled;

		public static Action OnGameStarted;

		public int SpecialRoundInterval;

		[HideInInspector]
		public int RoundNumber = 0;

		private Coroutine _roundDelayCoroutine;

		public bool IsRoundSpecial
		{
			get
			{
				if (GameSettings.SpecialRoundDisabled)
				{
					return false;
				}
				return RoundNumber % SpecialRoundInterval == 0;
			}
		}

		public void SendStartGame()
		{
			StartGame();
			MonoBehaviourSingleton<CodZNetworking>.Instance.StartGame_Send();
		}

		public void StartGame()
		{
			if (!Application.isEditor)
			{
				MonoBehaviourSingleton<PlayerSpawner>.Instance.SpawnPlayer();
			}
			MonoBehaviourSingleton<GMgr>.Instance.GameStarted = true;
			RoundNumber = 0;
			if (OnGameStarted != null)
			{
				OnGameStarted();
			}
			AdvanceRound();
		}

		public void AdvanceRound()
		{
			if (!MonoBehaviourSingleton<GMgr>.Instance.GameEnded)
			{
				RoundNumber++;
				MonoBehaviourSingleton<ZombieManager>.Instance.BeginSpawningEnemies();
				if (OnZombiesLeftChanged != null)
				{
					OnZombiesLeftChanged();
				}
				if (OnRoundChanged != null)
				{
					OnRoundChanged();
				}
			}
		}

		public void EndRound()
		{
			MonoBehaviourSingleton<AudioManager>.Instance.Play(MonoBehaviourSingleton<AudioManager>.Instance.RoundEndSound, 0.2f, 1f);
			if (RoundEnded != null)
			{
				RoundEnded();
			}
			_roundDelayCoroutine = ((MonoBehaviour)this).StartCoroutine(DelayedAdvanceRound(17f));
		}

		private IEnumerator DelayedAdvanceRound(float delay)
		{
			yield return (object)new WaitForSeconds(delay);
			AdvanceRound();
			if (RoundStarted != null)
			{
				RoundStarted();
			}
		}

		public void PauseGame()
		{
			((MonoBehaviour)this).StopCoroutine(_roundDelayCoroutine);
		}

		public void ResumeGame()
		{
			_roundDelayCoroutine = ((MonoBehaviour)this).StartCoroutine(DelayedAdvanceRound(0f));
		}
	}
	public class AudioManager : MonoBehaviourSingleton<AudioManager>
	{
		public AudioSource MainAudioSource;

		public AudioSource MusicAudioSource;

		[Space(20f)]
		public AudioClip BuySound;

		public AudioClip DrinkSound;

		public AudioClip HellHoundSpawnSound;

		public AudioClip HellHoundDeathSound;

		public AudioClip RoundStartSound;

		public AudioClip RoundEndSound;

		public AudioClip HellHoundRoundStartSound;

		public AudioClip PowerOnSound;

		public AudioClip EndMusic;

		public AudioClip TeleportingSound;

		public AudioClip PlayerHitSound;

		public AudioClip BarricadeRepairSound;

		private Coroutine _musicRepetition;

		public void Play(AudioClip audioClip, float volume = 1f, float delay = 0f)
		{
			if (delay != 0f)
			{
				((MonoBehaviour)this).StartCoroutine(PlayDelayed(audioClip, volume, delay));
			}
			else
			{
				MainAudioSource.PlayOneShot(audioClip, volume);
			}
		}

		private IEnumerator PlayDelayed(AudioClip audioClip, float volume, float delay)
		{
			yield return (object)new WaitForSeconds(delay);
			MainAudioSource.PlayOneShot(audioClip, volume);
		}

		public void PlayMusic(AudioClip audioClip, float volume = 1f, float delay = 0f)
		{
			MusicAudioSource.clip = audioClip;
			MusicAudioSource.volume = volume;
			MusicAudioSource.PlayDelayed(delay);
		}
	}
}
namespace CustomScripts.Managers.Sound
{
	public class MusicManager : MonoBehaviourSingleton<MusicManager>
	{
	}
}
namespace CustomScripts.Managers
{
	public class ZombieManager : MonoBehaviourSingleton<ZombieManager>
	{
		public static Action LocationChangedEvent;

		public Location CurrentLocation;

		public AnimationCurve ZombieCountCurve;

		public AnimationCurve ZosigHPCurve;

		public AnimationCurve ZosigLinkIntegrityCurve;

		public AnimationCurve ZosigPerRoundSpeed;

		public int PointsOnHit = 10;

		public int PointsOnKill = 100;

		[HideInInspector]
		public List<ZombieController> ExistingZombies;

		public ParticleSystem HellhoundExplosionPS;

		public int ExtraZombiesPerPlayer = 3;

		public int BaseZombieLimit = 20;

		[HideInInspector]
		public int ZombiesRemaining;

		private Coroutine _spawningCoroutine;

		public int ExistingZombieLimit
		{
			get
			{
				if (Networking.IsSolo())
				{
					return BaseZombieLimit;
				}
				return BaseZombieLimit + ExtraZombiesPerPlayer * (MonoBehaviourSingleton<PlayersMgr>.Instance.Players.Count - 1);
			}
		}

		private int ZombiesToSpawnThisRound
		{
			get
			{
				int num = ((!Networking.IsSolo()) ? (ExtraZombiesPerPlayer * (MonoBehaviourSingleton<PlayersMgr>.Instance.Players.Count - 1)) : 0);
				if (GameSettings.HardMode)
				{
					return Mathf.CeilToInt(ZombieCountCurve.Evaluate((float)MonoBehaviourSingleton<RoundManager>.Instance.RoundNumber) + 1f + (float)num);
				}
				return Mathf.CeilToInt(ZombieCountCurve.Evaluate((float)MonoBehaviourSingleton<RoundManager>.Instance.RoundNumber) + (float)num);
			}
		}

		public void BeginSpawningEnemies()
		{
			ZombiesRemaining = ZombiesToSpawnThisRound;
			if (MonoBehaviourSingleton<RoundManager>.Instance.IsRoundSpecial)
			{
				StartSpawningZombies(6f);
				MonoBehaviourSingleton<AudioManager>.Instance.Play(MonoBehaviourSingleton<AudioManager>.Instance.HellHoundRoundStartSound, 0.35f);
			}
			else
			{
				StartSpawningZombies(2f);
				MonoBehaviourSingleton<AudioManager>.Instance.Play(MonoBehaviourSingleton<AudioManager>.Instance.RoundStartSound, 0.2f, 1f);
			}
		}

		public void StartSpawningZombies(float initialDelay)
		{
			_spawningCoroutine = ((MonoBehaviour)this).StartCoroutine(DelayedZombieSpawn(initialDelay));
		}

		private IEnumerator DelayedZombieSpawn(float delay)
		{
			yield return (object)new WaitForSeconds(delay);
			while (ZombiesRemaining > ExistingZombies.Count)
			{
				if (ExistingZombies.Count >= ExistingZombieLimit || ExistingZombies.Count >= ZombiesRemaining)
				{
					yield return (object)new WaitForSeconds(4f);
					continue;
				}
				SpawnZosig();
				if (!GameSettings.HardMode || MonoBehaviourSingleton<RoundManager>.Instance.IsRoundSpecial)
				{
					yield return (object)new WaitForSeconds(3f);
				}
				else
				{
					yield return (object)new WaitForSeconds(2f);
				}
			}
		}

		public void SpawnZosig()
		{
			if (MonoBehaviourSingleton<RoundManager>.Instance.IsRoundSpecial)
			{
				CustomSosigSpawnPoint component = ((Component)CurrentLocation.SpecialZombieSpawnPoints[Random.Range(0, CurrentLocation.SpecialZombieSpawnPoints.Count)]).GetComponent<CustomSosigSpawnPoint>();
				component.Spawn();
			}
			else
			{
				CustomSosigSpawnPoint component2 = ((Component)CurrentLocation.ZombieSpawnPoints[Random.Range(0, CurrentLocation.ZombieSpawnPoints.Count)]).GetComponent<CustomSosigSpawnPoint>();
				component2.Spawn();
			}
		}

		[HarmonyPatch(typeof(Sosig), "Start")]
		[HarmonyPostfix]
		private static void OnSosigSpawned(Sosig __instance)
		{
			MonoBehaviourSingleton<ZombieManager>.Instance.OnZosigSpawned(__instance);
		}

		public void OnZosigSpawned(Sosig zosig)
		{
			ZombieController zombieController = ((Component)zosig).gameObject.AddComponent<ZosigZombieController>();
			zombieController.Initialize();
			ExistingZombies.Add(zombieController);
			if (MonoBehaviourSingleton<RoundManager>.Instance.IsRoundSpecial)
			{
				zombieController.InitializeSpecialType();
			}
		}

		public void ChangeLocation(Location newLocation)
		{
			if (_spawningCoroutine != null)
			{
				((MonoBehaviour)this).StopCoroutine(_spawningCoroutine);
			}
			CurrentLocation = newLocation;
			for (int num = ExistingZombies.Count - 1; num >= 0; num--)
			{
				ExistingZombies[num].OnKill(awardPoints: false);
			}
			StartSpawningZombies(5f);
			if (LocationChangedEvent != null)
			{
				LocationChangedEvent();
			}
		}

		public void ForceKillZosig(Sosig sosig)
		{
			sosig.DeSpawnSosig();
		}

		public void OnZombieDied(ZombieController controller)
		{
			ExistingZombies.Remove(controller);
			ZombiesRemaining--;
			if (!MonoBehaviourSingleton<GMgr>.Instance.GameEnded)
			{
				if (ZombiesRemaining <= 0)
				{
					MonoBehaviourSingleton<RoundManager>.Instance.EndRound();
				}
				if (RoundManager.OnZombiesLeftChanged != null)
				{
					RoundManager.OnZombiesLeftChanged();
				}
				if (RoundManager.OnZombieKilled != null)
				{
					RoundManager.OnZombieKilled(((Component)controller).gameObject);
				}
			}
		}

		[HarmonyPatch(typeof(Sosig), "SosigDies")]
		[HarmonyPostfix]
		private static void OnSosigDied(Sosig __instance, DamageClass damClass, SosigDeathType deathType)
		{
			((Component)__instance).GetComponent<ZosigZombieController>().OnKill();
		}

		[HarmonyPatch(typeof(Sosig), "ProcessDamage", new Type[]
		{
			typeof(Damage),
			typeof(SosigLink)
		})]
		[HarmonyPrefix]
		private static void BeforeZombieHit(Damage d, SosigLink link)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Invalid comparison between Unknown and I4
			if ((int)d.Class == 3 && d.Source_IFF != GM.CurrentSceneSettings.DefaultPlayerIFF)
			{
				d.Dam_Blinding = 0f;
				d.Dam_TotalKinetic = 0f;
				d.Dam_TotalEnergetic = 0f;
				d.Dam_Blunt = 0f;
				d.Dam_Chilling = 0f;
				d.Dam_Cutting = 0f;
				d.Dam_Thermal = 0f;
				d.Dam_EMP = 0f;
				d.Dam_Piercing = 0f;
				d.Dam_Stunning = 0f;
			}
			d.Dam_Stunning = 0f;
		}

		[HarmonyPatch(typeof(Sosig), "ProcessDamage", new Type[]
		{
			typeof(Damage),
			typeof(SosigLink)
		})]
		[HarmonyPostfix]
		private static void AfterZombieHit(Sosig __instance, Damage d, SosigLink link)
		{
			((Component)__instance).GetComponent<ZosigZombieController>().OnHit(__instance, d);
		}
	}
}
namespace CustomScripts.Multiplayer
{
	public class CodZNetworking : MonoBehaviourSingleton<CodZNetworking>
	{
		private int gameStarted_ID = -1;

		private int mysteryBoxMoved_ID = -1;

		private int blockadeCleared_ID = -1;

		private int blockadeCleared_Client_ID = -1;

		private int powerUpSpawned_ID = -1;

		private int powerUpCollected_ID = -1;

		private int powerUpCollected_Client_ID = -1;

		private int papPurchased_ID = -1;

		private int papPurchased_Client_ID = -1;

		private int windowStateChanged_ID = -1;

		private int windowStateChanged_Client_ID = -1;

		private int customData_ID = -1;

		private int customData_Client_ID = -1;

		private int customData_playerID_ID = -1;

		private int customData_playerID_Client_ID = -1;

		private IEnumerator Start()
		{
			yield return null;
			StartNetworking();
		}

		private void StartNetworking()
		{
			Mod.customPacketHandlers = (CustomPacketHandler[])(object)new CustomPacketHandler[20];
			if (Networking.ServerRunning())
			{
				SetupPacketTypes();
				GM.CurrentPlayerBody.SetPlayerIFF(GameManager.ID + 5);
			}
		}

		private void SetupPacketTypes()
		{
			//IL_000e: 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_002a: Expected O, but got Unknown
			//IL_002a: Expected O, but got Unknown
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			//IL_0053: Expected O, but got Unknown
			//IL_0053: Expected O, but got Unknown
			//IL_0060: 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_007c: Expected O, but got Unknown
			//IL_007c: Expected O, but got Unknown
			//IL_0089: 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_00a5: Expected O, but got Unknown
			//IL_00a5: Expected O, but got Unknown
			//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00be: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ce: Expected O, but got Unknown
			//IL_00ce: Expected O, but got Unknown
			//IL_00db: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f7: Expected O, but got Unknown
			//IL_00f7: Expected O, but got Unknown
			//IL_0104: Unknown result type (might be due to invalid IL or missing references)
			//IL_0110: Unknown result type (might be due to invalid IL or missing references)
			//IL_0120: Expected O, but got Unknown
			//IL_0120: Expected O, but got Unknown
			//IL_012d: 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)
			//IL_0149: Expected O, but got Unknown
			//IL_0149: Expected O, but got Unknown
			//IL_0156: Unknown result type (might be due to invalid IL or missing references)
			//IL_0162: Unknown result type (might be due to invalid IL or missing references)
			//IL_0172: Expected O, but got Unknown
			//IL_0172: Expected O, but got Unknown
			//IL_017f: Unknown result type (might be due to invalid IL or missing references)
			//IL_018b: Unknown result type (might be due to invalid IL or missing references)
			//IL_019b: Expected O, but got Unknown
			//IL_019b: Expected O, but got Unknown
			//IL_01a8: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b4: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c4: Expected O, but got Unknown
			//IL_01c4: Expected O, but got Unknown
			//IL_01d1: Unknown result type (might be due to invalid IL or missing references)
			//IL_01dd: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ed: Expected O, but got Unknown
			//IL_01ed: Expected O, but got Unknown
			//IL_01fa: Unknown result type (might be due to invalid IL or missing references)
			//IL_0206: Unknown result type (might be due to invalid IL or missing references)
			//IL_0216: Expected O, but got Unknown
			//IL_0216: Expected O, but got Unknown
			//IL_0223: Unknown result type (might be due to invalid IL or missing references)
			//IL_022f: Unknown result type (might be due to invalid IL or missing references)
			//IL_023f: Expected O, but got Unknown
			//IL_023f: Expected O, but got Unknown
			//IL_024c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0258: Unknown result type (might be due to invalid IL or missing references)
			//IL_0268: Expected O, but got Unknown
			//IL_0268: Expected O, but got Unknown
			RegisterPacket("CodZ_GameStarted", new CustomPacketHandler(StartGame_Handler), new CustomPacketHandlerReceivedDelegate(StartGame_Received), ref gameStarted_ID);
			RegisterPacket("CodZ_MysteryBoxMoved", new CustomPacketHandler(MysteryBoxMoved_Handler), new CustomPacketHandlerReceivedDelegate(MysteryBoxMoved_Received), ref mysteryBoxMoved_ID);
			RegisterPacket("CodZ_BlockadeCleared", new CustomPacketHandler(BlockadeCleared_Handler), new CustomPacketHandlerReceivedDelegate(BlockadeCleared_Received), ref blockadeCleared_ID);
			RegisterPacket("CodZ_Client_BlockadeCleared", new CustomPacketHandler(Client_BlockadeCleared_Handler), new CustomPacketHandlerReceivedDelegate(Client_BlockadeCleared_Received), ref blockadeCleared_Client_ID);
			RegisterPacket("CodZ_PowerUpSpawned", new CustomPacketHandler(PowerUpSpawned_Handler), new CustomPacketHandlerReceivedDelegate(PowerUpSpawned_Received), ref powerUpSpawned_ID);
			RegisterPacket("CodZ_PowerUpCollected", new CustomPacketHandler(PowerUpCollected_Handler), new CustomPacketHandlerReceivedDelegate(PowerUpCollected_Received), ref powerUpCollected_ID);
			RegisterPacket("CodZ_Client_PowerUpCollected", new CustomPacketHandler(Client_PowerUpCollected_Handler), new CustomPacketHandlerReceivedDelegate(Client_PowerUpCollected_Received), ref powerUpCollected_Client_ID);
			RegisterPacket("CodZ_PaPPurchased", new CustomPacketHandler(PaPPurchased_Handler), new CustomPacketHandlerReceivedDelegate(PaPPurchased_Received), ref papPurchased_ID);
			RegisterPacket("CodZ_Client_PaPPurchased", new CustomPacketHandler(Client_PaPPurchased_Handler), new CustomPacketHandlerReceivedDelegate(Client_PaPPurchased_Received), ref papPurchased_Client_ID);
			RegisterPacket("CodZ_WindowStateChanged", new CustomPacketHandler(WindowStateChanged_Handler), new CustomPacketHandlerReceivedDelegate(WindowStateChanged_Received), ref windowStateChanged_ID);
			RegisterPacket("CodZ_Client_WindowStateChanged", new CustomPacketHandler(Client_WindowStateChanged_Handler), new CustomPacketHandlerReceivedDelegate(Client_WindowStateChanged_Received), ref windowStateChanged_Client_ID);
			RegisterPacket("CodZ_CustomData", new CustomPacketHandler(CustomData_Handler), new CustomPacketHandlerReceivedDelegate(CustomData_Received), ref customData_ID);
			RegisterPacket("CodZ_Client_CustomData", new CustomPacketHandler(Client_CustomData_Handler), new CustomPacketHandlerReceivedDelegate(Client_CustomData_Received), ref customData_Client_ID);
			RegisterPacket("CodZ_CustomData_PlayerID", new CustomPacketHandler(CustomData_PlayerID_Handler), new CustomPacketHandlerReceivedDelegate(CustomData_PlayerID_Received), ref customData_playerID_ID);
			RegisterPacket("CodZ_Client_CustomData_PlayerID", new CustomPacketHandler(Client_CustomData_PlayerID_Handler), new CustomPacketHandlerReceivedDelegate(Client_CustomData_PlayerID_Received), ref customData_playerID_Client_ID);
		}

		private void RegisterPacket(string packetName, CustomPacketHandler hostHandler, CustomPacketHandlerReceivedDelegate clientHandler, ref int packetID)
		{
			if (Networking.IsHost())
			{
				if (Mod.registeredCustomPacketIDs.ContainsKey(packetName))
				{
					packetID = Mod.registeredCustomPacketIDs[packetName];
				}
				else
				{
					packetID = Networking.RegisterCustomPacketType(packetName);
				}
				Mod.customPacketHandlers[packetID] = hostHandler;
			}
			else if (Mod.registeredCustomPacketIDs.ContainsKey(packetName))
			{
				packetID = Mod.registeredCustomPacketIDs[packetName];
				Mod.customPacketHandlers[packetID] = hostHandler;
			}
			else
			{
				ClientSend.RegisterCustomPacketType(packetName);
				Mod.CustomPacketHandlerReceived += clientHandler;
			}
		}

		public void StartGame_Send()
		{
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Expected O, but got Unknown
			if (Networking.ServerRunning() && !Networking.IsClient())
			{
				Packet val = new Packet(gameStarted_ID);
				val.Write(GameSettings.HardMode);
				val.Write(GameSettings.WeakerEnemiesEnabled);
				val.Write(GameSettings.SpecialRoundDisabled);
				val.Write(GameSettings.ItemSpawnerEnabled);
				val.Write(GameSettings.WonderWeaponEnabled);
				ServerSend.SendTCPDataToAll(val, true);
			}
		}

		private void StartGame_Handler(int clientID, Packet packet)
		{
			GameSettings.HardMode = packet.ReadBool(true);
			GameSettings.WeakerEnemiesEnabled = packet.ReadBool(true);
			GameSettings.SpecialRoundDisabled = packet.ReadBool(true);
			GameSettings.ItemSpawnerEnabled = packet.ReadBool(true);
			GameSettings.WonderWeaponEnabled = packet.ReadBool(true);
			GameSettings.OnSettingsChanged();
			MonoBehaviourSingleton<RoundManager>.Instance.StartGame();
		}

		private void StartGame_Received(string handlerID, int index)
		{
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Expected O, but got Unknown
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: Expected O, but got Unknown
			if (handlerID == "CodZ_GameStarted")
			{
				gameStarted_ID = index;
				Mod.customPacketHandlers[index] = new CustomPacketHandler(StartGame_Handler);
				Mod.CustomPacketHandlerReceived -= new CustomPacketHandlerReceivedDelegate(StartGame_Received);
			}
		}

		public void MysteryBoxMoved_Send(int newWayPointID, bool immediate)
		{
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Expected O, but got Unknown
			if (Networking.ServerRunning() && !Networking.IsClient())
			{
				Packet val = new Packet(mysteryBoxMoved_ID);
				val.Write(newWayPointID);
				val.Write(immediate);
				ServerSend.SendTCPDataToAll(val, true);
			}
		}

		private void MysteryBoxMoved_Handler(int clientID, Packet packet)
		{
			int nextWaypoint = packet.ReadInt(true);
			bool flag = packet.ReadBool(true);
			GameRefs.MysteryBoxMover.SetNextWaypoint(nextWaypoint);
			if (flag)
			{
				GameRefs.MysteryBoxMover.Teleport();
			}
			else
			{
				GameRefs.MysteryBoxMover.StartTeleportAnim();
			}
		}

		private void MysteryBoxMoved_Received(string handlerID, int index)
		{
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Expected O, but got Unknown
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: Expected O, but got Unknown
			if (handlerID == "CodZ_MysteryBoxMoved")
			{
				mysteryBoxMoved_ID = index;
				Mod.customPacketHandlers[index] = new CustomPacketHandler(MysteryBoxMoved_Handler);
				Mod.CustomPacketHandlerReceived -= new CustomPacketHandlerReceivedDelegate(MysteryBoxMoved_Received);
			}
		}

		public void BlockadeCleared_Send(int blockadeId)
		{
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Expected O, but got Unknown
			if (Networking.ServerRunning() && !Networking.IsClient())
			{
				Packet val = new Packet(blockadeCleared_ID);
				val.Write(blockadeId);
				ServerSend.SendTCPDataToAll(val, true);
			}
		}

		private void BlockadeCleared_Handler(int clientID, Packet packet)
		{
			int index = packet.ReadInt(true);
			MonoBehaviourSingleton<GMgr>.Instance.Blockades[index].Unlock();
		}

		private void BlockadeCleared_Received(string handlerID, int index)
		{
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Expected O, but got Unknown
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: Expected O, but got Unknown
			if (handlerID == "CodZ_BlockadeCleared")
			{
				blockadeCleared_ID = index;
				Mod.customPacketHandlers[index] = new CustomPacketHandler(BlockadeCleared_Handler);
				Mod.CustomPacketHandlerReceived -= new CustomPacketHandlerReceivedDelegate(BlockadeCleared_Received);
			}
		}

		public void Client_BlockadeCleared_Send(int blockadeId)
		{
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Expected O, but got Unknown
			if (Networking.ServerRunning() && !Networking.IsHost())
			{
				Packet val = new Packet(blockadeCleared_Client_ID);
				val.Write(blockadeId);
				ClientSend.SendTCPData(val, true);
			}
		}

		private void Client_BlockadeCleared_Handler(int clientID, Packet packet)
		{
			int num = packet.ReadInt(true);
			MonoBehaviourSingleton<GMgr>.Instance.Blockades[num].Unlock();
			BlockadeCleared_Send(num);
		}

		private void Client_BlockadeCleared_Received(string handlerID, int index)
		{
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Expected O, but got Unknown
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: Expected O, but got Unknown
			if (handlerID == "CodZ_Client_BlockadeCleared")
			{
				blockadeCleared_Client_ID = index;
				Mod.customPacketHandlers[index] = new CustomPacketHandler(Client_BlockadeCleared_Handler);
				Mod.CustomPacketHandlerReceived -= new CustomPacketHandlerReceivedDelegate(Client_BlockadeCleared_Received);
			}
		}

		public void PowerUpSpawned_Send(int powerUpId, Vector3 pos)
		{
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Expected O, but got Unknown
			//IL_002e: Unknown result type (might be due to invalid IL or missing references)
			if (Networking.ServerRunning() && !Networking.IsClient())
			{
				Packet val = new Packet(powerUpSpawned_ID);
				val.Write(powerUpId);
				val.Write(pos);
				ServerSend.SendTCPDataToAll(val, true);
			}
		}

		private void PowerUpSpawned_Handler(int clientID, Packet packet)
		{
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			int index = packet.ReadInt(true);
			Vector3 pos = packet.ReadVector3(true);
			MonoBehaviourSingleton<PowerUpManager>.Instance.SpawnPowerUp(MonoBehaviourSingleton<PowerUpManager>.Instance.PowerUps[index], pos);
		}

		private void PowerUpSpawned_Received(string handlerID, int index)
		{
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Expected O, but got Unknown
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: Expected O, but got Unknown
			if (handlerID == "CodZ_PowerUpSpawned")
			{
				powerUpSpawned_ID = index;
				Mod.customPacketHandlers[index] = new CustomPacketHandler(PowerUpSpawned_Handler);
				Mod.CustomPacketHandlerReceived -= new CustomPacketHandlerReceivedDelegate(PowerUpSpawned_Received);
			}
		}

		public void PowerUpCollected_Send(int powerUpId)
		{
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Expected O, but got Unknown
			if (Networking.ServerRunning() && !Networking.IsClient())
			{
				Packet val = new Packet(powerUpCollected_ID);
				val.Write(powerUpId);
				ServerSend.SendTCPDataToAll(val, true);
			}
		}

		private void PowerUpCollected_Handler(int clientID, Packet packet)
		{
			int index = packet.ReadInt(true);
			PowerUp powerUp = MonoBehaviourSingleton<PowerUpManager>.Instance.PowerUps[index];
			powerUp.OnCollect();
		}

		private void PowerUpCollected_Received(string handlerID, int index)
		{
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Expected O, but got Unknown
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: Expected O, but got Unknown
			if (handlerID == "CodZ_PowerUpCollected")
			{
				powerUpCollected_ID = index;
				Mod.customPacketHandlers[index] = new CustomPacketHandler(PowerUpCollected_Handler);
				Mod.CustomPacketHandlerReceived -= new CustomPacketHandlerReceivedDelegate(PowerUpCollected_Received);
			}
		}

		public void Client_PowerUpCollected_Send(int powerUpId)
		{
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Expected O, but got Unknown
			if (Networking.ServerRunning() && !Networking.IsHost())
			{
				Packet val = new Packet(powerUpCollected_Client_ID);
				val.Write(powerUpId);
				ClientSend.SendTCPData(val, true);
			}
		}

		private void Client_PowerUpCollected_Handler(int clientID, Packet packet)
		{
			int num = packet.ReadInt(true);
			PowerUp powerUp = MonoBehaviourSingleton<PowerUpManager>.Instance.PowerUps[num];
			powerUp.OnCollect();
			PowerUpCollected_Send(num);
		}

		private void Client_PowerUpCollected_Received(string handlerID, int index)
		{
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Expected O, but got Unknown
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: Expected O, but got Unknown
			if (handlerID == "CodZ_Client_PowerUpCollected")
			{
				powerUpCollected_Client_ID = index;
				Mod.customPacketHandlers[index] = new CustomPacketHandler(Client_PowerUpCollected_Handler);
				Mod.CustomPacketHandlerReceived -= new CustomPacketHandlerReceivedDelegate(Client_PowerUpCollected_Received);
			}
		}

		public void PaPPurchased_Send()
		{
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Expected O, but got Unknown
			if (Networking.ServerRunning() && !Networking.IsClient())
			{
				Packet val = new Packet(papPurchased_ID);
				ServerSend.SendTCPDataToAll(val, true);
			}
		}

		private void PaPPurchased_Handler(int clientID, Packet packet)
		{
			GameRefs.PackAPunch.OnBuying();
		}

		private void PaPPurchased_Received(string handlerID, int index)
		{
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Expected O, but got Unknown
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: Expected O, but got Unknown
			if (handlerID == "CodZ_PaPPurchased")
			{
				papPurchased_ID = index;
				Mod.customPacketHandlers[index] = new CustomPacketHandler(PaPPurchased_Handler);
				Mod.CustomPacketHandlerReceived -= new CustomPacketHandlerReceivedDelegate(PaPPurchased_Received);
			}
		}

		public void Client_PaPPurchased_Send()
		{
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Expected O, but got Unknown
			if (Networking.ServerRunning() && !Networking.IsHost())
			{
				Packet val = new Packet(papPurchased_Client_ID);
				ClientSend.SendTCPData(val, true);
			}
		}

		private void Client_PaPPurchased_Handler(int clientID, Packet packet)
		{
			GameRefs.PackAPunch.OnBuying();
			PaPPurchased_Send();
		}

		private void Client_PaPPurchased_Received(string handlerID, int index)
		{
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Expected O, but got Unknown
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: Expected O, but got Unknown
			if (handlerID == "CodZ_Client_PaPPurchased")
			{
				papPurchased_Client_ID = index;
				Mod.customPacketHandlers[index] = new CustomPacketHandler(Client_PaPPurchased_Handler);
				Mod.CustomPacketHandlerReceived -= new CustomPacketHandlerReceivedDelegate(Client_PaPPurchased_Received);
			}
		}

		public void WindowStateChanged_Send(int windowId, int plankId, WindowAction windowAction)
		{
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Expected O, but got Unknown
			if (Networking.ServerRunning() && !Networking.IsClient())
			{
				Packet val = new Packet(windowStateChanged_ID);
				val.Write(windowId);
				val.Write(plankId);
				val.Write((int)windowAction);
				ServerSend.SendTCPDataToAll(val, true);
			}
		}

		private void WindowStateChanged_Handler(int clientID, Packet packet)
		{
			int index = packet.ReadInt(true);
			int plankId = packet.ReadInt(true);
			switch ((WindowAction)packet.ReadInt(true))
			{
			case WindowAction.Repair:
				GameRefs.Windows[index].OnWindowRepaired(plankId);
				break;
			case WindowAction.Tear:
				GameRefs.Windows[index].OnPlankTeared(plankId);
				break;
			}
		}

		private void WindowStateChanged_Received(string handlerID, int index)
		{
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Expected O, but got Unknown
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: Expected O, but got Unknown
			if (handlerID == "CodZ_WindowStateChanged")
			{
				windowStateChanged_ID = index;
				Mod.customPacketHandlers[index] = new CustomPacketHandler(WindowStateChanged_Handler);
				Mod.CustomPacketHandlerReceived -= new CustomPacketHandlerReceivedDelegate(WindowStateChanged_Received);
			}
		}

		public void Client_WindowStateChanged_Send(int windowId, int plankId)
		{
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Expected O, but got Unknown
			if (Networking.ServerRunning() && !Networking.IsHost())
			{
				Packet val = new Packet(windowStateChanged_Client_ID);
				val.Write(windowId);
				val.Write(plankId);
				ClientSend.SendTCPData(val, true);
			}
		}

		private void Client_WindowStateChanged_Handler(int clientID, Packet packet)
		{
			int num = packet.ReadInt(true);
			int plankId = packet.ReadInt(true);
			GameRefs.Windows[num].OnWindowRepaired(plankId);
			WindowStateChanged_Send(num, plankId, WindowAction.Repair);
		}

		private void Client_WindowStateChanged_Received(string handlerID, int index)
		{
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Expected O, but got Unknown
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: Expected O, but got Unknown
			if (handlerID == "CodZ_Client_WindowStateChanged")
			{
				windowStateChanged_Client_ID = index;
				Mod.customPacketHandlers[index] = new CustomPacketHandler(Client_WindowStateChanged_Handler);
				Mod.CustomPacketHandlerReceived -= new CustomPacketHandlerReceivedDelegate(Client_WindowStateChanged_Received);
			}
		}

		public void CustomData_Send(int customDataID)
		{
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Expected O, but got Unknown
			if (Networking.ServerRunning() && !Networking.IsClient())
			{
				HandleCustomData(customDataID);
				Packet val = new Packet(customData_ID);
				val.Write(customDataID);
				ServerSend.SendTCPDataToAll(val, true);
			}
		}

		private void CustomData_Handler(int clientID, Packet packet)
		{
			int customDataId = packet.ReadInt(true);
			HandleCustomData(customDataId);
		}

		private void CustomData_Received(string handlerID, int index)
		{
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Expected O, but got Unknown
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: Expected O, but got Unknown
			if (handlerID == "CodZ_CustomData")
			{
				customData_ID = index;
				Mod.customPacketHandlers[index] = new CustomPacketHandler(CustomData_Handler);
				Mod.CustomPacketHandlerReceived -= new CustomPacketHandlerReceivedDelegate(CustomData_Received);
			}
		}

		public void Client_CustomData_Send(int customDataId)
		{
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Expected O, but got Unknown
			if (Networking.ServerRunning() && !Networking.IsHost())
			{
				Packet val = new Packet(customData_Client_ID);
				val.Write(customDataId);
				ClientSend.SendTCPData(val, true);
			}
		}

		private void Client_CustomData_Handler(int clientID, Packet packet)
		{
			int customDataID = packet.ReadInt(true);
			CustomData_Send(customDataID);
		}

		private void Client_CustomData_Received(string handlerID, int index)
		{
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Expected O, but got Unknown
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: Expected O, but got Unknown
			if (handlerID == "CodZ_Client_CustomData")
			{
				customData_Client_ID = index;
				Mod.customPacketHandlers[index] = new CustomPacketHandler(Client_CustomData_Handler);
				Mod.CustomPacketHandlerReceived -= new CustomPacketHandlerReceivedDelegate(Client_CustomData_Received);
			}
		}

		public void CustomData_PlayerID_Send(int playerID, int customDataID)
		{
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Expected O, but got Unknown
			if (Networking.ServerRunning() && !Networking.IsClient())
			{
				HandlePlayerCustomData(playerID, customDataID);
				Packet val = new Packet(customData_playerID_ID);
				val.Write(playerID);
				val.Write(customDataID);
				ServerSend.SendTCPDataToAll(val, true);
			}
		}

		private void CustomData_PlayerID_Handler(int clientID, Packet packet)
		{
			int playerID = packet.ReadInt(true);
			int customDataId = packet.ReadInt(true);
			HandlePlayerCustomData(playerID, customDataId);
		}

		private void CustomData_PlayerID_Received(string handlerID, int index)
		{
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Expected O, but got Unknown
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: Expected O, but got Unknown
			if (handlerID == "CodZ_CustomData_PlayerID")
			{
				customData_playerID_ID = index;
				Mod.customPacketHandlers[index] = new CustomPacketHandler(CustomData_PlayerID_Handler);
				Mod.CustomPacketHandlerReceived -= new CustomPacketHandlerReceivedDelegate(CustomData_PlayerID_Received);
			}
		}

		public void Client_CustomData_PlayerID_Send(int playerID, int customDataID)
		{
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Expected O, but got Unknown
			if (Networking.ServerRunning() && !Networking.IsHost())
			{
				Packet val = new Packet(customData_playerID_Client_ID);
				val.Write(playerID);
				val.Write(customDataID);
				ClientSend.SendTCPData(val, true);
			}
		}

		private void Client_CustomData_PlayerID_Handler(int clientID, Packet packet)
		{
			int playerID = packet.ReadInt(true);
			int customDataID = packet.ReadInt(true);
			CustomData_PlayerID_Send(playerID, customDataID);
		}

		private void Client_CustomData_PlayerID_Received(string handlerID, int index)
		{
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Expected O, but got Unknown
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: Expected O, but got Unknown
			if (handlerID == "CodZ_Client_CustomData_PlayerID")
			{
				customData_playerID_Client_ID = index;
				Mod.customPacketHandlers[index] = new CustomPacketHandler(Client_CustomData_PlayerID_Handler);
				Mod.CustomPacketHandlerReceived -= new CustomPacketHandlerReceivedDelegate(Client_CustomData_PlayerID_Received);
			}
		}

		private void HandleCustomData(int customDataId)
		{
			switch (customDataId)
			{
			case 0:
				GameRefs.MysteryBox.OnBuying();
				break;
			case 1:
				GameRefs.MysteryBox.WillTeleport = true;
				break;
			case 3:
				MonoBehaviourSingleton<GMgr>.Instance.TurnOnPower();
				break;
			case 4:
				MonoBehaviourSingleton<PlayerSpawner>.Instance.MoveToEndGameArea();
				break;
			case 5:
				GameRefs.Radio.ToggleMusic();
				break;
			}
		}

		private void HandlePlayerCustomData(int playerID, int customDataId)
		{
			//IL_004a: Unknown result type (might be due to invalid IL or missing references)
			//IL_004f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0051: Unknown result type (might be due to invalid IL or missing references)
			switch (customDataId)
			{
			case 0:
				if (Networking.IsHost() && MonoBehaviourSingleton<PlayersMgr>.Instance.AllPlayersDowned())
				{
					CustomData_Send(4);
				}
				if (playerID != GameManager.ID)
				{
					Vector3 position = ((Component)GameManager.players[playerID]).transform.position;
					PlayersMgr.SpawnReviveButton(playerID, position);
					PlayersMgr.GetPlayerExcludingMe(playerID).IsDowned = true;
				}
				break;
			case 1:
				if (playerID != GameManager.ID)
				{
					if (Networking.IsHost() && MonoBehaviourSingleton<PlayersMgr>.Instance.AllPlayersDowned())
					{
						CustomData_Send(4);
					}
					PlayersMgr.GetPlayerExcludingMe(playerID).IsDowned = false;
					PlayersMgr.GetPlayerExcludingMe(playerID).IsDead = true;
					PlayersMgr.DespawnReviveButton(playerID);
				}
				break;
			case 2:
				if (playerID == GameManager.ID)
				{
					MonoBehaviourSingleton<PlayerSpawner>.Instance.Revive();
					break;
				}
				PlayersMgr.GetPlayerExcludingMe(playerID).IsDowned = false;
				PlayersMgr.DespawnReviveButton(playerID);
				break;
			case 3:
				if (playerID == GM.CurrentPlayerBody.GetPlayerIFF())
				{
					MonoBehaviourSingleton<GMgr>.Instance.AddPoints(MonoBehaviourSingleton<ZombieManager>.Instance.PointsOnHit);
				}
				break;
			case 4:
				if (playerID == GM.CurrentPlayerBody.GetPlayerIFF())
				{
					MonoBehaviourSingleton<GMgr>.Instance.AddPoints(MonoBehaviourSingleton<ZombieManager>.Instance.PointsOnKill);
					MonoBehaviourSingleton<GMgr>.Instance.Kills++;
				}
				break;
			case 5:
				if (playerID != GameManager.ID)
				{
					PlayersMgr.GetPlayerExcludingMe(playerID).IsDowned = false;
					PlayersMgr.GetPlayerExcludingMe(playerID).IsDead = false;
				}
				break;
			}
		}
	}
	public enum CustomDataType
	{
		MYSTERY_BOX_ROLLED = 0,
		MYSTERY_BOX_TELEPORT = 1,
		POWER_ENABLED = 3,
		EVERY_PLAYER_DEAD = 4,
		RADIO_TOGGLE = 5
	}
	public enum CustomPlayerDataType
	{
		PLAYER_DOWNED,
		PLAYER_DEAD,
		PLAYER_REVIVED,
		ZOMBIE_HIT,
		ZOMBIE_KILLED,
		PLAYER_SPAWNED
	}
	public class HideIfNotHost : MonoBehaviour
	{
		private void Start()
		{
			if (!Networking.IsHostOrSolo())
			{
				((Component)this).gameObject.SetActive(false);
			}
		}
	}
	public class Networking : MonoBehaviourSingleton<Networking>
	{
		public static int CustomIndex = 0;

		public override void Awake()
		{
			base.Awake();
			CustomIndex = 0;
		}

		public static bool IsHostOrSolo()
		{
			if (ServerRunning())
			{
				if (IsHost())
				{
					return true;
				}
				return false;
			}
			return true;
		}

		public static bool ServerRunning()
		{
			return (Object)(object)GameManager.singleton != (Object)null;
		}

		public static bool IsClient()
		{
			if (!ThreadManager.host)
			{
				return true;
			}
			return false;
		}

		public static bool IsHost()
		{
			if (ThreadManager.host)
			{
				return true;
			}
			return false;
		}

		public static bool IsSolo()
		{
			if (ServerRunning())
			{
				if (IsHost() && MonoBehaviourSingleton<PlayersMgr>.Instance.Players.Count == 1)
				{
					return true;
				}
				return false;
			}
			return true;
		}

		public static int RegisterCustomPacketType(string handlerID, int clientID = 0)
		{
			int value = -1;
			if (Mod.registeredCustomPacketIDs.TryGetValue(handlerID, out value))
			{
				Mod.LogWarning("Client " + clientID + " requested for " + handlerID + " custom packet handler to be registered but this ID already exists.");
			}
			else
			{
				value = CustomIndex;
				CustomIndex++;
				Mod.registeredCustomPacketIDs.Add(handlerID, value);
				Mod.CustomPacketHandlerReceivedInvoke(handlerID, value);
			}
			ServerSend.RegisterCustomPacketType(handlerID, value);
			return value;
		}

		public static bool IsMineIFF(int iff)
		{
			if (GM.CurrentPlayerBody.GetPlayerIFF() == iff)
			{
				return true;
			}
			return false;
		}
	}
}
public class PlayersMgr : MonoBehaviourSingleton<PlayersMgr>
{
	public List<PlayerH3MPData> Players = new List<PlayerH3MPData>();

	public static PlayerH3MPData Me;

	public ReviveButton ReviveButtonPrefab;

	public List<ReviveButton> ReviveButtons = new List<ReviveButton>();

	private void Start()
	{
		AddMe();
		RoundManager.OnGameStarted = (Action)Delegate.Combine(RoundManager.OnGameStarted, new Action(AddClients));
		RoundManager.RoundStarted = (Action)Delegate.Combine(RoundManager.RoundStarted, new Action(SetAllToAlive));
	}

	private void AddClients()
	{
		foreach (KeyValuePair<int, PlayerManager> player in GameManager.players)
		{
			AddClient(player.Value);
		}
		Debug.Log((object)"Connected Players");
		foreach (PlayerH3MPData player2 in Players)
		{
			if (player2.IsMe)
			{
				Debug.Log((object)("Me " + GameManager.ID));
			}
			else
			{
				Debug.Log((object)(player2.PlayerManager.username + " " + player2.PlayerManager.ID));
			}
		}
		foreach (PlayerH3MPData player3 in Players)
		{
			if (!player3.IsMe)
			{
				Debug.Log((object)("IFF: " + (player3.PlayerManager.ID + 5)));
			}
		}
	}

	public PlayerH3MPData GetRandomPlayer()
	{
		int index = Random.Range(0, Players.Count);
		return Players[index];
	}

	public PlayerH3MPData GetRandomAlivePlayer()
	{
		List<PlayerH3MPData> list = Players.FindAll((PlayerH3MPData player) => player.IsAlive);
		int index = Random.Range(0, list.Count);
		return list[index];
	}

	public PlayerH3MPData GetClosestAlivePlayer(Vector3 origin)
	{
		//IL_0036: Unknown result type (might be due to invalid IL or missing references)
		//IL_003b: 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_0041: Unknown result type (might be due to invalid IL or missing references)
		PlayerH3MPData result = null;
		float num = float.MaxValue;
		foreach (PlayerH3MPData player in Players)
		{
			if (player.IsAlive)
			{
				Vector3 val = player.GetHead().position - origin;
				float sqrMagnitude = ((Vector3)(ref val)).sqrMagnitude;
				if (sqrMagnitude < num)
				{
					num = sqrMagnitude;
					result = player;
				}
			}
		}
		return result;
	}

	public PlayerH3MPData GetClosestPlayer(Vector3 origin)
	{
		//IL_002a: 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)
		//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)
		PlayerH3MPData result = null;
		float num = float.MaxValue;
		foreach (PlayerH3MPData player in Players)
		{
			Vector3 val = player.GetHead().position - origin;
			float sqrMagnitude = ((Vector3)(ref val)).sqrMagnitude;
			if (sqrMagnitude < num)
			{
				num = sqrMagnitude;
				result = player;
			}
		}
		return result;
	}

	public bool AllPlayersDowned()
	{
		return Players.All((PlayerH3MPData player) => !player.IsAlive);
	}

	public void AddMe()
	{
		Players.Add(new PlayerH3MPData
		{
			IsMe = true,
			PlayerManager = null
		});
		Me = Players[Players.Count - 1];
	}

	public void AddClient(PlayerManager playerManager)
	{
		Players.Add(new PlayerH3MPData
		{
			IsMe = false,
			PlayerManager = playerManager
		});
	}

	private void OnDestroy()
	{
		RoundManager.OnGameStarted = (Action)Delegate.Remove(RoundManager.OnGameStarted, new Action(AddClients));
		RoundManager.RoundStarted = (Action)Delegate.Remove(RoundManager.RoundStarted, new Action(SetAllToAlive));
	}

	public static PlayerH3MPData GetPlayerExcludingMe(int playerID)
	{
		return MonoBehaviourSingleton<PlayersMgr>.Instance.Players.Find((PlayerH3MPData player) => !player.IsMe && player.PlayerManager.ID == playerID);
	}

	public static void SpawnReviveButton(int playerID, Vector3 pos)
	{
		//IL_000b: Unknown result type (might be due to invalid IL or missing references)
		//IL_000c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0019: Unknown result type (might be due to invalid IL or missing references)
		ReviveButton reviveButton = Object.Instantiate<ReviveButton>(MonoBehaviourSingleton<PlayersMgr>.Instance.ReviveButtonPrefab, pos, Quaternion.identity);
		reviveButton.Spawn(playerID, pos);
	}

	public static void DespawnReviveButton(int playerID)
	{
		ReviveButton reviveButton = MonoBehaviourSingleton<PlayersMgr>.Instance.ReviveButtons.Find((ReviveButton button) => button.AffectedPlayerID == playerID);
		reviveButton.Despawn();
	}

	public void SetAllToAlive()
	{
		foreach (PlayerH3MPData player in Players)
		{
			player.IsDowned = false;
			player.IsDead = false;
		}
	}
}
public class PlayerH3MPData
{
	public bool IsMe;

	public PlayerManager PlayerManager;

	public bool IsDowned;

	public bool IsDead;

	public bool Exists => IsMe || (Object)(object)PlayerManager != (Object)null;

	public bool IsAlive => !IsDowned && !IsDead && Exists;

	public Transform GetHead()
	{
		if (IsMe)
		{
			return GM.CurrentPlayerBody.Head;
		}
		return PlayerManager.head;
	}
}
public class ReviveButton : MonoBehaviourSingleton<ReviveButton>
{
	public Image ReviveIcon;

	public int AffectedPlayerID;

	private FVRViveHand _handReviving;

	private float _timer = 0f;

	private Color _defaultColor = Color.yellow;

	private Color _reviveColor = Color.white;

	private bool _available = false;

	private float ReviveTime => (!MonoBehaviourSingleton<PlayerData>.Instance.QuickRevivePerkActivated) ? 5f : 2.5f;

	public void Spawn(int playerID, Vector3 pos)
	{
		//IL_001a: Unknown result type (might be due to invalid IL or missing references)
		//IL_001b: 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)
		//IL_003c: Unknown result type (might be due to invalid IL or missing references)
		((Component)this).gameObject.SetActive(true);
		AffectedPlayerID = playerID;
		((Component)this).transform.position = pos + Vector3.up;
		_timer = 0f;
		((Graphic)ReviveIcon).color = _defaultColor;
		MonoBehaviourSingleton<PlayersMgr>.Instance.ReviveButtons.Add(this);
		_available = true;
	}

	public void Despawn()
	{
		((Component)this).gameObject.SetActive(false);
		MonoBehaviourSingleton<PlayersMgr>.Instance.ReviveButtons.Remove(this);
		_available = false;
		Object.Destroy((Object)(object)((Component)this).gameObject);
	}

	private void OnTriggerStay(Collider other)
	{
		//IL_00db: 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)
		if (!Object.op_Implicit((Object)(object)((Component)other).GetComponent<FVRViveHand>()))
		{
			return;
		}
		if ((Object)(object)_handReviving == (Object)null)
		{
			_handReviving = ((Component)other).GetComponent<FVRViveHand>();
		}
		if (_handReviving.Input.GripPressed)
		{
			((Graphic)ReviveIcon).color = _reviveColor;
			_timer += Time.fixedDeltaTime;
			if (_timer >= ReviveTime)
			{
				if (Networking.IsHost())
				{
					MonoBehaviourSingleton<CodZNetworking>.Instance.CustomData_PlayerID_Send(AffectedPlayerID, 2);
				}
				else
				{
					MonoBehaviourSingleton<CodZNetworking>.Instance.Client_CustomData_PlayerID_Send(AffectedPlayerID, 2);
				}
				_timer = 0f;
				_available = false;
			}
		}
		else
		{
			_timer = 0f;
			((Graphic)ReviveIcon).color = _defaultColor;
		}
	}

	private void Update()
	{
		//IL_000d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0021: Unknown result type (might be due to invalid IL or missing references)
		//IL_0026: Unknown result type (might be due to invalid IL or missing references)
		//IL_002b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0030: Unknown result type (might be due to invalid IL or missing references)
		//IL_0044: 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)
		((Component)this).transform.LookAt(((Component)this).transform.position + ((Component)GM.CurrentPlayerBody.Head).transform.rotation * Vector3.forward, ((Component)GM.CurrentPlayerBody.Head).transform.rotation * Vector3.up);
	}

	private void OnTriggerExit(Collider other)
	{
		if (!Object.op_Implicit((Object)(object)((Component)other).GetComponent<FVRViveHand>()))
		{
		}
	}
}
namespace CustomScripts
{
	public class Blockade : MonoBehaviour, IPurchasable
	{
		private int _id;

		public Action OnPurchase;

		public List<Transform> UnlockableZombieSpawnPoints;

		public List<Transform> UnlockableSpecialZombieSpawnPoints;

		public List<Text> CostTexts;

		public int Cost;

		[SerializeField]
		private bool _isOneTimeOnly = true;

		private bool _alreadyBought;

		private bool _alreadyUsed;

		public int PurchaseCost => Cost;

		public bool IsOneTimeOnly => _isOneTimeOnly;

		public bool AlreadyBought => _alreadyBought;

		private void OnValidate()
		{
			foreach (Text costText in CostTexts)
			{
				costText.text = Cost.ToString();
			}
		}

		private void Start()
		{
			MonoBehaviourSingleton<GMgr>.Instance.Blockades.Add(this);
			_id = MonoBehaviourSingleton<GMgr>.Instance.Blockades.Count - 1;
		}

		public void TryBuying()
		{
			if (_alreadyUsed || !MonoBehaviourSingleton<GMgr>.Instance.TryRemovePoints(Cost))
			{
				return;
			}
			if (Networking.IsHostOrSolo())
			{
				Unlock();
				if (Networking.IsHost())
				{
					MonoBehaviourSingleton<CodZNetworking>.Instance.BlockadeCleared_Send(_id);
				}
			}
			else
			{
				MonoBehaviourSingleton<CodZNetworking>.Instance.Client_BlockadeCleared_Send(_id);
			}
		}

		public void Unlock()
		{
			_alreadyUsed = true;
			foreach (Transform unlockableZombieSpawnPoint in UnlockableZombieSpawnPoints)
			{
				if (!MonoBehaviourSingleton<ZombieManager>.Instance.CurrentLocation.ZombieSpawnPoints.Contains(unlockableZombieSpawnPoint))
				{
					MonoBehaviourSingleton<ZombieManager>.Instance.CurrentLocation.ZombieSpawnPoints.Add(unlockableZombieSpawnPoint);
				}
			}
			foreach (Transform unlockableSpecialZombieSpawnPoint in UnlockableSpecialZombieSpawnPoints)
			{
				if (!MonoBehaviourSingleton<ZombieManager>.Instance.CurrentLocation.SpecialZombieSpawnPoints.Contains(unlockableSpecialZombieSpawnPoint))
				{
					MonoBehaviourSingleton<ZombieManager>.Instance.CurrentLocation.SpecialZombieSpawnPoints.Add(unlockableSpecialZombieSpawnPoint);
				}
			}
			MonoBehaviourSingleton<AudioManager>.Instance.Play(MonoBehaviourSingleton<AudioManager>.Instance.BuySound, 0.5f);
			((Component)this).gameObject.SetActive(false);
			if (OnPurchase != null)
			{
				OnPurchase();
			}
		}
	}
	public class MysteryBox : MonoBehaviour, IPurchasable
	{
		public static Action<WeaponData> WeaponSpawnedEvent;

		public int Cost = 950;

		[SerializeField]
		private bool _isOneTimeOnly;

		private bool _alreadyBought;

		public List<WeaponData> Loot;

		public List<WeaponData> RareLoot;

		[Range(0f, 1f)]
		public float StartRareChance = 0.01f;

		public float ChanceIncreasePerRound = 0.003f;

		public float MaxRareChance = 0.1f;

		public CustomItemSpawner WeaponSpawner;

		public CustomItemSpawner AmmoSpawner;

		public AudioClip RollSound;

		[HideInInspector]
		public bool InUse = false;

		private MysteryBoxMover _mysteryBoxMover;

		[HideInInspector]
		public bool WillTeleport;

		[HideInInspector]
		public bool DidIRoll;

		public int PurchaseCost => Cost;

		public bool IsOneTimeOnly => _isOneTimeOnly;

		public bool AlreadyBought => _alreadyBought;

		private void Awake()
		{
			_mysteryBoxMover = ((Component)this).GetComponent<MysteryBoxMover>();
		}

		public void TryBuy()
		{
			if (!InUse && MonoBehaviourSingleton<GMgr>.Instance.TryRemovePoints(Cost))
			{
				DidIRoll = true;
				if (Networking.IsSolo())
				{
					OnBuying();
				}
				else if (Networking.IsHost())
				{
					MonoBehaviourSingleton<CodZNetworking>.Instance.CustomData_Send(0);
				}
				else
				{
					MonoBehaviourSingleton<CodZNetworking>.Instance.Client_CustomData_Send(0);
				}
			}
		}

		public void OnBuying()
		{
			InUse = true;
			WillTeleport = false;
			MonoBehaviourSingleton<AudioManager>.Instance.Play(RollSound, 0.25f);
			if (Networking.IsHostOrSolo() && _mysteryBoxMover.CheckForTeleport())
			{
				if (Networking.IsSolo())
				{
					WillTeleport = true;
				}
				else
				{
					MonoBehaviourSingleton<CodZNetworking>.Instance.CustomData_Send(1);
				}
			}
			((MonoBehaviour)this).StartCoroutine(DelayedSpawn());
		}

		private IEnumerator DelayedSpawn()
		{
			yield return (object)new WaitForSeconds(5.5f);
			if (WillTeleport)
			{
				if (Networking.IsHostOrSolo())
				{
					_mysteryBoxMover.StartTeleporting();
				}
			}
			else
			{
				if (DidIRoll)
				{
					DidIRoll = false;
					float num = Mathf.Min(StartRareChance + ChanceIncreasePerRound * (float)MonoBehaviourSingleton<RoundManager>.Instance.RoundNumber, MaxRareChance);
					bool flag = Random.Range(0f, 1f) <= num;
					if (!GameSettings.WonderWeaponEnabled)
					{
						flag = false;
					}
					WeaponData weaponData;
					if (flag)
					{
						int index = Random.Range(0, RareLoot.Count);
						weaponData = RareLoot[index];
					}
					else
					{
						int index2 = Random.Range(0, Loot.Count);
						weaponData = Loot[index2];
					}
					WeaponSpawner.ObjectId = weaponData.DefaultSpawners[0];
					AmmoSpawner.ObjectId = weaponData.DefaultSpawners[1];
					GameObject val = WeaponSpawner.Spawn();
					AmmoSpawner.Spawn();
					val.GetComponent<WeaponWrapper>().SetOwner(GameManager.ID);
					if (WeaponSpawnedEvent != null)
					{
						WeaponSpawnedEvent(weaponData);
					}
				}
				InUse = false;
			}
			if (Networking.IsHostOrSolo())
			{
				_mysteryBoxMover.CurrentRoll++;
			}
		}
	}
	public class MysteryBoxMover : MonoBehaviour
	{
		public bool MoveRandomlyOnStart = true;

		public List<Transform> SpawnPoints;

		public int CurrentSpawnPoint;

		[Range(0f, 100f)]
		public float TeleportChance = 20f;

		public int SafeRollsProvided = 3;

		public AudioClip TeddyBearSound;

		public AudioClip SecretTeddyBearSound;

		public Transform TeddyBear;

		[HideInInspector]
		public Transform CurrentPos;

		[HideInInspector]
		public int CurrentRoll = 0;

		private Animator _animator;

		private MysteryBox _mysteryBox;

		private Transform _parent;

		private int _nextTeleportWaypoint = -1;

		private void Awake()
		{
			_parent = ((Component)this).transform.parent;
			_animator = ((Component)_parent).GetComponent<Animator>();
			_mysteryBox = ((Component)this).GetComponent<MysteryBox>();
		}

		private void Start()
		{
			RoundManager.OnGameStarted = (Action)Delegate.Combine(RoundManager.OnGameStarted, new Action(TeleportOnStart));
		}

		public void TeleportOnStart()
		{
			if (Networking.IsHostOrSolo() && MoveRandomlyOnStart)
			{
				int newWayPointID = (_nextTeleportWaypoint = GetRandomMovePoint());
				Teleport();
				if (Networking.IsHost())
				{
					MonoBehaviourSingleton<CodZNetworking>.Instance.MysteryBoxMoved_Send(newWayPointID, immediate: true);
				}
			}
		}

		public void Teleport()
		{
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_0048: Unknown result type (might be due to invalid IL or missing references)
			Transform val = SpawnPoints[_nextTeleportWaypoint];
			CurrentSpawnPoint = _nextTeleportWaypoint;
			CurrentPos = val;
			((Component)_parent).transform.position = val.position;
			((Component)_parent).transform.rotation = val.rotation;
			CurrentRoll = 0;
			_mysteryBox.InUse = false;
		}

		public bool CheckForTeleport()
		{
			if (CurrentRoll <= SafeRollsProvided)
			{
				return false;
			}
			if ((float)Random.Range(0, 100) <= TeleportChance)
			{
				return true;
			}
			return false;
		}

		public void StartTeleporting()
		{
			int randomMovePoint = GetRandomMovePoint();
			SetNextWaypoint(randomMovePoint);
			StartTeleportAnim();
			if (Networking.IsHost())
			{
				MonoBehaviourSingleton<CodZNetworking>.Instance.MysteryBoxMoved_Send(randomMovePoint, immediate: false);
			}
		}

		public void StartTeleportAnim()
		{
			GameObject gameObject;
			if (Random.Range(0, 1000) == 0)
			{
				gameObject = ((Component)TeddyBear.GetChild(1)).gameObject;
				MonoBehaviourSingleton<AudioManager>.Instance.Play(SecretTeddyBearSound);
			}
			else
			{
				gameObject = ((Component)TeddyBear.GetChild(0)).gameObject;
				MonoBehaviourSingleton<AudioManager>.Instance.Play(TeddyBearSound);
			}
			((Component)TeddyBear).GetComponent<Animator>().Play("Activation");
			gameObject.SetActive(true);
			((MonoBehaviour)this).StartCoroutine(DelayedAnimation(gameObject));
		}

		private IEnumerator DelayedAnimation(GameObject teddy)
		{
			yield return (object)new WaitForSeconds(3f);
			teddy.SetActive(false);
			yield return (object)new WaitForSeconds(1.2f);
			_animator.Play("Teleport");
			((MonoBehaviour)this).StartCoroutine(DelayedTeleport());
		}

		private IEnumerator DelayedTeleport()
		{
			yield return (object)new WaitForSeconds(4.2f);
			Teleport();
		}

		public int GetRandomMovePoint()
		{
			List<int> list = new List<int>();
			for (int i = 0; i < SpawnPoints.Count; i++)
			{
				if (i != CurrentSpawnPoint)
				{
					list.Add(i);
				}
			}
			return list[Random.Range(0, list.Count)];
		}

		public void SetNextWaypoint(int waypointID)
		{
			_nextTeleportWaypoint = waypointID;
		}

		private void OnDestroy()
		{
			RoundManager.OnGameStarted = (Action)Delegate.Remove(RoundManager.OnGameStarted, new Action(TeleportOnStart));
		}
	}
	public class QuestionMarkBlinking : MonoBehaviour
	{
		public Renderer QuestionMark1;

		public Renderer QuestionMark2;

		private float _emissionValue;

		private int _emissionWeight;

		private bool _emit;

		private float _time;

		private void Awake()
		{
			_emissionWeight = Shader.PropertyToID("_EmissionWeight");
		}

		private void Update()
		{
			if (_emit)
			{
				if (_time >= 1.5f)
				{
					_emit = false;
					((MonoBehaviour)this).StartCoroutine(SmoothEmissionChange(0f, 1f, 1f));
					_time = 0f;
				}
			}
			else if (_time >= 3f)
			{
				_emit = true;
				((MonoBehaviour)this)