Decompiled source of GameTools v1.0.2

Zichen-GameTools-1.0.2.dll

Decompiled 3 days ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Text.RegularExpressions;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Configuration;
using ExitGames.Client.Photon;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using Photon.Pun;
using Photon.Realtime;
using TMPro;
using UnityEngine;
using UnityEngine.AI;
using UnityEngine.InputSystem;
using UnityEngine.InputSystem.Controls;
using UnityEngine.SceneManagement;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: AssemblyCompany("Zichen-GameTools-1.0.2")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+88f40fada1dcf82c6929456d75027e36eaea82ff")]
[assembly: AssemblyProduct("Zichen-GameTools-1.0.2")]
[assembly: AssemblyTitle("Zichen-GameTools-1.0.2")]
[assembly: AssemblyVersion("1.0.0.0")]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace Zichen_GameTools
{
	public enum DisplayLanguage
	{
		中文,
		English
	}
	[BepInPlugin("zichen.gametools", "GameTools", "1.0.2")]
	public class Plugin : BaseUnityPlugin
	{
		internal sealed class CfgI18N
		{
			public string SectionCN;

			public string SectionEN;

			public string KeyCN;

			public string KeyEN;

			public string DisplayEN;

			public string DescCN;

			public string DescEN;

			public ConfigurationManagerAttributes Attrs;

			public string ValueEN;

			public string ValueCN;

			public ConfigEntry<string> ReadOnlyEntry;

			public ConfigEntryBase Entry;
		}

		public enum SpawnType
		{
			Valuable,
			Weapon,
			Enemy,
			Cart,
			Vehicle,
			Other
		}

		public class SpawnableInfo
		{
			public string Name;

			public string InternalName;

			public SpawnType Type;

			public object Source;

			public string ExtraInfo;

			public string GetDisplayName()
			{
				string text = Name;
				if (UseChinese())
				{
					text = ((Type != SpawnType.Enemy) ? ItemNameLocalizer.Translate(Name) : EnemyNameLocalizer.Translate(Name));
				}
				if (!string.IsNullOrEmpty(ExtraInfo))
				{
					return text + " " + ExtraInfo;
				}
				return text;
			}
		}

		[HarmonyPatch(typeof(InputManager), "InitializeInputs")]
		private class InputManager_InitializeInputs_Patch
		{
			[HarmonyPostfix]
			private static void Postfix()
			{
				try
				{
					InputManagerInitializeInputsPostfix();
				}
				catch (Exception arg)
				{
					Plugin instance = Instance;
					if (instance != null)
					{
						((BaseUnityPlugin)instance).Logger.LogWarning((object)$"[InitializeInputs Patch Error]: {arg}");
					}
				}
			}
		}

		[HarmonyPatch(typeof(PlayerController), "Start")]
		private class PlayerController_Start_Patch
		{
			[HarmonyPostfix]
			private static void Postfix()
			{
				try
				{
					PlayerControllerStartPostfix();
				}
				catch (Exception arg)
				{
					Plugin instance = Instance;
					if (instance != null)
					{
						((BaseUnityPlugin)instance).Logger.LogWarning((object)$"[PlayerController.Start Patch Error]: {arg}");
					}
				}
			}
		}

		[HarmonyPatch(typeof(CameraAim), "Update")]
		private class CameraAim_Update_Patch
		{
			[HarmonyPrefix]
			private static void Prefix(CameraAim __instance)
			{
				//IL_011f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0124: Unknown result type (might be due to invalid IL or missing references)
				//IL_013f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0151: Unknown result type (might be due to invalid IL or missing references)
				if (!IsStaticModEnabled() || !IsTumbleFlyEnabled())
				{
					return;
				}
				try
				{
					PlayerController instance = PlayerController.instance;
					PlayerTumble val = (((Object)(object)instance != (Object)null && (Object)(object)instance.playerAvatarScript != (Object)null) ? PlayerAvatarTumbleRef.Invoke(instance.playerAvatarScript) : null);
					if (!((Object)(object)val != (Object)null) || !PlayerTumbleIsTumblingRef.Invoke(val))
					{
						return;
					}
					Keyboard current = Keyboard.current;
					if (current == null || !((ButtonControl)current.qKey).isPressed)
					{
						return;
					}
					AccessTools.FieldRefAccess<CameraAim, float>("overridePlayerAimDisableTimer").Invoke(__instance) = 0f;
					AccessTools.FieldRefAccess<CameraAim, float>("overrideAimStopTimer").Invoke(__instance) = 0f;
					AccessTools.FieldRefAccess<CameraAim, bool>("overrideAimStop").Invoke(__instance) = false;
					if ((Object)(object)InputManager.instance != (Object)null)
					{
						AccessTools.FieldRefAccess<InputManager, float>("disableAimingTimer").Invoke(InputManager.instance) = 0f;
					}
					float num = SemiFunc.InputMouseX();
					float num2 = SemiFunc.InputMouseY();
					if (!(Mathf.Abs(num) < 0.0001f) || !(Mathf.Abs(num2) < 0.0001f))
					{
						return;
					}
					Mouse current2 = Mouse.current;
					if (current2 == null)
					{
						return;
					}
					Vector2 val2 = ((InputControl<Vector2>)(object)((Pointer)current2).delta).ReadValue();
					if (((Vector2)(ref val2)).sqrMagnitude > 0.0001f)
					{
						float aimSpeedMouse = __instance.AimSpeedMouse;
						float num3 = val2.x * 0.05f * aimSpeedMouse;
						float num4 = val2.y * 0.05f * aimSpeedMouse;
						if ((Object)(object)GameplayManager.instance != (Object)null && AccessTools.FieldRefAccess<GameplayManager, bool>("aimInvertVertical").Invoke(GameplayManager.instance))
						{
							num4 *= -1f;
						}
						ref float reference = ref AccessTools.FieldRefAccess<CameraAim, float>("aimHorizontal").Invoke(__instance);
						ref float reference2 = ref AccessTools.FieldRefAccess<CameraAim, float>("aimVertical").Invoke(__instance);
						reference += num3;
						if (reference > 360f)
						{
							reference -= 360f;
						}
						if (reference < -360f)
						{
							reference += 360f;
						}
						reference2 -= num4;
						reference2 = Mathf.Clamp(reference2, -70f, 80f);
					}
				}
				catch (Exception arg)
				{
					Plugin instance2 = Instance;
					if (instance2 != null)
					{
						((BaseUnityPlugin)instance2).Logger.LogWarning((object)$"[CameraAim.Update Prefix Error]: {arg}");
					}
				}
			}
		}

		[HarmonyPatch(typeof(PlayerAvatar), "UpgradeTumbleWingsVisualsActive")]
		private class PlayerAvatar_UpgradeTumbleWingsVisualsActive_Patch
		{
			[HarmonyPrefix]
			private static bool Prefix(PlayerAvatar __instance, ref bool _visualsActive)
			{
				if (!IsStaticModEnabled())
				{
					return true;
				}
				try
				{
					if (IsWingsAlwaysShowEnabled() && PlayerAvatarIsLocalRef.Invoke(__instance) && IsWingsShouldActive() && !_visualsActive)
					{
						return false;
					}
				}
				catch (Exception arg)
				{
					Plugin instance = Instance;
					if (instance != null)
					{
						((BaseUnityPlugin)instance).Logger.LogWarning((object)$"[UpgradeTumbleWingsVisualsActive.Prefix Error]: {arg}");
					}
				}
				return true;
			}
		}

		[HarmonyPatch(typeof(PlayerAvatar), "UpgradeTumbleWingsVisualsActiveRPC")]
		private class PlayerAvatar_UpgradeTumbleWingsVisualsActiveRPC_Patch
		{
			[HarmonyPrefix]
			private static void Prefix(PlayerAvatar __instance, ref bool _visualsActive)
			{
				if (!IsStaticModEnabled())
				{
					return;
				}
				try
				{
					if (IsWingsAlwaysShowEnabled() && PlayerAvatarIsLocalRef.Invoke(__instance))
					{
						_visualsActive = IsWingsShouldActive();
					}
				}
				catch (Exception arg)
				{
					Plugin instance = Instance;
					if (instance != null)
					{
						((BaseUnityPlugin)instance).Logger.LogWarning((object)$"[UpgradeTumbleWingsVisualsActiveRPC.Prefix Error]: {arg}");
					}
				}
			}
		}

		[HarmonyPatch(typeof(PlayerAvatar), "Update")]
		private class PlayerAvatar_Update_Patch
		{
			[HarmonyPostfix]
			private static void Postfix(PlayerAvatar __instance)
			{
				//IL_0289: Unknown result type (might be due to invalid IL or missing references)
				//IL_028e: Unknown result type (might be due to invalid IL or missing references)
				//IL_0aaf: Unknown result type (might be due to invalid IL or missing references)
				//IL_0ab6: Expected O, but got Unknown
				//IL_0e60: Unknown result type (might be due to invalid IL or missing references)
				//IL_0e67: Expected O, but got Unknown
				//IL_02a5: Unknown result type (might be due to invalid IL or missing references)
				//IL_01bc: Unknown result type (might be due to invalid IL or missing references)
				//IL_01c3: Expected O, but got Unknown
				//IL_0d08: Unknown result type (might be due to invalid IL or missing references)
				//IL_0d0d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0d0f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0d14: Unknown result type (might be due to invalid IL or missing references)
				//IL_0d37: Unknown result type (might be due to invalid IL or missing references)
				//IL_0d39: Unknown result type (might be due to invalid IL or missing references)
				//IL_0ce0: Unknown result type (might be due to invalid IL or missing references)
				//IL_0ef2: Unknown result type (might be due to invalid IL or missing references)
				//IL_0ef7: Unknown result type (might be due to invalid IL or missing references)
				//IL_0ded: Unknown result type (might be due to invalid IL or missing references)
				//IL_0dca: Unknown result type (might be due to invalid IL or missing references)
				//IL_0dcc: Unknown result type (might be due to invalid IL or missing references)
				//IL_0d89: Unknown result type (might be due to invalid IL or missing references)
				//IL_0d8b: Unknown result type (might be due to invalid IL or missing references)
				//IL_0e09: Unknown result type (might be due to invalid IL or missing references)
				if (!IsStaticModEnabled())
				{
					return;
				}
				try
				{
					string text = PlayerAvatarSteamIDRef.Invoke(__instance);
					int value = 0;
					if ((Object)(object)StatsManager.instance != (Object)null && !string.IsNullOrEmpty(text))
					{
						StatsManager.instance.playerUpgradeTumbleWings.TryGetValue(text, out value);
					}
					if (PlayerAvatarIsLocalRef.Invoke(__instance))
					{
						bool flag = IsWingsAlwaysShowEnabled();
						if (flag)
						{
							if (PlayerAvatarUpgradeTumbleWingsRef.Invoke(__instance) < 3f)
							{
								PlayerAvatarUpgradeTumbleWingsRef.Invoke(__instance) = 3f;
							}
							bool flag2 = IsWingsShouldActive();
							if (PlayerAvatarUpgradeTumbleWingsVisualsActiveRef.Invoke(__instance) != flag2)
							{
								__instance.UpgradeTumbleWingsVisualsActive(flag2, false);
								PlayerAvatarUpgradeTumbleWingsVisualsActiveRef.Invoke(__instance) = flag2;
							}
							if (PhotonNetwork.IsMasterClient && (Object)(object)StatsManager.instance != (Object)null && !string.IsNullOrEmpty(text))
							{
								int value2 = 0;
								StatsManager.instance.playerUpgradeTumbleWings.TryGetValue(text, out value2);
								if (value2 < 3)
								{
									if (!_originalWingsLevel.ContainsKey(text))
									{
										_originalWingsLevel[text] = value2;
									}
									StatsManager.instance.playerUpgradeTumbleWings[text] = 3;
									SemiFunc.StatSyncAll();
								}
							}
						}
						else
						{
							if (PlayerAvatarUpgradeTumbleWingsRef.Invoke(__instance) > (float)value)
							{
								PlayerAvatarUpgradeTumbleWingsRef.Invoke(__instance) = value;
								if (value <= 0)
								{
									__instance.UpgradeTumbleWingsVisualsActive(false, false);
									PlayerAvatarUpgradeTumbleWingsVisualsActiveRef.Invoke(__instance) = false;
								}
							}
							if (PhotonNetwork.IsMasterClient && (Object)(object)StatsManager.instance != (Object)null && !string.IsNullOrEmpty(text) && _originalWingsLevel.TryGetValue(text, out var value3))
							{
								StatsManager.instance.playerUpgradeTumbleWings[text] = value3;
								_originalWingsLevel.Remove(text);
								SemiFunc.StatSyncAll();
							}
						}
						if (PhotonNetwork.InRoom && PhotonNetwork.LocalPlayer != null)
						{
							Hashtable val = new Hashtable();
							bool flag3 = false;
							bool flag4 = false;
							if (((Dictionary<object, object>)(object)PhotonNetwork.LocalPlayer.CustomProperties).TryGetValue((object)"GT_WingsAlwaysShow", out object value4) && value4 is bool)
							{
								flag4 = (bool)value4;
							}
							if (flag4 != flag)
							{
								val[(object)"GT_WingsAlwaysShow"] = flag;
								flag3 = true;
							}
							int num = 0;
							if (((Dictionary<object, object>)(object)PhotonNetwork.LocalPlayer.CustomProperties).TryGetValue((object)"GT_WingsColorIndex", out object value5))
							{
								num = SafeConvertToInt(value5);
							}
							int wingsColorIndex = GetWingsColorIndex();
							if (num != wingsColorIndex)
							{
								val[(object)"GT_WingsColorIndex"] = wingsColorIndex;
								flag3 = true;
							}
							if (flag3)
							{
								PhotonNetwork.LocalPlayer.SetCustomProperties(val, (Hashtable)null, (WebFlags)null);
							}
						}
					}
					else
					{
						if ((Object)(object)__instance.playerAvatarVisuals != (Object)null && ((Component)__instance.playerAvatarVisuals).transform.localScale != Vector3.one)
						{
							((Component)__instance.playerAvatarVisuals).transform.localScale = Vector3.one;
						}
						bool flag5 = false;
						int num2 = 0;
						if (PhotonNetwork.InRoom && (Object)(object)__instance.photonView != (Object)null && __instance.photonView.Owner != null)
						{
							Player owner = __instance.photonView.Owner;
							if (((Dictionary<object, object>)(object)owner.CustomProperties).TryGetValue((object)"GT_WingsAlwaysShow", out object value6) && value6 is bool)
							{
								flag5 = (bool)value6;
							}
							if (((Dictionary<object, object>)(object)owner.CustomProperties).TryGetValue((object)"GT_WingsColorIndex", out object value7))
							{
								num2 = SafeConvertToInt(value7);
							}
						}
						else
						{
							flag5 = IsWingsAlwaysShowEnabled();
							num2 = GetWingsColorIndex();
						}
						if (flag5 && IsTab2Enabled())
						{
							float num3 = ((num2 == 1) ? 2f : 3f);
							int num4 = ((num2 == 1) ? 2 : 3);
							if (PlayerAvatarUpgradeTumbleWingsRef.Invoke(__instance) != num3)
							{
								PlayerAvatarUpgradeTumbleWingsRef.Invoke(__instance) = num3;
							}
							if (!PlayerAvatarUpgradeTumbleWingsVisualsActiveRef.Invoke(__instance))
							{
								PlayerAvatarUpgradeTumbleWingsVisualsActiveRef.Invoke(__instance) = true;
							}
							if (PhotonNetwork.IsMasterClient && (Object)(object)StatsManager.instance != (Object)null && !string.IsNullOrEmpty(text))
							{
								int value8 = 0;
								StatsManager.instance.playerUpgradeTumbleWings.TryGetValue(text, out value8);
								if (value8 != num4)
								{
									if (!_originalWingsLevel.ContainsKey(text))
									{
										_originalWingsLevel[text] = value8;
									}
									StatsManager.instance.playerUpgradeTumbleWings[text] = num4;
									SemiFunc.StatSyncAll();
								}
							}
						}
						else
						{
							if (PlayerAvatarUpgradeTumbleWingsRef.Invoke(__instance) > (float)value)
							{
								PlayerAvatarUpgradeTumbleWingsRef.Invoke(__instance) = value;
								if (value <= 0)
								{
									PlayerAvatarUpgradeTumbleWingsVisualsActiveRef.Invoke(__instance) = false;
								}
							}
							if (PhotonNetwork.IsMasterClient && (Object)(object)StatsManager.instance != (Object)null && !string.IsNullOrEmpty(text) && _originalWingsLevel.TryGetValue(text, out var value9))
							{
								StatsManager.instance.playerUpgradeTumbleWings[text] = value9;
								_originalWingsLevel.Remove(text);
								SemiFunc.StatSyncAll();
							}
						}
					}
					if (!PhotonNetwork.InRoom)
					{
						return;
					}
					string text2 = PlayerAvatarSteamIDRef.Invoke(__instance);
					bool flag6 = PlayerAvatarDeadSetRef.Invoke(__instance);
					if (PlayerAvatarIsLocalRef.Invoke(__instance) && !string.IsNullOrEmpty(text2))
					{
						if (flag6)
						{
							string key = "GT_ReqRevive_" + text2;
							bool flag7 = false;
							Player[] playerList = PhotonNetwork.PlayerList;
							foreach (Player val2 in playerList)
							{
								if (val2 != null && ((Dictionary<object, object>)(object)val2.CustomProperties).TryGetValue((object)key, out object value10) && value10 is bool && (bool)value10)
								{
									flag7 = true;
									break;
								}
							}
							if (flag7)
							{
								try
								{
									__instance.Revive(false);
									Plugin instance = Instance;
									if (instance != null)
									{
										((BaseUnityPlugin)instance).Logger.LogInfo((object)("[GameTools] Self-revived by remote request: " + text2));
									}
								}
								catch (Exception arg)
								{
									Plugin instance2 = Instance;
									if (instance2 != null)
									{
										((BaseUnityPlugin)instance2).Logger.LogWarning((object)$"[Self Revive Error]: {arg}");
									}
								}
							}
						}
						else
						{
							string key2 = "GT_ReqKill_" + text2;
							bool flag8 = false;
							Player[] playerList = PhotonNetwork.PlayerList;
							foreach (Player val3 in playerList)
							{
								if (val3 != null && ((Dictionary<object, object>)(object)val3.CustomProperties).TryGetValue((object)key2, out object value11) && value11 is bool && (bool)value11)
								{
									flag8 = true;
									break;
								}
							}
							if (flag8)
							{
								try
								{
									__instance.PlayerDeath(-1);
									Plugin instance3 = Instance;
									if (instance3 != null)
									{
										((BaseUnityPlugin)instance3).Logger.LogInfo((object)("[GameTools] Self-killed by remote request: " + text2));
									}
								}
								catch (Exception arg2)
								{
									Plugin instance4 = Instance;
									if (instance4 != null)
									{
										((BaseUnityPlugin)instance4).Logger.LogWarning((object)$"[Self Kill Error]: {arg2}");
									}
								}
							}
						}
						if (!flag6 && (Object)(object)__instance.playerHealth != (Object)null)
						{
							string key3 = "GT_ReqHeal_" + text2;
							bool flag9 = false;
							Player[] playerList = PhotonNetwork.PlayerList;
							foreach (Player val4 in playerList)
							{
								if (val4 != null && ((Dictionary<object, object>)(object)val4.CustomProperties).TryGetValue((object)key3, out object value12) && value12 is bool && (bool)value12)
								{
									flag9 = true;
									break;
								}
							}
							if (flag9)
							{
								try
								{
									int num5 = PlayerHealthMaxRef.Invoke(__instance.playerHealth);
									__instance.playerHealth.Heal(num5, true);
									Plugin instance5 = Instance;
									if (instance5 != null)
									{
										((BaseUnityPlugin)instance5).Logger.LogInfo((object)("[GameTools] Self-healed by remote request: " + text2));
									}
								}
								catch (Exception arg3)
								{
									Plugin instance6 = Instance;
									if (instance6 != null)
									{
										((BaseUnityPlugin)instance6).Logger.LogWarning((object)$"[Self Heal Error]: {arg3}");
									}
								}
							}
						}
					}
					if (IsTab1Enabled() && PhotonNetwork.IsMasterClient && !string.IsNullOrEmpty(text2))
					{
						bool flag10 = false;
						if ((Object)(object)__instance.photonView != (Object)null && __instance.photonView.Owner != null && ((Dictionary<object, object>)(object)__instance.photonView.Owner.CustomProperties).TryGetValue((object)"GT_Active", out object value13) && value13 is bool && (bool)value13)
						{
							flag10 = true;
						}
						if (!flag10)
						{
							if (flag6)
							{
								string key4 = "GT_ReqRevive_" + text2;
								bool flag11 = false;
								Player[] playerList = PhotonNetwork.PlayerList;
								foreach (Player val5 in playerList)
								{
									if (val5 != null && ((Dictionary<object, object>)(object)val5.CustomProperties).TryGetValue((object)key4, out object value14) && value14 is bool && (bool)value14)
									{
										flag11 = true;
										break;
									}
								}
								if (flag11 && (Object)(object)__instance.photonView != (Object)null)
								{
									try
									{
										__instance.photonView.RPC("ReviveRPC", (RpcTarget)0, new object[1] { false });
										Plugin instance7 = Instance;
										if (instance7 != null)
										{
											((BaseUnityPlugin)instance7).Logger.LogInfo((object)("[GameTools] Host proxy-revived vanilla player: " + text2));
										}
									}
									catch (Exception arg4)
									{
										Plugin instance8 = Instance;
										if (instance8 != null)
										{
											((BaseUnityPlugin)instance8).Logger.LogWarning((object)$"[Host Proxy Revive Error]: {arg4}");
										}
									}
								}
							}
							else
							{
								string key5 = "GT_ReqKill_" + text2;
								bool flag12 = false;
								Player[] playerList = PhotonNetwork.PlayerList;
								foreach (Player val6 in playerList)
								{
									if (val6 != null && ((Dictionary<object, object>)(object)val6.CustomProperties).TryGetValue((object)key5, out object value15) && value15 is bool && (bool)value15)
									{
										flag12 = true;
										break;
									}
								}
								if (flag12 && (Object)(object)__instance.photonView != (Object)null)
								{
									try
									{
										__instance.photonView.RPC("PlayerDeathRPC", (RpcTarget)0, new object[1] { -1 });
										Plugin instance9 = Instance;
										if (instance9 != null)
										{
											((BaseUnityPlugin)instance9).Logger.LogInfo((object)("[GameTools] Host proxy-killed vanilla player: " + text2));
										}
									}
									catch (Exception arg5)
									{
										Plugin instance10 = Instance;
										if (instance10 != null)
										{
											((BaseUnityPlugin)instance10).Logger.LogWarning((object)$"[Host Proxy Kill Error]: {arg5}");
										}
									}
								}
							}
							if (!flag6 && (Object)(object)__instance.playerHealth != (Object)null)
							{
								string key6 = "GT_ReqHeal_" + text2;
								bool flag13 = false;
								Player[] playerList = PhotonNetwork.PlayerList;
								foreach (Player val7 in playerList)
								{
									if (val7 != null && ((Dictionary<object, object>)(object)val7.CustomProperties).TryGetValue((object)key6, out object value16) && value16 is bool && (bool)value16)
									{
										flag13 = true;
										break;
									}
								}
								if (flag13 && (Object)(object)__instance.photonView != (Object)null)
								{
									try
									{
										int num6 = PlayerHealthMaxRef.Invoke(__instance.playerHealth);
										__instance.photonView.RPC("UpdateHealthRPC", (RpcTarget)0, new object[4] { num6, num6, true, false });
										Plugin instance11 = Instance;
										if (instance11 != null)
										{
											((BaseUnityPlugin)instance11).Logger.LogInfo((object)("[GameTools] Host proxy-healed vanilla player: " + text2));
										}
									}
									catch (Exception arg6)
									{
										Plugin instance12 = Instance;
										if (instance12 != null)
										{
											((BaseUnityPlugin)instance12).Logger.LogWarning((object)$"[Host Proxy Heal Error]: {arg6}");
										}
									}
								}
							}
						}
					}
					if (PlayerAvatarIsLocalRef.Invoke(__instance))
					{
						List<PlayerAvatar> list = SemiFunc.PlayerGetList();
						if (list != null)
						{
							Hashtable val8 = new Hashtable();
							bool flag14 = false;
							foreach (PlayerAvatar item in list)
							{
								if ((Object)(object)item == (Object)null)
								{
									continue;
								}
								string text3 = PlayerAvatarSteamIDRef.Invoke(item);
								if (string.IsNullOrEmpty(text3))
								{
									continue;
								}
								bool num7 = PlayerAvatarDeadSetRef.Invoke(item);
								if (!num7)
								{
									string text4 = "GT_ReqRevive_" + text3;
									if (((Dictionary<object, object>)(object)PhotonNetwork.LocalPlayer.CustomProperties).TryGetValue((object)text4, out object value17) && value17 is bool && (bool)value17)
									{
										val8[(object)text4] = null;
										flag14 = true;
									}
								}
								else
								{
									string text5 = "GT_ReqKill_" + text3;
									if (((Dictionary<object, object>)(object)PhotonNetwork.LocalPlayer.CustomProperties).TryGetValue((object)text5, out object value18) && value18 is bool && (bool)value18)
									{
										val8[(object)text5] = null;
										flag14 = true;
									}
								}
								if (num7 || !((Object)(object)item.playerHealth != (Object)null))
								{
									continue;
								}
								int num8 = PlayerHealthCurrentRef.Invoke(item.playerHealth);
								int num9 = PlayerHealthMaxRef.Invoke(item.playerHealth);
								if (num8 >= num9)
								{
									string text6 = "GT_ReqHeal_" + text3;
									if (((Dictionary<object, object>)(object)PhotonNetwork.LocalPlayer.CustomProperties).TryGetValue((object)text6, out object value19) && value19 is bool && (bool)value19)
									{
										val8[(object)text6] = null;
										flag14 = true;
									}
								}
							}
							if (flag14)
							{
								PhotonNetwork.LocalPlayer.SetCustomProperties(val8, (Hashtable)null, (WebFlags)null);
								Plugin instance13 = Instance;
								if (instance13 != null)
								{
									((BaseUnityPlugin)instance13).Logger.LogInfo((object)"[GameTools] Cleared resolved player control requests.");
								}
							}
						}
					}
					if (PlayerAvatarIsLocalRef.Invoke(__instance))
					{
						string text7 = PlayerAvatarSteamIDRef.Invoke(__instance);
						if (!string.IsNullOrEmpty(text7))
						{
							string key7 = "GT_ReqTeleport_" + text7;
							Vector3? val9 = null;
							Player[] playerList = PhotonNetwork.PlayerList;
							foreach (Player val10 in playerList)
							{
								if (val10 != null && ((Dictionary<object, object>)(object)val10.CustomProperties).TryGetValue((object)key7, out object value20) && value20 is float[] array && array.Length == 3)
								{
									val9 = new Vector3(array[0], array[1], array[2]);
									break;
								}
							}
							if (val9.HasValue)
							{
								Vector3 value21 = val9.Value;
								if (Vector3.Distance(_lastRemoteTpPos, value21) > 0.5f || Time.time - _lastRemoteTpTime > 1f)
								{
									_lastRemoteTpPos = value21;
									_lastRemoteTpTime = Time.time;
									try
									{
										if (PlayerAvatarDeadSetRef.Invoke(__instance))
										{
											PlayerDeathHead val11 = PlayerAvatarPlayerDeathHeadRef.Invoke(__instance);
											if ((Object)(object)val11 != (Object)null)
											{
												PhysGrabObject val12 = PlayerDeathHeadPhysGrabObjectRef.Invoke(val11);
												if ((Object)(object)val12 != (Object)null)
												{
													val12.Teleport(value21, Quaternion.identity);
												}
											}
										}
										else
										{
											PlayerTumble val13 = PlayerAvatarTumbleRef.Invoke(__instance);
											if ((Object)(object)val13 != (Object)null)
											{
												PhysGrabObject val14 = PlayerTumblePhysGrabObjectRef.Invoke(val13);
												if ((Object)(object)val14 != (Object)null)
												{
													val14.Teleport(value21, Quaternion.identity);
												}
											}
										}
										if ((Object)(object)PlayerController.instance != (Object)null)
										{
											((Component)PlayerController.instance).transform.position = value21;
										}
										Plugin instance14 = Instance;
										if (instance14 != null)
										{
											((BaseUnityPlugin)instance14).Logger.LogInfo((object)$"[GameTools] Teleported self locally by remote request to {value21}");
										}
									}
									catch (Exception arg7)
									{
										Plugin instance15 = Instance;
										if (instance15 != null)
										{
											((BaseUnityPlugin)instance15).Logger.LogWarning((object)$"[Self Teleport By Remote Error]: {arg7}");
										}
									}
								}
							}
						}
					}
					if (!PlayerAvatarIsLocalRef.Invoke(__instance))
					{
						return;
					}
					List<PlayerAvatar> list2 = SemiFunc.PlayerGetList();
					if (list2 == null)
					{
						return;
					}
					Hashtable val15 = new Hashtable();
					bool flag15 = false;
					Vector3 val16 = default(Vector3);
					foreach (PlayerAvatar item2 in list2)
					{
						if ((Object)(object)item2 == (Object)null)
						{
							continue;
						}
						string text8 = PlayerAvatarSteamIDRef.Invoke(item2);
						if (string.IsNullOrEmpty(text8))
						{
							continue;
						}
						string text9 = "GT_ReqTeleport_" + text8;
						if (((Dictionary<object, object>)(object)PhotonNetwork.LocalPlayer.CustomProperties).TryGetValue((object)text9, out object value22) && value22 is float[] array2 && array2.Length == 3)
						{
							((Vector3)(ref val16))..ctor(array2[0], array2[1], array2[2]);
							if (Vector3.Distance(GetPlayerPosition(item2), val16) < 3f)
							{
								val15[(object)text9] = null;
								flag15 = true;
							}
						}
					}
					if (flag15)
					{
						PhotonNetwork.LocalPlayer.SetCustomProperties(val15, (Hashtable)null, (WebFlags)null);
						Plugin instance16 = Instance;
						if (instance16 != null)
						{
							((BaseUnityPlugin)instance16).Logger.LogInfo((object)"[GameTools] Cleared resolved teleport requests.");
						}
					}
				}
				catch (Exception arg8)
				{
					Plugin instance17 = Instance;
					if (instance17 != null)
					{
						((BaseUnityPlugin)instance17).Logger.LogWarning((object)$"[PlayerAvatar.Update.Postfix Error]: {arg8}");
					}
				}
			}
		}

		[HarmonyPatch(typeof(PlayerController), "Update")]
		private class PlayerController_Update_Patch
		{
			private static float _originalJumpForce = -1f;

			private static bool _prevGodModeFlightEnabled = false;

			[HarmonyPostfix]
			private static void Postfix(PlayerController __instance)
			{
				bool flag = IsStaticModEnabled() && IsJumpMultiplierEnabled();
				try
				{
					if ((Object)(object)__instance == (Object)(object)PlayerController.instance)
					{
						if (_originalJumpForce < 0f)
						{
							_originalJumpForce = __instance.JumpForce;
						}
						if (flag)
						{
							__instance.JumpForce = _originalJumpForce * GetJumpMultiplier();
						}
						else if (__instance.JumpForce != _originalJumpForce && _originalJumpForce >= 0f)
						{
							__instance.JumpForce = _originalJumpForce;
						}
						UpdateGodModeFlight(__instance);
						UpdateAllTeammatesGodMode();
					}
				}
				catch (Exception arg)
				{
					Plugin instance = Instance;
					if (instance != null)
					{
						((BaseUnityPlugin)instance).Logger.LogWarning((object)$"[PlayerController.Update.JumpForce Patch Error]: {arg}");
					}
				}
			}

			private static void UpdateGodModeFlight(PlayerController player)
			{
				//IL_00ce: Unknown result type (might be due to invalid IL or missing references)
				//IL_0128: Unknown result type (might be due to invalid IL or missing references)
				//IL_012d: Unknown result type (might be due to invalid IL or missing references)
				//IL_017b: 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_0188: Unknown result type (might be due to invalid IL or missing references)
				//IL_018d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0192: Unknown result type (might be due to invalid IL or missing references)
				//IL_0193: Unknown result type (might be due to invalid IL or missing references)
				//IL_019a: Unknown result type (might be due to invalid IL or missing references)
				//IL_01a0: Unknown result type (might be due to invalid IL or missing references)
				//IL_01a5: Unknown result type (might be due to invalid IL or missing references)
				//IL_01aa: Unknown result type (might be due to invalid IL or missing references)
				//IL_0146: Unknown result type (might be due to invalid IL or missing references)
				//IL_014b: Unknown result type (might be due to invalid IL or missing references)
				//IL_0154: Unknown result type (might be due to invalid IL or missing references)
				//IL_0159: Unknown result type (might be due to invalid IL or missing references)
				//IL_015b: Unknown result type (might be due to invalid IL or missing references)
				//IL_015c: Unknown result type (might be due to invalid IL or missing references)
				//IL_015f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0164: 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)
				//IL_016a: Unknown result type (might be due to invalid IL or missing references)
				//IL_016b: Unknown result type (might be due to invalid IL or missing references)
				//IL_016e: Unknown result type (might be due to invalid IL or missing references)
				//IL_0173: Unknown result type (might be due to invalid IL or missing references)
				//IL_0178: Unknown result type (might be due to invalid IL or missing references)
				//IL_01b3: Unknown result type (might be due to invalid IL or missing references)
				//IL_01b4: Unknown result type (might be due to invalid IL or missing references)
				//IL_01b9: Unknown result type (might be due to invalid IL or missing references)
				//IL_01be: Unknown result type (might be due to invalid IL or missing references)
				//IL_01c8: Unknown result type (might be due to invalid IL or missing references)
				//IL_01c9: Unknown result type (might be due to invalid IL or missing references)
				//IL_01ce: Unknown result type (might be due to invalid IL or missing references)
				//IL_01d3: Unknown result type (might be due to invalid IL or missing references)
				//IL_01ec: Unknown result type (might be due to invalid IL or missing references)
				//IL_01f3: Unknown result type (might be due to invalid IL or missing references)
				//IL_01f9: Unknown result type (might be due to invalid IL or missing references)
				//IL_0203: Unknown result type (might be due to invalid IL or missing references)
				//IL_0208: Unknown result type (might be due to invalid IL or missing references)
				if (IsStaticModEnabled() && IsGodModeFlightEnabled())
				{
					if (!_prevGodModeFlightEnabled)
					{
						_prevGodModeFlightEnabled = true;
						if ((Object)(object)PlayerAvatar.instance != (Object)null)
						{
							string text = PlayerAvatarSteamIDRef.Invoke(PlayerAvatar.instance);
							if (!string.IsNullOrEmpty(text))
							{
								SetPlayerGodMode(text, enable: true);
							}
						}
					}
					if ((Object)(object)player.playerAvatarScript != (Object)null)
					{
						bool num = AccessTools.FieldRefAccess<PlayerAvatar, bool>("isTumbling").Invoke(player.playerAvatarScript);
						PlayerTumble val = AccessTools.FieldRefAccess<PlayerAvatar, PlayerTumble>("tumble").Invoke(player.playerAvatarScript);
						if (num && (Object)(object)val != (Object)null)
						{
							val.TumbleRequest(false, false);
						}
					}
					if ((Object)(object)player.rb != (Object)null)
					{
						player.rb.isKinematic = true;
						player.rb.useGravity = false;
						player.rb.velocity = Vector3.zero;
					}
					if ((Object)(object)player.col != (Object)null && player.col.enabled)
					{
						player.col.enabled = false;
					}
					float num2 = 12f;
					if (SemiFunc.InputHold((InputKey)15) || player.sprinting)
					{
						num2 = 28f;
					}
					float num3 = SemiFunc.InputMovementX();
					float num4 = SemiFunc.InputMovementY();
					Vector3 val2 = Vector3.zero;
					Camera main = Camera.main;
					if ((Object)(object)main != (Object)null)
					{
						Vector3 forward = ((Component)main).transform.forward;
						Vector3 right = ((Component)main).transform.right;
						val2 += forward * num4;
						val2 += right * num3;
					}
					else
					{
						val2 += ((Component)player).transform.forward * num4;
						val2 += ((Component)player).transform.right * num3;
					}
					if (SemiFunc.InputHold((InputKey)1))
					{
						val2 += Vector3.up;
					}
					if (SemiFunc.InputHold((InputKey)12))
					{
						val2 -= Vector3.up;
					}
					if (((Vector3)(ref val2)).sqrMagnitude > 0.001f)
					{
						Transform transform = ((Component)player).transform;
						transform.position += ((Vector3)(ref val2)).normalized * num2 * Time.deltaTime;
					}
				}
				else
				{
					if (!_prevGodModeFlightEnabled)
					{
						return;
					}
					_prevGodModeFlightEnabled = false;
					if ((Object)(object)PlayerAvatar.instance != (Object)null)
					{
						string text2 = PlayerAvatarSteamIDRef.Invoke(PlayerAvatar.instance);
						if (!string.IsNullOrEmpty(text2))
						{
							SetPlayerGodMode(text2, enable: false);
						}
					}
					if ((Object)(object)player.rb != (Object)null)
					{
						player.rb.isKinematic = false;
						player.rb.useGravity = true;
					}
					if ((Object)(object)player.col != (Object)null)
					{
						player.col.enabled = true;
					}
				}
			}
		}

		[HarmonyPatch(typeof(ItemUpgradePlayerTumbleWingsLogic), "LoopSound")]
		private class ItemUpgradePlayerTumbleWingsLogic_LoopSound_Patch
		{
			[HarmonyPrefix]
			private static bool Prefix(ItemUpgradePlayerTumbleWingsLogic __instance)
			{
				if (!IsWingsSoundEnabled())
				{
					try
					{
						if (__instance.soundWingsLoop != null)
						{
							__instance.soundWingsLoop.PlayLoop(false, 2f, 2f, 1f, 1f);
						}
					}
					catch
					{
					}
					return false;
				}
				return true;
			}
		}

		[HarmonyPatch(typeof(ItemUpgradePlayerTumbleWingsLogic), "FixedUpdate")]
		private class ItemUpgradePlayerTumbleWingsLogic_FixedUpdate_Patch
		{
			[HarmonyPostfix]
			private static void Postfix(ItemUpgradePlayerTumbleWingsLogic __instance)
			{
				//IL_00ce: Unknown result type (might be due to invalid IL or missing references)
				//IL_00d3: Unknown result type (might be due to invalid IL or missing references)
				//IL_00e2: Unknown result type (might be due to invalid IL or missing references)
				//IL_00e6: Unknown result type (might be due to invalid IL or missing references)
				if (!IsStaticModEnabled() || !IsTumbleFlyEnabled())
				{
					return;
				}
				try
				{
					if (!((Object)(object)__instance.playerAvatar != (Object)null) || !PlayerAvatarIsLocalRef.Invoke(__instance.playerAvatar))
					{
						return;
					}
					PlayerTumble val = WingsPlayerTumbleRef.Invoke(__instance);
					PhysGrabObject val2 = (((Object)(object)val != (Object)null) ? PlayerTumblePhysGrabObjectRef.Invoke(val) : null);
					Keyboard current = Keyboard.current;
					if (current == null || !((ButtonControl)current.qKey).isPressed || !((Object)(object)val != (Object)null) || !PlayerTumbleIsTumblingRef.Invoke(val) || !((Object)(object)val2 != (Object)null) || !((Object)(object)val2.rb != (Object)null))
					{
						return;
					}
					Transform overrideTransform = __instance.playerAvatar.localCamera.GetOverrideTransform();
					if ((Object)(object)overrideTransform != (Object)null)
					{
						Vector3 forward = overrideTransform.forward;
						float num = 16f;
						val2.rb.velocity = forward * num;
						val.OverrideLookAtCamera(0.1f, 10f, 5f);
						if (!PlayerAvatarUpgradeTumbleWingsVisualsActiveRef.Invoke(__instance.playerAvatar))
						{
							__instance.playerAvatar.UpgradeTumbleWingsVisualsActive(true, false);
							PlayerAvatarUpgradeTumbleWingsVisualsActiveRef.Invoke(__instance.playerAvatar) = true;
						}
						TumbleWingTimerRef.Invoke(__instance) = 1f;
					}
				}
				catch (Exception arg)
				{
					Plugin instance = Instance;
					if (instance != null)
					{
						((BaseUnityPlugin)instance).Logger.LogWarning((object)$"[ItemUpgradePlayerTumbleWingsLogic.FixedUpdate Patch Error]: {arg}");
					}
				}
			}
		}

		[HarmonyPatch(typeof(EnemyParent), "Despawn")]
		private class EnemyParent_Despawn_Patch
		{
			[HarmonyPostfix]
			private static void Postfix(EnemyParent __instance)
			{
				if (!IsTab3Enabled() || (PhotonNetwork.InRoom && !PhotonNetwork.IsMasterClient))
				{
					return;
				}
				try
				{
					if (!((Object)(object)((Component)__instance).GetComponent<SpawnedByGameToolsHelper>() != (Object)null) || _cfgSpawnedAutoRespawn)
					{
						return;
					}
					Enemy val = EnemyParentEnemyRef.Invoke(__instance);
					if (!((Object)(object)val != (Object)null))
					{
						return;
					}
					EnemyHealth val2 = EnemyHealthRef.Invoke(val);
					if (!((Object)(object)val2 != (Object)null) || EnemyHealthCurrentRef.Invoke(val2) > 0)
					{
						return;
					}
					if ((Object)(object)EnemyDirector.instance != (Object)null && EnemyDirector.instance.enemiesSpawned != null)
					{
						EnemyDirector.instance.enemiesSpawned.Remove(__instance);
					}
					if (PhotonNetwork.InRoom)
					{
						if (PhotonNetwork.IsMasterClient)
						{
							PhotonNetwork.Destroy(((Component)__instance).gameObject);
						}
					}
					else
					{
						Object.Destroy((Object)(object)((Component)__instance).gameObject);
					}
				}
				catch (Exception arg)
				{
					Plugin instance = Instance;
					if (instance != null)
					{
						((BaseUnityPlugin)instance).Logger.LogWarning((object)$"[EnemyParent.Despawn Postfix Error]: {arg}");
					}
				}
			}
		}

		[HarmonyPatch(typeof(EnemyDirector), "AmountSetup")]
		private class EnemyDirector_AmountSetup_Patch
		{
			[HarmonyPostfix]
			private static void Postfix(EnemyDirector __instance)
			{
				if (!IsTab4Enabled() || (PhotonNetwork.InRoom && !PhotonNetwork.IsMasterClient))
				{
					return;
				}
				try
				{
					float spawnRateMultiplier = GetSpawnRateMultiplier();
					if (!(spawnRateMultiplier > 1f))
					{
						return;
					}
					int num = EnemyDirectorAmountCurve1ValueRef.Invoke(__instance);
					int num2 = EnemyDirectorAmountCurve2ValueRef.Invoke(__instance);
					int num3 = EnemyDirectorAmountCurve3ValueRef.Invoke(__instance);
					int num4 = Mathf.RoundToInt((float)num * (spawnRateMultiplier - 1f));
					int num5 = Mathf.RoundToInt((float)num2 * (spawnRateMultiplier - 1f));
					int num6 = Mathf.RoundToInt((float)num3 * (spawnRateMultiplier - 1f));
					MethodInfo method = typeof(EnemyDirector).GetMethod("PickEnemies", BindingFlags.Instance | BindingFlags.NonPublic);
					if (method != null)
					{
						for (int i = 0; i < num6; i++)
						{
							method.Invoke(__instance, new object[1] { __instance.enemiesDifficulty3 });
						}
						for (int j = 0; j < num5; j++)
						{
							method.Invoke(__instance, new object[1] { __instance.enemiesDifficulty2 });
						}
						for (int k = 0; k < num4; k++)
						{
							method.Invoke(__instance, new object[1] { __instance.enemiesDifficulty1 });
						}
					}
					EnemyDirectorAmountCurve1ValueRef.Invoke(__instance) = num + num4;
					EnemyDirectorAmountCurve2ValueRef.Invoke(__instance) = num2 + num5;
					EnemyDirectorAmountCurve3ValueRef.Invoke(__instance) = num3 + num6;
					EnemyDirectorTotalAmountRef.Invoke(__instance) = EnemyDirectorTotalAmountRef.Invoke(__instance) + num4 + num5 + num6;
					Plugin instance = Instance;
					if (instance != null)
					{
						((BaseUnityPlugin)instance).Logger.LogInfo((object)$"[GameTools] Spawn Multiplier {spawnRateMultiplier}x applied! Added slots: Difficulty1={num4}, Difficulty2={num5}, Difficulty3={num6}. Total slots: {EnemyDirectorTotalAmountRef.Invoke(__instance)}");
					}
				}
				catch (Exception arg)
				{
					Plugin instance2 = Instance;
					if (instance2 != null)
					{
						((BaseUnityPlugin)instance2).Logger.LogWarning((object)$"[EnemyDirector.AmountSetup Postfix Error]: {arg}");
					}
				}
			}
		}

		[HarmonyPatch(typeof(ItemBattery), "Update")]
		private class ItemBattery_Update_Patch
		{
			[HarmonyPrefix]
			private static void Prefix(ItemBattery __instance, ref float __state)
			{
				__state = -1f;
				if (IsStaticModEnabled() && IsInfiniteWeaponBatteryEnabled() && IsWeapon(__instance))
				{
					__state = __instance.batteryLife;
				}
			}

			[HarmonyPostfix]
			private static void Postfix(ItemBattery __instance, float __state)
			{
				if (__state >= 0f)
				{
					__instance.batteryLife = __state;
				}
			}
		}

		[HarmonyPatch(typeof(ItemBattery), "Drain")]
		private class ItemBattery_Drain_Patch
		{
			[HarmonyPrefix]
			private static bool Prefix(ItemBattery __instance)
			{
				if (IsStaticModEnabled() && IsInfiniteWeaponBatteryEnabled() && IsWeapon(__instance))
				{
					return false;
				}
				return true;
			}
		}

		[HarmonyPatch(typeof(ItemBattery), "RemoveFullBar")]
		private class ItemBattery_RemoveFullBar_Patch
		{
			[HarmonyPrefix]
			private static bool Prefix(ItemBattery __instance)
			{
				if (IsStaticModEnabled() && IsInfiniteWeaponBatteryEnabled() && IsWeapon(__instance))
				{
					return false;
				}
				return true;
			}
		}

		[HarmonyPatch(typeof(PlayerHealth), "Hurt")]
		private class PlayerHealth_Hurt_Patch
		{
			[HarmonyPrefix]
			private static bool Prefix(PlayerHealth __instance)
			{
				if (!IsStaticModEnabled())
				{
					return true;
				}
				try
				{
					PlayerAvatar val = PlayerHealthAvatarRef.Invoke(__instance);
					if ((Object)(object)val != (Object)null && PlayerAvatarIsLocalRef.Invoke(val) && IsPlayerGodMode(PlayerAvatarSteamIDRef.Invoke(val)))
					{
						PlayerHealthCurrentRef.Invoke(__instance) = PlayerHealthMaxRef.Invoke(__instance);
						return false;
					}
				}
				catch (Exception arg)
				{
					Plugin instance = Instance;
					if (instance != null)
					{
						((BaseUnityPlugin)instance).Logger.LogWarning((object)$"[PlayerHealth.Hurt Patch Error]: {arg}");
					}
				}
				return true;
			}
		}

		[HarmonyPatch(typeof(PlayerHealth), "Update")]
		private class PlayerHealth_Update_Patch
		{
			[HarmonyPrefix]
			private static void Prefix(PlayerHealth __instance)
			{
				if (!IsStaticModEnabled())
				{
					return;
				}
				try
				{
					PlayerAvatar val = PlayerHealthAvatarRef.Invoke(__instance);
					if ((Object)(object)val != (Object)null && PlayerAvatarIsLocalRef.Invoke(val) && IsPlayerGodMode(PlayerAvatarSteamIDRef.Invoke(val)))
					{
						int num = PlayerHealthMaxRef.Invoke(__instance);
						if (PlayerHealthCurrentRef.Invoke(__instance) < num)
						{
							PlayerHealthCurrentRef.Invoke(__instance) = num;
						}
					}
				}
				catch (Exception arg)
				{
					Plugin instance = Instance;
					if (instance != null)
					{
						((BaseUnityPlugin)instance).Logger.LogWarning((object)$"[PlayerHealth.Update Patch Error]: {arg}");
					}
				}
			}
		}

		[HarmonyPatch(typeof(CameraPosition), "Awake")]
		private class CameraPosition_Awake_Patch
		{
			[HarmonyPostfix]
			private static void Postfix()
			{
				CameraPosition_Update_Patch.ResetState();
			}
		}

		[HarmonyPatch(typeof(CameraPosition), "Update")]
		private class CameraPosition_Update_Patch
		{
			private static bool _prevThirdPersonEnabled = false;

			private static Vector3 _lastMainCamLocalPos = Vector3.zero;

			public static void ResetState()
			{
				//IL_0006: Unknown result type (might be due to invalid IL or missing references)
				//IL_000b: Unknown result type (might be due to invalid IL or missing references)
				_prevThirdPersonEnabled = false;
				_lastMainCamLocalPos = Vector3.zero;
			}

			[HarmonyPrefix]
			private static void Prefix(CameraPosition __instance)
			{
				//IL_0075: Unknown result type (might be due to invalid IL or missing references)
				if (!IsStaticModEnabled())
				{
					return;
				}
				try
				{
					bool flag = IsThirdPersonEnabled();
					bool flag2 = CameraPositionOverridePositionActiveRef.Invoke(__instance) || CameraPositionOverridePositionTimerRef.Invoke(__instance) > 0f;
					if ((Object)(object)PlayerAvatar.instance != (Object)null && PlayerAvatarIsLocalRef.Invoke(PlayerAvatar.instance) && flag && _prevThirdPersonEnabled && !flag2)
					{
						Camera main = Camera.main;
						if ((Object)(object)main != (Object)null)
						{
							((Component)main).transform.localPosition = _lastMainCamLocalPos;
						}
					}
				}
				catch (Exception arg)
				{
					Plugin instance = Instance;
					if (instance != null)
					{
						((BaseUnityPlugin)instance).Logger.LogWarning((object)$"[CameraPosition.Update Prefix Patch Error]: {arg}");
					}
				}
			}

			[HarmonyPostfix]
			private static void Postfix(CameraPosition __instance)
			{
				//IL_029b: Unknown result type (might be due to invalid IL or missing references)
				//IL_02da: Unknown result type (might be due to invalid IL or missing references)
				//IL_008a: Unknown result type (might be due to invalid IL or missing references)
				//IL_008f: Unknown result type (might be due to invalid IL or missing references)
				//IL_00d6: 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_016b: Unknown result type (might be due to invalid IL or missing references)
				//IL_0176: Unknown result type (might be due to invalid IL or missing references)
				//IL_017b: 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_019c: Unknown result type (might be due to invalid IL or missing references)
				//IL_019d: 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_01a7: 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_01b3: Unknown result type (might be due to invalid IL or missing references)
				//IL_01b5: Unknown result type (might be due to invalid IL or missing references)
				//IL_01b7: Unknown result type (might be due to invalid IL or missing references)
				//IL_01be: Unknown result type (might be due to invalid IL or missing references)
				//IL_01c3: 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_01cf: 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_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_01e2: Unknown result type (might be due to invalid IL or missing references)
				//IL_01ef: Unknown result type (might be due to invalid IL or missing references)
				//IL_01f4: Unknown result type (might be due to invalid IL or missing references)
				//IL_01f6: Unknown result type (might be due to invalid IL or missing references)
				//IL_01f7: Unknown result type (might be due to invalid IL or missing references)
				//IL_01f9: Unknown result type (might be due to invalid IL or missing references)
				//IL_01fe: Unknown result type (might be due to invalid IL or missing references)
				//IL_0225: Unknown result type (might be due to invalid IL or missing references)
				//IL_022b: Unknown result type (might be due to invalid IL or missing references)
				//IL_0267: Unknown result type (might be due to invalid IL or missing references)
				//IL_023b: Unknown result type (might be due to invalid IL or missing references)
				//IL_023c: Unknown result type (might be due to invalid IL or missing references)
				//IL_0255: 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_025f: Unknown result type (might be due to invalid IL or missing references)
				if (!IsStaticModEnabled())
				{
					return;
				}
				try
				{
					bool flag = IsThirdPersonEnabled();
					bool flag2 = CameraPositionOverridePositionActiveRef.Invoke(__instance) || CameraPositionOverridePositionTimerRef.Invoke(__instance) > 0f;
					if (!((Object)(object)PlayerAvatar.instance != (Object)null) || !PlayerAvatarIsLocalRef.Invoke(PlayerAvatar.instance))
					{
						return;
					}
					if (flag && !flag2)
					{
						Camera main = Camera.main;
						if (!((Object)(object)main != (Object)null))
						{
							return;
						}
						if (!_prevThirdPersonEnabled)
						{
							_prevThirdPersonEnabled = true;
							_lastMainCamLocalPos = ((Component)main).transform.localPosition;
						}
						if ((Object)(object)PlayerAvatar.instance.playerAvatarVisuals != (Object)null)
						{
							PlayerAvatar.instance.playerAvatarVisuals.ShowSelfOverride(0.5f);
							float thirdPersonModelScale = GetThirdPersonModelScale();
							((Component)PlayerAvatar.instance.playerAvatarVisuals).transform.localScale = new Vector3(thirdPersonModelScale, thirdPersonModelScale, thirdPersonModelScale);
						}
						PhysGrabber physGrabber = PlayerAvatar.instance.physGrabber;
						if (physGrabber != null)
						{
							physGrabber.SetThirdPerson(true);
						}
						FlashlightController flashlightController = PlayerAvatar.instance.flashlightController;
						if (flashlightController != null)
						{
							flashlightController.SetThirdPerson(true);
						}
						if ((Object)(object)PlayerAvatar.instance.playerAvatarVisuals != (Object)null)
						{
							PlayerAvatarRightArm val = PlayerAvatarVisualsRightArmRef.Invoke(PlayerAvatar.instance.playerAvatarVisuals);
							if ((Object)(object)val != (Object)null && (Object)(object)val.grabberOrb != (Object)null)
							{
								((Component)val.grabberOrb).gameObject.SetActive(false);
							}
						}
						_lastMainCamLocalPos = ((Component)main).transform.localPosition;
						Vector3 position = ((Component)main).transform.position;
						Quaternion rotation = ((Component)main).transform.rotation;
						float thirdPersonDistance = GetThirdPersonDistance();
						float thirdPersonHeight = GetThirdPersonHeight();
						float thirdPersonHorizontal = GetThirdPersonHorizontal();
						Vector3 val2 = rotation * Vector3.forward;
						Vector3 val3 = rotation * Vector3.right;
						Vector3 val4 = -val2 * thirdPersonDistance + Vector3.up * thirdPersonHeight + val3 * thirdPersonHorizontal;
						float magnitude = ((Vector3)(ref val4)).magnitude;
						Vector3 normalized = ((Vector3)(ref val4)).normalized;
						Vector3 position2 = position + val4;
						int mask = LayerMask.GetMask(new string[3] { "Default", "World", "Terrain" });
						RaycastHit val5 = default(RaycastHit);
						if (Physics.SphereCast(position, 0.2f, normalized, ref val5, magnitude, mask, (QueryTriggerInteraction)1))
						{
							position2 = position + normalized * Mathf.Max(0.1f, ((RaycastHit)(ref val5)).distance - 0.05f);
						}
						((Component)main).transform.position = position2;
					}
					else
					{
						if (!_prevThirdPersonEnabled)
						{
							return;
						}
						_prevThirdPersonEnabled = false;
						Camera main2 = Camera.main;
						if ((Object)(object)main2 != (Object)null)
						{
							((Component)main2).transform.localPosition = _lastMainCamLocalPos;
						}
						if ((Object)(object)PlayerAvatar.instance.playerAvatarVisuals != (Object)null)
						{
							PlayerAvatar.instance.playerAvatarVisuals.ShowSelfOverride(0f);
							((Component)PlayerAvatar.instance.playerAvatarVisuals).transform.localScale = Vector3.one;
						}
						if (!flag)
						{
							PhysGrabber physGrabber2 = PlayerAvatar.instance.physGrabber;
							if (physGrabber2 != null)
							{
								physGrabber2.SetThirdPerson(false);
							}
							FlashlightController flashlightController2 = PlayerAvatar.instance.flashlightController;
							if (flashlightController2 != null)
							{
								flashlightController2.SetThirdPerson(false);
							}
						}
					}
				}
				catch (Exception arg)
				{
					Plugin instance = Instance;
					if (instance != null)
					{
						((BaseUnityPlugin)instance).Logger.LogWarning((object)$"[CameraPosition.Update Postfix Patch Error]: {arg}");
					}
				}
			}
		}

		[HarmonyPatch(typeof(FlashlightController), "Update")]
		private class FlashlightController_Update_Patch
		{
			[HarmonyPostfix]
			private static void Postfix(FlashlightController __instance)
			{
				//IL_0069: Unknown result type (might be due to invalid IL or missing references)
				//IL_007f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0095: Unknown result type (might be due to invalid IL or missing references)
				//IL_009b: Unknown result type (might be due to invalid IL or missing references)
				//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
				//IL_00ce: Unknown result type (might be due to invalid IL or missing references)
				//IL_00e9: 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_0113: Unknown result type (might be due to invalid IL or missing references)
				if (!IsStaticModEnabled())
				{
					return;
				}
				try
				{
					if ((Object)(object)__instance.PlayerAvatar != (Object)null && PlayerAvatarIsLocalRef.Invoke(__instance.PlayerAvatar) && IsThirdPersonEnabled() && (Object)(object)__instance.FollowTransformClient != (Object)null)
					{
						float num = AccessTools.FieldRefAccess<FlashlightController, float>("hiddenScale").Invoke(__instance);
						((Component)__instance).transform.position = __instance.FollowTransformClient.position;
						((Component)__instance).transform.rotation = __instance.FollowTransformClient.rotation;
						((Component)__instance).transform.localScale = __instance.FollowTransformClient.localScale * num * GetThirdPersonModelScale();
						if ((Object)(object)__instance.meshShadows != (Object)null)
						{
							((Component)__instance.meshShadows).transform.position = __instance.FollowTransformClient.position;
							((Component)__instance.meshShadows).transform.rotation = __instance.FollowTransformClient.rotation;
							((Component)__instance.meshShadows).transform.localScale = ((Component)__instance.mesh).transform.localScale * GetThirdPersonModelScale();
						}
					}
				}
				catch (Exception arg)
				{
					Plugin instance = Instance;
					if (instance != null)
					{
						((BaseUnityPlugin)instance).Logger.LogWarning((object)$"[FlashlightController.Update Postfix Patch Error]: {arg}");
					}
				}
			}
		}

		[HarmonyPatch(typeof(InputManager))]
		private class InputManager_Block_Patch
		{
			[HarmonyPrefix]
			[HarmonyPatch("KeyDown")]
			private static bool PrefixKeyDown(ref bool __result)
			{
				if (IsStaticModEnabled() && IsWindowOpen())
				{
					__result = false;
					return false;
				}
				return true;
			}

			[HarmonyPrefix]
			[HarmonyPatch("KeyUp")]
			private static bool PrefixKeyUp(ref bool __result)
			{
				if (IsStaticModEnabled() && IsWindowOpen())
				{
					__result = false;
					return false;
				}
				return true;
			}

			[HarmonyPrefix]
			[HarmonyPatch("KeyHold")]
			private static bool PrefixKeyHold(ref bool __result)
			{
				if (IsStaticModEnabled() && IsWindowOpen())
				{
					__result = false;
					return false;
				}
				return true;
			}

			[HarmonyPrefix]
			[HarmonyPatch("GetMovementX")]
			private static bool PrefixGetMovementX(ref float __result)
			{
				if (IsStaticModEnabled() && IsWindowOpen())
				{
					__result = 0f;
					return false;
				}
				return true;
			}

			[HarmonyPrefix]
			[HarmonyPatch("GetMovementY")]
			private static bool PrefixGetMovementY(ref float __result)
			{
				if (IsStaticModEnabled() && IsWindowOpen())
				{
					__result = 0f;
					return false;
				}
				return true;
			}

			[HarmonyPrefix]
			[HarmonyPatch("GetScrollY")]
			private static bool PrefixGetScrollY(ref float __result)
			{
				if (IsStaticModEnabled() && IsWindowOpen())
				{
					__result = 0f;
					return false;
				}
				return true;
			}

			[HarmonyPrefix]
			[HarmonyPatch("KeyPullAndPush")]
			private static bool PrefixKeyPullAndPush(ref float __result)
			{
				if (IsStaticModEnabled() && IsWindowOpen())
				{
					__result = 0f;
					return false;
				}
				return true;
			}
		}

		internal sealed class LiveLabel
		{
			public WeakReference<TextMeshProUGUI> Tmp;

			public CfgI18N I18N;

			public bool IsSection;
		}

		internal sealed class LiveValue
		{
			public WeakReference<Object> InputField;

			public CfgI18N I18N;
		}

		internal sealed class LiveSliderOptions
		{
			public WeakReference<Object> Slider;

			public CfgI18N I18N;

			public string[] OptionsCN;

			public string[] OptionsEN;
		}

		internal sealed class LiveToggleButtons
		{
			public WeakReference<TextMeshProUGUI> LeftTmp;

			public WeakReference<TextMeshProUGUI> RightTmp;
		}

		public const string PluginGuid = "zichen.gametools";

		public const string PluginName = "GameTools";

		public const string PluginVersion = "1.0.2";

		internal static Plugin Instance;

		internal static Vector3 _lastRemoteTpPos = Vector3.zero;

		internal static float _lastRemoteTpTime = 0f;

		private Harmony _harmony;

		internal static readonly FieldRef<PlayerController, string> PlayerSteamIDRef = AccessTools.FieldRefAccess<PlayerController, string>("playerSteamID");

		internal static readonly FieldRef<PlayerAvatar, string> PlayerAvatarSteamIDRef = AccessTools.FieldRefAccess<PlayerAvatar, string>("steamID");

		internal static readonly FieldRef<PlayerAvatar, bool> PlayerAvatarIsLocalRef = AccessTools.FieldRefAccess<PlayerAvatar, bool>("isLocal");

		internal static readonly FieldRef<PlayerAvatar, string> PlayerAvatarPlayerNameRef = AccessTools.FieldRefAccess<PlayerAvatar, string>("playerName");

		internal static readonly FieldRef<PlayerAvatar, bool> PlayerAvatarDeadSetRef = AccessTools.FieldRefAccess<PlayerAvatar, bool>("deadSet");

		internal static readonly FieldRef<PlayerAvatar, PlayerTumble> PlayerAvatarTumbleRef = AccessTools.FieldRefAccess<PlayerAvatar, PlayerTumble>("tumble");

		internal static readonly FieldRef<PlayerAvatar, float> PlayerAvatarUpgradeTumbleWingsRef = AccessTools.FieldRefAccess<PlayerAvatar, float>("upgradeTumbleWings");

		internal static readonly FieldRef<PlayerAvatar, bool> PlayerAvatarUpgradeTumbleWingsVisualsActiveRef = AccessTools.FieldRefAccess<PlayerAvatar, bool>("upgradeTumbleWingsVisualsActive");

		internal static readonly FieldRef<PlayerAvatar, PlayerDeathHead> PlayerAvatarPlayerDeathHeadRef = AccessTools.FieldRefAccess<PlayerAvatar, PlayerDeathHead>("playerDeathHead");

		internal static readonly FieldRef<PlayerDeathHead, PhysGrabObject> PlayerDeathHeadPhysGrabObjectRef = AccessTools.FieldRefAccess<PlayerDeathHead, PhysGrabObject>("physGrabObject");

		internal static readonly FieldRef<ItemUpgradePlayerTumbleWingsLogic, MeshRenderer> Wing1MeshRendererRef = AccessTools.FieldRefAccess<ItemUpgradePlayerTumbleWingsLogic, MeshRenderer>("wing1MeshRenderer");

		internal static readonly FieldRef<ItemUpgradePlayerTumbleWingsLogic, MeshRenderer> Wing2MeshRendererRef = AccessTools.FieldRefAccess<ItemUpgradePlayerTumbleWingsLogic, MeshRenderer>("wing2MeshRenderer");

		internal static readonly FieldRef<ItemUpgradePlayerTumbleWingsLogic, PlayerTumble> WingsPlayerTumbleRef = AccessTools.FieldRefAccess<ItemUpgradePlayerTumbleWingsLogic, PlayerTumble>("playerTumble");

		internal static readonly FieldRef<ItemUpgradePlayerTumbleWingsLogic, float> TumbleWingTimerRef = AccessTools.FieldRefAccess<ItemUpgradePlayerTumbleWingsLogic, float>("tumbleWingTimer");

		internal static readonly FieldRef<PlayerTumble, PhysGrabObject> PlayerTumblePhysGrabObjectRef = AccessTools.FieldRefAccess<PlayerTumble, PhysGrabObject>("physGrabObject");

		internal static readonly FieldRef<PlayerTumble, bool> PlayerTumbleIsTumblingRef = AccessTools.FieldRefAccess<PlayerTumble, bool>("isTumbling");

		internal static readonly FieldRef<EnemyParent, bool> EnemyParentSetupDoneRef = AccessTools.FieldRefAccess<EnemyParent, bool>("SetupDone");

		internal static readonly FieldRef<EnemyParent, bool> EnemyParentFirstSpawnPointUsedRef = AccessTools.FieldRefAccess<EnemyParent, bool>("firstSpawnPointUsed");

		internal static readonly FieldRef<EnemyDirector, float> EnemyDirectorSpawnIdlePauseTimerRef = AccessTools.FieldRefAccess<EnemyDirector, float>("spawnIdlePauseTimer");

		internal static readonly FieldRef<EnemyParent, bool> EnemyParentSpawnedRef = AccessTools.FieldRefAccess<EnemyParent, bool>("Spawned");

		internal static readonly FieldRef<EnemyParent, bool> EnemyParentPlayerCloseRef = AccessTools.FieldRefAccess<EnemyParent, bool>("playerClose");

		internal static readonly FieldRef<EnemyParent, Enemy> EnemyParentEnemyRef = AccessTools.FieldRefAccess<EnemyParent, Enemy>("Enemy");

		internal static readonly FieldRef<Enemy, EnemyHealth> EnemyHealthRef = AccessTools.FieldRefAccess<Enemy, EnemyHealth>("Health");

		internal static readonly FieldRef<EnemyHealth, int> EnemyHealthCurrentRef = AccessTools.FieldRefAccess<EnemyHealth, int>("healthCurrent");

		internal static readonly FieldRef<PlayerHealth, int> PlayerHealthCurrentRef = AccessTools.FieldRefAccess<PlayerHealth, int>("health");

		internal static readonly FieldRef<PlayerHealth, int> PlayerHealthMaxRef = AccessTools.FieldRefAccess<PlayerHealth, int>("maxHealth");

		internal static readonly FieldRef<PlayerHealth, PlayerAvatar> PlayerHealthAvatarRef = AccessTools.FieldRefAccess<PlayerHealth, PlayerAvatar>("playerAvatar");

		internal static readonly FieldRef<CursorManager, float> CursorManagerUnlockTimerRef = AccessTools.FieldRefAccess<CursorManager, float>("unlockTimer");

		internal static readonly FieldRef<RunManager, bool> RunManagerLevelIsShopRef = AccessTools.FieldRefAccess<RunManager, bool>("levelIsShop");

		internal static readonly FieldRef<EnemyNavMeshAgent, NavMeshAgent> EnemyNavMeshAgentAgentRef = AccessTools.FieldRefAccess<EnemyNavMeshAgent, NavMeshAgent>("Agent");

		internal static readonly FieldRef<Enemy, bool> EnemyHasRigidbodyRef = AccessTools.FieldRefAccess<Enemy, bool>("HasRigidbody");

		internal static readonly FieldRef<Enemy, EnemyRigidbody> EnemyRigidbodyRef = AccessTools.FieldRefAccess<Enemy, EnemyRigidbody>("Rigidbody");

		internal static readonly FieldRef<EnemyRigidbody, Rigidbody> EnemyRigidbodyRbRef = AccessTools.FieldRefAccess<EnemyRigidbody, Rigidbody>("rb");

		internal static readonly FieldRef<EnemyRigidbody, Transform> EnemyRigidbodyFollowTargetRef = AccessTools.FieldRefAccess<EnemyRigidbody, Transform>("followTarget");

		internal static readonly FieldRef<EnemyRigidbody, PhysGrabObject> EnemyRigidbodyPhysGrabObjectRef = AccessTools.FieldRefAccess<EnemyRigidbody, PhysGrabObject>("physGrabObject");

		internal static readonly FieldRef<EnemyDirector, int> EnemyDirectorAmountCurve1ValueRef = AccessTools.FieldRefAccess<EnemyDirector, int>("amountCurve1Value");

		internal static readonly FieldRef<EnemyDirector, int> EnemyDirectorAmountCurve2ValueRef = AccessTools.FieldRefAccess<EnemyDirector, int>("amountCurve2Value");

		internal static readonly FieldRef<EnemyDirector, int> EnemyDirectorAmountCurve3ValueRef = AccessTools.FieldRefAccess<EnemyDirector, int>("amountCurve3Value");

		internal static readonly FieldRef<EnemyDirector, int> EnemyDirectorTotalAmountRef = AccessTools.FieldRefAccess<EnemyDirector, int>("totalAmount");

		internal static readonly FieldRef<PlayerAvatarVisuals, PlayerAvatarRightArm> PlayerAvatarVisualsRightArmRef = AccessTools.FieldRefAccess<PlayerAvatarVisuals, PlayerAvatarRightArm>("playerAvatarRightArm");

		internal static readonly FieldRef<CameraPosition, bool> CameraPositionOverridePositionActiveRef = AccessTools.FieldRefAccess<CameraPosition, bool>("overridePositionActive");

		internal static readonly FieldRef<CameraPosition, float> CameraPositionOverridePositionTimerRef = AccessTools.FieldRefAccess<CameraPosition, float>("overridePositionTimer");

		private bool _windowOpen;

		private int _currentTab;

		private CursorLockMode _prevLockMode;

		private bool _prevVisible;

		internal static int _realUpgradeHealth = -1;

		internal static int _realUpgradeStamina = -1;

		internal static int _realUpgradeSpeed = -1;

		private static ConfigFile _runtimeConfig;

		private static ConfigEntry<bool> _cfgModEnabled;

		private static ConfigEntry<bool> _cfgProhibitOthers;

		private static ConfigEntry<DisplayLanguage> _cfgLanguage;

		private ConfigEntry<string> _openKey;

		private static ConfigEntry<bool> _cfgWingsAlwaysShow;

		private static ConfigEntry<bool> _cfgEnableWingsSound;

		private static ConfigEntry<bool> _cfgJumpMultiplierEnabled;

		private static ConfigEntry<float> _cfgJumpMultiplier;

		private static ConfigEntry<bool> _cfgTumbleFlyEnabled;

		private static ConfigEntry<bool> _cfgInfiniteWeaponBattery;

		private static ConfigEntry<float> _cfgSpawnRateMultiplier;

		private static ConfigEntry<bool> _cfgRemovePillarLimit;

		private static ConfigEntry<bool> _cfgAutoReviveTeammates;

		private static ConfigEntry<bool> _cfgLimitActionAndOvercharge;

		internal static ConfigEntry<bool> _cfgResetMonsterDataOnLevelLoad;

		private static ConfigEntry<int> _cfgWingsColorIndex;

		private static ConfigEntry<int> _cfgWingsShowFrequency;

		private static ConfigEntry<bool> _cfgThirdPersonEnabled;

		private static ConfigEntry<float> _cfgThirdPersonDistance;

		private static ConfigEntry<float> _cfgThirdPersonHeight;

		private static ConfigEntry<float> _cfgThirdPersonModelScale;

		internal static ConfigEntry<float> _cfgThirdPersonHorizontal;

		private static ConfigEntry<bool> _cfgGodModeFlightEnabled;

		private static ConfigEntry<bool> _cfgAllTeammatesGodMode;

		private static readonly HashSet<string> _processedGodModeTeammates = new HashSet<string>();

		private static readonly Dictionary<string, float> _teammateDeathTimers = new Dictionary<string, float>();

		private static readonly HashSet<string> _localGodModePlayers = new HashSet<string>();

		private static ConfigEntry<bool> _cfgTab0Enabled;

		private static ConfigEntry<bool> _cfgTab1Enabled;

		private static ConfigEntry<bool> _cfgTab2Enabled;

		private static ConfigEntry<bool> _cfgTab3Enabled;

		private static ConfigEntry<bool> _cfgTab4Enabled;

		internal static readonly Dictionary<int, float> _enemyScaleDict = new Dictionary<int, float>();

		internal static EnemyScaleSync _enemyScaleSync;

		public static readonly Color[] WingsColors = (Color[])(object)new Color[9]
		{
			new Color(1f, 1f, 1f),
			new Color(1f, 0.15f, 0.15f),
			new Color(0.15f, 1f, 0.15f),
			new Color(0.15f, 0.3f, 1f),
			new Color(1f, 0.9f, 0.15f),
			new Color(0.7f, 0.15f, 1f),
			new Color(0.15f, 1f, 1f),
			new Color(1f, 0.4f, 0.7f),
			new Color(1f, 0.5f, 0f)
		};

		private float _masterCheckTimer;

		private static readonly string[] _chineseModKeywords = new string[6] { "chinese", "简体", "繁體", "繁体", "汉化", "中文" };

		private static readonly string[] _chineseEnvironmentPluginGuids = new string[1] { "gravydevsupreme.xunity.autotranslator" };

		internal static readonly Dictionary<string, CfgI18N> _cfgByEnSection = new Dictionary<string, CfgI18N>(StringComparer.Ordinal);

		internal static readonly Dictionary<string, CfgI18N> _cfgByEnKey = new Dictionary<string, CfgI18N>(StringComparer.Ordinal);

		internal static readonly Dictionary<string, List<CfgI18N>> _cfgByKeyOnly = new Dictionary<string, List<CfgI18N>>(StringComparer.Ordinal);

		private static readonly List<CfgI18N> _cfgI18Ns = new List<CfgI18N>(20);

		internal static GameObject _tempLevelGenGo;

		internal static GameObject _tempEnemyDirGo;

		private static readonly Dictionary<string, string> _chineseNames = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase)
		{
			{ "Oogly", "哭泣鬼 (Oogly)" },
			{ "Tick", "蜱虫 (Tick)" },
			{ "ThinMan", "瘦子触手怪 (Thin Man)" },
			{ "HeartHugger", "抱心怪 (Heart Hugger)" },
			{ "Floater", "漂浮者 (Floater)" },
			{ "Runner", "奔跑者 (Runner)" },
			{ "Slow Walker", "慢行者 (Slow Walker)" },
			{ "Gnome", "地精 (Gnome)" },
			{ "Beamer", "激光怪 (Beamer)" },
			{ "Bomb Thrower", "投弹者 (Bomb Thrower)" },
			{ "Valuable Thrower", "丢垃圾者 (Valuable Thrower)" },
			{ "Slow Mouth", "大嘴怪 (Slow Mouth)" },
			{ "Upscream", "尖叫怪 (Upscream)" },
			{ "Tricycle", "三轮车 (Tricycle)" },
			{ "Bang", "炸弹人 (Bang)" },
			{ "Head Grabber", "抱头怪 (Head Grabber)" },
			{ "Gun Tranq", "麻醉枪" },
			{ "Gun Laser", "激光枪" },
			{ "Mine Explosive", "爆炸地雷" },
			{ "Mine Stun", "电击地雷" },
			{ "Grenade Stun", "闪光眩晕弹" },
			{ "Grenade Explosive", "爆炸手雷" },
			{ "Grenade Shockwave", "冲击波弹" },
			{ "Grenade Human", "诱饵弹" },
			{ "Grenade Duct Taped", "胶带手雷" },
			{ "Melee Inflatable Hammer", "充气气锤" },
			{ "Stun Baton", "电击棒" },
			{ "Staff Void", "虚空法杖" },
			{ "Staff Torque", "扭矩法杖" },
			{ "Staff Zero Gravity", "无重力法杖" },
			{ "Gumball", "扭蛋机" },
			{ "Surplus Small", "剩余物资(小)" },
			{ "Surplus Medium", "剩余物资(中)" },
			{ "Surplus Big", "剩余物资(大)" },
			{ "MoneyBag", "钱袋" },
			{ "Milk", "牛奶瓶" },
			{ "Barrel", "木桶" },
			{ "Jackhammer", "冲击钻" },
			{ "FireExtinguisher", "灭火器" },
			{ "Flamethrower", "火焰喷射器" },
			{ "IceSaw", "电锯/冰锯" },
			{ "Blender", "榨汁机" },
			{ "CrystalBall", "水晶球" },
			{ "BabyHead", "婴儿头" },
			{ "Vehicle Semiscooter Small", "小型滑板车 (Scooter)" },
			{ "Vehicle Cart Small", "小型手推车 (Cart S)" },
			{ "Vehicle Cart Medium", "中型手推车 (Cart M)" },
			{ "Vehicle Cart Big", "大型手推车 (Cart L)" },
			{ "Vehicle Cart Pallet", "液压托盘车 (Pallet)" },
			{ "Pocket Cart", "折叠随身车" }
		};

		private static int _currentSubTab = 0;

		private static int _monsterSubTab = 0;

		internal static float _globalDespawnMin = 30f;

		internal static float _globalDespawnMax = 120f;

		internal static float _globalSpawnMin = 60f;

		internal static float _globalSpawnMax = 300f;

		internal static float _originalDespawnMin = 30f;

		internal static float _originalDespawnMax = 120f;

		internal static float _originalSpawnMin = 60f;

		internal static float _originalSpawnMax = 300f;

		internal static bool _globalOverrideInited = false;

		private static Vector2 _subScrollPos = Vector2.zero;

		private static Vector2 _playerScrollPos = Vector2.zero;

		private static int _spawnCount = 1;

		internal static bool _cfgSpawnedAutoRespawn = false;

		internal static bool _cfgSpawnedDelayPull = true;

		private static List<SpawnableInfo> _spawnablesValuables = new List<SpawnableInfo>();

		private static List<SpawnableInfo> _spawnablesMelee = new List<SpawnableInfo>();

		private static List<SpawnableInfo> _spawnablesRanged = new List<SpawnableInfo>();

		private static List<SpawnableInfo> _spawnablesOtherWeapons = new List<SpawnableInfo>();

		private static List<SpawnableInfo> _spawnablesEnemies = new List<SpawnableInfo>();

		private static List<SpawnableInfo> _spawnablesCarts = new List<SpawnableInfo>();

		private static List<SpawnableInfo> _spawnablesVehicles = new List<SpawnableInfo>();

		private static List<SpawnableInfo> _spawnablesPotions = new List<SpawnableInfo>();

		private static List<SpawnableInfo> _spawnablesOthers = new List<SpawnableInfo>();

		private static List<SpawnableInfo> _spawnablesDrones = new List<SpawnableInfo>();

		private static List<SpawnableInfo> _spawnablesCustomItems = new List<SpawnableInfo>();

		private static List<SpawnableInfo> _spawnablesCustomEnemies = new List<SpawnableInfo>();

		private static List<SpawnableInfo> _spawnablesCosmeticBoxes = new List<SpawnableInfo>();

		private static bool _spawnablesLoaded = false;

		private static List<CosmeticWorldObjectSetup> _cachedCosmeticObjectSetups = new List<CosmeticWorldObjectSetup>();

		internal static readonly string[] AvailableKeybinds = new string[55]
		{
			"A", "B", "C", "D", "E", "F", "G", "H", "I", "J",
			"K", "L", "M", "N", "O", "P", "Q", "R", "S", "T",
			"U", "V", "W", "X", "Y", "Z", "0", "1", "2", "3",
			"4", "5", "6", "7", "8", "9", "F1", "F2", "F3", "F4",
			"F5", "F6", "F7", "F8", "F9", "F10", "F11", "F12", "Space", "Enter",
			"Tab", "LeftShift", "RightShift", "LeftControl", "RightControl"
		};

		private const int OpenInputKeyValue = 336;

		private static readonly InputKey OpenInputKey = (InputKey)336;

		private static string _lastAppliedOpenKey;

		private const int GuiWindowId = 33002;

		private const float Pad = 16f;

		private Rect _windowRect = new Rect(0f, 0f, 1150f, 800f);

		private bool _windowCentered;

		private Vector2 _scrollPos = Vector2.zero;

		private bool _showConfirmSpawn;

		private SpawnableInfo _pendingSpawnInfo;

		private float _lastVirtualHeight = 400f;

		private string _spawnCountStr;

		private bool _stylesInit;

		private Texture2D _texDark;

		private Texture2D _texMid;

		private Texture2D _texLight;

		private Texture2D _texGreen;

		private Texture2D _texRed;

		private Texture2D _texSection;

		private Texture2D _texBorder;

		private Texture2D _texMask;

		private GUIStyle _sWindow;

		private GUIStyle _sTitle;

		private GUIStyle _sLabel;

		private GUIStyle _sStatus;

		private GUIStyle _sBtnGreen;

		private GUIStyle _sBtnRed;

		private GUIStyle _sBtnNormal;

		private GUIStyle _sBtnClose;

		private GUIStyle _sSection;

		private GUIStyle _sToggleOn;

		private GUIStyle _sCheckmarkStyleWhite;

		private GUIStyle _sSlider;

		private GUIStyle _sThumb;

		private GUIStyle _sTextInput;

		private static Dictionary<string, int> _originalWingsLevel = new Dictionary<string, int>();

		private static readonly List<LiveLabel> _liveLabels = new List<LiveLabel>(32);

		private static readonly List<LiveValue> _liveValues = new List<LiveValue>(4);

		private static readonly List<LiveSliderOptions> _liveSliderOptions = new List<LiveSliderOptions>(4);

		private static readonly List<LiveToggleButtons> _liveToggleButtons = new List<LiveToggleButtons>(8);

		private static readonly Dictionary<Type, FieldInfo> _labelTmpFieldCache = new Dictionary<Type, FieldInfo>(8);

		private static readonly Dictionary<Type, PropertyInfo> _sliderStringOptionsPropCache = new Dictionary<Type, PropertyInfo>(4);

		private static readonly Dictionary<Type, FieldInfo> _toggleLeftTmpCache = new Dictionary<Type, FieldInfo>(4);

		private static readonly Dictionary<Type, FieldInfo> _toggleRightTmpCache = new Dictionary<Type, FieldInfo>(4);

		private static readonly Dictionary<string, int> _pendingKeyMatchIndex = new Dictionary<string, int>(StringComparer.Ordinal);

		internal static string _currentRenderingConfigFilePath;

		internal static bool _createModEntriesPatchInstalled;

		private static readonly Dictionary<Type, FieldInfo> _inputStringSystemFieldCache = new Dictionary<Type, FieldInfo>(4);

		private static readonly Dictionary<Type, MethodInfo> _inputStringSystemSetValueCache = new Dictionary<Type, MethodInfo>(4);

		private static readonly Dictionary<string, string> _enumNameCNtoEN = new Dictionary<string, string>(StringComparer.Ordinal) { ["中文"] = "Chinese" };

		private static readonly Dictionary<string, string> _enumNameENtoCN = new Dictionary<string, string>(StringComparer.Ordinal)
		{
			["English"] = "英语",
			["Chinese"] = "中文"
		};

		public static bool IsWindowOpen()
		{
			if ((Object)(object)Instance != (Object)null)
			{
				return Instance._windowOpen;
			}
			return false;
		}

		public static bool IsProhibitedByHost()
		{
			try
			{
				if (PhotonNetwork.InRoom && PhotonNetwork.CurrentRoom != null && !PhotonNetwork.IsMasterClient && PhotonNetwork.MasterClient != null && ((Dictionary<object, object>)(object)PhotonNetwork.MasterClient.CustomProperties).TryGetValue((object)"GT_Active", out object value) && value is bool && (bool)value && ((Dictionary<object, object>)(object)((RoomInfo)PhotonNetwork.CurrentRoom).CustomProperties).TryGetValue((object)"GT_ProhibitOthers", out object value2) && value2 is bool && (bool)value2)
				{
					return true;
				}
			}
			catch (Exception arg)
			{
				Plugin instance = Instance;
				if (instance != null)
				{
					((BaseUnityPlugin)instance).Logger.LogWarning((object)$"[IsProhibitedByHost Error]: {arg}");
				}
			}
			return false;
		}

		public static int SafeConvertToInt(object obj, int defaultValue = 0)
		{
			if (obj == null)
			{
				return defaultValue;
			}
			try
			{
				return Convert.ToInt32(obj);
			}
			catch
			{
				return defaultValue;
			}
		}

		public static bool IsStaticModEnabled()
		{
			if (_cfgModEnabled == null || !_cfgModEnabled.Value)
			{
				return false;
			}
			if (IsProhibitedByHost())
			{
				return false;
			}
			return true;
		}

		public static bool IsTab0Enabled()
		{
			if (IsStaticModEnabled())
			{
				if (_cfgTab0Enabled != null)
				{
					return _cfgTab0Enabled.Value;
				}
				return true;
			}
			return false;
		}

		public static bool IsTab1Enabled()
		{
			if (IsStaticModEnabled())
			{
				if (_cfgTab1Enabled != null)
				{
					return _cfgTab1Enabled.Value;
				}
				return true;
			}
			return false;
		}

		public static bool IsTab2Enabled()
		{
			if (IsStaticModEnabled())
			{
				if (_cfgTab2Enabled != null)
				{
					return _cfgTab2Enabled.Value;
				}
				return true;
			}
			return false;
		}

		public static bool IsTab3Enabled()
		{
			if (IsStaticModEnabled())
			{
				if (_cfgTab3Enabled != null)
				{
					return _cfgTab3Enabled.Value;
				}
				return true;
			}
			return false;
		}

		public static bool IsTab4Enabled()
		{
			if (IsStaticModEnabled())
			{
				if (_cfgTab4Enabled != null)
				{
					return _cfgTab4Enabled.Value;
				}
				return true;
			}
			return false;
		}

		public static bool UseChinese()
		{
			if (_cfgLanguage != null)
			{
				return _cfgLanguage.Value == DisplayLanguage.中文;
			}
			return false;
		}

		public static float GetSpawnRateMultiplier()
		{
			if (_cfgSpawnRateMultiplier == null || !IsTab4Enabled())
			{
				return 1f;
			}
			return _cfgSpawnRateMultiplier.Value;
		}

		public static bool IsWingsAlwaysShowEnabled()
		{
			if (IsTab2Enabled() && _cfgWingsAlwaysShow != null)
			{
				return _cfgWingsAlwaysShow.Value;
			}
			return false;
		}

		public static bool IsWingsSoundEnabled()
		{
			if (IsTab2Enabled() && _cfgEnableWingsSound != null)
			{
				return _cfgEnableWingsSound.Value;
			}
			return true;
		}

		public static bool IsJumpMultiplierEnabled()
		{
			if (IsTab2Enabled() && _cfgJumpMultiplierEnabled != null)
			{
				return _cfgJumpMultiplierEnabled.Value;
			}
			return false;
		}

		public static float GetJumpMultiplier()
		{
			if (_cfgJumpMultiplier == null)
			{
				return 1f;
			}
			return _cfgJumpMultiplier.Value;
		}

		public static bool IsTumbleFlyEnabled()
		{
			if (IsTab2Enabled() && _cfgTumbleFlyEnabled != null)
			{
				return _cfgTumbleFlyEnabled.Value;
			}
			return false;
		}

		public static bool IsInfiniteWeaponBatteryEnabled()
		{
			if (IsTab2Enabled() && _cfgInfiniteWeaponBattery != null)
			{
				return _cfgInfiniteWeaponBattery.Value;
			}
			return false;
		}

		public static bool IsRemovePillarLimitEnabled()
		{
			if (IsTab2Enabled() && _cfgRemovePillarLimit != null)
			{
				return _cfgRemovePillarLimit.Value;
			}
			return false;
		}

		public static bool IsAutoReviveTeammatesEnabled()
		{
			if (IsTab1Enabled() && _cfgAutoReviveTeammates != null)
			{
				return _cfgAutoReviveTeammates.Value;
			}
			return false;
		}

		public static bool IsLimitActionAndOverchargeEnabled()
		{
			if (IsTab4Enabled() && _cfgLimitActionAndOvercharge != null)
			{
				return _cfgLimitActionAndOvercharge.Value;
			}
			return false;
		}

		public static int GetWingsColorIndex()
		{
			if (!IsTab2Enabled() || _cfgWingsColorIndex == null)
			{
				return 0;
			}
			return _cfgWingsColorIndex.Value;
		}

		public static float GetWingsShowFrequency()
		{
			if (!IsTab2Enabled() || _cfgWingsShowFrequency == null)
			{
				return 0f;
			}
			return _cfgWingsShowFrequency.Value;
		}

		public static bool IsTabMapPressed()
		{
			try
			{
				if (Keyboard.current != null && ((ButtonControl)Keyboard.current.tabKey).isPressed)
				{
					return true;
				}
			}
			catch
			{
			}
			return false;
		}

		public static bool IsThirdPersonEnabled()
		{
			if (!IsTab2Enabled() || _cfgThirdPersonEnabled == null || !_cfgThirdPersonEnabled.Value)
			{
				return false;
			}
			return true;
		}

		public static float GetThirdPersonDistance()
		{
			if (!IsTab2Enabled() || _cfgThirdPersonDistance == null)
			{
				return 2.2f;
			}
			return _cfgThirdPersonDistance.Value;
		}

		public static float GetThirdPersonHeight()
		{
			if (!IsTab2Enabled() || _cfgThirdPersonHeight == null)
			{
				return 0.5f;
			}
			return _cfgThirdPersonHeight.Value;
		}

		public static float GetThirdPersonModelScale()
		{
			if (!IsTab2Enabled() || _cfgThirdPersonModelScale == null)
			{
				return 0.6f;
			}
			return _cfgThirdPersonModelScale.Value;
		}

		public static float GetThirdPersonHorizontal()
		{
			if (!IsTab2Enabled() || _cfgThirdPersonHorizontal == null)
			{
				return 0f;
			}
			return _cfgThirdPersonHorizontal.Value;
		}

		public static bool IsGodModeFlightEnabled()
		{
			if (IsTab2Enabled() && _cfgGodModeFlightEnabled != null)
			{
				return _cfgGodModeFlightEnabled.Value;
			}
			return false;
		}

		public static bool IsAllTeammatesGodModeEnabled()
		{
			if (IsTab1Enabled() && _cfgAllTeammatesGodMode != null)
			{
				return _cfgAllTeammatesGodMode.Value;
			}
			return false;
		}

		public static bool IsPlayerGodMode(string steamID)
		{
			if (!IsTab1Enabled())
			{
				return false;
			}
			if (string.IsNullOrEmpty(steamID))
			{
				return false;
			}
			if (!SemiFunc.IsMultiplayer())
			{
				return _localGodModePlayers.Contains(steamID);
			}
			if (PhotonNetwork.InRoom && PhotonNetwork.CurrentRoom != null && ((Dictionary<object, object>)(object)((RoomInfo)PhotonNetwork.CurrentRoom).CustomProperties).TryGetValue((object)("GT_GodMode_" + steamID), out object value) && value is bool)
			{
				return (bool)value;
			}
			return false;
		}

		public static void SetPlayerGodMode(string steamID, bool enable)
		{
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			//IL_0049: Expected O, but got Unknown
			if (!IsStaticModEnabled() || string.IsNullOrEmpty(steamID))
			{
				return;
			}
			if (!SemiFunc.IsMultiplayer())
			{
				if (enable)
				{
					_localGodModePlayers.Add(steamID);
				}
				else
				{
					_localGodModePlayers.Remove(steamID);
				}
			}
			else if (PhotonNetwork.InRoom && PhotonNetwork.CurrentRoom != null)
			{
				Hashtable val = new Hashtable();
				val[(object)("GT_GodMode_" + steamID)] = enable;
				PhotonNetwork.CurrentRoom.SetCustomProperties(val, (Hashtable)null, (WebFlags)null);
			}
		}

		public static void OnAllTeammatesGodModeChanged(bool enable)
		{
			_processedGodModeTeammates.Clear();
			List<PlayerAvatar> list = SemiFunc.PlayerGetList();
			if (list == null)
			{
				return;
			}
			foreach (PlayerAvatar item in list)
			{
				if ((Object)(object)item == (Object)null || PlayerAvatarIsLocalRef.Invoke(item))
				{
					continue;
				}
				string text = PlayerAvatarSteamIDRef.Invoke(item);
				if (!string.IsNullOrEmpty(text))
				{
					if (enable)
					{
						SetPlayerGodMode(text, enable: true);
						_processedGodModeTeammates.Add(text);
					}
					else
					{
						SetPlayerGodMode(text, enable: false);
					}
				}
			}
		}

		public static void UpdateAllTeammatesGodMode()
		{
			if (!IsAllTeammatesGodModeEnabled())
			{
				return;
			}
			List<PlayerAvatar> list = SemiFunc.PlayerGetList();
			if (list == null)
			{
				return;
			}
			foreach (PlayerAvatar item in list)
			{
				if (!((Object)(object)item == (Object)null) && !PlayerAvatarIsLocalRef.Invoke(item))
				{
					string text = PlayerAvatarSteamIDRef.Invoke(item);
					if (!string.IsNullOrEmpty(text) && !_processedGodModeTeammates.Contains(text))
					{
						_processedGodModeTeammates.Add(text);
						SetPlayerGodMode(text, enable: true);
					}
				}
			}
		}

		public static Color GetWingsColor(int index)
		{
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			if (index < 0 || index >= WingsColors.Length)
			{
				return Color.white;
			}
			return WingsColors[index];
		}

		public static string GetColorName(int index)
		{
			switch (index)
			{
			case 0:
				if (!UseChinese())
				{
					return "Default White";
				}
				return "默认白";
			case 1:
				if (!UseChinese())
				{
					return "Flame Red";
				}
				return "火焰红";
			case 2:
				if (!UseChinese())
				{
					return "Neon Green";
				}
				return "荧光绿";
			case 3:
				if (!UseChinese())
				{
					return "Deep Blue";
				}
				return "深海蓝";
			case 4:
				if (!UseChinese())
				{
					return "Aurora Yellow";
				}
				return "极光黄";
			case 5:
				if (!UseChinese())
				{
					return "Cosmic Purple";
				}
				return "星空紫";
			case 6:
				if (!UseChinese())
				{
					return "Ice Cyan";
				}
				return "冰晶青";
			case 7:
				if (!UseChinese())
				{
					return "Cherry Pink";
				}
				return "樱花粉";
			case 8:
				if (!UseChinese())
				{
					return "Sunset Orange";
				}
				return "落日橙";
			default:
				return "";
			}
		}

		public static bool IsWingsShouldActive()
		{
			if (!IsWingsAlwaysShowEnabled())
			{
				return false;
			}
			float wingsShowFrequency = GetWingsShowFrequency();
			if (wingsShowFrequency <= 0.01f)
			{
				return true;
			}
			return (int)(Time.time / wingsShowFrequency) % 2 == 0;
		}

		public static int GetDictValue(Dictionary<string, int> dict, string key, int defaultVal = 0)
		{
			if (dict == null || string.IsNullOrEmpty(key))
			{
				return defaultVal;
			}
			if (!dict.TryGetValue(key, out var value))
			{
				return defaultVal;
			}
			return value;
		}

		internal static void EnsureEnemyScaleSync()
		{
			if (!((Object)(object)_enemyScaleSync != (Object)null) && !((Object)(object)PunManager.instance == (Object)null))
			{
				_enemyScaleSync = ((Component)PunManager.instance).GetComponent<EnemyScaleSync>();
				if ((Object)(object)_enemyScaleSync == (Object)null)
				{
					_enemyScaleSync = ((Component)PunManager.instance).gameObject.AddComponent<EnemyScaleSync>();
				}
			}
		}

		public static void SetEnemyScale(EnemyParent ep, float scale)
		{
			if ((Object)(object)ep == (Object)null)
			{
				return;
			}
			scale = Mathf.Clamp(scale, 0.1f, 5f);
			int viewID = ((MonoBehaviourPun)ep).photonView.ViewID;
			_enemyScaleDict[viewID] = scale;
			ApplyEnemyScale(ep, scale);
			if (PhotonNetwork.InRoom)
			{
				EnsureEnemyScaleSync();
				if ((Object)(object)_enemyScaleSync != (Object)null)
				{
					_enemyScaleSync.BroadcastScale(viewID, scale);
				}
			}
		}

		internal static void ApplyEnemyScale(EnemyParent ep, float scale)
		{
			//IL_0010: 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)
			if (!((Object)(object)ep == (Object)null))
			{
				((Component)ep).transform.localScale = Vector3.one * scale;
			}
		}

		private void Awake()
		{
			//IL_0044: Unknown result type (might be due to invalid IL or missing references)
			//IL_004e: Expected O, but got Unknown
			if ((Object)(object)Instance != (Object)null && (Object)(object)Instance != (Object)(object)this)
			{
				Object.DestroyImmediate((Object)(object)((Component)this).gameObject);
				return;
			}
			Instance = this;
			DetachFromManager();
			ResetConfigIfVersionChanged();
			BindConfig();
			try
			{
				_harmony = new Harmony("zichen.gametools");
				_harmony.PatchAll();
				((BaseUnityPlugin)this).Logger.LogInfo((object)"GameTools Harmony patches applied successfully.");
			}
			catch (Exception arg)
			{
				((BaseUnityPlugin)this).Logger.LogError((object)$"Failed to patch Harmony: {arg}");
			}
			TryHookREPOConfig(_harmony);
			((BaseUnityPlugin)this).Logger.LogInfo((object)"GameTools v1.0.2 已加载。");
			try
			{
				SceneManager.sceneLoaded += OnSceneLoaded;
			}
			catch (Exception arg2)
			{
				((BaseUnityPlugin)this).Logger.LogError((object)$"Failed to bind sceneLoaded: {arg2}");
			}
		}

		private void Update()
		{
			if (IsOpenKeyPressed())
			{
				SetWindowOpen(!_windowOpen);
			}
			if (_windowOpen)
			{
				KeepCursorFree();
			}
			_masterCheckTimer += Time.deltaTime;
			if (_masterCheckTimer >= 3f)
			{
				_masterCheckTimer = 0f;
				PerformActiveFeaturesCheck();
			}
			if (!IsStaticModEnabled())
			{
				RestoreRealUpgrades();
				return;
			}
			if (!string.IsNullOrEmpty(((Object)(object)PlayerController.instance != (Object)null) ? PlayerSteamIDRef.Invoke(PlayerController.instance) : null) && (Object)(object)StatsManager.instance != (Object)null)
			{
				if (_realUpgradeHealth != -1 || _realUpgradeStamina != -1 || _realUpgradeSpeed != -1)
				{
					RestoreRealUpgrades();
				}
			}
			else
			{
				_realUpgradeHealth = -1;
				_realUpgradeStamina = -1;
				_realUpgradeSpeed = -1;
				_globalOverrideInited = false;
			}
			if (IsAutoReviveTeammatesEnabled() && PhotonNetwork.InRoom)
			{
				List<PlayerAvatar> list = SemiFunc.PlayerGetList();
				if (list != null)
				{
					List<string> list2 = new List<string>();
					foreach (PlayerAvatar item in list)
					{
						if ((Object)(object)item == (Object)null)
						{
							continue;
						}
						string text = PlayerAvatarSteamIDRef.Invoke(item);
						if (string.IsNullOrEmpty(text))
						{
							continue;
						}
						if (PlayerAvatarDeadSetRef.Invoke(item))
						{
							if (!_teammateDeathTimers.ContainsKey(text))
							{
								_teammateDeathTimers[text] = 0f;
							}
							else if (_teammateDeathTimers[text] >= 0f)
							{
								_teammateDeathTimers[text] += Time.deltaTime;
								if (_teammateDeathTimers[text] >= 5f)
								{
									_teammateDeathTimers[text] = -9999f;
									RevivePlayer(item);
								}
							}
						}
						else
						{
							list2.Add(text);
						}
					}
					foreach (string item2 in list2)
					{
						if (_teammateDeathTimers.ContainsKey(item2))
						{
							_teammateDeathTimers.Remove(item2);
						}
					}
				}
			}
			else
			{
				_teammateDeathTimers.Clear();
			}
			if (!((Object)(object)EnemyDirector.instance != (Object)null) || EnemyDirector.instance.enemiesSpawned == null)
			{
				return;
			}
			float spawnRateMultiplier = GetSpawnRateMultiplier();
			if (spawnRateMultiplier > 1f)
			{
				foreach (EnemyParent item3 in EnemyDirector.instance.enemiesSpawned)
				{
					if ((Object)(object)item3 != (Object)null && !EnemyParentSpawnedRef.Invoke(item3))
					{
						float despawnedTimer = item3.DespawnedTimer;
						if (despawnedTimer > 0f)
						{
							float num = Time.deltaTime * (spawnRateMultiplier - 1f);
							item3.DespawnedTimerSet(Mathf.Max(0f, despawnedTimer - num), false);
						}
					}
				}
			}
			if (!IsLimitActionAndOverchargeEnabled())
			{
				return;
			}
			foreach (EnemyParent item4 in EnemyDirector.instance.enemiesSpawned)
			{
				if (!((Object)(object)item4 == (Object)null))
				{
					if (item4.actionMultiplier > 0.1f)
					{
						item4.actionMultiplier = 0.1f;
					}
					if (item4.overchargeMultiplier > 0.1f)
					{
						item4.overchargeMultiplier = 0.1f;
					}
				}
			}
		}

		private void PerformActiveFeaturesCheck()
		{
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			//IL_003c: Expected O, but got Unknown
			try
			{
				if (PhotonNetwork.InRoom && PhotonNetwork.LocalPlayer != null && (!((Dictionary<object, object>)(object)PhotonNetwork.LocalPlayer.CustomProperties).TryGetValue((object)"GT_Active", out object value) || !(value is bool) || !(bool)value))
				{
					Hashtable val = new Hashtable();
					val[(object)"GT_Active"] = true;
					PhotonNetwork.LocalPlayer.SetCustomProperties(val, (Hashtable)null, (WebFlags)null);
				}
				if (PhotonNetwork.InRoom && PhotonNetwork.IsMasterClient)
				{
					SyncProhibitOthersToRoom();
				}
				if (!IsStaticModEnabled() || !IsTab0Enabled())
				{
					DisableAndRestoreTab1();
					DisableAndRestoreTab2();
					DisableAndRestoreTab3();
					DisableAndRestoreTab4();
					return;
				}
				if (!IsTab1Enabled())
				{
					DisableAndRestoreTab1();
				}
				if (!IsTab2Enabled())
				{
					DisableAndRestoreTab2();
				}
				if (!IsTab3Enabled())
				{
					DisableAndRestoreTab3();
				}
				if (!IsTab4Enabled())
				{
					DisableAndRestoreTab4();
				}
			}
			catch (Exception arg)
			{
				((BaseUnityPlugin)this).Logger.LogWarning((object)$"[PerformActiveFeaturesCheck Error]: {arg}");
			}
		}

		private void DisableAndRestoreTab1()
		{
			//IL_0078: Unknown result type (might be due to invalid IL or missing references)
			//IL_007e: Expected O, but got Unknown
			bool flag = false;
			if (_cfgAutoReviveTeammates != null && _cfgAutoReviveTeammates.Value)
			{
				flag = true;
			}
			if (_cfgAllTeammatesGodMode != null && _cfgAllTeammatesGodMode.Value)
			{
				flag = true;
			}
			if (_localGodModePlayers.Count > 0)
			{
				flag = true;
			}
			if (!flag)
			{
				return;
			}
			((BaseUnityPlugin)this).Logger.LogInfo((object)"[GameTools] Tab 1 is disabled. Restoring original player settings and disabling effects.");
			ResetPlayerSettings();
			_localGodModePlayers.Clear();
			OnAllTeammatesGodModeChanged(enable: false);
			if (!PhotonNetwork.InRoom || PhotonNetwork.CurrentRoom == null)
			{
				return;
			}
			Hashtable val = new Hashtable();
			List<PlayerAvatar> list = SemiFunc.PlayerGetList();
			if (list != null)
			{
				foreach (PlayerAvatar item in list)
				{
					if (!((Object)(object)item == (Object)null))
					{
						string text = PlayerAvatarSteamIDRef.Invoke(item);
						if (!string.IsNullOrEmpty(text))
						{
							val[(object)("GT_GodMode_" + text)] = null;
						}
					}
				}
			}
			PhotonNetwork.CurrentRoom.SetCustomProperties(val, (Hashtable)null, (WebFlags)null);
		}

		private void DisableAndRestoreTab2()
		{
			//IL_00d3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d9: Expected O, but got Unknown
			bool flag = false;
			if (_cfgWingsAlwaysShow != null && _cfgWingsAlwaysShow.Value)
			{
				flag = true;
			}
			if (_cfgTumbleFlyEnabled != null && _cfgTumbleFlyEnabled.Value)
			{
				flag = true;
			}
			if (_cfgJumpMultiplierEnabled != null && _cfgJumpMultiplierEnabled.Value)
			{
				flag = true;
			}
			if (_cfgInfiniteWeaponBattery != null && _cfgInfiniteWeaponBattery.Value)
			{
				flag = true;
			}
			if (_cfgThirdPersonEnabled != null && _cfgThirdPersonEnabled.Value)
			{
				flag = true;
			}
			if (_cfgGodModeFlightEnabled != null && _cfgGodModeFlightEnabled.Value)
			{
				flag = true;
			}
			if (_cfgWingsColorIndex != null && _cfgWingsColorIndex.Value > 0)
			{
				flag = true;
			}
			if (_cfgWingsShowFrequency != null && _cfgWingsShowFrequency.Value > 0)
			{
				flag = true;
			}
			if (flag)
			{
				((BaseUnityPlugin)this).Logger.LogInfo((object)"[GameTools] Tab 2 is disabled. Restoring original visual settings and disabling effects.");
				ResetVisualSettings();
				if (PhotonNetwork.InRoom && PhotonNetwork.LocalPlayer != null)
				{
					Hashtable val = new Hashtable();
					val[(object)"GT_WingsAlwaysShow"] = false;
					val[(object)"GT_WingsColorIndex"] = 0;
					PhotonNetwork.LocalPlayer.SetCustomProperties(val, (Hashtable)null, (WebFlags)null);
				}
			}
		}

		private void DisableAndRestoreTab3()
		{
			if (_cfgSpawnedAutoRespawn || _cfgSpawnedDelayPull)
			{
				((BaseUnityPlugin)this).Logger.LogInfo((object)"[GameTools] Tab 3 is disabled. Disabling spawner options.");
				_cfgSpawnedAutoRespawn = false;
				_cfgSpawnedDelayPull = false;
			}
		}

		private void DisableAndRestoreTab4()
		{
			bool flag = false;
			if (_cfgSpawnRateMultiplier != null && _cfgSpawnRateMultiplier.Value != 1f)
			{
				flag = true;
			}
			if (_cfgLimitActionAndOvercharge != null && _cfgLimitActionAndOvercharge.Value)
			{
				flag = true;
			}
			if (_enemyScaleDict.Count > 0)
			{
				flag = true;
			}
			if (!flag)
			{
				return;
			}
			((BaseUnityPlugin)this).Logger.LogInfo((object)"[GameTools] Tab 4 is disabled. Restoring original monster settings.");
			ResetMonsterData();
			List<EnemyParent> list = (((Object)(object)EnemyDirector.instance != (Object)null) ? EnemyDirector.instance.enemiesSpawned : null);
			if (list != null)
			{
				foreach (EnemyParent item in list)
				{
					if ((Object)(object)item != (Object)null)
					{
						SetEnemyScale(item, 1f);
					}
				}
			}
			_enemyScaleDict.Clear();
		}

		public static void SetProhibitOthers(bool enable)
		{
			if (_cfgProhibitOthers != null)
			{
				_cfgProhibitOthers.Value = enable;
			}
			SyncProhibitOthersToRoom();
		}

		public static void SyncProhibitOthersToRoom()
		{
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0014: Expected O, but got Unknown
			if (PhotonNetwork.InRoom && PhotonNetwork.IsMasterClient)
			{
				Hashtable val = new Hashtable();
				val[(object)"GT_ProhibitOthers"] = IsProhibitOthersEnabled();
				PhotonNetwork.CurrentRoom.S