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 MultiDPS v1.0.3
MultiDPS.dll
Decompiled 5 hours agousing System; using System.Collections.Generic; using System.Diagnostics; using System.Globalization; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Text; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using BepInEx.Logging; using HarmonyLib; using Microsoft.CodeAnalysis; using MultiDPS.Patches; using RiskOfOptions; using RiskOfOptions.OptionConfigs; using RiskOfOptions.Options; using RoR2; using RoR2.UI; using TMPro; using UnityEngine; 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("MultiDPS")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyDescription("Per-player DPS scoreboard for Risk of Rain 2")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+de6605ce5b3f40b7d11b915ab155e5719e15d92c")] [assembly: AssemblyProduct("MultiDPS")] [assembly: AssemblyTitle("MultiDPS")] [assembly: AssemblyVersion("1.0.0.0")] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [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 MultiDPS { internal static class Attribution { private const int MaxMinionDepth = 4; public static NetworkUser Resolve(GameObject attacker, out bool viaMinion) { viaMinion = false; if ((Object)(object)attacker == (Object)null) { return null; } CharacterBody component = attacker.GetComponent<CharacterBody>(); if ((Object)(object)component == (Object)null) { return null; } CharacterMaster val = component.master; if ((Object)(object)val == (Object)null) { return null; } NetworkUser val2 = UserOf(val); if ((Object)(object)val2 != (Object)null) { return val2; } for (int i = 0; i < 4; i++) { MinionOwnership minionOwnership = val.minionOwnership; if ((Object)(object)minionOwnership == (Object)null) { break; } val = minionOwnership.ownerMaster; if ((Object)(object)val == (Object)null) { break; } val2 = UserOf(val); if ((Object)(object)val2 != (Object)null) { viaMinion = true; return val2; } } return null; } private static NetworkUser UserOf(CharacterMaster master) { PlayerCharacterMasterController playerCharacterMasterController = master.playerCharacterMasterController; if ((Object)(object)playerCharacterMasterController == (Object)null) { return null; } NetworkUser networkUser = playerCharacterMasterController.networkUser; if (!((Object)(object)networkUser == (Object)null)) { return networkUser; } return null; } } internal static class DpsTracker { private const float MinElapsed = 1f; private static readonly Dictionary<NetworkUser, PlayerDps> Entries = new Dictionary<NetworkUser, PlayerDps>(); private static float _stageStartTime; private static bool _subscribed; public static float Elapsed => Mathf.Max(1f, Time.unscaledTime - _stageStartTime); public static void Subscribe() { if (!_subscribed) { _subscribed = true; SnapshotStageStart(); GlobalEventManager.onClientDamageNotified += OnClientDamageNotified; Stage.onStageStartGlobal += OnStageStart; Run.onRunStartGlobal += OnRunStart; } } public static void Unsubscribe() { if (_subscribed) { _subscribed = false; GlobalEventManager.onClientDamageNotified -= OnClientDamageNotified; Stage.onStageStartGlobal -= OnStageStart; Run.onRunStartGlobal -= OnRunStart; Entries.Clear(); } } public static bool TryGet(NetworkUser user, out PlayerDps entry) { return Entries.TryGetValue(user, out entry); } private static void OnRunStart(Run run) { Reset(); } private static void OnStageStart(Stage stage) { Reset(); } private static void Reset() { Entries.Clear(); SnapshotStageStart(); } private static void SnapshotStageStart() { _stageStartTime = Time.unscaledTime; } private static void OnClientDamageNotified(DamageDealtMessage message) { try { if (message == null || message.damage <= 0f) { return; } bool viaMinion; NetworkUser val = Attribution.Resolve(message.attacker, out viaMinion); if (!((Object)(object)val == (Object)null)) { if (!Entries.TryGetValue(val, out var value)) { value = new PlayerDps(); Entries[val] = value; } if (viaMinion) { value.MinionDamage += message.damage; } else { value.DirectDamage += message.damage; } } } catch { } } } public enum ScoreboardAnchor { AboveHealthBar, TopRight, TopLeft, BottomRight, BottomLeft, TopCenter } public enum ChatBoxHandling { PushChatUp, PlaceAboveChat, MoveToCenter, Ignore } internal static class ModConfig { public const float MinScale = 0.4f; public const float MaxScale = 3f; public static ConfigEntry<KeyboardShortcut> ToggleKey; public static ConfigEntry<bool> IsVisible; public static ConfigEntry<bool> HideWhenChatOpen; public static ConfigEntry<float> RefreshInterval; public static ConfigEntry<ScoreboardAnchor> Anchor; public static ConfigEntry<float> OffsetX; public static ConfigEntry<float> OffsetY; public static ConfigEntry<ChatBoxHandling> ChatBox; public static ConfigEntry<float> ChatBoxGap; public static ConfigEntry<float> ChatCenterOffsetX; public static ConfigEntry<float> ChatCenterOffsetY; public static ConfigEntry<bool> MatchHudSkew; public static ConfigEntry<float> Scale; public static ConfigEntry<float> ScaleStep; public static ConfigEntry<KeyboardShortcut> ScaleUpKey; public static ConfigEntry<KeyboardShortcut> ScaleDownKey; public static ConfigEntry<bool> AutoSize; public static ConfigEntry<float> Width; public static ConfigEntry<float> Height; public static ConfigEntry<float> FontSize; public static ConfigEntry<float> MonospaceWidth; public static ConfigEntry<bool> ShowBackground; public static ConfigEntry<Color> BackgroundColor; public static ConfigEntry<Color> TextColor; public static ConfigEntry<bool> HighlightSelf; public static ConfigEntry<Color> SelfColor; public static ConfigEntry<bool> ShowCharacterName; public static ConfigEntry<bool> ShowMinionBreakdown; public static ConfigEntry<bool> ShowDamageShare; public static ConfigEntry<bool> ShowTeamTotal; public static ConfigEntry<int> NameMaxLength; public static ConfigEntry<bool> UseCommas; public static bool LayoutDirty { get; set; } public static void Init(ConfigFile config) { //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_01cb: Unknown result type (might be due to invalid IL or missing references) //IL_01fd: Unknown result type (might be due to invalid IL or missing references) //IL_02e2: Unknown result type (might be due to invalid IL or missing references) //IL_0301: Unknown result type (might be due to invalid IL or missing references) //IL_034f: Unknown result type (might be due to invalid IL or missing references) EnsureColorConverter(); ToggleKey = config.Bind<KeyboardShortcut>("General", "Toggle Key", new KeyboardShortcut((KeyCode)290, Array.Empty<KeyCode>()), "スコアボードの表示・非表示を切り替えるキー。"); IsVisible = config.Bind<bool>("General", "Is Visible", true, "現在スコアボードを表示しているか。トグルキーの状態がここに保存される。"); HideWhenChatOpen = config.Bind<bool>("General", "Hide When Chat Open", true, "チャット入力中はスコアボードを隠す。"); RefreshInterval = config.Bind<float>("General", "Refresh Interval", 0.25f, "表示を更新する間隔(秒)。集計自体は常に行われるので、ここを大きくしても数値はずれない。"); Anchor = config.Bind<ScoreboardAnchor>("Layout", "Anchor", ScoreboardAnchor.AboveHealthBar, "スコアボードの配置。AboveHealthBar は HP バーとバフ表示の真上に下辺を合わせて追従する。"); OffsetX = config.Bind<float>("Layout", "Offset X", 0f, "基準位置からの水平方向のずれ(ピクセル)。右が正。"); OffsetY = config.Bind<float>("Layout", "Offset Y", 8f, "基準位置からの垂直方向のずれ(ピクセル)。上が正。"); ChatBox = config.Bind<ChatBoxHandling>("Layout", "Chat Box Handling", ChatBoxHandling.MoveToCenter, "チャット・取得ログと重なったときの捌き方。PushChatUp はログを上へ押し上げる。PlaceAboveChat はスコアボード側がログの上へ逃げる。MoveToCenter はログを画面中央(自キャラのあたり)へ移す。Ignore は何もしない。"); ChatBoxGap = config.Bind<float>("Layout", "Chat Box Gap", 8f, "スコアボードとチャット・取得ログのあいだに空ける隙間(ピクセル)。PushChatUp のときだけ使われる。"); ChatCenterOffsetX = config.Bind<float>("Layout", "Chat Center Offset X", 380f, "MoveToCenter のときの、画面中央からの水平方向のずれ(ピクセル)。右が正。"); ChatCenterOffsetY = config.Bind<float>("Layout", "Chat Center Offset Y", -46f, "MoveToCenter のときの、画面中央からの垂直方向のずれ(ピクセル)。上が正。"); MatchHudSkew = config.Bind<bool>("Layout", "Match HUD Skew", true, "ゲームの HUD と同じ傾き(画面中央を向いた台形変形)を掛ける。off にすると画面と平行な、傾きのない板になる。"); Scale = config.Bind<float>("Layout", "Scale", 1.1f, "スコアボード全体の拡大率。左下を基準に拡大・縮小する。"); ScaleStep = config.Bind<float>("Layout", "Scale Step", 0.1f, "拡大・縮小のキーを 1 回押したときに変化する量。"); ScaleUpKey = config.Bind<KeyboardShortcut>("Layout", "Scale Up Key", new KeyboardShortcut((KeyCode)273, (KeyCode[])(object)new KeyCode[1] { (KeyCode)306 }), "スコアボードを拡大するキー。"); ScaleDownKey = config.Bind<KeyboardShortcut>("Layout", "Scale Down Key", new KeyboardShortcut((KeyCode)274, (KeyCode[])(object)new KeyCode[1] { (KeyCode)306 }), "スコアボードを縮小するキー。"); AutoSize = config.Bind<bool>("Layout", "Auto Size", true, "パネルの大きさを中身に合わせて自動調整する。off にすると Width / Height が使われる。"); Width = config.Bind<float>("Layout", "Width", 420f, "スコアボードの幅(ピクセル)。Auto Size が off のときだけ使われる。"); Height = config.Bind<float>("Layout", "Height", 170f, "スコアボードの高さ(ピクセル)。Auto Size が off のときだけ使われる。"); FontSize = config.Bind<float>("Layout", "Font Size", 16f, "文字サイズ。"); MonospaceWidth = config.Bind<float>("Layout", "Monospace Width", 0.58f, "桁を揃えるための等幅文字の幅(em)。列がずれる場合に微調整する。"); ShowBackground = config.Bind<bool>("Layout", "Show Background", true, "背景パネルを表示する。"); BackgroundColor = config.Bind<Color>("Layout", "Background Color", new Color(1f, 1f, 1f, 2f / 51f), "背景パネルの色。"); TextColor = config.Bind<Color>("Display", "Text Color", Color.white, "文字色。"); HighlightSelf = config.Bind<bool>("Display", "Highlight Self", true, "自分の行を別の色で強調する。"); SelfColor = config.Bind<Color>("Display", "Self Color", new Color(1f, 0.84f, 0f, 1f), "自分の行の色。"); ShowCharacterName = config.Bind<bool>("Display", "Show Character Name", false, "プレイヤー名の隣に使用中のキャラクター名を表示する。"); ShowMinionBreakdown = config.Bind<bool>("Display", "Show Minion Breakdown", true, "タレット・ドローン・召喚物のぶんを (+N) として併記する。"); ShowDamageShare = config.Bind<bool>("Display", "Show Damage Share", true, "チーム総ダメージに占める割合を % で表示する。"); ShowTeamTotal = config.Bind<bool>("Display", "Show Team Total", true, "最下段にチーム合計の行を表示する。"); NameMaxLength = config.Bind<int>("Display", "Name Max Length", 12, "プレイヤー名の表示に使う桁数。長い名前はここで切り詰められる。"); UseCommas = config.Bind<bool>("Display", "Use Commas", true, "数値に桁区切りを入れる。"); Anchor.SettingChanged += MarkLayoutDirty; OffsetX.SettingChanged += MarkLayoutDirty; OffsetY.SettingChanged += MarkLayoutDirty; MatchHudSkew.SettingChanged += MarkLayoutDirty; Scale.SettingChanged += MarkLayoutDirty; AutoSize.SettingChanged += MarkLayoutDirty; Width.SettingChanged += MarkLayoutDirty; Height.SettingChanged += MarkLayoutDirty; FontSize.SettingChanged += MarkLayoutDirty; ShowBackground.SettingChanged += MarkLayoutDirty; BackgroundColor.SettingChanged += MarkLayoutDirty; TextColor.SettingChanged += MarkLayoutDirty; if (Chainloader.PluginInfos.ContainsKey("com.rune580.riskofoptions")) { try { RegisterRiskOfOptions(); } catch (Exception ex) { Plugin.Log.LogWarning((object)("Risk of Options への設定登録に失敗しました: " + ex.Message)); } } } private static void MarkLayoutDirty(object sender, EventArgs e) { LayoutDirty = true; } private static void EnsureColorConverter() { //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_0070: Expected O, but got Unknown if (TomlTypeConverter.CanConvert(typeof(Color))) { return; } TomlTypeConverter.AddConverter(typeof(Color), new TypeConverter { ConvertToString = (object obj, Type type) => "#" + ColorUtility.ToHtmlStringRGBA((Color)obj), ConvertToObject = delegate(string str, Type type) { //IL_0010: Unknown result type (might be due to invalid IL or missing references) //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) Color white = default(Color); if (!ColorUtility.TryParseHtmlString(str, ref white)) { white = Color.white; } return white; } }); } [MethodImpl(MethodImplOptions.NoInlining)] private static void RegisterRiskOfOptions() { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Expected O, but got Unknown //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Expected O, but got Unknown //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Unknown result type (might be due to invalid IL or missing references) //IL_0058: Expected O, but got Unknown //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Expected O, but got Unknown //IL_0062: Unknown result type (might be due to invalid IL or missing references) //IL_006c: Expected O, but got Unknown //IL_0071: 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_0081: Unknown result type (might be due to invalid IL or missing references) //IL_008c: Unknown result type (might be due to invalid IL or missing references) //IL_009c: Expected O, but got Unknown //IL_0097: Unknown result type (might be due to invalid IL or missing references) //IL_00a1: Expected O, but got Unknown //IL_00a6: Unknown result type (might be due to invalid IL or missing references) //IL_00ab: Unknown result type (might be due to invalid IL or missing references) //IL_00b6: Unknown result type (might be due to invalid IL or missing references) //IL_00c1: Unknown result type (might be due to invalid IL or missing references) //IL_00d1: Expected O, but got Unknown //IL_00cc: Unknown result type (might be due to invalid IL or missing references) //IL_00d6: Expected O, but got Unknown //IL_00db: Unknown result type (might be due to invalid IL or missing references) //IL_00e5: Expected O, but got Unknown //IL_00ea: Unknown result type (might be due to invalid IL or missing references) //IL_00ef: Unknown result type (might be due to invalid IL or missing references) //IL_00fa: Unknown result type (might be due to invalid IL or missing references) //IL_0105: Unknown result type (might be due to invalid IL or missing references) //IL_0115: Expected O, but got Unknown //IL_0110: Unknown result type (might be due to invalid IL or missing references) //IL_011a: Expected O, but got Unknown //IL_011f: Unknown result type (might be due to invalid IL or missing references) //IL_0124: 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_013a: Unknown result type (might be due to invalid IL or missing references) //IL_014a: Expected O, but got Unknown //IL_0145: Unknown result type (might be due to invalid IL or missing references) //IL_014f: Expected O, but got Unknown //IL_0154: Unknown result type (might be due to invalid IL or missing references) //IL_0159: Unknown result type (might be due to invalid IL or missing references) //IL_0164: Unknown result type (might be due to invalid IL or missing references) //IL_016f: Unknown result type (might be due to invalid IL or missing references) //IL_017f: Expected O, but got Unknown //IL_017a: Unknown result type (might be due to invalid IL or missing references) //IL_0184: Expected O, but got Unknown //IL_0189: Unknown result type (might be due to invalid IL or missing references) //IL_0193: Expected O, but got Unknown //IL_0198: Unknown result type (might be due to invalid IL or missing references) //IL_019d: Unknown result type (might be due to invalid IL or missing references) //IL_01a8: Unknown result type (might be due to invalid IL or missing references) //IL_01b3: Unknown result type (might be due to invalid IL or missing references) //IL_01c3: Expected O, but got Unknown //IL_01be: Unknown result type (might be due to invalid IL or missing references) //IL_01c8: Expected O, but got Unknown //IL_01cd: Unknown result type (might be due to invalid IL or missing references) //IL_01d2: Unknown result type (might be due to invalid IL or missing references) //IL_01dd: Unknown result type (might be due to invalid IL or missing references) //IL_01e8: Unknown result type (might be due to invalid IL or missing references) //IL_01f8: Expected O, but got Unknown //IL_01f3: Unknown result type (might be due to invalid IL or missing references) //IL_01fd: Expected O, but got Unknown //IL_0202: Unknown result type (might be due to invalid IL or missing references) //IL_020c: Expected O, but got Unknown //IL_0211: Unknown result type (might be due to invalid IL or missing references) //IL_021b: Expected O, but got Unknown //IL_0220: Unknown result type (might be due to invalid IL or missing references) //IL_022a: Expected O, but got Unknown //IL_022f: 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_025a: Expected O, but got Unknown //IL_0255: Unknown result type (might be due to invalid IL or missing references) //IL_025f: Expected O, but got Unknown //IL_0264: Unknown result type (might be due to invalid IL or missing references) //IL_0269: Unknown result type (might be due to invalid IL or missing references) //IL_0274: Unknown result type (might be due to invalid IL or missing references) //IL_027f: Unknown result type (might be due to invalid IL or missing references) //IL_028f: Expected O, but got Unknown //IL_028a: Unknown result type (might be due to invalid IL or missing references) //IL_0294: Expected O, but got Unknown //IL_0299: Unknown result type (might be due to invalid IL or missing references) //IL_029e: Unknown result type (might be due to invalid IL or missing references) //IL_02a9: Unknown result type (might be due to invalid IL or missing references) //IL_02b4: Unknown result type (might be due to invalid IL or missing references) //IL_02c4: Expected O, but got Unknown //IL_02bf: Unknown result type (might be due to invalid IL or missing references) //IL_02c9: Expected O, but got Unknown //IL_02ce: Unknown result type (might be due to invalid IL or missing references) //IL_02d3: Unknown result type (might be due to invalid IL or missing references) //IL_02de: Unknown result type (might be due to invalid IL or missing references) //IL_02e9: Unknown result type (might be due to invalid IL or missing references) //IL_02f9: Expected O, but got Unknown //IL_02f4: Unknown result type (might be due to invalid IL or missing references) //IL_02fe: Expected O, but got Unknown //IL_0303: Unknown result type (might be due to invalid IL or missing references) //IL_030d: Expected O, but got Unknown //IL_0312: Unknown result type (might be due to invalid IL or missing references) //IL_031c: Expected O, but got Unknown //IL_0321: Unknown result type (might be due to invalid IL or missing references) //IL_032b: Expected O, but got Unknown //IL_0330: Unknown result type (might be due to invalid IL or missing references) //IL_033a: Expected O, but got Unknown //IL_033f: Unknown result type (might be due to invalid IL or missing references) //IL_0349: Expected O, but got Unknown //IL_034e: Unknown result type (might be due to invalid IL or missing references) //IL_0358: Expected O, but got Unknown //IL_035d: Unknown result type (might be due to invalid IL or missing references) //IL_0367: Expected O, but got Unknown //IL_036c: Unknown result type (might be due to invalid IL or missing references) //IL_0376: Expected O, but got Unknown //IL_037b: Unknown result type (might be due to invalid IL or missing references) //IL_0385: Expected O, but got Unknown //IL_038a: Unknown result type (might be due to invalid IL or missing references) //IL_038f: Unknown result type (might be due to invalid IL or missing references) //IL_0396: Unknown result type (might be due to invalid IL or missing references) //IL_03a3: Expected O, but got Unknown //IL_039e: Unknown result type (might be due to invalid IL or missing references) //IL_03a8: Expected O, but got Unknown //IL_03ad: Unknown result type (might be due to invalid IL or missing references) //IL_03b7: Expected O, but got Unknown ModSettingsManager.SetModDescription("プレイヤーごとの DPS を HUD に表示します。フロアに入ってからの累計ダメージ ÷ 経過時間で計算します。"); ModSettingsManager.AddOption((BaseOption)new KeyBindOption(ToggleKey)); ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(HideWhenChatOpen)); ModSettingsManager.AddOption((BaseOption)new SliderOption(RefreshInterval, new SliderConfig { min = 0.05f, max = 1f, FormatString = "{0:F2} s" })); ModSettingsManager.AddOption((BaseOption)new ChoiceOption((ConfigEntryBase)(object)Anchor)); ModSettingsManager.AddOption((BaseOption)new SliderOption(OffsetX, new SliderConfig { min = -960f, max = 960f, FormatString = "{0:F0}" })); ModSettingsManager.AddOption((BaseOption)new SliderOption(OffsetY, new SliderConfig { min = -540f, max = 540f, FormatString = "{0:F0}" })); ModSettingsManager.AddOption((BaseOption)new ChoiceOption((ConfigEntryBase)(object)ChatBox)); ModSettingsManager.AddOption((BaseOption)new SliderOption(ChatBoxGap, new SliderConfig { min = 0f, max = 80f, FormatString = "{0:F0}" })); ModSettingsManager.AddOption((BaseOption)new SliderOption(ChatCenterOffsetX, new SliderConfig { min = -960f, max = 960f, FormatString = "{0:F0}" })); ModSettingsManager.AddOption((BaseOption)new SliderOption(ChatCenterOffsetY, new SliderConfig { min = -540f, max = 540f, FormatString = "{0:F0}" })); ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(MatchHudSkew)); ModSettingsManager.AddOption((BaseOption)new SliderOption(Scale, new SliderConfig { min = 0.4f, max = 3f, FormatString = "{0:F2}x" })); ModSettingsManager.AddOption((BaseOption)new SliderOption(ScaleStep, new SliderConfig { min = 0.01f, max = 0.5f, FormatString = "{0:F2}" })); ModSettingsManager.AddOption((BaseOption)new KeyBindOption(ScaleUpKey)); ModSettingsManager.AddOption((BaseOption)new KeyBindOption(ScaleDownKey)); ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(AutoSize)); ModSettingsManager.AddOption((BaseOption)new SliderOption(Width, new SliderConfig { min = 200f, max = 900f, FormatString = "{0:F0}" })); ModSettingsManager.AddOption((BaseOption)new SliderOption(Height, new SliderConfig { min = 60f, max = 600f, FormatString = "{0:F0}" })); ModSettingsManager.AddOption((BaseOption)new SliderOption(FontSize, new SliderConfig { min = 8f, max = 40f, FormatString = "{0:F0}" })); ModSettingsManager.AddOption((BaseOption)new SliderOption(MonospaceWidth, new SliderConfig { min = 0.4f, max = 1f, FormatString = "{0:F2} em" })); ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(ShowBackground)); ModSettingsManager.AddOption((BaseOption)new ColorOption(BackgroundColor)); ModSettingsManager.AddOption((BaseOption)new ColorOption(TextColor)); ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(HighlightSelf)); ModSettingsManager.AddOption((BaseOption)new ColorOption(SelfColor)); ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(ShowCharacterName)); ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(ShowMinionBreakdown)); ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(ShowDamageShare)); ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(ShowTeamTotal)); ModSettingsManager.AddOption((BaseOption)new IntSliderOption(NameMaxLength, new IntSliderConfig { min = 4, max = 24 })); ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(UseCommas)); } } internal sealed class PlayerDps { public float DirectDamage; public float MinionDamage; public string PlayerName; public string BodyName; public float TotalDamage => DirectDamage + MinionDamage; } [BepInPlugin("OchaDashiMan.MultiDPS", "MultiDPS", "1.0.0")] [BepInDependency(/*Could not decode attribute arguments.*/)] public class Plugin : BaseUnityPlugin { public const string Guid = "OchaDashiMan.MultiDPS"; public const string ModName = "MultiDPS"; public const string Version = "1.0.0"; internal const string RiskOfOptionsGuid = "com.rune580.riskofoptions"; internal static ManualLogSource Log; private Harmony _harmony; private void Awake() { //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Expected O, but got Unknown Log = ((BaseUnityPlugin)this).Logger; ModConfig.Init(((BaseUnityPlugin)this).Config); DpsTracker.Subscribe(); _harmony = new Harmony("OchaDashiMan.MultiDPS"); _harmony.PatchAll(typeof(HudPatch)); _harmony.PatchAll(typeof(ChatBoxPatch)); Log.LogInfo((object)"MultiDPS 1.0.0 loaded."); } private void OnDestroy() { DpsTracker.Unsubscribe(); Harmony harmony = _harmony; if (harmony != null) { harmony.UnpatchSelf(); } } } internal sealed class ScoreboardBootstrap : MonoBehaviour { private const float Timeout = 10f; private HUD _hud; private float _deadline; public void Bind(HUD hud) { _hud = hud; _deadline = Time.unscaledTime + 10f; } private void Update() { if ((Object)(object)_hud == (Object)null) { Object.Destroy((Object)(object)this); } else if (ScoreboardView.Attach(_hud)) { Object.Destroy((Object)(object)this); } else if (Time.unscaledTime >= _deadline) { Plugin.Log.LogWarning((object)"HUD の SpringCanvas を見つけられなかったため、スコアボードを表示できません。ゲーム側の UI 構造が変わった可能性があります。"); Object.Destroy((Object)(object)this); } } } internal sealed class ScoreboardView : MonoBehaviour { private struct Row { public string PlayerName; public string BodyName; public float Total; public float MinionTotal; public bool IsSelf; } private struct Cell { public string Name; public string Body; public string Dps; public string Share; public string Minion; public bool IsSelf; } private static ScoreboardView _instance; private const int ColumnGap = 2; private const string TeamLabel = "TEAM"; private const float PaddingX = 10f; private const float PaddingY = 8f; private static readonly Comparison<Row> ByTotalDesc = (Row a, Row b) => b.Total.CompareTo(a.Total); private static readonly Vector3[] CornerBuffer = (Vector3[])(object)new Vector3[4]; private HUD _hud; private RectTransform _root; private Image _background; private HGTextMeshProUGUI _text; private Transform _springCanvas; private Transform _hudCluster; private RectTransform _chatRect; private Vector2 _chatOriginalPosition; private bool _chatCaptured; private readonly StringBuilder _sb = new StringBuilder(512); private readonly List<Row> _rows = new List<Row>(8); private readonly List<Cell> _cells = new List<Cell>(8); private float _nextRefresh; public static bool Attach(HUD hud) { //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Expected O, but got Unknown //IL_00e3: Unknown result type (might be due to invalid IL or missing references) //IL_00e8: Unknown result type (might be due to invalid IL or missing references) //IL_00f7: Unknown result type (might be due to invalid IL or missing references) //IL_0102: Unknown result type (might be due to invalid IL or missing references) //IL_0117: Unknown result type (might be due to invalid IL or missing references) //IL_012b: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)_instance != (Object)null) { return true; } if ((Object)(object)hud == (Object)null) { return true; } if ((Object)(object)hud.mainUIPanel == (Object)null) { return false; } Transform val = hud.mainUIPanel.transform.Find("SpringCanvas"); if ((Object)(object)val == (Object)null) { return false; } Transform val2 = ResolveCluster(hud, val); GameObject val3 = new GameObject("MultiDPS"); val3.SetActive(false); RectTransform val4 = val3.AddComponent<RectTransform>(); ((Transform)val4).SetParent((ModConfig.MatchHudSkew.Value && (Object)(object)val2 != (Object)null) ? val2 : val, false); val3.AddComponent<LayoutElement>().ignoreLayout = true; Image val5 = val3.AddComponent<Image>(); Image val6 = (((Object)(object)hud.itemInventoryDisplay != (Object)null) ? ((Component)hud.itemInventoryDisplay).GetComponent<Image>() : null); if ((Object)(object)val6 != (Object)null) { val5.sprite = val6.sprite; val5.type = (Type)1; } GameObject val7 = new GameObject("Text"); RectTransform obj = val7.AddComponent<RectTransform>(); ((Transform)obj).SetParent((Transform)(object)val4, false); obj.anchorMin = Vector2.zero; obj.anchorMax = Vector2.one; obj.offsetMin = new Vector2(10f, 8f); obj.offsetMax = new Vector2(-10f, -8f); HGTextMeshProUGUI val8 = val7.AddComponent<HGTextMeshProUGUI>(); ((TMP_Text)val8).enableAutoSizing = false; ((TMP_Text)val8).enableWordWrapping = false; ((TMP_Text)val8).richText = true; ((Graphic)val8).raycastTarget = false; ((TMP_Text)val8).alignment = (TextAlignmentOptions)257; ScoreboardView scoreboardView = val3.AddComponent<ScoreboardView>(); scoreboardView._hud = hud; scoreboardView._springCanvas = val; scoreboardView._hudCluster = val2; scoreboardView._root = val4; scoreboardView._background = val5; scoreboardView._text = val8; val3.SetActive(true); _instance = scoreboardView; scoreboardView.ApplyLayout(); Plugin.Log.LogInfo((object)"スコアボードを HUD に取り付けました。"); return true; } private void OnDestroy() { RestoreChatBox(); if ((Object)(object)_instance == (Object)(object)this) { _instance = null; } } private void Update() { if ((Object)(object)_text == (Object)null || (Object)(object)_root == (Object)null) { return; } HandleInput(); bool flag = ModConfig.IsVisible.Value && (!ModConfig.HideWhenChatOpen.Value || !ChatBoxPatch.IsTyping); ((Behaviour)_text).enabled = flag; ((Behaviour)_background).enabled = flag && ModConfig.ShowBackground.Value; if (!flag) { RestoreChatBox(); return; } if (ModConfig.LayoutDirty) { ModConfig.LayoutDirty = false; ApplyLayout(); } if (Time.unscaledTime >= _nextRefresh) { _nextRefresh = Time.unscaledTime + Mathf.Max(0.05f, ModConfig.RefreshInterval.Value); Redraw(); } UpdateChatBoxPosition(); } private static void HandleInput() { //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_0019: 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_0044: Unknown result type (might be due to invalid IL or missing references) //IL_0062: 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) if (!PauseManager.isPaused && !ChatBoxPatch.IsTyping) { KeyboardShortcut value = ModConfig.ToggleKey.Value; if (((KeyboardShortcut)(ref value)).IsDown()) { ModConfig.IsVisible.Value = !ModConfig.IsVisible.Value; } value = ModConfig.ScaleUpKey.Value; if (((KeyboardShortcut)(ref value)).IsDown()) { AdjustScale(ModConfig.ScaleStep.Value); } value = ModConfig.ScaleDownKey.Value; if (((KeyboardShortcut)(ref value)).IsDown()) { AdjustScale(0f - ModConfig.ScaleStep.Value); } } } private static void AdjustScale(float delta) { float num = Mathf.Clamp(ModConfig.Scale.Value + delta, 0.4f, 3f); if (!Mathf.Approximately(num, ModConfig.Scale.Value)) { ModConfig.Scale.Value = num; } } private void ApplyLayout() { //IL_00a7: 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_00bf: Unknown result type (might be due to invalid IL or missing references) //IL_00df: Unknown result type (might be due to invalid IL or missing references) //IL_011f: 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_014d: Unknown result type (might be due to invalid IL or missing references) //IL_0162: Unknown result type (might be due to invalid IL or missing references) //IL_01a1: Unknown result type (might be due to invalid IL or missing references) //IL_010f: Unknown result type (might be due to invalid IL or missing references) ApplyParent(); Vector2 val = default(Vector2); switch (ModConfig.Anchor.Value) { case ScoreboardAnchor.AboveHealthBar: ((Vector2)(ref val))..ctor(0f, 0f); break; case ScoreboardAnchor.TopLeft: ((Vector2)(ref val))..ctor(0f, 1f); break; case ScoreboardAnchor.BottomRight: ((Vector2)(ref val))..ctor(1f, 0f); break; case ScoreboardAnchor.BottomLeft: ((Vector2)(ref val))..ctor(0f, 0f); break; case ScoreboardAnchor.TopCenter: ((Vector2)(ref val))..ctor(0.5f, 1f); break; default: ((Vector2)(ref val))..ctor(1f, 1f); break; } _root.anchorMin = val; _root.anchorMax = val; _root.pivot = val; _root.anchoredPosition = new Vector2(ModConfig.OffsetX.Value, ModConfig.OffsetY.Value); if (!ModConfig.AutoSize.Value) { _root.sizeDelta = new Vector2(ModConfig.Width.Value, ModConfig.Height.Value); } ((Transform)_root).localScale = Vector3.one * Mathf.Clamp(ModConfig.Scale.Value, 0.4f, 3f); ((Transform)_root).localRotation = Quaternion.identity; ((Graphic)_background).color = ModConfig.BackgroundColor.Value; ((Behaviour)_background).enabled = ModConfig.ShowBackground.Value; ((TMP_Text)_text).fontSize = ModConfig.FontSize.Value; ((Graphic)_text).color = ModConfig.TextColor.Value; } private void Redraw() { //IL_02e5: Unknown result type (might be due to invalid IL or missing references) float elapsed = DpsTracker.Elapsed; _rows.Clear(); float num = CollectRows(); _rows.Sort(ByTotalDesc); string text = (ModConfig.UseCommas.Value ? "N0" : "F0"); int limit = Mathf.Clamp(ModConfig.NameMaxLength.Value, 4, 24); bool value = ModConfig.ShowCharacterName.Value; bool value2 = ModConfig.ShowDamageShare.Value; bool value3 = ModConfig.ShowMinionBreakdown.Value; bool flag = ModConfig.ShowTeamTotal.Value && _rows.Count > 0; _cells.Clear(); int num2 = 0; int num3 = 0; int num4 = 0; int num5 = 0; int num6 = 0; for (int i = 0; i < _rows.Count; i++) { Row row = _rows[i]; Cell item = new Cell { Name = Truncate(row.PlayerName, limit), Body = (value ? Truncate(row.BodyName, limit) : string.Empty), Dps = (row.Total / elapsed).ToString(text), Share = (value2 ? FormatShare(row.Total, num) : string.Empty), Minion = ((value3 && row.MinionTotal > 0f) ? ("(+" + (row.MinionTotal / elapsed).ToString(text) + ")") : string.Empty), IsSelf = row.IsSelf }; num2 = Mathf.Max(num2, item.Name.Length); num3 = Mathf.Max(num3, item.Body.Length); num4 = Mathf.Max(num4, item.Dps.Length); num5 = Mathf.Max(num5, item.Minion.Length); num6 = Mathf.Max(num6, item.Share.Length); _cells.Add(item); } string text2 = null; if (flag) { text2 = (num / elapsed).ToString(text); num2 = Mathf.Max(num2, "TEAM".Length); num4 = Mathf.Max(num4, text2.Length); } _sb.Length = 0; _sb.Append("<mspace=").Append(ModConfig.MonospaceWidth.Value.ToString("0.###", CultureInfo.InvariantCulture)).Append("em>"); for (int j = 0; j < _cells.Count; j++) { Cell cell = _cells[j]; int num7; if (cell.IsSelf) { num7 = (ModConfig.HighlightSelf.Value ? 1 : 0); if (num7 != 0) { _sb.Append("<color=#").Append(ColorUtility.ToHtmlStringRGB(ModConfig.SelfColor.Value)).Append('>'); } } else { num7 = 0; } AppendRow(cell.Name, cell.Body, cell.Dps, cell.Minion, cell.Share, num2, num3, num4, num5, num6); if (num7 != 0) { _sb.Append("</color>"); } _sb.Append('\n'); } if (flag) { int num8 = num2 + num4 + 2; if (num3 > 0) { num8 += num3 + 2; } if (num5 > 0) { num8 += num5 + 2; } if (num6 > 0) { num8 += num6 + 2; } _sb.Append('-', num8).Append('\n'); AppendRow("TEAM", string.Empty, text2, string.Empty, string.Empty, num2, num3, num4, num5, num6); } _sb.Append("</mspace>"); ((TMP_Text)_text).text = _sb.ToString(); ResizeToFitText(); UpdateFollowPosition(); } private void AppendRow(string name, string body, string dps, string minion, string share, int nameWidth, int bodyWidth, int dpsWidth, int minionWidth, int shareWidth) { _sb.Append(name.PadRight(nameWidth)); if (bodyWidth > 0) { _sb.Append(' ', 2).Append(body.PadRight(bodyWidth)); } _sb.Append(' ', 2).Append(dps.PadLeft(dpsWidth)); if (minionWidth > 0) { _sb.Append(' ', 2).Append(minion.PadRight(minionWidth)); } if (shareWidth > 0) { _sb.Append(' ', 2).Append(share.PadLeft(shareWidth)); } } private static string FormatShare(float total, float teamTotal) { return ((teamTotal > 0f) ? (total * 100f / teamTotal) : 0f).ToString("F0") + "%"; } private void ResizeToFitText() { //IL_0035: Unknown result type (might be due to invalid IL or missing references) if (ModConfig.AutoSize.Value) { _root.sizeDelta = new Vector2(((TMP_Text)_text).preferredWidth + 20f, ((TMP_Text)_text).preferredHeight + 16f); } } private void ApplyParent() { Transform val = ((ModConfig.MatchHudSkew.Value && (Object)(object)_hudCluster != (Object)null) ? _hudCluster : _springCanvas); if ((Object)(object)val != (Object)null && (Object)(object)((Transform)_root).parent != (Object)(object)val) { ((Transform)_root).SetParent(val, false); } } private void UpdateFollowPosition() { //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_0108: 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_0129: Unknown result type (might be due to invalid IL or missing references) //IL_013a: Unknown result type (might be due to invalid IL or missing references) //IL_0140: 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) //IL_0082: 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_008c: Unknown result type (might be due to invalid IL or missing references) //IL_009f: Unknown result type (might be due to invalid IL or missing references) //IL_00a5: Unknown result type (might be due to invalid IL or missing references) //IL_00d7: Unknown result type (might be due to invalid IL or missing references) //IL_00dc: Unknown result type (might be due to invalid IL or missing references) //IL_00e0: Unknown result type (might be due to invalid IL or missing references) //IL_00e6: Unknown result type (might be due to invalid IL or missing references) if (ModConfig.Anchor.Value != ScoreboardAnchor.AboveHealthBar || (Object)(object)_hud == (Object)null) { return; } Transform parent = ((Transform)_root).parent; if ((Object)(object)parent == (Object)null) { return; } RectTransform val = RectOf((Component)(object)_hud.healthBar); if ((Object)(object)val == (Object)null) { return; } Vector3 val2 = TopLeftIn(parent, val); RectTransform val3 = RectOf((Component)(object)_hud.buffDisplay); if ((Object)(object)val3 != (Object)null && ((Component)val3).gameObject.activeInHierarchy) { Vector3 val4 = TopLeftIn(parent, val3); val2.x = Mathf.Min(val2.x, val4.x); val2.y = Mathf.Max(val2.y, val4.y); } if (ModConfig.ChatBox.Value == ChatBoxHandling.PlaceAboveChat) { RectTransform val5 = ResolveChatRect(); if ((Object)(object)val5 != (Object)null) { Vector3 val6 = TopLeftIn(parent, val5); val2.y = Mathf.Max(val2.y, val6.y + ModConfig.ChatBoxGap.Value); } } _root.pivot = Vector2.zero; ((Transform)_root).localPosition = new Vector3(val2.x + ModConfig.OffsetX.Value, val2.y + ModConfig.OffsetY.Value, val2.z); } private void UpdateChatBoxPosition() { //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_003b: 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) RectTransform val = ResolveChatRect(); if ((Object)(object)val == (Object)null) { _chatCaptured = false; return; } if (!_chatCaptured || (Object)(object)val != (Object)(object)_chatRect) { _chatRect = val; _chatOriginalPosition = val.anchoredPosition; _chatCaptured = true; } val.anchoredPosition = _chatOriginalPosition; Transform parent = ((Transform)val).parent; if (!((Object)(object)parent == (Object)null)) { switch (ModConfig.ChatBox.Value) { case ChatBoxHandling.PushChatUp: PushChatAboveScoreboard(val, parent); break; case ChatBoxHandling.MoveToCenter: MoveChatToCenter(val, parent); break; } } } private void PushChatAboveScoreboard(RectTransform chatRect, Transform chatParent) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0028: 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_0056: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Unknown result type (might be due to invalid IL or missing references) float y = TopLeftIn(chatParent, _root).y; chatRect.GetWorldCorners(CornerBuffer); float y2 = chatParent.InverseTransformPoint(CornerBuffer[0]).y; float num = y + ModConfig.ChatBoxGap.Value - y2; if (num > 0f) { chatRect.anchoredPosition = _chatOriginalPosition + new Vector2(0f, num); } } private void MoveChatToCenter(RectTransform chatRect, Transform chatParent) { //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0028: 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_003f: Unknown result type (might be due to invalid IL or missing references) //IL_0040: Unknown result type (might be due to invalid IL or missing references) //IL_004a: 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_0054: 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_0060: Unknown result type (might be due to invalid IL or missing references) //IL_0065: Unknown result type (might be due to invalid IL or missing references) //IL_006a: Unknown result type (might be due to invalid IL or missing references) //IL_006f: Unknown result type (might be due to invalid IL or missing references) //IL_0071: Unknown result type (might be due to invalid IL or missing references) //IL_0072: Unknown result type (might be due to invalid IL or missing references) //IL_0077: Unknown result type (might be due to invalid IL or missing references) //IL_007c: Unknown result type (might be due to invalid IL or missing references) //IL_007e: Unknown result type (might be due to invalid IL or missing references) //IL_0094: 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_009e: Unknown result type (might be due to invalid IL or missing references) //IL_00a2: Unknown result type (might be due to invalid IL or missing references) //IL_00a7: Unknown result type (might be due to invalid IL or missing references) //IL_00a9: Unknown result type (might be due to invalid IL or missing references) //IL_00aa: 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) RectTransform val = ResolveCanvasRect(); if (!((Object)(object)val == (Object)null)) { chatRect.GetWorldCorners(CornerBuffer); Vector3 val2 = chatParent.InverseTransformPoint(CornerBuffer[0]); Vector3 val3 = chatParent.InverseTransformPoint(CornerBuffer[2]); Vector2 val4 = Vector2.op_Implicit((val2 + val3) * 0.5f); Rect rect = val.rect; Vector3 val5 = ((Transform)val).TransformPoint(Vector2.op_Implicit(((Rect)(ref rect)).center)); Vector2 val6 = Vector2.op_Implicit(chatParent.InverseTransformPoint(val5)); val6 += new Vector2(ModConfig.ChatCenterOffsetX.Value, ModConfig.ChatCenterOffsetY.Value); chatRect.anchoredPosition = _chatOriginalPosition + (val6 - val4); } } private RectTransform ResolveCanvasRect() { Canvas val = (((Object)(object)_background != (Object)null) ? ((Graphic)_background).canvas : null); if (!((Object)(object)val != (Object)null)) { return null; } Transform transform = ((Component)val).transform; return (RectTransform)(object)((transform is RectTransform) ? transform : null); } private void RestoreChatBox() { //IL_001e: Unknown result type (might be due to invalid IL or missing references) if (_chatCaptured && !((Object)(object)_chatRect == (Object)null)) { _chatRect.anchoredPosition = _chatOriginalPosition; } } private static RectTransform ResolveChatRect() { ChatBox current = ChatBoxPatch.Current; if ((Object)(object)current == (Object)null) { return null; } RectTransform standardChatboxRect = current.standardChatboxRect; if (!((Object)(object)standardChatboxRect == (Object)null)) { return standardChatboxRect; } return null; } private static Vector3 TopLeftIn(Transform space, RectTransform rect) { //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) rect.GetWorldCorners(CornerBuffer); return space.InverseTransformPoint(CornerBuffer[1]); } private static RectTransform RectOf(Component component) { if (!((Object)(object)component == (Object)null)) { Transform transform = component.transform; return (RectTransform)(object)((transform is RectTransform) ? transform : null); } return null; } private static Transform ResolveCluster(HUD hud, Transform spring) { RectTransform val = RectOf((Component)(object)hud.healthBar); if ((Object)(object)val == (Object)null) { return null; } Transform val2 = (Transform)(object)val; while ((Object)(object)val2.parent != (Object)null && (Object)(object)val2.parent != (Object)(object)spring) { val2 = val2.parent; } if (!((Object)(object)val2.parent == (Object)(object)spring)) { return null; } return val2; } private float CollectRows() { LocalUser firstLocalUser = LocalUserManager.GetFirstLocalUser(); NetworkUser val = ((firstLocalUser != null) ? firstLocalUser.currentNetworkUser : null); float num = 0f; IList<NetworkUser> readOnlyInstancesList = NetworkUser.readOnlyInstancesList; for (int i = 0; i < readOnlyInstancesList.Count; i++) { NetworkUser val2 = readOnlyInstancesList[i]; if (!((Object)(object)val2 == (Object)null)) { DpsTracker.TryGet(val2, out var entry); float num2 = entry?.DirectDamage ?? 0f; float num3 = entry?.MinionDamage ?? 0f; Row item = new Row { PlayerName = ResolvePlayerName(val2, entry), BodyName = ResolveBodyName(val2, entry), Total = num2 + num3, MinionTotal = num3, IsSelf = ((Object)(object)val != (Object)null && (Object)(object)val2 == (Object)(object)val) }; _rows.Add(item); num += item.Total; } } return num; } private static string ResolvePlayerName(NetworkUser user, PlayerDps entry) { //IL_0003: 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) string text = null; try { NetworkPlayerName networkPlayerName = user.GetNetworkPlayerName(); text = ((NetworkPlayerName)(ref networkPlayerName)).GetResolvedName(); } catch { } if (string.IsNullOrEmpty(text)) { text = user.userName; } if (string.IsNullOrEmpty(text)) { if (entry == null || string.IsNullOrEmpty(entry.PlayerName)) { return "???"; } return entry.PlayerName; } if (entry != null) { entry.PlayerName = text; } return text; } private static string ResolveBodyName(NetworkUser user, PlayerDps entry) { CharacterMaster master = user.master; CharacterBody val = (((Object)(object)master != (Object)null) ? master.GetBody() : null); if ((Object)(object)val != (Object)null) { string displayName = val.GetDisplayName(); if (!string.IsNullOrEmpty(displayName)) { if (entry != null) { entry.BodyName = displayName; } return displayName; } } if (entry == null || entry.BodyName == null) { return string.Empty; } return entry.BodyName; } private static string Truncate(string value, int limit) { if (string.IsNullOrEmpty(value)) { return string.Empty; } if (value.Length <= limit) { return value; } return value.Substring(0, limit); } } } namespace MultiDPS.Patches { [HarmonyPatch(typeof(ChatBox))] internal static class ChatBoxPatch { private static ChatBox _current; public static ChatBox Current { get { if (!((Object)(object)_current == (Object)null)) { return _current; } return null; } } public static bool IsTyping { get { if ((Object)(object)_current != (Object)null && (Object)(object)_current.inputField != (Object)null) { return _current.inputField.isFocused; } return false; } } [HarmonyPatch("Start")] [HarmonyPostfix] private static void Start(ChatBox __instance) { _current = __instance; } } [HarmonyPatch] internal static class HudPatch { private static MethodBase ResolveAwake() { return AccessTools.Method(typeof(HUD), "Awake", (Type[])null, (Type[])null); } [HarmonyPrepare] private static bool Prepare() { if (ResolveAwake() != null) { return true; } Plugin.Log.LogError((object)"RoR2.UI.HUD.Awake が見つかりませんでした。ゲーム側の更新で変わった可能性があります。MultiDPS のスコアボードは無効になります。"); return false; } [HarmonyTargetMethod] private static MethodBase TargetMethod() { return ResolveAwake(); } [HarmonyPostfix] private static void Postfix(HUD __instance) { try { if (!ScoreboardView.Attach(__instance)) { ((Component)__instance).gameObject.AddComponent<ScoreboardBootstrap>().Bind(__instance); } } catch (Exception ex) { Plugin.Log.LogError((object)("スコアボードの生成に失敗しました: " + ex)); } } } }