using System; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; 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 HarmonyLib; using Microsoft.CodeAnalysis; using Photon.Pun; using UnderstatedManner.Patches; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: IgnoresAccessChecksTo("Assembly-CSharp")] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("LapX.UnderstatedManner")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.1.0")] [assembly: AssemblyInformationalVersion("1.0.1")] [assembly: AssemblyProduct("LapX.UnderstatedManner")] [assembly: AssemblyTitle("UnderstatedManner")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.1.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] 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 BepInEx { [AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)] [Conditional("CodeGeneration")] [Embedded] internal sealed class BepInAutoPluginAttribute : Attribute { public BepInAutoPluginAttribute(string? id = null, string? name = null, string? version = null) { } } } namespace BepInEx.Preloader.Core.Patching { [AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)] [Conditional("CodeGeneration")] [Embedded] internal sealed class PatcherAutoPluginAttribute : Attribute { public PatcherAutoPluginAttribute(string? id = null, string? name = null, string? version = null) { } } } namespace Microsoft.CodeAnalysis { [Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace UnderstatedManner { [BepInPlugin("LapX.UnderstatedManner", "UnderstatedManner", "1.0.1")] public class Plugin : BaseUnityPlugin { private ConfigEntry configClimbEnabled; private ConfigEntry configClimbDrowsyAmount; private ConfigEntry configClimbCooldown; private ConfigEntry configClimbThreshold; private ConfigEntry configBackflipEnabled; private ConfigEntry configBackflipDrowsyAmount; public const string Id = "LapX.UnderstatedManner"; internal static ManualLogSource Log { get; private set; } public static string Name => "UnderstatedManner"; public static string Version => "1.0.1"; private void Awake() { //IL_005b: Unknown result type (might be due to invalid IL or missing references) //IL_0065: Expected O, but got Unknown //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Expected O, but got Unknown //IL_00cc: Unknown result type (might be due to invalid IL or missing references) //IL_00d6: Expected O, but got Unknown //IL_01c7: Unknown result type (might be due to invalid IL or missing references) //IL_01d1: Expected O, but got Unknown //IL_0234: Unknown result type (might be due to invalid IL or missing references) //IL_023a: Expected O, but got Unknown Log = ((BaseUnityPlugin)this).Logger; configClimbEnabled = ((BaseUnityPlugin)this).Config.Bind("Climb", "Enabled", true, "Enable or disable drowsy on wall climb."); configClimbDrowsyAmount = ((BaseUnityPlugin)this).Config.Bind("Climb", "DrowsyAmount", 0.1f, new ConfigDescription("Amount of drowsy applied when the combo threshold is hit (0–1 scale).", (AcceptableValueBase)(object)new AcceptableValueRange(0f, 1f), Array.Empty())); configClimbCooldown = ((BaseUnityPlugin)this).Config.Bind("Climb", "CooldownSeconds", 1f, new ConfigDescription("Max seconds between climbs that still count as consecutive. If the gap between two climbs exceeds this, the combo resets.", (AcceptableValueBase)(object)new AcceptableValueRange(0.5f, 30f), Array.Empty())); configClimbThreshold = ((BaseUnityPlugin)this).Config.Bind("Climb", "ThresholdCount", 2, new ConfigDescription("How many consecutive climbs (within the cooldown window) are needed to trigger the drowsy penalty.", (AcceptableValueBase)(object)new AcceptableValueRange(1, 20), Array.Empty())); UnderstatedMannerPatches.Enabled = configClimbEnabled.Value; UnderstatedMannerPatches.DrowsyAmount = configClimbDrowsyAmount.Value; UnderstatedMannerPatches.CooldownSeconds = configClimbCooldown.Value; UnderstatedMannerPatches.ThresholdCount = configClimbThreshold.Value; configClimbEnabled.SettingChanged += delegate { UnderstatedMannerPatches.Enabled = configClimbEnabled.Value; Log.LogInfo((object)("[Climb] " + (configClimbEnabled.Value ? "ON" : "OFF"))); }; configClimbDrowsyAmount.SettingChanged += delegate { UnderstatedMannerPatches.DrowsyAmount = configClimbDrowsyAmount.Value; Log.LogInfo((object)$"[Climb] drowsy amount = {configClimbDrowsyAmount.Value}"); }; configClimbCooldown.SettingChanged += delegate { UnderstatedMannerPatches.CooldownSeconds = configClimbCooldown.Value; Log.LogInfo((object)$"[Climb] cooldown = {configClimbCooldown.Value}s"); }; configClimbThreshold.SettingChanged += delegate { UnderstatedMannerPatches.ThresholdCount = configClimbThreshold.Value; Log.LogInfo((object)$"[Climb] threshold = {configClimbThreshold.Value} climbs"); }; configBackflipEnabled = ((BaseUnityPlugin)this).Config.Bind("Backflip", "Enabled", true, "Enable or disable drowsy on backflip emote."); configBackflipDrowsyAmount = ((BaseUnityPlugin)this).Config.Bind("Backflip", "DrowsyAmount", 0.4f, new ConfigDescription("Amount of drowsy applied when a player does the backflip emote (0–1 scale).", (AcceptableValueBase)(object)new AcceptableValueRange(0f, 1f), Array.Empty())); BackflipDrowsyPatches.Enabled = configBackflipEnabled.Value; BackflipDrowsyPatches.DrowsyAmount = configBackflipDrowsyAmount.Value; configBackflipEnabled.SettingChanged += delegate { BackflipDrowsyPatches.Enabled = configBackflipEnabled.Value; Log.LogInfo((object)("[Backflip] " + (configBackflipEnabled.Value ? "ON" : "OFF"))); }; configBackflipDrowsyAmount.SettingChanged += delegate { BackflipDrowsyPatches.DrowsyAmount = configBackflipDrowsyAmount.Value; Log.LogInfo((object)$"[Backflip] drowsy amount = {configBackflipDrowsyAmount.Value}"); }; Harmony val = new Harmony(((BaseUnityPlugin)this).Info.Metadata.GUID); try { val.PatchAll(typeof(UnderstatedMannerPatches).Assembly); Log.LogInfo((object)"UnderstatedManner patches applied successfully!"); foreach (MethodBase patchedMethod in val.GetPatchedMethods()) { Log.LogInfo((object)(" → Patched: " + patchedMethod.DeclaringType?.FullName + "." + patchedMethod.Name)); } } catch (Exception arg) { Log.LogError((object)$"Harmony patching FAILED: {arg}"); } Log.LogInfo((object)("Plugin " + Name + " is loaded!")); } } } namespace UnderstatedManner.Patches { [HarmonyPatch] public static class BackflipDrowsyPatches { public static float DrowsyAmount = 0.4f; public static bool Enabled = true; private static bool s_loggedOnce; [HarmonyPatch(typeof(CharacterAnimations), "RPCA_PlayRemove")] [HarmonyPostfix] public static void RPCA_PlayRemove_Postfix(CharacterAnimations __instance, string emoteName) { if (!Enabled || emoteName != "A_Scout_Emote_BackFlip" || !PhotonNetwork.IsMasterClient) { return; } Character component = ((Component)__instance).GetComponent(); if (!((Object)(object)component == (Object)null)) { if (!s_loggedOnce) { Plugin.Log.LogInfo((object)("[Backflip] Hook active! " + $"DrowsyAmount={DrowsyAmount}, Enabled={Enabled}")); s_loggedOnce = true; } if (((MonoBehaviourPun)component).photonView.IsMine) { component.refs.afflictions.AddStatus((STATUSTYPE)6, DrowsyAmount, false, true, true); return; } float[] array = new float[CharacterAfflictions.NumStatusTypes]; array[6] = DrowsyAmount; ((MonoBehaviourPun)component).photonView.RPC("RPC_ApplyStatusesFromFloatArray", (RpcTarget)0, new object[1] { array }); } } } [HarmonyPatch] public static class UnderstatedMannerPatches { public static float DrowsyAmount = 0.1f; public static bool Enabled = true; public static float CooldownSeconds = 1f; public static int ThresholdCount = 2; private static readonly Dictionary s_lastClimbTime = new Dictionary(); private static readonly Dictionary s_consecutiveCount = new Dictionary(); private static bool s_loggedOnce; [HarmonyPatch(typeof(CharacterClimbing), "StartClimbRpc")] [HarmonyPostfix] public static void StartClimbRpc_Postfix(CharacterClimbing __instance) { if (!Enabled || !PhotonNetwork.IsMasterClient) { return; } Character component = ((Component)__instance).GetComponent(); if ((Object)(object)component == (Object)null) { return; } if (!s_loggedOnce) { Plugin.Log.LogInfo((object)("[UnderstatedManner] Hook active! " + $"DrowsyAmount={DrowsyAmount}, CooldownSeconds={CooldownSeconds}, " + $"ThresholdCount={ThresholdCount}, Enabled={Enabled}")); s_loggedOnce = true; } float time = Time.time; int actorNumber = ((MonoBehaviourPun)component).photonView.Owner.ActorNumber; if (s_lastClimbTime.TryGetValue(actorNumber, out var value)) { if (time - value < CooldownSeconds) { s_consecutiveCount[actorNumber]++; } else { s_consecutiveCount[actorNumber] = 1; } } else { s_consecutiveCount[actorNumber] = 1; } s_lastClimbTime[actorNumber] = time; int num = s_consecutiveCount[actorNumber]; if (num >= ThresholdCount) { if (((MonoBehaviourPun)component).photonView.IsMine) { component.refs.afflictions.AddStatus((STATUSTYPE)6, DrowsyAmount, false, true, true); return; } float[] array = new float[CharacterAfflictions.NumStatusTypes]; array[6] = DrowsyAmount; ((MonoBehaviourPun)component).photonView.RPC("RPC_ApplyStatusesFromFloatArray", (RpcTarget)0, new object[1] { array }); } } } } namespace System.Diagnostics.CodeAnalysis { [AttributeUsage(AttributeTargets.Parameter, Inherited = false)] [ExcludeFromCodeCoverage] internal sealed class ConstantExpectedAttribute : Attribute { public object? Min { get; set; } public object? Max { get; set; } } [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Module | AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Enum | AttributeTargets.Constructor | AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Interface | AttributeTargets.Delegate, Inherited = false)] [ExcludeFromCodeCoverage] internal sealed class ExperimentalAttribute : Attribute { public string DiagnosticId { get; } public string? UrlFormat { get; set; } public ExperimentalAttribute(string diagnosticId) { DiagnosticId = diagnosticId; } } [AttributeUsage(AttributeTargets.Method | AttributeTargets.Property, Inherited = false, AllowMultiple = true)] [ExcludeFromCodeCoverage] internal sealed class MemberNotNullAttribute : Attribute { public string[] Members { get; } public MemberNotNullAttribute(string member) { Members = new string[1] { member }; } public MemberNotNullAttribute(params string[] members) { Members = members; } } [AttributeUsage(AttributeTargets.Method | AttributeTargets.Property, Inherited = false, AllowMultiple = true)] [ExcludeFromCodeCoverage] internal sealed class MemberNotNullWhenAttribute : Attribute { public bool ReturnValue { get; } public string[] Members { get; } public MemberNotNullWhenAttribute(bool returnValue, string member) { ReturnValue = returnValue; Members = new string[1] { member }; } public MemberNotNullWhenAttribute(bool returnValue, params string[] members) { ReturnValue = returnValue; Members = members; } } [AttributeUsage(AttributeTargets.Constructor, AllowMultiple = false, Inherited = false)] [ExcludeFromCodeCoverage] internal sealed class SetsRequiredMembersAttribute : Attribute { } [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, AllowMultiple = false, Inherited = false)] [ExcludeFromCodeCoverage] internal sealed class StringSyntaxAttribute : Attribute { public const string CompositeFormat = "CompositeFormat"; public const string DateOnlyFormat = "DateOnlyFormat"; public const string DateTimeFormat = "DateTimeFormat"; public const string EnumFormat = "EnumFormat"; public const string GuidFormat = "GuidFormat"; public const string Json = "Json"; public const string NumericFormat = "NumericFormat"; public const string Regex = "Regex"; public const string TimeOnlyFormat = "TimeOnlyFormat"; public const string TimeSpanFormat = "TimeSpanFormat"; public const string Uri = "Uri"; public const string Xml = "Xml"; public string Syntax { get; } public object?[] Arguments { get; } public StringSyntaxAttribute(string syntax) { Syntax = syntax; Arguments = new object[0]; } public StringSyntaxAttribute(string syntax, params object?[] arguments) { Syntax = syntax; Arguments = arguments; } } [AttributeUsage(AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Parameter, AllowMultiple = false, Inherited = false)] [ExcludeFromCodeCoverage] internal sealed class UnscopedRefAttribute : Attribute { } } namespace System.Runtime.Versioning { [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Module | AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Enum | AttributeTargets.Constructor | AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Interface | AttributeTargets.Delegate, Inherited = false)] [ExcludeFromCodeCoverage] internal sealed class RequiresPreviewFeaturesAttribute : Attribute { public string? Message { get; } public string? Url { get; set; } public RequiresPreviewFeaturesAttribute() { } public RequiresPreviewFeaturesAttribute(string? message) { Message = message; } } } namespace System.Runtime.CompilerServices { [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] internal sealed class IgnoresAccessChecksToAttribute : Attribute { public IgnoresAccessChecksToAttribute(string assemblyName) { } } [AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false, Inherited = false)] [ExcludeFromCodeCoverage] internal sealed class CallerArgumentExpressionAttribute : Attribute { public string ParameterName { get; } public CallerArgumentExpressionAttribute(string parameterName) { ParameterName = parameterName; } } [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Interface, Inherited = false)] [ExcludeFromCodeCoverage] internal sealed class CollectionBuilderAttribute : Attribute { public Type BuilderType { get; } public string MethodName { get; } public CollectionBuilderAttribute(Type builderType, string methodName) { BuilderType = builderType; MethodName = methodName; } } [AttributeUsage(AttributeTargets.All, AllowMultiple = true, Inherited = false)] [ExcludeFromCodeCoverage] internal sealed class CompilerFeatureRequiredAttribute : Attribute { public const string RefStructs = "RefStructs"; public const string RequiredMembers = "RequiredMembers"; public string FeatureName { get; } public bool IsOptional { get; set; } public CompilerFeatureRequiredAttribute(string featureName) { FeatureName = featureName; } } [AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false, Inherited = false)] [ExcludeFromCodeCoverage] internal sealed class InterpolatedStringHandlerArgumentAttribute : Attribute { public string[] Arguments { get; } public InterpolatedStringHandlerArgumentAttribute(string argument) { Arguments = new string[1] { argument }; } public InterpolatedStringHandlerArgumentAttribute(params string[] arguments) { Arguments = arguments; } } [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct, AllowMultiple = false, Inherited = false)] [ExcludeFromCodeCoverage] internal sealed class InterpolatedStringHandlerAttribute : Attribute { } [EditorBrowsable(EditorBrowsableState.Never)] [ExcludeFromCodeCoverage] internal static class IsExternalInit { } [AttributeUsage(AttributeTargets.Method, Inherited = false)] [ExcludeFromCodeCoverage] internal sealed class ModuleInitializerAttribute : Attribute { } [AttributeUsage(AttributeTargets.Constructor | AttributeTargets.Method | AttributeTargets.Property, AllowMultiple = false, Inherited = false)] [ExcludeFromCodeCoverage] internal sealed class OverloadResolutionPriorityAttribute : Attribute { public int Priority { get; } public OverloadResolutionPriorityAttribute(int priority) { Priority = priority; } } [AttributeUsage(AttributeTargets.Parameter, Inherited = true, AllowMultiple = false)] [ExcludeFromCodeCoverage] internal sealed class ParamCollectionAttribute : Attribute { } [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false, Inherited = false)] [ExcludeFromCodeCoverage] internal sealed class RequiredMemberAttribute : Attribute { } [AttributeUsage(AttributeTargets.Parameter, Inherited = false)] [EditorBrowsable(EditorBrowsableState.Never)] [ExcludeFromCodeCoverage] internal sealed class RequiresLocationAttribute : Attribute { } [AttributeUsage(AttributeTargets.Module | AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Constructor | AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Event | AttributeTargets.Interface, Inherited = false)] [ExcludeFromCodeCoverage] internal sealed class SkipLocalsInitAttribute : Attribute { } }