루트 테이블 — 블록 드롭 JSON 직접 작성
data/<modId>/loot_table/blocks/ 경로에 JSON을 직접 작성해 블록 채굴 드롭을 정의합니다. 단순 드롭, 변동 드롭, Fortune 보너스, 올바른 도구 조건까지 다룹니다.
루트 테이블 — 블록 드롭 JSON 직접 작성
⚠️ datagen 의존 챕터 이 챕터의 일부 코드는
runDataGradle 태스크로 JSON 리소스를 생성해야 동작합니다. 현재 예제 모드 프로젝트에 datagen 인프라가 포함되지 않아 별도 PR(#datagen-infrastructure)로 검증 예정입니다.
블록을 채굴했을 때 무엇이 떨어질지는 **루트 테이블(loot table)**이 결정합니다. NeoForge 26에서는 data/<modId>/loot_table/blocks/<block_name>.json 파일 하나로 드롭 규칙 전체를 정의합니다.
이 챕터에서는 JSON을 직접 손으로 작성하는 방법을 다룹니다. DataGen으로 자동 생성하는 방법은 appendix-datagen에서 별도로 다룹니다.
1. 루트 테이블 파일 위치
src/main/resources/
└── data/
└── examplemod/
└── loot_table/
└── blocks/
├── first_block.json ← first_block 드롭 규칙
└── ruby_ore.json ← ruby_ore 드롭 규칙
경로 규칙: data/<modId>/loot_table/blocks/<블록 등록명>.json
블록 등록명은 BLOCKS.registerSimpleBlock("first_block", ...) 에서 쓴 문자열과 정확히 일치해야 합니다.
2. 단순 드롭 — 블록 자체를 1개 드롭
first_block을 채굴하면 examplemod:first_block 아이템이 1개 떨어지는 가장 기본적인 루트 테이블입니다.
// src/main/resources/data/examplemod/loot_table/blocks/first_block.json
{
"type": "minecraft:block",
"pools": [
{
"rolls": 1,
"entries": [
{
"type": "minecraft:item",
"name": "examplemod:first_block"
}
],
"conditions": [
{
"condition": "minecraft:survives_explosion"
}
]
}
]
}각 필드 설명:
| 필드 | 역할 |
|---|---|
type: "minecraft:block" | 블록 루트 테이블임을 선언 |
pools | 드롭 풀 목록. 각 풀은 독립적으로 굴림 |
rolls: 1 | 이 풀에서 항목을 1번 뽑음 |
entries | 뽑힐 수 있는 항목 목록 |
type: "minecraft:item" | 아이템 드롭 항목 |
name | 드롭할 아이템의 Identifier |
conditions | 드롭 조건 목록 |
minecraft:survives_explosion | 폭발로 파괴될 때 드롭 확률을 줄임 (TNT 등) |
survives_explosion 조건이 없으면 TNT로 터뜨려도 100% 드롭됩니다. 일반 블록에는 항상 추가하는 것이 관례입니다.
3. 광물 드롭 — 변동 수량 + Fortune 보너스
루비 광석(ruby_ore)처럼 채굴 시 원석 아이템을 드롭하고 Fortune 인첸트로 수량이 늘어나는 패턴입니다.
// src/main/resources/data/examplemod/loot_table/blocks/ruby_ore.json
{
"type": "minecraft:block",
"pools": [
{
"rolls": 1,
"entries": [
{
"type": "minecraft:item",
"name": "examplemod:ruby",
"functions": [
{
"function": "minecraft:set_count",
"count": {
"type": "minecraft:uniform",
"min": 1,
"max": 3
}
},
{
"function": "minecraft:apply_bonus",
"enchantment": "minecraft:fortune",
"formula": "minecraft:ore_drops"
}
]
}
],
"conditions": [
{
"condition": "minecraft:survives_explosion"
}
]
}
]
}functions 배열은 드롭 아이템에 후처리를 적용합니다. 순서대로 실행됩니다.
| 함수 | 역할 |
|---|---|
minecraft:set_count | 드롭 수량 설정. uniform은 min~max 사이 균등 분포 |
minecraft:apply_bonus | 인첸트 보너스 적용 |
enchantment: "minecraft:fortune" | Fortune 인첸트를 기준으로 계산 |
formula: "minecraft:ore_drops" | 바닐라 광물 드롭 공식 (Fortune 레벨에 따라 배수 증가) |
4. 올바른 도구 조건 — requiresCorrectToolForDrops
ruby_ore처럼 곡괭이로만 채굴해야 드롭이 되게 하려면 세 가지를 함께 설정해야 합니다.
4-1. Block Properties에 플래그 추가
// ExampleMod.java — ruby_ore 등록 시
public static final DeferredBlock<Block> RUBY_ORE = BLOCKS.registerBlock("ruby_ore", Block::new,
p -> p.strength(3.0f, 3.0f)
.requiresCorrectToolForDrops() // 올바른 도구 없으면 드롭 없음
.mapColor(MapColor.STONE));requiresCorrectToolForDrops()를 설정하면 올바른 도구 없이 채굴 시 루트 테이블 자체가 실행되지 않습니다.
4-2. 채굴 가능 블록 태그
경로: src/main/resources/data/minecraft/tags/block/mineable/pickaxe.json
{
"replace": false,
"values": [
"examplemod:ruby_ore"
]
}이 태그가 없으면 곡괭이로 채굴해도 "올바른 도구"로 인식되지 않습니다.
4-3. 필요 티어 태그
경로: src/main/resources/data/minecraft/tags/block/needs_iron_tool.json
{
"replace": false,
"values": [
"examplemod:ruby_ore"
]
}needs_iron_tool 태그가 없으면 나무 곡괭이로도 채굴됩니다. 티어 태그 종류:
| 태그 | 최소 도구 |
|---|---|
needs_stone_tool | 돌 곡괭이 이상 |
needs_iron_tool | 철 곡괭이 이상 |
needs_diamond_tool | 다이아몬드 곡괭이 이상 |
5. 안티패턴 — 루트 JSON 누락
⚠️ 루트 JSON 누락
data/examplemod/loot_table/blocks/first_block.json파일이 없으면:
- 채굴해도 아무 드롭 없음 (빈 드롭)
- 게임은 정상 동작 (크래시 없음)
- 콘솔에 경고도 없어서 원인 파악이 어려움
새 블록을 등록할 때마다 루트 JSON을 함께 추가하세요.
6. DataGen 대안
JSON을 직접 작성하는 대신 Java 코드로 루트 테이블을 생성하는 DataGen 방식도 있습니다. 파일 수가 많아지면 DataGen이 유지보수에 유리합니다. 자세한 내용은 appendix-datagen — 루트 테이블 DataGen을 참고하세요.
요약
| 단계 | 파일 | 내용 |
|---|---|---|
| 1 | loot_table/blocks/first_block.json | 단순 드롭 + survives_explosion 조건 |
| 2 | loot_table/blocks/ruby_ore.json | 변동 수량 + Fortune 보너스 |
| 3 | ExampleMod.java | requiresCorrectToolForDrops() 추가 |
| 4 | tags/block/mineable/pickaxe.json | 곡괭이 채굴 가능 태그 |
| 5 | tags/block/needs_iron_tool.json | 철 곡괭이 이상 필요 태그 |
다음 챕터에서는 블록에 커스텀 BlockEntity를 붙여 데이터를 저장하는 방법을 학습합니다.