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.
MultiDPS
Shows a per-player DPS scoreboard on the HUD, averaged over the current stage.
By OchaDashiMan
| Date uploaded | 15 hours ago |
| Version | 1.0.0 |
| Download link | OchaDashiMan-MultiDPS-1.0.0.zip |
| Downloads | 3 |
| Dependency string | OchaDashiMan-MultiDPS-1.0.0 |
This mod requires the following mods to function
RiskofThunder-RoR2BepInExPack
Simplify the modding ecosystem of Risk of Rain 2, making it easier for modders to create and maintain their mods while preventing harmful bugs.
Preferred version: 1.43.0Rune580-Risk_Of_Options
A convenient API for adding BepInEx ConfigEntry's to a option menu
Preferred version: 2.8.5README
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 |
チャット入力中を検知してトグルキーを無効化 |