🛡️ Visibilidad del Chat y Bloqueo de Entrada
| Parámetro | Detalles 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 de la 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🛡️ Desglose de la intercepción de entrada de 4 puntos
Cuando el chat está oculto, ChatScreenMixin intercepta 4 vías de entrada críticas para evitar escritura fantasma de fondo o clics accidentales en enlaces:
| Método interceptado | Comportamiento vainilla | Acción del mod al ocultar | Resultado |
|---|---|---|---|
extractRenderState | Renderiza el fondo del chat, texto del historial y sugerencias de comandos. | Invoca super.extractRenderState y ejecuta ci.cancel(). | El texto del chat y el cuadro de fondo son completamente invisibles. |
keyPressed | Escribe caracteres en input, autocompleta comandos, navega historial. | Devuelve cir.setReturnValue(super.keyPressed(event)). | Escritura y navegación deshabilitadas; Escape cierra la pantalla normalmente. |
mouseClicked | Hace clic en URLs del chat, sugerencias o selección de registro. | Devuelve cir.setReturnValue(super.mouseClicked(event, doubleClick)). | Selección deshabilitada; los botones de interfaz (Salir de la cama, Mostrar chat) funcionan perfectamente. |
mouseScrolled | Desplaza el historial de chat hacia arriba y abajo. | Devuelve cir.setReturnValue(super.mouseScrolled(x, y, scrollX, scrollY)). | Desplazamiento deshabilitado; la pantalla permanece estática. |
💻 Verificación del código fuente
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: Inicio | Interfaz y Disposición de Cama | Arquitectura y Análisis de Mixins
