using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; 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 HarmonyLib; using Microsoft.CodeAnalysis; using SineusArena; using Unity.Collections; using UnityEngine; using UnityEngine.SceneManagement; 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("DpsMeter")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+475c616db734eb5eac363c2d2748427cb6a41e36")] [assembly: AssemblyProduct("DpsMeter")] [assembly: AssemblyTitle("DpsMeter")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [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] [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] [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 DpsMeter { public class PlayerDamageRecord { public string DisplayName { get; set; } = ""; public Sprite? IconSprite { get; set; } public PlayerTeam Team { get; set; } public float TotalDamage { get; set; } public int Kills { get; set; } public float MatchStartTime { get; set; } public bool IsSelf { get; set; } public float DPS(float now) { SessionTimerService i = SessionTimerService.I; float num = (((Object)(object)i != (Object)null && i.IsRunning && i.ElapsedTime > 0f) ? i.ElapsedTime : (now - MatchStartTime)); if (!(num > 0.5f)) { return 0f; } return TotalDamage / num; } } public static class DpsData { public static readonly Dictionary Records = new Dictionary(); public static bool MatchActive; public static float MatchStartTime; private static PlayerGameDataManager? _cachedPgdm; private static FactionManager? _cachedFm; private static FactionDefinition[]? _cachedFactionDefs; public static void Reset() { Records.Clear(); MatchActive = false; MatchStartTime = Time.time; _cachedPgdm = null; _cachedFm = null; } public static void OnMatchStart() { if (!MatchActive || Records.Count <= 0) { Reset(); MatchActive = true; MatchStartTime = Time.time; ManualLogSource? log = Plugin.Log; if (log != null) { log.LogInfo((object)"[DpsMeter] Match started – DPS tracking active."); } } } public static void OnMatchEnd() { MatchActive = false; ManualLogSource? log = Plugin.Log; if (log != null) { log.LogInfo((object)"[DpsMeter] Match ended."); } } public static void RecordDamage(PlayerTeam team, float damage) { //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Expected I4, but got Unknown //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Unknown result type (might be due to invalid IL or missing references) if (damage <= 0f) { return; } if (!MatchActive) { MatchActive = true; if (Records.Count == 0) { MatchStartTime = Time.time; } } int key = (int)team; if (!Records.TryGetValue(key, out PlayerDamageRecord value)) { (string playerName, Sprite? heroIcon, bool isSelf) tuple = ResolvePlayerInfo(team); string item = tuple.playerName; Sprite item2 = tuple.heroIcon; bool item3 = tuple.isSelf; value = new PlayerDamageRecord { Team = team, DisplayName = item, IconSprite = item2, IsSelf = item3, MatchStartTime = MatchStartTime }; Records[key] = value; } value.TotalDamage += damage; } public static void RecordKill(PlayerTeam team, int amount) { //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Expected I4, but got Unknown //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_005a: Unknown result type (might be due to invalid IL or missing references) if (amount <= 0) { return; } if (!MatchActive) { MatchActive = true; if (Records.Count == 0) { MatchStartTime = Time.time; } } int key = (int)team; if (!Records.TryGetValue(key, out PlayerDamageRecord value)) { (string playerName, Sprite? heroIcon, bool isSelf) tuple = ResolvePlayerInfo(team); string item = tuple.playerName; Sprite item2 = tuple.heroIcon; bool item3 = tuple.isSelf; value = new PlayerDamageRecord { Team = team, DisplayName = item, IconSprite = item2, IsSelf = item3, MatchStartTime = MatchStartTime }; Records[key] = value; } value.Kills += amount; } public static void RefreshDisplayNames() { //IL_001b: Unknown result type (might be due to invalid IL or missing references) foreach (PlayerDamageRecord value in Records.Values) { (string playerName, Sprite? heroIcon, bool isSelf) tuple = ResolvePlayerInfo(value.Team); string item = tuple.playerName; Sprite item2 = tuple.heroIcon; bool item3 = tuple.isSelf; value.DisplayName = item; value.IsSelf = item3; if ((Object)(object)item2 != (Object)null) { value.IconSprite = item2; } } } public static bool IsBombSource(string sourceName) { if (string.IsNullOrEmpty(sourceName)) { return false; } string text = sourceName.ToLowerInvariant(); if (!text.Contains("bomb") && !text.Contains("nuke")) { return text.Contains("pickup"); } return true; } public unsafe static void SyncFromNetwork() { //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_009c: Unknown result type (might be due to invalid IL or missing references) //IL_00b5: Unknown result type (might be due to invalid IL or missing references) //IL_00b8: Expected I4, but got Unknown //IL_00c8: Unknown result type (might be due to invalid IL or missing references) //IL_00eb: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_007d: Unknown result type (might be due to invalid IL or missing references) try { PlayerStatisticsManager val = PlayerStatisticsManager.I ?? Object.FindAnyObjectByType(); if ((Object)(object)val == (Object)null) { return; } PlayerTeam[] array = new PlayerTeam[4]; RuntimeHelpers.InitializeArray(array, (RuntimeFieldHandle)/*OpCode not supported: LdMemberToken*/); PlayerTeam[] array2 = (PlayerTeam[])(object)array; foreach (PlayerTeam val2 in array2) { float num = 0f; List damageBySourceStats = val.GetDamageBySourceStats(val2); if (damageBySourceStats != null) { for (int j = 0; j < damageBySourceStats.Count; j++) { DamageSourceStatEntry val3 = damageBySourceStats[j]; if (!IsBombSource(((object)(*(FixedString128Bytes*)(&val3.SourceName))/*cast due to .constrained prefix*/).ToString())) { num += damageBySourceStats[j].Damage; } } } int kills = val.GetKills(val2); if (!(num > 0f) && kills <= 0) { continue; } int key = (int)val2; if (!Records.TryGetValue(key, out PlayerDamageRecord value)) { (string playerName, Sprite? heroIcon, bool isSelf) tuple = ResolvePlayerInfo(val2); string item = tuple.playerName; Sprite item2 = tuple.heroIcon; bool item3 = tuple.isSelf; value = new PlayerDamageRecord { Team = val2, DisplayName = item, IconSprite = item2, IsSelf = item3, MatchStartTime = MatchStartTime }; Records[key] = value; } if (num > value.TotalDamage) { value.TotalDamage = num; } if (kills > value.Kills) { value.Kills = kills; } if (!MatchActive && (num > 0f || kills > 0)) { MatchActive = true; if (MatchStartTime <= 0f) { MatchStartTime = Time.time; } } } } catch { } } private static (string playerName, Sprite? heroIcon, bool isSelf) ResolvePlayerInfo(PlayerTeam team) { //IL_02ed: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_013d: Unknown result type (might be due to invalid IL or missing references) //IL_0142: Unknown result type (might be due to invalid IL or missing references) //IL_014b: Unknown result type (might be due to invalid IL or missing references) //IL_0075: Unknown result type (might be due to invalid IL or missing references) //IL_017e: Unknown result type (might be due to invalid IL or missing references) string text = ""; Sprite val = null; bool item = false; try { if ((Object)(object)_cachedFm == (Object)null) { _cachedFm = FactionManager.I ?? Object.FindAnyObjectByType(); } if ((Object)(object)_cachedFm != (Object)null) { FactionSkinDefinition teamSkin = _cachedFm.GetTeamSkin(team); if ((Object)(object)teamSkin != (Object)null && (Object)(object)teamSkin.preview != (Object)null) { val = teamSkin.preview; } if ((Object)(object)val == (Object)null) { FactionDefinition teamFaction = _cachedFm.GetTeamFaction(team); if ((Object)(object)teamFaction != (Object)null) { if ((Object)(object)teamFaction.defaultSkin != (Object)null && (Object)(object)teamFaction.defaultSkin.preview != (Object)null) { val = teamFaction.defaultSkin.preview; } else if ((Object)(object)teamFaction.icon != (Object)null) { val = teamFaction.icon; } else if ((Object)(object)teamFaction.PrimaryAbilityIcon != (Object)null) { val = teamFaction.PrimaryAbilityIcon; } else if ((Object)(object)teamFaction.WeaponIcon != (Object)null) { val = teamFaction.WeaponIcon; } } } } } catch { } try { if ((Object)(object)_cachedPgdm == (Object)null) { _cachedPgdm = PlayerGameDataManager.I ?? Object.FindAnyObjectByType(); } if ((Object)(object)_cachedPgdm != (Object)null) { item = _cachedPgdm.localPlayerTeam == team; PlayerData playerData = _cachedPgdm.GetPlayerData(team); if (playerData != null && !string.IsNullOrEmpty(playerData.playerSteamName)) { text = playerData.playerSteamName; } if ((Object)(object)val == (Object)null) { Unit val2 = _cachedPgdm.GetTeamHeroUnit(team); if ((Object)(object)val2 == (Object)null && playerData != null) { val2 = playerData.playerUnit; } if ((Object)(object)val2 != (Object)null) { if (_cachedFactionDefs == null || _cachedFactionDefs.Length == 0) { _cachedFactionDefs = Resources.FindObjectsOfTypeAll(); } string unitName = val2.UnitName; string value = ((Object)((Component)val2).gameObject).name.Replace("(Clone)", "").Trim(); if (_cachedFactionDefs != null) { FactionDefinition[] cachedFactionDefs = _cachedFactionDefs; foreach (FactionDefinition val3 in cachedFactionDefs) { if ((Object)(object)val3 != (Object)null && ((!string.IsNullOrEmpty(val3.HeroName) && (val3.HeroName.Equals(unitName, StringComparison.OrdinalIgnoreCase) || val3.HeroName.Equals(value, StringComparison.OrdinalIgnoreCase))) || (!string.IsNullOrEmpty(val3.factionId) && (val3.factionId.Equals(unitName, StringComparison.OrdinalIgnoreCase) || val3.factionId.Equals(value, StringComparison.OrdinalIgnoreCase))))) { if ((Object)(object)val3.defaultSkin != (Object)null && (Object)(object)val3.defaultSkin.preview != (Object)null) { val = val3.defaultSkin.preview; } else if ((Object)(object)val3.icon != (Object)null) { val = val3.icon; } break; } } } } } } } catch { } if (string.IsNullOrEmpty(text)) { text = TeamToFriendlyName(team); } return (playerName: text, heroIcon: val, isSelf: item); } private unsafe static string TeamToFriendlyName(PlayerTeam team) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Expected I4, but got Unknown return (team - 1) switch { 0 => "Player 1", 1 => "Player 2", 2 => "Player 3", 3 => "Player 4", _ => ((object)(*(PlayerTeam*)(&team))/*cast due to .constrained prefix*/).ToString(), }; } } [BepInPlugin("com.github.antigravity.dpsmeter", "DPS Meter", "1.1.0")] public class Plugin : BaseUnityPlugin { public static ManualLogSource? Log; private Harmony? _harmony; public static ConfigEntry? CfgToggleKey; public static ConfigEntry? CfgDefaultVisible; public static ConfigEntry? CfgUpdateInterval; public static ConfigEntry? CfgWindowWidth; public static ConfigEntry? CfgRowHeight; public static ConfigEntry? CfgBarOpacity; public static ConfigEntry? CfgFontSize; public static ConfigEntry? CfgPositionX; public static ConfigEntry? CfgPositionY; private void Awake() { //IL_015a: Unknown result type (might be due to invalid IL or missing references) //IL_0164: Expected O, but got Unknown //IL_0183: Unknown result type (might be due to invalid IL or missing references) //IL_0188: Unknown result type (might be due to invalid IL or missing references) //IL_018e: Expected O, but got Unknown //IL_01a3: Unknown result type (might be due to invalid IL or missing references) Log = ((BaseUnityPlugin)this).Logger; Log.LogInfo((object)"DPS Meter loading configuration..."); CfgToggleKey = ((BaseUnityPlugin)this).Config.Bind("General", "ToggleKey", (KeyCode)127, "Key code used to toggle visibility of the DPS Meter."); CfgDefaultVisible = ((BaseUnityPlugin)this).Config.Bind("General", "DefaultVisible", true, "Should the DPS Meter window be visible by default upon starting."); CfgUpdateInterval = ((BaseUnityPlugin)this).Config.Bind("General", "UpdateInterval", 0.25f, "Seconds between UI refreshes (lower is smoother, higher saves CPU)."); CfgWindowWidth = ((BaseUnityPlugin)this).Config.Bind("Appearance", "WindowWidth", 380f, "Width of the DPS Meter window in pixels."); CfgRowHeight = ((BaseUnityPlugin)this).Config.Bind("Appearance", "RowHeight", 28f, "Height of each player row in pixels."); CfgBarOpacity = ((BaseUnityPlugin)this).Config.Bind("Appearance", "BarOpacity", 0.22f, "Opacity/alpha of the rank bar fill (0.0 to 1.0)."); CfgFontSize = ((BaseUnityPlugin)this).Config.Bind("Appearance", "FontSize", 11, "Font size of player rows text."); CfgPositionX = ((BaseUnityPlugin)this).Config.Bind("Position", "PositionX", 430f, "Saved X position offset of the window relative to screen center."); CfgPositionY = ((BaseUnityPlugin)this).Config.Bind("Position", "PositionY", 180f, "Saved Y position offset of the window relative to screen center."); try { _harmony = new Harmony("com.github.antigravity.dpsmeter"); _harmony.PatchAll(); Log.LogInfo((object)"DPS Meter Harmony patches applied."); GameObject val = new GameObject("DpsMeterController"); Object.DontDestroyOnLoad((Object)val); val.AddComponent(); Log.LogInfo((object)$"DPS Meter ready. Press {CfgToggleKey.Value} to toggle."); } catch (Exception ex) { Log.LogError((object)("Failed to initialize DPS Meter: " + ex)); } } private void OnDestroy() { Harmony? harmony = _harmony; if (harmony != null) { harmony.UnpatchSelf(); } } } [HarmonyPatch(typeof(GameFlowManager), "DoRematch")] public static class GameRematchPatch { [HarmonyPrefix] public static void Prefix() { ManualLogSource? log = Plugin.Log; if (log != null) { log.LogInfo((object)"[DpsMeter] Round restarting (Rematch) – resetting DPS data."); } DpsData.Reset(); } } [HarmonyPatch(typeof(SessionTimerService), "RestartTimer")] public static class TimerRestartPatch { [HarmonyPostfix] public static void Postfix() { ManualLogSource? log = Plugin.Log; if (log != null) { log.LogInfo((object)"[DpsMeter] Session timer restarted – resetting DPS data."); } DpsData.Reset(); } } [HarmonyPatch(typeof(CollectableItemBomb), "DrainPendingDamage")] public static class BombDrainDamagePatch { public static bool IsExecutingBomb; [HarmonyPrefix] public static void Prefix() { IsExecutingBomb = true; } [HarmonyPostfix] public static void Postfix() { IsExecutingBomb = false; } } [HarmonyPatch(typeof(CollectableItemBomb), "ApplyCollectReward")] public static class BombCollectRewardPatch { [HarmonyPrefix] public static void Prefix() { BombDrainDamagePatch.IsExecutingBomb = true; } [HarmonyPostfix] public static void Postfix() { BombDrainDamagePatch.IsExecutingBomb = false; } } [HarmonyPatch(typeof(PlayerStatisticsManager), "AddDamage")] public static class AddDamagePatch { [HarmonyPrefix] public static bool Prefix(PlayerTeam team, string sourceName, float amount) { if (BombDrainDamagePatch.IsExecutingBomb || DpsData.IsBombSource(sourceName)) { return false; } return true; } [HarmonyPostfix] public static void Postfix(PlayerTeam team, string sourceName, float amount) { //IL_0010: Unknown result type (might be due to invalid IL or missing references) if (!BombDrainDamagePatch.IsExecutingBomb && !DpsData.IsBombSource(sourceName)) { DpsData.RecordDamage(team, amount); } } } [HarmonyPatch(typeof(PlayerStatisticsManager), "AddKill")] public static class AddKillPatch { [HarmonyPrefix] public static bool Prefix(PlayerTeam team, int amount) { if (BombDrainDamagePatch.IsExecutingBomb) { return false; } return true; } [HarmonyPostfix] public static void Postfix(PlayerTeam team, int amount) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) if (!BombDrainDamagePatch.IsExecutingBomb) { DpsData.RecordKill(team, amount); } } } public class DpsMeterController : MonoBehaviour { private GameObject? _canvasObj; private GameObject? _windowObj; private RectTransform? _windowRect; private Text? _timerText; private Text? _titleText; private GameObject? _scrollContent; private readonly List _rows = new List(); private bool _isDragging; private Vector2 _dragOffset; private bool _visible = true; private float _refreshTimer; private float _nameRefreshTimer; private static readonly Color ColHeader = new Color(0.06f, 0.08f, 0.14f, 0.97f); private static readonly Color ColBody = new Color(0.04f, 0.05f, 0.1f, 0.93f); private static readonly Color ColBorderOuter = new Color(0.22f, 0.48f, 1f, 0.95f); private static readonly Color ColTitle = new Color(0.55f, 0.82f, 1f, 1f); private static readonly Color ColTimer = new Color(0.6f, 0.65f, 0.78f, 1f); private static readonly Color ColDps = new Color(0.6f, 0.95f, 1f, 1f); private static readonly Color ColKills = new Color(1f, 0.55f, 0.3f, 1f); private static readonly Color ColLabel = new Color(0.45f, 0.6f, 0.88f, 1f); private const float HeaderH = 30f; private const float SubH = 20f; private Font? _font; private GameObject? _emptyLabel; private void Start() { _visible = Plugin.CfgDefaultVisible?.Value ?? true; _font = FindFont(); SceneManager.sceneLoaded += OnSceneLoaded; BuildUI(); } private void OnDestroy() { SceneManager.sceneLoaded -= OnSceneLoaded; } private void OnSceneLoaded(Scene scene, LoadSceneMode mode) { DpsData.Reset(); } private void Update() { //IL_000d: Unknown result type (might be due to invalid IL or missing references) ConfigEntry? cfgToggleKey = Plugin.CfgToggleKey; if (Input.GetKeyDown((KeyCode)((cfgToggleKey == null) ? 127 : ((int)cfgToggleKey.Value)))) { SetVisible(!_visible); } if (!_visible) { return; } HandleDrag(); float num = Plugin.CfgUpdateInterval?.Value ?? 0.25f; _refreshTimer += Time.deltaTime; if (_refreshTimer >= num) { _refreshTimer = 0f; RefreshUI(); } _nameRefreshTimer += Time.deltaTime; if (_nameRefreshTimer >= 5f) { _nameRefreshTimer = 0f; if (DpsData.MatchActive) { DpsData.RefreshDisplayNames(); } } } private void HandleDrag() { //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0031: 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_0060: 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_0070: Unknown result type (might be due to invalid IL or missing references) //IL_0076: Unknown result type (might be due to invalid IL or missing references) //IL_0080: Unknown result type (might be due to invalid IL or missing references) //IL_0086: Unknown result type (might be due to invalid IL or missing references) //IL_00f3: Unknown result type (might be due to invalid IL or missing references) //IL_00f8: Unknown result type (might be due to invalid IL or missing references) //IL_00fe: 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_00b3: 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_00b5: 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_0096: Unknown result type (might be due to invalid IL or missing references) //IL_009c: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)_windowRect == (Object)null) { return; } if (Input.GetMouseButtonDown(0)) { Vector2 val = ScreenToCanvas(Input.mousePosition); Vector2 anchoredPosition = _windowRect.anchoredPosition; float num = _windowRect.sizeDelta.x * 0.5f; float num2 = _windowRect.sizeDelta.y * 0.5f; if (val.x > anchoredPosition.x - num && val.x < anchoredPosition.x + num && val.y > anchoredPosition.y + num2 - 30f && val.y < anchoredPosition.y + num2) { _isDragging = true; _dragOffset = anchoredPosition - val; } } if (Input.GetMouseButtonUp(0) && _isDragging) { _isDragging = false; SavePosition(); } if (_isDragging && Input.GetMouseButton(0)) { _windowRect.anchoredPosition = ScreenToCanvas(Input.mousePosition) + _dragOffset; ClampToScreen(); } } private void SavePosition() { //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)_windowRect == (Object)null)) { if (Plugin.CfgPositionX != null) { Plugin.CfgPositionX.Value = _windowRect.anchoredPosition.x; } if (Plugin.CfgPositionY != null) { Plugin.CfgPositionY.Value = _windowRect.anchoredPosition.y; } } } private Vector2 ScreenToCanvas(Vector3 screenPos) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0013: 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) return new Vector2(screenPos.x - (float)Screen.width * 0.5f, screenPos.y - (float)Screen.height * 0.5f); } private void ClampToScreen() { //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_002c: 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_0048: Unknown result type (might be due to invalid IL or missing references) //IL_004b: 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_00ad: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)_windowRect == (Object)null)) { float num = _windowRect.sizeDelta.x * 0.5f; float num2 = _windowRect.sizeDelta.y * 0.5f; Vector2 anchoredPosition = _windowRect.anchoredPosition; anchoredPosition.x = Mathf.Clamp(anchoredPosition.x, (float)(-Screen.width) * 0.5f + num, (float)Screen.width * 0.5f - num); anchoredPosition.y = Mathf.Clamp(anchoredPosition.y, (float)(-Screen.height) * 0.5f + num2, (float)Screen.height * 0.5f - num2); _windowRect.anchoredPosition = anchoredPosition; } } private void SetVisible(bool v) { _visible = v; GameObject? windowObj = _windowObj; if (windowObj != null) { windowObj.SetActive(v); } } private void BuildUI() { //IL_0048: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Expected O, but got Unknown //IL_008b: Unknown result type (might be due to invalid IL or missing references) //IL_0095: Expected O, but got Unknown //IL_00d2: Unknown result type (might be due to invalid IL or missing references) //IL_00ec: Unknown result type (might be due to invalid IL or missing references) //IL_0106: Unknown result type (might be due to invalid IL or missing references) //IL_0118: Unknown result type (might be due to invalid IL or missing references) //IL_012e: 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_015e: Unknown result type (might be due to invalid IL or missing references) //IL_0169: Unknown result type (might be due to invalid IL or missing references) //IL_0174: Unknown result type (might be due to invalid IL or missing references) //IL_017e: Unknown result type (might be due to invalid IL or missing references) //IL_019f: Unknown result type (might be due to invalid IL or missing references) //IL_01aa: Unknown result type (might be due to invalid IL or missing references) //IL_01bf: Unknown result type (might be due to invalid IL or missing references) //IL_01d3: Unknown result type (might be due to invalid IL or missing references) //IL_01ef: Unknown result type (might be due to invalid IL or missing references) //IL_020a: Unknown result type (might be due to invalid IL or missing references) //IL_021f: Unknown result type (might be due to invalid IL or missing references) //IL_0234: Unknown result type (might be due to invalid IL or missing references) //IL_023f: Unknown result type (might be due to invalid IL or missing references) //IL_024a: Unknown result type (might be due to invalid IL or missing references) //IL_025e: Unknown result type (might be due to invalid IL or missing references) //IL_028d: Unknown result type (might be due to invalid IL or missing references) //IL_02a7: Unknown result type (might be due to invalid IL or missing references) //IL_02bc: Unknown result type (might be due to invalid IL or missing references) //IL_02d1: Unknown result type (might be due to invalid IL or missing references) //IL_02e5: Unknown result type (might be due to invalid IL or missing references) //IL_030f: Unknown result type (might be due to invalid IL or missing references) //IL_036d: Unknown result type (might be due to invalid IL or missing references) //IL_03d3: Unknown result type (might be due to invalid IL or missing references) //IL_03ef: Unknown result type (might be due to invalid IL or missing references) //IL_0404: Unknown result type (might be due to invalid IL or missing references) //IL_0419: Unknown result type (might be due to invalid IL or missing references) //IL_0424: Unknown result type (might be due to invalid IL or missing references) //IL_042f: Unknown result type (might be due to invalid IL or missing references) //IL_0444: Unknown result type (might be due to invalid IL or missing references) //IL_0458: Unknown result type (might be due to invalid IL or missing references) //IL_0488: Unknown result type (might be due to invalid IL or missing references) //IL_04a2: Unknown result type (might be due to invalid IL or missing references) //IL_04b7: Unknown result type (might be due to invalid IL or missing references) //IL_04cc: Unknown result type (might be due to invalid IL or missing references) //IL_04e0: Unknown result type (might be due to invalid IL or missing references) //IL_05ae: Unknown result type (might be due to invalid IL or missing references) //IL_05b9: Unknown result type (might be due to invalid IL or missing references) //IL_05c4: Unknown result type (might be due to invalid IL or missing references) //IL_05d8: Unknown result type (might be due to invalid IL or missing references) //IL_060a: Unknown result type (might be due to invalid IL or missing references) //IL_061f: Unknown result type (might be due to invalid IL or missing references) //IL_0634: Unknown result type (might be due to invalid IL or missing references) //IL_063e: Unknown result type (might be due to invalid IL or missing references) //IL_0666: Unknown result type (might be due to invalid IL or missing references) //IL_0671: Unknown result type (might be due to invalid IL or missing references) //IL_067c: Unknown result type (might be due to invalid IL or missing references) //IL_0686: Unknown result type (might be due to invalid IL or missing references) //IL_06bc: Unknown result type (might be due to invalid IL or missing references) //IL_06d3: Unknown result type (might be due to invalid IL or missing references) //IL_06e8: Unknown result type (might be due to invalid IL or missing references) //IL_06fd: Unknown result type (might be due to invalid IL or missing references) //IL_0711: Unknown result type (might be due to invalid IL or missing references) //IL_072c: Unknown result type (might be due to invalid IL or missing references) //IL_0743: Unknown result type (might be due to invalid IL or missing references) //IL_0758: Unknown result type (might be due to invalid IL or missing references) //IL_076d: Unknown result type (might be due to invalid IL or missing references) //IL_0781: Unknown result type (might be due to invalid IL or missing references) //IL_079c: Unknown result type (might be due to invalid IL or missing references) //IL_07b3: Unknown result type (might be due to invalid IL or missing references) //IL_07c8: Unknown result type (might be due to invalid IL or missing references) //IL_07dd: Unknown result type (might be due to invalid IL or missing references) //IL_07f1: Unknown result type (might be due to invalid IL or missing references) //IL_080b: Unknown result type (might be due to invalid IL or missing references) //IL_0822: Unknown result type (might be due to invalid IL or missing references) //IL_0837: Unknown result type (might be due to invalid IL or missing references) //IL_084c: Unknown result type (might be due to invalid IL or missing references) //IL_0860: Unknown result type (might be due to invalid IL or missing references) float num = Plugin.CfgWindowWidth?.Value ?? 380f; float num2 = Plugin.CfgPositionX?.Value ?? 430f; float num3 = Plugin.CfgPositionY?.Value ?? 180f; _canvasObj = new GameObject("DpsMeterCanvas"); Object.DontDestroyOnLoad((Object)(object)_canvasObj); Canvas obj = _canvasObj.AddComponent(); obj.renderMode = (RenderMode)0; obj.sortingOrder = 9998; _canvasObj.AddComponent(); _windowObj = new GameObject("DpsWindow"); _windowObj.transform.SetParent(_canvasObj.transform, false); _windowRect = _windowObj.AddComponent(); _windowRect.anchorMin = new Vector2(0.5f, 0.5f); _windowRect.anchorMax = new Vector2(0.5f, 0.5f); _windowRect.pivot = new Vector2(0.5f, 0.5f); _windowRect.anchoredPosition = new Vector2(num2, num3); _windowRect.sizeDelta = new Vector2(num, 200f); GameObject obj2 = MakeChild(_windowObj, "Background"); ((Graphic)obj2.AddComponent()).color = ColBody; RectTransform component = obj2.GetComponent(); component.anchorMin = Vector2.zero; component.anchorMax = Vector2.one; component.offsetMin = Vector2.zero; component.offsetMax = Vector2.zero; GameObject obj3 = MakeChild(_windowObj, "Content"); RectTransform obj4 = obj3.AddComponent(); obj4.anchorMin = Vector2.zero; obj4.anchorMax = Vector2.one; obj4.offsetMin = new Vector2(2f, 2f); obj4.offsetMax = new Vector2(-2f, -2f); GameObject val = MakeChild(obj3, "Header"); ((Graphic)val.AddComponent()).color = ColHeader; RectTransform component2 = val.GetComponent(); component2.anchorMin = new Vector2(0f, 1f); component2.anchorMax = new Vector2(1f, 1f); component2.pivot = new Vector2(0.5f, 1f); component2.offsetMin = Vector2.zero; component2.offsetMax = Vector2.zero; component2.sizeDelta = new Vector2(0f, 30f); GameObject obj5 = MakeChild(val, "Accent"); ((Graphic)obj5.AddComponent()).color = new Color(0.3f, 0.6f, 1f, 0.7f); RectTransform component3 = obj5.GetComponent(); component3.anchorMin = new Vector2(0f, 0f); component3.anchorMax = new Vector2(1f, 0f); component3.pivot = new Vector2(0.5f, 0f); component3.sizeDelta = new Vector2(0f, 2f); _titleText = MakeText(val, "Title", 0f, 0.65f, 0f, 1f, (TextAnchor)3, 13, (FontStyle)1, ColTitle); _titleText.text = "⚔ DPS Meter"; OffsetText(_titleText, 10f, 0f, 0f, 0f); _timerText = MakeText(val, "Timer", 0.65f, 1f, 0f, 1f, (TextAnchor)5, 12, (FontStyle)0, ColTimer); _timerText.text = "--:--"; OffsetText(_timerText, 0f, 0f, -10f, 0f); GameObject val2 = MakeChild(obj3, "SubHeader"); ((Graphic)val2.AddComponent()).color = new Color(0.09f, 0.12f, 0.22f, 0.95f); RectTransform component4 = val2.GetComponent(); component4.anchorMin = new Vector2(0f, 1f); component4.anchorMax = new Vector2(1f, 1f); component4.pivot = new Vector2(0.5f, 1f); component4.offsetMin = Vector2.zero; component4.offsetMax = Vector2.zero; component4.anchoredPosition = new Vector2(0f, -30f); component4.sizeDelta = new Vector2(0f, 20f); GameObject obj6 = MakeChild(val2, "SubAccent"); ((Graphic)obj6.AddComponent()).color = new Color(0.3f, 0.6f, 1f, 0.35f); RectTransform component5 = obj6.GetComponent(); component5.anchorMin = new Vector2(0f, 0f); component5.anchorMax = new Vector2(1f, 0f); component5.pivot = new Vector2(0.5f, 0f); component5.sizeDelta = new Vector2(0f, 1f); AddColLabel(val2, "", 0f, 0.07f, (TextAnchor)4); AddColLabel(val2, "#", 0.07f, 0.13f, (TextAnchor)4); AddColLabel(val2, "Player", 0.13f, 0.42f, (TextAnchor)3); AddColLabel(val2, "Damage", 0.42f, 0.58f, (TextAnchor)5); AddColLabel(val2, "DPS", 0.58f, 0.72f, (TextAnchor)5); AddColLabel(val2, "Kills", 0.72f, 0.85f, (TextAnchor)4); AddColLabel(val2, "%", 0.85f, 1f, (TextAnchor)5); GameObject val3 = MakeChild(obj3, "RowArea"); val3.AddComponent(); RectTransform component6 = val3.GetComponent(); component6.anchorMin = Vector2.zero; component6.anchorMax = Vector2.one; component6.offsetMin = Vector2.zero; component6.offsetMax = new Vector2(0f, -51f); _scrollContent = MakeChild(val3, "Rows"); RectTransform obj7 = _scrollContent.AddComponent(); obj7.anchorMin = new Vector2(0f, 1f); obj7.anchorMax = new Vector2(1f, 1f); obj7.pivot = new Vector2(0.5f, 1f); obj7.anchoredPosition = Vector2.zero; GameObject obj8 = MakeChild(_windowObj, "BorderOverlay"); obj8.AddComponent(); RectTransform component7 = obj8.GetComponent(); component7.anchorMin = Vector2.zero; component7.anchorMax = Vector2.one; component7.offsetMin = Vector2.zero; component7.offsetMax = Vector2.zero; Color color = default(Color); ((Color)(ref color))..ctor(0.22f, 0.48f, 1f, 1f); GameObject obj9 = MakeChild(obj8, "BorderTop"); ((Graphic)obj9.AddComponent()).color = color; RectTransform component8 = obj9.GetComponent(); component8.anchorMin = new Vector2(0f, 1f); component8.anchorMax = new Vector2(1f, 1f); component8.pivot = new Vector2(0.5f, 1f); component8.sizeDelta = new Vector2(0f, 2f); GameObject obj10 = MakeChild(obj8, "BorderBottom"); ((Graphic)obj10.AddComponent()).color = color; RectTransform component9 = obj10.GetComponent(); component9.anchorMin = new Vector2(0f, 0f); component9.anchorMax = new Vector2(1f, 0f); component9.pivot = new Vector2(0.5f, 0f); component9.sizeDelta = new Vector2(0f, 2f); GameObject obj11 = MakeChild(obj8, "BorderLeft"); ((Graphic)obj11.AddComponent()).color = color; RectTransform component10 = obj11.GetComponent(); component10.anchorMin = new Vector2(0f, 0f); component10.anchorMax = new Vector2(0f, 1f); component10.pivot = new Vector2(0f, 0.5f); component10.sizeDelta = new Vector2(2f, 0f); GameObject obj12 = MakeChild(obj8, "BorderRight"); ((Graphic)obj12.AddComponent()).color = color; RectTransform component11 = obj12.GetComponent(); component11.anchorMin = new Vector2(1f, 0f); component11.anchorMax = new Vector2(1f, 1f); component11.pivot = new Vector2(1f, 0.5f); component11.sizeDelta = new Vector2(2f, 0f); _windowObj.SetActive(_visible); } private void AddColLabel(GameObject parent, string text, float xMin, float xMax, TextAnchor anchor) { //IL_001a: 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) Text obj = MakeText(parent, "Col_" + text, xMin, xMax, 0f, 1f, anchor, 9, (FontStyle)1, ColLabel); obj.text = text.ToUpperInvariant(); OffsetText(obj, 4f, 0f, -4f, 0f); } private void RefreshUI() { //IL_0240: Unknown result type (might be due to invalid IL or missing references) //IL_0245: Unknown result type (might be due to invalid IL or missing references) //IL_0262: Unknown result type (might be due to invalid IL or missing references) //IL_0267: Unknown result type (might be due to invalid IL or missing references) //IL_0284: Unknown result type (might be due to invalid IL or missing references) //IL_0289: Unknown result type (might be due to invalid IL or missing references) //IL_02a6: Unknown result type (might be due to invalid IL or missing references) //IL_02ab: Unknown result type (might be due to invalid IL or missing references) //IL_066f: Unknown result type (might be due to invalid IL or missing references) //IL_0699: Unknown result type (might be due to invalid IL or missing references) //IL_0313: Unknown result type (might be due to invalid IL or missing references) //IL_0325: 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_0370: Unknown result type (might be due to invalid IL or missing references) //IL_0482: Unknown result type (might be due to invalid IL or missing references) //IL_04e7: Unknown result type (might be due to invalid IL or missing references) //IL_04d1: Unknown result type (might be due to invalid IL or missing references) //IL_046c: Unknown result type (might be due to invalid IL or missing references) //IL_0456: Unknown result type (might be due to invalid IL or missing references) //IL_0440: Unknown result type (might be due to invalid IL or missing references) //IL_0622: Unknown result type (might be due to invalid IL or missing references) //IL_0607: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)_windowRect == (Object)null || (Object)(object)_scrollContent == (Object)null) { return; } DpsData.SyncFromNetwork(); float time = Time.time; float num = Plugin.CfgWindowWidth?.Value ?? 380f; float num2 = Plugin.CfgRowHeight?.Value ?? 28f; float num3 = Plugin.CfgBarOpacity?.Value ?? 0.22f; if ((Object)(object)_timerText != (Object)null) { SessionTimerService i = SessionTimerService.I; if ((Object)(object)i != (Object)null && i.IsRunning) { _timerText.text = i.FormattedTime; } else if (DpsData.MatchActive) { float num4 = time - DpsData.MatchStartTime; _timerText.text = $"{(int)(num4 / 60f)}:{(int)(num4 % 60f):D2}"; } else { _timerText.text = ((DpsData.Records.Count > 0) ? "ENDED" : "--:--"); } } List list = DpsData.Records.Values.OrderByDescending((PlayerDamageRecord r) => r.TotalDamage).ToList(); float num5 = ((list.Count > 0 && list[0].TotalDamage > 0f) ? list[0].TotalDamage : 1f); float num6 = list.Sum((PlayerDamageRecord r) => r.TotalDamage); while (_rows.Count < list.Count) { _rows.Add(BuildRow(_rows.Count)); } for (int num7 = list.Count; num7 < _rows.Count; num7++) { GameObject? root = _rows[num7].Root; if (root != null) { root.SetActive(false); } } if (list.Count == 0) { EnsureEmptyLabel(); } else { DestroyEmptyLabel(); } Color[] array = (Color[])(object)new Color[4] { new Color(1f, 0.78f, 0.08f, num3), new Color(0.68f, 0.68f, 0.78f, num3 * 0.85f), new Color(0.78f, 0.48f, 0.22f, num3 * 0.75f), new Color(0.2f, 0.42f, 0.8f, num3 * 0.65f) }; for (int num8 = 0; num8 < list.Count; num8++) { PlayerDamageRecord playerDamageRecord = list[num8]; PlayerRow playerRow = _rows[num8]; GameObject? root2 = playerRow.Root; if (root2 != null) { root2.SetActive(true); } GameObject? root3 = playerRow.Root; RectTransform val = ((root3 != null) ? root3.GetComponent() : null); if ((Object)(object)val != (Object)null) { val.anchoredPosition = new Vector2(0f, (float)(-num8) * num2); val.sizeDelta = new Vector2(0f, num2); } float num9 = playerDamageRecord.TotalDamage / num5; if ((Object)(object)playerRow.BarFill != (Object)null) { RectTransform component = ((Component)playerRow.BarFill).GetComponent(); if ((Object)(object)component != (Object)null) { component.anchorMax = new Vector2(Mathf.Clamp01(num9), 1f); } ((Graphic)playerRow.BarFill).color = array[Mathf.Min(num8, array.Length - 1)]; } if ((Object)(object)playerRow.IconImg != (Object)null) { if ((Object)(object)playerDamageRecord.IconSprite != (Object)null) { playerRow.IconImg.sprite = playerDamageRecord.IconSprite; ((Component)playerRow.IconImg).gameObject.SetActive(true); } else { ((Component)playerRow.IconImg).gameObject.SetActive(false); } } if ((Object)(object)playerRow.RankText != (Object)null) { playerRow.RankText.text = (num8 + 1).ToString(); ((Graphic)playerRow.RankText).color = (Color)(num8 switch { 2 => new Color(0.8f, 0.5f, 0.25f), 1 => new Color(0.75f, 0.75f, 0.82f), 0 => new Color(1f, 0.85f, 0.15f), _ => new Color(0.5f, 0.55f, 0.7f), }); } bool isSelf = playerDamageRecord.IsSelf; if ((Object)(object)playerRow.NameText != (Object)null) { playerRow.NameText.text = playerDamageRecord.DisplayName; ((Graphic)playerRow.NameText).color = (isSelf ? new Color(0.3f, 0.9f, 0.45f) : new Color(0.88f, 0.88f, 0.96f)); playerRow.NameText.fontStyle = (FontStyle)(isSelf ? 1 : 0); } if ((Object)(object)playerRow.DmgText != (Object)null) { playerRow.DmgText.text = FormatDamage(playerDamageRecord.TotalDamage); } if ((Object)(object)playerRow.DpsText != (Object)null) { playerRow.DpsText.text = $"{playerDamageRecord.DPS(time):F0}"; } if ((Object)(object)playerRow.KillText != (Object)null) { playerRow.KillText.text = playerDamageRecord.Kills.ToString(); } float num10 = ((num6 > 0f) ? (playerDamageRecord.TotalDamage / num6 * 100f) : 0f); if ((Object)(object)playerRow.PctText != (Object)null) { playerRow.PctText.text = $"{num10:F1}%"; } if ((Object)(object)playerRow.Bg != (Object)null) { ((Graphic)playerRow.Bg).color = ((num8 % 2 == 0) ? new Color(0.08f, 0.1f, 0.18f, 0.88f) : new Color(0.06f, 0.08f, 0.14f, 0.88f)); } } float num11 = Mathf.Max((float)list.Count * num2, 28f); float num12 = 50f + num11 + 4f; _windowRect.sizeDelta = new Vector2(num, num12); RectTransform component2 = _scrollContent.GetComponent(); if ((Object)(object)component2 != (Object)null) { component2.sizeDelta = new Vector2(0f, num11); } } private void EnsureEmptyLabel() { //IL_0069: Unknown result type (might be due to invalid IL or missing references) //IL_009a: Unknown result type (might be due to invalid IL or missing references) //IL_00af: Unknown result type (might be due to invalid IL or missing references) //IL_00c4: Unknown result type (might be due to invalid IL or missing references) //IL_00d9: Unknown result type (might be due to invalid IL or missing references) //IL_00ed: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)_emptyLabel != (Object)null)) { _emptyLabel = MakeChild(_scrollContent, "Empty"); Text obj = _emptyLabel.AddComponent(); obj.font = _font; obj.fontSize = Plugin.CfgFontSize?.Value ?? 11; ((Graphic)obj).color = new Color(0.38f, 0.44f, 0.6f, 0.85f); obj.alignment = (TextAnchor)4; obj.text = "Waiting for combat data…"; RectTransform component = _emptyLabel.GetComponent(); component.anchorMin = new Vector2(0f, 1f); component.anchorMax = new Vector2(1f, 1f); component.pivot = new Vector2(0.5f, 1f); component.sizeDelta = new Vector2(0f, 28f); component.anchoredPosition = new Vector2(0f, 0f); } } private void DestroyEmptyLabel() { if ((Object)(object)_emptyLabel != (Object)null) { Object.Destroy((Object)(object)_emptyLabel); _emptyLabel = null; } } private PlayerRow BuildRow(int idx) { //IL_0040: Unknown result type (might be due to invalid IL or missing references) //IL_0055: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Unknown result type (might be due to invalid IL or missing references) //IL_008f: Unknown result type (might be due to invalid IL or missing references) //IL_00bb: Unknown result type (might be due to invalid IL or missing references) //IL_00d0: Unknown result type (might be due to invalid IL or missing references) //IL_00db: Unknown result type (might be due to invalid IL or missing references) //IL_00e5: Unknown result type (might be due to invalid IL or missing references) //IL_011a: 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_0144: Unknown result type (might be due to invalid IL or missing references) //IL_0158: Unknown result type (might be due to invalid IL or missing references) //IL_0191: Unknown result type (might be due to invalid IL or missing references) //IL_01ca: Unknown result type (might be due to invalid IL or missing references) //IL_0203: Unknown result type (might be due to invalid IL or missing references) //IL_022d: Unknown result type (might be due to invalid IL or missing references) //IL_0257: Unknown result type (might be due to invalid IL or missing references) //IL_0290: Unknown result type (might be due to invalid IL or missing references) int num = Plugin.CfgFontSize?.Value ?? 11; GameObject val = MakeChild(_scrollContent, $"Row_{idx}"); RectTransform obj = val.AddComponent(); obj.anchorMin = new Vector2(0f, 1f); obj.anchorMax = new Vector2(1f, 1f); obj.pivot = new Vector2(0.5f, 1f); Image val2 = val.AddComponent(); ((Graphic)val2).color = new Color(0.08f, 0.1f, 0.18f, 0.88f); GameObject obj2 = MakeChild(val, "Bar"); Image barFill = obj2.AddComponent(); RectTransform component = obj2.GetComponent(); component.anchorMin = new Vector2(0f, 0f); component.anchorMax = new Vector2(0f, 1f); component.offsetMin = Vector2.zero; component.offsetMax = Vector2.zero; GameObject obj3 = MakeChild(val, "Icon"); Image val3 = obj3.AddComponent(); val3.preserveAspect = true; RectTransform component2 = obj3.GetComponent(); component2.anchorMin = new Vector2(0f, 0f); component2.anchorMax = new Vector2(0.07f, 1f); component2.offsetMin = new Vector2(2f, 2f); component2.offsetMax = new Vector2(-2f, -2f); Text val4 = MakeText(val, "Rank", 0.07f, 0.13f, 0f, 1f, (TextAnchor)4, num + 1, (FontStyle)1, new Color(1f, 0.85f, 0.15f)); Text val5 = MakeText(val, "Name", 0.13f, 0.42f, 0f, 1f, (TextAnchor)3, num, (FontStyle)0, new Color(0.88f, 0.88f, 0.96f)); Text val6 = MakeText(val, "Dmg", 0.42f, 0.58f, 0f, 1f, (TextAnchor)5, num, (FontStyle)0, new Color(0.88f, 0.88f, 0.96f)); Text val7 = MakeText(val, "Dps", 0.58f, 0.72f, 0f, 1f, (TextAnchor)5, num, (FontStyle)1, ColDps); Text val8 = MakeText(val, "Kills", 0.72f, 0.85f, 0f, 1f, (TextAnchor)4, num, (FontStyle)0, ColKills); Text val9 = MakeText(val, "Pct", 0.85f, 1f, 0f, 1f, (TextAnchor)5, num, (FontStyle)0, new Color(0.75f, 0.92f, 1f)); Text[] array = (Text[])(object)new Text[6] { val4, val5, val6, val7, val8, val9 }; for (int i = 0; i < array.Length; i++) { OffsetText(array[i], 4f, 1f, -4f, -1f); } return new PlayerRow { Root = val, Bg = val2, BarFill = barFill, IconImg = val3, RankText = val4, NameText = val5, DmgText = val6, DpsText = val7, KillText = val8, PctText = val9 }; } private static GameObject MakeChild(GameObject parent, string name) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Expected O, but got Unknown GameObject val = new GameObject(name); val.transform.SetParent(parent.transform, false); return val; } private Text MakeText(GameObject parent, string name, float xMin, float xMax, float yMin, float yMax, TextAnchor anchor, int size, FontStyle style, Color color) { //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Unknown result type (might be due to invalid IL or missing references) GameObject val = MakeChild(parent, name); Text obj = val.AddComponent(); obj.font = _font; obj.fontSize = size; obj.fontStyle = style; ((Graphic)obj).color = color; obj.alignment = anchor; RectTransform component = val.GetComponent(); component.anchorMin = new Vector2(xMin, yMin); component.anchorMax = new Vector2(xMax, yMax); return obj; } private static void OffsetText(Text t, float left, float bottom, float right, float top) { //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) RectTransform component = ((Component)t).GetComponent(); component.offsetMin = new Vector2(left, bottom); component.offsetMax = new Vector2(right, top); } private static string FormatDamage(float d) { if (!(d >= 1000000f)) { if (!(d >= 1000f)) { return $"{d:F0}"; } return $"{d / 1000f:F1}k"; } return $"{d / 1000000f:F2}M"; } private static Font FindFont() { try { Text[] array = Object.FindObjectsByType((FindObjectsInactive)1, (FindObjectsSortMode)0); foreach (Text val in array) { if ((Object)(object)((val != null) ? val.font : null) != (Object)null) { return val.font; } } } catch { } return Resources.GetBuiltinResource("LegacyRuntime.ttf"); } } public class PlayerRow { public GameObject? Root; public Image? Bg; public Image? BarFill; public Image? IconImg; public Text? RankText; public Text? NameText; public Text? DmgText; public Text? DpsText; public Text? PctText; public Text? KillText; } }