Decompiled source of HZ FixedSwim v1.0.0

HZ_FixedSwim.dll

Decompiled 6 hours ago
using System;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("HZ_Fixed_Swim")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("HZ_Fixed_Swim")]
[assembly: AssemblyTitle("HZ_Fixed_Swim")]
[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 Better_Swim
{
	[HarmonyPatch(typeof(Humanoid), "EquipItem", new Type[]
	{
		typeof(ItemData),
		typeof(bool)
	})]
	internal static class AllowEquipWhileSwimmingPatch
	{
		[HarmonyPrefix]
		private static void Prefix(Humanoid __instance)
		{
			IsOnGroundOverridePatch.ForceGroundedForEquip = ModConfig.IsInitialized && ModConfig.KeepItemsEquippedWhileSwimming.Value && ((Character)__instance).IsPlayer();
		}

		[HarmonyPostfix]
		private static void Postfix()
		{
			IsOnGroundOverridePatch.ForceGroundedForEquip = false;
		}
	}
	[HarmonyPatch(typeof(Character), "IsOnGround")]
	internal static class IsOnGroundOverridePatch
	{
		internal static bool ForceGroundedForEquip;

		[HarmonyPostfix]
		private static void Postfix(ref bool __result)
		{
			if (ForceGroundedForEquip)
			{
				__result = true;
			}
		}
	}
	[HarmonyPatch(typeof(Character), "UpdateSwimming")]
	internal static class IdleSwimStaminaRegenPatch
	{
		private static readonly FieldRef<Character, Vector3> MoveDirRef = AccessTools.FieldRefAccess<Character, Vector3>("m_moveDir");

		private static readonly FieldRef<Humanoid, float> TimeSinceLastAttackRef = AccessTools.FieldRefAccess<Humanoid, float>("m_timeSinceLastAttack");

		[HarmonyPostfix]
		private static void Postfix(Character __instance, float dt)
		{
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			if (!ModConfig.IsInitialized || !ModConfig.EnableIdleSwimRegen.Value)
			{
				return;
			}
			Player val = (Player)(object)((__instance is Player) ? __instance : null);
			if (val == null)
			{
				return;
			}
			Vector3 val2 = MoveDirRef.Invoke(__instance);
			if (((Character)val).IsSwimming() && !((Character)val).IsOnGround() && !(((Vector3)(ref val2)).sqrMagnitude > 0.01f) && ((Character)val).HaveStamina(0f))
			{
				bool num = ((Humanoid)val).GetAttackDrawPercentage() > 0f;
				bool flag = TimeSinceLastAttackRef.Invoke((Humanoid)(object)val) < 1f;
				if (!(num || flag))
				{
					float num2 = val.m_staminaRegen * ModConfig.IdleSwimRegenMultiplier.Value * dt;
					((Character)val).AddStamina(num2);
				}
			}
		}
	}
	[HarmonyPatch(typeof(Humanoid), "UpdateEquipment")]
	internal static class UpdateEquipmentGatePatch
	{
		internal static bool InsideAutoHideCall;

		[HarmonyPrefix]
		private static void Prefix()
		{
			InsideAutoHideCall = true;
		}

		[HarmonyPostfix]
		private static void Postfix()
		{
			InsideAutoHideCall = false;
		}
	}
	[HarmonyPatch(typeof(Humanoid), "HideHandItems")]
	internal static class HideHandItemsGatePatch
	{
		[HarmonyPrefix]
		private static bool Prefix(ref bool __result)
		{
			if (UpdateEquipmentGatePatch.InsideAutoHideCall && ModConfig.IsInitialized && ModConfig.KeepItemsEquippedWhileSwimming.Value)
			{
				__result = false;
				return false;
			}
			return true;
		}
	}
	internal static class ModConfig
	{
		private const string GeneralSection = "General";

		public static bool IsInitialized { get; private set; }

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

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

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

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

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

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

		public static void Init(ConfigFile config)
		{
			EnableSwimSprint = config.Bind<bool>("General", "EnableSwimSprint", true, "Permite nadar mais rápido usando a tecla configurada para \"Correr\" (Run), com gasto extra de stamina proporcional.");
			SwimSprintSpeedMultiplier = config.Bind<float>("General", "SwimSprintSpeedMultiplier", 2f, "Multiplicador de velocidade de nado ao segurar Shift.");
			SwimSprintStaminaMultiplier = config.Bind<float>("General", "SwimSprintStaminaMultiplier", 2.25f, "Multiplicador de gasto de stamina ao nadar com Shift (sprint).");
			EnableIdleSwimRegen = config.Bind<bool>("General", "EnableIdleSwimRegen", true, "Permite recuperar stamina lentamente enquanto parado (boiando) na água.");
			IdleSwimRegenMultiplier = config.Bind<float>("General", "IdleSwimRegenMultiplier", 1f, "Fração da regeneração normal de stamina aplicada enquanto parado na água (0.75 = 75%).");
			KeepItemsEquippedWhileSwimming = config.Bind<bool>("General", "KeepItemsEquippedWhileSwimming", true, "Impede que armas/escudos sejam escondidos automaticamente ao entrar na água.");
			IsInitialized = true;
		}
	}
	[BepInPlugin("HZ.fixed_swim", "HZ_Fixed_Swim", "1.0.0")]
	public class Plugin : BaseUnityPlugin
	{
		public const string ModGuid = "HZ.fixed_swim";

		public const string ModName = "HZ_Fixed_Swim";

		public const string ModVersion = "1.0.0";

		internal static Plugin Instance { get; private set; }

		internal static Harmony Harmony { get; private set; }

		internal static ManualLogSource Log => ((BaseUnityPlugin)Instance).Logger;

		private void Awake()
		{
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_0020: Expected O, but got Unknown
			Instance = this;
			ModConfig.Init(((BaseUnityPlugin)this).Config);
			Harmony = new Harmony("HZ.fixed_swim");
			Harmony.PatchAll();
			((BaseUnityPlugin)this).Logger.LogInfo((object)"HZ_Fixed_Swim 1.0.0 loaded.");
		}

		private void OnDestroy()
		{
			Harmony harmony = Harmony;
			if (harmony != null)
			{
				harmony.UnpatchSelf();
			}
		}
	}
	[HarmonyPatch(typeof(Character), "UpdateSwimming")]
	internal static class SwimSprintPatch
	{
		internal static bool IsSprintingThisFrame;

		private static float _originalSpeed;

		private static bool _applied;

		[HarmonyPrefix]
		private static void Prefix(Character __instance)
		{
			_applied = false;
			IsSprintingThisFrame = false;
			if (ModConfig.IsInitialized && ModConfig.EnableSwimSprint.Value && __instance.IsPlayer() && ZInput.GetButton("Run"))
			{
				_originalSpeed = __instance.m_swimSpeed;
				__instance.m_swimSpeed = _originalSpeed * ModConfig.SwimSprintSpeedMultiplier.Value;
				_applied = true;
				IsSprintingThisFrame = true;
			}
		}

		[HarmonyPostfix]
		private static void Postfix(Character __instance)
		{
			if (_applied)
			{
				__instance.m_swimSpeed = _originalSpeed;
				_applied = false;
			}
		}
	}
	[HarmonyPatch(typeof(Player), "OnSwimming")]
	internal static class SwimStaminaDrainPatch
	{
		[HarmonyPrefix]
		private static void Prefix(Vector3 targetVel, ref float dt)
		{
			if (ModConfig.IsInitialized && SwimSprintPatch.IsSprintingThisFrame && !(((Vector3)(ref targetVel)).magnitude <= 0.1f))
			{
				dt *= ModConfig.SwimSprintStaminaMultiplier.Value;
			}
		}
	}
}