Decompiled source of ChatsRevenge v1.5.1

ChatsRevenge.dll

Decompiled 10 months ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using BepInEx;
using BepInEx.Logging;
using ChatsRevenge.Patches;
using ChatsRevenge.Utils;
using GameNetcodeStuff;
using HarmonyLib;
using LC_API.ServerAPI;
using Newtonsoft.Json;
using TMPro;
using Unity.Netcode;
using UnityEngine;
using UnityEngine.AI;
using UnityEngine.Networking;
using UnityEngine.Rendering.HighDefinition;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("MyFirstPlugin")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("MyFirstPlugin")]
[assembly: AssemblyCopyright("Copyright ©  2023")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("bef4a970-cf63-4f92-a4a1-e7d8d3748309")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace ChatsRevenge
{
	[BepInPlugin("ChatsRevenge", "ChatsRevenge", "1.5.1")]
	public class Plugin : BaseUnityPlugin
	{
		public PlayerControllerB _localPlayer;

		public PlayerControllerB currentTarget;

		public Terminal terminal;

		public RoundManager currentRound;

		public SelectableLevel currentLevel;

		public pythonSocket socket = new pythonSocket();

		private const string PluginName = "ChatsRevenge";

		public const string VersionString = "1.5.1";

		public string version = "1.5.1";

		private static readonly Harmony Harmony = new Harmony("ChatsRevenge");

		private static HUDManager _hudManager;

		public static ManualLogSource Log = new ManualLogSource("ChatsRevenge");

		public IDictionary<string, GameObject> prefabs = new Dictionary<string, GameObject>();

		public IDictionary<string, AudioClip> clips = new Dictionary<string, AudioClip>();

		public IDictionary<string, GameObject> ambiants = new Dictionary<string, GameObject>();

		public IDictionary<string, GameObject> UIElements = new Dictionary<string, GameObject>();

		public List<GameObject> minesThisRound = new List<GameObject>();

		private LocalVolumetricFog[] fogs;

		private GameObject TimeAndWeather = null;

		private string SIGNATURE = "CHATSREVENGE";

		public static Plugin Instance { get; private set; }

		private void Awake()
		{
			Instance = this;
			((BaseUnityPlugin)this).Logger.LogInfo((object)"PluginName: ChatsRevenge, VersionString: 1.5.1 is loading...");
			Harmony.PatchAll();
			((BaseUnityPlugin)this).Logger.LogInfo((object)"PluginName: ChatsRevenge, VersionString: 1.5.1 is loaded.");
			Log = ((BaseUnityPlugin)this).Logger;
			PlayerPatches.plugin = this;
			pythonSocket.plugin = this;
			Harmony.PatchAll(typeof(ModUtils));
			Harmony.PatchAll(typeof(PlayerPatches));
			socket.start();
			StartLogicLoop();
		}

		private async void StartLogicLoop()
		{
			while ((Object)(object)StartOfRound.Instance == (Object)null)
			{
				await Task.Delay(1000);
			}
			((BaseUnityPlugin)this).Logger.LogInfo((object)"StartOfRound.Instance found...");
			_localPlayer = StartOfRound.Instance.localPlayerController;
			while ((Object)(object)_localPlayer == (Object)null)
			{
				await Task.Delay(250);
				_localPlayer = StartOfRound.Instance.localPlayerController;
			}
			while ((Object)(object)_hudManager == (Object)null)
			{
				await Task.Delay(250);
				_hudManager = HUDManager.Instance;
			}
			handleIncomingPings();
		}

		private void handleIncomingPings()
		{
			preAction();
			Networking.GetString = (Action<string, string>)Delegate.Combine(Networking.GetString, (Action<string, string>)delegate(string message, string signature)
			{
				OnGetData(message, signature);
			});
		}

		public void log(string message)
		{
			((BaseUnityPlugin)this).Logger.LogInfo((object)message);
		}

		public void logError(string message)
		{
			((BaseUnityPlugin)this).Logger.LogError((object)message);
		}

		public void spin()
		{
		}

		private void OnGetData(string message, string sig)
		{
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			//IL_0279: Unknown result type (might be due to invalid IL or missing references)
			//IL_02c0: Unknown result type (might be due to invalid IL or missing references)
			//IL_0331: Unknown result type (might be due to invalid IL or missing references)
			if (sig.Equals(SIGNATURE))
			{
				broadcastData broadcastData = JsonConvert.DeserializeObject<broadcastData>(message);
				if (broadcastData.command == "playsound")
				{
					Vector3 loc = default(Vector3);
					((Vector3)(ref loc))..ctor(broadcastData.x, broadcastData.y, broadcastData.z);
					PlaySoundLocal(broadcastData.text, loc);
				}
				else if (broadcastData.command == "voidItem")
				{
					voidItem(broadcastData.clientId, broadcastData.INT);
				}
				else if (broadcastData.command == "destroyHeldItem")
				{
					DestroyHeldItemLocal(broadcastData.clientId, broadcastData.INT);
				}
				else if (broadcastData.command == "ChangeWeather")
				{
					ChangeWeatherLocal((LevelWeatherType)broadcastData.INT);
				}
				else if (broadcastData.command == "AnnounceAction")
				{
					AnnounceActionLocal(broadcastData.text);
				}
				else if (broadcastData.command == "lethalcompany_dropAllItems")
				{
					DropHeldItemsLocal(broadcastData.clientId);
				}
				else if (broadcastData.command == "playsoundplayer")
				{
					PlaySoundPlayerLocationLocal(broadcastData.text, broadcastData.clientId);
				}
				else if (broadcastData.command == "giveImmunity")
				{
					giveImmunityLocal(broadcastData.clientId);
				}
				else if (broadcastData.command == "DrunkPlayer")
				{
					DrunkPlayerLocal(broadcastData.clientId, broadcastData.x);
				}
				else if (broadcastData.command == "SpawnAllVents")
				{
					SpawnAllVentsServer();
				}
				else if (broadcastData.command == "MultiplyBank")
				{
					MultiplyBankServer(broadcastData.x);
				}
				else if (broadcastData.command == "SyncBank")
				{
					SyncBank(broadcastData.INT);
				}
				else if (broadcastData.command == "SpawnEnemy")
				{
					SpawnEnemyServer(broadcastData.text, broadcastData.INT, new Vector3(broadcastData.x, broadcastData.y, broadcastData.z), broadcastData.eulerY);
				}
				else if (broadcastData.command == "SpawnGameObject")
				{
					SpawnGameObjectServer(broadcastData.text, new Vector3(broadcastData.x, broadcastData.y, broadcastData.z), broadcastData.eulerY);
				}
				else if (broadcastData.command == "")
				{
					fakeGhostLocal(broadcastData.clientId);
				}
				else if (broadcastData.command == "beamUpPlayer")
				{
					beamUpPlayerLocal(broadcastData.clientId, new Vector3(broadcastData.x, broadcastData.y, broadcastData.z), broadcastData.eulerY, broadcastData.INT == 1, broadcastData.BOOL);
				}
				else if (broadcastData.command == "despawnEnemy")
				{
					despawnEnemyLocal(broadcastData.clientId, broadcastData.BOOL);
				}
				else if (broadcastData.command == "AnnounceActionDelayed")
				{
					AnnounceActionDelayedLocal(broadcastData.text, broadcastData.INT);
				}
				else if (broadcastData.command == "leaveEarly")
				{
					leaveEarlyServer();
				}
				else if (broadcastData.command == "changeBatteries")
				{
					changeBatteries(broadcastData.clientId, broadcastData.x);
				}
				else if (broadcastData.command == "meetQuota")
				{
					meetQuotaLocal();
				}
				else if (broadcastData.command == "revive")
				{
					reviveLocal();
				}
				else if (broadcastData.command == "spawnEnemyNearPlayer")
				{
					spawnEnemyNearPlayerServer(broadcastData.clientId, broadcastData.text, broadcastData.INT);
				}
				else if (broadcastData.command == "BugInvestation")
				{
					BugInvestationServer(broadcastData.clientId);
				}
			}
		}

		public void LoadPrefabs()
		{
			GameObject[] array = Resources.FindObjectsOfTypeAll<GameObject>();
			GameObject[] array2 = array;
			foreach (GameObject val in array2)
			{
				if (((Object)val).name == "Landmine")
				{
					prefabs["landmine"] = val;
				}
			}
			GameObject[] array3 = Object.FindObjectsOfType<GameObject>();
			GameObject[] array4 = array3;
			foreach (GameObject val2 in array4)
			{
				if (val2.activeInHierarchy)
				{
					if (((Object)val2).name == "EclipseObject")
					{
						ambiants[((Object)val2).name] = val2;
						log(((Object)val2).name);
					}
					if (((Object)val2).name.ToLower().Contains("fog"))
					{
						ambiants[((Object)val2).name] = val2;
					}
					if (((Object)val2.transform).name == "TimeAndWeather")
					{
						TimeAndWeather = val2;
					}
					if (((Object)val2).name == "SprintMeter")
					{
						UIElements[((Object)val2).name] = val2;
					}
					if (((Object)val2).name == "Self")
					{
						UIElements[((Object)val2).name] = val2;
					}
					if (((Object)val2).name == "SelfRed")
					{
						UIElements[((Object)val2).name] = val2;
					}
					if (((Object)val2).name == "WeightUI")
					{
						UIElements[((Object)val2).name] = val2;
					}
					if (((Object)val2).name == "Inventory")
					{
						UIElements[((Object)val2).name] = val2;
					}
				}
			}
			AudioClip[] array5 = Resources.FindObjectsOfTypeAll<AudioClip>();
			AudioClip[] array6 = array5;
			foreach (AudioClip val3 in array6)
			{
				if (!clips.ContainsKey(((Object)val3).name))
				{
					if (((Object)val3).name == "ShipTeleporterBeam")
					{
						clips[((Object)val3).name] = val3;
					}
					if (((Object)val3).name == "ShipTeleporterBeamPlayerBody")
					{
						clips[((Object)val3).name] = val3;
					}
					if (((Object)val3).name == "TurretSeePlayer")
					{
						clips[((Object)val3).name] = val3;
					}
					if (((Object)val3).name == "Spring1")
					{
						clips[((Object)val3).name] = val3;
					}
					if (((Object)val3).name == "Spring2")
					{
						clips[((Object)val3).name] = val3;
					}
					if (((Object)val3).name == "Spring3")
					{
						clips[((Object)val3).name] = val3;
					}
					if (((Object)val3).name == "JackInTheBoxTheme")
					{
						clips[((Object)val3).name] = val3;
					}
					if (((Object)val3).name == "VoiceCry2")
					{
						clips[((Object)val3).name] = val3;
					}
					if (((Object)val3).name == "VoiceHey")
					{
						clips[((Object)val3).name] = val3;
					}
					if (((Object)val3).name == "VoiceCry")
					{
						clips[((Object)val3).name] = val3;
					}
					if (((Object)val3).name == "Laugh2")
					{
						clips[((Object)val3).name] = val3;
					}
					if (((Object)val3).name == "Breathing")
					{
						clips[((Object)val3).name] = val3;
					}
				}
			}
			if (!clips.ContainsKey("mario"))
			{
				AudioClip audioFromFile = ModUtils.GetAudioFromFile("https://audio.jukehost.co.uk/Bp1CR9Ccf7XIBN99pFWWnTLdG73ZpQXL");
				clips["mario"] = audioFromFile;
			}
		}

		public void AnnounceActionLocal(string action)
		{
			log("AnnounceActionLocal");
			HUDManager.Instance.DisplayTip("Chat's Revenge!", action, true, true, "LC_Tip1");
		}

		public void AnnounceActionDelayed(string action, int duration)
		{
			log("AnnounceActionDelayed");
			broadcastData broadcastData = new broadcastData
			{
				clientId = currentTarget.playerClientId,
				command = "AnnounceActionDelayed",
				text = action,
				INT = duration
			};
			Networking.Broadcast(JsonConvert.SerializeObject((object)broadcastData, (Formatting)0), SIGNATURE);
			AnnounceActionDelayedLocal(action, duration);
		}

		private void AnnounceActionDelayedLocal(string action, int duration)
		{
			log("AnnounceActionDelayedLocal");
			Thread thread = new Thread((ThreadStart)delegate
			{
				AnnounceActionDelayedRoutine(action, duration);
			});
			thread.IsBackground = true;
			thread.Start();
		}

		private void AnnounceActionDelayedRoutine(string action, int duration)
		{
			log("AnnounceActionDelayedRoutine");
			Thread.Sleep(duration);
			log("Thread.Sleep done");
			Instance.AnnounceActionLocal(action);
		}

		public void AnnounceAction(string action)
		{
			broadcastData broadcastData = new broadcastData
			{
				command = "AnnounceAction",
				text = action
			};
			Networking.Broadcast(JsonConvert.SerializeObject((object)broadcastData, (Formatting)0), SIGNATURE);
			AnnounceActionLocal(action);
		}

		private PlayerControllerB getPlayer(ulong clientID)
		{
			PlayerControllerB result = null;
			PlayerControllerB[] allPlayerScripts = currentRound.playersManager.allPlayerScripts;
			foreach (PlayerControllerB val in allPlayerScripts)
			{
				if (val.playerClientId == clientID)
				{
					result = val;
				}
			}
			return result;
		}

		public void DropHeldItems()
		{
			DropHeldItemsLocal(currentTarget.playerClientId);
			broadcastData broadcastData = new broadcastData
			{
				clientId = currentTarget.playerClientId,
				command = "lethalcompany_dropAllItems"
			};
			Networking.Broadcast(JsonConvert.SerializeObject((object)broadcastData, (Formatting)0), SIGNATURE);
			DropHeldItemsLocal(currentTarget.playerClientId);
		}

		private void DropHeldItemsLocal(ulong clientID)
		{
			PlayerControllerB player = getPlayer(clientID);
			if (((NetworkBehaviour)player).IsOwner)
			{
				player.DropAllHeldItems(true, false);
			}
		}

		public void DestroyHeldItem(int slot = -1)
		{
			if (playerValid())
			{
				log("destroying item");
				broadcastData broadcastData = new broadcastData
				{
					INT = slot,
					clientId = currentTarget.playerClientId,
					command = "DestroyHeldItem"
				};
				Networking.Broadcast(JsonConvert.SerializeObject((object)broadcastData, (Formatting)0), SIGNATURE);
				DestroyHeldItemLocal(currentTarget.playerClientId, slot);
			}
		}

		public void DestroyHeldItems()
		{
			int currentItemSlot = currentTarget.currentItemSlot;
			for (int i = 0; i < currentTarget.ItemSlots.Length; i++)
			{
				currentTarget.currentItemSlot = i;
				DestroyHeldItem(i);
			}
			currentTarget.isHoldingObject = false;
			currentTarget.twoHanded = false;
			currentTarget.carryWeight = 1f;
			currentTarget.currentlyHeldObjectServer = null;
			currentTarget.currentItemSlot = currentItemSlot;
		}

		public void DestroyHeldItemLocal(ulong playerID, int itemSlot)
		{
			//IL_00af: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c7: Unknown result type (might be due to invalid IL or missing references)
			PlayerControllerB val = null;
			PlayerControllerB[] allPlayerScripts = currentRound.playersManager.allPlayerScripts;
			foreach (PlayerControllerB val2 in allPlayerScripts)
			{
				if (val2.playerClientId == playerID)
				{
					val = val2;
				}
			}
			if (!((Object)(object)val == (Object)null))
			{
				if (itemSlot == -1)
				{
					itemSlot = val.currentItemSlot;
				}
				val.currentItemSlot = itemSlot;
				GrabbableObject val3 = val.ItemSlots[itemSlot];
				if ((Object)(object)val3 != (Object)null)
				{
					log("DestroyHeldItemLocal");
					val.currentlyHeldObjectServer = val3;
					val.DespawnHeldObject();
				}
				if (((NetworkBehaviour)val).IsOwner)
				{
					((Behaviour)HUDManager.Instance.holdingTwoHandedItem).enabled = false;
					((Behaviour)HUDManager.Instance.itemSlotIcons[itemSlot]).enabled = false;
					HUDManager.Instance.ClearControlTips();
				}
			}
		}

		private void voidItem(ulong clientID, int itemSlot)
		{
			//IL_0049: Unknown result type (might be due to invalid IL or missing references)
			PlayerControllerB[] allPlayerScripts = currentRound.playersManager.allPlayerScripts;
			foreach (PlayerControllerB val in allPlayerScripts)
			{
				if (val.playerClientId == clientID)
				{
					GrabbableObject val2 = val.ItemSlots[itemSlot];
					((Component)val2).transform.position = new Vector3(10000f, 10000f, 10000f);
				}
			}
		}

		private bool playerValid()
		{
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_001e: Expected O, but got Unknown
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_003c: Expected O, but got Unknown
			PlayerControllerB localPlayerController = currentRound.playersManager.localPlayerController;
			if ((Object)localPlayerController != (Object)null)
			{
				_localPlayer = localPlayerController;
			}
			return !((Object)_localPlayer == (Object)null);
		}

		public void preAction()
		{
			currentRound = RoundManager.Instance;
			currentLevel = currentRound.currentLevel;
			terminal = Object.FindObjectOfType<Terminal>();
			LoadPrefabs();
			log("starting action!");
			_localPlayer = currentRound.playersManager.localPlayerController;
			currentTarget = _localPlayer;
			if (_localPlayer.isPlayerDead)
			{
				currentTarget = _localPlayer.spectatedPlayerScript;
			}
		}

		public void PlaySound(string clipName, Vector3 loc)
		{
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0095: Unknown result type (might be due to invalid IL or missing references)
			if (playerValid())
			{
				log("PlaySound");
				broadcastData broadcastData = new broadcastData
				{
					x = loc.x,
					y = loc.y,
					z = loc.z,
					clientId = _localPlayer.playerClientId,
					command = "playsound",
					text = clipName
				};
				Networking.Broadcast(JsonConvert.SerializeObject((object)broadcastData, (Formatting)0), SIGNATURE);
				log(JsonConvert.SerializeObject((object)broadcastData, (Formatting)0));
				PlaySoundLocal(clipName, loc);
			}
		}

		public void PlaySoundLocal(string clipName, Vector3 loc)
		{
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			//IL_003c: Expected O, but got Unknown
			//IL_0042: Unknown result type (might be due to invalid IL or missing references)
			//IL_0059: Unknown result type (might be due to invalid IL or missing references)
			//IL_005f: Expected O, but got Unknown
			if (((NetworkBehaviour)_localPlayer).IsOwner)
			{
				log("PlaySoundLocal");
				AudioClip val = clips[clipName];
				GameObject val2 = new GameObject("One shot audio");
				val2.transform.position = loc;
				AudioSource val3 = (AudioSource)val2.AddComponent(typeof(AudioSource));
				val3.clip = val;
				val3.spatialBlend = 1f;
				val3.volume = 10f;
				val3.Play();
				Object.Destroy((Object)(object)val2, val.length * ((Time.timeScale < 0.01f) ? 0.01f : Time.timeScale));
			}
		}

		public void PlaySoundPlayerLocation(string clipName, ulong clientID)
		{
			if (playerValid())
			{
				broadcastData broadcastData = new broadcastData
				{
					clientId = _localPlayer.playerClientId,
					command = "playsoundplayer",
					text = clipName
				};
				Networking.Broadcast(JsonConvert.SerializeObject((object)broadcastData, (Formatting)0), SIGNATURE);
				log(JsonConvert.SerializeObject((object)broadcastData, (Formatting)0));
				PlaySoundPlayerLocationLocal(clipName, clientID);
			}
		}

		public void PlaySoundPlayerLocationLocal(string clipName, ulong clientID)
		{
			//IL_0053: Unknown result type (might be due to invalid IL or missing references)
			//IL_005a: Expected O, but got Unknown
			//IL_008b: Unknown result type (might be due to invalid IL or missing references)
			PlayerControllerB[] allPlayerScripts = currentRound.playersManager.allPlayerScripts;
			foreach (PlayerControllerB val in allPlayerScripts)
			{
				if (val.playerClientId == clientID)
				{
					try
					{
						AudioClip val2 = clips[clipName];
						AudioSource val3 = (AudioSource)((Component)val).gameObject.AddComponent(typeof(AudioSource));
						val3.clip = val2;
						val3.spatialBlend = 1f;
						val3.volume = 10f;
						((Component)val3).transform.position = ((Component)val).transform.position;
						val3.Play();
						Object.Destroy((Object)(object)val3, val2.length * ((Time.timeScale < 0.01f) ? 0.01f : Time.timeScale));
					}
					catch
					{
					}
				}
			}
		}

		public void ChangeWeather(LevelWeatherType weather)
		{
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_002b: Expected I4, but got Unknown
			//IL_002e: Unknown result type (might be due to invalid IL or missing references)
			broadcastData broadcastData = new broadcastData
			{
				clientId = _localPlayer.playerClientId,
				command = "ChangeWeather",
				INT = (int)weather
			};
			ChangeWeatherLocal(weather);
			Networking.Broadcast(JsonConvert.SerializeObject((object)broadcastData, (Formatting)0), SIGNATURE);
		}

		public void ChangeWeatherLocal(LevelWeatherType weather)
		{
			//IL_005e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0064: Invalid comparison between Unknown and I4
			//IL_01d1: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d2: Unknown result type (might be due to invalid IL or missing references)
			//IL_01dc: 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_01e2: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e4: Invalid comparison between Unknown and I4
			//IL_00a8: 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)
			//IL_01fb: Unknown result type (might be due to invalid IL or missing references)
			//IL_01fd: Invalid comparison between Unknown and I4
			//IL_010a: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e9: 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_0045: Unknown result type (might be due to invalid IL or missing references)
			//IL_0282: Unknown result type (might be due to invalid IL or missing references)
			//IL_029d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0147: Unknown result type (might be due to invalid IL or missing references)
			//IL_014d: Invalid comparison between Unknown and I4
			//IL_0130: Unknown result type (might be due to invalid IL or missing references)
			//IL_02e4: Unknown result type (might be due to invalid IL or missing references)
			//IL_02c3: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b0: Unknown result type (might be due to invalid IL or missing references)
			//IL_030a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0546: Unknown result type (might be due to invalid IL or missing references)
			//IL_054c: Invalid comparison between Unknown and I4
			//IL_03e4: Unknown result type (might be due to invalid IL or missing references)
			//IL_041b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0420: Unknown result type (might be due to invalid IL or missing references)
			//IL_042d: Unknown result type (might be due to invalid IL or missing references)
			//IL_045c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0495: Unknown result type (might be due to invalid IL or missing references)
			//IL_049a: Unknown result type (might be due to invalid IL or missing references)
			//IL_04b5: Unknown result type (might be due to invalid IL or missing references)
			//IL_04ba: Unknown result type (might be due to invalid IL or missing references)
			//IL_04d5: Unknown result type (might be due to invalid IL or missing references)
			//IL_04da: Unknown result type (might be due to invalid IL or missing references)
			//IL_04f5: Unknown result type (might be due to invalid IL or missing references)
			//IL_04fa: Unknown result type (might be due to invalid IL or missing references)
			//IL_0515: Unknown result type (might be due to invalid IL or missing references)
			//IL_051a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0535: Unknown result type (might be due to invalid IL or missing references)
			//IL_053a: Unknown result type (might be due to invalid IL or missing references)
			//IL_059e: Unknown result type (might be due to invalid IL or missing references)
			//IL_05a3: Unknown result type (might be due to invalid IL or missing references)
			//IL_0573: Unknown result type (might be due to invalid IL or missing references)
			//IL_0578: Unknown result type (might be due to invalid IL or missing references)
			//IL_0330: Unknown result type (might be due to invalid IL or missing references)
			//IL_033b: Unknown result type (might be due to invalid IL or missing references)
			//IL_05ae: Unknown result type (might be due to invalid IL or missing references)
			//IL_05b4: Invalid comparison between Unknown and I4
			//IL_061e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0624: Invalid comparison between Unknown and I4
			//IL_0632: Unknown result type (might be due to invalid IL or missing references)
			//IL_06a7: Unknown result type (might be due to invalid IL or missing references)
			//IL_06b1: Unknown result type (might be due to invalid IL or missing references)
			//IL_06b6: Unknown result type (might be due to invalid IL or missing references)
			//IL_06bb: Unknown result type (might be due to invalid IL or missing references)
			//IL_06c0: Unknown result type (might be due to invalid IL or missing references)
			//IL_06c5: Unknown result type (might be due to invalid IL or missing references)
			//IL_06d1: Unknown result type (might be due to invalid IL or missing references)
			//IL_06d3: Unknown result type (might be due to invalid IL or missing references)
			if (StartOfRound.Instance.hangarDoorsClosed && currentTarget.isInHangarShipRoom && !StartOfRound.Instance.shipHasLanded)
			{
				SelectableLevel[] levels = StartOfRound.Instance.levels;
				foreach (SelectableLevel val in levels)
				{
					val.currentWeather = weather;
				}
				return;
			}
			if ((int)TimeOfDay.Instance.currentLevelWeather != -1)
			{
				log("removing old weather " + ((object)(LevelWeatherType)(ref TimeOfDay.Instance.currentLevelWeather)).ToString());
				TimeOfDay.Instance.effects[TimeOfDay.Instance.currentLevelWeather].effectEnabled = false;
				if ((Object)(object)TimeOfDay.Instance.effects[TimeOfDay.Instance.currentLevelWeather].effectObject != (Object)null)
				{
					TimeOfDay.Instance.effects[TimeOfDay.Instance.currentLevelWeather].effectObject.SetActive(false);
				}
				if ((Object)(object)TimeOfDay.Instance.effects[TimeOfDay.Instance.currentLevelWeather].effectPermanentObject != (Object)null)
				{
					TimeOfDay.Instance.effects[TimeOfDay.Instance.currentLevelWeather].effectPermanentObject.SetActive(false);
				}
				if ((int)TimeOfDay.Instance.currentLevelWeather == 5)
				{
					ambiants["EclipseObject"].SetActive(false);
					TimeOfDay.Instance.sunDirect.colorTemperature = 4705f;
					TimeOfDay.Instance.sunDirect.useColorTemperature = false;
					HDAdditionalLightData component = ((Component)TimeOfDay.Instance.sunDirect).GetComponent<HDAdditionalLightData>();
					component.SetColor(TimeOfDay.Instance.sunDirect.color, 4705f);
					component.EnableColorTemperature(false);
				}
			}
			currentLevel.currentWeather = weather;
			TimeOfDay.Instance.currentLevelWeather = weather;
			if ((int)weather != 4)
			{
				currentTarget.isUnderwater = false;
			}
			if ((int)weather == -1)
			{
				TimeOfDay.Instance.currentWeatherVariable = 0f;
				TimeOfDay.Instance.currentWeatherVariable2 = 0f;
				RoundManager.Instance.minOutsideEnemiesToSpawn = (int)TimeOfDay.Instance.currentWeatherVariable;
				RoundManager.Instance.minEnemiesToSpawn = (int)TimeOfDay.Instance.currentWeatherVariable;
			}
			else
			{
				log("switching to new " + ((object)(LevelWeatherType)(ref weather)).ToString());
				TimeOfDay.Instance.effects[TimeOfDay.Instance.currentLevelWeather].effectEnabled = true;
				if ((Object)(object)TimeOfDay.Instance.effects[TimeOfDay.Instance.currentLevelWeather].effectObject != (Object)null)
				{
					TimeOfDay.Instance.effects[TimeOfDay.Instance.currentLevelWeather].effectObject.SetActive(true);
				}
				if ((Object)(object)TimeOfDay.Instance.effects[TimeOfDay.Instance.currentLevelWeather].effectPermanentObject != (Object)null)
				{
					TimeOfDay.Instance.effects[TimeOfDay.Instance.currentLevelWeather].effectPermanentObject.SetActive(true);
				}
				for (int j = 0; j < currentLevel.randomWeathers.Length; j++)
				{
					if (currentLevel.randomWeathers[j].weatherType == currentLevel.currentWeather)
					{
						TimeOfDay.Instance.currentWeatherVariable = currentLevel.randomWeathers[j].weatherVariable;
						TimeOfDay.Instance.currentWeatherVariable2 = currentLevel.randomWeathers[j].weatherVariable2;
					}
				}
			}
			if (TimeAndWeather.GetComponents<LocalVolumetricFog>().Length == 0)
			{
				LocalVolumetricFog val2 = TimeAndWeather.AddComponent<LocalVolumetricFog>();
				((Component)val2).transform.position = new Vector3(4.2f, 1.5f, -14.53f);
				val2.parameters.anisotropy = 0f;
				val2.parameters.albedo = new Color(0.441f, 0.459f, 0.5f, 1f);
				val2.parameters.blendingMode = (LocalVolumetricFogBlendingMode)1;
				val2.parameters.distanceFadeEnd = 10000f;
				val2.parameters.distanceFadeStart = 10000f;
				val2.parameters.falloffMode = (LocalVolumetricFogFalloffMode)1;
				val2.parameters.invertFade = false;
				val2.parameters.meanFreePath = 4f;
				val2.parameters.negativeFade = new Vector3(0f, 0.06f, 0f);
				val2.parameters.positiveFade = new Vector3(0f, 0.41f, 0f);
				val2.parameters.size = new Vector3(356f, 68.6f, 356f);
				val2.parameters.textureOffset = new Vector3(0f, 0f, 0f);
				val2.parameters.textureScrollingSpeed = new Vector3(0f, 0f, -0.7f);
				val2.parameters.textureTiling = new Vector3(1f, 1f, 1f);
			}
			if ((int)currentLevel.currentWeather == 3)
			{
				TimeAndWeather.GetComponent<LocalVolumetricFog>().parameters.size = new Vector3(356f, 68.6f, 356f);
			}
			else
			{
				TimeAndWeather.GetComponent<LocalVolumetricFog>().parameters.size = new Vector3(0.001f, 0.001f, 0.001f);
			}
			if ((int)currentLevel.currentWeather == 5)
			{
				ambiants["EclipseObject"].SetActive(true);
				HDAdditionalLightData component2 = ((Component)TimeOfDay.Instance.sunDirect).GetComponent<HDAdditionalLightData>();
				component2.EnableColorTemperature(true);
				RoundManager.Instance.minOutsideEnemiesToSpawn = (int)TimeOfDay.Instance.currentWeatherVariable;
				RoundManager.Instance.minEnemiesToSpawn = (int)TimeOfDay.Instance.currentWeatherVariable;
			}
			if ((int)TimeOfDay.Instance.currentLevelWeather == 1)
			{
				NavMeshHit val3 = default(NavMeshHit);
				Random random = new Random(StartOfRound.Instance.randomMapSeed + 2);
				int num = random.Next(5, 15);
				if (random.Next(0, 100) < 7)
				{
					num = random.Next(5, 30);
				}
				for (int k = 0; k < num; k++)
				{
					Vector3 val4 = RoundManager.Instance.GetRandomNavMeshPositionInBoxPredictable(RoundManager.Instance.outsideAINodes[random.Next(0, RoundManager.Instance.outsideAINodes.Length)].transform.position, 30f, val3, random, -1) + Vector3.up;
					GameObject val5 = Object.Instantiate<GameObject>(RoundManager.Instance.quicksandPrefab, val4, Quaternion.identity, RoundManager.Instance.mapPropsContainer.transform);
				}
			}
		}

		public void giveImmunity()
		{
			broadcastData broadcastData = new broadcastData
			{
				clientId = _localPlayer.playerClientId,
				command = "giveImmunity"
			};
			Networking.Broadcast(JsonConvert.SerializeObject((object)broadcastData, (Formatting)0), SIGNATURE);
			giveImmunityLocal(currentTarget.playerClientId);
		}

		public void giveImmunityLocal(ulong clientID)
		{
			if (((NetworkBehaviour)_localPlayer).IsOwner && _localPlayer.playerClientId == clientID)
			{
				SetImmuneLocal(on: true);
			}
		}

		public void SetImmuneLocal(bool on)
		{
			if (!_localPlayer.isPlayerDead)
			{
				if (on)
				{
					PlaySoundPlayerLocation("mario", _localPlayer.playerClientId);
					PlayerPatches.clientID = _localPlayer.playerClientId;
					PlayerPatches.immune = true;
					PlayerPatches.immuneStartTime = Time.realtimeSinceStartup;
				}
				else
				{
					PlayerPatches.immune = false;
				}
			}
		}

		public void DrunkPlayer(float drunkness = 20f)
		{
			DrunkPlayerLocal(currentTarget.playerClientId, drunkness);
			broadcastData broadcastData = new broadcastData
			{
				clientId = _localPlayer.playerClientId,
				command = "DrunkPlayer",
				x = drunkness
			};
			Networking.Broadcast(JsonConvert.SerializeObject((object)broadcastData, (Formatting)0), SIGNATURE);
		}

		public void DrunkPlayerLocal(ulong clientID, float drunkness = 20f)
		{
			PlayerControllerB player = getPlayer(clientID);
			if ((Object)(object)player != (Object)null)
			{
				currentTarget.drunkness = drunkness;
			}
		}

		public void SpawnAllVents()
		{
			SpawnAllVentsServer();
			broadcastData broadcastData = new broadcastData
			{
				clientId = _localPlayer.playerClientId,
				command = "SpawnAllVents"
			};
			Networking.Broadcast(JsonConvert.SerializeObject((object)broadcastData, (Formatting)0), SIGNATURE);
		}

		public void SpawnAllVentsServer()
		{
			if (!((NetworkBehaviour)_localPlayer).IsServer || (Object)(object)currentRound == (Object)null)
			{
				return;
			}
			for (int i = 0; i < currentRound.allEnemyVents.Length; i++)
			{
				if (!currentRound.allEnemyVents[i].occupied)
				{
					currentRound.SpawnEnemyFromVent(currentRound.allEnemyVents[i]);
				}
			}
		}

		public void buyRandomItems(int count = 4)
		{
			for (int i = 0; i < count; i++)
			{
				int item = Random.Range(0, terminal.buyableItemsList.Length);
				terminal.orderedItemsFromTerminal.Add(item);
				Terminal obj = terminal;
				obj.numberOfItemsInDropship++;
			}
			int[] array = terminal.orderedItemsFromTerminal.ToArray();
			if (!((NetworkBehaviour)terminal).IsServer && array.Length <= 12)
			{
				terminal.useCreditsCooldown = true;
				terminal.BuyItemsServerRpc(array, terminal.groupCredits, terminal.numberOfItemsInDropship);
				terminal.orderedItemsFromTerminal.Clear();
			}
		}

		public void MultiplyBank(double factor)
		{
			MultiplyBankServer(factor);
			broadcastData broadcastData = new broadcastData
			{
				clientId = _localPlayer.playerClientId,
				command = "MultiplyBank",
				x = (float)factor
			};
			Networking.Broadcast(JsonConvert.SerializeObject((object)broadcastData, (Formatting)0), SIGNATURE);
		}

		public void MultiplyBankServer(double factor)
		{
			if (((NetworkBehaviour)_localPlayer).IsServer)
			{
				terminal.groupCredits = (int)((double)Object.FindObjectOfType<Terminal>().groupCredits * factor);
				broadcastData broadcastData = new broadcastData
				{
					command = "SyncBank",
					INT = terminal.groupCredits
				};
				Networking.Broadcast(JsonConvert.SerializeObject((object)broadcastData, (Formatting)0), SIGNATURE);
			}
		}

		public void SyncBank(int credits)
		{
			terminal.groupCredits = credits;
		}

		public void BugInvestation()
		{
			bool flag = true;
			PlayerControllerB val = null;
			if (currentTarget.isInsideFactory == flag)
			{
				val = currentTarget;
			}
			if ((Object)(object)val == (Object)null)
			{
				PlayerControllerB[] allPlayerScripts = currentRound.playersManager.allPlayerScripts;
				foreach (PlayerControllerB val2 in allPlayerScripts)
				{
					if (val2.isInsideFactory == flag)
					{
						val = val2;
						break;
					}
				}
			}
			BugInvestationServer(val.playerClientId);
			broadcastData broadcastData = new broadcastData
			{
				command = "BugInvestation",
				clientId = val.playerClientId
			};
			Networking.Broadcast(JsonConvert.SerializeObject((object)broadcastData, (Formatting)0), SIGNATURE);
		}

		public void BugInvestationServer(ulong clientID)
		{
			//IL_004f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0054: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d9: Unknown result type (might be due to invalid IL or missing references)
			//IL_0093: Unknown result type (might be due to invalid IL or missing references)
			//IL_0098: Unknown result type (might be due to invalid IL or missing references)
			//IL_009c: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b8: Unknown result type (might be due to invalid IL or missing references)
			//IL_015d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0169: Unknown result type (might be due to invalid IL or missing references)
			if (!((NetworkBehaviour)_localPlayer).IsServer)
			{
				return;
			}
			PlayerControllerB player = getPlayer(clientID);
			int num = 4;
			for (int i = 0; i < num; i++)
			{
				Vector3 position = ((Component)currentRound.allEnemyVents[Random.Range(0, currentRound.allEnemyVents.Length)]).transform.position;
				float eulerY = (180 + 2 * i / num * 180) % 360;
				if ((Object)(object)player != (Object)null)
				{
					float num2 = 6.28f * (float)i / (float)num;
					position = ((Component)player).transform.position;
					position.x += 3f * Mathf.Sin(num2);
					position.z += 3f * Mathf.Cos(num2);
				}
				SpawnEnemy("hoarderbug", position, eulerY);
			}
			string[] array = new string[6] { "hoarderbug", "hoarderbug", "hoarderbug", "hoarderbug", "sandspider", "centipede" };
			EnemyVent[] allEnemyVents = currentRound.allEnemyVents;
			foreach (EnemyVent val in allEnemyVents)
			{
				SpawnEnemy(array[Random.Range(0, array.Length)], ((Component)val).transform.position, ((Component)val).transform.eulerAngles.y);
			}
		}

		public void spawnEnemyNearPlayer(string enemyName, int insd = 0)
		{
			spawnEnemyNearPlayerServer(currentTarget.playerClientId, enemyName, insd);
			broadcastData broadcastData = new broadcastData
			{
				command = "spawnEnemyNearPlayer",
				text = enemyName,
				clientId = currentTarget.playerClientId,
				INT = insd
			};
			Networking.Broadcast(JsonConvert.SerializeObject((object)broadcastData, (Formatting)0), SIGNATURE);
		}

		public void spawnEnemyNearPlayerServer(ulong clientID, string enemyName, int insd = 0)
		{
			//IL_005e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0063: Unknown result type (might be due to invalid IL or missing references)
			//IL_009c: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a3: Unknown result type (might be due to invalid IL or missing references)
			//IL_0130: Unknown result type (might be due to invalid IL or missing references)
			//IL_0135: 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_0161: Unknown result type (might be due to invalid IL or missing references)
			//IL_0166: Unknown result type (might be due to invalid IL or missing references)
			//IL_016a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0186: Unknown result type (might be due to invalid IL or missing references)
			if (!((NetworkBehaviour)_localPlayer).IsServer)
			{
				return;
			}
			PlayerControllerB val = null;
			PlayerControllerB player = getPlayer(clientID);
			bool flag = insd == 1;
			bool flag2 = insd == 0;
			log("1");
			Vector3 position = ((Component)currentRound.allEnemyVents[Random.Range(0, currentRound.allEnemyVents.Length)]).transform.position;
			log("2");
			if (flag2)
			{
				position = GameObject.FindGameObjectsWithTag("OutsideAINode")[Random.Range(0, GameObject.FindGameObjectsWithTag("OutsideAINode").Length - 1)].transform.position;
			}
			log("3");
			if (player.isInsideFactory == flag)
			{
				val = player;
			}
			if (insd == -1)
			{
				val = player;
			}
			if ((Object)(object)val == (Object)null)
			{
				PlayerControllerB[] allPlayerScripts = currentRound.playersManager.allPlayerScripts;
				foreach (PlayerControllerB val2 in allPlayerScripts)
				{
					if (val2.isInsideFactory == flag)
					{
						val = val2;
						break;
					}
				}
			}
			if ((Object)(object)val != (Object)null)
			{
				Quaternion rotation = ((Component)val).transform.rotation;
				float num = (float)((double)((Quaternion)(ref rotation)).eulerAngles.y * 3.14 / 180.0);
				position = ((Component)val).transform.position;
				position.x += 3f * Mathf.Sin(num);
				position.z += 3f * Mathf.Cos(num);
			}
			SpawnEnemy(enemyName, position);
		}

		public void spawnEnemyNearestVent(string enemyName, int amount = 1)
		{
			//IL_016f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0186: Unknown result type (might be due to invalid IL or missing references)
			//IL_018b: Unknown result type (might be due to invalid IL or missing references)
			//IL_018f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0094: Unknown result type (might be due to invalid IL or missing references)
			//IL_0099: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00be: Unknown result type (might be due to invalid IL or missing references)
			//IL_0104: Unknown result type (might be due to invalid IL or missing references)
			//IL_0109: Unknown result type (might be due to invalid IL or missing references)
			//IL_010b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0110: Unknown result type (might be due to invalid IL or missing references)
			int num = Random.Range(0, currentRound.allEnemyVents.Length);
			PlayerControllerB val = null;
			if (currentTarget.isInsideFactory)
			{
				val = currentTarget;
			}
			else
			{
				PlayerControllerB[] allPlayerScripts = currentRound.playersManager.allPlayerScripts;
				foreach (PlayerControllerB val2 in allPlayerScripts)
				{
					if (val2.isInsideFactory && !val2.isPlayerDead)
					{
						val = val2;
						break;
					}
				}
			}
			if ((Object)(object)val != (Object)null)
			{
				Vector3 position = ((Component)val).transform.position;
				float num2 = 0f;
				if (position.x == -10f && position.y == -10f && position.z == -10f)
				{
					num = Random.Range(0, currentRound.allEnemyVents.Length);
				}
				else
				{
					for (int j = 0; j < currentRound.allEnemyVents.Length; j++)
					{
						Vector3 val3 = currentRound.allEnemyVents[j].floorNode.position - position;
						float magnitude = ((Vector3)(ref val3)).magnitude;
						if (magnitude < num2 || num2 == 0f)
						{
							num2 = magnitude;
							num = j;
						}
					}
				}
			}
			Vector3 position2 = ((Component)currentRound.allEnemyVents[num]).transform.position;
			Quaternion rotation = ((Component)currentRound.allEnemyVents[num]).transform.rotation;
			SpawnEnemy(enemyName, position2, ((Quaternion)(ref rotation)).eulerAngles.y, amount);
		}

		public void SpawnMine()
		{
			//IL_000c: 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)
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			//IL_0040: Unknown result type (might be due to invalid IL or missing references)
			//IL_0045: Unknown result type (might be due to invalid IL or missing references)
			//IL_0048: Unknown result type (might be due to invalid IL or missing references)
			//IL_0062: Unknown result type (might be due to invalid IL or missing references)
			//IL_0080: Unknown result type (might be due to invalid IL or missing references)
			//IL_008c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0091: Unknown result type (might be due to invalid IL or missing references)
			//IL_0094: Unknown result type (might be due to invalid IL or missing references)
			Quaternion rotation = ((Component)currentTarget).transform.rotation;
			float num = (float)((double)((Quaternion)(ref rotation)).eulerAngles.y * 3.14 / 180.0);
			Vector3 position = ((Component)currentTarget).transform.position;
			position.x += 3f * Mathf.Sin(num);
			position.z += 3f * Mathf.Cos(num);
			Vector3 loc = position;
			rotation = ((Component)currentTarget).transform.rotation;
			SpawnGameObject("landmine", loc, ((Quaternion)(ref rotation)).eulerAngles.y);
		}

		private void SpawnEnemy(string enemyNmae, Vector3 loc, float eulerY = 0f, int amount = 1)
		{
			//IL_0005: 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_0045: Unknown result type (might be due to invalid IL or missing references)
			//IL_0052: Unknown result type (might be due to invalid IL or missing references)
			SpawnEnemyServer(enemyNmae, amount, loc, eulerY);
			broadcastData broadcastData = new broadcastData
			{
				command = "SpawnEnemy",
				eulerY = eulerY,
				INT = amount,
				text = enemyNmae,
				x = loc.x,
				y = loc.y,
				z = loc.z
			};
			Networking.Broadcast(JsonConvert.SerializeObject((object)broadcastData, (Formatting)0), SIGNATURE);
		}

		private void SpawnEnemyServer(string enemyName, int amount, Vector3 loc, float eulerY = 0f)
		{
			//IL_0115: Unknown result type (might be due to invalid IL or missing references)
			//IL_011a: Unknown result type (might be due to invalid IL or missing references)
			if (!((NetworkBehaviour)_localPlayer).IsServer)
			{
				return;
			}
			log("spawning " + enemyName);
			EnemyType val = null;
			foreach (SpawnableEnemyWithRarity outsideEnemy in currentLevel.OutsideEnemies)
			{
				if (((Object)outsideEnemy.enemyType.enemyPrefab).name.ToLower() == enemyName.ToLower())
				{
					val = outsideEnemy.enemyType;
				}
			}
			if ((Object)(object)val == (Object)null)
			{
				foreach (SpawnableEnemyWithRarity enemy in currentLevel.Enemies)
				{
					if (((Object)enemy.enemyType.enemyPrefab).name.ToLower() == enemyName.ToLower())
					{
						val = enemy.enemyType;
					}
				}
			}
			try
			{
				for (int i = 0; i < amount; i++)
				{
					currentRound.SpawnEnemyGameObject(loc, eulerY, -1, val);
				}
			}
			catch (Exception ex)
			{
				((BaseUnityPlugin)this).Logger.LogInfo((object)("Failed to spawn enemies. " + ex.ToString()));
			}
		}

		private void moveEnemy(EnemyAI enemy, Vector3 loc, float eulerY)
		{
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: 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_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)
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0040: Unknown result type (might be due to invalid IL or missing references)
			//IL_0052: Unknown result type (might be due to invalid IL or missing references)
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0064: 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_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0073: Unknown result type (might be due to invalid IL or missing references)
			//IL_0085: Unknown result type (might be due to invalid IL or missing references)
			//IL_0092: Unknown result type (might be due to invalid IL or missing references)
			//IL_0097: Unknown result type (might be due to invalid IL or missing references)
			//IL_009a: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a6: Unknown result type (might be due to invalid IL or missing references)
			log("moving enemy");
			enemy.serverPosition = loc;
			enemy.agent.Warp(loc);
			Vector3 position = ((Component)enemy).gameObject.transform.position;
			((Vector3)(ref position)).Set(loc.x, loc.y, loc.z);
			((Component)enemy).transform.position = loc;
			position = ((Component)enemy).transform.position;
			((Vector3)(ref position)).Set(loc.x, loc.y, loc.z);
			((Component)enemy).transform.position = loc;
			position = ((Component)enemy).transform.position;
			((Vector3)(ref position)).Set(loc.x, loc.y, loc.z);
		}

		private void SpawnGameObject(string objectName, Vector3 loc, float eulerY = 0f)
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0047: Unknown result type (might be due to invalid IL or missing references)
			SpawnGameObjectServer(objectName, loc, eulerY);
			broadcastData broadcastData = new broadcastData
			{
				command = "SpawnGameObject",
				eulerY = eulerY,
				text = objectName,
				x = loc.x,
				y = loc.y,
				z = loc.z
			};
			Networking.Broadcast(JsonConvert.SerializeObject((object)broadcastData, (Formatting)0), SIGNATURE);
		}

		private void SpawnGameObjectServer(string objectName, Vector3 loc, float eulerY = 0f)
		{
			//IL_0020: 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_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			if (!((NetworkBehaviour)_localPlayer).IsServer)
			{
				return;
			}
			Quaternion val = Quaternion.Euler(0f, eulerY, 0f);
			GameObject val2 = Object.Instantiate<GameObject>(prefabs[objectName], loc, val);
			if (!((Object)(object)val2 != (Object)null))
			{
				return;
			}
			try
			{
				val2.GetComponent<NetworkObject>().Spawn(true);
				minesThisRound.Add(val2);
			}
			catch
			{
			}
		}

		public void beamUpPlayer(ulong playerID, bool teleport = true, bool toShip = true)
		{
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_0238: Unknown result type (might be due to invalid IL or missing references)
			//IL_025c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0269: Unknown result type (might be due to invalid IL or missing references)
			//IL_0276: 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)
			//IL_00c8: Unknown result type (might be due to invalid IL or missing references)
			//IL_0199: Unknown result type (might be due to invalid IL or missing references)
			//IL_019e: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a2: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d8: Unknown result type (might be due to invalid IL or missing references)
			//IL_01dd: Unknown result type (might be due to invalid IL or missing references)
			//IL_0131: Unknown result type (might be due to invalid IL or missing references)
			//IL_0136: Unknown result type (might be due to invalid IL or missing references)
			//IL_013a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0174: Unknown result type (might be due to invalid IL or missing references)
			//IL_0179: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e1: Unknown result type (might be due to invalid IL or missing references)
			//IL_01fb: Unknown result type (might be due to invalid IL or missing references)
			Vector3 position = StartOfRound.Instance.playerSpawnPositions[0].position;
			float num = 0f;
			bool flag = false;
			float eulerY = 0f;
			if (!toShip)
			{
				EnemyVent[] allEnemyVents = currentRound.allEnemyVents;
				List<DoorLock> list = Object.FindObjectsOfType<DoorLock>().ToList();
				List<DoorLock> list2 = new List<DoorLock>();
				foreach (DoorLock item in list)
				{
					if (!item.isLocked)
					{
						list2.Add(item);
					}
				}
				if (Random.Range(0, 100) <= 5 && StartOfRound.Instance.shipHasLanded)
				{
					position = StartOfRound.Instance.playerSpawnPositions[0].position;
					flag = false;
				}
				else if (RoundManager.Instance.insideAINodes.Length != 0)
				{
					flag = true;
					Quaternion rotation;
					if (Random.Range(0, list2.Count + allEnemyVents.Length - 1) < list2.Count)
					{
						int index = Random.Range(0, list2.Count);
						rotation = ((Component)list2[index]).gameObject.transform.rotation;
						num = (float)((double)(((Quaternion)(ref rotation)).eulerAngles.y - 90f) * 3.14 / 180.0);
						position = ((Component)list2[index]).gameObject.transform.position;
					}
					else
					{
						int num2 = Random.Range(0, allEnemyVents.Length);
						rotation = ((Component)allEnemyVents[num2]).gameObject.transform.rotation;
						num = (float)((double)(((Quaternion)(ref rotation)).eulerAngles.y - 90f) * 3.14 / 180.0);
						position = ((Component)allEnemyVents[num2]).gameObject.transform.position;
					}
					position.x += 1f * Mathf.Sin(num);
					position.z += 1f * Mathf.Cos(num);
					eulerY = (float)((double)(num * 180f) / 3.14);
				}
			}
			int iNT = 0;
			if (flag)
			{
				iNT = 1;
			}
			beamUpPlayerLocal(playerID, position, eulerY, flag, teleport);
			broadcastData broadcastData = new broadcastData
			{
				command = "beamUpPlayer",
				clientId = playerID,
				x = position.x,
				y = position.y,
				z = position.z,
				INT = iNT,
				BOOL = teleport,
				eulerY = eulerY
			};
			Networking.Broadcast(JsonConvert.SerializeObject((object)broadcastData, (Formatting)0), SIGNATURE);
		}

		private void beamUpPlayerLocal(ulong playerID, Vector3 loc, float eulerY, bool inside, bool teleport = true)
		{
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			Thread thread = new Thread((ThreadStart)delegate
			{
				//IL_000d: Unknown result type (might be due to invalid IL or missing references)
				beamUpPlayerRoutine(playerID, loc, eulerY, inside, teleport);
			});
			thread.IsBackground = true;
			thread.Start();
		}

		private void beamUpPlayerRoutine(ulong playerID, Vector3 loc, float eulerY, bool inside, bool teleport = true)
		{
			//IL_0059: Unknown result type (might be due to invalid IL or missing references)
			try
			{
				PlayerControllerB player = getPlayer(playerID);
				player.beamUpParticle.Play();
				player.movementAudio.PlayOneShot(clips["ShipTeleporterBeamPlayerBody"]);
			}
			catch
			{
				log("error playing teleport sfx");
			}
			Thread.Sleep(3000);
			if (teleport)
			{
				teleportPlayer(playerID, loc, eulerY, inside);
			}
		}

		private void teleportPlayer(ulong playerID, Vector3 loc, float eulerY, bool inside)
		{
			//IL_0056: Unknown result type (might be due to invalid IL or missing references)
			//IL_005b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0061: Unknown result type (might be due to invalid IL or missing references)
			PlayerControllerB player = getPlayer(playerID);
			if (Object.op_Implicit((Object)(object)Object.FindObjectOfType<AudioReverbPresets>()))
			{
				Object.FindObjectOfType<AudioReverbPresets>().audioPresets[3].ChangeAudioReverbForPlayer(player);
			}
			player.isInElevator = !inside;
			player.isInHangarShipRoom = !inside;
			player.isInsideFactory = inside;
			player.averageVelocity = 0f;
			player.velocityLastFrame = Vector3.zero;
			player.TeleportPlayer(loc, true, eulerY, false, true);
			player.isInsideFactory = inside;
			if (inside && Object.op_Implicit((Object)(object)Object.FindObjectOfType<AudioReverbPresets>()))
			{
				Object.FindObjectOfType<AudioReverbPresets>().audioPresets[2].ChangeAudioReverbForPlayer(player);
			}
			for (int i = 0; i < player.ItemSlots.Length; i++)
			{
				if ((Object)(object)player.ItemSlots[i] != (Object)null)
				{
					player.ItemSlots[i].isInFactory = inside;
				}
			}
			Debug.Log((object)"Teleport B");
			player.movementAudio.PlayOneShot(clips["ShipTeleporterBeam"]);
			if (GameNetworkManager.Instance.localPlayerController.isInHangarShipRoom)
			{
				HUDManager.Instance.ShakeCamera((ScreenShakeType)1);
			}
		}

		public void fakeGhost()
		{
			ulong playerClientId = currentTarget.playerClientId;
			fakeGhostLocal(playerClientId);
			broadcastData broadcastData = new broadcastData
			{
				command = "fakeGhost",
				clientId = playerClientId
			};
			Networking.Broadcast(JsonConvert.SerializeObject((object)broadcastData, (Formatting)0), SIGNATURE);
		}

		private void fakeGhostLocal(ulong clientID)
		{
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0080: Unknown result type (might be due to invalid IL or missing references)
			//IL_009a: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
			if (_localPlayer.playerClientId == clientID)
			{
				RoundManager.Instance.FlickerLights(true, true);
				string[] array = new string[4] { "VoiceCry2", "VoiceHey", "Breathing", "Laugh2" };
				string clipName = array[Random.Range(0, array.Length)];
				Vector3 position = ((Component)_localPlayer).transform.position;
				float num = Random.Range(0f, 3.14f);
				position.x += 1f * Mathf.Sin(num);
				position.z += 1f * Mathf.Cos(num);
				PlaySoundLocal(clipName, position);
			}
		}

		public void despawnNearestEnemy(bool real = true)
		{
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_0041: Unknown result type (might be due to invalid IL or missing references)
			//IL_0046: Unknown result type (might be due to invalid IL or missing references)
			//IL_004b: Unknown result type (might be due to invalid IL or missing references)
			//IL_004f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0056: Unknown result type (might be due to invalid IL or missing references)
			//IL_0063: Unknown result type (might be due to invalid IL or missing references)
			EnemyAI val = null;
			float num = -1f;
			foreach (EnemyAI spawnedEnemy in currentRound.SpawnedEnemies)
			{
				Vector3 val2 = ((Component)spawnedEnemy).gameObject.transform.position - ((Component)currentTarget).transform.position;
				((Vector3)(ref val2)).Set(val2.x, val2.y * 2f, val2.z);
				float magnitude = ((Vector3)(ref val2)).magnitude;
				if (magnitude < num || (Object)(object)val == (Object)null)
				{
					num = magnitude;
					val = spawnedEnemy;
				}
			}
			if ((Object)(object)val != (Object)null)
			{
				despawnEnemyLocal(((NetworkBehaviour)val).NetworkObjectId, real);
				broadcastData broadcastData = new broadcastData
				{
					command = "despawnEnemy",
					clientId = ((NetworkBehaviour)val).NetworkObjectId,
					BOOL = real
				};
				Networking.Broadcast(JsonConvert.SerializeObject((object)broadcastData, (Formatting)0), SIGNATURE);
			}
		}

		private void despawnEnemyLocal(ulong enemyID, bool real)
		{
			log("despawnEnemyLocal, enemyID " + enemyID);
			Thread thread = new Thread((ThreadStart)delegate
			{
				despawnEnemyLocalRoutine(enemyID, real);
			});
			thread.IsBackground = true;
			thread.Start();
		}

		private void copyParticleSystem(ref ParticleSystem origin, ref ParticleSystem target)
		{
			//IL_0021: 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)
			//IL_005b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0066: Unknown result type (might be due to invalid IL or missing references)
			//IL_0072: Unknown result type (might be due to invalid IL or missing references)
			//IL_0080: Unknown result type (might be due to invalid IL or missing references)
			//IL_008d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0092: Unknown result type (might be due to invalid IL or missing references)
			//IL_0098: Unknown result type (might be due to invalid IL or missing references)
			//IL_009d: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00be: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ee: 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_0106: Unknown result type (might be due to invalid IL or missing references)
			//IL_0119: Unknown result type (might be due to invalid IL or missing references)
			//IL_011e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0131: Unknown result type (might be due to invalid IL or missing references)
			//IL_0136: Unknown result type (might be due to invalid IL or missing references)
			//IL_0149: Unknown result type (might be due to invalid IL or missing references)
			//IL_014e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0152: Unknown result type (might be due to invalid IL or missing references)
			//IL_0161: Unknown result type (might be due to invalid IL or missing references)
			//IL_0166: Unknown result type (might be due to invalid IL or missing references)
			//IL_016a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0179: Unknown result type (might be due to invalid IL or missing references)
			//IL_017e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0182: Unknown result type (might be due to invalid IL or missing references)
			//IL_0191: Unknown result type (might be due to invalid IL or missing references)
			//IL_0196: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a9: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ae: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c1: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c6: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ca: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d9: Unknown result type (might be due to invalid IL or missing references)
			//IL_01de: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e2: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f1: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f6: Unknown result type (might be due to invalid IL or missing references)
			//IL_01fa: Unknown result type (might be due to invalid IL or missing references)
			//IL_0209: Unknown result type (might be due to invalid IL or missing references)
			//IL_020e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0212: Unknown result type (might be due to invalid IL or missing references)
			//IL_0221: Unknown result type (might be due to invalid IL or missing references)
			//IL_0226: Unknown result type (might be due to invalid IL or missing references)
			//IL_022a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0239: Unknown result type (might be due to invalid IL or missing references)
			//IL_023e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0242: Unknown result type (might be due to invalid IL or missing references)
			//IL_0251: Unknown result type (might be due to invalid IL or missing references)
			//IL_0256: Unknown result type (might be due to invalid IL or missing references)
			//IL_0269: Unknown result type (might be due to invalid IL or missing references)
			//IL_026e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0272: Unknown result type (might be due to invalid IL or missing references)
			//IL_0281: Unknown result type (might be due to invalid IL or missing references)
			//IL_0286: Unknown result type (might be due to invalid IL or missing references)
			//IL_028a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0299: Unknown result type (might be due to invalid IL or missing references)
			//IL_029e: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b1: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b6: Unknown result type (might be due to invalid IL or missing references)
			((Component)target).GetComponent<Renderer>().material = ((Component)origin).GetComponent<Renderer>().material;
			List<Vector4> list = new List<Vector4>();
			ParticleSystemCustomData val = (ParticleSystemCustomData)0;
			origin.GetCustomParticleData(list, val);
			target.SetCustomParticleData(list, val);
			Particle[] array = (Particle[])(object)new Particle[5];
			int num = 0;
			int num2 = 0;
			origin.GetParticles(array, num, num2);
			target.SetParticles(array, num, num2);
			ParticleSystemTriggerEventType val2 = (ParticleSystemTriggerEventType)0;
			List<Particle> list2 = new List<Particle>();
			ParticlePhysicsExtensions.GetTriggerParticles(origin, val2, list2);
			ParticlePhysicsExtensions.SetTriggerParticles(target, val2, list2);
			target.SetPlaybackState(origin.GetPlaybackState());
			EmissionModule emission = target.emission;
			EmissionModule emission2 = origin.emission;
			((EmissionModule)(ref emission)).rateOverTime = ((EmissionModule)(ref emission2)).rateOverTime;
			MainModule main = target.main;
			MainModule main2 = origin.main;
			((MainModule)(ref main)).simulationSpace = ((MainModule)(ref main2)).simulationSpace;
			main2 = origin.main;
			((MainModule)(ref main)).playOnAwake = ((MainModule)(ref main2)).playOnAwake;
			main2 = origin.main;
			((MainModule)(ref main)).customSimulationSpace = ((MainModule)(ref main2)).customSimulationSpace;
			main2 = origin.main;
			((MainModule)(ref main)).maxParticles = ((MainModule)(ref main2)).maxParticles;
			main2 = origin.main;
			((MainModule)(ref main)).duration = ((MainModule)(ref main2)).duration;
			main2 = origin.main;
			((MainModule)(ref main)).loop = ((MainModule)(ref main2)).loop;
			main2 = origin.main;
			((MainModule)(ref main)).startLifetime = ((MainModule)(ref main2)).startLifetime;
			main2 = origin.main;
			((MainModule)(ref main)).startDelay = ((MainModule)(ref main2)).startDelay;
			main2 = origin.main;
			((MainModule)(ref main)).startSpeed = ((MainModule)(ref main2)).startSpeed;
			main2 = origin.main;
			((MainModule)(ref main)).startRotation3D = ((MainModule)(ref main2)).startRotation3D;
			main2 = origin.main;
			((MainModule)(ref main)).startSize3D = ((MainModule)(ref main2)).startSize3D;
			main2 = origin.main;
			((MainModule)(ref main)).startSize = ((MainModule)(ref main2)).startSize;
			main2 = origin.main;
			((MainModule)(ref main)).emitterVelocityMode = ((MainModule)(ref main2)).emitterVelocityMode;
			main2 = origin.main;
			((MainModule)(ref main)).emitterVelocity = ((MainModule)(ref main2)).emitterVelocity;
			main2 = origin.main;
			((MainModule)(ref main)).ringBufferMode = ((MainModule)(ref main2)).ringBufferMode;
			main2 = origin.main;
			((MainModule)(ref main)).ringBufferLoopRange = ((MainModule)(ref main2)).ringBufferLoopRange;
			main2 = origin.main;
			((MainModule)(ref main)).gravityModifier = ((MainModule)(ref main2)).gravityModifier;
			main2 = origin.main;
			((MainModule)(ref main)).gravityModifierMultiplier = ((MainModule)(ref main2)).gravityModifierMultiplier;
			main2 = origin.main;
			((MainModule)(ref main)).gravitySource = ((MainModule)(ref main2)).gravitySource;
			main2 = origin.main;
			((MainModule)(ref main)).scalingMode = ((MainModule)(ref main2)).scalingMode;
			main2 = origin.main;
			((MainModule)(ref main)).useUnscaledTime = ((MainModule)(ref main2)).useUnscaledTime;
			main2 = origin.main;
			((MainModule)(ref main)).simulationSpeed = ((MainModule)(ref main2)).simulationSpeed;
		}

		private void despawnEnemyLocalRoutine(ulong enemyID, bool real)
		{
			//IL_0153: Unknown result type (might be due to invalid IL or missing references)
			//IL_0081: Unknown result type (might be due to invalid IL or missing references)
			//IL_0095: Unknown result type (might be due to invalid IL or missing references)
			//IL_009a: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a4: Unknown result type (might be due to invalid IL or missing references)
			log("despawnEnemyLocalRoutine, enemyID " + enemyID);
			EnemyAI[] array = Object.FindObjectsOfType<EnemyAI>();
			EnemyAI[] array2 = array;
			foreach (EnemyAI val in array2)
			{
				if (((NetworkBehaviour)val).NetworkObjectId != enemyID)
				{
					continue;
				}
				log("despawnEnemyLocalRoutine, enemy found");
				try
				{
					ParticleSystem target = ((Component)val).gameObject.AddComponent<ParticleSystem>();
					copyParticleSystem(ref _localPlayer.beamUpParticle, ref target);
					((Component)target).transform.localPosition = ((Component)target).transform.localPosition + new Vector3(0f, 1f, 0f);
					target.Play();
					val.creatureSFX.PlayOneShot(clips["ShipTeleporterBeamPlayerBody"]);
				}
				catch
				{
					((BaseUnityPlugin)this).Logger.LogError((object)"error playing kill animation");
				}
				if (real)
				{
					Thread.Sleep(3000);
					bool flag = ((Object)val.enemyType.enemyPrefab).name.ToLower() == "nutcrackerenemy";
					if (flag)
					{
						log("Dropping gun");
						((GrabbableObject)((Component)val).GetComponent<NutcrackerEnemyAI>().gun).DiscardItemFromEnemy();
					}
					else
					{
						moveEnemy(val, new Vector3(1000f, 1000f, 1000f), 0f);
					}
					if (((NetworkBehaviour)_localPlayer).IsServer)
					{
						val.KillEnemy(flag);
					}
					else if (flag)
					{
						val.KillEnemy(flag);
					}
					else
					{
						moveEnemy(val, new Vector3(1000f, 1000f, 1000f), 0f);
					}
				}
				break;
			}
		}

		public void leaveEarly()
		{
			leaveEarlyServer();
			broadcastData broadcastData = new broadcastData
			{
				command = "leaveEarly"
			};
			Networking.Broadcast(JsonConvert.SerializeObject((object)broadcastData, (Formatting)0), SIGNATURE);
		}

		private void leaveEarlyServer()
		{
			if (((NetworkBehaviour)_localPlayer).IsServer)
			{
				TimeOfDay.Instance.SetShipLeaveEarlyClientRpc(TimeOfDay.Instance.normalizedTimeOfDay + 0.1f, TimeOfDay.Instance.votesForShipToLeaveEarly);
			}
		}

		public void changeBatteries(ulong playerID, float charge)
		{
			broadcastData broadcastData = new broadcastData
			{
				command = "changeBatteries",
				clientId = playerID,
				x = charge
			};
			Networking.Broadcast(JsonConvert.SerializeObject((object)broadcastData, (Formatting)0), SIGNATURE);
			changeBatteriesLocal(playerID, charge);
		}

		private void changeBatteriesLocal(ulong playerID, float charge)
		{
			PlayerControllerB player = getPlayer(playerID);
			int currentItemSlot = player.currentItemSlot;
			for (int i = 0; i < player.ItemSlots.Length; i++)
			{
				GrabbableObject val = player.ItemSlots[i];
				if (val.insertedBattery != null)
				{
					val.insertedBattery.charge = charge;
					if (charge > 0f)
					{
						val.insertedBattery.empty = false;
					}
					else
					{
						val.insertedBattery.empty = true;
					}
				}
			}
		}

		public void revive()
		{
			reviveLocal();
			broadcastData broadcastData = new broadcastData
			{
				command = "revive"
			};
			Networking.Broadcast(JsonConvert.SerializeObject((object)broadcastData, (Formatting)0), SIGNATURE);
		}

		public void reviveLocal()
		{
			StartOfRound.Instance.ReviveDeadPlayers();
			HUDManager.Instance.HideHUD(false);
			foreach (KeyValuePair<string, GameObject> uIElement in Instance.UIElements)
			{
				uIElement.Value.SetActive(true);
			}
		}

		public void meetQuota()
		{
			broadcastData broadcastData = new broadcastData
			{
				command = "meetQuota"
			};
			Networking.Broadcast(JsonConvert.SerializeObject((object)broadcastData, (Formatting)0), SIGNATURE);
			meetQuotaLocal();
		}

		public void meetQuotaLocal()
		{
			if (TimeOfDay.Instance.profitQuota > TimeOfDay.Instance.quotaFulfilled)
			{
				TimeOfDay.Instance.quotaFulfilled = TimeOfDay.Instance.profitQuota;
				((TMP_Text)StartOfRound.Instance.profitQuotaMonitorText).text = $"PROFIT QUOTA:\n${TimeOfDay.Instance.profitQuota} / ${TimeOfDay.Instance.profitQuota}";
			}
		}
	}
}
namespace ChatsRevenge.Utils
{
	internal static class ModUtils
	{
		public static AudioClip GetAudioFromFile(string audiopath)
		{
			UnityWebRequest audioClip = UnityWebRequestMultimedia.GetAudioClip(audiopath, (AudioType)13);
			audioClip.SendWebRequest();
			while (!audioClip.isDone)
			{
			}
			return DownloadHandlerAudioClip.GetContent(audioClip);
		}
	}
	[JsonObject]
	internal class broadcastData
	{
		[JsonProperty]
		public string command { get; set; }

		[JsonProperty]
		public string text { get; set; }

		[JsonProperty]
		public bool BOOL { get; set; }

		public int INT { get; set; }

		[JsonProperty]
		public float x { get; set; }

		[JsonProperty]
		public float y { get; set; }

		[JsonProperty]
		public float z { get; set; }

		[JsonProperty]
		public float eulerY { get; set; }

		[JsonProperty]
		public ulong clientId { get; set; }
	}
	public class pythonSocket : MonoBehaviour
	{
		[SerializeField]
		private string IP = "127.0.0.1";

		[SerializeField]
		private int rxPort = 7885;

		[SerializeField]
		private int txPort = 7886;

		private int indx = -1;

		private UdpClient client;

		private IPEndPoint pythonHost;

		private Thread readDataThread;

		public string currentCMD = "";

		public static Plugin plugin { get; set; }

		public void SendData(string message)
		{
			try
			{
				byte[] bytes = Encoding.UTF8.GetBytes(message);
				client.Send(bytes, bytes.Length, pythonHost);
			}
			catch (Exception ex)
			{
				plugin.log(ex.ToString());
			}
		}

		public void start()
		{
			pythonHost = new IPEndPoint(IPAddress.Parse(IP), txPort);
			client = new UdpClient(rxPort);
			readDataThread = new Thread(readData);
			readDataThread.IsBackground = true;
			readDataThread.Start();
		}

		public void OnDestroy()
		{
			client.Close();
		}

		private void readData()
		{
			while (true)
			{
				try
				{
					IPEndPoint remoteEP = new IPEndPoint(IPAddress.Any, 0);
					byte[] bytes = client.Receive(ref remoteEP);
					string @string = Encoding.UTF8.GetString(bytes);
					string[] array = @string.Split(new char[1] { ';' });
					int num = int.Parse(array[0]);
					string text = array[1];
					string text2 = array[2];
					string text3 = array[3];
					if (text.Contains("lethalcompany"))
					{
						if (indx == -1 || (indx != num && num == 0))
						{
							indx = num;
							SendData("lethalcompany " + Plugin.Instance.version);
						}
						else if (num != indx)
						{
							indx = num;
							currentCMD = @string;
						}
					}
				}
				catch (Exception ex)
				{
					Plugin.Instance.log(ex.ToString());
				}
			}
		}
	}
}
namespace ChatsRevenge.Patches
{
	[HarmonyPatch(typeof(PlayerControllerB))]
	internal class PlayerPatches
	{
		public static bool immune { get; set; }

		public static ulong clientID { get; set; }

		public static float immuneDuration { get; set; } = 16.5f;


		public static float immuneStartTime { get; set; }

		public static Plugin plugin { get; set; }

		private static void ProcessInput(string input)
		{
			//IL_0112: Unknown result type (might be due to invalid IL or missing references)
			//IL_0117: Unknown result type (might be due to invalid IL or missing references)
			//IL_012c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0148: Unknown result type (might be due to invalid IL or missing references)
			//IL_016c: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ba: Unknown result type (might be due to invalid IL or missing references)
			//IL_01bf: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d4: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f0: Unknown result type (might be due to invalid IL or missing references)
			//IL_0211: Unknown result type (might be due to invalid IL or missing references)
			//IL_0240: Unknown result type (might be due to invalid IL or missing references)
			//IL_0245: Unknown result type (might be due to invalid IL or missing references)
			//IL_025a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0276: Unknown result type (might be due to invalid IL or missing references)
			//IL_029a: Unknown result type (might be due to invalid IL or missing references)
			string[] array = input.Split(new char[1] { ';' });
			int num = int.Parse(array[0]);
			string text = array[1];
			string text2 = array[2];
			string text3 = array[3];
			Plugin.Instance.preAction();
			bool flag = true;
			Plugin.Instance.log(input);
			if (text == "lethalcompany_fakeAction")
			{
				string[] array2 = new string[15]
				{
					"lethalcompany_spawnMine", "lethalcompany_doubleCredits", "lethalcompany_halfCredits", "lethalcompany_bugs", "lethalcompany_lootbox", "lethalcompany_vents", "lethalcompany_clearweather", "lethalcompany_teleportShip", "lethalcompany_immunity", "lethalcompany_spawnJester",
					"lethalcompany_spawnBracken", "lethalcompany_spawnSpider", "lethalcompany_spawnCoilheads", "lethalcompany_teleport", "lethalcompany_killEnemy"
				};
				text = array2[Random.Range(0, array2.Length)];
				flag = false;
			}
			switch (text)
			{
			case "lethalcompany_turretSound":
			{
				Vector3 position2 = ((Component)Plugin.Instance.currentTarget).transform.position;
				float num3 = Random.Range(0f, 3.14f);
				position2.x += 3f * Mathf.Sin(num3);
				position2.z += 3f * Mathf.Cos(num3);
				Plugin.Instance.PlaySound("TurretSeePlayer", position2);
				break;
			}
			case "lethalcompany_coilheadSound":
			{
				string clipName = "Spring" + Random.Range(1, 4);
				Vector3 position3 = ((Component)Plugin.Instance.currentTarget).transform.position;
				float num4 = Random.Range(0f, 3.14f);
				position3.x += 1f * Mathf.Sin(num4);
				position3.z += 1f * Mathf.Cos(num4);
				Plugin.Instance.PlaySound(clipName, position3);
				break;
			}
			case "lethalcompany_jesterSound":
			{
				Vector3 position = ((Component)Plugin.Instance.currentTarget).transform.position;
				float num2 = Random.Range(0f, 3.14f);
				position.x += 3f * Mathf.Sin(num2);
				position.z += 3f * Mathf.Cos(num2);
				Plugin.Instance.PlaySound("JackInTheBoxTheme", position);
				break;
			}
			case "lethalcompany_girlSound":
				Plugin.Instance.fakeGhost();
				break;
			case "lethalcompany_destroyAllItem":
				Plugin.Instance.DestroyHeldItems();
				Plugin.Instance.AnnounceAction("Viewer " + text2 + " of " + text3 + " destroyed " + Plugin.Instance.currentTarget.playerUsername + "'s items!");
				break;
			case "lethalcompany_destroyCurrentItem":
				Plugin.Instance.DestroyHeldItem();
				Plugin.Instance.AnnounceAction("Viewer " + text2 + " of " + text3 + " destroyed " + Plugin.Instance.currentTarget.playerUsername + "'s current item!");
				break;
			case "lethalcompany_dropAllItems":
				Plugin.Instance.DropHeldItems();
				Plugin.Instance.AnnounceAction("Viewer " + text2 + " of " + text3 + " made " + Plugin.Instance.currentTarget.playerUsername + " drop their items!");
				break;
			case "lethalcompany_stormy":
				if (flag)
				{
					Plugin.Instance.ChangeWeather((LevelWeatherType)2);
				}
				Plugin.Instance.AnnounceAction("Viewer " + text2 + " of " + text3 + " made the weather stormy!");
				break;
			case "lethalcompany_foggy":
				if (flag)
				{
					Plugin.Instance.ChangeWeather((LevelWeatherType)3);
				}
				Plugin.Instance.AnnounceAction("Viewer " + text2 + " of " + text3 + " made the weather foggy!");
				break;
			case "lethalcompany_rainy":
				if (flag)
				{
					Plugin.Instance.ChangeWeather((LevelWeatherType)1);
				}
				Plugin.Instance.AnnounceAction("Viewer " + text2 + " of " + text3 + " made the weather rainy!");
				break;
			case "lethalcompany_eclipse":
				if (flag)
				{
					Plugin.Instance.ChangeWeather((LevelWeatherType)5);
				}
				Plugin.Instance.AnnounceAction("Viewer " + text2 + " of " + text3 + " made the weather eclipsed!");
				break;
			case "lethalcompany_flooded":
				if (flag)
				{
					Plugin.Instance.ChangeWeather((LevelWeatherType)4);
				}
				Plugin.Instance.AnnounceAction("Viewer " + text2 + " of " + text3 + " made the weather flooded!");
				break;
			case "lethalcompany_clearweather":
				if (flag)
				{
					Plugin.Instance.ChangeWeather((LevelWeatherType)(-1));
				}
				else
				{
					Plugin.Instance.AnnounceActionDelayed("Fake Action! Weather didnt't clear! Jebaited", 5000);
				}
				Plugin.Instance.AnnounceAction("Viewer " + text2 + " of " + text3 + " cleared the weather!");
				break;
			case "lethalcompany_immunity":
				if (flag)
				{
					Plugin.Instance.giveImmunity();
				}
				else
				{
					Plugin.Instance.AnnounceActionDelayed("Fake action! Jebaited, no immunity for you!", 8000);
				}
				Plugin.Instance.AnnounceAction("Viewer " + text2 + " of " + text3 + " gave " + plugin.currentTarget.playerUsername + " immunity!");
				break;
			case "lethalcompany_drunk":
				if (flag)
				{
					Plugin.Instance.DrunkPlayer();
				}
				Plugin.Instance.AnnounceAction("Viewer " + text2 + " of " + text3 + " made " + plugin.currentTarget.playerUsername + " drink on the job!");
				break;
			case "lethalcompany_vents":
				if (flag)
				{
					Plugin.Instance.SpawnAllVents();
				}
				else
				{
					Plugin.Instance.AnnounceActionDelayed("Fake Action! Vents didn't open! Jebaited", 10000);
				}
				Plugin.Instance.AnnounceAction("Viewer " + text2 + " of " + text3 + " caused all vents to spawn enemies!");
				break;
			case "lethalcompany_lootbox":
				if (flag)
				{
					Plugin.Instance.buyRandomItems();
				}
				else
				{
					Plugin.Instance.AnnounceActionDelayed("Fake action! Jebaited, no loot for you!", 30000);
				}
				Plugin.Instance.AnnounceAction("Viewer " + text2 + " of " + text3 + " bought you a lootbox with 4 random items!");
				break;
			case "lethalcompany_doubleCredits":
				if (flag)
				{
					Plugin.Instance.MultiplyBank(2.0);
				}
				else
				{
					Plugin.Instance.AnnounceActionDelayed("Fake Action! Credits didn't change! Jebaited", 8000);
				}
				Plugin.Instance.AnnounceAction("Viewer " + text2 + " of " + text3 + " doubled your credits!");
				break;
			case "lethalcompany_halfCredits":
				if (flag)
				{
					Plugin.Instance.MultiplyBank(0.5);
				}
				else
				{
					Plugin.Instance.AnnounceActionDelayed("Fake Action! Credits didn't change! Jebaited", 8000);
				}
				Plugin.Instance.AnnounceAction("Viewer " + text2 + " of " + text3 + " halfed your credits!");
				break;
			case "lethalcompany_bugs":
				if (flag)
				{
					Plugin.Instance.BugInvestation();
				}
				else
				{
					Plugin.Instance.AnnounceActionDelayed("Fake Action! No Bug infestation! Jebaited", 8000);
				}
				Plugin.Instance.AnnounceAction("Viewer " + text2 + " of " + text3 + " caused a Bug infestation inside!");
				break;
			case "lethalcompany_spawnJester":
				if (flag)
				{
					Plugin.Instance.spawnEnemyNearPlayer("jesterenemy", 1);
				}
				else
				{
					Plugin.Instance.AnnounceActionDelayed("Fake Action! No Jester! Jebaited", 8000);
				}
				Plugin.Instance.AnnounceAction("Viewer " + text2 + " of " + text3 + " spawned a Jester inside!");
				break;
			case "lethalcompany_spawnSpider":
				if (flag)
				{
					Plugin.Instance.spawnEnemyNearPlayer("sandspider", 1);
				}
				else
				{
					Plugin.Instance.AnnounceActionDelayed("Fake Action! No Spider! Jebaited", 8000);
				}
				Plugin.Instance.AnnounceAction("Viewer " + text2 + " of " + text3 + " spawned a Spider inside!");
				break;
			case "lethalcompany_spawnCoilhead":
				if (flag)
				{
					Plugin.Instance.spawnEnemyNearPlayer("springman", 1);
				}
				else
				{
					Plugin.Instance.AnnounceActionDelayed("Fake Action! No Coilhead! Jebaited", 8000);
				}
				Plugin.Instance.AnnounceAction("Viewer " + text2 + " of " + text3 + " spawned a Coilhead inside!");
				break;
			case "lethalcompany_spawnBracken":
				if (flag)
				{
					Plugin.Instance.spawnEnemyNearPlayer("flowerman", 1);
				}
				else
				{
					Plugin.Instance.AnnounceActionDelayed("Fake Action! No Brcacken! Jebaited", 8000);
				}
				Plugin.Instance.AnnounceAction("Viewer " + text2 + " of " + text3 + " spawned a Bracken inside!");
				break;
			case "lethalcompany_spawnNutcracker":
				if (flag)
				{
					Plugin.Instance.spawnEnemyNearPlayer("nutcrackerenemy", 1);
				}
				else
				{
					Plugin.Instance.AnnounceActionDelayed("Fake Action! No Nutcracker! Jebaited", 8000);
				}
				Plugin.Instance.AnnounceAction("Viewer " + text2 + " of " + text3 + " spawned a Nutcracker inside!");
				break;
			case "lethalcompany_spawnThumper":
				if (flag)
				{
					Plugin.Instance.spawnEnemyNearPlayer("crawler", 1);
				}
				else
				{
					Plugin.Instance.AnnounceActionDelayed("Fake Action! No Thumper! Jebaited", 8000);
				}
				Plugin.Instance.AnnounceAction("Viewer " + text2 + " of " + text3 + " spawned a Thumper inside!");
				break;
			case "lethalcompany_spawnDog":
				if (flag)
				{
					Plugin.Instance.spawnEnemyNearPlayer("mouthdog");
				}
				else
				{
					Plugin.Instance.AnnounceActionDelayed("Fake Action! No Dog! Jebaited", 8000);
				}
				Plugin.Instance.AnnounceAction("Viewer " + text2 + " of " + text3 + " spawned a Dog outside!");
				break;
			case "lethalcompany_spawnBees":
				Plugin.Instance.spawnEnemyNearPlayer("redlocustbees");
				Plugin.Instance.AnnounceAction("Viewer " + text2 + " of " + text3 + " spawned Bees outside!");
				break;
			case "lethalcompany_spawnMine":
				if (flag)
				{
					Plugin.Instance.SpawnMine();
				}
				else
				{
					Plugin.Instance.AnnounceActionDelayed("Fake Action! Jebaited", 3000);
				}
				Plugin.Instance.AnnounceAction("Viewer " + text2 + " of " + text3 + " spawned a landmine near " + Plugin.Instance.currentTarget.playerUsername + "!");
				break;
			case "lethalcompany_teleport":
				if (!((Object)(object)StartOfRound.Instance.currentLevel == (Object)null))
				{
					if (flag)
					{
						Plugin.Instance.beamUpPlayer(Plugin.Instance.currentTarget.playerClientId, flag, toShip: false);
					}
					else
					{
						Plugin.Instance.AnnounceActionDelayed("Fake Action! Jebaited!", 3000);
					}
					Plugin.Instance.AnnounceAction("Viewer " + text2 + " of " + text3 + " teleported " + Plugin.Instance.currentTarget.playerUsername + " to a random location!");
				}
				break;
			case "lethalcompany_killEnemy":
				if (!((Object)(object)StartOfRound.Instance.currentLevel == (Object)null))
				{
					if (flag)
					{
						Plugin.Instance.despawnNearestEnemy(flag);
					}
					else
					{
						Plugin.Instance.AnnounceActionDelayed("Fake Action! Jebaited", 3000);
					}
					Plugin.Instance.AnnounceAction("Viewer " + text2 + " of " + text3 + " is killing the nearest enemy!");
				}
				break;
			case "lethalcompany_leaveEarly":
				Plugin.Instance.AnnounceAction("Viewer " + text2 + " of " + text3 + " made the ship leave early!");
				Plugin.Instance.leaveEarly();
				break;
			case "lethalcompany_drainBattey":
				Plugin.Instance.AnnounceAction("Viewer " + text2 + " of " + text3 + " drained " + Plugin.Instance.currentTarget.playerUsername + "'s batteries!");
				Plugin.Instance.changeBatteries(Plugin.Instance.currentTarget.playerClientId, 0f);
				break;
			case "lethalcompany_chargeBattey":
				Plugin.Instance.AnnounceAction("Viewer " + text2 + " of " + text3 + " charged " + Plugin.Instance.currentTarget.playerUsername + "'s batteries!");
				Plugin.Instance.changeBatteries(Plugin.Instance.currentTarget.playerClientId, 1f);
				break;
			case "lethalcompany_revive":
				Plugin.Instance.AnnounceAction("Viewer " + text2 + " of " + text3 + " revived everyone!");
				Plugin.Instance.revive();
				break;
			case "lethalcompany_teleportShip":
				if (!((Object)(object)StartOfRound.Instance.currentLevel == (Object)null))
				{
					if (flag)
					{
						Plugin.Instance.beamUpPlayer(Plugin.Instance.currentTarget.playerClientId, flag);
					}
					else
					{
						Plugin.Instance.AnnounceActionDelayed("Fake Action! Jebaited!", 3000);
					}
					Plugin.Instance.AnnounceAction("Viewer " + text2 + " of " + text3 + " teleported " + Plugin.Instance.currentTarget.playerUsername + " back to the ship!");
				}
				break;
			case "lethalcompany_meetQuota":
				if (flag)
				{
					Plugin.Instance.meetQuota();
				}
				else
				{
					Plugin.Instance.AnnounceActionDelayed("Fake Action! You didn't reach the quota", 8000);
				}
				Plugin.Instance.AnnounceAction("Viewer " + text2 + " of " + text3 + " made you reach the quota!");
				break;
			}
		}

		[HarmonyPatch(typeof(FloodWeather), "Update")]
		[HarmonyPrefix]
		private static bool Update_Prefix(FloodWeather __instance)
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Invalid comparison between Unknown and I4
			//IL_001c: 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)
			if ((int)TimeOfDay.Instance.currentLevelWeather != 4)
			{
				Vector3 position = ((Component)__instance).transform.position;
				((Vector3)(ref position)).Set(0f, 0f, 0f);
				return false;
			}
			return true;
		}

		[HarmonyPatch(typeof(FloodWeather), "Update")]
		[HarmonyPostfix]
		private static void Update_Postfix(FloodWeather __instance)
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Invalid comparison between Unknown and I4
			//IL_001c: 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)
			if ((int)TimeOfDay.Instance.currentLevelWeather != 4)
			{
				Vector3 position = ((Component)__instance).transform.position;
				((Vector3)(ref position)).Set(0f, 0f, 0f);
			}
		}

		[HarmonyPatch(typeof(StartOfRound), "ShipLeave")]
		[HarmonyPostfix]
		public static void ResetLevel(StartOfRound __instance)
		{
			TimeOfDay.Instance.DisableAllWeather(true);
			TimeOfDay.Instance.currentWeatherVariable = 0f;
			TimeOfDay.Instance.currentWeatherVariable2 = 0f;
			foreach (GameObject item in Plugin.Instance.minesThisRound)
			{
				Plugin.Instance.log("despawning mine");
				if (((NetworkBehaviour)Plugin.Instance._localPlayer).IsServer)
				{
					item.GetComponent<NetworkObject>().Despawn(true);
				}
			}
			Plugin.Instance.minesThisRound.Clear();
			foreach (KeyValuePair<string, GameObject> uIElement in Plugin.Instance.UIElements)
			{
				uIElement.Value.SetActive(true);
			}
		}

		[HarmonyPatch(typeof(RoundManager), "LoadNewLevel")]
		[HarmonyPostfix]
		private static void ModifyLevel(ref SelectableLevel newLevel)
		{
			try
			{
				addEnemyToLevel(ref newLevel, "hoarderbug");
				addEnemyToLevel(ref newLevel, "sandspider");
				addEnemyToLevel(ref newLevel, "springman");
				addEnemyToLevel(ref newLevel, "jesterenemy");
				addEnemyToLevel(ref newLevel, "nutcrackerenemy");
				addEnemyToLevel(ref newLevel, "flowerman");
				addEnemyToLevel(ref newLevel, "crawler");
				addEnemyToLevel(ref newLevel, "mouthdog", indoors: false);
				addEnemyToLevel(ref newLevel, "forestgiant", indoors: false);
				addEnemyToLevel(ref newLevel, "redlocustbees", indoors: false);
			}
			catch (Exception ex)
			{
				Plugin.Instance.log("couldnt add an enemy! " + ex);
			}
		}

		public static void addEnemyToLevel(ref SelectableLevel newLevel, string enemyName, bool indoors = true)
		{
			//IL_0041: Unknown result type (might be due to invalid IL or missing references)
			//IL_0048: Expected O, but got Unknown
			bool flag = false;
			if (false)
			{
				return;
			}
			EnemyType[] array = Resources.FindObjectsOfTypeAll<EnemyType>();
			foreach (EnemyType val in array)
			{
				if (((Object)val.enemyPrefab).name.ToLower() == enemyName)
				{
					SpawnableEnemyWithRarity val2 = new SpawnableEnemyWithRarity();
					val2.enemyType = val;
					val2.rarity = 0;
					if (indoors)
					{
						newLevel.Enemies.Add(val2);
					}
					else
					{
						newLevel.OutsideEnemies.Add(val2);
					}
					break;
				}
			}
		}

		[HarmonyPatch("KillPlayer")]
		[HarmonyPrefix]
		private static bool KillPlayer_Prefix(PlayerControllerB __instance)
		{
			if (__instance.playerClientId == clientID && immune)
			{
				return false;
			}
			return true;
		}

		[HarmonyPatch("DamagePlayer")]
		[HarmonyPrefix]
		public static void DamagePlayer_Prefix(PlayerControllerB __instance, ref int damageNumber)
		{
			if (__instance.playerClientId == clientID && immune)
			{
				damageNumber = 0;
			}
		}

		[HarmonyPatch(typeof(HUDManager), "CanTipDisplay")]
		[HarmonyPostfix]
		private static void CanTipDisplay_Postfix(ref bool __result, bool isWarning, bool useSave, string prefsKey)
		{
			__result = true;
			HUDManager.Instance.HideHUD(false);
			HUDManager.Instance.scanInfoAnimator.SetBool("display", false);
			if (!Plugin.Instance._localPlayer.isPlayerDead)
			{
				return;
			}
			foreach (KeyValuePair<string, GameObject> uIElement in Plugin.Instance.UIElements)
			{
				uIElement.Value.SetActive(false);
			}
		}

		[HarmonyPatch(typeof(PlayerControllerB), "Update")]
		[HarmonyPostfix]
		private static void overrideSpin(PlayerControllerB __instance)
		{
			if (__instance.playerClientId == clientID)
			{
				float realtimeSinceStartup = Time.realtimeSinceStartup;
				if (immune)
				{
					__instance.sprintMeter = 1f;
				}
				if (realtimeSinceStartup - immuneStartTime > immuneDuration)
				{
					immune = false;
				}
				float x = __instance.moveInputVector.x;
				float y = __instance.moveInputVector.y;
				__instance.moveInputVector.y = x;
				__instance.moveInputVector.x = y;
			}
			string currentCMD = Plugin.Instance.socket.currentCMD;
			try
			{
				if (currentCMD != "")
				{
					ProcessInput(currentCMD);
				}
			}
			catch (Exception ex)
			{
				Plugin.Instance.logError(ex.ToString());
			}
			Plugin.Instance.socket.currentCMD = "";
		}
	}
}
namespace MyFirstPlugin.MonoBehaviours
{
	internal class MyFirstPluginComponent : MonoBehaviour
	{
		public void Awake()
		{
		}

		public void Start()
		{
		}

		public void Update()
		{
		}

		public void LateUpdate()
		{
		}
	}
}