using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Logging; using Extensions; using HarmonyLib; using Microsoft.CodeAnalysis; using TMPro; using UnityEngine; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("ExtraDayStats")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+faa4a8108cf95328a58b1069690ad0b7aa00072e")] [assembly: AssemblyProduct("ExtraDayStats")] [assembly: AssemblyTitle("ExtraDayStats")] [assembly: AssemblyVersion("1.0.0.0")] [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 ExtraDayStats { internal static class DayStatsCalculator { public static List CalculateAllPlayersStats(PayoutTracker tracker, List players) { //IL_00f9: Unknown result type (might be due to invalid IL or missing references) //IL_0124: Unknown result type (might be due to invalid IL or missing references) //IL_010d: Unknown result type (might be due to invalid IL or missing references) List list = new List(); foreach (PlayerProfile player in players) { List playerRecords = tracker.GetPlayerRecords(player); PlayerDaySummary playerDaySummary = new PlayerDaySummary { playerName = player.playerName }; foreach (PayoutRecord item in playerRecords) { if (item.bet == 0L && item.payout == 0L) { continue; } playerDaySummary.totalBet += item.bet; playerDaySummary.totalPayout += item.payout; playerDaySummary.totalGames++; if (item.isWin) { playerDaySummary.wins++; } if (item.isLoss) { playerDaySummary.losses++; } if (!item.isWin && !item.isLoss) { playerDaySummary.pushes++; } if (!playerDaySummary.byGameType.ContainsKey(item.gameType)) { playerDaySummary.byGameType[item.gameType] = new GameTypeStats(); } GameTypeStats gameTypeStats = playerDaySummary.byGameType[item.gameType]; gameTypeStats.totalBet += item.bet; gameTypeStats.totalPayout += item.payout; gameTypeStats.gameCount++; if (item.isWin) { gameTypeStats.winCount++; long num = item.payout - item.bet; if (num > gameTypeStats.biggestWin) { gameTypeStats.biggestWin = num; } } } list.Add(playerDaySummary); } return list.OrderByDescending((PlayerDaySummary s) => s.NetProfit).ToList(); } } internal static class FakeTestData { internal static List Get() { return new List(4) { new PlayerDaySummary { playerName = "BigMoneyMike", totalGames = 34, wins = 21, losses = 11, pushes = 2, totalBet = 48000L, totalPayout = 61500L, byGameType = new Dictionary { [(CasinoGameType)0] = new GameTypeStats { gameCount = 18, winCount = 12, totalBet = 24000L, totalPayout = 32000L, biggestWin = 5000L }, [(CasinoGameType)11] = new GameTypeStats { gameCount = 10, winCount = 6, totalBet = 15000L, totalPayout = 20500L, biggestWin = 8800L }, [(CasinoGameType)12] = new GameTypeStats { gameCount = 6, winCount = 3, totalBet = 9000L, totalPayout = 9000L, biggestWin = 2200L } } }, new PlayerDaySummary { playerName = "LongNamedPerson", totalGames = 22, wins = 9, losses = 13, pushes = 0, totalBet = 31000L, totalPayout = 24000L, byGameType = new Dictionary { [(CasinoGameType)1] = new GameTypeStats { gameCount = 12, winCount = 4, totalBet = 18000L, totalPayout = 12000L, biggestWin = 3100L }, [(CasinoGameType)10] = new GameTypeStats { gameCount = 7, winCount = 3, totalBet = 9000L, totalPayout = 8500L, biggestWin = 1800L }, [(CasinoGameType)15] = new GameTypeStats { gameCount = 3, winCount = 2, totalBet = 4000L, totalPayout = 3500L, biggestWin = 1500L } } }, new PlayerDaySummary { playerName = "Jess", totalGames = 19, wins = 10, losses = 9, pushes = 0, totalBet = 22000L, totalPayout = 22500L, byGameType = new Dictionary { [(CasinoGameType)0] = new GameTypeStats { gameCount = 8, winCount = 5, totalBet = 10000L, totalPayout = 11000L, biggestWin = 2000L }, [(CasinoGameType)14] = new GameTypeStats { gameCount = 7, winCount = 3, totalBet = 8000L, totalPayout = 7500L, biggestWin = 2500L }, [(CasinoGameType)9] = new GameTypeStats { gameCount = 4, winCount = 2, totalBet = 4000L, totalPayout = 4000L, biggestWin = 900L } } }, new PlayerDaySummary { playerName = "Dan", totalGames = 11, wins = 2, losses = 9, pushes = 0, totalBet = 15000L, totalPayout = 7000L, byGameType = new Dictionary { [(CasinoGameType)12] = new GameTypeStats { gameCount = 6, winCount = 1, totalBet = 9000L, totalPayout = 3500L, biggestWin = 1200L }, [(CasinoGameType)11] = new GameTypeStats { gameCount = 5, winCount = 1, totalBet = 6000L, totalPayout = 3500L, biggestWin = 2000L } } } }; } } internal static class GameTypePanel { private static readonly float[] ColX = new float[4] { -95f, -15f, 40f, 150f }; private static readonly float[] ColW = new float[4] { 95f, 45f, 60f, 185f }; internal static GameObject Build(Transform parent, List stats, DaySummaryUI instance) { //IL_0168: Unknown result type (might be due to invalid IL or missing references) //IL_016e: Expected O, but got Unknown //IL_018c: Unknown result type (might be due to invalid IL or missing references) //IL_01a1: Unknown result type (might be due to invalid IL or missing references) //IL_01b6: Unknown result type (might be due to invalid IL or missing references) //IL_01c1: Unknown result type (might be due to invalid IL or missing references) //IL_01e3: Unknown result type (might be due to invalid IL or missing references) //IL_0245: Unknown result type (might be due to invalid IL or missing references) //IL_024a: Unknown result type (might be due to invalid IL or missing references) //IL_0251: Unknown result type (might be due to invalid IL or missing references) //IL_0256: Unknown result type (might be due to invalid IL or missing references) //IL_025d: Unknown result type (might be due to invalid IL or missing references) //IL_0262: Unknown result type (might be due to invalid IL or missing references) //IL_0269: Unknown result type (might be due to invalid IL or missing references) //IL_026e: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0076: Unknown result type (might be due to invalid IL or missing references) //IL_009c: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_0299: Unknown result type (might be due to invalid IL or missing references) //IL_029e: Unknown result type (might be due to invalid IL or missing references) //IL_02f5: Unknown result type (might be due to invalid IL or missing references) //IL_02fa: Unknown result type (might be due to invalid IL or missing references) //IL_02df: Unknown result type (might be due to invalid IL or missing references) //IL_02c9: Unknown result type (might be due to invalid IL or missing references) //IL_033e: Unknown result type (might be due to invalid IL or missing references) //IL_0343: Unknown result type (might be due to invalid IL or missing references) //IL_0328: Unknown result type (might be due to invalid IL or missing references) //IL_0312: Unknown result type (might be due to invalid IL or missing references) //IL_040a: Unknown result type (might be due to invalid IL or missing references) //IL_040f: Unknown result type (might be due to invalid IL or missing references) //IL_0416: Unknown result type (might be due to invalid IL or missing references) //IL_041b: Unknown result type (might be due to invalid IL or missing references) //IL_0422: Unknown result type (might be due to invalid IL or missing references) //IL_0424: Unknown result type (might be due to invalid IL or missing references) //IL_042b: Unknown result type (might be due to invalid IL or missing references) //IL_042d: Unknown result type (might be due to invalid IL or missing references) TMP_FontAsset font = PanelHelpers.GetFont(instance); Dictionary dictionary = new Dictionary(); foreach (PlayerDaySummary stat in stats) { foreach (KeyValuePair item in stat.byGameType) { if (!dictionary.ContainsKey(item.Key)) { dictionary[item.Key] = (0, 0L, stat.playerName, long.MinValue); } (int, long, string, long) tuple = dictionary[item.Key]; bool flag = item.Value.biggestWin > tuple.Item4; dictionary[item.Key] = (tuple.Item1 + item.Value.gameCount, tuple.Item2 + item.Value.NetProfit, flag ? stat.playerName : tuple.Item3, flag ? item.Value.biggestWin : tuple.Item4); } } List> list = dictionary.OrderByDescending, int>((KeyValuePair kvp) => kvp.Value.plays).ToList(); GameObject val = new GameObject("GWYF_GameTypePanel"); val.transform.SetParent(parent, false); RectTransform obj = val.AddComponent(); obj.anchorMin = new Vector2(0.08f, 0.83f); obj.anchorMax = new Vector2(0.08f, 0.83f); obj.pivot = new Vector2(0.5f, 1f); obj.anchoredPosition = Vector2.zero; obj.sizeDelta = new Vector2(530f, (float)list.Count * 26f + 40f); val.AddComponent().alpha = 0f; val.transform.SetAsLastSibling(); float num = -20f; PanelHelpers.AddRow(val.transform, num, new string[4] { "GAME", "# HANDS", "GROUP NET", "BIGGEST WIN" }, (Color[])(object)new Color[4] { Color.gray, Color.gray, Color.gray, Color.gray }, 11, font, ColX, ColW); for (int i = 0; i < list.Count; i++) { CasinoGameType key = list[i].Key; (int, long, string, long) value = list[i].Value; Color val2 = (Color)((value.Item2 > 0) ? new Color(0.4f, 1f, 0.4f) : ((value.Item2 < 0) ? new Color(1f, 0.4f, 0.4f) : Color.white)); Color val3 = (Color)((value.Item4 > 0) ? new Color(0.4f, 1f, 0.4f) : ((value.Item4 < 0) ? new Color(1f, 0.4f, 0.4f) : Color.white)); string text = ((value.Item3.Length > 12) ? (value.Item3.Substring(0, 11) + "…") : value.Item3); string text2 = ((value.Item4 == long.MinValue) ? "-" : (text + " (" + MoneyFormatter.FormatWithDollar(value.Item4) + ")")); PanelHelpers.AddRow(val.transform, num - 30f - (float)i * 26f, new string[4] { ((object)(CasinoGameType)(ref key)).ToString(), value.Item1.ToString(), MoneyFormatter.FormatWithDollar(value.Item2), text2 }, (Color[])(object)new Color[4] { Color.white, Color.white, val2, val3 }, 15, font, ColX, ColW); } Canvas.ForceUpdateCanvases(); return val; } } [Serializable] public class GameTypeStats { public long totalBet { get; set; } public long totalPayout { get; set; } public int gameCount { get; set; } public int winCount { get; set; } public long biggestWin { get; set; } public long NetProfit => totalPayout - totalBet; public float WinPercentage { get { if (gameCount <= 0) { return 0f; } return (float)winCount * 100f / (float)gameCount; } } } internal static class PanelHelpers { private static TMP_FontAsset? _font; internal static TMP_FontAsset? GetFont(DaySummaryUI instance) { if ((Object)(object)_font != (Object)null) { return _font; } object? obj = typeof(DaySummaryUI).GetField("titleText", BindingFlags.Instance | BindingFlags.NonPublic)?.GetValue(instance); object? obj2 = ((obj is TextMeshProUGUI) ? obj : null); _font = ((obj2 != null) ? ((TMP_Text)obj2).font : null); if ((Object)(object)_font == (Object)null) { TextMeshProUGUI val = Object.FindFirstObjectByType(); _font = ((val != null) ? ((TMP_Text)val).font : null); if ((Object)(object)_font != (Object)null) { Plugin.Log.LogInfo((object)("[CustomStats] Font borrowed from '" + ((Object)((Component)val).gameObject).name + "'")); } } if ((Object)(object)_font == (Object)null) { Plugin.Log.LogWarning((object)"[CustomStats] Could not find any TMP font — text will be invisible"); } else { Plugin.Log.LogInfo((object)("[CustomStats] Font resolved: " + ((Object)_font).name)); } return _font; } internal static void AddRow(Transform parent, float y, string[] vals, Color[] colors, int fontSize, TMP_FontAsset? font, float[] colX, float[] colW) { //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_009a: Unknown result type (might be due to invalid IL or missing references) //IL_00af: Unknown result type (might be due to invalid IL or missing references) //IL_00c4: Unknown result type (might be due to invalid IL or missing references) //IL_00d4: Unknown result type (might be due to invalid IL or missing references) //IL_00e7: Unknown result type (might be due to invalid IL or missing references) for (int i = 0; i < vals.Length; i++) { GameObject val = new GameObject($"Cell_{y}_{i}"); val.transform.SetParent(parent, false); TextMeshProUGUI val2 = val.AddComponent(); if ((Object)(object)font != (Object)null) { ((TMP_Text)val2).font = font; } ((TMP_Text)val2).text = vals[i]; ((TMP_Text)val2).fontSize = fontSize; ((Graphic)val2).color = colors[i]; ((TMP_Text)val2).alignment = (TextAlignmentOptions)((i == 0) ? 513 : 514); ((TMP_Text)val2).overflowMode = (TextOverflowModes)0; ((TMP_Text)val2).textWrappingMode = (TextWrappingModes)0; RectTransform component = val.GetComponent(); component.anchorMin = new Vector2(0.5f, 1f); component.anchorMax = new Vector2(0.5f, 1f); component.pivot = new Vector2(0.5f, 1f); component.anchoredPosition = new Vector2(colX[i], y); component.sizeDelta = new Vector2(colW[i], 28f); } } } [Serializable] public class PlayerDaySummary { public string playerName { get; set; } public long totalBet { get; set; } public long totalPayout { get; set; } public int totalGames { get; set; } public int wins { get; set; } public int losses { get; set; } public int pushes { get; set; } public Dictionary byGameType { get; set; } public long NetProfit => totalPayout - totalBet; public float WinPercentage { get { int num = wins + losses; if (num <= 0) { return 0f; } return (float)wins * 100f / (float)num; } } public PlayerDaySummary() { byGameType = new Dictionary(); } } internal static class PlayerStatsPanel { private static readonly float[] ColX = new float[5] { -88f, 5f, 55f, 113f, 183f }; private static readonly float[] ColW = new float[5] { 110f, 42f, 48f, 60f, 72f }; internal static GameObject Build(Transform parent, List stats, DaySummaryUI instance) { //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown //IL_0031: 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_005b: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_0089: Unknown result type (might be due to invalid IL or missing references) //IL_009e: Unknown result type (might be due to invalid IL or missing references) //IL_0110: Unknown result type (might be due to invalid IL or missing references) //IL_0115: Unknown result type (might be due to invalid IL or missing references) //IL_011c: Unknown result type (might be due to invalid IL or missing references) //IL_0121: Unknown result type (might be due to invalid IL or missing references) //IL_0128: Unknown result type (might be due to invalid IL or missing references) //IL_012d: Unknown result type (might be due to invalid IL or missing references) //IL_0134: Unknown result type (might be due to invalid IL or missing references) //IL_0139: Unknown result type (might be due to invalid IL or missing references) //IL_0140: Unknown result type (might be due to invalid IL or missing references) //IL_0145: Unknown result type (might be due to invalid IL or missing references) //IL_01fc: Unknown result type (might be due to invalid IL or missing references) //IL_0201: Unknown result type (might be due to invalid IL or missing references) //IL_01e6: Unknown result type (might be due to invalid IL or missing references) //IL_01d0: Unknown result type (might be due to invalid IL or missing references) //IL_024b: Unknown result type (might be due to invalid IL or missing references) //IL_0250: Unknown result type (might be due to invalid IL or missing references) //IL_0235: Unknown result type (might be due to invalid IL or missing references) //IL_021f: Unknown result type (might be due to invalid IL or missing references) //IL_02f0: Unknown result type (might be due to invalid IL or missing references) //IL_02f5: Unknown result type (might be due to invalid IL or missing references) //IL_02fc: Unknown result type (might be due to invalid IL or missing references) //IL_0301: Unknown result type (might be due to invalid IL or missing references) //IL_0308: Unknown result type (might be due to invalid IL or missing references) //IL_030a: Unknown result type (might be due to invalid IL or missing references) //IL_0311: Unknown result type (might be due to invalid IL or missing references) //IL_0313: Unknown result type (might be due to invalid IL or missing references) //IL_031a: Unknown result type (might be due to invalid IL or missing references) //IL_031f: Unknown result type (might be due to invalid IL or missing references) TMP_FontAsset font = PanelHelpers.GetFont(instance); GameObject val = new GameObject("GWYF_StatsPanel"); val.transform.SetParent(parent, false); RectTransform val2 = val.AddComponent(); val2.anchorMin = new Vector2(0.08f, 0.58f); val2.anchorMax = new Vector2(0.08f, 0.58f); val2.pivot = new Vector2(0.5f, 1f); val2.anchoredPosition = Vector2.zero; val2.sizeDelta = new Vector2(380f, (float)stats.Count * 36f + 40f); Plugin.Log.LogInfo((object)$"[CustomStats] PlayerStatsPanel size={val2.sizeDelta}"); val.AddComponent().alpha = 0f; val.transform.SetAsLastSibling(); float num = -20f; PanelHelpers.AddRow(val.transform, num, new string[5] { "PLAYER", "# BETS", "WIN %", "NET", "TOTAL BET" }, (Color[])(object)new Color[5] { Color.gray, Color.gray, Color.gray, Color.gray, Color.gray }, 11, font, ColX, ColW); for (int i = 0; i < stats.Count; i++) { PlayerDaySummary playerDaySummary = stats[i]; string text = MoneyFormatter.FormatWithDollar(Math.Abs(playerDaySummary.NetProfit)); string text2 = ((playerDaySummary.NetProfit > 0) ? ("+" + text) : ((playerDaySummary.NetProfit < 0) ? ("-" + text) : "$0")); Color val3 = (Color)((playerDaySummary.NetProfit > 0) ? new Color(0.4f, 1f, 0.4f) : ((playerDaySummary.NetProfit < 0) ? new Color(1f, 0.4f, 0.4f) : Color.white)); Color val4 = (Color)((playerDaySummary.WinPercentage > 50f) ? new Color(0.4f, 1f, 0.4f) : ((playerDaySummary.WinPercentage < 50f) ? new Color(1f, 0.4f, 0.4f) : Color.white)); string text3 = ((playerDaySummary.playerName.Length > 12) ? (playerDaySummary.playerName.Substring(0, 11) + "…") : playerDaySummary.playerName); PanelHelpers.AddRow(val.transform, num - 36f - (float)i * 34f, new string[5] { text3, playerDaySummary.totalGames.ToString(), $"{playerDaySummary.WinPercentage:F1}%", text2, MoneyFormatter.FormatWithDollar(playerDaySummary.totalBet) }, (Color[])(object)new Color[5] { Color.white, Color.white, val4, val3, Color.white }, 15, font, ColX, ColW); } Canvas.ForceUpdateCanvases(); return val; } } [BepInPlugin("com.npete.extradaystats", "ExtraDayStats", "0.1.0")] public class Plugin : BaseUnityPlugin { internal static ManualLogSource Log; private readonly Harmony _harmony = new Harmony("com.npete.extradaystats"); private void Awake() { Log = ((BaseUnityPlugin)this).Logger; _harmony.PatchAll(); Log.LogInfo((object)"ExtraDayStats v0.1.0 loaded."); } private void OnDestroy() { _harmony.UnpatchSelf(); } } internal static class MyPluginInfo { public const string PLUGIN_GUID = "com.npete.extradaystats"; public const string PLUGIN_NAME = "ExtraDayStats"; public const string PLUGIN_VERSION = "0.1.0"; } [HarmonyPatch(typeof(DaySummaryUI), "Show")] internal static class Patch_DaySummaryUI_Show { [CompilerGenerated] private sealed class <>c__DisplayClass2_0 { public CanvasGroup moneyGroup; internal bool b__0() { if ((Object)(object)moneyGroup != (Object)null) { return moneyGroup.alpha >= 0.9f; } return false; } internal bool b__4() { if (!((Object)(object)moneyGroup == (Object)null)) { return moneyGroup.alpha < 0.1f; } return true; } } [CompilerGenerated] private sealed class d__1 : IEnumerator, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public DaySummaryUI instance; private CanvasGroup 5__2; private float 5__3; object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public d__1(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { 5__2 = null; <>1__state = -2; } private bool MoveNext() { switch (<>1__state) { default: return false; case 0: { <>1__state = -1; PayoutTracker val = NetworkSingleton.Instance; List list = (from p in Object.FindObjectsByType((FindObjectsSortMode)0) where (Object)(object)p != (Object)null && p.hasSynced && !string.IsNullOrEmpty(p.playerName) select p).ToList(); List list2; if ((Object)(object)val != (Object)null && list.Count > 0) { list2 = DayStatsCalculator.CalculateAllPlayersStats(val, list); } else { Plugin.Log.LogInfo((object)"[Debug] No PayoutTracker data — using fake stats for layout test"); list2 = new List(); } Plugin.Log.LogInfo((object)$"[Debug] Showing stats for {list2.Count} players"); GameObject val2 = PlayerStatsPanel.Build(((Component)instance).transform, list2, instance); 5__2 = val2.GetComponent(); 5__3 = 0f; break; } case 1: <>1__state = -1; break; } if (5__3 < 0.5f) { 5__3 += Time.deltaTime; 5__2.alpha = Mathf.Clamp01(5__3 / 0.5f); <>2__current = null; <>1__state = 1; return true; } 5__2.alpha = 1f; 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 d__2 : IEnumerator, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public DaySummaryUI instance; private <>c__DisplayClass2_0 <>8__1; private GameObject 5__2; private GameObject 5__3; private CanvasGroup 5__4; private CanvasGroup 5__5; private float 5__6; object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public d__2(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>8__1 = null; 5__2 = null; 5__3 = null; 5__4 = null; 5__5 = null; <>1__state = -2; } private bool MoveNext() { //IL_008b: Unknown result type (might be due to invalid IL or missing references) //IL_0095: Expected O, but got Unknown //IL_02da: Unknown result type (might be due to invalid IL or missing references) //IL_02e4: Expected O, but got Unknown switch (<>1__state) { default: return false; case 0: { <>1__state = -1; <>8__1 = new <>c__DisplayClass2_0(); CanvasGroup[] field = GetField(instance, "canvasGroups"); if (field == null || field.Length < 4) { Plugin.Log.LogWarning((object)"[CustomStats] canvasGroups missing or too short"); return false; } <>8__1.moneyGroup = field[3]; Plugin.Log.LogInfo((object)"[CustomStats] Waiting for money group to fade in..."); <>2__current = (object)new WaitUntil((Func)(() => (Object)(object)<>8__1.moneyGroup != (Object)null && <>8__1.moneyGroup.alpha >= 0.9f)); <>1__state = 1; return true; } case 1: { <>1__state = -1; Plugin.Log.LogInfo((object)"[CustomStats] Money group visible — building stats panel"); PayoutTracker val = NetworkSingleton.Instance; List list = (from p in Object.FindObjectsByType((FindObjectsSortMode)0) where (Object)(object)p != (Object)null && p.hasSynced && !string.IsNullOrEmpty(p.playerName) select p).ToList(); List list2 = ((!((Object)(object)val != (Object)null) || list.Count <= 0) ? list.Select((PlayerProfile p) => new PlayerDaySummary { playerName = p.playerName }).ToList() : DayStatsCalculator.CalculateAllPlayersStats(val, list)); if (list2.Count == 0 || list2.All((PlayerDaySummary s) => s.totalGames == 0)) { Plugin.Log.LogInfo((object)"[CustomStats] No game data — using fake stats for layout test"); } Plugin.Log.LogInfo((object)$"[CustomStats] {list2.Count} player(s) to display"); 5__2 = PlayerStatsPanel.Build(((Component)instance).transform, list2, instance); 5__3 = GameTypePanel.Build(((Component)instance).transform, list2, instance); Plugin.Log.LogInfo((object)"[CustomStats] Panels built"); 5__4 = 5__2.GetComponent(); 5__5 = 5__3.GetComponent(); 5__6 = 0f; goto IL_027f; } case 2: <>1__state = -1; goto IL_027f; case 3: { <>1__state = -1; if ((Object)(object)5__2 != (Object)null) { Object.Destroy((Object)(object)5__2); } if ((Object)(object)5__3 != (Object)null) { Object.Destroy((Object)(object)5__3); } return false; } IL_027f: if (5__6 < 0.5f) { 5__6 += Time.deltaTime; float alpha = Mathf.Clamp01(5__6 / 0.5f); if ((Object)(object)5__4 != (Object)null) { 5__4.alpha = alpha; } if ((Object)(object)5__5 != (Object)null) { 5__5.alpha = alpha; } <>2__current = null; <>1__state = 2; return true; } if ((Object)(object)5__4 != (Object)null) { 5__4.alpha = 1f; } if ((Object)(object)5__5 != (Object)null) { 5__5.alpha = 1f; } <>2__current = (object)new WaitUntil((Func)(() => (Object)(object)<>8__1.moneyGroup == (Object)null || <>8__1.moneyGroup.alpha < 0.1f)); <>1__state = 3; 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(); } } private static void Postfix(DaySummaryUI __instance) { ((MonoBehaviour)__instance).StartCoroutine(ShowStatsAfterGraph(__instance)); } [IteratorStateMachine(typeof(d__1))] public static IEnumerator DebugShowStats(DaySummaryUI instance) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new d__1(0) { instance = instance }; } [IteratorStateMachine(typeof(d__2))] private static IEnumerator ShowStatsAfterGraph(DaySummaryUI instance) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new d__2(0) { instance = instance }; } private static T GetField(object obj, string name) { FieldInfo field = typeof(DaySummaryUI).GetField(name, BindingFlags.Instance | BindingFlags.NonPublic); if (field != null) { return (T)field.GetValue(obj); } Plugin.Log.LogWarning((object)("[CustomStats] Field '" + name + "' not found")); return default(T); } } }