마스터 트랙 #1: 도구 모드 프로젝트 셋업
examplemod-master-projects/tools/ 에서 Ruby/Sapphire 보석 + 4종 도구 + 자체 크리에이티브 탭을 만드는 독립 마스터 모드의 초기 구조를 설정합니다.
마스터 트랙이란?
phase-5까지의 학습을 마쳤다면 이제 실전 독립 모드를 만들 준비가 됐습니다. 마스터 트랙은 네 가지 독립 프로젝트 중 하나를 선택해 완성하는 캡스톤 과정입니다.
이 챕터 시리즈는 도구 모드(Tools Mod) 트랙입니다. 완성 목표는 다음과 같습니다.
- 🔴 Ruby / 💙 Sapphire: 두 가지 희귀 보석 아이템 (RARE 등급)
purityDataComponent: 보석의 순도(0~100)를 저장하는 커스텀 컴포넌트- 루비 도구 4종: 곡괭이 · 검 · 도끼 · 삽 (RubyTier 내구도 체계)
- 자체 크리에이티브 탭: 모드 전용 탭에 모든 아이템 등록
- 레시피: 보석 → 도구 조합법 데이터팩으로 완성
프로젝트 소스는 examplemod-master-projects/tools/ 에 위치합니다.
프로젝트 구조 확인
마스터 트랙 프로젝트는 학습 코스 템플릿과 완전히 분리된 독립 Gradle 프로젝트입니다.
examplemod-master-projects/
└── tools/
├── build.gradle ← NeoForge ModDev 플러그인 설정
├── gradle.properties ← mod_id=master_tools, mc/neo 버전
├── settings.gradle
├── gradlew / gradlew.bat
└── src/
└── main/
├── java/com/example/master/tools/
│ ├── MasterToolsMod.java ← 메인 진입점 (이번 챕터)
│ └── RubyTier.java ← 도구 티어 정의 (다음 챕터)
├── resources/
│ └── pack.mcmeta
└── templates/META-INF/
└── neoforge.mods.toml
examplemod-template-26.1.2/ 와는 별개의 Gradle 프로젝트입니다. 두 프로젝트를 같은 mods/ 디렉토리에 넣을 때 mod_id 가 겹치면 충돌이 발생하므로 주의하세요.
gradle.properties 확인
# examplemod-master-projects/tools/gradle.properties
minecraft_version=26.1.2
minecraft_version_range=[26.1.2]
neo_version=26.1.2.64-beta
mod_id=master_tools
mod_name=Master Tools
mod_license=All Rights Reserved
mod_version=1.0.0
mod_group_id=com.example.master.toolsmod_id=master_tools 가 이 모드의 고유 식별자입니다. neoforge.mods.toml 의 modId 와 동일해야 합니다.
MasterToolsMod.java
이번 챕터에서 확인하는 메인 클래스입니다. 아이템 레지스터, 보석 아이템, 도구 4종, DataComponent 레지스터를 선언합니다. 다음 챕터들에서 이 선언을 기반으로 기능을 하나씩 구현합니다.
// examplemod-master-projects/tools/src/main/java/com/example/master/tools/MasterToolsMod.java
package com.example.master.tools;
import com.mojang.logging.LogUtils;
import com.mojang.serialization.Codec;
import net.minecraft.core.component.DataComponentType;
import net.minecraft.core.registries.Registries;
import net.minecraft.network.codec.ByteBufCodecs;
import net.minecraft.tags.BlockTags;
import net.minecraft.world.item.*;
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);
// ─── 보석 재료 아이템 ───────────────────────────────────────────────────
/** 루비 — 순도(purity) DataComponent를 가지는 보석 아이템 */
public static final Supplier<Item> RUBY = ITEMS.registerItem("ruby",
props -> new Item(props
.stacksTo(64)
.rarity(Rarity.RARE)));
public static final Supplier<Item> SAPPHIRE = ITEMS.registerItem("sapphire",
props -> new Item(props
.stacksTo(64)
.rarity(Rarity.RARE)));
// ─── 루비 도구 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 // 공격 속도
)));
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));
// ─── DataComponent 레지스터 ─────────────────────────────────────────────
public static final DeferredRegister.DataComponents COMPONENTS =
DeferredRegister.createDataComponents(Registries.DATA_COMPONENT_TYPE, MOD_ID);
/**
* 보석 순도 (0 ~ 100).
* 순도가 높을수록 다음 챕터에서 도구 내구도 보너스가 증가합니다.
*/
public static final Supplier<DataComponentType<Integer>> PURITY =
COMPONENTS.registerComponentType(
"purity",
builder -> builder
.persistent(Codec.INT)
.networkSynchronized(ByteBufCodecs.INT));
public MasterToolsMod(IEventBus modEventBus, ModContainer container) {
LOGGER.info("Master Tools Mod 로드 완료");
ITEMS.register(modEventBus);
COMPONENTS.register(modEventBus);
}
}주요 포인트
| 선언 | 역할 |
|---|---|
DeferredRegister.Items ITEMS | 모든 아이템 지연 등록 — MOD_ID 네임스페이스 |
DeferredRegister.DataComponents COMPONENTS | purity DataComponent 지연 등록 |
RUBY, SAPPHIRE | Rarity.RARE 등급의 보석 재료 아이템 |
RUBY_PICKAXE … RUBY_SHOVEL | RubyTier.INSTANCE 기반 도구 4종 |
PURITY | Codec.INT + ByteBufCodecs.INT — 서버↔클라이언트 동기화 가능 |
ITEMS.register(modEventBus) | FML 모드 이벤트 버스에 레지스터 등록 — 반드시 생성자에서 호출 |
Gradle 빌드 확인
build.gradle 에는 NeoForge ModDev 플러그인 2.0.141 과 JDK 25 툴체인이 설정돼 있습니다.
터미널에서 사용 가능한 태스크 목록을 확인하려면:
cd examplemod-master-projects/tools
./gradlew tasksBuild tasks, NeoForge tasks, Verification tasks 그룹이 표시되면 정상입니다. 실제 빌드 검증은 05-finish-build 챕터에서 수행합니다.
⚠️ mod_id 충돌
// ❌ template과 같은 mod_id 사용 → 같은 mods/ 디렉토리에 두 JAR 로드 시 충돌 @Mod("examplemod") public class MasterToolsMod { ... } // ✅ 고유한 mod_id @Mod("master_tools") public class MasterToolsMod { ... }
gradle.properties의mod_id와neoforge.mods.toml의modId도 반드시 일치해야 합니다. 세 곳 중 하나라도 다르면 FML이 모드를 로드하지 못합니다.
다음 단계
이번 챕터에서는 프로젝트 구조와 메인 클래스 골격을 확인했습니다. 다음 챕터들에서 순차적으로 완성합니다.
- 01-ruby-tier —
RubyTier.java구현 (내구도 · 속도 · 공격력) - 02-creative-tab — 자체 크리에이티브 탭 추가
- 03-textures-models — 루비/사파이어 텍스처 · 모델
- 04-recipes — 조합법 데이터팩
- 05-finish-build — 통합 빌드 & 인게임 검증
인게임에서 실제로 아이템을 확인하는 검증은 05-finish-build 챕터에서 진행합니다.