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 或质量<80% 变黄;Ping>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-Bold。
[Info : EasyHUD] 已找到「DayTimePanel」面板并贴到其左侧:它的位置 (…) / 尺寸 (…) → 本面板 y=-25,样式来源=继承它的 UI 组件
| 现象 | 原因 / 处理 |
|---|---|
| 完全看不到面板 | 单人游戏时默认隐藏 → 进多人或把 HideWhenSingleplayer 改成 false |
| 面板位置不对 / 没贴在一起 | 日志里搜「已找到「DayTimePanel」」;若没有这行,说明没找到那个面板(它没装或被改名),此时本 HUD 用回退坐标 |
| 文字显示成方块 | 换 FontName([4 - Fallback Style]),或把 ArrowDown / ArrowUp 换成 v / ^ |
| Ping 一直是 0 | 该数据来自 Steam 的实时连接状态,只在真正联机时才有值;另外主机模式请见 NormalizeOnHost |


