EasyHUD
[AI-generated] Network quality HUD: ping, connection quality, up/down bandwidth, player count, styled to match the Day & Time panel. Client-only, no server sync.
模組介紹 作者原文
EasyHUD
AI 生成聲明:本模組由 AI 智能體(WorkBuddy)在用戶的明確需求與逐項驗收下編寫;
功能設計、真機測試與發佈決定均由用戶主導。
在 HUD 上實時顯示網絡質量的純客戶端模組 —— 不用再按 F2 去看那一大堆調試信息。
面板貼在「Display Day & Time in HUD」面板的正左側,
同一水平線、同一高度、同字體同字號同顏色同背景,看起來就像同一套 UI 的一部分。
┌──────────────────────────┬──────────────────────────┐
│ Ping 42ms 99% ↓3.4 ↑0.8 KB/s P 3 │ 第 128 天 14:32 │
└──────────────────────────┴──────────────────────────┘
↑ 本模組(EasyHUD) ↑ 天數/時間面板
功能
| 項 | 默認 | 說明 |
|---|---|---|
| Ping | 開 | 格式 Ping 42ms |
| 連接質量 | 開 | 格式 99%,原版 F2 裏 99% / 98% 的那一項 |
| 上下行帶寬 | 開 | 格式 ↓3.4 ↑0.8 KB/s |
| 在線玩家數 | 開 | 格式 P 3(含主機) |
| 低質量變色 | 開 | 正常時與天數面板同色;Ping>120ms 或質量250ms 或質量<50% 變紅 |
| 單人自動隱藏 | 開 | 自己開主機且只有自己時不顯示(沒有網絡流量,顯示 0 沒意義) |
每一項都能在配置裏單獨關掉。刷新間隔默認 0.5 秒(網絡統計本身是低頻採樣的,刷太快只會讓數字亂跳)。
⚠️ 關於「丟包率」—— 請先看這一段
Valheim 和 Steam 都沒有暴露"丟包率"這個數字。 我把鏈路挖到了底:
ConnectPanel.Update ← 原版 F2 面板
→ ZNet.GetNetStats(out localQuality, out remoteQuality, out ping, out outByteSec, out inByteSec)
→ ZSteamSocket.GetConnectionQuality(...)
→ Steamworks.SteamNetworkingSockets.GetConnectionRealTimeStatus(...)
→ SteamNetConnectionRealTimeStatus_t { m_nPing, m_flConnectionQualityLocal,
m_flConnectionQualityRemote,
m_flOut|InPacketsPerSec,
m_flOut|InBytesPerSec,... }
這個結構體裏只有"包速率",沒有"丟包率"。Steam 給出的最接近的指標就是
m_flConnectionQualityLocal / Remote(0~1 的連接質量,已經綜合了丟包、延遲、抖動)。
所以本 HUD 用 連接質量 % 來反映網絡好壞:丟包或延遲一惡化,它就會明顯掉下來,
這也是原版 F2 面板顯示的那兩個百分比。若你更希望看到數字化的延遲波動,
可以關注 Ping 與帶寬兩項的變化。
(理論上還有一條路:Steamworks.NET 的 GetDetailedConnectionStatus 會返回一段人類可讀的文本,
裏面帶 dropped 計數 —— 但它是給人看的字符串、格式隨 Steam 版本變、且只在 Steam 後端有效,
做成正式功能太脆弱,本模組沒有采用。)
位置與"風格統一"是怎麼做到的
不是硬編碼座標,也不要求你去抄一遍配置:
- 進遊戲後,本模組會去找另一個模組創建的 DayTimePanel(掛在 Hud.m_rootObject 下)。
- 找到後直接繼承它的 UI 組件:字體、字號、字色、描邊顏色與偏移、背景 sprite / 顏色、面板高度。
- 位置按它的左邊緣計算:本面板右邊緣 = 它的左邊緣 − Gap,y 與它完全相同。
所以:
- 你改那個模組的字號 / 顏色 / 背景,本 HUD 會自動跟着變(改完重啓遊戲)。
- 你把那個模組的「Display under minimap」打開(面板挪到小地圖下方),本 HUD 也跟着挪到同一行。
- 卸載那個模組也沒關係:本 HUD 會退回 [4 - Fallback Style] 裏的內置樣式,
默認值就是那個模組的默認外觀(AveriaSansLibre-Bold / 16 / FFFFFFCA / 背景 00000064 / 高 30)。
面板寬度默認按文字自動收縮;想讓兩個面板一樣寬,把 PanelWidth 填成 200 即可。
配置
BepInEx/config/easyhud.client.only.cfg
| 分區 | 鍵 | 默認 | 說明 |
|---|---|---|---|
| 1 - General | Enabled | true | 總開關 |
| 1 - General | HideWhenSingleplayer | true | 單人時隱藏整個面板 |
| 1 - General | UpdateInterval | 0.5 | 刷新間隔(秒),推薦 0.25~1.0 |
| 1 - General | MatchDayTimeStyle | true | 自動繼承天數面板的樣式 |
| 1 - General | PanelWidth | 0 | 0 = 按文字自動;填 200 = 與天數面板同寬 |
| 1 - General | Gap | 0 | 與天數面板的間距(像素) |
| 1 - General | NormalizeOnHost | true | 自己當主機時顯示平均值(見下) |
| 2 - Content | ShowPing / ShowQuality / ShowBandwidth / ShowPlayers | true | 逐項開關 |
| 2 - Content | ArrowDown / ArrowUp | ↓ / ↑ | 上下行箭頭;若字體顯示成方塊就改成 v / ^ |
| 3 - Warning Colors | Enabled | true | 低質量變色 |
| 3 - Warning Colors | WarnPingMs / BadPingMs | 120 / 250 | Ping 閾值 |
| 3 - Warning Colors | WarnQualityPct / BadQualityPct | 80 / 50 | 質量閾值 |
| 3 - Warning Colors | WarnColor / BadColor | FFFFA0FF / FF6B6BFF | 黃 / 紅 |
| 4 - Fallback Style | FontSize / FontName / FontColor | 16 / AveriaSansLibre-Bold / FFFFFFCA | 找不到天數面板時用 |
| 4 - Fallback Style | OutlineEnabled / OutlineColor / BackgroundColor | true / 000000FF / 00000064 | 同上 |
關於 NormalizeOnHost
遊戲底層的 ZNet.GetNetStats 在主機模式下是把所有客戶端的值累加的
(原版 F2 也這樣,所以主機開 3 人時 F2 會顯示 300% / 1500ms 這種數字,其實每個人都不差)。
- true(默認):除以有效連接數,顯示平均值,更容易看懂。
- false:和 F2 面板完全一致的累加值。
自己是客戶端連別人時,這個開關沒有任何影響。
爲什麼聯機安全
- 只 patch 了 Hud.Awake(只是爲了掛 UI),不碰任何網絡/遊戲邏輯。
- 無 Jotunn 依賴、無 NetworkCompatibility 聲明、無內嵌 ServerSync / ConditionalConfigSync。
- 依賴只有:mscorlib / assembly_valheim / BepInEx / 0Harmony / UnityEngine.CoreModule / UnityEngine.UI / UnityEngine.TextRenderingModule。
- 純讀統計 + 本地畫 UI,主機和隊友不裝也照樣玩,不會讓你連不上任何主機。
安裝
- r2modman:Online → Install from file → 選 EasyHUD-1.0.0.zip
- 手動:把 EasyHUD.dll 放進 BepInEx/plugins/
排錯
進遊戲後看 BepInEx/LogOutput.log,應出現:
[Info: EasyHUD] 已掛載補丁類:HudAwakePatch
[Info: EasyHUD] Hud.Awake() prefix=0 postfix=1 OK
[Info: EasyHUD] Harmony 補丁掛載完成:1/1 成功。
[Info: EasyHUD] 網絡面板已創建:父節點 Hud.m_rootObject,初始位置 (…),字體 AveriaSansLibre-Bo
安裝與使用 安裝:BepInEx 外掛
- 本站下載的壓縮包就是模組本體,通常是 BepInEx 外掛(解壓後得到 .dll 或外掛資料夾)。
- 建議流程:用社群模組管理器(如 r2modman)選中本遊戲後匯入該模組,管理器會自動裝好 BepInEx 前置並處理依賴。
- 手動流程:先在遊戲目錄裝好 BepInEx 載入器,再把解壓出的 .dll 或外掛資料夾放進 BepInEx/plugins/。
- 啟動遊戲,BepInEx 控制台會列印載入日誌;確認這個模組出現在日誌裡即為安裝成功。
帶「前置依賴」的模組需要一併安裝,否則不會載入。功能開關通常在遊戲內或外掛自帶的設定檔裡調整。 多人連線時,主機與所有用戶端需要安裝一致的模組。
下面這些內容需要先安裝,否則該模組不會生效: