🛡️ Visibilidade do Chat e Bloqueio de Entrada
| Parâmetro | Detalhes técnicos |
|---|---|
| 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() |
🔄 Ciclo de vida da máquina de estados
[ 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🛡️ Detalhamento da interceptação de entrada em 4 pontos
Quando o chat está oculto, o ChatScreenMixin intercepta 4 caminhos de entrada críticos para evitar digitação fantasma em segundo plano ou cliques acidentais em links:
| Método interceptado | Comportamento vanilla | Ação do mod ao ocultar | Resultado |
|---|---|---|---|
extractRenderState | Renderiza o fundo do chat, texto do histórico e sugestões de comandos. | Invoca super.extractRenderState e executa ci.cancel(). | O texto do chat e a caixa de fundo ficam completamente invisíveis. |
keyPressed | Digita caracteres em input, autocompleta comandos, percorre histórico. | Retorna cir.setReturnValue(super.keyPressed(event)). | Digitação e setas desativadas; Escape fecha a tela normalmente. |
mouseClicked | Clica em URLs do chat, sugestões ou seleção do histórico. | Retorna cir.setReturnValue(super.mouseClicked(event, doubleClick)). | Seleção desativada; botões da interface (Sair da cama, Mostrar chat) funcionam perfeitamente. |
mouseScrolled | Rola o histórico do chat para cima e para baixo. | Retorna cir.setReturnValue(super.mouseScrolled(x, y, scrollX, scrollY)). | Rolagem desativada; a tela permanece estática. |
💻 Verificação do código-fonte
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));
}
}Páginas relacionadas: Início | Interface da Cama e Layout | Arquitetura e Análise de Mixins
