🛡️ 채팅 가시성 및 입력 차단
| 매개변수 | 기술 사양 |
|---|---|
| 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() |
🔄 상태 머신 수명 주기
[ 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🛡️ 4개 입력 차단 지점 상세 분석
채팅이 숨겨져 있을 때 ChatScreenMixin은 4개의 주요 입력 경로를 가로채 배경 고스트 타이핑이나 의도치 않은 링크 클릭을 방지합니다:
| 가로챈 메서드 | 바닐라 동작 | 숨김 시 모드 동작 | 결과 |
|---|---|---|---|
extractRenderState | 채팅 배경, 기록 텍스트 및 명령어 추천을 렌더링합니다. | super.extractRenderState를 호출하고 ci.cancel()을 실행합니다. | 채팅 텍스트와 배경 상자가 완전히 보이지 않게 됩니다. |
keyPressed | input에 문자를 입력하고 명령어를 자동 완성하며 기록을 전환합니다. | cir.setReturnValue(super.keyPressed(event))를 반환합니다. | 텍스트 입력 및 방향키 전환이 비활성화됩니다. Escape는 정상적으로 화면을 닫습니다. |
mouseClicked | 채팅 텍스트 URL, 제안 또는 채팅 로그 선택을 클릭합니다. | cir.setReturnValue(super.mouseClicked(event, doubleClick))를 반환합니다. | 채팅 선택이 비활성화되며 GUI 버튼(침대에서 일어나기, 채팅 표시)은 정상 작동합니다. |
mouseScrolled | 채팅 로그 기록을 위아래로 스크롤합니다. | cir.setReturnValue(super.mouseScrolled(x, y, scrollX, scrollY))를 반환합니다. | 로그 스크롤이 비활성화되며 화면이 정지 상태를 유지합니다. |
💻 소스 코드 검증
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));
}
}관련 페이지: 홈 | 침대 화면 UI 및 레이아웃 | 아키텍처 및 Mixin 분석
