리소스와 데이터
모드 jar의 팩
모드 jar의 assets/는 클라이언트 리소스 팩으로, data/는 서버 데이터 팩으로 자동으로 추가됩니다.
- 팩 ID는
poly/<mod id>입니다. - 필수 팩이며, 바닐라 위에 놓입니다.
- 형식은 바닐라 26.2과 같습니다.
| 경로 | 용도 |
|---|---|
assets/<mod>/blockstates/<block>.json, models/block/…, textures/block/… | 블록 모양 |
assets/<mod>/items/<item>.json, models/item/…, textures/item/… | 아이템 모양 |
assets/<mod>/lang/en_us.json, ko_kr.json | block.<mod>.<id>, item.<mod>.<id>, key.<mod>.<id>, key.category.<mod>.keybinds |
assets/<mod>/textures/entity/… | 몹 텍스처 |
assets/<mod>/sounds.json | 사운드 이벤트 |
assets/<mod>/particles/<path>.json, textures/particle/… | 파티클 스프라이트 |
assets/<mod>/post_effect/<path>.json, shaders/post/… | 후처리 셰이더 |
data/<mod>/loot_table/blocks/<block>.json | 블록 드롭(없으면 아무것도 떨어지지 않음) |
data/<mod>/recipe/*.json | 레시피 |
data/<mod>/advancement/*.json | 발전 과제 |
data/<mod>/worldgen/…, dimension/…, dimension_type/…, damage_type/… | 월드 생성, 차원, 피해 유형 |
data/minecraft/tags/block/mineable/pickaxe.json ("replace": false) | 도구 태그 |
data/my_mod/loot_table/blocks/glow_block.json
{
"type": "minecraft:block",
"pools": [
{
"rolls": 1.0,
"conditions": [{"condition": "minecraft:survives_explosion"}],
"entries": [{"type": "minecraft:item", "name": "my_mod:glow_block"}]
}
]
}
리로드 리스너
모드가 자기만의 형식으로 된 데이터 파일을 읽을 때 사용합니다.
mod.resources().onDataReload("my_mod/spells", files -> { /* … */ }); // data/<ns>/my_mod/spells/**.json
mod.resources().onAssetReload("my_mod/tips", files -> { /* … */ }); // assets/… (클라이언트)
mod.resources().onDataFiles("my_mod/banners", ".txt", files -> { /* … */ }); // 바이트로 받음 (onAssetFiles도 있음)
onDataReload/onAssetReload는 JSON 파일을Map<ResourceId, String>으로,onDataFiles/onAssetFiles는 지정한 확장자의 파일을Map<ResourceId, byte[]>로 넘겨 줍니다.- 파일 ID는
<namespace>:<디렉터리 아래 경로>형식이며, 같은 ID의 파일이 여러 팩에 있으면 우선순위가 높은 팩의 파일을 씁니다. - 서버 데이터: 서버를 시작할 때와
/reload를 실행할 때 게임 데이터 다음에 읽습니다. 시작할 때는 메인 스레드에서,/reload때는 서버 스레드에서 호출됩니다. - 클라이언트 에셋: 게임을 시작할 때와 F3+T를 누를 때 클라이언트 스레드에서 읽습니다.
- 파일을 읽지 못하거나 리스너가 실패하면
POLY-RESOURCE-003을 기록하고 계속 진행합니다.
받은 내용을 다른 스레드에서 읽는다면 volatile 필드를 통째로 교체하는 방식으로 공개하세요.
static volatile Map<ResourceId, String> messages = Map.of();
mod.resources().onDataReload("my_mod_messages", files -> messages = files);
오류 코드
| 코드 | 뜻 |
|---|---|
POLY-RESOURCE-001 | 잘못된 리로드 디렉터리 |
POLY-RESOURCE-002 | 등록이 닫힌 뒤에 선언함 |
POLY-RESOURCE-003 | 파일을 읽지 못함 또는 리스너 실패(기록하고 계속 진행) |
POLY-CONTENT-004 | 팩 종류를 알 수 없음 |