#버튼 누를 시 서버로 바로 접속

1 messages · Page 1 of 1 (latest)

sacred ibex
#

버전 1.20.1, 포지 47.2.20

  1. 버튼을 누를 시 서버로 바로 접속이 됩니다
  2. 접속 후 취소 버튼을 누르면 메인 화면으로 돌아가야 합니다.

접속 시도 시 연결하는 동안은 서버 접속하는 중 메시지가 총 2번 뜨게 됩니다
첫번째 뜰 때는 취소 시 메인으로 바로 돌아가지만
두번째 뜰 때 취소 시 멀티플레이어 화면으로 가지네요

JoinMultiplayerScreen이 사용되는 곳을 전부 살펴본거 같은데 해결이 안되고 있습니다

@Mixin(TitleScreen.class)
public abstract class TitleScreenMixin extends Screen {
    @Inject(method = "createNormalMenuOptions", at = @At("HEAD"), cancellable = true)
    public void createNormalMenuOptions(int p_96764_, int p_96765_, CallbackInfo callbackInfo) {
        Component component = getMultiplayerDisabledReason();
        boolean flag = component == null;
        Tooltip tooltip = component != null ? Tooltip.create(component) : null;
    
        addRenderableWidget(Button.builder(Component.literal("전장으로..."), (p_210872_) -> {
            var serverData = new ServerData("", "서버주소", false);
            ConnectScreen.startConnecting(this, minecraft, ServerAddress.parseString(serverData.ip), serverData, false);
        }).bounds(this.width / 2 - 100, p_96764_, 200, 20).tooltip(tooltip).build()).active = flag;
    
        this.addRenderableWidget(Button.builder(Component.literal("연습하기"), (p_280833_) -> {
            this.minecraft.setScreen(new SelectWorldScreen(this));
        }).bounds(this.width / 2 - 100, p_96764_ + p_96765_, 200, 20).build());
    
        callbackInfo.cancel();
    }
}

영상에 나온 접속 시도 화면이 ConnectScreen 클래스입니다
위에서 접속 시도 시 연결하는 동안은 서버 접속하는 중 메시지가 총 2번 뜬다고 말씀드렸습니다
첫번째 메시지 때 취소 버튼을 누를 시 캔슬!! 메시지가 정상적으로 출력되지만
두번째 메시지 때 취소 버튼을 누르면 메시지가 출력되지 않습니다

protected void init() {
      this.addRenderableWidget(Button.builder(CommonComponents.GUI_CANCEL, (p_289624_) -> {
         synchronized(this) {
            this.aborted = true;
            if (this.channelFuture != null) {
               this.channelFuture.cancel(true);
               this.channelFuture = null;
            }

            if (this.connection != null) {
               this.connection.disconnect(ABORT_CONNECTION);
            }
         }

         this.minecraft.setScreen(this.parent);
         System.out.println("캔슬!!")
      }).bounds(this.width / 2 - 100, this.height / 4 + 120 + 12, 200, 20).build());
   }
grand mortar
#

Gemini 2.5 pro , ChatGPT o3-mini-high, Claude 3.7 sonnet ( 심층 사고모드 )
각 답변 내용 입니다.

sacred ibex
#

👍

velvet vale
#

포지에도 아마 runMod 있을건데

#

그거 이용해서 디버그로 모드 켠 다음에 ConnectScreen constructor 에 breakpoint 걸어보세요

#

cancel 했을때 이벤트는 ConnectScreen의 parent 필드에 있는 이전 페이지로 돌아가는 거기 때문에

#

따로 만드실 필요 없이 해당 부분 믹스인 하시면 해결되긴 합니다.

#

그리고 모딩할때 AI 쓰셔봤자 도움 안되는게 쟤 학습속도가 마크 버전 변경을 따라가질 못해서 환각현상이나 뿜어대요

serene fern
#

마크 모딩은 ai가 잘 모르긴 하죠 ㅋㅋㅋ

#

저거 버튼 스크린 코드 좀 보면 알 수 있을지도

#

믹스인할 메서드가 여러 개일 수도 있어서

sacred ibex
#

저번에 패브릭 디버깅이랑 비슷한건가여

velvet vale
#

#

패브릭은 loom gradle plugin 에 있는데

#

forgegradle 에도 아마 있을거에요 IntelliJ 에서 빌드해서 바로 클라모드 실행시키는거

sacred ibex
#

아 모드가 아니구나

velvet vale
#

사실상 제가 봤을때는

#

잠시만요 ]

#

ConnectScreen 생성자 부분을 믹스인으로 건드리시는게 제일 간단해 보이는 것 같아요

sacred ibex
#

그것도 했었는데 안됐어가지구

#

잘못한건가

velvet vale
#

아 취소 부분이요?

sacred ibex
#

아 저걸 왜 테스트 해봤냐면

#

둘이 다른 화면인가 싶어서

#

해봤는데

#

같은 화면이면 mixin이 먹혀야 정상이지 않나여

velvet vale
#

위 믹스인이

#

타겟이 어디 클래스에요?

sacred ibex
#

ConnectScreen

#

저기 아래 코드 mixin 한거에여

#

protected void init()

sacred ibex
#

추후에 다시 버튼이 생겨서 ㅋㅋ..

#

임시 해결책으로 setScreen에서 해결하긴 했는데 좋은 방법은 아닌거 같아서요

#

JoinMultiplayerScreen = 멀티 플레이 화면
TitleScreen = 메인 화면

serene fern
sacred ibex
velvet vale
#

저게 사실

#

Screen 도 ScreenHandler 랑 같은 방식으로 작동하거든요? 마크 GUI 처ㅓㅁ

#

그래서 지금 보니까 Scren 이 접속 중에 하나가 더 생성되는 걸로 보이는데

#

그 원인부터 일단 찾는게 맞는 것 같아요

#

그래서 중단점 잡고 디버깅 해보자는거구요

sacred ibex
#

ConnectScreen이 두번 호출되긴 하네여

velvet vale
#

어디서 호출해요?

#

두개 기록하셔서 대조해보셔야할거같애요

sacred ibex
#

어디서 호출하는지는 안나오는거 같은데

#

[21:25:08] [Render thread/INFO] [minecraft/ConnectScreen]: Connecting to 주소, 포트

#

무엇을 봐야하는거지

velvet vale
#

스택트레이스

#

안잡히나요? 중단점에서

sacred ibex
#

아 디버그 모드로 키는거 말고

#

할게 더 있었나여

velvet vale
#

아뇨 중단점 잡히면 좌하단에 스택

#

잡힐탠데 아니면

#

생성자 콜할때

#

parent 누구로 잡혀있어요?

sacred ibex
#

parent가 TitleScreen 로 뜨긴 하는데

#
@Mixin(ConnectScreen.class)
public class ConnectScreenMixin {
    @Inject(method = "<init>", at = @At("TAIL"))
    public void init(Screen p_279215_, Component p_279228_, CallbackInfo ci) {
        System.out.println("!!!!!!!!!!!!!!!! Screen: " + p_279215_.getClass().getName());
        System.out.println("!!!!!!!!!!!!!!!! Component: " + p_279228_.getString());
    }
}
#

뭐지 이젠 한번만 호출되네

#

에잉 그냥 야매로 하는게 나을거 같네요

#

이상해

velvet vale
#

네 걍 야매로 해도 뭐

#

상관없어보이긴 해요

sacred ibex
#

다들 도움 주셔서 감사합니다