본문으로 건너뛰기
버전: Minecraft 26.2

클라이언트 코드

클라이언트 전용 코드는 ClientModInitializer에 작성합니다. 전용 서버는 이 클래스를 읽지 않으므로 서버에서 클라이언트 코드가 실행될 일이 없습니다.

새 파일 CrystalGardenClient.java를 만듭니다.

src/main/java/com/example/crystalgarden/CrystalGardenClient.java
public final class CrystalGardenClient implements ClientModInitializer {

@Override
public void onInitializeClient(ModContext mod) {
CrystalGardenMod.handshake.clientAnswer(request -> CrystalGardenMod.MOD_ID + " " + mod.modVersion());

ClientRegistrar client = mod.client();

// A growth bar and the stage over each sprout, from the block entity data the server syncs.
client.blockEntityRenderer(CrystalGardenMod.CRYSTAL_SPROUT, (sprout, canvas) -> {
int stage = sprout.world().stateAt(sprout.pos()).get(CrystalSprout.STAGE);
if (stage >= CrystalSprout.RIPE) {
canvas.item(CrystalGardenMod.CRYSTAL, 0.5, 1.3, 0.5, 0.4f, canvas.animationTime() * 4 % 360);
canvas.text("Ripe!", 0.5, 1.7, 0.5, 0.02f, 0xFFE1BEE7);
return;
}
int percent = sprout.data().getInt("growth", 0) * 100 / CrystalSprout.TICKS_PER_STAGE;
canvas.text("Stage " + stage + " · " + percent + "%", 0.5, 1.2, 0.5, 0.015f, 0xFFFFFFFF);
});

// The HUD shows the player's own harvest count (entity data synced to its owner).
KeyBinding toggle = client.keyBinding("toggle_hud", KeyCodes.G);
AtomicBoolean hudVisible = new AtomicBoolean(true);
AtomicInteger harvested = new AtomicInteger();
mod.events().register(ClientEvents.TICK, view -> {
while (toggle.consumeClick()) {
hudVisible.set(!hudVisible.get());
}
view.player()
.ifPresent(player -> harvested.set(
player.data(CrystalGardenMod.harvested).data().getInt("count", 0)));
});
client.hudLayer("harvest_counter", canvas -> {
if (!hudVisible.get()) {
return;
}
String text = "Crystals: " + harvested.get();
canvas.fill(2, 2, 8 + canvas.textWidth(text), 14, 0x80000000);
canvas.drawText(text, 5, 4, 0xFFE1BEE7);
});
}
}
부분하는 일
blockEntityRenderer새싹마다 매 프레임 호출됩니다. 자라는 중이면 단계와 퍼센트를, 다 자랐으면 회전하는 크리스털과 Ripe!를 그립니다. 사용하는 데이터는 서버가 syncToClients()로 보낸 블록 엔티티 데이터입니다
keyBinding("toggle_hud", KeyCodes.G)조작 설정에 표시되는 키입니다. 플레이어가 다른 키로 바꿀 수 있습니다
ClientEvents.TICK클라이언트 틱마다 키 입력을 처리하고, 동기화된 플레이어 데이터에서 수확 수를 읽어 둡니다
hudLayer화면 왼쪽 위에 Crystals: 3처럼 그립니다. 그리기 코드는 틱에서 읽어 둔 값만 사용합니다

키 이름은 번역 파일에서 가져옵니다.

src/main/resources/assets/crystal_garden/lang/en_us.json
{
"key.crystal_garden.toggle_hud": "Toggle Crystal Counter",
"key.category.crystal_garden.keybinds": "Crystal Garden"
}

ko_kr.json에도 "key.crystal_garden.toggle_hud": "크리스털 수 표시 켜기/끄기"와 "key.category.crystal_garden.keybinds": "크리스털 정원"을 추가합니다. en_us.json에 직접 쓴 항목은 polyResources가 만든 이름과 합쳐집니다.

이 클래스는 poly.mod.json의 entrypoints.client에 적혀 있어야 실행됩니다(poly.mod.json 참고).

  • HUD 레이어나 그리기 코드에서 예외가 발생하면 해당 레이어만 꺼지고 POLY-CLIENT-003이 기록됩니다.
  • 전용 서버에서 mod.client()를 호출하면 POLY-CLIENT-001이 발생합니다.

확인​

runClient로 실행해 새싹을 설치하면 그 위에 Stage 0 · 45%처럼 성장 표시가 나타납니다. 수확하면 왼쪽 위의 숫자가 오르고, G 키로 이 표시를 숨기거나 다시 나타낼 수 있습니다.

화면(GUI), 월드에 직접 그리기, 셰이더는 클라이언트 기본, 화면, 그리기에서 설명합니다.

다음 단계​

게임 테스트로 기능을 자동 확인합니다.

Buy me a coffee