🛡️ 聊天可见性与输入拦截
| 参数 | 技术规格 |
|---|---|
| Target Screen Class | net.minecraft.client.gui.screens.ChatScreen |
| Mixin Handler | ChatScreenMixin.java |
| In-Memory State | BedChatHiderClient.hideChat (boolean) |
| Interception Targets | extractRenderState, keyPressed, mouseClicked, mouseScrolled |
| Focus Gatekeeper | bedchathider$updateChatState() |
🔄 状态机生命周期演进
[ User Clicks 'Hide Chat' ]
│
▼
BedChatHiderClient.hideChat = true
│
▼
this.rebuildWidgets()
│
┌────────────────────┴────────────────────┐
▼ ▼
[ EditBox Input State ] [ Input Interception ]
• input.visible = false • extractRenderState -> cancel
• input.active = false • keyPressed -> super.keyPressed
• input.setFocused(false) • mouseClicked -> super.mouseClicked
• screen.setFocused(null) • mouseScrolled -> super.mouseScrolled🛡️ 四点输入拦截机制详解
当聊天框隐藏时,ChatScreenMixin 拦截 4 个关键输入路径,以防止后台幽灵输入或误触链接:
| 拦截方法 | 原版行为 | 隐藏时的模组操作 | 结果 |
|---|---|---|---|
extractRenderState | 渲染聊天背景、历史记录文本与指令建议。 | 调用 super.extractRenderState 并执行 ci.cancel()。 | 聊天文本与背景框完全不可见。 |
keyPressed | 向 input 输入字符、自动补全指令、轮换历史。 | 返回 cir.setReturnValue(super.keyPressed(event))。 | 禁用文本输入与方向键历史轮换;Escape 正常关闭界面。 |
mouseClicked | 点击聊天文本中的 URL、建议选项或选中文本。 | 返回 cir.setReturnValue(super.mouseClicked(event, doubleClick))。 | 禁用聊天交互;界面原生按钮(离开床、显示聊天)正常工作。 |
mouseScrolled | 上下滚动聊天历史记录。 | 返回 cir.setReturnValue(super.mouseScrolled(x, y, scrollX, scrollY))。 | 禁用日志滚动;界面保持静止。 |
💻 源代码审查与验证
java
// Sourced from ChatScreenMixin.java
@Inject(method = "extractRenderState", at = @At("HEAD"), cancellable = true)
private void onExtractRenderState(GuiGraphicsExtractor graphics, int mouseX, int mouseY, float a, CallbackInfo ci) {
if ((Object) this instanceof InBedChatScreen && BedChatHiderClient.hideChat) {
super.extractRenderState(graphics, mouseX, mouseY, a);
ci.cancel();
}
}
@Inject(method = "keyPressed", at = @At("HEAD"), cancellable = true)
private void onKeyPressed(KeyEvent event, CallbackInfoReturnable<Boolean> cir) {
if ((Object) this instanceof InBedChatScreen && BedChatHiderClient.hideChat) {
cir.setReturnValue(super.keyPressed(event));
}
}相关页面: 首页面板 | 睡眠界面布局与坐标计算 | 代码架构与 Mixin 注入剖析
