Some mods may be broken due to the recent Alloyed Collective update.
Decompiled source of GupRankings v1.0.1
plugins/GupRankings/GupRankings.dll
Decompiled a year 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); } } } }