Skip to content

🛡️ Visibilitas Obrolan & Pemblokiran Input

ParameterRincian Teknis
Target Screen Classnet.minecraft.client.gui.screens.ChatScreen
Mixin HandlerChatScreenMixin.java
In-Memory StateBedChatHiderClient.hideChat (boolean)
Interception TargetsextractRenderState, keyPressed, mouseClicked, mouseScrolled
Focus Gatekeeperbedchathider$updateChatState()

🔄 Siklus Hidup Mesin Status

                 [ 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

🛡️ Uraian Intersepsi Input 4 Titik

Saat obrolan disembunyikan, ChatScreenMixin mengintersepsi 4 jalur input penting untuk mencegah pengetikan hantu di latar belakang atau klik tautan yang tidak disengaja:

Metode TerintersepsiPerilaku VanillaTindakan Mod Saat TersembunyiHasil
extractRenderStateMerender latar belakang obrolan, teks riwayat, dan saran perintah.Memanggil super.extractRenderState dan mengeksekusi ci.cancel().Teks obrolan dan kotak latar belakang sepenuhnya tidak terlihat.
keyPressedMengetik karakter ke input, melengkapi perintah otomatis, memutar riwayat.Mengembalikan cir.setReturnValue(super.keyPressed(event)).Pengetikan dan tombol panah dinonaktifkan; Escape menutup layar secara normal.
mouseClickedMengklik URL obrolan, saran, atau pilihan riwayat obrolan.Mengembalikan cir.setReturnValue(super.mouseClicked(event, doubleClick)).Pemilihan obrolan dinonaktifkan; tombol antarmuka (Tinggalkan Tempat Tidur, Tampilkan Obrolan) berfungsi lancar.
mouseScrolledMenggulir riwayat obrolan ke atas dan ke bawah.Mengembalikan cir.setReturnValue(super.mouseScrolled(x, y, scrollX, scrollY)).Pengguliran dinonaktifkan; layar tetap statis.

💻 Verifikasi Kode Sumber

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));
    }
}

Halaman Terkait: Beranda | Tata Letak UI Layar Tempat Tidur | Arsitektur & Analisis Mixin

Official documentation & web portal for Dasik Igaijinn mods.