using 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 EnableStaminaRegen; internal static ConfigEntry BaseRegenPerSecond; internal static ConfigEntry RegenPerCombinedLevel; internal static ConfigEntry MaxRegenPerSecond; internal static ConfigEntry SprintingMultiplier; internal static ConfigEntry WalkingMultiplier; internal static ConfigEntry StandingMultiplier; internal static ConfigEntry 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("Stamina Regeneration", "Enable", true, "Enable passive stamina regeneration based on agility stats."); BaseRegenPerSecond = ((BaseUnityPlugin)this).Config.Bind("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(0f, 10f), Array.Empty())); RegenPerCombinedLevel = ((BaseUnityPlugin)this).Config.Bind("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(0f, 5f), Array.Empty())); MaxRegenPerSecond = ((BaseUnityPlugin)this).Config.Bind("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(0f, 50f), Array.Empty())); SprintingMultiplier = ((BaseUnityPlugin)this).Config.Bind("Movement Multipliers", "Sprinting Multiplier", 0f, new ConfigDescription("Stamina regen multiplier while sprinting/running. Default 0 = no regen while running.", (AcceptableValueBase)(object)new AcceptableValueRange(0f, 5f), Array.Empty())); WalkingMultiplier = ((BaseUnityPlugin)this).Config.Bind("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(0f, 5f), Array.Empty())); StandingMultiplier = ((BaseUnityPlugin)this).Config.Bind("Movement Multipliers", "Standing Multiplier", 1f, new ConfigDescription("Stamina regen multiplier while standing still. Default 1 = full regen.", (AcceptableValueBase)(object)new AcceptableValueRange(0f, 5f), Array.Empty())); CrouchingStillMultiplier = ((BaseUnityPlugin)this).Config.Bind("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(0f, 5f), Array.Empty())); } } } 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; } } }