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 Carturs Safe Stamina v1.0.6
plugins/CarturSafeStamina.dll
Decompiled a day agousing System; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Configuration; using HarmonyLib; using Microsoft.CodeAnalysis; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] [assembly: AssemblyCompany("CarturSafeStamina")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.6.0")] [assembly: AssemblyInformationalVersion("1.0.6+6b61d443a301494a7e2ded54861f28dad40dcea2")] [assembly: AssemblyProduct("CarturSafeStamina")] [assembly: AssemblyTitle("CarturSafeStamina")] [assembly: AssemblyVersion("1.0.6.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 CarturSafeStamina { [BepInPlugin("com.jekkle.valheim.cartursafestamina", "Cartur's Safe Stamina", "1.0.6")] public class Plugin : BaseUnityPlugin { public const string PluginGuid = "com.jekkle.valheim.cartursafestamina"; public const string PluginName = "Cartur's Safe Stamina"; public const string PluginVersion = "1.0.6"; public static ConfigEntry<float> SafeRadius; public static ConfigEntry<bool> AffectSprint; public static ConfigEntry<bool> AffectJump; public static ConfigEntry<bool> AffectBuild; public static ConfigEntry<bool> AffectSwim; public static ConfigEntry<bool> AffectAttacks; public static ConfigEntry<bool> AffectSneak; private static float _lastCheckTime = -999f; private static bool _lastResult = true; private const float CheckInterval = 0.25f; private void Awake() { SafeRadius = ((BaseUnityPlugin)this).Config.Bind<float>("General", "SafeRadius", 25f, "No stamina cost for sprint/jump/build/swim/sneak when no enemy is within this many meters."); AffectSprint = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "AffectSprint", true, "Free sprint stamina when safe."); AffectJump = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "AffectJump", true, "Free jump stamina when safe."); AffectBuild = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "AffectBuild", true, "Free build/repair/remove stamina when safe."); AffectSwim = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "AffectSwim", true, "Free swim stamina when safe. Note this also removes the drowning risk while safe, since drowning only starts once stamina is empty."); AffectAttacks = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "AffectAttacks", true, "Free attack stamina when safe - chopping wood, mining, and weapon swings all pay through the same cost."); AffectSneak = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "AffectSneak", true, "Free sneak/crouch stamina when safe."); Harmony.CreateAndPatchAll(typeof(Plugin).Assembly, "com.jekkle.valheim.cartursafestamina"); ((BaseUnityPlugin)this).Logger.LogInfo((object)"Cartur's Safe Stamina 1.0.6 loaded."); } public static bool IsSafe(Player player) { //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_008a: Unknown result type (might be due to invalid IL or missing references) //IL_008f: Unknown result type (might be due to invalid IL or missing references) //IL_0090: Unknown result type (might be due to invalid IL or missing references) //IL_0095: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)player == (Object)null) { return true; } if (Time.time - _lastCheckTime < 0.25f) { return _lastResult; } _lastCheckTime = Time.time; _lastResult = true; float value = SafeRadius.Value; float num = value * value; Vector3 position = ((Component)player).transform.position; foreach (Character allCharacter in Character.GetAllCharacters()) { if (!((Object)(object)allCharacter == (Object)null) && !((Object)(object)allCharacter == (Object)(object)player) && !allCharacter.IsDead() && BaseAI.IsEnemy((Character)(object)player, allCharacter)) { Vector3 val = ((Component)allCharacter).transform.position - position; if (((Vector3)(ref val)).sqrMagnitude <= num) { _lastResult = false; break; } } } return _lastResult; } } [HarmonyPatch(typeof(Player), "CheckRun")] public static class Patch_CheckRun { private static float _saved; private static void Prefix(Player __instance, ref float ___m_runStaminaDrain) { _saved = ___m_runStaminaDrain; if (Plugin.AffectSprint.Value && Plugin.IsSafe(__instance)) { ___m_runStaminaDrain = 0f; } } private static void Postfix(ref float ___m_runStaminaDrain) { ___m_runStaminaDrain = _saved; } } [HarmonyPatch(typeof(Player), "OnJump")] public static class Patch_OnJump { private static float _saved; private static void Prefix(Player __instance, ref float ___m_jumpStaminaUsage) { _saved = ___m_jumpStaminaUsage; if (Plugin.AffectJump.Value && Plugin.IsSafe(__instance)) { ___m_jumpStaminaUsage = 0f; } } private static void Postfix(ref float ___m_jumpStaminaUsage) { ___m_jumpStaminaUsage = _saved; } } [HarmonyPatch(typeof(Player), "GetBuildStamina")] public static class Patch_GetBuildStamina { private static void Postfix(Player __instance, ref float __result) { if (Plugin.AffectBuild.Value && Plugin.IsSafe(__instance)) { __result = 0f; } } } [HarmonyPatch(typeof(Attack), "GetAttackStamina")] public static class Patch_GetAttackStamina { private static void Postfix(ref float __result, Humanoid ___m_character) { if (Plugin.AffectAttacks.Value && __result != 0f) { Player val = (Player)(object)((___m_character is Player) ? ___m_character : null); if (val != null && !((Object)(object)val != (Object)(object)Player.m_localPlayer) && Plugin.IsSafe(val)) { __result = 0f; } } } } [HarmonyPatch(typeof(Player), "OnSwimming")] public static class Patch_OnSwimming { private static float _savedMin; private static float _savedMax; private static void Prefix(Player __instance, ref float ___m_swimStaminaDrainMinSkill, ref float ___m_swimStaminaDrainMaxSkill) { _savedMin = ___m_swimStaminaDrainMinSkill; _savedMax = ___m_swimStaminaDrainMaxSkill; if (Plugin.AffectSwim.Value && Plugin.IsSafe(__instance)) { ___m_swimStaminaDrainMinSkill = 0f; ___m_swimStaminaDrainMaxSkill = 0f; } } private static void Postfix(ref float ___m_swimStaminaDrainMinSkill, ref float ___m_swimStaminaDrainMaxSkill) { ___m_swimStaminaDrainMinSkill = _savedMin; ___m_swimStaminaDrainMaxSkill = _savedMax; } } [HarmonyPatch(typeof(Player), "OnSneaking")] public static class Patch_OnSneaking { private static float _saved; private static void Prefix(Player __instance, ref float ___m_sneakStaminaDrain) { _saved = ___m_sneakStaminaDrain; if (Plugin.AffectSneak.Value && Plugin.IsSafe(__instance)) { ___m_sneakStaminaDrain = 0f; } } private static void Postfix(ref float ___m_sneakStaminaDrain) { ___m_sneakStaminaDrain = _saved; } } [HarmonyPatch(typeof(Player), "UpdateStats", new Type[] { typeof(float) })] public static class Patch_UpdateStats { private static void Postfix(Player __instance, float dt, ref float ___m_stamina, float ___m_staminaRegenTimer) { if (!((Object)(object)__instance != (Object)(object)Player.m_localPlayer) && !(___m_staminaRegenTimer > 0f) && BlockedAndAllowed(__instance) && Plugin.IsSafe(__instance)) { float maxStamina = ((Character)__instance).GetMaxStamina(); if (!(___m_stamina >= maxStamina)) { float num = __instance.m_staminaRegen + (1f - ___m_stamina / maxStamina) * __instance.m_staminaRegen * __instance.m_staminaRegenTimeMultiplier; float num2 = 1f; ((Character)__instance).GetSEMan().ModifyStaminaRegen(ref num2); ___m_stamina = Mathf.Min(maxStamina, ___m_stamina + num * num2 * dt * Game.m_staminaRegenRate); } } } private static bool BlockedAndAllowed(Player p) { if (((Character)p).IsSwimming() && !((Character)p).IsOnGround()) { return Plugin.AffectSwim.Value; } if (((Character)p).InAttack() || ((Character)p).InDodge()) { return Plugin.AffectAttacks.Value; } if (!((Character)p).IsWallRunning()) { return ((Character)p).IsEncumbered(); } return true; } } }