Skip to content

🛡️ 채팅 가시성 및 입력 차단

매개변수기술 사양
Target Screen Classnet.minecraft.client.gui.screens.ChatScreen
Mixin HandlerChatScreenMixin.java
In-Memory StateBedChatHiderClient.hideChat (boolean)
Interception TargetsextractRenderState, keyPressed, mouseClicked, mouseScrolled
Focus Gatekeeperbedchathider$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()을 실행합니다.채팅 텍스트와 배경 상자가 완전히 보이지 않게 됩니다.
keyPressedinput에 문자를 입력하고 명령어를 자동 완성하며 기록을 전환합니다.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 분석

Official documentation & web portal for Dasik Igaijinn mods.