Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of GameTools v1.0.9
Zichen-GameTools-1.0.9.dll
Decompiled 2 weeks ago
The result has been truncated due to the large size, download it to view full contents!
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; 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.EventSystems; using UnityEngine.InputSystem; using UnityEngine.InputSystem.Controls; using UnityEngine.Rendering; 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.9")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+1edd851a2e3ea048362167ab33bf7a71fd12cfc3")] [assembly: AssemblyProduct("Zichen-GameTools-1.0.9")] [assembly: AssemblyTitle("Zichen-GameTools-1.0.9")] [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.9")] public class Plugin : BaseUnityPlugin { internal class BatteryCache { public bool Resolved; public itemType ItemType; public bool FallbackResult; } 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; private string _cachedNameCN; private string _cachedNameEN; public string GetDisplayName() { if (UseChinese()) { if (_cachedNameCN == null) { string name = Name; name = ((Type != SpawnType.Enemy) ? ItemNameLocalizer.Translate(Name) : EnemyNameLocalizer.Translate(Name)); if (!string.IsNullOrEmpty(ExtraInfo)) { _cachedNameCN = name + " " + ExtraInfo; } else { _cachedNameCN = name; } } return _cachedNameCN; } if (_cachedNameEN == null) { string name2 = Name; if (!string.IsNullOrEmpty(ExtraInfo)) { _cachedNameEN = name2 + " " + ExtraInfo; } else { _cachedNameEN = name2; } } return _cachedNameEN; } } internal enum PlayerTeleportType { PullToFront, Scatter, ToTruck, ToExtractionButton } [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 { private static readonly FieldRef<CameraAim, float> _fOverridePlayerAimDisableTimer = AccessTools.FieldRefAccess<CameraAim, float>("overridePlayerAimDisableTimer"); private static readonly FieldRef<CameraAim, float> _fOverrideAimStopTimer = AccessTools.FieldRefAccess<CameraAim, float>("overrideAimStopTimer"); private static readonly FieldRef<CameraAim, bool> _fOverrideAimStop = AccessTools.FieldRefAccess<CameraAim, bool>("overrideAimStop"); private static readonly FieldRef<InputManager, float> _fDisableAimingTimer = AccessTools.FieldRefAccess<InputManager, float>("disableAimingTimer"); private static readonly FieldRef<GameplayManager, bool> _fAimInvertVertical = AccessTools.FieldRefAccess<GameplayManager, bool>("aimInvertVertical"); private static readonly FieldRef<CameraAim, float> _fAimHorizontal = AccessTools.FieldRefAccess<CameraAim, float>("aimHorizontal"); private static readonly FieldRef<CameraAim, float> _fAimVertical = AccessTools.FieldRefAccess<CameraAim, float>("aimVertical"); [HarmonyPrefix] private static void Prefix(CameraAim __instance) { //IL_010b: Unknown result type (might be due to invalid IL or missing references) //IL_0110: Unknown result type (might be due to invalid IL or missing references) //IL_012b: Unknown result type (might be due to invalid IL or missing references) //IL_013d: 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; } _fOverridePlayerAimDisableTimer.Invoke(__instance) = 0f; _fOverrideAimStopTimer.Invoke(__instance) = 0f; _fOverrideAimStop.Invoke(__instance) = false; if ((Object)(object)InputManager.instance != (Object)null) { _fDisableAimingTimer.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 && _fAimInvertVertical.Invoke(GameplayManager.instance)) { num4 *= -1f; } ref float reference = ref _fAimHorizontal.Invoke(__instance); ref float reference2 = ref _fAimVertical.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), "ReviveRPC")] private class PlayerAvatar_ReviveRPC_Patch { [HarmonyPostfix] private static void Postfix(PlayerAvatar __instance) { //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0040: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0077: Unknown result type (might be due to invalid IL or missing references) if (!IsStaticModEnabled() || !IsTeammateReviveDropBeadEnabled() || !SemiFunc.IsMasterClientOrSingleplayer()) { return; } try { GameObject enemyValuableSmall = AssetManager.instance.enemyValuableSmall; if ((Object)(object)enemyValuableSmall != (Object)null) { Vector3 position = ((Component)__instance).transform.position; if (!SemiFunc.IsMultiplayer()) { Object.Instantiate<GameObject>(enemyValuableSmall, position, Quaternion.identity); } else { PhotonNetwork.InstantiateRoomObject("Valuables/" + ((Object)enemyValuableSmall).name, position, Quaternion.identity, (byte)0, (object[])null); } LogInfo($"[GameTools] Player {((Object)__instance).name} revived. Dropped a small valuable shard at {position}."); } } catch (Exception arg) { LogWarning($"[TeammateReviveDropBead 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) && !_visualsActive) { _visualsActive = true; } } 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 { object value; if (IsWingsAlwaysShowEnabled() && PlayerAvatarIsLocalRef.Invoke(__instance)) { _visualsActive = true; } else if (!PlayerAvatarIsLocalRef.Invoke(__instance) && !_visualsActive && PhotonNetwork.InRoom && (Object)(object)__instance.photonView != (Object)null && __instance.photonView.Owner != null && ((Dictionary<object, object>)(object)__instance.photonView.Owner.CustomProperties).TryGetValue((object)"GT_WingsAlwaysShow", out value) && value is bool && (bool)value) { _visualsActive = true; } } 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 { private static float _lastMultiCheckTime = 0f; private static bool _lastSentFlip = false; private static bool _lastSentSpinEnabled = false; private static int _lastSentSpinDirection = 0; private static int _lastSentSpinAxis = 0; private static float _lastSentSpinSpeed = -1f; private static bool _hasInitializedSentStates = false; private static readonly ConditionalWeakTable<PlayerAvatar, ItemUpgradePlayerTumbleWingsLogic> _wingsLogicCache = new ConditionalWeakTable<PlayerAvatar, ItemUpgradePlayerTumbleWingsLogic>(); private static readonly FieldRef<PlayerHealth, Material> f_eyeMaterial = AccessTools.FieldRefAccess<PlayerHealth, Material>("eyeMaterial"); private static readonly FieldRef<PlayerHealth, Material> f_pupilMaterial = AccessTools.FieldRefAccess<PlayerHealth, Material>("pupilMaterial"); private static ItemUpgradePlayerTumbleWingsLogic GetWingsLogic(PlayerAvatar avatar) { if ((Object)(object)avatar == (Object)null) { return null; } if (!_wingsLogicCache.TryGetValue(avatar, out var value)) { value = ((Component)avatar).GetComponentInChildren<ItemUpgradePlayerTumbleWingsLogic>(true); _wingsLogicCache.Add(avatar, value); } return value; } [HarmonyPostfix] private static void Postfix(PlayerAvatar __instance) { //IL_1c49: Unknown result type (might be due to invalid IL or missing references) //IL_1c50: Expected O, but got Unknown //IL_12d3: Unknown result type (might be due to invalid IL or missing references) //IL_12da: Expected O, but got Unknown //IL_183c: Unknown result type (might be due to invalid IL or missing references) //IL_1843: Expected O, but got Unknown //IL_16e4: Unknown result type (might be due to invalid IL or missing references) //IL_16e9: Unknown result type (might be due to invalid IL or missing references) //IL_16eb: Unknown result type (might be due to invalid IL or missing references) //IL_16f0: Unknown result type (might be due to invalid IL or missing references) //IL_1713: Unknown result type (might be due to invalid IL or missing references) //IL_1715: Unknown result type (might be due to invalid IL or missing references) //IL_045f: Unknown result type (might be due to invalid IL or missing references) //IL_0466: Expected O, but got Unknown //IL_1660: Unknown result type (might be due to invalid IL or missing references) //IL_1e56: Unknown result type (might be due to invalid IL or missing references) //IL_1e5e: Unknown result type (might be due to invalid IL or missing references) //IL_16b9: Unknown result type (might be due to invalid IL or missing references) //IL_17c9: Unknown result type (might be due to invalid IL or missing references) //IL_17a6: Unknown result type (might be due to invalid IL or missing references) //IL_17a8: Unknown result type (might be due to invalid IL or missing references) //IL_1765: Unknown result type (might be due to invalid IL or missing references) //IL_1767: Unknown result type (might be due to invalid IL or missing references) //IL_192c: Unknown result type (might be due to invalid IL or missing references) //IL_1931: Unknown result type (might be due to invalid IL or missing references) //IL_17e5: Unknown result type (might be due to invalid IL or missing references) //IL_19a3: Unknown result type (might be due to invalid IL or missing references) //IL_19a8: Unknown result type (might be due to invalid IL or missing references) if ((_cfgModEnabled == null || !_cfgModEnabled.Value) && !IsCosmeticsEnabled()) { return; } if (PlayerAvatarIsLocalRef.Invoke(__instance)) { UpdateLocalEyeTimer(); } 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) { int wingsColorIndex = GetWingsColorIndex(); float num = ((wingsColorIndex == 1) ? 2f : 3f); int num2 = ((wingsColorIndex == 1) ? 2 : 3); if (PlayerAvatarUpgradeTumbleWingsRef.Invoke(__instance) != num) { PlayerAvatarUpgradeTumbleWingsRef.Invoke(__instance) = num; } bool flag2 = true; int num3 = 0; if (PhotonNetwork.InRoom && PhotonNetwork.LocalPlayer != null && ((Dictionary<object, object>)(object)PhotonNetwork.LocalPlayer.CustomProperties).TryGetValue((object)"GT_WingsColorIndex", out object value2)) { num3 = SafeConvertToInt(value2); } bool flag3 = num3 != wingsColorIndex; if (PlayerAvatarUpgradeTumbleWingsVisualsActiveRef.Invoke(__instance) != flag2 || flag3) { __instance.UpgradeTumbleWingsVisualsActive(flag2, wingsColorIndex == 1); PlayerAvatarUpgradeTumbleWingsVisualsActiveRef.Invoke(__instance) = flag2; } ItemUpgradePlayerTumbleWingsLogic wingsLogic = GetWingsLogic(__instance); if ((Object)(object)wingsLogic != (Object)null && flag2) { if (TumbleWingTimerRef.Invoke(wingsLogic) < 1.15f) { TumbleWingTimerRef.Invoke(wingsLogic) = 1.15f; } switch (wingsColorIndex) { case 1: TumbleWingPinkTimerRef.Invoke(wingsLogic) = Mathf.Max(TumbleWingPinkTimerRef.Invoke(wingsLogic), 1.15f); if (!WingsIsPinkRef.Invoke(wingsLogic)) { WingsIsPinkRef.Invoke(wingsLogic) = true; wingsLogic.WingsSetPinkColors(); } break; case 2: if (WingsIsPinkRef.Invoke(wingsLogic) || TumbleWingPinkTimerRef.Invoke(wingsLogic) != 0f) { TumbleWingPinkTimerRef.Invoke(wingsLogic) = 0f; WingsIsPinkRef.Invoke(wingsLogic) = false; wingsLogic.WingsSetOriginalColors(); } break; case 3: { float num4 = 5f; float wingsShowFrequency = GetWingsShowFrequency(); if (wingsShowFrequency > 0.01f) { num4 = 1f / wingsShowFrequency; } if ((int)(Time.time * num4) % 2 == 0) { TumbleWingPinkTimerRef.Invoke(wingsLogic) = Mathf.Max(TumbleWingPinkTimerRef.Invoke(wingsLogic), 1.15f); if (!WingsIsPinkRef.Invoke(wingsLogic)) { WingsIsPinkRef.Invoke(wingsLogic) = true; wingsLogic.WingsSetPinkColors(); } } else if (WingsIsPinkRef.Invoke(wingsLogic) || TumbleWingPinkTimerRef.Invoke(wingsLogic) != 0f) { TumbleWingPinkTimerRef.Invoke(wingsLogic) = 0f; WingsIsPinkRef.Invoke(wingsLogic) = false; wingsLogic.WingsSetOriginalColors(); } break; } } } if (PhotonNetwork.IsMasterClient && (Object)(object)StatsManager.instance != (Object)null && !string.IsNullOrEmpty(text)) { int value3 = 0; StatsManager.instance.playerUpgradeTumbleWings.TryGetValue(text, out value3); if (value3 != num2) { if (!_originalWingsLevel.ContainsKey(text)) { _originalWingsLevel[text] = value3; } StatsManager.instance.playerUpgradeTumbleWings[text] = num2; SemiFunc.StatSyncAll(); } } } else { if (PlayerAvatarUpgradeTumbleWingsRef.Invoke(__instance) > (float)value) { PlayerAvatarUpgradeTumbleWingsRef.Invoke(__instance) = value; if (value <= 0) { __instance.UpgradeTumbleWingsVisualsActive(false, false); PlayerAvatarUpgradeTumbleWingsVisualsActiveRef.Invoke(__instance) = false; } } ItemUpgradePlayerTumbleWingsLogic wingsLogic2 = GetWingsLogic(__instance); if ((Object)(object)wingsLogic2 != (Object)null && (WingsIsPinkRef.Invoke(wingsLogic2) || TumbleWingPinkTimerRef.Invoke(wingsLogic2) != 0f)) { TumbleWingPinkTimerRef.Invoke(wingsLogic2) = 0f; WingsIsPinkRef.Invoke(wingsLogic2) = false; wingsLogic2.WingsSetOriginalColors(); } if (PhotonNetwork.IsMasterClient && (Object)(object)StatsManager.instance != (Object)null && !string.IsNullOrEmpty(text) && _originalWingsLevel.TryGetValue(text, out var value4)) { StatsManager.instance.playerUpgradeTumbleWings[text] = value4; _originalWingsLevel.Remove(text); SemiFunc.StatSyncAll(); } } if (PhotonNetwork.InRoom && PhotonNetwork.LocalPlayer != null) { Hashtable val = new Hashtable(); bool flag4 = false; bool flag5 = false; if (((Dictionary<object, object>)(object)PhotonNetwork.LocalPlayer.CustomProperties).TryGetValue((object)"GT_WingsAlwaysShow", out object value5) && value5 is bool) { flag5 = (bool)value5; } if (flag5 != flag) { val[(object)"GT_WingsAlwaysShow"] = flag; flag4 = true; } int num5 = 0; if (((Dictionary<object, object>)(object)PhotonNetwork.LocalPlayer.CustomProperties).TryGetValue((object)"GT_WingsColorIndex", out object value6)) { num5 = SafeConvertToInt(value6); } int wingsColorIndex2 = GetWingsColorIndex(); if (num5 != wingsColorIndex2) { val[(object)"GT_WingsColorIndex"] = wingsColorIndex2; flag4 = true; } if (!_hasInitializedSentStates) { _hasInitializedSentStates = true; if (((Dictionary<object, object>)(object)PhotonNetwork.LocalPlayer.CustomProperties).TryGetValue((object)"GT_Flip", out object value7) && value7 is bool) { _lastSentFlip = (bool)value7; } if (((Dictionary<object, object>)(object)PhotonNetwork.LocalPlayer.CustomProperties).TryGetValue((object)"GT_SpinEnabled", out object value8) && value8 is bool) { _lastSentSpinEnabled = (bool)value8; } if (((Dictionary<object, object>)(object)PhotonNetwork.LocalPlayer.CustomProperties).TryGetValue((object)"GT_SpinDirection", out object value9)) { _lastSentSpinDirection = SafeConvertToInt(value9); } if (((Dictionary<object, object>)(object)PhotonNetwork.LocalPlayer.CustomProperties).TryGetValue((object)"GT_SpinAxis", out object value10)) { _lastSentSpinAxis = SafeConvertToInt(value10); } if (((Dictionary<object, object>)(object)PhotonNetwork.LocalPlayer.CustomProperties).TryGetValue((object)"GT_SpinSpeed", out object value11)) { _lastSentSpinSpeed = SafeConvertToFloat(value11, 1f); } } bool flag6 = IsFlipEnabled(); if (_lastSentFlip != flag6) { val[(object)"GT_Flip"] = flag6; _lastSentFlip = flag6; flag4 = true; } bool flag7 = IsSpinEnabled(); if (_lastSentSpinEnabled != flag7) { val[(object)"GT_SpinEnabled"] = flag7; _lastSentSpinEnabled = flag7; flag4 = true; } int num6 = ((_cfgSpinDirection == null) ? 1 : _cfgSpinDirection.Value); if (_lastSentSpinDirection != num6) { val[(object)"GT_SpinDirection"] = num6; _lastSentSpinDirection = num6; flag4 = true; } int num7 = ((_cfgSpinAxis == null) ? 1 : _cfgSpinAxis.Value); if (_lastSentSpinAxis != num7) { val[(object)"GT_SpinAxis"] = num7; _lastSentSpinAxis = num7; flag4 = true; } float spinSpeed = GetSpinSpeed(); if (Mathf.Abs(_lastSentSpinSpeed - spinSpeed) > 0.01f) { val[(object)"GT_SpinSpeed"] = spinSpeed; _lastSentSpinSpeed = spinSpeed; flag4 = true; } if (flag4) { PhotonNetwork.LocalPlayer.SetCustomProperties(val, (Hashtable)null, (WebFlags)null); } } } else { bool flag8 = false; int num8 = 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 value12) && value12 is bool) { flag8 = (bool)value12; } if (((Dictionary<object, object>)(object)owner.CustomProperties).TryGetValue((object)"GT_WingsColorIndex", out object value13)) { num8 = SafeConvertToInt(value13); } } else { flag8 = false; num8 = 0; } if (flag8 && _cfgModEnabled != null && _cfgModEnabled.Value) { float num9 = ((num8 == 1) ? 2f : 3f); int num10 = ((num8 == 1) ? 2 : 3); if (PlayerAvatarUpgradeTumbleWingsRef.Invoke(__instance) != num9) { PlayerAvatarUpgradeTumbleWingsRef.Invoke(__instance) = num9; } bool flag9 = true; if (PlayerAvatarUpgradeTumbleWingsVisualsActiveRef.Invoke(__instance) != flag9) { __instance.UpgradeTumbleWingsVisualsActive(flag9, num8 == 1); PlayerAvatarUpgradeTumbleWingsVisualsActiveRef.Invoke(__instance) = flag9; } ItemUpgradePlayerTumbleWingsLogic wingsLogic3 = GetWingsLogic(__instance); if ((Object)(object)wingsLogic3 != (Object)null && flag9) { if (TumbleWingTimerRef.Invoke(wingsLogic3) < 1.15f) { TumbleWingTimerRef.Invoke(wingsLogic3) = 1.15f; } switch (num8) { case 1: TumbleWingPinkTimerRef.Invoke(wingsLogic3) = Mathf.Max(TumbleWingPinkTimerRef.Invoke(wingsLogic3), 1.15f); if (!WingsIsPinkRef.Invoke(wingsLogic3)) { WingsIsPinkRef.Invoke(wingsLogic3) = true; wingsLogic3.WingsSetPinkColors(); } break; case 2: if (WingsIsPinkRef.Invoke(wingsLogic3) || TumbleWingPinkTimerRef.Invoke(wingsLogic3) != 0f) { TumbleWingPinkTimerRef.Invoke(wingsLogic3) = 0f; WingsIsPinkRef.Invoke(wingsLogic3) = false; wingsLogic3.WingsSetOriginalColors(); } break; case 3: { float num11 = 5f; float wingsShowFrequency2 = GetWingsShowFrequency(); if (wingsShowFrequency2 > 0.01f) { num11 = 1f / wingsShowFrequency2; } if ((int)(Time.time * num11) % 2 == 0) { TumbleWingPinkTimerRef.Invoke(wingsLogic3) = Mathf.Max(TumbleWingPinkTimerRef.Invoke(wingsLogic3), 1.15f); if (!WingsIsPinkRef.Invoke(wingsLogic3)) { WingsIsPinkRef.Invoke(wingsLogic3) = true; wingsLogic3.WingsSetPinkColors(); } } else if (WingsIsPinkRef.Invoke(wingsLogic3) || TumbleWingPinkTimerRef.Invoke(wingsLogic3) != 0f) { TumbleWingPinkTimerRef.Invoke(wingsLogic3) = 0f; WingsIsPinkRef.Invoke(wingsLogic3) = false; wingsLogic3.WingsSetOriginalColors(); } break; } } } if (PhotonNetwork.IsMasterClient && (Object)(object)StatsManager.instance != (Object)null && !string.IsNullOrEmpty(text)) { int value14 = 0; StatsManager.instance.playerUpgradeTumbleWings.TryGetValue(text, out value14); if (value14 != num10) { if (!_originalWingsLevel.ContainsKey(text)) { _originalWingsLevel[text] = value14; } StatsManager.instance.playerUpgradeTumbleWings[text] = num10; SemiFunc.StatSyncAll(); } } } else { if (PlayerAvatarUpgradeTumbleWingsRef.Invoke(__instance) > (float)value) { PlayerAvatarUpgradeTumbleWingsRef.Invoke(__instance) = value; if (value <= 0) { PlayerAvatarUpgradeTumbleWingsVisualsActiveRef.Invoke(__instance) = false; } } ItemUpgradePlayerTumbleWingsLogic wingsLogic4 = GetWingsLogic(__instance); if ((Object)(object)wingsLogic4 != (Object)null && (WingsIsPinkRef.Invoke(wingsLogic4) || TumbleWingPinkTimerRef.Invoke(wingsLogic4) != 0f)) { TumbleWingPinkTimerRef.Invoke(wingsLogic4) = 0f; WingsIsPinkRef.Invoke(wingsLogic4) = false; wingsLogic4.WingsSetOriginalColors(); } if (PhotonNetwork.IsMasterClient && (Object)(object)StatsManager.instance != (Object)null && !string.IsNullOrEmpty(text) && _originalWingsLevel.TryGetValue(text, out var value15)) { StatsManager.instance.playerUpgradeTumbleWings[text] = value15; _originalWingsLevel.Remove(text); SemiFunc.StatSyncAll(); } } } if (PhotonNetwork.InRoom && Time.time - _lastMultiCheckTime >= 0.1f) { _lastMultiCheckTime = Time.time; string text2 = PlayerAvatarSteamIDRef.Invoke(__instance); string text3 = (((Object)(object)__instance.photonView != (Object)null && __instance.photonView.Owner != null) ? __instance.photonView.Owner.ActorNumber.ToString() : ""); bool flag10 = PlayerAvatarDeadSetRef.Invoke(__instance); if (PlayerAvatarIsLocalRef.Invoke(__instance)) { string text4 = ((PhotonNetwork.LocalPlayer != null) ? PhotonNetwork.LocalPlayer.ActorNumber.ToString() : ""); if (flag10) { string key = "GT_ReqRevive_" + text4; string key2 = "GT_ReqRevive_" + text2; bool flag11 = false; Player[] playerList = PhotonNetwork.PlayerList; foreach (Player val2 in playerList) { if (val2 != null) { if (!string.IsNullOrEmpty(text4) && ((Dictionary<object, object>)(object)val2.CustomProperties).TryGetValue((object)key, out object value16) && SafeConvertToInt(value16) != 0) { flag11 = true; break; } if (!string.IsNullOrEmpty(text2) && ((Dictionary<object, object>)(object)val2.CustomProperties).TryGetValue((object)key2, out object value17) && SafeConvertToInt(value17) != 0) { flag11 = true; break; } } } if (flag11) { try { __instance.Revive(false); Plugin instance = Instance; if (instance != null) { ((BaseUnityPlugin)instance).Logger.LogInfo((object)("[GameTools] Self-revived by remote request: " + text4 + " / " + text2)); } } catch (Exception arg) { Plugin instance2 = Instance; if (instance2 != null) { ((BaseUnityPlugin)instance2).Logger.LogWarning((object)$"[Self Revive Error]: {arg}"); } } } } else { string key3 = "GT_ReqKill_" + text4; string key4 = "GT_ReqKill_" + text2; bool flag12 = false; Player[] playerList = PhotonNetwork.PlayerList; foreach (Player val3 in playerList) { if (val3 != null) { if (!string.IsNullOrEmpty(text4) && ((Dictionary<object, object>)(object)val3.CustomProperties).TryGetValue((object)key3, out object value18) && SafeConvertToInt(value18) != 0) { flag12 = true; break; } if (!string.IsNullOrEmpty(text2) && ((Dictionary<object, object>)(object)val3.CustomProperties).TryGetValue((object)key4, out object value19) && SafeConvertToInt(value19) != 0) { flag12 = true; break; } } } if (flag12) { try { __instance.PlayerDeath(-1); Plugin instance3 = Instance; if (instance3 != null) { ((BaseUnityPlugin)instance3).Logger.LogInfo((object)("[GameTools] Self-killed by remote request: " + text4 + " / " + text2)); } } catch (Exception arg2) { Plugin instance4 = Instance; if (instance4 != null) { ((BaseUnityPlugin)instance4).Logger.LogWarning((object)$"[Self Kill Error]: {arg2}"); } } } } if (!flag10 && (Object)(object)__instance.playerHealth != (Object)null) { string key5 = "GT_ReqHeal_" + text4; string key6 = "GT_ReqHeal_" + text2; bool flag13 = false; Player[] playerList = PhotonNetwork.PlayerList; foreach (Player val4 in playerList) { if (val4 != null) { if (!string.IsNullOrEmpty(text4) && ((Dictionary<object, object>)(object)val4.CustomProperties).TryGetValue((object)key5, out object value20) && SafeConvertToInt(value20) != 0) { flag13 = true; break; } if (!string.IsNullOrEmpty(text2) && ((Dictionary<object, object>)(object)val4.CustomProperties).TryGetValue((object)key6, out object value21) && SafeConvertToInt(value21) != 0) { flag13 = true; break; } } } if (flag13) { try { int num12 = PlayerHealthMaxRef.Invoke(__instance.playerHealth); __instance.playerHealth.Heal(num12, true); Plugin instance5 = Instance; if (instance5 != null) { ((BaseUnityPlugin)instance5).Logger.LogInfo((object)("[GameTools] Self-healed by remote request: " + text4 + " / " + 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) || !string.IsNullOrEmpty(text3))) { if (flag10) { string key7 = "GT_ReqRevive_" + text3; string key8 = "GT_ReqRevive_" + text2; bool flag14 = false; Player[] playerList = PhotonNetwork.PlayerList; foreach (Player val5 in playerList) { if (val5 != null) { if (!string.IsNullOrEmpty(text3) && ((Dictionary<object, object>)(object)val5.CustomProperties).TryGetValue((object)key7, out object value22) && SafeConvertToInt(value22) != 0) { flag14 = true; break; } if (!string.IsNullOrEmpty(text2) && ((Dictionary<object, object>)(object)val5.CustomProperties).TryGetValue((object)key8, out object value23) && SafeConvertToInt(value23) != 0) { flag14 = true; break; } } } if (flag14 && (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: " + text3 + " / " + text2)); } } catch (Exception arg4) { Plugin instance8 = Instance; if (instance8 != null) { ((BaseUnityPlugin)instance8).Logger.LogWarning((object)$"[Host Proxy Revive Error]: {arg4}"); } } } } else { string key9 = "GT_ReqKill_" + text3; string key10 = "GT_ReqKill_" + text2; bool flag15 = false; Player[] playerList = PhotonNetwork.PlayerList; foreach (Player val6 in playerList) { if (val6 != null) { if (!string.IsNullOrEmpty(text3) && ((Dictionary<object, object>)(object)val6.CustomProperties).TryGetValue((object)key9, out object value24) && SafeConvertToInt(value24) != 0) { flag15 = true; break; } if (!string.IsNullOrEmpty(text2) && ((Dictionary<object, object>)(object)val6.CustomProperties).TryGetValue((object)key10, out object value25) && SafeConvertToInt(value25) != 0) { flag15 = true; break; } } } if (flag15 && (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: " + text3 + " / " + text2)); } } catch (Exception arg5) { Plugin instance10 = Instance; if (instance10 != null) { ((BaseUnityPlugin)instance10).Logger.LogWarning((object)$"[Host Proxy Kill Error]: {arg5}"); } } } } if (!flag10 && (Object)(object)__instance.playerHealth != (Object)null) { string key11 = "GT_ReqHeal_" + text3; string key12 = "GT_ReqHeal_" + text2; bool flag16 = false; Player[] playerList = PhotonNetwork.PlayerList; foreach (Player val7 in playerList) { if (val7 != null) { if (!string.IsNullOrEmpty(text3) && ((Dictionary<object, object>)(object)val7.CustomProperties).TryGetValue((object)key11, out object value26) && SafeConvertToInt(value26) != 0) { flag16 = true; break; } if (!string.IsNullOrEmpty(text2) && ((Dictionary<object, object>)(object)val7.CustomProperties).TryGetValue((object)key12, out object value27) && SafeConvertToInt(value27) != 0) { flag16 = true; break; } } } if (flag16 && (Object)(object)__instance.photonView != (Object)null) { try { int num13 = PlayerHealthMaxRef.Invoke(__instance.playerHealth); __instance.photonView.RPC("UpdateHealthRPC", (RpcTarget)0, new object[4] { num13, num13, true, false }); Plugin instance11 = Instance; if (instance11 != null) { ((BaseUnityPlugin)instance11).Logger.LogInfo((object)("[GameTools] Host proxy-healed vanilla player: " + text3 + " / " + 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 flag17 = false; foreach (PlayerAvatar item in list) { if ((Object)(object)item == (Object)null) { continue; } string text5 = PlayerAvatarSteamIDRef.Invoke(item); string text6 = (((Object)(object)item.photonView != (Object)null && item.photonView.Owner != null) ? item.photonView.Owner.ActorNumber.ToString() : ""); bool num14 = PlayerAvatarDeadSetRef.Invoke(item); if (!num14) { string text7 = "GT_ReqRevive_" + text6; string text8 = "GT_ReqRevive_" + text5; if (!string.IsNullOrEmpty(text6) && ((Dictionary<object, object>)(object)PhotonNetwork.LocalPlayer.CustomProperties).TryGetValue((object)text7, out object value28) && SafeConvertToInt(value28) != 0) { val8[(object)text7] = null; flag17 = true; } if (!string.IsNullOrEmpty(text5) && ((Dictionary<object, object>)(object)PhotonNetwork.LocalPlayer.CustomProperties).TryGetValue((object)text8, out object value29) && SafeConvertToInt(value29) != 0) { val8[(object)text8] = null; flag17 = true; } } else { string text9 = "GT_ReqKill_" + text6; string text10 = "GT_ReqKill_" + text5; if (!string.IsNullOrEmpty(text6) && ((Dictionary<object, object>)(object)PhotonNetwork.LocalPlayer.CustomProperties).TryGetValue((object)text9, out object value30) && SafeConvertToInt(value30) != 0) { val8[(object)text9] = null; flag17 = true; } if (!string.IsNullOrEmpty(text5) && ((Dictionary<object, object>)(object)PhotonNetwork.LocalPlayer.CustomProperties).TryGetValue((object)text10, out object value31) && SafeConvertToInt(value31) != 0) { val8[(object)text10] = null; flag17 = true; } } if (num14 || !((Object)(object)item.playerHealth != (Object)null)) { continue; } int num15 = PlayerHealthCurrentRef.Invoke(item.playerHealth); int num16 = PlayerHealthMaxRef.Invoke(item.playerHealth); if (num15 >= num16) { string text11 = "GT_ReqHeal_" + text6; string text12 = "GT_ReqHeal_" + text5; if (!string.IsNullOrEmpty(text6) && ((Dictionary<object, object>)(object)PhotonNetwork.LocalPlayer.CustomProperties).TryGetValue((object)text11, out object value32) && SafeConvertToInt(value32) != 0) { val8[(object)text11] = null; flag17 = true; } if (!string.IsNullOrEmpty(text5) && ((Dictionary<object, object>)(object)PhotonNetwork.LocalPlayer.CustomProperties).TryGetValue((object)text12, out object value33) && SafeConvertToInt(value33) != 0) { val8[(object)text12] = null; flag17 = true; } } } if (flag17) { 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 text13 = PlayerAvatarSteamIDRef.Invoke(__instance); string text14 = ((PhotonNetwork.LocalPlayer != null) ? PhotonNetwork.LocalPlayer.ActorNumber.ToString() : ""); string key13 = "GT_ReqTeleport_" + text14; string key14 = "GT_ReqTeleport_" + text13; Vector3? val9 = null; Player[] playerList = PhotonNetwork.PlayerList; foreach (Player val10 in playerList) { if (val10 != null) { if (!string.IsNullOrEmpty(text14) && ((Dictionary<object, object>)(object)val10.CustomProperties).TryGetValue((object)key13, out object value34) && value34 is float[] && ((float[])value34).Length == 3) { val9 = new Vector3(((float[])value34)[0], ((float[])value34)[1], ((float[])value34)[2]); break; } if (!string.IsNullOrEmpty(text13) && ((Dictionary<object, object>)(object)val10.CustomProperties).TryGetValue((object)key14, out object value35) && value35 is float[] && ((float[])value35).Length == 3) { val9 = new Vector3(((float[])value35)[0], ((float[])value35)[1], ((float[])value35)[2]); break; } } } if (val9.HasValue) { Vector3 value36 = val9.Value; if (Vector3.Distance(_lastRemoteTpPos, value36) > 0.5f || Time.time - _lastRemoteTpTime > 1f) { _lastRemoteTpPos = value36; _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(value36, 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(value36, Quaternion.identity); } } } if ((Object)(object)PlayerController.instance != (Object)null) { ((Component)PlayerController.instance).transform.position = value36; } Plugin instance14 = Instance; if (instance14 != null) { ((BaseUnityPlugin)instance14).Logger.LogInfo((object)$"[GameTools] Teleported self locally by remote request to {value36}"); } } catch (Exception arg7) { Plugin instance15 = Instance; if (instance15 != null) { ((BaseUnityPlugin)instance15).Logger.LogWarning((object)$"[Self Teleport By Remote Error]: {arg7}"); } } } } } if (PlayerAvatarIsLocalRef.Invoke(__instance)) { List<PlayerAvatar> list2 = SemiFunc.PlayerGetList(); if (list2 != null) { Hashtable val15 = new Hashtable(); bool flag18 = false; Vector3 val16 = default(Vector3); Vector3 val17 = default(Vector3); foreach (PlayerAvatar item2 in list2) { if ((Object)(object)item2 == (Object)null) { continue; } string text15 = PlayerAvatarSteamIDRef.Invoke(item2); string text16 = (((Object)(object)item2.photonView != (Object)null && item2.photonView.Owner != null) ? item2.photonView.Owner.ActorNumber.ToString() : ""); string text17 = "GT_ReqTeleport_" + text16; string text18 = "GT_ReqTeleport_" + text15; if (!string.IsNullOrEmpty(text16) && ((Dictionary<object, object>)(object)PhotonNetwork.LocalPlayer.CustomProperties).TryGetValue((object)text17, out object value37) && value37 is float[] && ((float[])value37).Length == 3) { ((Vector3)(ref val16))..ctor(((float[])value37)[0], ((float[])value37)[1], ((float[])value37)[2]); if (Vector3.Distance(GetPlayerPosition(item2), val16) < 3f) { val15[(object)text17] = null; flag18 = true; } } if (!string.IsNullOrEmpty(text15) && ((Dictionary<object, object>)(object)PhotonNetwork.LocalPlayer.CustomProperties).TryGetValue((object)text18, out object value38) && value38 is float[] && ((float[])value38).Length == 3) { ((Vector3)(ref val17))..ctor(((float[])value38)[0], ((float[])value38)[1], ((float[])value38)[2]); if (Vector3.Distance(GetPlayerPosition(item2), val17) < 3f) { val15[(object)text18] = null; flag18 = true; } } } if (flag18) { 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}"); } } try { bool flag19 = false; bool flag20 = false; float num17 = 1f; if (PhotonNetwork.InRoom && (Object)(object)__instance.photonView != (Object)null && __instance.photonView.Owner != null) { Hashtable customProperties = __instance.photonView.Owner.CustomProperties; if (((Dictionary<object, object>)(object)customProperties).TryGetValue((object)"GT_EyeBigPupil", out object value39) && value39 is bool) { flag19 = (bool)value39; } if (((Dictionary<object, object>)(object)customProperties).TryGetValue((object)"GT_EyeBigPupilAuto", out object value40) && value40 is bool) { flag20 = (bool)value40; } if (((Dictionary<object, object>)(object)customProperties).TryGetValue((object)"GT_EyeBigPupilSpeed", out object value41)) { try { num17 = Convert.ToSingle(value41); } catch { } } } else if (PlayerAvatarIsLocalRef.Invoke(__instance)) { flag19 = IsCosmeticsEnabled() && _cfgEyeBigPupil != null && _cfgEyeBigPupil.Value; flag20 = IsCosmeticsEnabled() && _cfgEyePupilScaleAuto != null && _cfgEyePupilScaleAuto.Value; num17 = ((_cfgEyePupilScaleSpeed != null) ? _cfgEyePupilScaleSpeed.Value : 1f); } if (PlayerAvatarIsLocalRef.Invoke(__instance) && PhotonNetwork.InRoom && PhotonNetwork.LocalPlayer != null) { bool flag21 = IsCosmeticsEnabled() && _cfgEyeBigPupil != null && _cfgEyeBigPupil.Value; bool flag22 = IsCosmeticsEnabled() && _cfgEyePupilScaleAuto != null && _cfgEyePupilScaleAuto.Value; float num18 = ((_cfgEyePupilScaleSpeed != null) ? _cfgEyePupilScaleSpeed.Value : 1f); bool flag23 = false; bool flag24 = false; float num19 = 1f; Hashtable customProperties2 = PhotonNetwork.LocalPlayer.CustomProperties; if (((Dictionary<object, object>)(object)customProperties2).TryGetValue((object)"GT_EyeBigPupil", out object value42) && value42 is bool flag25) { flag23 = flag25; } if (((Dictionary<object, object>)(object)customProperties2).TryGetValue((object)"GT_EyeBigPupilAuto", out object value43) && value43 is bool flag26) { flag24 = flag26; } if (((Dictionary<object, object>)(object)customProperties2).TryGetValue((object)"GT_EyeBigPupilSpeed", out object value44)) { try { num19 = Convert.ToSingle(value44); } catch { } } if (flag23 != flag21 || flag24 != flag22 || Mathf.Abs(num19 - num18) > 0.05f) { Hashtable val18 = new Hashtable(); val18[(object)"GT_EyeBigPupil"] = flag21; val18[(object)"GT_EyeBigPupilAuto"] = flag22; val18[(object)"GT_EyeBigPupilSpeed"] = num18; PhotonNetwork.LocalPlayer.SetCustomProperties(val18, (Hashtable)null, (WebFlags)null); } } if (_cfgModEnabled != null && _cfgModEnabled.Value && flag19) { float num20 = 3f; if (flag20) { double num21 = (PhotonNetwork.InRoom ? PhotonNetwork.Time : ((double)Time.time)); num20 = 2f + 1.2f * Mathf.Sin((float)(num21 * (double)num17 * 3.0)); } __instance.OverridePupilSize(num20, 4, 1f, 1f, 5f, 0.5f, 0.5f); } int num22 = 0; if (PhotonNetwork.InRoom && (Object)(object)__instance.photonView != (Object)null && __instance.photonView.Owner != null) { if (((Dictionary<object, object>)(object)__instance.photonView.Owner.CustomProperties).TryGetValue((object)"GT_EyeEffect", out object value45)) { num22 = SafeConvertToInt(value45); } } else if (PlayerAvatarIsLocalRef.Invoke(__instance) && IsCosmeticsEnabled() && _cfgEyeEffectEnabled != null && _cfgEyeEffectEnabled.Value) { num22 = CurrentEyeColor; } if (_cfgModEnabled == null || !_cfgModEnabled.Value) { return; } switch (num22) { case 2: if ((Object)(object)__instance.playerHealth != (Object)null) { __instance.playerHealth.EyeMaterialOverride((EyeOverrideState)1, 0.5f, 999); } break; case 3: if ((Object)(object)__instance.playerHealth != (Object)null) { __instance.playerHealth.EyeMaterialOverride((EyeOverrideState)2, 0.5f, 999); } break; case 4: if ((Object)(object)__instance.playerHealth != (Object)null) { EyeOverrideState val19 = (EyeOverrideState)(((int)(Time.time * 2f) % 2 == 0) ? 1 : 2); __instance.playerHealth.EyeMaterialOverride(val19, 0.5f, 999); } break; case 5: if ((Object)(object)__instance.playerHealth != (Object)null) { __instance.playerHealth.EyeMaterialOverride((EyeOverrideState)3, 0.5f, 999); } break; case 6: if ((Object)(object)__instance.playerHealth != (Object)null) { __instance.playerHealth.EyeMaterialOverride((EyeOverrideState)4, 0.5f, 999); } break; case 7: if ((Object)(object)__instance.playerHealth != (Object)null) { __instance.playerHealth.EyeMaterialOverride((EyeOverrideState)5, 0.5f, 999); } break; } } catch (Exception arg9) { Plugin instance18 = Instance; if (instance18 != null) { ((BaseUnityPlugin)instance18).Logger.LogWarning((object)$"[PlayerAvatar.Update.EyeEffect Error]: {arg9}"); } } } } [HarmonyPatch(typeof(PlayerController), "Update")] private class PlayerController_Update_Patch { private static float _originalJumpForce = -1f; private static bool _prevGodModeFlightEnabled = false; private static readonly FieldRef<PlayerAvatar, bool> _fIsTumbling = AccessTools.FieldRefAccess<PlayerAvatar, bool>("isTumbling"); private static readonly FieldRef<PlayerAvatar, PlayerTumble> _fTumble = AccessTools.FieldRefAccess<PlayerAvatar, PlayerTumble>("tumble"); [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(); __instance.DebugEnergy = IsInfiniteStaminaEnabled(); } } 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_00c4: Unknown result type (might be due to invalid IL or missing references) //IL_011e: Unknown result type (might be due to invalid IL or missing references) //IL_0123: Unknown result type (might be due to invalid IL or missing references) //IL_0171: 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_017e: Unknown result type (might be due to invalid IL or missing references) //IL_0183: 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_0189: Unknown result type (might be due to invalid IL or missing references) //IL_0190: Unknown result type (might be due to invalid IL or missing references) //IL_0196: Unknown result type (might be due to invalid IL or missing references) //IL_019b: 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_013c: Unknown result type (might be due to invalid IL or missing references) //IL_0141: Unknown result type (might be due to invalid IL or missing references) //IL_014a: Unknown result type (might be due to invalid IL or missing references) //IL_014f: Unknown result type (might be due to invalid IL or missing references) //IL_0151: Unknown result type (might be due to invalid IL or missing references) //IL_0152: Unknown result type (might be due to invalid IL or missing references) //IL_0155: Unknown result type (might be due to invalid IL or missing references) //IL_015a: 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_0160: Unknown result type (might be due to invalid IL or missing references) //IL_0161: Unknown result type (might be due to invalid IL or missing references) //IL_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_016e: 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_01aa: Unknown result type (might be due to invalid IL or missing references) //IL_01af: 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_01be: Unknown result type (might be due to invalid IL or missing references) //IL_01bf: Unknown result type (might be due to invalid IL or missing references) //IL_01c4: 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_01e2: Unknown result type (might be due to invalid IL or missing references) //IL_01e9: 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_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) if (IsStaticModEnabled() && IsGodModeFlightEnabled()) { if (!_prevGodModeFlightEnabled) { _prevGodModeFlightEnabled = true; if ((Object)(object)PlayerAvatar.instance != (Object)null) { string text = PlayerAvatarSteamIDRef.Invoke(PlayerAvatar.instance); if (!string.IsNullOrEmpty(text)) { SetPlayerFlightGodMode(text, enable: true); } } } if ((Object)(object)player.playerAvatarScript != (Object)null) { bool num = _fIsTumbling.Invoke(player.playerAvatarScript); PlayerTumble val = _fTumble.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 mainCamera = GetMainCamera(); if ((Object)(object)mainCamera != (Object)null) { Vector3 forward = ((Component)mainCamera).transform.forward; Vector3 right = ((Component)mainCamera).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)) { SetPlayerFlightGodMode(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), "TumbleWingPinkTimerUpdate")] private class ItemUpgradePlayerTumbleWingsLogic_TumbleWingPinkTimerUpdate_Patch { [HarmonyPrefix] private static bool Prefix(ItemUpgradePlayerTumbleWingsLogic __instance) { if (IsStaticModEnabled() && IsWingsAlwaysShowEnabled()) { return false; } return true; } } [HarmonyPatch(typeof(ItemUpgradePlayerTumbleWingsLogic), "TurnOffWings")] private class ItemUpgradePlayerTumbleWingsLogic_TurnOffWings_Patch { [HarmonyPrefix] private static bool Prefix(ItemUpgradePlayerTumbleWingsLogic __instance) { if (IsStaticModEnabled() && IsWingsAlwaysShowEnabled()) { return false; } return 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_00dc: Unknown result type (might be due to invalid IL or missing references) //IL_00ea: Unknown result type (might be due to invalid IL or missing references) //IL_00ef: Unknown result type (might be due to invalid IL or missing references) //IL_00fd: Unknown result type (might be due to invalid IL or missing references) //IL_0102: Unknown result type (might be due to invalid IL or missing references) //IL_0109: 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) { val.DisableCustomGravity(0.1f); Vector3 forward = overrideTransform.forward; float num = 16f; Vector3 val3 = forward * num; val2.rb.velocity = Vector3.Lerp(val2.rb.velocity, val3, 0.35f); 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 (!IsTab4Enabled() || (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 { private static readonly MethodInfo pickMethod = typeof(EnemyDirector).GetMethod("PickEnemies", BindingFlags.Instance | BindingFlags.NonPublic); [HarmonyPostfix] private static void Postfix(EnemyDirector __instance) { if (!IsTab5Enabled() || (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)); if (pickMethod != null) { object[] array = new object[1]; for (int i = 0; i < num6; i++) { array[0] = __instance.enemiesDifficulty3; pickMethod.Invoke(__instance, array); } for (int j = 0; j < num5; j++) { array[0] = __instance.enemiesDifficulty2; pickMethod.Invoke(__instance, array); } for (int k = 0; k < num4; k++) { array[0] = __instance.enemiesDifficulty1; pickMethod.Invoke(__instance, array); } } 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() && ShouldBatteryBeInfinite(__instance)) { __state = __instance.batteryLife; } } [HarmonyPostfix] private static void Postfix(ItemBattery __instance, float __state) { if (IsStaticModEnabled() && ShouldBatteryBeInfinite(__instance)) { __instance.batteryLife = 100f; ItemBatteryBatteryLifeIntRef.Invoke(__instance) = __instance.batteryBars; } else if (__state >= 0f) { __instance.batteryLife = __state; } } } [HarmonyPatch(typeof(ItemBattery), "Drain")] private class ItemBattery_Drain_Patch { [HarmonyPrefix] private static bool Prefix(ItemBattery __instance) { if (IsStaticModEnabled() && ShouldBatteryBeInfinite(__instance)) { return false; } return true; } } [HarmonyPatch(typeof(ItemBattery), "RemoveFullBar")] private class ItemBattery_RemoveFullBar_Patch { [HarmonyPrefix] private static bool Prefix(ItemBattery __instance) { if (IsStaticModEnabled() && ShouldBatteryBeInfinite(__instance)) { return false; } return true; } } [HarmonyPatch(typeof(PlayerDeathHead), "SeenSetRPC")] private class PlayerDeathHead_SeenSetRPC_Patch { [HarmonyPostfix] private static void Postfix(PlayerDeathHead __instance, bool _toggle) { if (!_toggle || !IsStaticModEnabled() || !IsAutoReviveWhenSeenEnabled()) { return; } try { PlayerAvatar playerAvatar = __instance.playerAvatar; if ((Object)(object)playerAvatar != (Object)null && PlayerAvatarDeadSetRef.Invoke(playerAvatar) && (!PhotonNetwork.InRoom || PhotonNetwork.IsMasterClient || PlayerAvatarIsLocalRef.Invoke(playerAvatar))) { Plugin instance = Instance; if (instance != null) { ((BaseUnityPlugin)instance).Logger.LogInfo((object)("[GameTools] Player " + ((Object)playerAvatar).name + " death head was seen by teammates. Triggering auto revive!")); } HandleReviveAndTeleport(playerAvatar); } } catch (Exception arg) { Plugin instance2 = Instance; if (instance2 != null) { ((BaseUnityPlugin)instance2).Logger.LogWarning((object)$"[PlayerDeathHead.SeenSetRPC Postfix Error]: {arg}"); } } } } [HarmonyPatch(typeof(PlayerDeathHead), "Update")] private class PlayerDeathHead_Update_Patch { private static readonly Dictionary<int, float> _reviveCooldown = new Dictionary<int, float>(); private static readonly Dictionary<int, float> _nextCheckTime = new Dictionary<int, float>(); private static readonly FieldRef<PlayerDeathHead, PhysGrabObject> _fPhysGrabObjRef = AccessTools.FieldRefAccess<PlayerDeathHead, PhysGrabObject>("physGrabObject"); private static readonly FieldRef<PlayerDeathHead, PhotonView> _fPhotonViewRef = AccessTools.FieldRefAccess<PlayerDeathHead, PhotonView>("photonView"); private static readonly FieldRef<PlayerDeathHead, RoomVolumeCheck> _fRoomVolumeCheckRef = AccessTools.FieldRefAccess<PlayerDeathHead, RoomVolumeCheck>("roomVolumeCheck"); private static readonly FieldRef<RoomVolumeCheck, bool> _fRoomInTruckRef = AccessTools.FieldRefAccess<RoomVolumeCheck, bool>("inTruck"); private static readonly FieldRef<RoomVolumeCheck, bool> _fRoomInExtractionRef = AccessTools.FieldRefAccess<RoomVolumeCheck, bool>("inExtractionPoint"); [HarmonyPostfix] private static void Postfix(PlayerDeathHead __instance) { //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_01c7: Unknown result type (might be due to invalid IL or missing references) //IL_01d0: Unknown result type (might be due to invalid IL or missing references) if (!IsStaticModEnabled()) { return; } PlayerAvatar playerAvatar = __instance.playerAvatar; if ((Object)(object)playerAvatar == (Object)null || !PlayerAvatarDeadSetRef.Invoke(playerAvatar)) { return; } bool num = SemiFunc.IsMasterClientOrSingleplayer(); bool flag = PlayerAvatarIsLocalRef.Invoke(playerAvatar); if (!num && !flag) { return; } PhotonView val = _fPhotonViewRef.Invoke(__instance); int key = (((Object)(object)val != (Object)null) ? val.ViewID : ((Object)__instance).GetInstanceID()); if (_reviveCooldown.TryGetValue(key, out var value) && value > 0f) { _reviveCooldown[key] = value - Time.deltaTime; return; } float time = Time.time; if (_nextCheckTime.TryGetValue(key, out var value2) && time < value2) { return; } _nextCheckTime[key] = time + 1f; PhysGrabObject val2 = _fPhysGrabObjRef.Invoke(__instance); if ((Object)(object)val2 == (Object)null) { return; } bool flag2 = false; bool flag3 = false; bool flag4 = false; RoomVolumeCheck val3 = _fRoomVolumeCheckRef.Invoke(__instance); if ((Object)(object)val3 != (Object)null) { flag3 = _fRoomInTruckRef.Invoke(val3); flag4 = _fRoomInExtractionRef.Invoke(val3); } if (IsReviveHeadOnTruck() && flag3) { flag2 = true; Plugin instance = Instance; if (instance != null) { ((BaseUnityPlugin)instance).Logger.LogInfo((object)("[GameTools] " + ((Object)playerAvatar).name + " death head is IN TRUCK → auto revive!")); } } if (!flag2 && IsReviveHeadOnExtraction() && flag4) { flag2 = true; Plugin instance2 = Instance; if (instance2 != null) { ((BaseUnityPlugin)instance2).Logger.LogInfo((object)("[GameTools] " + ((Object)playerAvatar).name + " death head is AT EXTRACTION POINT → auto revive!")); } } if (!flag2 && IsReviveHeadOnCart()) { try { PhysGrabCart[] array = Object.FindObjectsOfType<PhysGrabCart>(); Vector3 centerPoint = val2.centerPoint; PhysGrabCart[] array2 = array; foreach (PhysGrabCart val4 in array2) { if ((Object)(object)val4 != (Object)null && Vector3.Distance(centerPoint, ((Component)val4).transform.position) <= 0.8f) { flag2 = true; Plugin instance3 = Instance; if (instance3 != null) { ((BaseUnityPlugin)instance3).Logger.LogInfo((object)("[GameTools] " + ((Object)playerAvatar).name + " death head is ON CART (" + ((Object)val4).name + ") → auto revive!")); } break; } } } catch (Exception arg) { Plugin instance4 = Instance; if (instance4 != null) { ((BaseUnityPlugin)instance4).Logger.LogWarning((object)$"[PlayerDeathHead_Update_Patch Cart Error]: {arg}"); } } } if (flag2) { _reviveCooldown[key] = 5f; HandleReviveAndTeleport(playerAvatar); } } } [HarmonyPatch(typeof(PlayerTumble), "TumbleRequest")] private class PlayerTumble_TumbleRequest_Patch { [HarmonyPrefix] private static bool Prefix(PlayerTumble __instance, bool _isTumbling, bool _playerInput) { if (!_isTumbling || _playerInput) { return true; } if (!IsStaticModEnabled()) { return true; } try { PlayerAvatar playerAvatar = __instance.playerAvatar; if ((Object)(object)playerAvatar == (Object)null) { return true; } string steamID = PlayerAvatarSteamIDRef.Invoke(playerAvatar); if (IsAllTeammatesGodModeEnabled() || IsPlayerGodMode(steamID) || IsPlayerTempGodMode(steamID)) { return false; } } catch (Exception arg) { Plugin instance = Instance; if (instance != null) { ((BaseUnityPlugin)instance).Logger.LogWarning((object)$"[PlayerTumble_TumbleRequest_Patch Error]: {arg}"); } } 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) { string steamID = PlayerAvatarSteamIDRef.Invoke(val); if (PlayerAvatarIsLocalRef.Invoke(val)) { if (IsPlayerGodMode(steamID)) { PlayerHealthCurrentRef.Invoke(__instance) = PlayerHealthMaxRef.Invoke(__instance); return false; } if (IsPlayerTempGodMode(steamID)) { return false; } } else if (PhotonNetwork.IsMasterClient && IsPlayerGodMode(steamID)) { PlayerHealthCurrentRef.Invoke(__instance) = PlayerHealthMaxRef.Invoke(__instance); if ((Object)(object)val.photonView != (Object)null) { int num = PlayerHealthMaxRef.Invoke(__instance); val.photonView.RPC("UpdateHealthRPC", (RpcTarget)0, new object[4] { num, num, true, false }); } 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)) { return; } string steamID = PlayerAvatarSteamIDRef.Invoke(val); if (PlayerAvatarIsLocalRef.Invoke(val) && IsPlayerGodMode(steamID)) { int num = PlayerHealthMaxRef.Invoke(__instance); if (PlayerHealthCurrentRef.Invoke(__instance) < num) { PlayerHealthCurrentRef.Invoke(__instance) = num; } } else { if (PlayerAvatarIsLocalRef.Invoke(val) || !PhotonNetwork.IsMasterClient || !IsPlayerGodMode(steamID)) { return; } int num2 = PlayerHealthMaxRef.Invoke(__instance); if (PlayerHealthCurrentRef.Invoke(__instance) < num2) { PlayerHealthCurrentRef.Invoke(__instance) = num2; if ((Object)(object)val.photonView != (Object)null) { val.photonView.RPC("UpdateHealthRPC", (RpcTarget)0, new object[4] { num2, num2, true, false }); } } } } catch (Exception arg) { Plugin instance = Instance; if (instance != null) { ((BaseUnityPlugin)instance).Logger.LogWarning((object)$"[PlayerHealth.Update Patch Error]: {arg}"); } } } } [HarmonyPatch(typeof(PlayerHealth), "HurtOther")] private class PlayerHealth_HurtOther_Patch { [HarmonyPrefix] private static bool Prefix(PlayerHealth __instance) { if (!IsStaticModEnabled()) { return true; } try { PlayerAvatar val = PlayerHealthAvatarRef.Invoke(__instance); if ((Object)(object)val != (Object)null && IsPlayerGodMode(PlayerAvatarSteamIDRef.Invoke(val))) { return false; } } catch (Exception arg) { Plugin instance = Instance; if (instance != null) { ((BaseUnityPlugin)instance).Logger.LogWarning((object)$"[PlayerHealth.HurtOther Patch Error]: {arg}"); } } return true; } } [HarmonyPatch(typeof(PlayerHealth), "HurtOtherRPC")] private class PlayerHealth_HurtOtherRPC_Patch { [HarmonyPrefix] private static bool Prefix(PlayerHealth __instance) { if (!IsStaticModEnabled()) { return true; } try { PlayerAvatar val = PlayerHealthAvatarRef.Invoke(__instance); if ((Object)(object)val != (Object)null && IsPlayerGodMode(PlayerAvatarSteamIDRef.Invoke(val))) { return false; } } catch (Exception arg) { Plugin instance = Instance; if (instance != null) { ((BaseUnityPlugin)instance).Logger.LogWarning((object)$"[PlayerHealth.HurtOtherRPC Patch Error]: {arg}"); } } return true; } } [HarmonyPatch(typeof(PlayerHealth), "Death")] private class PlayerHealth_Death_Patch { [HarmonyPrefix] private static bool Prefix(PlayerHealth __instance) { if (!IsStaticModEnabled()) { return true; } try { PlayerAvatar val = PlayerHealthAvatarRef.Invoke(__instance); if ((Object)(object)val != (Object)null && IsPlayerGodMode(PlayerAvatarSteamIDRef.Invoke(val))) { return false; } } catch (Exception arg) { Plugin instance = Instance; if (instance != null) { ((BaseUnityPlugin)instance).Logger.LogWarning((object)$"[PlayerHealth.Death Patch Error]: {arg}"); } } return true; } } [HarmonyPatch(typeof(CameraPosition), "Awake")] private class CameraPosition_Awake_Patch { [HarmonyPostfix] private static void Postfix() { CameraPosition_Update_Patch.ResetState(); GameToolsVisuals.ResetLocalState(); } } [HarmonyPatch(typeof(CameraPosition), "Update")] private class CameraPosition_Update_Patch { private static readonly int CameraCollisionLayerMask = LayerMask.GetMask(new string[3] { "Default", "World", "Terrain" }); 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_0081: Unknown result type (might be due to invalid IL or missing references) if (_cfgModEnabled == null || !_cfgModEnabled.Value) { 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 mainCamera = GetMainCamera(); if ((Object)(object)mainCamera != (Object)null) { ((Component)mainCamera).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_0285: Unknown result type (might be due to invalid IL or missing references) //IL_02c4: Unknown result type (might be due to invalid IL or missing references) //IL_0096: 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_00e2: Unknown result type (might be due to invalid IL or missing references) //IL_0172: Unknown result type (might be due to invalid IL or missing references) //IL_0177: Unknown result type (might be due to invalid IL or missing references) //IL_0182: Unknown result type (might be due to invalid IL or missing references) //IL_0187: Unknown result type (might be due to invalid IL or missing references) //IL_018e: Unknown result type (might be due to invalid IL or missing references) //IL_01a8: 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_01ba: Unknown result type (might be due to invalid IL or missing references) //IL_01bf: Unknown result type (might be due to invalid IL or missing references) //IL_01c1: 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_01d6: Unknown result type (might be due to invalid IL or missing references) //IL_01db: Unknown result type (might be due to invalid IL or missing references) //IL_01e0: Unknown result type (might be due to invalid IL or missing references) //IL_01e4: Unknown result type (might be due to invalid IL or missing references) //IL_01e9: Unknown result type (might be due to invalid IL or missing references) //IL_01ee: Unknown result type (might be due to invalid IL or missing references) //IL_01fb: Unknown result type (might be due to invalid IL or missing references) //IL_0200: Unknown result type (might be due to invalid IL or missing references) //IL_0202: 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_0205: Unknown result type (might be due to invalid IL or missing references) //IL_020a: Unknown result type (might be due to invalid IL or missing references) //IL_020c: Unknown result type (might be due to invalid IL or missing references) //IL_0212: Unknown result type (might be due to invalid IL or missing references) //IL_0251: 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_0226: Unknown result type (might be due to invalid IL or missing references) //IL_023f: Unknown result type (might be due to invalid IL or missing references) //IL_0244: Unknown result type (might be due to invalid IL or missing references) //IL_0249: Unknown result type (might be due to invalid IL or missing references) if (_cfgModEnabled == null || !_cfgModEnabled.Value) { 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 mainCamera = GetMainCamera(); if (!((Object)(object)mainCamera != (Object)null)) { return; } if (!_prevThirdPersonEnabled) { _prevThirdPersonEnabled = true; _lastMainCamLocalPos = ((Component)mainCamera).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)mainCamera).transform.localPosition; Vector3 position = ((Component)mainCamera).transform.position; Quaternion rotation = ((Component)mainCamera).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; RaycastHit val5 = default(RaycastHit); if (Physics.SphereCast(position, 0.2f, normalized, ref val5, magnitude, CameraCollisionLayerMask, (QueryTriggerInteraction)1)) { position2 = position + normalized * Mathf.Max(0.1f, ((RaycastHit)(ref val5)).distance - 0.05f); } ((Component)mainCamera).transform.position = position2; } else { if (!_prevThirdPersonEnabled) { return; } _prevThirdPersonEnabled = false; Camera mainCamera2 = GetMainCamera(); if ((Object)(object)mainCamera2 != (Object)null) { ((Component)mainCamera2).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 { private static readonly FieldRef<FlashlightController, float> _fHiddenScale = AccessTools.FieldRefAccess<FlashlightController, float>("hiddenScale"); private static readonly ConditionalWeakTable<FlashlightController, Light[]> _lightCache = new ConditionalWeakTable<FlashlightController, Light[]>(); [HarmonyPostfix] private static void Postfix(FlashlightController __instance) { //IL_0070: Unknown result type (might be due to invalid IL or missing references) //IL_0086: Unknown result type (might be due to invalid IL or missing references) //IL_009c: Unknown result type (might be due to invalid IL or missing references) //IL_00a2: Unknown result type (might be due to invalid IL or missing references) //IL_00ac: Unknown result type (might be due to invalid IL or missing references) //IL_00d5: Unknown result type (might be due to invalid IL or missing references) //IL_00f0: Unknown result type (might be due to invalid IL or missing references) //IL_0110: Unknown result type (might be due to invalid IL or missing references) //IL_011a: Unknown result type (might be due to invalid IL or missing references) //IL_026e: Unknown result type (might be due to invalid IL or missing references) //IL_0273: Unknown result type (might be due to invalid IL or missing references) //IL_01bf: Unknown result type (might be due to invalid IL or missing references) //IL_01c6: Expected O, but got Unknown //IL_028f: Unknown result type (might be due to invalid IL or missing references) if (_cfgModEnabled == null || !_cfgModEnabled.Value) { return; } try { if ((Object)(object)__instance.PlayerAvatar != (Object)null && PlayerAvatarIsLocalRef.Invoke(__instance.PlayerAvatar) && IsThirdPersonEnabled() && (Object)(object)__instance.FollowTransformClient != (Object)null) { float num = _fHiddenScale.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(); } } if (!((Object)(object)__instance.PlayerAvatar != (Object)null)) { return; } int num2 = 0; object value2; if (PlayerAvatarIsLocalRef.Invoke(__instance.PlayerAvatar)) { if (IsCosmeticsEnabled() && _cfgFlashlightColorEnabled != null && _cfgFlashlightColorEnabled.Value) { num2 = ((_cfgFlashlightColor != null) ? _cfgFlashlightColor.Value : 0); } if (PhotonNetwork.InRoom && PhotonNetwork.LocalPlayer != null) { int num3 = 0; if (((Dictionary<object, object>)(object)PhotonNetwork.LocalPlayer.CustomProperties).TryGetValue((object)"GT_FlashlightColor", out object value)) { num3 = SafeConvertToInt(value); } if (num3 != num2) { Hashtable val = new Hashtable(); val[(object)"GT_FlashlightColor"] = num2; PhotonNetwork.LocalPlayer.SetCustomProperties(val, (Hashtable)null, (WebFlags)null); } } } else if (PhotonNetwork.InRoom && (Object)(object)__instance.PlayerAvatar.photonView != (Object)null && __instance.PlayerAvatar.photonView.Owner != null && ((Dictionary<object, object>)(object)__instance.PlayerAvatar.photonView.Owner.CustomProperties).TryGetValue((object)"GT_FlashlightColor", out value2)) { num2 = SafeConvertToInt(value2); } if (!_lightCache.TryGetValue(__instance, out var value3)) { value3 = ((Component)__instance).GetComponentsInChildren<Light>(true); _lightCache.Add(__instance, value3); } if (value3 == null || value3.Length == 0) { return; } Color flashlightColorValue = GetFlashlightColorValue(num2); Light[] array = value3; foreach (Light val2 in array) { if ((Object)(object)val2 != (Object)null) { val2.color = flashlightColorValue; } } } catch (Exception arg) { LogWarning($"[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 class DetectorCache { public float LastCheckTime; public bool IsValuable; public bool IsBead; public bool IsWeapon; public bool IsVehicle; public bool IsCosmetic; public bool IsPotion; public bool IsBattery; } [HarmonyPatch(typeof(PhysGrabObjectImpactDetector), "Update")] private class PhysGrabObjectImpactDetector_Update_Patch { [HarmonyPostfix] private static void Postfix(PhysGrabObjectImpactDetector __instance) { if (!IsStaticModEnabled()) { return; } float time = Time.time; if (_detectorCache.TryGetValue(__instance, out var value)) { if (time - value.LastCheckTime < 0.5f) { return; } value.LastCheckTime = time; } ApplyGodModeForDetector(__instance); } } [HarmonyPatch(typeof(PhysGrabObjectImpactDetector), "Start")] private class PhysGrabObjectImpactDetector_Start_Patch { [HarmonyPostfix] private static void Postfix(PhysGrabObjectImpactDetector __instance) { ApplyGodModeForDetector(__instance); } } [HarmonyPatch(typeof(PhysGrabObjectImpactDetector), "Break")] private class PhysGrabObjectImpactDetector_Break_Patch { [HarmonyPrefix] private static void Prefix(PhysGrabObjectImpactDetector __instance) { ApplyGodModeForDetector(__instance); } } 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.9"; 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<ItemUpgradePlayerTumbleWing