🛡️ Visibilitas Obrolan & Pemblokiran Input
| Parameter | Rincian Teknis |
|---|---|
| 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() |
🔄 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 Terintersepsi | Perilaku Vanilla | Tindakan Mod Saat Tersembunyi | Hasil |
|---|---|---|---|
extractRenderState | Merender latar belakang obrolan, teks riwayat, dan saran perintah. | Memanggil super.extractRenderState dan mengeksekusi ci.cancel(). | Teks obrolan dan kotak latar belakang sepenuhnya tidak terlihat. |
keyPressed | Mengetik karakter ke input, melengkapi perintah otomatis, memutar riwayat. | Mengembalikan cir.setReturnValue(super.keyPressed(event)). | Pengetikan dan tombol panah dinonaktifkan; Escape menutup layar secara normal. |
mouseClicked | Mengklik 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. |
mouseScrolled | Menggulir 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
