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 CharacterStats v1.0.0
Character Stats.dll
Decompiled 2 months agousing System; using System.Collections; using System.Collections.Generic; 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.Logging; 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: IgnoresAccessChecksTo("")] [assembly: AssemblyCompany("headclef")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+083b765b8776ea7b80a25c9835c2dc5fb287a646")] [assembly: AssemblyProduct("Character Stats")] [assembly: AssemblyTitle("Character Stats")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] 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; } } [CompilerGenerated] [Microsoft.CodeAnalysis.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 Character_Stats { [BepInPlugin("headclef.CharacterStats", "Character Stats", "1.0.0")] public class Character_Stats : BaseUnityPlugin { private const string PluginGuid = "headclef.CharacterStats"; private const string PluginName = "Character Stats"; private const string PluginVersion = "1.0.0"; private static readonly Dictionary<string, Dictionary<string, int>> _playerStats = new Dictionary<string, Dictionary<string, int>>(); private static bool _statsReady; internal static Character_Stats Instance { get; private set; } = null; internal static ManualLogSource Logger => Instance._logger; private ManualLogSource _logger => ((BaseUnityPlugin)this).Logger; internal Harmony? Harmony { get; set; } public static bool AreStatsReady => _statsReady; private void Awake() { //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Expected O, but got Unknown //IL_004d: Expected O, but got Unknown Instance = this; ((Component)this).gameObject.transform.parent = null; ((Object)((Component)this).gameObject).hideFlags = (HideFlags)61; 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(); } } public static int GetUpgradeLevel(string steamId, string upgradeKey) { if (_playerStats.TryGetValue(steamId, out Dictionary<string, int> value) && value.TryGetValue(upgradeKey, out var value2)) { return value2; } return 0; } public static Dictionary<string, int> GetAllUpgrades(string steamId) { if (_playerStats.TryGetValue(steamId, out Dictionary<string, int> value)) { return new Dictionary<string, int>(value); } return new Dictionary<string, int>(); } public static IEnumerable<string> GetTrackedPlayers() { return _playerStats.Keys; } public static string? GetLocalSteamId() { return PlayerController.instance?.playerSteamID; } internal static void RefreshStats() { _playerStats.Clear(); List<PlayerAvatar> list = SemiFunc.PlayerGetAll(); if (list == null || list.Count == 0) { _statsReady = false; return; } foreach (PlayerAvatar item in list) { string text = SemiFunc.PlayerGetSteamID(item); Dictionary<string, int> dictionary = StatsManager.instance.FetchPlayerUpgrades(text); if (dictionary != null) { _playerStats[text] = new Dictionary<string, int>(dictionary); Logger.LogDebug((object)("Stats for " + text + ": " + string.Join(", ", dictionary))); } } _statsReady = true; Logger.LogInfo((object)$"Character stats refreshed for {_playerStats.Count} player(s)."); } internal static void ClearStats() { _playerStats.Clear(); _statsReady = false; } } } namespace Character_Stats.Patches { [HarmonyPatch] internal static class StatReaderPatch { [CompilerGenerated] private sealed class <ReadStatsAfterSync>d__3 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <ReadStatsAfterSync>d__3(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_0082: Unknown result type (might be due to invalid IL or missing references) //IL_008c: Expected O, but got Unknown switch (<>1__state) { default: return false; case 0: <>1__state = -1; <>2__current = null; <>1__state = 1; return true; case 1: <>1__state = -1; <>2__current = null; <>1__state = 2; return true; case 2: <>1__state = -1; <>2__current = null; <>1__state = 3; return true; case 3: <>1__state = -1; <>2__current = (object)new WaitForSeconds(1f); <>1__state = 4; return true; case 4: <>1__state = -1; Character_Stats.RefreshStats(); return false; } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } [CompilerGenerated] private sealed class <ReadStatsDelayed>d__1 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <ReadStatsDelayed>d__1(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Expected O, but got Unknown //IL_006f: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Expected O, but got Unknown switch (<>1__state) { default: return false; case 0: <>1__state = -1; goto IL_004f; case 1: <>1__state = -1; goto IL_004f; case 2: { <>1__state = -1; Character_Stats.RefreshStats(); return false; } IL_004f: if (!SemiFunc.LevelGenDone()) { <>2__current = (object)new WaitForSeconds(0.5f); <>1__state = 1; return true; } if (!SemiFunc.RunIsLevel()) { return false; } <>2__current = (object)new WaitForSeconds(1f); <>1__state = 2; return true; } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } [HarmonyPatch(typeof(GameDirector), "Start")] [HarmonyPostfix] private static void GameDirector_Start_Postfix() { Object.FindObjectOfType<MonoBehaviour>().StartCoroutine(ReadStatsDelayed()); } [IteratorStateMachine(typeof(<ReadStatsDelayed>d__1))] private static IEnumerator ReadStatsDelayed() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <ReadStatsDelayed>d__1(0); } [HarmonyPatch(typeof(PunManager), "ReceiveSyncData")] [HarmonyPostfix] private static void ReceiveSyncData_Postfix(bool finalChunk) { if (finalChunk) { Object.FindObjectOfType<MonoBehaviour>().StartCoroutine(ReadStatsAfterSync()); } } [IteratorStateMachine(typeof(<ReadStatsAfterSync>d__3))] private static IEnumerator ReadStatsAfterSync() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <ReadStatsAfterSync>d__3(0); } [HarmonyPatch(typeof(RunManager), "ResetProgress")] [HarmonyPostfix] private static void RunManager_ResetProgress_Postfix() { Character_Stats.ClearStats(); } } }