NeoForge 26.1 Docs
  • 문서
  • 노트
NeoForge 26.1
NeoForge 26.1
v26.1
학습 진도
0 / 77 챕터 완료방문 0
마스터 트랙 #1: 도구 모드 프로젝트 셋업보석 아이템 디자인 — Ruby & Sapphire커스텀 ToolTier + 루비 도구 4종모드 전용 크리에이티브 탭조합 레시피 + 아이템 태그모드 마무리 + 빌드 JAR
마스터도구

커스텀 ToolTier + 루비 도구 4종

Tier 인터페이스를 직접 구현해 채굴 등급을 정의하고, 루비 곡괭이·검·도끼·삽 4종을 NeoForge DeferredRegister로 등록합니다.

ToolMaterial이란?

NeoForge에서 ToolMaterial은 도구의 채굴 성능 스펙을 담는 record입니다. net.minecraft.world.item.ToolMaterial을 한 번 생성하면 내구도·채굴 속도·공격력·인첸트 효율·수리 재료를 한 곳에서 관리할 수 있습니다.

MC 26.1.2 변경사항: 이전 버전의 Tier 인터페이스와 Tiers enum(WOOD, STONE, IRON, DIAMOND, NETHERITE)은 삭제되었습니다. 바닐라가 제공하던 상수는 이제 ToolMaterial.WOOD, .STONE, .COPPER, .IRON, .DIAMOND, .GOLD, .NETHERITE로 옮겨졌습니다.

마스터 트랙에서는 바닐라 상수를 쓰지 않고 ToolMaterial record를 직접 생성해 더 세밀하게 제어합니다.


ToolMaterial 값 의미 표

ToolMaterial record는 다음 순서의 인자로 생성합니다: ToolMaterial(incorrectBlocksForDrops, durability, speed, attackDamageBonus, enchantmentValue, repairItems)

인자의미참고 (Diamond)
incorrectBlocksForDrops채굴해도 드롭 없는 블록 태그INCORRECT_FOR_DIAMOND_TOOL
durability내구도 (사용 횟수)1561
speed채굴 속도 배율 (블록/초)8.0
attackDamageBonus공격력 추가치3.0
enchantmentValue인첸트 가능치10
repairItemsAnvil 수리 재료 (아이템 태그)#minecraft:diamond

채굴 레벨 결정 방법: 첫 번째 인자 incorrectBlocksForDrops로 결정됩니다. Diamond와 동일한 등급이면 INCORRECT_FOR_DIAMOND_TOOL, Netherite 수준이면 INCORRECT_FOR_NETHERITE_TOOL을 지정합니다.


1단계 — RubyTier(ToolMaterial) 정의

examplemod-master-projects/tools/src/main/java/com/example/master/tools/RubyTier.java

package com.example.master.tools;
 
import net.minecraft.resources.Identifier;
import net.minecraft.tags.BlockTags;
import net.minecraft.tags.ItemTags;
import net.minecraft.tags.TagKey;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ToolMaterial;
 
/**
 * 루비 ToolMaterial 정의.
 *
 * <p>MC 26.1.2 변경사항: {@code Tier} 인터페이스 삭제 →
 * {@link ToolMaterial} record로 교체.</p>
 *
 * <ul>
 *   <li>내구도: 1024 (Iron 250 &lt; Ruby &lt; Diamond 1561)</li>
 *   <li>채굴 속도: 8.0 (Diamond 동급)</li>
 *   <li>공격력 추가치: 3.5 (Iron 2.0, Diamond 3.0보다 높음)</li>
 *   <li>인첸트 가능치: 18 (Iron 14보다 우수)</li>
 *   <li>채굴 불가 블록: {@code INCORRECT_FOR_DIAMOND_TOOL} (흑요석 등)</li>
 *   <li>Anvil 수리 재료: {@code master_tools:repairs_ruby_tools} 태그</li>
 * </ul>
 */
public final class RubyTier {
 
    /**
     * Anvil 수리 아이템 태그.
     * {@code data/master_tools/tags/item/repairs_ruby_tools.json}에
     * ruby 아이템을 추가하면 Anvil 수리가 활성화됩니다.
     */
    public static final TagKey<Item> REPAIR_TAG =
            ItemTags.create(Identifier.fromNamespaceAndPath("master_tools", "repairs_ruby_tools"));
 
    /**
     * 루비 ToolMaterial 싱글턴.
     * ToolMaterial(incorrectBlocksForDrops, durability, speed, attackDamageBonus, enchantmentValue, repairItems)
     */
    public static final ToolMaterial INSTANCE = new ToolMaterial(
            BlockTags.INCORRECT_FOR_DIAMOND_TOOL,
            1024,
            8.0f,
            3.5f,
            18,
            REPAIR_TAG
    );
 
    private RubyTier() {}
}

왜 싱글턴? ToolMaterial은 상태가 없는 스펙 record입니다. 여러 도구가 같은 재질을 공유하므로 인스턴스를 하나만 만들어 INSTANCE로 참조하는 패턴이 표준입니다.


⚠️ 안티패턴: 수리 태그 누락/공백 → Anvil 수리 불가

⚠️ repairItems 태그 누락 → Anvil 수리 불가

// ❌ 수리 태그 자리에 빈 태그를 넘기거나, 태그 JSON 파일을 만들지 않음
public static final ToolMaterial INSTANCE = new ToolMaterial(
        BlockTags.INCORRECT_FOR_DIAMOND_TOOL,
        1024, 8.0f, 3.5f, 18,
        REPAIR_TAG   // ← data/.../tags/item/repairs_ruby_tools.json 이 비어 있으면 무효
);

ToolMaterial의 마지막 인자(repairItems) 태그에 어떤 아이템도 들어 있지 않으면, Anvil에서 도구 + 재료를 조합해도 수리가 전혀 이루어지지 않습니다 (슬롯이 그대로 유지됨).

항상 수리 태그를 지정하고, data/<ns>/tags/item/<tag>.json에 실제 수리 아이템을 채워 넣으세요.


2단계 — 도구 4종 + RUBY 아이템 등록

examplemod-master-projects/tools/src/main/java/com/example/master/tools/MasterToolsMod.java

package com.example.master.tools;
 
import com.mojang.logging.LogUtils;
import net.minecraft.tags.BlockTags;
import net.minecraft.world.item.AxeItem;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ShovelItem;
import net.neoforged.bus.api.IEventBus;
import net.neoforged.fml.ModContainer;
import net.neoforged.fml.common.Mod;
import net.neoforged.neoforge.registries.DeferredRegister;
import org.slf4j.Logger;
 
import java.util.function.Supplier;
 
@Mod(MasterToolsMod.MOD_ID)
public class MasterToolsMod {
 
    public static final String MOD_ID = "master_tools";
    public static final Logger LOGGER = LogUtils.getLogger();
 
    /** 아이템 레지스트리 */
    public static final DeferredRegister.Items ITEMS = DeferredRegister.createItems(MOD_ID);
 
    // 수리 재료 아이템
    public static final Supplier<Item> RUBY = ITEMS.registerItem("ruby",
            props -> new Item(props));
 
    // 루비 도구 4종
    // MC 26.1.2: PickaxeItem 삭제 → ToolMaterial.applyToolProperties() 사용.
    // MINEABLE_WITH_PICKAXE 태그로 곡괭이 채굴 동작 부여.
    public static final Supplier<Item> RUBY_PICKAXE = ITEMS.registerItem("ruby_pickaxe",
            props -> new Item(RubyTier.INSTANCE.applyToolProperties(
                    props,
                    BlockTags.MINEABLE_WITH_PICKAXE,
                    1.0f,   // 공격력 추가치
                    -2.8f,  // 공격 속도
                    0.0f    // 공격 범위 보너스
            )));
 
    // MC 26.1.2: SwordItem 삭제 → ToolMaterial.applySwordProperties() 사용.
    public static final Supplier<Item> RUBY_SWORD = ITEMS.registerItem("ruby_sword",
            props -> new Item(RubyTier.INSTANCE.applySwordProperties(
                    props,
                    3.0f,   // 기본 공격력
                    -2.4f   // 공격 속도
            )));
 
    // AxeItem / ShovelItem 은 존속 — 생성자에 ToolMaterial + 속성 전달.
    public static final Supplier<Item> RUBY_AXE = ITEMS.registerItem("ruby_axe",
            props -> new AxeItem(RubyTier.INSTANCE, 5.0f, -3.1f, props));
 
    public static final Supplier<Item> RUBY_SHOVEL = ITEMS.registerItem("ruby_shovel",
            props -> new ShovelItem(RubyTier.INSTANCE, 1.5f, -3.0f, props));
 
    public MasterToolsMod(IEventBus modEventBus, ModContainer container) {
        LOGGER.info("Master Tools Mod 로드 완료");
        ITEMS.register(modEventBus);
    }
}

MC 26.1.2 도구 등록 포인트:

  • 곡괭이·검은 더 이상 PickaxeItem/SwordItem이 없으므로 new Item(...) + ToolMaterial.applyToolProperties() / applySwordProperties()로 채굴/전투 속성을 부여합니다.
  • AxeItem/ShovelItem은 존속하며, 생성자에 ToolMaterial과 공격력·공격 속도·Properties를 전달합니다.
  • 모든 등록은 ITEMS.registerItem(name, props -> ...) 형식이며, 생성자 마지막에서 ITEMS.register(modEventBus) 호출이 필수입니다.

참고: 실제 예제(MasterToolsMod.java)에는 위 4종 도구 외에 루비/사파이어 보석, 광석 블록, 크리에이티브 탭, purity DataComponent 등록도 함께 들어 있습니다. 이 챕터에서는 ToolMaterial과 도구 등록 부분만 발췌했습니다.


3단계 — 리소스 파일

모델 (item/handheld)

도구 아이템은 손에 들리는 모델이므로 parent를 minecraft:item/handheld로 지정합니다. cube_all(블록)이나 generated(일반 아이템)가 아닌 점에 주의하세요.

assets/master_tools/models/item/ruby_pickaxe.json

{
  "parent": "minecraft:item/handheld",
  "textures": {
    "layer0": "master_tools:item/ruby_pickaxe"
  }
}

나머지 3종(ruby_sword, ruby_axe, ruby_shovel)도 동일한 구조로 작성합니다.

루비 원석은 generated를 사용합니다.

assets/master_tools/models/item/ruby.json

{
  "parent": "minecraft:item/generated",
  "textures": {
    "layer0": "master_tools:item/ruby"
  }
}

텍스처

각 도구의 PNG 텍스처는 assets/master_tools/textures/item/ 에 배치합니다.

textures/item/
├── ruby.png          # 루비 원석 아이콘 (16×16)
├── ruby_pickaxe.png  # 루비 곡괭이 (16×16)
├── ruby_sword.png    # 루비 검 (16×16)
├── ruby_axe.png      # 루비 도끼 (16×16)
└── ruby_shovel.png   # 루비 삽 (16×16)

다국어 (lang)

assets/master_tools/lang/ko_kr.json

{
  "item.master_tools.ruby": "루비",
  "item.master_tools.ruby_pickaxe": "루비 곡괭이",
  "item.master_tools.ruby_sword": "루비 검",
  "item.master_tools.ruby_axe": "루비 도끼",
  "item.master_tools.ruby_shovel": "루비 삽"
}

assets/master_tools/lang/en_us.json

{
  "item.master_tools.ruby": "Ruby",
  "item.master_tools.ruby_pickaxe": "Ruby Pickaxe",
  "item.master_tools.ruby_sword": "Ruby Sword",
  "item.master_tools.ruby_axe": "Ruby Axe",
  "item.master_tools.ruby_shovel": "Ruby Shovel"
}

ToolMaterial 밸런스 가이드

재질내구도채굴 속도공격력 추가인첸트
WOOD592.00.015
STONE1314.01.05
IRON2506.02.014
RUBY (커스텀)10248.03.518
DIAMOND15618.03.010
NETHERITE20319.04.015

밸런스 팁: 내구도가 Diamond보다 낮아야 게임 진행의 의미가 유지됩니다. durability 값이 1561을 넘으면 Diamond 도구를 사용할 이유가 없어집니다. 커스텀 ToolMaterial은 기존 재질 사이의 틈을 채우거나 특수한 트레이드오프를 주는 방향으로 설계하세요.


다음 단계

다음 챕터에서는 루비 도구를 크리에이티브 탭에 등록하고, 제작대 레시피와 스미스 작업대 업그레이드 레시피를 추가합니다.

보석 아이템 디자인 — Ruby & Sapphire

DeferredRegister로 Ruby, Sapphire 보석 아이템을 등록하고 DataComponentType으로 순도(purity) 컴포넌트를 설계합니다. 마스터 트랙 도구 제작의 첫 단계입니다.

모드 전용 크리에이티브 탭

DeferredRegister로 모드 전용 CreativeModeTab을 등록하고, BuildCreativeModeTabContentsEvent로 바닐라 탭에도 아이템을 추가하는 방법을 배웁니다.

On this page

ToolMaterial이란?ToolMaterial 값 의미 표1단계 — RubyTier(ToolMaterial) 정의⚠️ 안티패턴: 수리 태그 누락/공백 → Anvil 수리 불가2단계 — 도구 4종 + RUBY 아이템 등록3단계 — 리소스 파일모델 (item/handheld)텍스처다국어 (lang)ToolMaterial 밸런스 가이드다음 단계
NeoForge 26.1 Docs

NeoForge 26.1 모딩 개발 문서 사이트

GitHubDiscord

문서

  • 문서
  • 노트

GitHub

  • GitHub
  • Discord

© 2026 NeoForge 26.1 Docs. 콘텐츠는 MIT 라이선스로 제공됩니다.

Built with Next.js · Tailwind CSS · shadcn/ui