聊天与 HUD
基本信息
| 属性 | 值 |
|---|---|
| 源目录 | src/main/java/com/mitchej123/hodgepodge/client/(26 个 Java 文件) |
| 聊天处理 | client/chat/ChatHandler.java + client/chat/ChatComponentCount.java |
| F3 调试屏扩展 | client/DebugScreenHandler.java |
| 区块生成统计 | client/ChunkGenDebugHandler.java |
| 分配速率 HUD | client/AllocationRateHUD.java |
| 快速进入世界 | client/QuickPlay.java |
| 模组列表扩展 | client/bettermodlist/InfoButton.java + SortType.java |
| 相关页 | 按键与 F3 快捷键、指令 |
功能
以下 6 个子系统都在客户端侧,不影响服务端逻辑。
聊天压缩
TweaksConfig.compactChat(默认 true)控制。由 mixins/early/minecraft/MixinGuiNewChat_CompactChat.java:37 注入 GuiNewChat 实现。
机制(ChatHandler.tryCompactMessage,:15-25):
- 聊天为空则直接返回 false
- 取首行
chatLines.get(0),与新消息比对 - 相同则给新消息挂一个
ChatComponentCount子节点并返回 true —— Mixin 据此删除原行(deleteMessage.set(... && chatLineId == 0))
计数徽标的显示形式是 ChatComponentCount:EnumChatFormatting.GRAY + " (" + count + ")"(ChatComponentCount.java:9),即灰色的 (N)。
一个易忽略的细节
areMessagesIdentical(ChatHandler.java:27-48)用两种比较方式,因为上一行可能已经带计数后缀:
size1 == size2:直接imsg.equals(prevMsg),相等则把previousCount复位为 1size1 + 1 == size2:临时移除上一行末尾的ChatComponentCount再比较,比较完放回原位;相等则继承其count
previousCount 是 ChatHandler 的静态字段,跨聊天行共享。
F3 调试屏扩展
DebugScreenHandler(client/DebugScreenHandler.java)以 EventPriority.LOWEST 订阅 RenderGameOverlayEvent.Text,仅在 showDebugInfo 为 true 时生效。
插入策略:先在 event.right 中找到以 "Allocated memory: " 开头的行,把 offset 定为该行下标 + 1,然后依次插入(:43-68):
| 位置 | 内容 | 条件 |
|---|---|---|
offset |
分配速率文本(AllocationRateHUD.updateText()) |
总是 |
1 + offset |
IntCache.getCacheSizes() |
总是 |
2 + offset |
空行 | TweaksConfig.addSystemInfo |
3 + offset |
Java: <版本> <32/64>bit (<厂商>) |
同上 |
4 + offset |
GPU: <名称> |
同上 |
5 + offset |
OpenGL: <版本> |
同上 |
6 + offset |
CPU Cores: <可用处理器数> |
同上 |
7 + offset |
OS: <名> (<版本>, <架构>) |
同上 |
8 + offset |
空行 | TweaksConfig.addSystemInfo 且 DebugConfig.renderDebug |
9 + offset |
renderDebugMode: <n> |
同上 |
32/64 位判定依次尝试 3 个系统属性:
sun.arch.data.model、com.ibm.vm.bitmode、os.arch(DebugScreenHandler.check64bit(),:71-81)。
分配速率 HUD
AllocationRateHUD 由 /allocationshud 指令切换注册。与 F3 扩展共用同一个实例(DebugScreenHandler 内持有 allocRate 字段)。
独立显示时(!showDebugInfo,即平时也显示)画在屏幕右上角(:21-23):
- 右上:
Allocation rate: <n> MB/s,颜色0xFFFFFFFF,右边距 2 px,y = 2 - 左上:
FPS: <mc.debugFPS>,y = 2
采样逻辑(:29-38):每满 1 秒用 freeMemory() 差值算速率,缓存到 cachedText,因此 HUD 数字每秒最多跳一次。
区块生成统计
ChunkGenDebugHandler(client/ChunkGenDebugHandler.java)在 F3 屏左侧显示,由 DebugConfig.showChunkGenDebug 控制(默认 false)。源码注释注明「Singleplayer only」。数据来自 mixins/hooks/ChunkGenStats.java / ChunkGenBudget.java / ChunkGenScheduler.java 三个钩子类,对应 SpeedupsConfig 的区块生成调度功能。
快速进入世界(QuickPlay)
QuickPlay(client/QuickPlay.java)是现代版 --quickPlaySingleplayer / --quickPlayMultiplayer 启动参数向 1.7.10 的回移。
| 输入 | 键 | 说明 |
|---|---|---|
| LaunchWrapper 参数 | hodgepodge.quickPlay.singleplayer / hodgepodge.quickPlay.multiplayer |
黑板(Launch.blackboard) |
JVM -D |
quickPlaySingleplayer / quickPlayMultiplayer |
系统属性 |
- 游戏参数优先于 JVM 参数(源码注释
// Game args win over JVM args,:54) - 世界可填存档文件夹名、显示名,或字面量
latest - 两者同时给定时,丢弃服务器地址并打 WARN:
Quick play: both a world and a server were requested, ignoring the server '<address>'(:47-49) - 触发时机:客户端 tick END 阶段,直到玩家进入主菜单(
!theWorld != null且currentScreen instanceof GuiMainMenu)才执行一次,随后从事件总线注销(:61-67)
模组列表增强
client/bettermodlist/InfoButton.java 与 SortType.java 为 Better Mod List 提供 Hodgepodge 条目的说明按钮与排序项,仅在安装该模组时生效。
相关条目
- 按键与 F3 快捷键 - F3+A/B/C/D/H/P/Q/S/T 与第三方键位解绑
- Tweaks 配置 -
compactChat/chatLength/addSystemInfo/bedMessageAboveHotbar - Debug 配置 -
renderDebug/renderDebugMode/showChunkGenDebug - Speedups 配置 - 区块生成调度(
ChunkGenStats的数据来源) - 指令 -
/allocationshud切换本页的分配速率 HUD