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 GupRankings v1.0.1
plugins/GupRankings/GupRankings.dll
Decompiled 2 years agousing System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using GupRankings.RankingDisplayHooks; using GupRankings.SortStatsNetMessage; using Microsoft.CodeAnalysis; using MonoMod.RuntimeDetour; using R2API.Networking; using R2API.Networking.Interfaces; using R2API.Utils; using RiskOfOptions; using RiskOfOptions.OptionConfigs; using RiskOfOptions.Options; using RoR2; using RoR2.Stats; using RoR2.UI; using TMPro; using UnityEngine; using UnityEngine.Networking; 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("GupRankings")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+0c5fd7b39a8c46c699ccea21e75d0e5d1c936869")] [assembly: AssemblyProduct("GupRankings")] [assembly: AssemblyTitle("GupRankings")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace GupRankings { public enum StatRankings { TotalDamageDealt, TotalMinionDamageDealt, HighestDamageDealt, TotalGoldCollected, TotalGoldSpent, LeastDamageTaken, TotalKills, TotalEliteKills } [BepInPlugin("KarmaReplicant.GupRankings", "GupRankings", "1.0.0")] [NetworkCompatibility(/*Could not decode attribute arguments.*/)] public class BasePlugin : BaseUnityPlugin { public const string PluginGUID = "KarmaReplicant.GupRankings"; public const string PluginAuthor = "KarmaReplicant"; public const string PluginName = "GupRankings"; public const string PluginVersion = "1.0.0"; internal RankingDisplay rankDisplay; public ConfigEntry<StatRankings> statEnum; public ConfigEntry<Color> headerColor; public ConfigEntry<Color> firstColor; public ConfigEntry<Color> secondColor; public ConfigEntry<Color> thirdColor; public ConfigEntry<float> fontSize; public ConfigEntry<float> userNameLength; public byte[] imgData; public Sprite logo; public static BasePlugin instance; public void Awake() { //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Expected O, but got Unknown //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_00ba: Unknown result type (might be due to invalid IL or missing references) //IL_00c4: Expected O, but got Unknown //IL_00ef: Unknown result type (might be due to invalid IL or missing references) //IL_00f4: Unknown result type (might be due to invalid IL or missing references) //IL_00ff: Unknown result type (might be due to invalid IL or missing references) //IL_010f: Expected O, but got Unknown //IL_010a: Unknown result type (might be due to invalid IL or missing references) //IL_0114: Expected O, but got Unknown //IL_013f: Unknown result type (might be due to invalid IL or missing references) //IL_0144: Unknown result type (might be due to invalid IL or missing references) //IL_014f: Unknown result type (might be due to invalid IL or missing references) //IL_015f: Expected O, but got Unknown //IL_015a: Unknown result type (might be due to invalid IL or missing references) //IL_0164: Expected O, but got Unknown //IL_0184: Unknown result type (might be due to invalid IL or missing references) //IL_019e: Unknown result type (might be due to invalid IL or missing references) //IL_01a8: Expected O, but got Unknown //IL_01c8: Unknown result type (might be due to invalid IL or missing references) //IL_01e2: Unknown result type (might be due to invalid IL or missing references) //IL_01ec: Expected O, but got Unknown //IL_020c: Unknown result type (might be due to invalid IL or missing references) //IL_0226: Unknown result type (might be due to invalid IL or missing references) //IL_0230: Expected O, but got Unknown //IL_0250: Unknown result type (might be due to invalid IL or missing references) //IL_026a: Unknown result type (might be due to invalid IL or missing references) //IL_0274: Expected O, but got Unknown string directoryName = Path.GetDirectoryName(((BaseUnityPlugin)this).Info.Location); imgData = File.ReadAllBytes(directoryName + "/icon.png"); Texture2D val = new Texture2D(256, 256); ImageConversion.LoadImage(val, imgData); logo = Sprite.Create(val, new Rect(0f, 0f, (float)((Texture)val).width, (float)((Texture)val).height), new Vector2(0f, 0f)); instance = this; rankDisplay = new RankingDisplay(); NetworkingAPI.RegisterMessageType<SortStats>(); statEnum = ((BaseUnityPlugin)this).Config.Bind<StatRankings>("Options", "Leaderboard Stat", StatRankings.TotalDamageDealt, "Select the statistic that the leaderboard will be based on. Whatever the host has it set to will be displayed in game."); ModSettingsManager.AddOption((BaseOption)new ChoiceOption((ConfigEntryBase)(object)statEnum)); fontSize = ((BaseUnityPlugin)this).Config.Bind<float>("Options", "Font Size", 0f, "Select the font size for the leaderboard text. Setting it to 0 will set it to the default size of the panel. The percentage equals the size."); ModSettingsManager.AddOption((BaseOption)new SliderOption(fontSize, new SliderConfig { min = 0f, max = 64f })); userNameLength = ((BaseUnityPlugin)this).Config.Bind<float>("Options", "Username Length", 8f, "Select the maximum amount of characters of player's usernames that will be shown to help make everything fit. Setting it to 1 will have the full name displayed regardless. The percentage equals the size."); ModSettingsManager.AddOption((BaseOption)new SliderOption(userNameLength, new SliderConfig { min = 1f, max = 32f })); headerColor = ((BaseUnityPlugin)this).Config.Bind<Color>("Options", "Header Color", new Color(1f, 44f / 85f, 0f), "Select the header color of the leaderboard."); ModSettingsManager.AddOption((BaseOption)new ColorOption(headerColor)); firstColor = ((BaseUnityPlugin)this).Config.Bind<Color>("Options", "First Color", new Color(0.8509804f, 0.72156864f, 0.02745098f), "Select the first place color of the leaderboard."); ModSettingsManager.AddOption((BaseOption)new ColorOption(firstColor)); secondColor = ((BaseUnityPlugin)this).Config.Bind<Color>("Options", "Second Color", new Color(64f / 85f, 64f / 85f, 64f / 85f), "Select the second place color of the leaderboard."); ModSettingsManager.AddOption((BaseOption)new ColorOption(secondColor)); thirdColor = ((BaseUnityPlugin)this).Config.Bind<Color>("Options", "Third Color", new Color(0.7490196f, 0.47058824f, 19f / 85f), "Select the third place color of the leaderboard."); ModSettingsManager.AddOption((BaseOption)new ColorOption(thirdColor)); ModSettingsManager.SetModIcon(logo); Log.Init(((BaseUnityPlugin)this).Logger); } } internal static class Log { private static ManualLogSource _logSource; internal static void Init(ManualLogSource logSource) { _logSource = logSource; } internal static void Debug(object data) { _logSource.LogDebug(data); } internal static void Error(object data) { _logSource.LogError(data); } internal static void Fatal(object data) { _logSource.LogFatal(data); } internal static void Info(object data) { _logSource.LogInfo(data); } internal static void Message(object data) { _logSource.LogMessage(data); } internal static void Warning(object data) { _logSource.LogWarning(data); } } } namespace GupRankings.SortStatsNetMessage { public class SortStats : INetMessage, ISerializableObject { private NetworkInstanceId netId; private string rawStats; private StatRankings selectedStat; public static string statLabel = "none"; private List<KeyValuePair<string, ulong>> statsData; public static string sortedStatDisplay; private bool changed; public SortStats() { rawStats = ""; statsData = new List<KeyValuePair<string, ulong>>(); sortedStatDisplay = "<color=#ff8300>Leaderboard (" + statLabel + "):</color>\nIF YOU SEE THIS THERE IS A PROBLEM!!!\nPLEASE REPORT IT TO THE GITHUB ISSUES PAGE!"; changed = false; } public SortStats(NetworkInstanceId netId, string stats, StatRankings selectedStat, string statName) { //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) this.netId = netId; rawStats = stats; this.selectedStat = selectedStat; statLabel = statName; } public void Deserialize(NetworkReader reader) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) netId = reader.ReadNetworkId(); string text = reader.ReadString(); if (!text.Equals(rawStats)) { rawStats = text; changed = true; } else { changed = false; } selectedStat = (StatRankings)reader.ReadInt32(); statLabel = reader.ReadString(); } public void OnReceived() { if (changed) { statsData.Clear(); string[] array = rawStats.Split('\n'); for (int i = 0; i < array.Length; i++) { string[] array2 = array[i].Split('\t'); statsData.Add(new KeyValuePair<string, ulong>(array2[0], ulong.Parse(array2[1]))); } if (selectedStat == StatRankings.LeastDamageTaken) { statsData.Sort(PlayerStatsComparisonGreater); } else { statsData.Sort(PlayerStatsComparisonLess); } SetDisplayString(statsData); } } public void Serialize(NetworkWriter writer) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) writer.Write(netId); writer.Write(rawStats); writer.Write((int)selectedStat); writer.Write(statLabel); } private static void SetDisplayString(List<KeyValuePair<string, ulong>> data) { //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_003e: 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) //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_0064: Unknown result type (might be due to invalid IL or missing references) //IL_0085: Unknown result type (might be due to invalid IL or missing references) //IL_012f: Unknown result type (might be due to invalid IL or missing references) //IL_0161: Unknown result type (might be due to invalid IL or missing references) //IL_0190: Unknown result type (might be due to invalid IL or missing references) Color32 color = Color32.op_Implicit(BasePlugin.instance.headerColor.Value); Color32 color2 = Color32.op_Implicit(BasePlugin.instance.firstColor.Value); Color32 color3 = Color32.op_Implicit(BasePlugin.instance.secondColor.Value); Color32 color4 = Color32.op_Implicit(BasePlugin.instance.thirdColor.Value); sortedStatDisplay = "<color=#" + ConvertColorToHexString(color) + ">" + statLabel + "</color>\n<color=#" + ConvertColorToHexString(color) + ">Leaderboard:</color>\n"; int num = 1; foreach (KeyValuePair<string, ulong> datum in data) { string text = datum.Key; if ((int)BasePlugin.instance.userNameLength.Value != 1 && datum.Key.Length > (int)BasePlugin.instance.userNameLength.Value) { text = text.Substring(0, (int)BasePlugin.instance.userNameLength.Value); } switch (num) { case 1: sortedStatDisplay += $"<color=#{ConvertColorToHexString(color2)}>1. {text}: {datum.Value}</color>\n"; break; case 2: sortedStatDisplay += $"<color=#{ConvertColorToHexString(color3)}>2. {text}: {datum.Value}</color>\n"; break; case 3: sortedStatDisplay += $"<color=#{ConvertColorToHexString(color4)}>3. {text}: {datum.Value}</color>\n"; break; default: sortedStatDisplay += $"{num}. {text}: {datum.Value}\n"; break; } num++; } } public static void HostSync(string s, StatRankings selectedStat, string statName) { statLabel = statName; List<KeyValuePair<string, ulong>> list = new List<KeyValuePair<string, ulong>>(); string[] array = s.Split('\n'); for (int i = 0; i < array.Length; i++) { string[] array2 = array[i].Split('\t'); list.Add(new KeyValuePair<string, ulong>(array2[0], ulong.Parse(array2[1]))); } if (selectedStat == StatRankings.LeastDamageTaken) { list.Sort(PlayerStatsComparisonGreater); } else { list.Sort(PlayerStatsComparisonLess); } SetDisplayString(list); } private static int PlayerStatsComparisonGreater(KeyValuePair<string, ulong> x, KeyValuePair<string, ulong> y) { return Convert.ToInt32(x.Value > y.Value); } private static int PlayerStatsComparisonLess(KeyValuePair<string, ulong> x, KeyValuePair<string, ulong> y) { return Convert.ToInt32(x.Value < y.Value); } private static string ConvertColorToHexString(Color32 color) { //IL_0008: 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_001a: Unknown result type (might be due to invalid IL or missing references) string[] array = BitConverter.ToString(new byte[3] { color.r, color.g, color.b }).Split('-'); string text = ""; string[] array2 = array; foreach (string text2 in array2) { text += text2; } return text; } } } namespace GupRankings.RankingDisplayHooks { public class RankingDisplay { private VerticalLayoutGroup layoutGroup; private LayoutElement layoutElement; private static Hook updateHook; private TextMeshProUGUI text; private GameObject textObj; private Transform track; public Dictionary<StatRankings, StatDef> StatsMap; private float originalFontSize; public RankingDisplay() { StatsMap = new Dictionary<StatRankings, StatDef> { { StatRankings.TotalDamageDealt, StatDef.totalDamageDealt }, { StatRankings.TotalMinionDamageDealt, StatDef.totalMinionDamageDealt }, { StatRankings.HighestDamageDealt, StatDef.highestDamageDealt }, { StatRankings.TotalGoldCollected, StatDef.goldCollected }, { StatRankings.TotalGoldSpent, StatDef.totalGoldPurchases }, { StatRankings.LeastDamageTaken, StatDef.totalDamageTaken }, { StatRankings.TotalKills, StatDef.totalKills }, { StatRankings.TotalEliteKills, StatDef.totalEliteKills } }; Hooks(); } public void Hooks() { //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Expected O, but got Unknown MethodInfo? method = typeof(ObjectivePanelController).GetMethod("Update", BindingFlags.Instance | BindingFlags.NonPublic); MethodInfo method2 = typeof(RankingDisplay).GetMethod("Update", BindingFlags.Instance | BindingFlags.NonPublic); updateHook = new Hook((MethodBase)method, method2, (object)this); } private void Update(Action<ObjectivePanelController> orig, ObjectivePanelController self) { rankDisplay(); orig(self); } public void rankDisplay() { //IL_022a: Unknown result type (might be due to invalid IL or missing references) //IL_00bc: Unknown result type (might be due to invalid IL or missing references) //IL_00c7: Unknown result type (might be due to invalid IL or missing references) //IL_00d1: Unknown result type (might be due to invalid IL or missing references) //IL_0117: Unknown result type (might be due to invalid IL or missing references) VerticalLayoutGroup[] componentsInChildren = Run.instance.uiInstances[0].GetComponentsInChildren<VerticalLayoutGroup>(); foreach (VerticalLayoutGroup val in componentsInChildren) { if (((Object)((Component)val).gameObject).name == "RightInfoBar" && (Object)(object)textObj == (Object)null) { Transform val2 = ((Component)val).transform.Find("ObjectivePanel"); GameObject val3 = Object.Instantiate<GameObject>(((Component)val2).gameObject); val3.transform.parent = ((Component)val2.parent).transform; ((Object)val3).name = "RankingDisplay"; RectTransform component = val3.GetComponent<RectTransform>(); layoutGroup = val3.GetComponent<VerticalLayoutGroup>(); this.text = val3.GetComponentInChildren<TextMeshProUGUI>(); layoutElement = val3.GetComponentInChildren<LayoutElement>(); ((Transform)component).localPosition = Vector3.zero; ((Transform)component).localEulerAngles = Vector3.zero; ((Transform)component).localScale = Vector3.one; ((Behaviour)layoutGroup).enabled = false; ((Behaviour)layoutGroup).enabled = true; if ((Object)(object)textObj == (Object)null) { ((TMP_Text)this.text).alignment = (TextAlignmentOptions)257; ((Graphic)this.text).color = Color.white; textObj = ((Component)this.text).gameObject; track = val3.transform; originalFontSize = ((TMP_Text)this.text).fontSize; } } } if (NetworkServer.active) { string text = ""; foreach (PlayerCharacterMasterController instance in PlayerCharacterMasterController.instances) { try { StatSheet currentStats = instance.master.playerStatsComponent.currentStats; text = text + instance.GetDisplayName() + "\t" + currentStats.GetStatValueString(StatsMap[BasePlugin.instance.statEnum.Value]) + "\n"; } catch { Debug.Log((object)(instance.GetDisplayName() + " has thrown an exception...")); } } NetMessageExtensions.Send((INetMessage)(object)new SortStats(((NetworkBehaviour)LocalUserManager.GetFirstLocalUser().currentNetworkUser).netId, text.Substring(0, text.Length - 1), BasePlugin.instance.statEnum.Value, ((ConfigEntryBase)BasePlugin.instance.statEnum).BoxedValue.ToString()), (NetworkDestination)1); SortStats.HostSync(text.Substring(0, text.Length - 1), BasePlugin.instance.statEnum.Value, ((ConfigEntryBase)BasePlugin.instance.statEnum).BoxedValue.ToString()); } ((TMP_Text)this.text).fontSize = ((BasePlugin.instance.fontSize.Value == 0f) ? originalFontSize : BasePlugin.instance.fontSize.Value); if (Object.op_Implicit((Object)(object)this.text)) { layoutElement.preferredHeight = ((TMP_Text)this.text).fontSize * (float)SortStats.sortedStatDisplay.Split('\n').Length; ((TMP_Text)this.text).SetText(SortStats.sortedStatDisplay, true); } if (!Object.op_Implicit((Object)(object)textObj)) { textObj.SetActive(true); } } } }