
MultiDPS
Shows a per-player DPS scoreboard on the HUD, averaged over the current stage.MultiDPS
Risk of Rain 2 用のクライアントサイド MOD。プレイヤーごとの DPS を HUD に並べて表示する。
既存の DPSMeter はダメージを「自分 / 自分のミニオン / 他プレイヤー全員の合計 / チーム全体」の 4 つに集約してしまうため、誰が何 DPS 出しているかの内訳が取れない。MultiDPS はそれを プレイヤー単位に分解する。
Alice Railgunner 1,240 38%
You Loader 902 28%
Bob Engineer 640 20% (+180)
------------------------------------
TEAM 3,232
計測方法
フロア単位の累計平均で計算する。
DPS = そのフロアで与えた総ダメージ / フロアに入ってからの経過時間
- 直近 N 秒のローリングウィンドウ(瞬間火力)ではない。何もしない時間が続けば数値は下がっていく
- 分母は全員共通なので、プレイヤー間の比較は公平になる
- 新しいフロアに入ると無条件で全リセットされる。ステージの種類(隠しステージかどうか)も ループ回数も見ていないので、Bazaar やゴールドショアも普通に 1 フロアとして扱われる
- 前のフロアの記録は保持しない
時計
分母は素の実時間(Time.unscaledTime)で、フロアに入った瞬間からの差分を取る。
画面右上のランタイマー(Run.GetRunStopwatch())は使わない。
あれは Run.ShouldUpdateRunStopwatch の条件により、シーンが Stage でも
TimedIntermission でもないとき(Bazaar、ゴールドショアなどの Intermission)に止まる。
ゴールドショアは「タイマーが止まったまま戦うステージ」なので、
タイマー基準にするとあの戦闘が丸ごと計測対象外になってしまう。
その代わり、ポーズ中も分母は進む。長時間ポーズすると全員の DPS が下がって見える。
(+180) はタレット・ドローン・召喚物が出したぶん。所有者を最大 4 段まで遡って持ち主に紐付ける。
仕組み
ダメージは GlobalEventManager.onClientDamageNotified から拾っている。
このイベントの元になる DamageDealtMessage は、サーバーが NetworkServer.SendToAll で
全クライアントへ無条件にブロードキャストしているため、
- ホストでもクライアントでも全プレイヤーのダメージを観測できる
- 他のプレイヤーや、ホストが MOD を入れている必要はない
- ネットワークへは何も送信しないので、バニラサーバーでも安全に動く
数値は DamageReport.damageDealt(実際に通ったダメージ)なので、オーバーキル分は含まれない。
「理論火力」ではなく「実効 DPS」の指標になる。
操作
| 操作 | 既定 |
|---|---|
| 表示 / 非表示 | F9 |
その他の設定は Risk of Options の設定画面、または
BepInEx/config/main3.multidps.cfg から変更できる。
位置・サイズ・文字サイズ・色・各列の表示有無・名前の桁数などを調整できる。
列がずれる場合は Monospace Width を微調整する(フォント幅に対する等幅指定の値)。
ビルド
Directory.Build.props にゲームと MOD プロファイルのパスが書いてある。環境が違う場合はここを直す。
dotnet build MultiDPS.sln -c Release
ビルドが通ると MultiDPS.dll はプロファイルの BepInEx/plugins/MultiDPS/ へ自動配置される。
パスをその場で上書きすることもできる。
dotnet build MultiDPS.sln -c Release /p:RoR2Dir="D:\Games\Risk of Rain 2"
参照している DLL はすべてゲームと BepInEx に既にあるものなので、NuGet パッケージの追加は不要。
ターゲットは netstandard2.1(RoR2.dll と UnityEngine.UI.dll が netstandard 2.1 を参照しているため、
2.0 では CS1705 で通らない)。
構成
| ファイル | 役割 |
|---|---|
Plugin.cs |
BepInEx のエントリポイント。イベント購読と Harmony パッチの適用 |
Attribution.cs |
攻撃者の GameObject から、帰属させるべきプレイヤーを割り出す |
PlayerDps.cs |
1 人分の累計ダメージ |
DpsTracker.cs |
全体の集計とフロア単位のリセット |
ScoreboardView.cs |
HUD 上の描画 |
ScoreboardBootstrap.cs |
HUD の初期化順が噛み合わなかったときの取り付け再試行 |
ModConfig.cs |
設定と Risk of Options 連携 |
Patches/HudPatch.cs |
HUD.Awake にフックしてスコアボードを生成 |
Patches/ChatBoxPatch.cs |
チャット入力中を検知してトグルキーを無効化 |