Decompiled source of UnlimitedPhysicalStrength v0.1.2

UnlimitedPhysicalStrength.dll

Decompiled 2 days ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("UnlimitedPhysicalStrength")]
[assembly: AssemblyDescription("无限体力模组 for REPO")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("hyy")]
[assembly: AssemblyProduct("UnlimitedPhysicalStrength")]
[assembly: AssemblyCopyright("Copyright © hyy 2025")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("45e9cac9-6b1f-46f0-b1f3-f37575e133fd")]
[assembly: AssemblyFileVersion("0.1.1.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: AssemblyVersion("0.1.1.0")]
namespace UnlimitedPhysicalStrength
{
	[BepInPlugin("hyy.REPO.UnlimitedPhysicalStrength", "Unlimited Physical Strength", "0.1.1")]
	[BepInProcess("REPO.exe")]
	[BepInDependency("nickklmao.menulib", "2.5.0")]
	public class UnlimitedPhysicalStrength : BaseUnityPlugin
	{
		private ConfigEntry<bool> configEnableMod;

		private ConfigEntry<bool> configInfiniteStamina;

		private ConfigEntry<bool> configBlockOtherMods;

		private ConfigEntry<bool> configEnableAutoRegen;

		private ConfigEntry<bool> configNoStaminaDrain;

		private ConfigEntry<bool> configInstantStaminaRecovery;

		private ConfigEntry<float> configStaminaMultiplier;

		private ConfigEntry<float> configCustomMaxStamina;

		private ConfigEntry<bool> configModifyMaxStamina;

		private ConfigEntry<KeyboardShortcut> configToggleHotkey;

		private ConfigEntry<bool> configDebugMode;

		private bool isModEnabled = true;

		private bool lastModState = true;

		private float lastStaminaValue = 0f;

		private float checkInterval = 0.5f;

		private float checkTimer = 0f;

		private Harmony harmony;

		private static object currentPlayerController;

		private static float originalMaxStamina = 100f;

		private static bool isOriginalMaxStaminaSaved = false;

		internal static ManualLogSource Logger { get; private set; }

		public static UnlimitedPhysicalStrength Instance { get; private set; }

		public static bool IsModEnabled => Instance?.isModEnabled ?? false;

		public static bool InfiniteStaminaEnabled => Instance?.configInfiniteStamina.Value ?? true;

		public static bool BlockOtherModsEnabled => Instance?.configBlockOtherMods.Value ?? true;

		public static bool AutoRegenEnabled => Instance?.configEnableAutoRegen.Value ?? true;

		public static bool NoStaminaDrainEnabled => Instance?.configNoStaminaDrain.Value ?? true;

		public static bool InstantStaminaRecoveryEnabled => Instance?.configInstantStaminaRecovery.Value ?? true;

		public static float StaminaMultiplier => Instance?.configStaminaMultiplier.Value ?? 1f;

		public static float CustomMaxStamina => Instance?.configCustomMaxStamina.Value ?? 100f;

		public static bool ModifyMaxStamina => Instance?.configModifyMaxStamina.Value ?? false;

		public static bool DebugMode => Instance?.configDebugMode.Value ?? false;

		private void Awake()
		{
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Expected O, but got Unknown
			//IL_013b: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)Instance == (Object)null)
			{
				Instance = this;
			}
			Logger = ((BaseUnityPlugin)this).Logger;
			harmony = new Harmony("hyy.REPO.UnlimitedPhysicalStrength");
			LoadConfig();
			ApplyPatches();
			Logger.LogInfo((object)"==========================================================================");
			Logger.LogInfo((object)"Unlimited Physical Strength v0.1.1 by hyy");
			Logger.LogInfo((object)"GUID: hyy.REPO.UnlimitedPhysicalStrength");
			Logger.LogInfo((object)"==========================================================================");
			Logger.LogInfo((object)("Mod Status: " + (isModEnabled ? "ENABLED" : "DISABLED")));
			Logger.LogInfo((object)$"Infinite Stamina: {configInfiniteStamina.Value}");
			Logger.LogInfo((object)$"Custom Max Stamina: {configCustomMaxStamina.Value} (Enabled: {configModifyMaxStamina.Value})");
			Logger.LogInfo((object)$"Block Other Mods: {configBlockOtherMods.Value}");
			Logger.LogInfo((object)$"Toggle Hotkey: {configToggleHotkey.Value}");
			Logger.LogInfo((object)"==========================================================================");
		}

		private void Update()
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			KeyboardShortcut value = configToggleHotkey.Value;
			if (((KeyboardShortcut)(ref value)).IsDown())
			{
				ToggleModEnabled();
			}
			checkTimer += Time.deltaTime;
			if (checkTimer >= checkInterval && DebugMode)
			{
				checkTimer = 0f;
				CheckStaminaStatus();
			}
		}

		private void OnDestroy()
		{
			if (harmony != null)
			{
				harmony.UnpatchSelf();
				Logger.LogInfo((object)"Harmony patches unloaded");
			}
		}

		private void LoadConfig()
		{
			//IL_00f6: Unknown result type (might be due to invalid IL or missing references)
			//IL_0100: Expected O, but got Unknown
			//IL_0134: Unknown result type (might be due to invalid IL or missing references)
			//IL_013e: Expected O, but got Unknown
			//IL_017f: Unknown result type (might be due to invalid IL or missing references)
			configEnableMod = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "EnableMod", true, "启用/禁用整个模组");
			configInfiniteStamina = ((BaseUnityPlugin)this).Config.Bind<bool>("Stamina", "InfiniteStamina", true, "启用无限体力");
			configBlockOtherMods = ((BaseUnityPlugin)this).Config.Bind<bool>("Stamina", "BlockOtherMods", true, "阻止其他模组修改体力");
			configEnableAutoRegen = ((BaseUnityPlugin)this).Config.Bind<bool>("Stamina", "EnableAutoRegen", true, "启用自动体力回复");
			configNoStaminaDrain = ((BaseUnityPlugin)this).Config.Bind<bool>("Stamina", "NoStaminaDrain", true, "完全阻止体力消耗");
			configInstantStaminaRecovery = ((BaseUnityPlugin)this).Config.Bind<bool>("Stamina", "InstantStaminaRecovery", true, "即时体力恢复");
			configStaminaMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Stamina", "StaminaMultiplier", 1f, new ConfigDescription("体力倍率(仅在无限体力关闭时生效)", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0.1f, 10f), Array.Empty<object>()));
			configCustomMaxStamina = ((BaseUnityPlugin)this).Config.Bind<float>("Stamina", "CustomMaxStamina", 100f, new ConfigDescription("自定义最大体力值 (1-1000)", (AcceptableValueBase)(object)new AcceptableValueRange<float>(1f, 1000f), Array.Empty<object>()));
			configModifyMaxStamina = ((BaseUnityPlugin)this).Config.Bind<bool>("Stamina", "ModifyMaxStamina", false, "启用自定义最大体力(修改后需要重启游戏或重新加载场景)");
			configToggleHotkey = ((BaseUnityPlugin)this).Config.Bind<KeyboardShortcut>("Hotkeys", "ToggleMod", new KeyboardShortcut((KeyCode)289, Array.Empty<KeyCode>()), "切换模组启用/禁用的热键");
			configDebugMode = ((BaseUnityPlugin)this).Config.Bind<bool>("Debug", "DebugMode", false, "启用调试模式(会在日志中显示更多信息)");
			isModEnabled = configEnableMod.Value;
			lastModState = isModEnabled;
		}

		private void ApplyPatches()
		{
			try
			{
				List<Type> list = new List<Type>();
				Assembly executingAssembly = Assembly.GetExecutingAssembly();
				Type[] types = executingAssembly.GetTypes();
				foreach (Type type in types)
				{
					if (type.Namespace == "UnlimitedPhysicalStrength.Patches" && type.GetCustomAttributes(typeof(HarmonyPatch), inherit: false).Length != 0)
					{
						list.Add(type);
					}
				}
				foreach (Type item in list)
				{
					harmony.PatchAll(item);
					Logger.LogDebug((object)("Applied patch: " + item.Name));
				}
				Logger.LogInfo((object)$"成功应用 {list.Count} 个Harmony补丁");
				if (BlockOtherModsEnabled)
				{
					ApplyUniversalProtection();
				}
			}
			catch (Exception ex)
			{
				Logger.LogError((object)("应用补丁时出错: " + ex.Message));
				Logger.LogError((object)ex.StackTrace);
			}
		}

		private void ApplyUniversalProtection()
		{
			try
			{
				Logger.LogInfo((object)"全局体力保护已启用");
			}
			catch (Exception ex)
			{
				Logger.LogError((object)("应用全局保护时出错: " + ex.Message));
			}
		}

		private void ToggleModEnabled()
		{
			isModEnabled = !isModEnabled;
			configEnableMod.Value = isModEnabled;
			if (isModEnabled)
			{
				Logger.LogInfo((object)"模组已启用");
				if (!lastModState)
				{
					ApplyPatches();
				}
			}
			else
			{
				Logger.LogInfo((object)"模组已禁用");
			}
			lastModState = isModEnabled;
			ShowNotification("无限体力: " + (isModEnabled ? "启用" : "禁用"));
		}

		private void CheckStaminaStatus()
		{
			try
			{
				if (currentPlayerController == null)
				{
					return;
				}
				FieldInfo field = currentPlayerController.GetType().GetField("EnergyCurrent");
				if (field != null)
				{
					float num = (float)field.GetValue(currentPlayerController);
					if (Mathf.Abs(num - lastStaminaValue) > 0.01f)
					{
						Logger.LogDebug((object)$"体力变化: {lastStaminaValue} -> {num}");
						lastStaminaValue = num;
					}
				}
			}
			catch
			{
			}
		}

		private void ShowNotification(string message)
		{
			try
			{
				Logger.LogInfo((object)("通知: " + message));
			}
			catch
			{
				Logger.LogInfo((object)message);
			}
		}

		public static void SetPlayerController(object playerController)
		{
			currentPlayerController = playerController;
		}

		public static object GetPlayerController()
		{
			return currentPlayerController;
		}

		public static void SaveOriginalMaxStamina(float value)
		{
			if (!isOriginalMaxStaminaSaved)
			{
				originalMaxStamina = value;
				isOriginalMaxStaminaSaved = true;
				Logger.LogInfo((object)$"原始最大体力已保存: {originalMaxStamina}");
			}
		}

		public static float GetOriginalMaxStamina()
		{
			return originalMaxStamina;
		}

		public static bool IsOriginalMaxStaminaSaved()
		{
			return isOriginalMaxStaminaSaved;
		}

		public static void ForceSetStamina(float value)
		{
			try
			{
				if (currentPlayerController != null)
				{
					FieldInfo field = currentPlayerController.GetType().GetField("EnergyCurrent");
					if (field != null)
					{
						field.SetValue(currentPlayerController, value);
						Logger.LogDebug((object)$"强制设置体力: {value}");
					}
				}
			}
			catch (Exception ex)
			{
				Logger.LogError((object)("强制设置体力时出错: " + ex.Message));
			}
		}

		public static float GetEffectiveMaxStamina()
		{
			if (ModifyMaxStamina)
			{
				return CustomMaxStamina;
			}
			return GetOriginalMaxStamina();
		}
	}
}
namespace UnlimitedPhysicalStrength.Config
{
	public static class ModConfig
	{
		public static ConfigEntry<bool> EnableMod { get; private set; }

		public static ConfigEntry<bool> InfiniteStamina { get; private set; }

		public static ConfigEntry<bool> BlockOtherMods { get; private set; }

		public static ConfigEntry<bool> EnableAutoRegen { get; private set; }

		public static ConfigEntry<bool> NoStaminaDrain { get; private set; }

		public static ConfigEntry<bool> InstantStaminaRecovery { get; private set; }

		public static ConfigEntry<float> StaminaMultiplier { get; private set; }

		public static ConfigEntry<float> CustomMaxStamina { get; private set; }

		public static ConfigEntry<bool> ModifyMaxStamina { get; private set; }

		public static ConfigEntry<KeyboardShortcut> ToggleHotkey { get; private set; }

		public static ConfigEntry<bool> DebugMode { get; private set; }

		public static void Initialize(ConfigFile config)
		{
			//IL_00f2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fc: Expected O, but got Unknown
			//IL_0133: Unknown result type (might be due to invalid IL or missing references)
			EnableMod = config.Bind<bool>("General", "EnableMod", true, "启用/禁用整个模组");
			InfiniteStamina = config.Bind<bool>("Stamina", "InfiniteStamina", true, "启用无限体力");
			BlockOtherMods = config.Bind<bool>("Stamina", "BlockOtherMods", true, "阻止其他模组修改体力");
			EnableAutoRegen = config.Bind<bool>("Stamina", "EnableAutoRegen", true, "启用自动体力回复");
			NoStaminaDrain = config.Bind<bool>("Stamina", "NoStaminaDrain", true, "完全阻止体力消耗");
			InstantStaminaRecovery = config.Bind<bool>("Stamina", "InstantStaminaRecovery", true, "即时体力恢复");
			StaminaMultiplier = config.Bind<float>("Stamina", "StaminaMultiplier", 1f, "体力倍率(仅在无限体力关闭时生效)");
			CustomMaxStamina = config.Bind<float>("Stamina", "CustomMaxStamina", 100f, new ConfigDescription("自定义最大体力值 (1-1000)", (AcceptableValueBase)(object)new AcceptableValueRange<float>(1f, 1000f), Array.Empty<object>()));
			ModifyMaxStamina = config.Bind<bool>("Stamina", "ModifyMaxStamina", false, "启用自定义最大体力(修改后需要重启游戏或重新加载场景)");
			ToggleHotkey = config.Bind<KeyboardShortcut>("Hotkeys", "ToggleMod", new KeyboardShortcut((KeyCode)289, Array.Empty<KeyCode>()), "切换模组启用/禁用的热键");
			DebugMode = config.Bind<bool>("Debug", "DebugMode", false, "启用调试模式");
		}
	}
}
namespace UnlimitedPhysicalStrength.Patches
{
	[HarmonyPatch]
	public static class PlayerStaminaController
	{
		private static float lastDetectedStamina;

		private static float lastMaxStamina;

		internal static Type playerControllerType;

		private static bool customMaxStaminaApplied;

		static PlayerStaminaController()
		{
			lastDetectedStamina = 0f;
			lastMaxStamina = 0f;
			playerControllerType = null;
			customMaxStaminaApplied = false;
			try
			{
				Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
				foreach (Assembly assembly in assemblies)
				{
					try
					{
						playerControllerType = assembly.GetType("PlayerController");
						if (playerControllerType != null)
						{
							UnlimitedPhysicalStrength.Logger.LogInfo((object)("Found PlayerController type: " + playerControllerType.FullName));
							break;
						}
					}
					catch
					{
					}
				}
				if (playerControllerType == null)
				{
					UnlimitedPhysicalStrength.Logger.LogWarning((object)"PlayerController type not found, using dynamic lookup");
				}
			}
			catch (Exception ex)
			{
				UnlimitedPhysicalStrength.Logger.LogError((object)("Error finding PlayerController type: " + ex.Message));
			}
		}

		[HarmonyTargetMethods]
		private static IEnumerable<MethodBase> TargetMethods()
		{
			List<MethodBase> list = new List<MethodBase>();
			if (playerControllerType != null)
			{
				MethodInfo[] methods = playerControllerType.GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
				MethodInfo method = playerControllerType.GetMethod("Update", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
				if (method != null)
				{
					list.Add(method);
				}
				MethodInfo method2 = playerControllerType.GetMethod("FixedUpdate", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
				if (method2 != null)
				{
					list.Add(method2);
				}
				MethodInfo method3 = playerControllerType.GetMethod("LateUpdate", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
				if (method3 != null)
				{
					list.Add(method3);
				}
				MethodInfo[] array = methods;
				foreach (MethodInfo methodInfo in array)
				{
					string text = methodInfo.Name.ToLower();
					if ((text.Contains("stamina") || text.Contains("energy") || text.Contains("update") || text.Contains("regenerate") || text.Contains("start") || text.Contains("awake")) && !list.Contains(methodInfo))
					{
						list.Add(methodInfo);
					}
				}
			}
			UnlimitedPhysicalStrength.Logger.LogInfo((object)$"Found {list.Count} methods to patch");
			return list;
		}

		[HarmonyPostfix]
		private static void Postfix(ref object __instance)
		{
			if (!UnlimitedPhysicalStrength.IsModEnabled)
			{
				return;
			}
			try
			{
				SaveOriginalMaxStamina(__instance);
				ApplyCustomMaxStamina(__instance);
				if (UnlimitedPhysicalStrength.InfiniteStaminaEnabled)
				{
					ApplyInfiniteStamina(__instance);
				}
			}
			catch (Exception ex)
			{
				if (UnlimitedPhysicalStrength.DebugMode)
				{
					UnlimitedPhysicalStrength.Logger.LogError((object)("Error in stamina patch: " + ex.Message));
				}
			}
		}

		private static void SaveOriginalMaxStamina(object playerInstance)
		{
			if (playerInstance == null || UnlimitedPhysicalStrength.IsOriginalMaxStaminaSaved())
			{
				return;
			}
			Type type = playerInstance.GetType();
			string[] array = new string[6] { "EnergyStart", "energyStart", "maxStamina", "MaxStamina", "maxEnergy", "MaxEnergy" };
			string[] array2 = array;
			foreach (string name in array2)
			{
				FieldInfo field = type.GetField(name, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
				if (field != null)
				{
					try
					{
						float value = (float)field.GetValue(playerInstance);
						UnlimitedPhysicalStrength.SaveOriginalMaxStamina(value);
						break;
					}
					catch
					{
					}
				}
			}
		}

		private static void ApplyCustomMaxStamina(object playerInstance)
		{
			if (playerInstance == null || !UnlimitedPhysicalStrength.ModifyMaxStamina || customMaxStaminaApplied)
			{
				return;
			}
			Type type = playerInstance.GetType();
			string[] array = new string[6] { "EnergyStart", "energyStart", "maxStamina", "MaxStamina", "maxEnergy", "MaxEnergy" };
			string[] array2 = array;
			foreach (string name in array2)
			{
				FieldInfo field = type.GetField(name, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
				if (!(field != null))
				{
					continue;
				}
				try
				{
					float customMaxStamina = UnlimitedPhysicalStrength.CustomMaxStamina;
					field.SetValue(playerInstance, customMaxStamina);
					if (!customMaxStaminaApplied)
					{
						UnlimitedPhysicalStrength.Logger.LogInfo((object)$"应用自定义最大体力: {customMaxStamina}");
						customMaxStaminaApplied = true;
					}
					break;
				}
				catch (Exception ex)
				{
					UnlimitedPhysicalStrength.Logger.LogError((object)("设置自定义最大体力时出错: " + ex.Message));
				}
			}
		}

		internal static void ApplyInfiniteStamina(object playerInstance)
		{
			if (playerInstance == null)
			{
				return;
			}
			UnlimitedPhysicalStrength.SetPlayerController(playerInstance);
			Type type = playerInstance.GetType();
			FieldInfo fieldInfo = null;
			FieldInfo fieldInfo2 = null;
			string[] array = new string[6] { "EnergyCurrent", "energyCurrent", "stamina", "Stamina", "currentEnergy", "CurrentEnergy" };
			string[] array2 = new string[6] { "EnergyStart", "energyStart", "maxStamina", "MaxStamina", "maxEnergy", "MaxEnergy" };
			string[] array3 = array;
			foreach (string name in array3)
			{
				fieldInfo = type.GetField(name, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
				if (fieldInfo != null)
				{
					break;
				}
			}
			string[] array4 = array2;
			foreach (string name2 in array4)
			{
				fieldInfo2 = type.GetField(name2, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
				if (fieldInfo2 != null)
				{
					break;
				}
			}
			if (fieldInfo == null || fieldInfo2 == null)
			{
				PropertyInfo propertyInfo = null;
				PropertyInfo propertyInfo2 = null;
				string[] array5 = array;
				foreach (string name3 in array5)
				{
					propertyInfo = type.GetProperty(name3, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
					if (propertyInfo != null)
					{
						break;
					}
				}
				string[] array6 = array2;
				foreach (string name4 in array6)
				{
					propertyInfo2 = type.GetProperty(name4, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
					if (propertyInfo2 != null)
					{
						break;
					}
				}
				if (propertyInfo != null && propertyInfo2 != null)
				{
					float num = (float)propertyInfo2.GetValue(playerInstance);
					propertyInfo.SetValue(playerInstance, num);
					if (UnlimitedPhysicalStrength.DebugMode && Time.frameCount % 60 == 0)
					{
						UnlimitedPhysicalStrength.Logger.LogDebug((object)$"Set stamina to max via property: {num}");
					}
				}
				return;
			}
			float num2 = (float)fieldInfo2.GetValue(playerInstance);
			fieldInfo.SetValue(playerInstance, num2);
			float num3 = (float)fieldInfo.GetValue(playerInstance);
			if (Mathf.Abs(num3 - lastDetectedStamina) > 0.1f || Mathf.Abs(num2 - lastMaxStamina) > 0.1f)
			{
				if (UnlimitedPhysicalStrength.DebugMode)
				{
					UnlimitedPhysicalStrength.Logger.LogDebug((object)$"Stamina: {num3}/{num2}");
				}
				lastDetectedStamina = num3;
				lastMaxStamina = num2;
			}
			if (UnlimitedPhysicalStrength.NoStaminaDrainEnabled)
			{
				ResetStaminaDrainVariables(playerInstance, type);
			}
			if (UnlimitedPhysicalStrength.AutoRegenEnabled)
			{
				ForceStaminaRegeneration(playerInstance, type);
			}
		}

		private static void ResetStaminaDrainVariables(object instance, Type type)
		{
			try
			{
				FieldInfo[] fields = type.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
				FieldInfo[] array = fields;
				foreach (FieldInfo fieldInfo in array)
				{
					string text = fieldInfo.Name.ToLower();
					if (text.Contains("drain") || text.Contains("cost") || text.Contains("consume") || text.Contains("消耗"))
					{
						if (fieldInfo.FieldType == typeof(float))
						{
							fieldInfo.SetValue(instance, 0f);
						}
						else if (fieldInfo.FieldType == typeof(int))
						{
							fieldInfo.SetValue(instance, 0);
						}
					}
				}
			}
			catch
			{
			}
		}

		private static void ForceStaminaRegeneration(object instance, Type type)
		{
			try
			{
				if (UnlimitedPhysicalStrength.InstantStaminaRecoveryEnabled)
				{
					return;
				}
				FieldInfo[] fields = type.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
				FieldInfo[] array = fields;
				foreach (FieldInfo fieldInfo in array)
				{
					string text = fieldInfo.Name.ToLower();
					if ((text.Contains("regen") || text.Contains("recovery") || text.Contains("recover") || text.Contains("回复")) && fieldInfo.FieldType == typeof(float))
					{
						float num = (float)fieldInfo.GetValue(instance);
						if (num < 100f)
						{
							fieldInfo.SetValue(instance, 100f);
						}
					}
				}
			}
			catch
			{
			}
		}
	}
	[HarmonyPatch]
	public static class StaminaSetterInterceptor
	{
		[HarmonyTargetMethods]
		private static IEnumerable<MethodBase> TargetSetterMethods()
		{
			List<MethodBase> list = new List<MethodBase>();
			if (PlayerStaminaController.playerControllerType != null)
			{
				MethodInfo[] methods = PlayerStaminaController.playerControllerType.GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic);
				MethodInfo[] array = methods;
				foreach (MethodInfo methodInfo in array)
				{
					string text = methodInfo.Name.ToLower();
					if (text.StartsWith("set_") && (text.Contains("energy") || text.Contains("stamina")))
					{
						list.Add(methodInfo);
					}
					else if (text.Contains("setenergy") || text.Contains("setstamina") || text.Contains("changeenergy") || text.Contains("changestamina") || text.Contains("modify") || text.Contains("adjust"))
					{
						list.Add(methodInfo);
					}
				}
			}
			UnlimitedPhysicalStrength.Logger.LogInfo((object)$"Found {list.Count} stamina setter methods to intercept");
			return list;
		}

		[HarmonyPrefix]
		private static bool Prefix(ref object __instance, ref object __0)
		{
			if (!UnlimitedPhysicalStrength.IsModEnabled || !UnlimitedPhysicalStrength.BlockOtherModsEnabled)
			{
				return true;
			}
			try
			{
				object obj = __0;
				if (obj is float)
				{
					float num = (float)obj;
					if (true && UnlimitedPhysicalStrength.InfiniteStaminaEnabled)
					{
						float effectiveMaxStamina = UnlimitedPhysicalStrength.GetEffectiveMaxStamina();
						if (num < effectiveMaxStamina - 0.1f)
						{
							__0 = effectiveMaxStamina;
							if (UnlimitedPhysicalStrength.DebugMode)
							{
								UnlimitedPhysicalStrength.Logger.LogDebug((object)$"Intercepted stamina reduction: {num} -> {effectiveMaxStamina}");
							}
						}
					}
				}
			}
			catch (Exception ex)
			{
				if (UnlimitedPhysicalStrength.DebugMode)
				{
					UnlimitedPhysicalStrength.Logger.LogError((object)("Error intercepting stamina setter: " + ex.Message));
				}
			}
			return true;
		}

		[HarmonyPostfix]
		private static void Postfix(ref object __instance)
		{
			if (!UnlimitedPhysicalStrength.IsModEnabled || !UnlimitedPhysicalStrength.InfiniteStaminaEnabled)
			{
				return;
			}
			try
			{
				PlayerStaminaController.ApplyInfiniteStamina(__instance);
			}
			catch (Exception ex)
			{
				if (UnlimitedPhysicalStrength.DebugMode)
				{
					UnlimitedPhysicalStrength.Logger.LogError((object)("Error in stamina setter postfix: " + ex.Message));
				}
			}
		}
	}
}