방어구와 ArmorItem
ArmorMaterials enum과 4종 슬롯을 이해하고, 커스텀 방어구 세트를 등록하는 방법을 학습합니다.
방어구와 ArmorItem
방어구는 아이템 중에서도 특별한 위치를 차지합니다. 단순히 인벤토리에 들어가는 게 아니라 캐릭터 모델에 직접 렌더링되고, 방어력 수치가 전투 계산에 반영됩니다. NeoForge 26.1에서는 ArmorItem 클래스와 ArmorMaterials enum을 조합해서 방어구를 등록합니다.
1. ArmorMaterials — 바닐라 재질 목록
ArmorMaterials는 바닐라 방어구 재질을 정의하는 enum입니다. 각 재질은 방어력 수치, 인첸트 가중치, 내구도 배수, 넉백 저항, 장착 사운드를 포함합니다.
| 재질 | 방어력 합계 | 인첸트 가중치 | 특징 |
|---|---|---|---|
LEATHER | 7 | 15 | 가장 낮은 방어력, 염색 가능 |
CHAINMAIL | 12 | 12 | 중간 방어력, 제작 불가 (용광로) |
IRON | 15 | 9 | 기본 금속 방어구 |
GOLD | 11 | 25 | 낮은 방어력이지만 인첸트 가중치 최고 |
DIAMOND | 20 | 10 | 높은 방어력, 내구도 우수 |
NETHERITE | 20 | 15 | 다이아몬드와 동일 방어력, 용암 면역 |
TURTLE | 2 | 9 | 헬멧 전용, 수중 호흡 효과 |
커스텀 방어구를 만들 때는 기존 재질 중 하나를 그대로 빌려 쓰는 게 가장 빠릅니다. 이 챕터에서는 ArmorMaterials.DIAMOND를 재질로 사용하는 루비 방어구 세트를 만듭니다.
2. 4종 슬롯 — ArmorItem.Type
방어구는 착용 위치에 따라 4가지 타입으로 나뉩니다.
ArmorItem.Type.HELMET // 머리 슬롯
ArmorItem.Type.CHESTPLATE // 가슴 슬롯
ArmorItem.Type.LEGGINGS // 다리 슬롯
ArmorItem.Type.BOOTS // 발 슬롯각 타입은 방어력 분배 비율이 다릅니다. 예를 들어 다이아몬드 기준으로 헬멧 3, 체스트플레이트 8, 레깅스 6, 부츠 3으로 총 20이 됩니다.
3. 방어구 등록 코드
ExampleMod.java에 루비 방어구 4종을 등록합니다.
// examplemod-template-26.1.2/src/main/java/com/example/examplemod/ExampleMod.java
// 방어구 4종 등록
public static final DeferredItem<ArmorItem> RUBY_HELMET = ITEMS.registerItem("ruby_helmet",
props -> new ArmorItem(ArmorMaterials.DIAMOND, ArmorItem.Type.HELMET, props));
public static final DeferredItem<ArmorItem> RUBY_CHESTPLATE = ITEMS.registerItem("ruby_chestplate",
props -> new ArmorItem(ArmorMaterials.DIAMOND, ArmorItem.Type.CHESTPLATE, props));
public static final DeferredItem<ArmorItem> RUBY_LEGGINGS = ITEMS.registerItem("ruby_leggings",
props -> new ArmorItem(ArmorMaterials.DIAMOND, ArmorItem.Type.LEGGINGS, props));
public static final DeferredItem<ArmorItem> RUBY_BOOTS = ITEMS.registerItem("ruby_boots",
props -> new ArmorItem(ArmorMaterials.DIAMOND, ArmorItem.Type.BOOTS, props));패턴이 단순합니다. ITEMS.registerItem(이름, props -> new ArmorItem(재질, 타입, props)). 4종 모두 같은 구조이고 타입만 바뀝니다. NeoForge 26.1.2에서는 registerItem 람다가 넘겨주는 props를 그대로 생성자에 전달해야 합니다. 람다 밖에서 new Item.Properties()를 직접 만들면 등록 시 ID가 설정되지 않아 크래시합니다.
필요한 import도 추가합니다.
import net.minecraft.world.item.ArmorItem;
import net.minecraft.world.item.ArmorMaterials;
import net.neoforged.neoforge.registries.DeferredItem;4. 텍스처 파일 — Layer 시스템
방어구 텍스처는 아이템 텍스처와 별개입니다. 인벤토리에 보이는 아이콘은 일반 아이템 텍스처(textures/item/)를 쓰지만, 캐릭터 모델에 장착됐을 때 보이는 텍스처는 별도의 layer 파일을 씁니다.
assets/<modId>/textures/models/armor/
├── ruby_layer_1.png ← 헬멧, 체스트플레이트, 부츠 (상반신 레이어)
└── ruby_layer_2.png ← 레깅스 (하반신 레이어)
파일명 규칙은 <재질명>_layer_1.png / <재질명>_layer_2.png입니다. 여기서 재질명은 ArmorMaterials enum 값이 아니라 텍스처 경로에 쓸 임의 문자열입니다. 바닐라 코드에서는 ArmorMaterial 인터페이스의 getName() 반환값을 씁니다.
바닐라 ArmorMaterials.DIAMOND를 재질로 쓰면 게임은 자동으로 diamond_layer_1.png와 diamond_layer_2.png를 찾습니다. 커스텀 재질을 만들면 직접 이름을 지정할 수 있습니다.
권장 해상도는 64×32 픽셀입니다. 바닐라 텍스처를 참고해서 UV 레이아웃을 맞춰야 합니다.
5. 아이템 텍스처 등록
장착 텍스처 외에 인벤토리 아이콘도 필요합니다. 일반 아이템과 동일하게 textures/item/ 경로에 추가합니다.
assets/examplemod/textures/item/
├── ruby_helmet.png
├── ruby_chestplate.png
├── ruby_leggings.png
└── ruby_boots.png
모델 파일도 각각 필요합니다.
// assets/examplemod/models/item/ruby_helmet.json
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "examplemod:item/ruby_helmet"
}
}4종 모두 같은 구조입니다. layer0 값만 각 아이템 이름으로 바꿉니다.
6. 장착 효과와 방어 수치
ArmorMaterials.DIAMOND를 재질로 쓰면 다이아몬드 방어구와 동일한 수치를 가집니다.
| 슬롯 | 방어력 | 인첸트 가중치 |
|---|---|---|
| 헬멧 | 3 | 10 |
| 체스트플레이트 | 8 | 10 |
| 레깅스 | 6 | 10 |
| 부츠 | 3 | 10 |
방어력 수치를 바꾸려면 커스텀 ArmorMaterial을 구현해야 합니다. 이 챕터에서는 바닐라 재질을 그대로 빌려 쓰는 방식만 다룹니다.
7. 인게임 확인
방어구를 등록하고 빌드한 뒤 게임을 실행하면 크리에이티브 인벤토리에서 확인할 수 있습니다. 방어구를 장착하고 F5 키로 3인칭 시점으로 전환하면 캐릭터 모델에 텍스처가 적용된 모습을 볼 수 있습니다.
텍스처 파일을 아직 추가하지 않았다면 장착 시 보라/검정 패턴이 나타납니다. 아래 안티패턴 섹션을 참고하세요.
⚠️ Layer 텍스처 누락
<material>_layer_1.png누락 시:
- 장착 후 캐릭터 모델에 보라/검정 텍스처가 나타납니다.
- 콘솔 경고:
"Missing model for armor layer"해결:
layer_1과layer_2모두 추가하세요 (64×32 권장).
정리
ArmorItem은(재질, 타입, 속성)세 인자를 받습니다.- 바닐라
ArmorMaterialsenum 7종 중 하나를 재질로 쓸 수 있습니다. - 장착 텍스처는
textures/models/armor/<재질명>_layer_1.png/_layer_2.png두 파일이 필요합니다. - 인벤토리 아이콘은 일반 아이템과 동일하게
textures/item/경로를 씁니다.
다음 챕터에서는 커스텀 ArmorMaterial을 직접 구현해서 방어력 수치와 인첸트 가중치를 원하는 대로 조정하는 방법을 다룹니다.
도구 아이템 — Tier 시스템과 4종 도구 등록
NeoForge 26.1.2의 도구 아이템 등록을 학습합니다. PickaxeItem·SwordItem은 삭제되어 ToolMaterial.applyToolProperties/applySwordProperties로 대체되고, AxeItem·ShovelItem은 ToolMaterial을 받습니다.
DataComponents — NBT를 대체하는 타입 안전 데이터 저장
NeoForge 26(Minecraft 1.20.5+)에서 도입된 DataComponentType<T>로 ItemStack에 타입 안전하게 데이터를 저장하고 읽는 방법을 학습합니다.