엔트리포인트
common 엔트리포인트는 CommonModInitializer를 구현하며, 클라이언트와 서버 양쪽에서 실행됩니다. 블록, 아이템, 명령어, 네트워크, 게임 테스트 같은 모든 선언은 이 메서드 안에서 끝내야 합니다.
initPolyMod가 템플릿에서 이름을 바꾼 CrystalGardenMod.java를 아래처럼 바꿉니다. 지금은 크리스털 아이템과 크리스털 블록만 선언하고, 나머지는 다음 페이지들에서 채워 나갑니다.
src/main/java/com/example/crystalgarden/CrystalGardenMod.java
package com.example.crystalgarden;
import dev.polymodloader.api.content.CreativeTab;
import dev.polymodloader.api.content.block.BlockDefinition;
import dev.polymodloader.api.content.block.BlockSound;
import dev.polymodloader.api.content.item.ItemDefinition;
import dev.polymodloader.api.content.item.ItemRarity;
import dev.polymodloader.api.lifecycle.CommonModInitializer;
import dev.polymodloader.api.lifecycle.ModContext;
import dev.polymodloader.api.resource.ResourceId;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public final class CrystalGardenMod implements CommonModInitializer {
static final String MOD_ID = "crystal_garden";
static final Logger LOGGER = LoggerFactory.getLogger(MOD_ID);
static final ResourceId CRYSTAL = ResourceId.of(MOD_ID, "crystal");
static final ResourceId CRYSTAL_BLOCK = ResourceId.of(MOD_ID, "crystal_block");
@Override
public void onInitializeCommon(ModContext mod) {
LOGGER.info("[{}] Planting Crystal Garden {}", MOD_ID, mod.modVersion());
mod.content()
.item(
"crystal",
ItemDefinition.builder()
.rarity(ItemRarity.UNCOMMON)
.creativeTab(CreativeTab.INGREDIENTS)
.build());
mod.content()
.block(
"crystal_block",
BlockDefinition.builder()
.strength(1.5f, 1.5f)
.requiresCorrectTool()
.sound(BlockSound.AMETHYST)
.lightLevel(6)
.item(ItemDefinition.builder()
.creativeTab(CreativeTab.BUILDING_BLOCKS)
.build())
.build());
}
}
ResourceId.of(MOD_ID, "crystal")은crystal_garden:crystal을 가리킵니다. 다른 클래스와 테스트는 이 ID로 아이템을 찾습니다..item(...)을 지정한 블록은 같은 ID의 블록 아이템도 함께 등록됩니다.build.gradle.kts의worldCreateSaveTest는 이 로그 줄이 나오는지 확인할 수 있습니다. 템플릿의 확인 줄(Hello from …,Server started)을[crystal_garden] Planting Crystal Garden 0.1.0하나로 바꾸세요.
선언은 엔트리포인트 안에서
게임이 레지스트리를 닫은 뒤에 하는 선언(예: 이벤트 리스너 안에서 아이템을 선언하는 경우)은 POLY-CONTENT-002 오류가 됩니다. 명령어, 네트워크, 게임 테스트도 같은 규칙을 따르며, 각각 POLY-COMMAND-002, POLY-NETWORK-002, POLY-GAMETEST-002가 발생합니다.
엔트리포인트에서 예외가 발생하면 Poly 모드 로더는 POLY-ENTRYPOINT-003과 함께 실행을 멈춥니다.
엔트리포인트 종류
| 인터페이스 | poly.mod.json 키 | 실행 시점 |
|---|---|---|
CommonModInitializer | common | 메인 스레드에서 의존성 순서대로, 게임 main보다 먼저 |
ClientModInitializer | client | 모든 common 다음, 클라이언트에서만 |
DedicatedServerModInitializer | server | 모든 common 다음, 전용 서버에서만 |
모드 사이의 실행 순서는 의존 대상이 먼저이고, 의존 관계가 같으면 모드 ID 순서입니다.
ModContext
엔트리포인트가 받는 ModContext로 모든 API 영역에 접근할 수 있습니다.
| 메서드 | 내용 | 문서 |
|---|---|---|
modId(), modVersion(), side() | 모드 ID, 버전, 실행 측(CLIENT / DEDICATED_SERVER) | — |
content() | 블록·아이템·엔티티·효과·게임 규칙·사운드·파티클 등 | 블록 |
events() | 이벤트 리스너 등록 | 이벤트 |
commands() | 명령어 | 명령어와 권한 |
network() | 페이로드 채널 | 네트워크와 동기화 |
worldgen() | 바이옴 기능, 코드 바이옴, 지형 생성기 | 월드 생성 |
resources() | 데이터·에셋 리로드 리스너 | 리소스와 데이터 |
permissions() | 권한 노드와 공급자 | 명령어와 권한 |
gameTests() | 게임 내 테스트 | 게임 내 테스트 |
configDirectory() | config/<mod id> 설정 폴더 | 운영 |
onShutdown(description, task) | JVM이 종료될 때 실행할 작업 | 운영 |
client() | 키 바인딩, HUD, 그리기(클라이언트 엔트리포인트에서만 사용 가능) | 클라이언트 기본 |
다음 단계
첫 블록에서 이 아이템과 블록에 모양을 입힙니다.