접속 확인
Crystal Garden은 서버와 클라이언트 양쪽에 설치되어 있어야 합니다. 게임이 블록 상태를 번호로 맞추기 때문에, 모드가 없는 클라이언트는 접속하더라도 새싹을 제대로 볼 수 없습니다.
접속 준비 단계 교환을 사용하면 플레이어가 월드에 들어오기 전에 서버가 클라이언트에 질문을 보냅니다. 서버는 그 답에 따라 접속을 허용하거나, 이해하기 쉬운 메시지와 함께 거절합니다.
서버: 묻고 확인하기
common 엔트리포인트에서 선언하므로 서버와 클라이언트 양쪽에 모두 적용됩니다.
CrystalGardenMod.java
/** Before a player joins, the server checks that their client has Crystal Garden too. */
static ConfigurationExchange<String> handshake;
// onInitializeCommon 안
handshake = mod.network()
.configurationExchange("handshake", PayloadCodec.string())
.serverRequest((id, name) -> Optional.of("crystal_garden version?"))
.serverCheck((id, name, reply) -> {
LOGGER.info("[{}] Handshake with {}: {}", MOD_ID, name, reply.orElse("no answer"));
return reply.filter(answer -> answer.startsWith(MOD_ID + " "))
.isPresent()
? Optional.empty()
: Optional.of("Install Crystal Garden on your client to join this server.");
});
serverRequest가 접속하는 플레이어마다 보낼 질문을 정합니다.- 클라이언트가 답합니다(아래에서 설명합니다).
serverCheck가 답을 확인합니다. 빈 값을 반환하면 접속을 허용하고, 메시지를 반환하면 그 메시지와 함께 접속을 끊습니다. 모드가 없는 클라이언트는 답하지 못하므로 5초 뒤 빈 답(reply가 비어 있음)을 받게 됩니다.
클라이언트: 답하기
client 엔트리포인트에서 답을 정합니다. 다음 페이지에서 만들 CrystalGardenClient의 첫 줄에 들어가는 코드입니다.
CrystalGardenClient.java (onInitializeClient)
CrystalGardenMod.handshake.clientAnswer(request -> CrystalGardenMod.MOD_ID + " " + mod.modVersion());
확인
싱글 플레이에서도 내장 서버가 같은 교환을 합니다. 월드에 들어가면 로그에 다음과 같이 남습니다.
[Poly Mod Loader] Answered configuration exchange crystal_garden:handshake
[crystal_garden] Handshake with PolyDev: crystal_garden 0.1.0
[Poly Mod Loader] Configuration exchange crystal_garden:handshake with PolyDev: answered, accepted
버전이 맞는지까지 확인하려면 serverCheck에서 답에 담긴 버전을 비교하면 됩니다. 접속한 뒤에 메시지를 주고받는 페이로드 채널은 네트워크와 동기화에서 설명합니다.
다음 단계
클라이언트 코드를 추가합니다.