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 MoveDirRef = AccessTools.FieldRefAccess("m_moveDir"); private static readonly FieldRef TimeSinceLastAttackRef = AccessTools.FieldRefAccess("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 EnableSwimSprint { get; private set; } public static ConfigEntry SwimSprintSpeedMultiplier { get; private set; } public static ConfigEntry SwimSprintStaminaMultiplier { get; private set; } public static ConfigEntry EnableIdleSwimRegen { get; private set; } public static ConfigEntry IdleSwimRegenMultiplier { get; private set; } public static ConfigEntry KeepItemsEquippedWhileSwimming { get; private set; } public static void Init(ConfigFile config) { EnableSwimSprint = config.Bind("General", "EnableSwimSprint", true, "Permite nadar mais rápido usando a tecla configurada para \"Correr\" (Run), com gasto extra de stamina proporcional."); SwimSprintSpeedMultiplier = config.Bind("General", "SwimSprintSpeedMultiplier", 2f, "Multiplicador de velocidade de nado ao segurar Shift."); SwimSprintStaminaMultiplier = config.Bind("General", "SwimSprintStaminaMultiplier", 2.25f, "Multiplicador de gasto de stamina ao nadar com Shift (sprint)."); EnableIdleSwimRegen = config.Bind("General", "EnableIdleSwimRegen", true, "Permite recuperar stamina lentamente enquanto parado (boiando) na água."); IdleSwimRegenMultiplier = config.Bind("General", "IdleSwimRegenMultiplier", 1f, "Fração da regeneração normal de stamina aplicada enquanto parado na água (0.75 = 75%)."); KeepItemsEquippedWhileSwimming = config.Bind("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; } } } }