운영
설정 폴더
Path config = mod.configDirectory(); // config/<mod id>
Path file = config.resolve("settings.properties");
설정 폴더는 config/<mod id>이며, 파일 형식은 모드가 자유롭게 정합니다. 어느 스레드에서든 호출할 수 있습니다.
게임 안의 다른 모드
if (mod.mods().isLoaded("sodium")) {
// 선택 연동 켜기
}
mod.mods().find("jei").ifPresent(jei -> LOGGER.info("{} {} ({})", jei.name(), jei.version(), jei.loader()));
mod.mods()는 모든 로더의 로드된 모드를 나열합니다. Poly 모드, Fabric 모드, 그리고 MinecraftForge가 게임을 실행할 때는 Forge 모드까지 포함합니다.loader()는poly,fabric,minecraftforge중 하나입니다.isLoaded와find는 모드가 제공하는 ID(fabric.mod.json의provides)도 찾습니다. 같은 ID라면 모드 자신의 ID가 먼저입니다.- 차단되었거나 빠진 모드는 목록에 없습니다. 게임과 로더 자체도 없습니다.
- 목록은 첫 진입점부터 완성되어 있고 바뀌지 않습니다. 어느 스레드에서든 읽을 수 있습니다.
- 목록에 있다는 것은 로드되었다는 뜻이지, 그 모드의 초기화가 끝났다는 뜻은 아닙니다. Fabric 모드의 진입점은 Poly 모드의 공통 진입점보다 나중에 실행됩니다. 다른 모드의 클래스를 쓰는 코드는
LifecycleEvents.MODS_INITIALIZED에서 실행하세요.
종료 작업
mod.onShutdown("say goodbye", () -> LOGGER.info("bye"));
- JVM이 종료될 때 Poly 모드 로더 종료 스레드에서 등록한 역순으로 한 번씩 실행합니다.
- 한 작업이 실패해도 나머지 작업은 계속 실행합니다(
POLY-SHUTDOWN-001). - 종료가 시작된 뒤에 등록하면
POLY-SHUTDOWN-002오류가 납니다.
로그인 검사
mod.events().register(PlayerEvents.LOGIN_CHECK, (id, name) ->
banned(id) ? Optional.of("이유") : Optional.empty());
- 게임의 인증, 차단, 화이트리스트, 인원 검사를 통과한 뒤 플레이어가 만들어지기 전에 서버 스레드에서 호출됩니다.
- 리스너 중 하나라도 사유를 돌려주면 접속을 거절하며, 첫 번째 거절 사유가 연결 끊김 화면에 표시됩니다.
모드 변경 시 월드 백업
월드를 불러오기 전에 지난번과 비교해 Poly 모드 로더 모드가 빠졌거나 버전이 바뀌었으면, 게임의 월드 백업(backups/ 폴더의 zip)을 먼저 만듭니다.
- 새로 추가된 모드는 변경으로 보지 않습니다.
- 마지막으로 불러온 모드 목록은
<월드>/poly/mods.properties에 기록합니다. - 백업 확인에 실패하면
POLY-BACKUP-001을 기록하고 월드 불러오기는 계속합니다.
백업 정책은 config/poly/backups.properties에서 바꿉니다.
config/poly/backups.properties
# 모드가 빠지거나 버전이 바뀐 월드를 불러오기 전에 백업
backup-on-mod-change=true
# 월드마다 보관할 백업 수. 이보다 오래된 해당 월드의 백업 zip은 지웁니다(0이면 모두 보관)
max-backups-per-world=10
진단 보고서와 로그
- 로그:
run/<side>/logs/latest.log. Poly 모드 로더 로그와 게임 로그가 한 파일에 시간 순서대로 기록됩니다. - 보고서:
.poly/startup-report.json,.poly/transformation-report.json. 자세한 내용은 문제 해결을 참고하세요.