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 Agility v1.2.2
Agility.dll
Decompiled a month agousing System; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using Character_Stats; 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: IgnoresAccessChecksTo("")] [assembly: AssemblyCompany("headclef")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.2.2.0")] [assembly: AssemblyInformationalVersion("1.2.2+18df33f67c67d76a1ca45d7eb260a4dfedcd2c4f")] [assembly: AssemblyProduct("Agility")] [assembly: AssemblyTitle("Agility")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.2.2.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } [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 Agility { [BepInPlugin("headclef.Agility", "Agility", "1.2.2")] [BepInDependency(/*Could not decode attribute arguments.*/)] public class Agility : BaseUnityPlugin { private const string PluginGuid = "headclef.Agility"; private const string PluginName = "Agility"; private const string PluginVersion = "1.2.2"; internal static ConfigEntry<bool> EnableStaminaRegen; internal static ConfigEntry<float> BaseRegenPerSecond; internal static ConfigEntry<float> RegenPerCombinedLevel; internal static ConfigEntry<float> MaxRegenPerSecond; internal static ConfigEntry<float> SprintingMultiplier; internal static ConfigEntry<float> WalkingMultiplier; internal static ConfigEntry<float> StandingMultiplier; internal static ConfigEntry<float> CrouchingStillMultiplier; internal static Agility Instance { get; private set; } internal static ManualLogSource Logger => Instance._logger; private ManualLogSource _logger => ((BaseUnityPlugin)this).Logger; internal Harmony? Harmony { get; set; } private void Awake() { //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Expected O, but got Unknown //IL_004f: Expected O, but got Unknown Instance = this; ((Component)this).gameObject.transform.parent = null; ((Object)((Component)this).gameObject).hideFlags = (HideFlags)61; BindConfiguration(); if (Harmony == null) { Harmony val = new Harmony(((BaseUnityPlugin)this).Info.Metadata.GUID); Harmony val2 = val; Harmony = val; } Harmony.PatchAll(); Logger.LogInfo((object)$"{((BaseUnityPlugin)this).Info.Metadata.GUID} v{((BaseUnityPlugin)this).Info.Metadata.Version} has loaded!"); } private void OnDestroy() { Harmony? harmony = Harmony; if (harmony != null) { harmony.UnpatchSelf(); } } private void BindConfiguration() { //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_0058: Expected O, but got Unknown //IL_008b: Unknown result type (might be due to invalid IL or missing references) //IL_0095: Expected O, but got Unknown //IL_00c8: Unknown result type (might be due to invalid IL or missing references) //IL_00d2: Expected O, but got Unknown //IL_0105: Unknown result type (might be due to invalid IL or missing references) //IL_010f: Expected O, but got Unknown //IL_0142: Unknown result type (might be due to invalid IL or missing references) //IL_014c: Expected O, but got Unknown //IL_017f: Unknown result type (might be due to invalid IL or missing references) //IL_0189: Expected O, but got Unknown //IL_01bc: Unknown result type (might be due to invalid IL or missing references) //IL_01c6: Expected O, but got Unknown EnableStaminaRegen = ((BaseUnityPlugin)this).Config.Bind<bool>("Stamina Regeneration", "Enable", true, "Enable passive stamina regeneration based on agility stats."); BaseRegenPerSecond = ((BaseUnityPlugin)this).Config.Bind<float>("Stamina Regeneration", "Base Regen Per Second", 0f, new ConfigDescription("Base stamina regeneration per second regardless of stats. 0 = no base regen.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 10f), Array.Empty<object>())); RegenPerCombinedLevel = ((BaseUnityPlugin)this).Config.Bind<float>("Stamina Regeneration", "Regen Per Combined Level", 0.3f, new ConfigDescription("Additional stamina regeneration per second for each combined level of Stamina + Crouch Rest + Speed upgrades.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 5f), Array.Empty<object>())); MaxRegenPerSecond = ((BaseUnityPlugin)this).Config.Bind<float>("Stamina Regeneration", "Max Regen Per Second", 0f, new ConfigDescription("Maximum stamina regeneration per second. Caps the base (standing-still) rate before the movement multiplier is applied. 0 = no cap.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 50f), Array.Empty<object>())); SprintingMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Movement Multipliers", "Sprinting Multiplier", 0f, new ConfigDescription("Stamina regen multiplier while sprinting/running. Default 0 = no regen while running.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 5f), Array.Empty<object>())); WalkingMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Movement Multipliers", "Walking Multiplier", 0.5f, new ConfigDescription("Stamina regen multiplier while walking (moving on foot but not sprinting). Default 0.5 = half regen.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 5f), Array.Empty<object>())); StandingMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Movement Multipliers", "Standing Multiplier", 1f, new ConfigDescription("Stamina regen multiplier while standing still. Default 1 = full regen.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 5f), Array.Empty<object>())); CrouchingStillMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Movement Multipliers", "Crouching Still Multiplier", 2f, new ConfigDescription("Stamina regen multiplier while crouching and standing still (resting). Default 2 = double regen.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 5f), Array.Empty<object>())); } } } namespace Agility.Patches { [HarmonyPatch] internal static class StaminaRegenPatch { private static float _lastLogTime; [HarmonyPatch(typeof(PlayerController), "Update")] [HarmonyPostfix] private static void PlayerController_Update_Postfix(PlayerController __instance) { if (!Agility.EnableStaminaRegen.Value || !Character_Stats.AreStatsReady) { return; } try { if ((Object)(object)__instance != (Object)(object)PlayerController.instance) { return; } string localSteamId = Character_Stats.GetLocalSteamId(); if (localSteamId == null) { return; } int upgradeLevel = Character_Stats.GetUpgradeLevel(localSteamId, "Stamina"); int upgradeLevel2 = Character_Stats.GetUpgradeLevel(localSteamId, "Crouch Rest"); int upgradeLevel3 = Character_Stats.GetUpgradeLevel(localSteamId, "Speed"); int num = upgradeLevel + upgradeLevel2 + upgradeLevel3; if (num <= 0 && Agility.BaseRegenPerSecond.Value <= 0f) { return; } float num2 = Agility.BaseRegenPerSecond.Value + Agility.RegenPerCombinedLevel.Value * (float)num; float value = Agility.MaxRegenPerSecond.Value; if (value > 0f) { num2 = Math.Min(num2, value); } if (num2 <= 0f) { return; } string movementState; float movementMultiplier = GetMovementMultiplier(__instance, out movementState); float num3 = num2 * movementMultiplier; if (num3 <= 0f) { return; } float num4 = num3 * Time.deltaTime; float energyCurrent = __instance.EnergyCurrent; float energyStart = __instance.EnergyStart; if (!(energyCurrent >= energyStart)) { __instance.EnergyCurrent = Math.Min(energyCurrent + num4, energyStart); if (Time.time - _lastLogTime > 10f) { _lastLogTime = Time.time; Agility.Logger.LogDebug((object)($"Stamina regen: {num3:F2}/sec ({movementState} x{movementMultiplier:F2}, " + $"base {num2:F2}/sec, combined level: {num}, " + $"stamina: {upgradeLevel}, crouch: {upgradeLevel2}, speed: {upgradeLevel3})")); } } } catch (Exception ex) { Agility.Logger.LogError((object)("StaminaRegen exception: " + ex.Message)); } } private static float GetMovementMultiplier(PlayerController player, out string movementState) { if (player.sprinting) { movementState = "sprinting"; return Agility.SprintingMultiplier.Value; } if (player.moving) { movementState = "walking"; return Agility.WalkingMultiplier.Value; } if (player.Crouching) { movementState = "crouching-still"; return Agility.CrouchingStillMultiplier.Value; } movementState = "standing"; return Agility.StandingMultiplier.Value; } } }