using System;
using System.Collections.Generic;
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.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("DepletingExcessStamina")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("DepletingExcessStamina")]
[assembly: AssemblyTitle("DepletingExcessStamina")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace Microsoft.CodeAnalysis
{
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
internal sealed class EmbeddedAttribute : Attribute
{
}
}
namespace System.Runtime.CompilerServices
{
[CompilerGenerated]
[Microsoft.CodeAnalysis.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]
[Microsoft.CodeAnalysis.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;
}
}
}
namespace DepletingExcessStamina
{
[BepInPlugin("com.atomic.depletestamina", "Depleting Excess Stamina", "1.0.0")]
public class Plugin : BaseUnityPlugin
{
public static ConfigEntry<float> depletionRate;
public static ConfigEntry<float> gracePeriodClimbing;
public static ConfigEntry<float> gracePeriodStamina;
private void Awake()
{
//IL_0083: Unknown result type (might be due to invalid IL or missing references)
//IL_0089: Expected O, but got Unknown
depletionRate = ((BaseUnityPlugin)this).Config.Bind<float>("General", "Depletion Rate", 0.005f, "The rate at which extra stamina is depleted per second");
gracePeriodClimbing = ((BaseUnityPlugin)this).Config.Bind<float>("Grace Period", "Climbing Grace", 5f, "The time in seconds after climbing stops before extra stamina starts depleting");
gracePeriodStamina = ((BaseUnityPlugin)this).Config.Bind<float>("Grace Period", "Stamina Grace", 2.5f, "The time in seconds after you gain extra stamina before extra stamina starts depleting");
((BaseUnityPlugin)this).Logger.LogInfo((object)"Patching Character");
Harmony val = new Harmony("com.atomic.depletestamina");
val.PatchAll();
}
}
[HarmonyPatch(typeof(Character))]
public static class CharacterPatch
{
private class PatchData
{
public float lastExtraStamina;
public float climbingStoppedTime;
public float staminaGainedTime;
}
private static readonly Dictionary<Character, PatchData> characterData = new Dictionary<Character, PatchData>();
[HarmonyPrefix]
[HarmonyPatch("Update")]
private static void UpdatePatch(Character __instance)
{
if (!characterData.ContainsKey(__instance))
{
characterData[__instance] = new PatchData
{
lastExtraStamina = __instance.data.extraStamina,
climbingStoppedTime = Time.time,
staminaGainedTime = Time.time
};
}
PatchData patchData = characterData[__instance];
bool flag = __instance.data.isClimbing || __instance.data.isRopeClimbing || __instance.data.isVineClimbing;
float extraStamina = __instance.data.extraStamina;
if (extraStamina > patchData.lastExtraStamina)
{
patchData.staminaGainedTime = Time.time;
}
if (flag)
{
patchData.climbingStoppedTime = Time.time;
}
bool flag2 = Time.time - patchData.climbingStoppedTime >= Plugin.gracePeriodClimbing.Value;
bool flag3 = Time.time - patchData.staminaGainedTime >= Plugin.gracePeriodStamina.Value;
if (extraStamina > 0f && flag2 && flag3)
{
float num = Plugin.depletionRate.Value * Time.deltaTime;
float extraStamina2 = Mathf.Max(extraStamina - num, 0f);
__instance.SetExtraStamina(extraStamina2);
}
patchData.lastExtraStamina = extraStamina;
}
}
}