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 RepoStatsUI v2.9.3
RepoStatsUI.dll
Decompiled 2 weeks agousing System; 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 System.Text.RegularExpressions; using BepInEx; using BepInEx.Configuration; using HarmonyLib; using Microsoft.CodeAnalysis; using TMPro; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("RepoStatsUI")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("2.7.0.0")] [assembly: AssemblyInformationalVersion("2.7.0")] [assembly: AssemblyProduct("RepoStatsUI")] [assembly: AssemblyTitle("RepoStatsUI")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("2.7.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.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace RepoStatsUI { [BepInPlugin("com.repo.statsui", "Repo Stats UI", "2.9.3")] public class Plugin : BaseUnityPlugin { public static ConfigEntry<float> StaminaMult; public static ConfigEntry<float> ClimbMult; public static ConfigEntry<float> TabPosX; public static ConfigEntry<float> TabPosY; public static ConfigEntry<int> TabFontSize; public static ConfigEntry<bool> ShowAll; public static ConfigEntry<bool> ShowUpgrades; public static ConfigEntry<bool> ShowMapProgress; public static ConfigEntry<string> AccentColor; private void Awake() { //IL_013b: Unknown result type (might be due to invalid IL or missing references) StaminaMult = ((BaseUnityPlugin)this).Config.Bind<float>("1. Logic", "StaminaMultiplier", 0.1f, "Points-to-seconds multiplier."); ClimbMult = ((BaseUnityPlugin)this).Config.Bind<float>("1. Logic", "ClimbSecondsPerLevel", 2f, "Seconds of climbing per level."); TabPosX = ((BaseUnityPlugin)this).Config.Bind<float>("2. TAB Panel", "OffsetX", 40f, "Horizontal offset."); TabPosY = ((BaseUnityPlugin)this).Config.Bind<float>("2. TAB Panel", "OffsetY", 260f, "Vertical offset."); TabFontSize = ((BaseUnityPlugin)this).Config.Bind<int>("2. TAB Panel", "FontSize", 18, "Font size."); ShowAll = ((BaseUnityPlugin)this).Config.Bind<bool>("2. TAB Panel", "ShowAll", false, "Show stats even if level is 0."); ShowUpgrades = ((BaseUnityPlugin)this).Config.Bind<bool>("2. TAB Panel", "ShowUpgrades", true, "Show upgrades list."); ShowMapProgress = ((BaseUnityPlugin)this).Config.Bind<bool>("2. TAB Panel", "ShowMapProgress", true, "Show map haul progress."); AccentColor = ((BaseUnityPlugin)this).Config.Bind<string>("3. Visuals", "AccentColor", "#8DFF8D", "Accent color (HEX)."); new Harmony("com.repo.statsui").PatchAll(); ((Component)this).gameObject.AddComponent<StatsTooltipRenderer>(); } } [HarmonyPatch(typeof(ItemInfoUI), "ItemInfoText")] public class ItemInfoUI_StorePatch { private static void Prefix(ItemAttributes _itemAttributes, ref string message) { if (!((Object)(object)_itemAttributes == (Object)null) && (string.IsNullOrEmpty(message) || message == "prev")) { PlayerController instance = PlayerController.instance; float num = Plugin.StaminaMult.Value * 10f; float num2 = (((Object)(object)instance != (Object)null) ? (instance.EnergySprintDrain + instance.SprintSpeedUpgrades) : 1.1f); if (Object.op_Implicit((Object)(object)((Component)_itemAttributes).GetComponent<ItemUpgradePlayerEnergy>())) { message = $"+ {10f / num2 * num:F1}S SPRINT DURATION"; } else if (Object.op_Implicit((Object)(object)((Component)_itemAttributes).GetComponent<ItemUpgradePlayerHealth>())) { message = "+ 20 MAX HEALTH"; } else if (Object.op_Implicit((Object)(object)((Component)_itemAttributes).GetComponent<ItemUpgradePlayerTumbleClimb>())) { message = $"+ {Plugin.ClimbMult.Value:F1}S CLIMB DURATION"; } else if (Object.op_Implicit((Object)(object)((Component)_itemAttributes).GetComponent<ItemUpgradePlayerGrabStrength>())) { message = "+ 0.2 GRAB STRENGTH"; } else if (Object.op_Implicit((Object)(object)((Component)_itemAttributes).GetComponent<ItemUpgradePlayerGrabRange>())) { message = "+ 1.0M GRAB RANGE"; } else if (Object.op_Implicit((Object)(object)((Component)_itemAttributes).GetComponent<ItemUpgradePlayerTumbleWings>())) { message = "+ 1.0S FLIGHT TIME"; } } } } [HarmonyPatch(typeof(EnergyUI), "Update")] public class EnergyUI_Patch { private static readonly FieldRef<EnergyUI, TextMeshProUGUI> TextCurrentRef = AccessTools.FieldRefAccess<EnergyUI, TextMeshProUGUI>("Text"); private static readonly FieldRef<EnergyUI, TextMeshProUGUI> TextMaxRef = AccessTools.FieldRefAccess<EnergyUI, TextMeshProUGUI>("textEnergyMax"); private static readonly FieldRef<EnergyUI, Vector3> BasePosRef = AccessTools.FieldRefAccess<EnergyUI, Vector3>("maxEnergyBasePosition"); private static void Postfix(EnergyUI __instance) { //IL_00d9: Unknown result type (might be due to invalid IL or missing references) //IL_00e9: Unknown result type (might be due to invalid IL or missing references) //IL_00ee: Unknown result type (might be due to invalid IL or missing references) PlayerController instance = PlayerController.instance; if (!((Object)(object)instance == (Object)null)) { float num = instance.EnergySprintDrain + instance.SprintSpeedUpgrades; if (num <= 0f) { num = 1f; } float num2 = Plugin.StaminaMult.Value * 10f; ((TMP_Text)TextCurrentRef.Invoke(__instance)).text = $"{instance.EnergyCurrent / num * num2:F1}<size=70%>S</size>"; ((TMP_Text)TextMaxRef.Invoke(__instance)).text = $"<b><color=orange>/</color></b>{instance.EnergyStart / num * num2:F1}<size=70%>S</size>"; float num3 = ((TMP_Text)TextCurrentRef.Invoke(__instance)).preferredWidth - 32f; ((TMP_Text)TextMaxRef.Invoke(__instance)).transform.localPosition = BasePosRef.Invoke(__instance) + new Vector3(num3, 0f, 0f); } } } public class StatsTooltipRenderer : MonoBehaviour { private Camera _cam; private string _cachedInfo; private float _rayTimer; private float _mapTimer; private int _cachedTotalMap; private int _cachedHaul; private int _cachedInCarts; private int _cachedRemaining; private int _cachedQuota; private bool _isDragging = false; private void Update() { _rayTimer -= Time.deltaTime; if (_rayTimer <= 0f) { _cachedInfo = GetUpgradeInfo(); _rayTimer = 0.1f; } } private void OnGUI() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Invalid comparison between Unknown and I4 //IL_0086: Unknown result type (might be due to invalid IL or missing references) //IL_008c: Invalid comparison between Unknown and I4 //IL_0045: 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_00b9: Unknown result type (might be due to invalid IL or missing references) //IL_00bf: Invalid comparison between Unknown and I4 //IL_00ed: Unknown result type (might be due to invalid IL or missing references) //IL_00f2: Unknown result type (might be due to invalid IL or missing references) //IL_00fb: Unknown result type (might be due to invalid IL or missing references) //IL_0103: Unknown result type (might be due to invalid IL or missing references) //IL_010b: Unknown result type (might be due to invalid IL or missing references) //IL_0115: Expected O, but got Unknown //IL_0132: Unknown result type (might be due to invalid IL or missing references) if ((int)Event.current.type == 3 && Event.current.button == 0 && Input.GetKey((KeyCode)308) && Input.GetKey((KeyCode)9)) { ConfigEntry<float> tabPosX = Plugin.TabPosX; tabPosX.Value -= Event.current.delta.x; ConfigEntry<float> tabPosY = Plugin.TabPosY; tabPosY.Value -= Event.current.delta.y; _isDragging = true; } else if ((int)Event.current.rawType == 1 && _isDragging) { _isDragging = false; ((ConfigEntryBase)Plugin.TabPosX).ConfigFile.Save(); } if ((int)Event.current.type == 7) { if (!string.IsNullOrEmpty(_cachedInfo)) { GUIStyle style = new GUIStyle(GUI.skin.label) { fontSize = 24, fontStyle = (FontStyle)1, alignment = (TextAnchor)4, richText = true }; DrawShadowText(new Rect(0f, (float)(Screen.height - 280), (float)Screen.width, 100f), "<color=" + Plugin.AccentColor.Value + ">+ " + _cachedInfo.ToUpper() + "</color>", style, 2); } if (Input.GetKey((KeyCode)9)) { DrawTabMenu(); } } } private void DrawTabMenu() { //IL_0073: Unknown result type (might be due to invalid IL or missing references) //IL_0078: 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_0091: Unknown result type (might be due to invalid IL or missing references) //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Expected O, but got Unknown //IL_05cb: Unknown result type (might be due to invalid IL or missing references) //IL_05d7: Unknown result type (might be due to invalid IL or missing references) //IL_05dc: Unknown result type (might be due to invalid IL or missing references) //IL_05f6: Unknown result type (might be due to invalid IL or missing references) //IL_0607: Expected O, but got Unknown //IL_062f: Unknown result type (might be due to invalid IL or missing references) //IL_068b: Unknown result type (might be due to invalid IL or missing references) //IL_0697: Unknown result type (might be due to invalid IL or missing references) //IL_069c: Unknown result type (might be due to invalid IL or missing references) //IL_06b6: Unknown result type (might be due to invalid IL or missing references) //IL_06c7: Expected O, but got Unknown //IL_06ef: Unknown result type (might be due to invalid IL or missing references) PlayerController instance = PlayerController.instance; StatsManager instance2 = StatsManager.instance; RoundDirector instance3 = RoundDirector.instance; ValuableDirector instance4 = ValuableDirector.instance; if ((Object)(object)instance == (Object)null || (Object)(object)instance2 == (Object)null || (Object)(object)instance3 == (Object)null) { return; } string playerSteamID = instance.playerSteamID; float num = Plugin.StaminaMult.Value * 10f; float num2 = instance.EnergySprintDrain + instance.SprintSpeedUpgrades; GUIStyle val = new GUIStyle(GUI.skin.label) { fontSize = Plugin.TabFontSize.Value, fontStyle = (FontStyle)1, richText = true, alignment = (TextAnchor)2 }; string text = "<color=" + Plugin.AccentColor.Value + ">"; string text2 = "</color>"; List<string> list = new List<string>(); if (Plugin.ShowUpgrades.Value) { int lvl = GetLvl(instance2.playerUpgradeStamina, playerSteamID); int lvl2 = GetLvl(instance2.playerUpgradeHealth, playerSteamID); int lvl3 = GetLvl(instance2.playerUpgradeTumbleClimb, playerSteamID); int lvl4 = GetLvl(instance2.playerUpgradeRange, playerSteamID); int lvl5 = GetLvl(instance2.playerUpgradeStrength, playerSteamID); if (Plugin.ShowAll.Value || lvl > 0) { list.Add($"STAMINA {text}{instance.EnergyStart / num2 * num:F1}S{text2}"); } if (Plugin.ShowAll.Value || lvl2 > 0) { list.Add($"HEALTH {text}{100 + lvl2 * 20}{text2}"); } if (Plugin.ShowAll.Value || lvl5 > 0) { list.Add($"STRENGTH {text}{1f + (float)lvl5 * 0.2f:F1}X{text2}"); } if (Plugin.ShowAll.Value || lvl4 > 0) { list.Add($"GRAB RANGE {text}{4f + (float)lvl4:F1}M{text2}"); } if (Plugin.ShowAll.Value || lvl3 > 0) { list.Add($"CLIMB {text}{(float)lvl3 * Plugin.ClimbMult.Value:F1}S{text2}"); } } List<string> list2 = new List<string>(); if (Plugin.ShowMapProgress.Value) { _mapTimer -= Time.deltaTime; if (_mapTimer <= 0f) { _mapTimer = 1f; int num3 = 0; int num4 = 0; if ((Object)(object)instance4 != (Object)null && instance4.valuableList != null) { for (int num5 = instance4.valuableList.Count - 1; num5 >= 0; num5--) { ValuableObject val2 = instance4.valuableList[num5]; if (!((Object)(object)val2 == (Object)null)) { int num6 = (int)val2.dollarValueCurrent; num3 += num6; if ((Object)(object)val2.physGrabObject != (Object)null && (Object)(object)val2.physGrabObject.impactDetector != (Object)null && val2.physGrabObject.impactDetector.inCart && (Object)(object)val2.roomVolumeCheck != (Object)null && !val2.roomVolumeCheck.inExtractionPoint) { num4 += num6; } } } } ItemValuableBox[] array = Object.FindObjectsOfType<ItemValuableBox>(); foreach (ItemValuableBox val3 in array) { num3 += (int)val3.CurrentValue; PhysGrabObject component = ((Component)val3).GetComponent<PhysGrabObject>(); if ((Object)(object)component != (Object)null && (Object)(object)component.impactDetector != (Object)null && component.impactDetector.inCart) { num4 += (int)val3.CurrentValue; } } _cachedTotalMap = num3; _cachedHaul = instance3.currentHaul; _cachedQuota = instance3.haulGoal; _cachedInCarts = num4; _cachedRemaining = _cachedTotalMap - _cachedHaul - _cachedInCarts; } list2.Add("TOTAL VALUE " + text + "$" + SemiFunc.DollarGetString(_cachedTotalMap) + text2); list2.Add("HAUL " + text + "$" + SemiFunc.DollarGetString(_cachedHaul) + text2); list2.Add("IN CARTS <color=orange>$" + SemiFunc.DollarGetString(_cachedInCarts) + "</color>"); list2.Add("ON GROUND <color=white>$" + SemiFunc.DollarGetString(_cachedRemaining) + "</color>"); list2.Add("<color=#888888>GOAL (HUD) $" + SemiFunc.DollarGetString(_cachedQuota) + "</color>"); } float num7 = 400f; float num8 = (float)(list.Count + list2.Count + 2) * ((float)val.fontSize * 1.5f) + 60f; float num9 = (float)Screen.width - num7 - Plugin.TabPosX.Value; float num10 = (float)Screen.height - num8 - Plugin.TabPosY.Value; float num11 = num10; if (list.Count > 0) { Rect rect = new Rect(num9, num11, num7, 30f); GUIStyle val4 = new GUIStyle(val); val4.normal.textColor = new Color(0.5f, 0.5f, 0.5f, 0.8f); DrawShadowText(rect, "YOUR STATS", val4, 1); num11 += 30f; DrawShadowText(new Rect(num9, num11, num7, (float)(list.Count * val.fontSize) * 1.5f), string.Join("\n", list), val, 1); num11 += (float)(list.Count * val.fontSize) * 1.5f + 10f; } if (list2.Count > 0) { Rect rect2 = new Rect(num9, num11, num7, 30f); GUIStyle val5 = new GUIStyle(val); val5.normal.textColor = new Color(0.5f, 0.5f, 0.5f, 0.8f); DrawShadowText(rect2, "MAP PROGRESS", val5, 1); num11 += 30f; DrawShadowText(new Rect(num9, num11, num7, (float)(list2.Count * val.fontSize) * 1.5f), string.Join("\n", list2), val, 1); } } private string GetUpgradeInfo() { //IL_0048: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)_cam == (Object)null) { _cam = Camera.main; } if ((Object)(object)_cam == (Object)null) { return null; } RaycastHit val = default(RaycastHit); if (Physics.Raycast(_cam.ViewportPointToRay(new Vector3(0.5f, 0.5f, 0f)), ref val, 5f)) { ItemUpgrade componentInParent = ((Component)((RaycastHit)(ref val)).collider).GetComponentInParent<ItemUpgrade>(); if ((Object)(object)componentInParent != (Object)null) { PlayerController instance = PlayerController.instance; float num = Plugin.StaminaMult.Value * 10f; float num2 = (((Object)(object)instance != (Object)null) ? (instance.EnergySprintDrain + instance.SprintSpeedUpgrades) : 1.1f); if (Object.op_Implicit((Object)(object)((Component)componentInParent).GetComponent<ItemUpgradePlayerEnergy>())) { return $"{10f / num2 * num:F1}S SPRINT DURATION"; } if (Object.op_Implicit((Object)(object)((Component)componentInParent).GetComponent<ItemUpgradePlayerTumbleClimb>())) { return $"{Plugin.ClimbMult.Value:F1}S CLIMB DURATION"; } if (Object.op_Implicit((Object)(object)((Component)componentInParent).GetComponent<ItemUpgradePlayerHealth>())) { return "20 MAX HEALTH"; } if (Object.op_Implicit((Object)(object)((Component)componentInParent).GetComponent<ItemUpgradePlayerGrabStrength>())) { return "0.2 GRAB STRENGTH"; } if (Object.op_Implicit((Object)(object)((Component)componentInParent).GetComponent<ItemUpgradePlayerGrabRange>())) { return "1.0M GRAB RANGE"; } } } return null; } private int GetLvl(Dictionary<string, int> dict, string id) { int value; return (dict != null && id != null && dict.TryGetValue(id, out value)) ? value : 0; } private void DrawShadowText(Rect rect, string text, GUIStyle style, int offset) { //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_001d: 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_0067: 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) //IL_0081: Unknown result type (might be due to invalid IL or missing references) string text2 = Regex.Replace(text, "<.*?>", string.Empty); Color textColor = style.normal.textColor; style.normal.textColor = new Color(0f, 0f, 0f, 1f); GUI.Label(new Rect(((Rect)(ref rect)).x + (float)offset, ((Rect)(ref rect)).y + (float)offset, ((Rect)(ref rect)).width, ((Rect)(ref rect)).height), text2, style); style.normal.textColor = textColor; GUI.Label(rect, text, style); } } }