Skip to content

🛡️ Visibilidad del Chat y Bloqueo de Entrada

ParámetroDetalles técnicos
Target Screen Classnet.minecraft.client.gui.screens.ChatScreen
Mixin HandlerChatScreenMixin.java
In-Memory StateBedChatHiderClient.hideChat (boolean)
Interception TargetsextractRenderState, keyPressed, mouseClicked, mouseScrolled
Focus Gatekeeperbedchathider$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 interceptadoComportamiento vainillaAcción del mod al ocultarResultado
extractRenderStateRenderiza 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.
keyPressedEscribe caracteres en input, autocompleta comandos, navega historial.Devuelve cir.setReturnValue(super.keyPressed(event)).Escritura y navegación deshabilitadas; Escape cierra la pantalla normalmente.
mouseClickedHace 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.
mouseScrolledDesplaza 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

Official documentation & web portal for Dasik Igaijinn mods.