聊天与 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):

  1. 聊天为空则直接返回 false
  2. 取首行 chatLines.get(0),与新消息比对
  3. 相同则给新消息挂一个 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 复位为 1
  • size1 + 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