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 LCStatsTracker v1.0.2
OreoM.StatsTracker.dll
Decompiled 11 hours agousing System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Net; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using System.Text; using System.Threading; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Logging; using GameNetcodeStuff; using HQoL.Network; using HarmonyLib; using Microsoft.CodeAnalysis; using Newtonsoft.Json; using StatsTracker.Patches; using StatsTracker.Util; using Unity.Netcode; using UnityEngine; using UnityEngine.Rendering.HighDefinition; using UnityEngine.SceneManagement; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: IgnoresAccessChecksTo("AmazingAssets.TerrainToMesh")] [assembly: IgnoresAccessChecksTo("Assembly-CSharp-firstpass")] [assembly: IgnoresAccessChecksTo("Assembly-CSharp")] [assembly: IgnoresAccessChecksTo("ClientNetworkTransform")] [assembly: IgnoresAccessChecksTo("com.olegknyazev.softmask")] [assembly: IgnoresAccessChecksTo("DissonanceVoip")] [assembly: IgnoresAccessChecksTo("DunGen")] [assembly: IgnoresAccessChecksTo("DunGen.Integration.ASPP")] [assembly: IgnoresAccessChecksTo("DunGen.Integration.UnityNav")] [assembly: IgnoresAccessChecksTo("EasyTextEffects")] [assembly: IgnoresAccessChecksTo("Facepunch Transport for Netcode for GameObjects")] [assembly: IgnoresAccessChecksTo("Facepunch.Steamworks.Win64")] [assembly: IgnoresAccessChecksTo("OreoM.HQoL.72")] [assembly: IgnoresAccessChecksTo("OreoM.HQoL.73")] [assembly: IgnoresAccessChecksTo("Unity.AI.Navigation")] [assembly: IgnoresAccessChecksTo("Unity.Animation.Rigging")] [assembly: IgnoresAccessChecksTo("Unity.Animation.Rigging.DocCodeExamples")] [assembly: IgnoresAccessChecksTo("Unity.Burst")] [assembly: IgnoresAccessChecksTo("Unity.Burst.Unsafe")] [assembly: IgnoresAccessChecksTo("Unity.Collections")] [assembly: IgnoresAccessChecksTo("Unity.Collections.LowLevel.ILSupport")] [assembly: IgnoresAccessChecksTo("Unity.InputSystem")] [assembly: IgnoresAccessChecksTo("Unity.InputSystem.ForUI")] [assembly: IgnoresAccessChecksTo("Unity.Jobs")] [assembly: IgnoresAccessChecksTo("Unity.Mathematics")] [assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.Common")] [assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.MetricTypes")] [assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetStats")] [assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetStatsMonitor.Component")] [assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetStatsMonitor.Configuration")] [assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetStatsMonitor.Implementation")] [assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetStatsReporting")] [assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetworkProfiler.Runtime")] [assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetworkSolutionInterface")] [assembly: IgnoresAccessChecksTo("Unity.Netcode.Components")] [assembly: IgnoresAccessChecksTo("Unity.Netcode.Runtime")] [assembly: IgnoresAccessChecksTo("Unity.Networking.Transport")] [assembly: IgnoresAccessChecksTo("Unity.ProBuilder.Csg")] [assembly: IgnoresAccessChecksTo("Unity.ProBuilder")] [assembly: IgnoresAccessChecksTo("Unity.ProBuilder.KdTree")] [assembly: IgnoresAccessChecksTo("Unity.ProBuilder.Poly2Tri")] [assembly: IgnoresAccessChecksTo("Unity.ProBuilder.Stl")] [assembly: IgnoresAccessChecksTo("Unity.Profiling.Core")] [assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.Core.Runtime")] [assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.Core.ShaderLibrary")] [assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.HighDefinition.Config.Runtime")] [assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.HighDefinition.Runtime")] [assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.ShaderGraph.ShaderGraphLibrary")] [assembly: IgnoresAccessChecksTo("Unity.Services.Authentication")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Analytics")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Components")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Configuration")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Device")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Environments")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Environments.Internal")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Internal")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Networking")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Registration")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Scheduler")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Telemetry")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Threading")] [assembly: IgnoresAccessChecksTo("Unity.Services.QoS")] [assembly: IgnoresAccessChecksTo("Unity.Services.Relay")] [assembly: IgnoresAccessChecksTo("Unity.TextMeshPro")] [assembly: IgnoresAccessChecksTo("Unity.Timeline")] [assembly: IgnoresAccessChecksTo("Unity.VisualEffectGraph.Runtime")] [assembly: IgnoresAccessChecksTo("Unity.XR.CoreUtils")] [assembly: IgnoresAccessChecksTo("Unity.XR.Management")] [assembly: IgnoresAccessChecksTo("Unity.XR.OpenXR")] [assembly: IgnoresAccessChecksTo("Unity.XR.OpenXR.Features.ConformanceAutomation")] [assembly: IgnoresAccessChecksTo("Unity.XR.OpenXR.Features.MetaQuestSupport")] [assembly: IgnoresAccessChecksTo("Unity.XR.OpenXR.Features.MockRuntime")] [assembly: IgnoresAccessChecksTo("Unity.XR.OpenXR.Features.OculusQuestSupport")] [assembly: IgnoresAccessChecksTo("Unity.XR.OpenXR.Features.RuntimeDebugger")] [assembly: IgnoresAccessChecksTo("UnityEngine.ARModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.NVIDIAModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.SpatialTracking")] [assembly: IgnoresAccessChecksTo("UnityEngine.UI")] [assembly: IgnoresAccessChecksTo("UnityEngine.XR.LegacyInputHelpers")] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("OreoM.StatsTracker")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.2.0")] [assembly: AssemblyInformationalVersion("1.0.2+fe7019100f364ca762c78adf05655ed6349a5945")] [assembly: AssemblyProduct("StatsTracker")] [assembly: AssemblyTitle("OreoM.StatsTracker")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.2.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 StatsTracker { [BepInPlugin("OreoM.StatsTracker", "StatsTracker", "1.0.2")] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] public class StatsTracker : BaseUnityPlugin { internal static Stats? DayStats; internal static HttpSSE LocalServer = new HttpSSE(); internal static Dictionary<string, string> VanillaInteriorNames = new Dictionary<string, string> { { "Level1Flow", "Facility" }, { "Level2Flow", "Mansion" }, { "Level1FlowExtraLarge", "UnusedFacility" }, { "Level1Flow3Exits", "Facility3Exit" }, { "Level3Flow", "Mineshaft" } }; public static StatsTracker Instance { get; private set; } = null; internal static ManualLogSource Logger { get; private set; } = null; internal static Harmony? Harmony { get; set; } private void Awake() { Logger = ((BaseUnityPlugin)this).Logger; Instance = this; Patch(); if (Chainloader.PluginInfos.ContainsKey("OreoM.HQoL.72") || Chainloader.PluginInfos.ContainsKey("OreoM.HQoL.73")) { Harmony? harmony = Harmony; if (harmony != null) { harmony.PatchAll(typeof(HQoLTracker)); } } LocalServer.Start(); Logger.LogInfo((object)"OreoM.StatsTracker v1.0.2 has loaded!"); } internal static void Patch() { //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Expected O, but got Unknown if (Harmony == null) { Harmony = new Harmony("OreoM.StatsTracker"); } Logger.LogDebug((object)"Patching..."); Harmony.PatchAll(); Logger.LogDebug((object)"Finished patching!"); } internal static void Unpatch() { Logger.LogDebug((object)"Unpatching..."); Harmony? harmony = Harmony; if (harmony != null) { harmony.UnpatchSelf(); } Logger.LogDebug((object)"Finished unpatching!"); } internal static string GetCurrentTimeString() { float normalizedTimeOfDay = TimeOfDay.Instance.normalizedTimeOfDay; float num = TimeOfDay.Instance.numberOfHours; bool flag = false; string text = ""; string text2 = ""; int num2 = (int)(normalizedTimeOfDay * (60f * num)) + 360; int num3 = (int)Mathf.Floor((float)(num2 / 60)); text = (flag ? "\n" : " "); text2 = text + "AM"; if (num3 >= 24) { return "12:00 " + text + " AM"; } text2 = ((num3 >= 12) ? (text + "PM") : (text + "AM")); if (num3 > 12) { num3 %= 12; } int num4 = num2 % 60; return $"{num3:00}:{num4:00}".TrimStart('0') + text2; } } public static class MyPluginInfo { public const string PLUGIN_GUID = "OreoM.StatsTracker"; public const string PLUGIN_NAME = "StatsTracker"; public const string PLUGIN_VERSION = "1.0.2"; } } namespace StatsTracker.Util { public class HttpSSE { private HttpListener? listener; private string? currentJson; private Thread? serverThread; private const int PORT = 2145; private readonly ManualResetEvent dayFinishedSignaler = new ManualResetEvent(initialState: false); public void Start() { listener = new HttpListener(); listener.Prefixes.Add($"http://localhost:{2145}/"); listener.Start(); serverThread = new Thread(ListenLoop) { IsBackground = true }; serverThread.Start(); StatsTracker.Logger.LogInfo((object)$"Stat server running at http://localhost:{2145}"); } public void Stop() { listener?.Stop(); serverThread?.Join(); StatsTracker.Logger.LogInfo((object)"Stat server stopped"); } public void PublishStats(string json) { currentJson = json; dayFinishedSignaler.Set(); } public void Reset() { currentJson = null; dayFinishedSignaler.Reset(); } private void ListenLoop() { while (listener.IsListening) { try { HttpListenerContext context = listener.GetContext(); ThreadPool.QueueUserWorkItem(delegate { HandleRequest(context); }); } catch (HttpListenerException) { break; } } } private void HandleRequest(HttpListenerContext context) { HttpListenerResponse response = context.Response; response.StatusCode = 200; response.ContentType = "text/event-stream"; response.Headers.Add("Cache-Control", "no-cache"); response.Headers.Add("Access-Control-Allow-Origin", "*"); dayFinishedSignaler.WaitOne(); string s = "data: " + currentJson + "\n\n"; byte[] bytes = Encoding.UTF8.GetBytes(s); response.OutputStream.Write(bytes, 0, bytes.Length); response.OutputStream.Flush(); response.Close(); Reset(); } } internal class PlayerStats { public string Name; public bool Alive; public bool Disconnected; public string TimeOfDeath; public string CauseOfDeath; public PlayerStats(string name) { Name = name; Alive = true; Disconnected = false; TimeOfDeath = ""; CauseOfDeath = ""; } public void Kill(string TimeOfDeath, string CauseOfDeath) { Alive = false; this.TimeOfDeath = TimeOfDeath; this.CauseOfDeath = CauseOfDeath; } public void Disconnect() { Disconnected = true; } } internal class KiwiBirdInfo { public List<int> EggValues; public KiwiBirdInfo() { EggValues = new List<int>(); } public void AddEggValue(int[] values) { EggValues.AddRange(values); } } internal class BeeInfo { public List<int> Values; public BeeInfo() { Values = new List<int>(); } public void AddBeeValue(int value) { Values.Add(value); } } internal class MissingItemInfo { public int Value; public string ItemType; public double[] DespawnPosition; public bool CollectedOnPreviousDay; public MissingItemInfo(string Name, int Value, Vector3 DespawnPosition, bool CollectedOnPreviousDay) { //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_003d: Unknown result type (might be due to invalid IL or missing references) ItemType = Name; this.Value = Value; this.DespawnPosition = new double[3] { Math.Round(DespawnPosition.x, 1), Math.Round(DespawnPosition.y, 1), Math.Round(DespawnPosition.z, 1) }; this.CollectedOnPreviousDay = CollectedOnPreviousDay; } } internal class HazardInfo { public int TurretCount; public int LandmineCount; public int SpiketrapCount; public HazardInfo(int TurretCount, int LandmineCount, int SpiketrapCount) { this.TurretCount = TurretCount; this.LandmineCount = LandmineCount; this.SpiketrapCount = SpiketrapCount; } } internal class MoonInfo { public string Name; public string Weather; public MoonInfo(string Name, string Weather) { this.Name = Name; this.Weather = Weather; } } internal class DungeonInfo { public int ItemCount; public string Interior; public DungeonInfo(int ItemCount, string Interior) { this.ItemCount = ItemCount; this.Interior = Interior; } } internal class SpawnInfo { public string Enemy; public string SpawnTime; public SpawnInfo(EnemyType EnemyType, string Time) { Enemy = EnemyType.enemyName; SpawnTime = Time; } } internal class Stats { public MoonInfo MoonInfo; public DungeonInfo? DungeonInfo; public HazardInfo? HazardInfo; public BeeInfo BeeInfo; public KiwiBirdInfo BirdInfo; public int Seed; public int ShotgunsCollected; public int KnivesCollected; public int CollectedNoExtra; public int CollectedTotal; public int BottomLine; public int BottomLineTrue; public int ValueSold; public int NewQuota; public bool AppSpawned; public bool IndoorFog; public string TakeOffTime; public string SIDType; public string InfestationType; public string MeteorShowerTime; public Dictionary<ulong, PlayerStats> Players; public List<SpawnInfo> IndoorSpawns; public List<SpawnInfo> DayTimeSpawns; public List<SpawnInfo> NightTimeSpawns; public List<MissingItemInfo> MissedItems; public Stats(int seed, string moonName, string weather, PlayerControllerB[] allPlayers) { MoonInfo = new MoonInfo(moonName, weather); BeeInfo = new BeeInfo(); BirdInfo = new KiwiBirdInfo(); MissedItems = new List<MissingItemInfo>(); IndoorSpawns = new List<SpawnInfo>(); DayTimeSpawns = new List<SpawnInfo>(); NightTimeSpawns = new List<SpawnInfo>(); Players = new Dictionary<ulong, PlayerStats>(); Seed = seed; ShotgunsCollected = 0; KnivesCollected = 0; CollectedNoExtra = 0; CollectedTotal = 0; BottomLine = 0; BottomLineTrue = 0; ValueSold = 0; NewQuota = 0; TakeOffTime = ""; SIDType = ""; InfestationType = ""; MeteorShowerTime = ""; foreach (PlayerControllerB val in allPlayers) { Players[val.playerSteamId] = new PlayerStats(val.playerUsername); } } } } namespace StatsTracker.Patches { [HarmonyPatch] internal class CompanyTracker { [HarmonyPatch(typeof(DepositItemsDesk), "SellItemsOnServer")] [HarmonyPrefix] private static void CalculateAmountSold(DepositItemsDesk __instance) { for (int i = 0; i < __instance.itemsOnCounter.Count; i++) { if (__instance.itemsOnCounter[i].itemProperties.isScrap) { Stats? dayStats = StatsTracker.DayStats; if (dayStats != null) { dayStats.ValueSold += __instance.itemsOnCounter[i].scrapValue; } } } } } internal class HQoLTracker { private static int totalSold; [HarmonyPatch(typeof(DepositItemsDesk), "Start")] [HarmonyPostfix] private static void RegisterOnChangeWhenLandingOnCompanyTypeMoon(DepositItemsDesk __instance) { if ((Object)(object)HQoLNetwork.Instance != (Object)null) { NetworkVariable<int> totalStorageValue = HQoLNetwork.Instance.totalStorageValue; totalStorageValue.OnValueChanged = (OnValueChangedDelegate<int>)(object)Delegate.Combine((Delegate?)(object)totalStorageValue.OnValueChanged, (Delegate?)(object)new OnValueChangedDelegate<int>(OnChangeFindSoldValue)); } else if ((Object)(object)HQoLNetwork.Instance != (Object)null) { NetworkVariable<int> totalStorageValue2 = HQoLNetwork.Instance.totalStorageValue; totalStorageValue2.OnValueChanged = (OnValueChangedDelegate<int>)(object)Delegate.Combine((Delegate?)(object)totalStorageValue2.OnValueChanged, (Delegate?)(object)new OnValueChangedDelegate<int>(OnChangeFindSoldValue)); } else { StatsTracker.Logger.LogWarning((object)"Failed to find HQoL instance, sold value will not be sync'd"); } } [HarmonyPatch(typeof(RoundManager), "DespawnPropsAtEndOfRound")] [HarmonyPostfix] private static void DeregisterOnChangeAfterTakingOffCompanyTypeMoon(RoundManager __instance) { if (!((Object)(object)Object.FindAnyObjectByType<DepositItemsDesk>() == (Object)null)) { if ((Object)(object)HQoLNetwork.Instance != (Object)null) { NetworkVariable<int> totalStorageValue = HQoLNetwork.Instance.totalStorageValue; totalStorageValue.OnValueChanged = (OnValueChangedDelegate<int>)(object)Delegate.Remove((Delegate?)(object)totalStorageValue.OnValueChanged, (Delegate?)(object)new OnValueChangedDelegate<int>(OnChangeFindSoldValue)); } else if ((Object)(object)HQoLNetwork.Instance != (Object)null) { NetworkVariable<int> totalStorageValue2 = HQoLNetwork.Instance.totalStorageValue; totalStorageValue2.OnValueChanged = (OnValueChangedDelegate<int>)(object)Delegate.Remove((Delegate?)(object)totalStorageValue2.OnValueChanged, (Delegate?)(object)new OnValueChangedDelegate<int>(OnChangeFindSoldValue)); } else { StatsTracker.Logger.LogWarning((object)"Failed to find HQoL instance, sold value will not be sync'd"); } Stats? dayStats = StatsTracker.DayStats; if (dayStats != null) { dayStats.ValueSold = totalSold; } totalSold = 0; } } private static void OnChangeFindSoldValue(int prevValue, int currValue) { if (currValue < prevValue) { totalSold += prevValue - currValue; } } } [HarmonyPatch] internal class HazardTracker { [HarmonyPatch] private static class CountSpiketrap { private static Type? SpikeRookTrapType; private static bool Prepare() { SpikeRookTrapType = AccessTools.TypeByName("SpikeRoofTrap"); return SpikeRookTrapType != null; } private static MethodBase TargetMethod() { return AccessTools.Method(SpikeRookTrapType, "Start", (Type[])null, (Type[])null); } private static void Postfix(object __instance) { spiketrapCount++; } } public static int turretCount; public static int landmineCount; public static int spiketrapCount; [HarmonyPatch(typeof(Landmine), "Start")] [HarmonyPostfix] private static void CountLandmine(Landmine __instance) { landmineCount++; } [HarmonyPatch(typeof(Turret), "Start")] [HarmonyPostfix] private static void CountTurret(Turret __instance) { turretCount++; } } [HarmonyPatch] internal class ItemAndEventTracker { [HarmonyPatch] private static class TrackSpawnedItemsAndHazards { private static bool Prepare() { return true; } private static MethodBase TargetMethod() { return AccessTools.Method(typeof(RoundManager), "SyncScrapValuesClientRpc", (Type[])null, (Type[])null); } private static void Prefix(RoundManager __instance, NetworkObjectReference[] spawnedScrap, int[] allScrapValue) { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Invalid comparison between Unknown and I4 //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Invalid comparison between Unknown and I4 if ((GameNetworkManager.Instance.gameVersionNum <= 72 || (int)((NetworkBehaviour)__instance).__rpc_exec_stage == 1) && (GameNetworkManager.Instance.gameVersionNum > 72 || (int)((NetworkBehaviour)__instance).__rpc_exec_stage == 2)) { objectsNaturallySpawnedThisDay = new HashSet<NetworkObjectReference>(spawnedScrap); int num = 0; foreach (int num2 in allScrapValue) { num += num2; } string value = Traverse.Create((object)__instance).Field("dungeonGenerator").Field("Generator") .Field("DungeonFlow") .Property("name", (object[])null) .GetValue<string>(); string value2; bool flag = StatsTracker.VanillaInteriorNames.TryGetValue(value, out value2); Stats? dayStats = StatsTracker.DayStats; if (dayStats != null) { dayStats.DungeonInfo = new DungeonInfo(spawnedScrap.Length + ((appSpawnedThisDay.Count > 0) ? 1 : 0), flag ? value2 : value); } Stats? dayStats2 = StatsTracker.DayStats; if (dayStats2 != null) { dayStats2.AppSpawned = appSpawnedThisDay.Count > 0; } Stats? dayStats3 = StatsTracker.DayStats; if (dayStats3 != null) { dayStats3.BottomLine += num; } Stats? dayStats4 = StatsTracker.DayStats; if (dayStats4 != null) { dayStats4.BottomLineTrue += num; } Stats? dayStats5 = StatsTracker.DayStats; if (dayStats5 != null) { dayStats5.HazardInfo = new HazardInfo(HazardTracker.turretCount, HazardTracker.landmineCount, HazardTracker.spiketrapCount); } HazardTracker.turretCount = (HazardTracker.landmineCount = (HazardTracker.spiketrapCount = 0)); } } } [HarmonyPatch] private static class TrackSID { private static bool Prepare() { return true; } private static MethodBase TargetMethod() { return AccessTools.Method(typeof(RoundManager), "SyncScrapValuesClientRpc", (Type[])null, (Type[])null); } private static void Prefix(RoundManager __instance, NetworkObjectReference[] spawnedScrap) { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Invalid comparison between Unknown and I4 //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Invalid comparison between Unknown and I4 //IL_0075: Unknown result type (might be due to invalid IL or missing references) //IL_007a: Unknown result type (might be due to invalid IL or missing references) if ((GameNetworkManager.Instance.gameVersionNum > 72 && (int)((NetworkBehaviour)__instance).__rpc_exec_stage != 1) || (GameNetworkManager.Instance.gameVersionNum <= 72 && (int)((NetworkBehaviour)__instance).__rpc_exec_stage != 2) || GameNetworkManager.Instance.gameVersionNum < 60) { return; } NetworkObject val = default(NetworkObject); ((NetworkObjectReference)(ref spawnedScrap[0])).TryGet(ref val, (NetworkManager)null); GrabbableObject component = ((Component)val).GetComponent<GrabbableObject>(); if ((Object)(object)component == (Object)null) { StatsTracker.Logger.LogWarning((object)"Unable to retrieve first GrabbableObject from the spawned objects"); return; } NetworkObject val3 = default(NetworkObject); for (int i = 0; i < spawnedScrap.Length; i++) { NetworkObjectReference val2 = spawnedScrap[i]; ((NetworkObjectReference)(ref val2)).TryGet(ref val3, (NetworkManager)null); GrabbableObject component2 = ((Component)val3).GetComponent<GrabbableObject>(); if ((Object)(object)component2 == (Object)null) { StatsTracker.Logger.LogWarning((object)"Unable to retrieve some GrabbableObject from the spawned objects"); return; } if (((Object)component2.itemProperties).name != ((Object)component.itemProperties).name) { return; } } Stats? dayStats = StatsTracker.DayStats; if (dayStats != null) { dayStats.SIDType = ((Component)component).gameObject.GetComponentInChildren<ScanNodeProperties>().headerText; } } } [HarmonyPatch] private static class TrackInfes { private static FieldInfo? enemyRushIndexInfo; private static bool Prepare() { enemyRushIndexInfo = AccessTools.Field(typeof(RoundManager), "enemyRushIndex"); return enemyRushIndexInfo != null; } private static MethodBase TargetMethod() { return AccessTools.Method(typeof(RoundManager), "SyncScrapValuesClientRpc", (Type[])null, (Type[])null); } private static void Postfix(RoundManager __instance) { int num = (int)enemyRushIndexInfo.GetValue(__instance); if (num != -1) { Stats? dayStats = StatsTracker.DayStats; if (dayStats != null) { dayStats.InfestationType = ((Object)__instance.currentLevel.Enemies[num].enemyType).name; } } } } [HarmonyPatch] private static class TrackIndoorFog { private static FieldInfo? indoorFogInfo; private static bool Prepare() { indoorFogInfo = AccessTools.Field(typeof(RoundManager), "indoorFog"); return indoorFogInfo != null; } private static MethodBase TargetMethod() { return AccessTools.Method(typeof(RoundManager), "SyncScrapValuesClientRpc", (Type[])null, (Type[])null); } private static void Postfix(RoundManager __instance) { //IL_0015: Unknown result type (might be due to invalid IL or missing references) Stats? dayStats = StatsTracker.DayStats; if (dayStats != null) { dayStats.IndoorFog = ((Component)(LocalVolumetricFog)indoorFogInfo.GetValue(__instance)).gameObject.activeSelf; } } } [HarmonyPatch] private static class TrackMeteorShower { private static MethodInfo? SetBeginMeteorShowerClientRpcInfo; private static bool Prepare() { SetBeginMeteorShowerClientRpcInfo = AccessTools.Method(typeof(TimeOfDay), "SetBeginMeteorShowerClientRpc", (Type[])null, (Type[])null); return SetBeginMeteorShowerClientRpcInfo != null; } private static MethodBase TargetMethod() { return SetBeginMeteorShowerClientRpcInfo; } private static void Prefix(TimeOfDay __instance) { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Invalid comparison between Unknown and I4 //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Invalid comparison between Unknown and I4 if ((GameNetworkManager.Instance.gameVersionNum <= 72 || (int)((NetworkBehaviour)__instance).__rpc_exec_stage == 1) && (GameNetworkManager.Instance.gameVersionNum > 72 || (int)((NetworkBehaviour)__instance).__rpc_exec_stage == 2)) { Stats? dayStats = StatsTracker.DayStats; if (dayStats != null) { dayStats.MeteorShowerTime = StatsTracker.GetCurrentTimeString(); } } } } [HarmonyPatch] private static class TrackEggItems { private static Type? GiantKiwiAIType; private static bool Prepare() { GiantKiwiAIType = AccessTools.TypeByName("GiantKiwiAI"); return GiantKiwiAIType != null; } private static MethodBase TargetMethod() { return AccessTools.Method(GiantKiwiAIType, "SpawnEggsClientRpc", (Type[])null, (Type[])null); } private static void Prefix(object __instance, NetworkObjectReference[] eggNetworkReferences) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Invalid comparison between Unknown and I4 //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Invalid comparison between Unknown and I4 //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_0049: Unknown result type (might be due to invalid IL or missing references) GiantKiwiAI val = (GiantKiwiAI)__instance; if ((GameNetworkManager.Instance.gameVersionNum <= 72 || (int)((NetworkBehaviour)val).__rpc_exec_stage == 1) && (GameNetworkManager.Instance.gameVersionNum > 72 || (int)((NetworkBehaviour)val).__rpc_exec_stage == 2)) { foreach (NetworkObjectReference item in eggNetworkReferences) { eggsSpawnedThisDay.Add(item); } } } } [HarmonyPatch] private static class TrackTrueValueFromGiftBox { private static bool Prepare() { return GiftBoxItemType != null; } private static MethodBase TargetMethod() { return AccessTools.Method(GiftBoxItemType, "InitializeAfterPositioning", (Type[])null, (Type[])null); } private static void Postfix(object __instance) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown GiftBoxItem val = (GiftBoxItem)__instance; Stats? dayStats = StatsTracker.DayStats; if (dayStats != null) { dayStats.BottomLineTrue += val.objectInPresentValue - ((GrabbableObject)val).scrapValue; } } } [HarmonyPatch] private static class TrackShotgun { private static Type? NutcrackerEnemyAIType; private static bool Prepare() { NutcrackerEnemyAIType = AccessTools.TypeByName("NutcrackerEnemyAI"); return NutcrackerEnemyAIType != null; } private static MethodBase TargetMethod() { return AccessTools.Method(NutcrackerEnemyAIType, "InitializeNutcrackerValuesClientRpc", (Type[])null, (Type[])null); } private static void Prefix(object __instance, NetworkObjectReference gunObject) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Invalid comparison between Unknown and I4 //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Invalid comparison between Unknown and I4 NutcrackerEnemyAI val = (NutcrackerEnemyAI)__instance; if ((GameNetworkManager.Instance.gameVersionNum <= 72 || (int)((NetworkBehaviour)val).__rpc_exec_stage == 1) && (GameNetworkManager.Instance.gameVersionNum > 72 || (int)((NetworkBehaviour)val).__rpc_exec_stage == 2)) { shotgunsSpawnedThisDay.Add(gunObject); } } } [HarmonyPatch] private static class TrackButlerPopPosition { private static Type? ButlerEnemyAIType; private static bool Prepare() { ButlerEnemyAIType = AccessTools.TypeByName("ButlerEnemyAI"); return ButlerEnemyAIType != null; } private static MethodBase TargetMethod() { return AccessTools.Method(ButlerEnemyAIType, "KillEnemy", (Type[])null, (Type[])null); } private static void Prefix(object __instance) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown //IL_0012: Unknown result type (might be due to invalid IL or missing references) ButlerEnemyAI val = (ButlerEnemyAI)__instance; butlerPopPositionsToTrack.Add(((Component)val).transform.position); } } [HarmonyPatch] private static class TrackKnife { private static Type? KnifeItemInfo; private static bool Prepare() { KnifeItemInfo = AccessTools.TypeByName("KnifeItem"); return KnifeItemInfo != null; } private static MethodBase TargetMethod() { return AccessTools.Method(typeof(GrabbableObject), "Start", (Type[])null, (Type[])null); } private static void Prefix(GrabbableObject __instance) { //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Expected O, but got Unknown //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Unknown result type (might be due to invalid IL or missing references) if (KnifeItemInfo.IsInstanceOfType(__instance)) { KnifeItem knife = (KnifeItem)__instance; Vector3 val = ((IEnumerable<Vector3>)butlerPopPositionsToTrack).FirstOrDefault((Func<Vector3, bool>)((Vector3 p) => Vector3.Distance(p + Vector3.up * 0.5f, ((Component)knife).transform.position) < 0.1f)); if (val != Vector3.zero) { knivesSpawnedThisDay.Add(NetworkObjectReference.op_Implicit(((NetworkBehaviour)__instance).NetworkObject)); butlerPopPositionsToTrack.Remove(val); } } } } [HarmonyPatch] private static class AddNewlySpawnedGiftItemToItemTracker { private static bool Prepare() { return GiftBoxItemType != null; } private static MethodBase TargetMethod() { return AccessTools.Method(GiftBoxItemType, "OpenGiftBoxClientRpc", (Type[])null, (Type[])null); } private static void Prefix(object __instance, NetworkObjectReference netObjectRef) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Invalid comparison between Unknown and I4 //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Invalid comparison between Unknown and I4 //IL_0048: Unknown result type (might be due to invalid IL or missing references) GiftBoxItem val = (GiftBoxItem)__instance; if ((GameNetworkManager.Instance.gameVersionNum <= 72 || (int)((NetworkBehaviour)val).__rpc_exec_stage == 1) && (GameNetworkManager.Instance.gameVersionNum > 72 || (int)((NetworkBehaviour)val).__rpc_exec_stage == 2) && !StartOfRound.Instance.inShipPhase) { ((MonoBehaviour)StartOfRound.Instance).StartCoroutine(WaitForGiftItemToFullySpawnBeforeTracking(netObjectRef, ((GrabbableObject)val).scrapValue)); } } } [CompilerGenerated] private sealed class <WaitForGiftItemToFullySpawnBeforeTracking>d__28 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public NetworkObjectReference netObjRef; public int giftScrapValue; private NetworkObject <netObject>5__2; private float <startTime>5__3; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <WaitForGiftItemToFullySpawnBeforeTracking>d__28(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <netObject>5__2 = null; <>1__state = -2; } private bool MoveNext() { //IL_00c2: Unknown result type (might be due to invalid IL or missing references) //IL_00a2: Unknown result type (might be due to invalid IL or missing references) //IL_00ac: Expected O, but got Unknown //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_0046: Expected O, but got Unknown switch (<>1__state) { default: return false; case 0: <>1__state = -1; <netObject>5__2 = null; <startTime>5__3 = Time.realtimeSinceStartup; goto IL_0056; case 1: <>1__state = -1; goto IL_0056; case 2: { <>1__state = -1; valueFromGiftSpawner[netObjRef] = giftScrapValue; return false; } IL_0056: if (Time.realtimeSinceStartup - <startTime>5__3 < 8f && !((NetworkObjectReference)(ref netObjRef)).TryGet(ref <netObject>5__2, (NetworkManager)null)) { <>2__current = (object)new WaitForSeconds(0.03f); <>1__state = 1; return true; } if ((Object)(object)<netObject>5__2 == (Object)null) { StatsTracker.Logger.LogWarning((object)"No network object found for giftbox"); return false; } <>2__current = (object)new WaitForSeconds(0.3f); <>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(); } } private static readonly Type? GiftBoxItemType = AccessTools.TypeByName("GiftBoxItem"); private static readonly Type? VehicleControllerType = AccessTools.TypeByName("VehicleController"); private static HashSet<NetworkObjectReference> knivesSpawnedThisDay = new HashSet<NetworkObjectReference>(); private static HashSet<NetworkObjectReference> shotgunsSpawnedThisDay = new HashSet<NetworkObjectReference>(); private static HashSet<NetworkObjectReference> hivesSpawnedThisDay = new HashSet<NetworkObjectReference>(); private static HashSet<NetworkObjectReference> eggsSpawnedThisDay = new HashSet<NetworkObjectReference>(); private static HashSet<NetworkObjectReference> appSpawnedThisDay = new HashSet<NetworkObjectReference>(); private static HashSet<NetworkObjectReference> objectsNaturallySpawnedThisDay = new HashSet<NetworkObjectReference>(); private static Dictionary<NetworkObjectReference, int> valueFromGiftSpawner = new Dictionary<NetworkObjectReference, int>(); private static HashSet<Vector3> butlerPopPositionsToTrack = new HashSet<Vector3>(); private static List<MissingItemInfo> missedItemsParentedToDungeon = new List<MissingItemInfo>(); [HarmonyPatch(typeof(RoundManager), "GenerateNewLevelClientRpc")] [HarmonyPrefix] private static void ResetTrackerWhenStartingNewDay(RoundManager __instance) { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Invalid comparison between Unknown and I4 //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Invalid comparison between Unknown and I4 if ((GameNetworkManager.Instance.gameVersionNum <= 72 || (int)((NetworkBehaviour)__instance).__rpc_exec_stage == 1) && (GameNetworkManager.Instance.gameVersionNum > 72 || (int)((NetworkBehaviour)__instance).__rpc_exec_stage == 2)) { appSpawnedThisDay.Clear(); knivesSpawnedThisDay.Clear(); shotgunsSpawnedThisDay.Clear(); hivesSpawnedThisDay.Clear(); eggsSpawnedThisDay.Clear(); objectsNaturallySpawnedThisDay.Clear(); valueFromGiftSpawner.Clear(); butlerPopPositionsToTrack.Clear(); missedItemsParentedToDungeon.Clear(); } } [HarmonyPatch(typeof(StartOfRound), "ShipHasLeft")] [HarmonyPostfix] private static void TrackMissedInLevelScene(StartOfRound __instance) { //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) Object cruiser = ((VehicleControllerType != null) ? Object.FindAnyObjectByType(VehicleControllerType) : null); Scene currLevelScene = SceneManager.GetSceneAt(1); GrabbableObject[] collection = Object.FindObjectsByType<GrabbableObject>((FindObjectsSortMode)0); List<GrabbableObject> list = new List<GrabbableObject>(collection); list.RemoveAll((GrabbableObject obj) => ((Component)obj).gameObject.scene != currLevelScene || !obj.itemProperties.isScrap || obj.isInShipRoom || (cruiser != (Object)null && (Object)(object)((Component)obj).transform.parent != (Object)null && (Object)(object)((Component)((Component)obj).transform.parent).gameObject.GetComponent(VehicleControllerType) == cruiser && Traverse.Create((object)cruiser).Field("magnetedToShip").GetValue<bool>())); missedItemsParentedToDungeon = list.ConvertAll((GrabbableObject obj) => new MissingItemInfo(((Object)(object)((Component)obj).gameObject.GetComponentInChildren<ScanNodeProperties>() == (Object)null) ? ((Object)obj.itemProperties).name : ((Component)obj).gameObject.GetComponentInChildren<ScanNodeProperties>().headerText, obj.scrapValue, ((Component)obj).transform.position, obj.scrapPersistedThroughRounds)).ToList(); } [HarmonyPatch(typeof(RoundManager), "DespawnPropsAtEndOfRound")] [HarmonyPrefix] private static void TrackMissedItems(RoundManager __instance) { Object cruiser = ((VehicleControllerType != null) ? Object.FindAnyObjectByType(VehicleControllerType) : null); GrabbableObject[] source = Object.FindObjectsByType<GrabbableObject>((FindObjectsSortMode)0); List<GrabbableObject> list = source.ToList(); list.RemoveAll((GrabbableObject obj) => !obj.itemProperties.isScrap || obj.isInShipRoom || (cruiser != (Object)null && (Object)(object)((Component)obj).transform.parent != (Object)null && (Object)(object)((Component)((Component)obj).transform.parent).gameObject.GetComponent(VehicleControllerType) == cruiser && Traverse.Create((object)cruiser).Field("magnetedToShip").GetValue<bool>())); Stats? dayStats = StatsTracker.DayStats; if (dayStats != null) { dayStats.MissedItems = list.ConvertAll((GrabbableObject obj) => new MissingItemInfo(((Object)(object)((Component)obj).gameObject.GetComponentInChildren<ScanNodeProperties>() == (Object)null) ? ((Object)obj.itemProperties).name : ((Component)obj).gameObject.GetComponentInChildren<ScanNodeProperties>().headerText, obj.scrapValue, ((Component)obj).transform.position, obj.scrapPersistedThroughRounds)).ToList(); } StatsTracker.DayStats?.MissedItems.AddRange(missedItemsParentedToDungeon); } [HarmonyPatch(typeof(LungProp), "Start")] [HarmonyPostfix] private static void CountApp(LungProp __instance) { //IL_000b: Unknown result type (might be due to invalid IL or missing references) appSpawnedThisDay.Add(NetworkObjectReference.op_Implicit(((NetworkBehaviour)__instance).NetworkObject)); Stats? dayStats = StatsTracker.DayStats; if (dayStats != null) { dayStats.BottomLineTrue += ((GrabbableObject)__instance).scrapValue; } } [HarmonyPatch(typeof(RedLocustBees), "SpawnHiveClientRpc")] [HarmonyPrefix] private static void TrackHiveItem(RedLocustBees __instance, NetworkObjectReference hiveObject) { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Invalid comparison between Unknown and I4 //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Invalid comparison between Unknown and I4 if ((GameNetworkManager.Instance.gameVersionNum <= 72 || (int)((NetworkBehaviour)__instance).__rpc_exec_stage == 1) && (GameNetworkManager.Instance.gameVersionNum > 72 || (int)((NetworkBehaviour)__instance).__rpc_exec_stage == 2)) { hivesSpawnedThisDay.Add(hiveObject); } } [HarmonyPatch(typeof(PlayerControllerB), "SetItemInElevator")] [HarmonyPrefix] private static void TrackItemWhenDropped(PlayerControllerB __instance, bool droppedInShipRoom, GrabbableObject gObject) { //IL_01ff: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_027c: Unknown result type (might be due to invalid IL or missing references) //IL_00b4: Unknown result type (might be due to invalid IL or missing references) //IL_02ca: Unknown result type (might be due to invalid IL or missing references) //IL_0102: Unknown result type (might be due to invalid IL or missing references) //IL_0316: Unknown result type (might be due to invalid IL or missing references) //IL_014e: Unknown result type (might be due to invalid IL or missing references) //IL_0362: Unknown result type (might be due to invalid IL or missing references) //IL_019a: Unknown result type (might be due to invalid IL or missing references) //IL_0379: Unknown result type (might be due to invalid IL or missing references) //IL_01b1: Unknown result type (might be due to invalid IL or missing references) //IL_0390: Unknown result type (might be due to invalid IL or missing references) //IL_01c8: Unknown result type (might be due to invalid IL or missing references) if (!((NetworkBehaviour)gObject).IsSpawned || StartOfRound.Instance.inShipPhase || gObject.isInShipRoom == droppedInShipRoom || gObject.scrapPersistedThroughRounds) { return; } int value2; if (droppedInShipRoom) { int value; if (objectsNaturallySpawnedThisDay.Contains(NetworkObjectReference.op_Implicit(((NetworkBehaviour)gObject).NetworkObject))) { Stats? dayStats = StatsTracker.DayStats; if (dayStats != null) { dayStats.CollectedNoExtra += gObject.scrapValue; } Stats? dayStats2 = StatsTracker.DayStats; if (dayStats2 != null) { int collectedTotal = dayStats2.CollectedTotal; Type? giftBoxItemType = GiftBoxItemType; dayStats2.CollectedTotal = collectedTotal + (((object)giftBoxItemType != null && giftBoxItemType.IsInstanceOfType(gObject)) ? Traverse.Create((object)gObject).Property("objectInPresentValue", (object[])null).GetValue<int>() : gObject.scrapValue); } } else if (valueFromGiftSpawner.TryGetValue(NetworkObjectReference.op_Implicit(((NetworkBehaviour)gObject).NetworkObject), out value)) { Stats? dayStats3 = StatsTracker.DayStats; if (dayStats3 != null) { dayStats3.CollectedNoExtra += value; } Stats? dayStats4 = StatsTracker.DayStats; if (dayStats4 != null) { dayStats4.CollectedTotal += gObject.scrapValue; } } else if (shotgunsSpawnedThisDay.Contains(NetworkObjectReference.op_Implicit(((NetworkBehaviour)gObject).NetworkObject))) { Stats? dayStats5 = StatsTracker.DayStats; if (dayStats5 != null) { dayStats5.CollectedTotal += gObject.scrapValue; } Stats? dayStats6 = StatsTracker.DayStats; if (dayStats6 != null) { dayStats6.ShotgunsCollected++; } } else if (knivesSpawnedThisDay.Contains(NetworkObjectReference.op_Implicit(((NetworkBehaviour)gObject).NetworkObject))) { Stats? dayStats7 = StatsTracker.DayStats; if (dayStats7 != null) { dayStats7.CollectedTotal += gObject.scrapValue; } Stats? dayStats8 = StatsTracker.DayStats; if (dayStats8 != null) { dayStats8.KnivesCollected++; } } else if (hivesSpawnedThisDay.Contains(NetworkObjectReference.op_Implicit(((NetworkBehaviour)gObject).NetworkObject)) || eggsSpawnedThisDay.Contains(NetworkObjectReference.op_Implicit(((NetworkBehaviour)gObject).NetworkObject)) || appSpawnedThisDay.Contains(NetworkObjectReference.op_Implicit(((NetworkBehaviour)gObject).NetworkObject))) { Stats? dayStats9 = StatsTracker.DayStats; if (dayStats9 != null) { dayStats9.CollectedTotal += gObject.scrapValue; } } } else if (objectsNaturallySpawnedThisDay.Contains(NetworkObjectReference.op_Implicit(((NetworkBehaviour)gObject).NetworkObject))) { Stats? dayStats10 = StatsTracker.DayStats; if (dayStats10 != null) { dayStats10.CollectedNoExtra -= gObject.scrapValue; } Stats? dayStats11 = StatsTracker.DayStats; if (dayStats11 != null) { int collectedTotal2 = dayStats11.CollectedTotal; Type? giftBoxItemType2 = GiftBoxItemType; dayStats11.CollectedTotal = collectedTotal2 - (((object)giftBoxItemType2 != null && giftBoxItemType2.IsInstanceOfType(gObject)) ? Traverse.Create((object)gObject).Property("objectInPresentValue", (object[])null).GetValue<int>() : gObject.scrapValue); } } else if (valueFromGiftSpawner.TryGetValue(NetworkObjectReference.op_Implicit(((NetworkBehaviour)gObject).NetworkObject), out value2)) { Stats? dayStats12 = StatsTracker.DayStats; if (dayStats12 != null) { dayStats12.CollectedNoExtra -= value2; } Stats? dayStats13 = StatsTracker.DayStats; if (dayStats13 != null) { dayStats13.CollectedTotal -= gObject.scrapValue; } } else if (shotgunsSpawnedThisDay.Contains(NetworkObjectReference.op_Implicit(((NetworkBehaviour)gObject).NetworkObject))) { Stats? dayStats14 = StatsTracker.DayStats; if (dayStats14 != null) { dayStats14.CollectedTotal -= gObject.scrapValue; } Stats? dayStats15 = StatsTracker.DayStats; if (dayStats15 != null) { dayStats15.ShotgunsCollected--; } } else if (knivesSpawnedThisDay.Contains(NetworkObjectReference.op_Implicit(((NetworkBehaviour)gObject).NetworkObject))) { Stats? dayStats16 = StatsTracker.DayStats; if (dayStats16 != null) { dayStats16.CollectedTotal -= gObject.scrapValue; } Stats? dayStats17 = StatsTracker.DayStats; if (dayStats17 != null) { dayStats17.KnivesCollected--; } } else if (hivesSpawnedThisDay.Contains(NetworkObjectReference.op_Implicit(((NetworkBehaviour)gObject).NetworkObject)) || eggsSpawnedThisDay.Contains(NetworkObjectReference.op_Implicit(((NetworkBehaviour)gObject).NetworkObject)) || appSpawnedThisDay.Contains(NetworkObjectReference.op_Implicit(((NetworkBehaviour)gObject).NetworkObject))) { Stats? dayStats18 = StatsTracker.DayStats; if (dayStats18 != null) { dayStats18.CollectedTotal -= gObject.scrapValue; } } } [IteratorStateMachine(typeof(<WaitForGiftItemToFullySpawnBeforeTracking>d__28))] private static IEnumerator WaitForGiftItemToFullySpawnBeforeTracking(NetworkObjectReference netObjRef, int giftScrapValue) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <WaitForGiftItemToFullySpawnBeforeTracking>d__28(0) { netObjRef = netObjRef, giftScrapValue = giftScrapValue }; } } [HarmonyPatch] internal class PlayerTracker { [HarmonyPatch(typeof(PlayerControllerB), "KillPlayerClientRpc")] [HarmonyPrefix] private static void TrackDeath(PlayerControllerB __instance, int causeOfDeath) { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Invalid comparison between Unknown and I4 //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Invalid comparison between Unknown and I4 //IL_0054: Unknown result type (might be due to invalid IL or missing references) if ((GameNetworkManager.Instance.gameVersionNum > 72 && (int)((NetworkBehaviour)__instance).__rpc_exec_stage != 1) || (GameNetworkManager.Instance.gameVersionNum <= 72 && (int)((NetworkBehaviour)__instance).__rpc_exec_stage != 2)) { return; } Stats? dayStats = StatsTracker.DayStats; if (dayStats != null) { PlayerStats playerStats = dayStats.Players[__instance.playerSteamId]; if (playerStats != null) { string currentTimeString = StatsTracker.GetCurrentTimeString(); CauseOfDeath val = (CauseOfDeath)causeOfDeath; playerStats.Kill(currentTimeString, ((object)(CauseOfDeath)(ref val)).ToString()); } } } [HarmonyPatch(typeof(StartOfRound), "OnPlayerDC")] [HarmonyPrefix] private static void TrackDisconnect(StartOfRound __instance, int playerObjectNumber) { StatsTracker.DayStats?.Players[__instance.allPlayerScripts[playerObjectNumber].playerSteamId].Disconnect(); } } [HarmonyPatch] internal class ServerEvents { [CompilerGenerated] private sealed class <>c__DisplayClass2_0 { public int prevQuota; internal bool <PublishDayStatsAfterQuotaRoll>b__0() { return TimeOfDay.Instance.profitQuota != prevQuota; } } [CompilerGenerated] private sealed class <PublishDayStatsAfterQuotaRoll>d__2 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public int prevQuota; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <PublishDayStatsAfterQuotaRoll>d__2(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_0040: Expected O, but got Unknown switch (<>1__state) { default: return false; case 0: <>1__state = -1; <>2__current = (object)new WaitUntil((Func<bool>)new <>c__DisplayClass2_0 { prevQuota = prevQuota }.<PublishDayStatsAfterQuotaRoll>b__0); <>1__state = 1; return true; case 1: { <>1__state = -1; Stats? dayStats = StatsTracker.DayStats; if (dayStats != null) { dayStats.NewQuota = TimeOfDay.Instance.profitQuota; } StatsTracker.LocalServer.PublishStats(JsonConvert.SerializeObject((object)StatsTracker.DayStats)); 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(); } } [HarmonyPatch(typeof(StartOfRound), "ResetPlayersLoadedValueClientRpc")] [HarmonyPrefix] private static void StartTrackingNewday(StartOfRound __instance) { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Invalid comparison between Unknown and I4 //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Invalid comparison between Unknown and I4 //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Invalid comparison between Unknown and I4 if ((GameNetworkManager.Instance.gameVersionNum <= 72 || (int)((NetworkBehaviour)__instance).__rpc_exec_stage == 1) && (GameNetworkManager.Instance.gameVersionNum > 72 || (int)((NetworkBehaviour)__instance).__rpc_exec_stage == 2)) { StatsTracker.DayStats = new Stats(__instance.randomMapSeed, __instance.currentLevel.PlanetName, ((int)__instance.currentLevel.currentWeather == -1) ? "Mild" : ((object)(LevelWeatherType)(ref __instance.currentLevel.currentWeather)).ToString(), new ArraySegment<PlayerControllerB>(__instance.allPlayerScripts, 0, __instance.connectedPlayersAmount + 1).ToArray()); } } [HarmonyPatch(typeof(StartOfRound), "PassTimeToNextDay")] [HarmonyPostfix] private static void PublishDayStats(StartOfRound __instance) { if (TimeOfDay.Instance.profitQuota - TimeOfDay.Instance.quotaFulfilled <= 0) { ((MonoBehaviour)__instance).StartCoroutine(PublishDayStatsAfterQuotaRoll(TimeOfDay.Instance.profitQuota)); } else { StatsTracker.LocalServer.PublishStats(JsonConvert.SerializeObject((object)StatsTracker.DayStats)); } } [IteratorStateMachine(typeof(<PublishDayStatsAfterQuotaRoll>d__2))] private static IEnumerator PublishDayStatsAfterQuotaRoll(int prevQuota) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <PublishDayStatsAfterQuotaRoll>d__2(0) { prevQuota = prevQuota }; } } [HarmonyPatch] internal class ShipTracker { [HarmonyPatch(typeof(StartOfRound), "ShipLeave")] [HarmonyPostfix] private static void RegisterTakeOffTime(StartOfRound __instance) { Stats? dayStats = StatsTracker.DayStats; if (dayStats != null) { dayStats.TakeOffTime = StatsTracker.GetCurrentTimeString(); } } } [HarmonyPatch] internal class SpawnTracker { [HarmonyPatch] private static class NutcrackerWrapper { private static Type? NutcrackerEnemyAIType; private static bool Prepare() { NutcrackerEnemyAIType = AccessTools.TypeByName("NutcrackerEnemyAI"); return NutcrackerEnemyAIType != null; } private static MethodBase TargetMethod() { return AccessTools.Method(NutcrackerEnemyAIType, "InitializeNutcrackerValuesClientRpc", (Type[])null, (Type[])null); } private static void Prefix(object __instance, NetworkObjectReference gunObject) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Invalid comparison between Unknown and I4 //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Invalid comparison between Unknown and I4 NutcrackerEnemyAI val = (NutcrackerEnemyAI)__instance; if ((GameNetworkManager.Instance.gameVersionNum > 72 && (int)((NetworkBehaviour)val).__rpc_exec_stage != 1) || (GameNetworkManager.Instance.gameVersionNum <= 72 && (int)((NetworkBehaviour)val).__rpc_exec_stage != 2)) { return; } NetworkObject val2 = default(NetworkObject); ((NetworkObjectReference)(ref gunObject)).TryGet(ref val2, (NetworkManager)null); ShotgunItem component = ((Component)val2).GetComponent<ShotgunItem>(); if ((Object)(object)component == (Object)null) { StatsTracker.Logger.LogWarning((object)"Unable to retrieve ShotgunItem from the spawned Nutcracker"); return; } Stats? dayStats = StatsTracker.DayStats; if (dayStats != null) { dayStats.BottomLineTrue += ((GrabbableObject)component).scrapValue; } } } [HarmonyPatch] private static class ButlerWrapper { private static Type? ButlerEnemyAIType; private static bool Prepare() { ButlerEnemyAIType = AccessTools.TypeByName("ButlerEnemyAI"); return ButlerEnemyAIType != null; } private static MethodBase TargetMethod() { return AccessTools.Method(ButlerEnemyAIType, "Start", (Type[])null, (Type[])null); } private static void Prefix(object __instance) { Stats? dayStats = StatsTracker.DayStats; if (dayStats != null) { dayStats.BottomLineTrue += 35; } } } [HarmonyPatch] private static class GiantKiwiAIWrapper { private static Type? GiantKiwiAIType; private static bool Prepare() { GiantKiwiAIType = AccessTools.TypeByName("GiantKiwiAI"); return GiantKiwiAIType != null; } private static MethodBase TargetMethod() { return AccessTools.Method(GiantKiwiAIType, "SpawnEggsClientRpc", (Type[])null, (Type[])null); } private static void Prefix(object __instance, int[] eggScrapValues) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Invalid comparison between Unknown and I4 //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Invalid comparison between Unknown and I4 GiantKiwiAI val = (GiantKiwiAI)__instance; if ((GameNetworkManager.Instance.gameVersionNum > 72 && (int)((NetworkBehaviour)val).__rpc_exec_stage != 1) || (GameNetworkManager.Instance.gameVersionNum <= 72 && (int)((NetworkBehaviour)val).__rpc_exec_stage != 2)) { return; } StatsTracker.DayStats?.BirdInfo.AddEggValue(eggScrapValues); foreach (int num in eggScrapValues) { Stats? dayStats = StatsTracker.DayStats; if (dayStats != null) { dayStats.BottomLineTrue += num; } } } } private const int knifeValue = 35; [HarmonyPatch(typeof(EnemyAI), "Start")] [HarmonyPostfix] private static void TrackSpawn(EnemyAI __instance) { if (__instance.enemyType.isDaytimeEnemy) { StatsTracker.DayStats?.DayTimeSpawns.Add(new SpawnInfo(__instance.enemyType, StatsTracker.GetCurrentTimeString())); } else if (__instance.enemyType.isOutsideEnemy) { StatsTracker.DayStats?.NightTimeSpawns.Add(new SpawnInfo(__instance.enemyType, StatsTracker.GetCurrentTimeString())); } else { StatsTracker.DayStats?.IndoorSpawns.Add(new SpawnInfo(__instance.enemyType, StatsTracker.GetCurrentTimeString())); } } [HarmonyPatch(typeof(RedLocustBees), "SpawnHiveClientRpc")] [HarmonyPrefix] private static void TrackHive(RedLocustBees __instance, int hiveScrapValue) { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Invalid comparison between Unknown and I4 //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Invalid comparison between Unknown and I4 if ((GameNetworkManager.Instance.gameVersionNum <= 72 || (int)((NetworkBehaviour)__instance).__rpc_exec_stage == 1) && (GameNetworkManager.Instance.gameVersionNum > 72 || (int)((NetworkBehaviour)__instance).__rpc_exec_stage == 2)) { StatsTracker.DayStats?.BeeInfo.AddBeeValue(hiveScrapValue); Stats? dayStats = StatsTracker.DayStats; if (dayStats != null) { dayStats.BottomLineTrue += hiveScrapValue; } } } } } namespace System.Runtime.CompilerServices { [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] internal sealed class IgnoresAccessChecksToAttribute : Attribute { public IgnoresAccessChecksToAttribute(string assemblyName) { } } }