모드 전용 크리에이티브 탭
DeferredRegister로 모드 전용 CreativeModeTab을 등록하고, BuildCreativeModeTabContentsEvent로 바닐라 탭에도 아이템을 추가하는 방법을 배웁니다.
크리에이티브 모드에서 모드 아이템을 찾으려면 탭이 필요합니다. 바닐라 탭에 섞어 넣을 수도 있지만, 모드 규모가 커질수록 전용 탭 하나가 훨씬 깔끔합니다. 이 챕터에서는 두 가지를 모두 다룹니다.
CreativeModeTab 등록 구조
NeoForge에서 크리에이티브 탭은 Registries.CREATIVE_MODE_TAB 레지스트리에 등록합니다. 아이템과 마찬가지로 DeferredRegister를 사용합니다.
public static final DeferredRegister<CreativeModeTab> CREATIVE_MODE_TABS =
DeferredRegister.create(Registries.CREATIVE_MODE_TAB, MOD_ID);탭 자체는 CreativeModeTab.builder()로 빌드합니다. 빌더에서 설정할 수 있는 주요 항목은 세 가지입니다.
| 메소드 | 역할 |
|---|---|
title(Component) | 탭 이름 (번역 키 사용 권장) |
icon(Supplier<ItemStack>) | 탭 아이콘 아이템 |
displayItems(DisplayItemsGenerator) | 탭에 표시할 아이템 목록 |
MASTER_TOOLS_TAB 등록
MasterToolsMod.java에 탭 레지스터와 탭 인스턴스를 추가합니다.
// ─── 크리에이티브 탭 레지스터 ────────────────────────────────────────────────
public static final DeferredRegister<CreativeModeTab> CREATIVE_MODE_TABS =
DeferredRegister.create(Registries.CREATIVE_MODE_TAB, MOD_ID);
public static final Supplier<CreativeModeTab> MASTER_TOOLS_TAB = CREATIVE_MODE_TABS.register(
"master_tools_tab",
() -> CreativeModeTab.builder()
.title(Component.translatable("itemGroup.master_tools"))
.icon(() -> RUBY.get().getDefaultInstance())
.displayItems((params, output) -> {
output.accept(RUBY.get());
output.accept(SAPPHIRE.get());
output.accept(RUBY_PICKAXE.get());
output.accept(RUBY_SWORD.get());
output.accept(RUBY_AXE.get());
output.accept(RUBY_SHOVEL.get());
})
.build()
);displayItems 람다의 output.accept(item) 순서가 탭 안에서 아이템이 나열되는 순서입니다. 재료 보석을 앞에, 도구를 뒤에 두면 직관적입니다.
생성자에서 레지스터 연결
탭 레지스터를 modEventBus에 연결하지 않으면 탭이 게임에 나타나지 않습니다. 생성자에 한 줄 추가합니다.
public MasterToolsMod(IEventBus modEventBus, ModContainer container) {
LOGGER.info("Master Tools Mod 로드 완료");
ITEMS.register(modEventBus);
COMPONENTS.register(modEventBus);
CREATIVE_MODE_TABS.register(modEventBus); // 추가
modEventBus.addListener(MasterToolsMod::buildContents); // 추가
}CREATIVE_MODE_TABS.register(modEventBus) 한 줄이 없으면 탭 등록 이벤트가 발생하지 않아 탭이 아예 생성되지 않습니다.
바닐라 탭에 아이템 추가 (BuildCreativeModeTabContentsEvent)
모드 전용 탭 외에, 바닐라 재료(Ingredients) 탭에도 루비와 사파이어를 추가하면 탭을 모르는 플레이어도 아이템을 발견할 수 있습니다.
@SubscribeEvent
public static void buildContents(BuildCreativeModeTabContentsEvent event) {
if (event.getTabKey() == CreativeModeTabs.INGREDIENTS) {
event.accept(RUBY.get());
event.accept(SAPPHIRE.get());
}
}event.getTabKey()로 어느 탭인지 확인한 뒤 event.accept(item)으로 아이템을 추가합니다. 이 방식은 바닐라 탭뿐 아니라 다른 모드의 탭에도 적용할 수 있습니다.
⚠️ 다른 모드 아이템 탭에 포함 금지
displayItems에 다른 모드의 아이템을 추가하면:
- 의존성 미선언 시
ClassNotFoundException- 모드 간 결합도 증가
항상 자기 모드 아이템만
displayItems에 추가하세요. 바닐라 탭에는BuildCreativeModeTabContentsEvent만 사용합니다.
lang 파일에 탭 이름 추가
Component.translatable("itemGroup.master_tools")를 사용했으므로 lang 파일에 번역 키를 추가해야 합니다.
assets/master_tools/lang/ko_kr.json
{
"item.master_tools.ruby": "루비",
"item.master_tools.sapphire": "사파이어",
"item.master_tools.ruby_pickaxe": "루비 곡괭이",
"item.master_tools.ruby_sword": "루비 검",
"item.master_tools.ruby_axe": "루비 도끼",
"item.master_tools.ruby_shovel": "루비 삽",
"itemGroup.master_tools": "마스터 도구"
}assets/master_tools/lang/en_us.json
{
"item.master_tools.ruby": "Ruby",
"item.master_tools.sapphire": "Sapphire",
"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",
"itemGroup.master_tools": "Master Tools"
}itemGroup. prefix는 NeoForge 크리에이티브 탭 번역 키 관례입니다. 바닐라도 같은 패턴을 사용합니다 (예: itemGroup.buildingBlocks).
전체 등록 흐름 요약
검증 체크리스트
-
CREATIVE_MODE_TABS.register(modEventBus)생성자에 추가됨 -
modEventBus.addListener(MasterToolsMod::buildContents)추가됨 -
itemGroup.master_tools번역 키가 ko_kr.json, en_us.json 양쪽에 있음 -
displayItems에 자기 모드 아이템만 포함됨 -
./gradlew build성공
다음 챕터에서는 루비의 PURITY DataComponent를 활용해 순도에 따라 도구 내구도가 달라지는 로직을 구현합니다.