NeoForge 26.1 Docs
  • 문서
  • 노트
NeoForge 26.1
NeoForge 26.1
v26.1
학습 진도
0 / 77 챕터 완료방문 0
마스터 트랙 #3: 기계 모드 프로젝트 셋업분쇄기 블록 등록 — CrusherBlock + facing BlockStateBlockEntity + 인벤토리 — ItemStackHandlerMenu + Screen — GUI 구현화면 위젯 — 진행 바와 슬롯 시각화커스텀 레시피 타입 — Crusher Recipe서버↔클라이언트 동기화 패킷기계 모드 마무리 + JAR 빌드
마스터기계

분쇄기 블록 등록 — CrusherBlock + facing BlockState

DeferredRegister.Blocks/Items로 CrusherBlock을 등록하고, HorizontalDirectionalBlock.FACING 속성으로 플레이어가 바라보는 방향 반대로 블록이 설치되는 로직을 구현합니다.

분쇄기 블록 등록 — CrusherBlock + facing BlockState

이 챕터에서는 마스터 트랙 기계 모드의 핵심 블록인 분쇄기(Crusher) 를 등록합니다. 단순 블록 등록을 넘어, HorizontalDirectionalBlock.FACING BlockState 속성을 추가하여 플레이어가 블록을 설치할 때 자동으로 방향이 결정되도록 구현합니다.

이 챕터의 범위: 블록 클래스 + BlockState(방향) + 리소스 파일. 진행 상태 저장(BlockEntity)은 다음 챕터에서 다룹니다.


1. CrusherBlock 클래스

Block을 직접 상속하고, FACING DirectionProperty를 선언합니다. registerDefaultState에서 기본 방향을 NORTH로 설정하고, getStateForPlacement에서 플레이어가 바라보는 방향의 반대를 반환합니다.

// examplemod-master-projects/machine/src/main/java/com/example/master/machine/block/CrusherBlock.java
package com.example.master.machine.block;
 
import net.minecraft.core.Direction;
import net.minecraft.world.item.context.BlockPlaceContext;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.HorizontalDirectionalBlock;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.block.state.StateDefinition;
import net.minecraft.world.level.block.state.properties.DirectionProperty;
 
public class CrusherBlock extends Block {
 
    /** 4방향(N/S/E/W) 수평 방향 속성 */
    public static final DirectionProperty FACING = HorizontalDirectionalBlock.FACING;
 
    public CrusherBlock(Properties props) {
        super(props);
        // 기본 BlockState: NORTH 방향
        registerDefaultState(stateDefinition.any().setValue(FACING, Direction.NORTH));
    }
 
    @Override
    protected void createBlockStateDefinition(StateDefinition.Builder<Block, BlockState> builder) {
        builder.add(FACING);
    }
 
    /**
     * 블록 설치 시 호출 — 플레이어가 바라보는 방향의 반대로 블록 전면(face)이 향하도록 설정.
     * 예: 플레이어가 SOUTH를 바라보며 설치 → 블록 FACING = SOUTH (분쇄기 전면이 플레이어 쪽)
     */
    @Override
    public BlockState getStateForPlacement(BlockPlaceContext context) {
        return defaultBlockState().setValue(FACING, context.getHorizontalDirection().getOpposite());
    }
}

핵심 포인트:

메서드역할
registerDefaultState(...)블록 최초 배치·데이터팩 기본값 설정
createBlockStateDefinition(...)FACING을 BlockState 속성으로 등록
getStateForPlacement(...)설치 순간 BlockState 결정 (방향 로직)

2. MasterMachineMod.java — BLOCKS·ITEMS 등록

DeferredRegister.createBlocks()와 DeferredRegister.createItems()로 분쇄기를 등록합니다. 블록 아이템(BlockItem)도 함께 등록해야 인벤토리에서 블록을 다룰 수 있습니다.

// examplemod-master-projects/machine/src/main/java/com/example/master/machine/MasterMachineMod.java
package com.example.master.machine;
 
import com.example.master.machine.block.CrusherBlock;
import net.minecraft.world.item.BlockItem;
import net.minecraft.world.item.Item;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.SoundType;
import net.minecraft.world.level.block.state.BlockBehaviour;
import net.neoforged.bus.api.IEventBus;
import net.neoforged.fml.ModContainer;
import net.neoforged.fml.common.Mod;
import net.neoforged.neoforge.registries.DeferredRegister;
 
import java.util.function.Supplier;
 
@Mod(MasterMachineMod.MOD_ID)
public class MasterMachineMod {
 
    public static final String MOD_ID = "master_machine";
 
    public static final DeferredRegister.Blocks BLOCKS =
            DeferredRegister.createBlocks(MOD_ID);
 
    public static final DeferredRegister.Items ITEMS =
            DeferredRegister.createItems(MOD_ID);
 
    /** 분쇄기 블록 — 강도 3.5/6.0, 금속 사운드, 올바른 도구 필요 */
    public static final Supplier<Block> CRUSHER = BLOCKS.registerBlock("crusher",
            props -> new CrusherBlock(props
                    .strength(3.5f, 6.0f)
                    .sound(SoundType.METAL)
                    .requiresCorrectToolForDrops()));
 
    /** 분쇄기 블록 아이템 — 인벤토리에서 설치 가능하게 */
    // 26.1.2: BlockItem 의 기본 번역키는 item.* 다. useBlockDescriptionPrefix() 를
    // 호출해 block.master_machine.crusher 키를 재사용해야 lang 과 일치한다.
    // (registerSimpleBlockItem(...) 헬퍼가 내부적으로 하는 것과 동일.)
    public static final Supplier<Item> CRUSHER_ITEM = ITEMS.registerItem("crusher",
            props -> new BlockItem(CRUSHER.get(), props.useBlockDescriptionPrefix()));
 
    public MasterMachineMod(IEventBus modEventBus, ModContainer container) {
        BLOCKS.register(modEventBus);
        ITEMS.register(modEventBus);
    }
}

BlockBehaviour.Properties 설명:

속성값의미
strength(3.5f, 6.0f)파괴 시간 / 폭발 저항철 블록보다 약간 강함
sound(SoundType.METAL)금속 타격음분쇄기 느낌 강조
requiresCorrectToolForDrops()곡괭이 필요맨손으로 캐면 아이템 드랍 없음

3. ⚠️ FACING 속성 누락 — 가장 흔한 실수

⚠️ facing 속성 누락 → 항상 같은 방향

// ❌ FACING 속성을 정의하지 않으면 어떤 방향으로 설치해도 항상 NORTH
public class CrusherBlock extends Block {
    // createBlockStateDefinition 오버라이드 없음
    // getStateForPlacement 오버라이드 없음
}
 
// ✅ HorizontalDirectionalBlock.FACING 추가
// registerDefaultState + createBlockStateDefinition + getStateForPlacement
// 세 가지 모두 있어야 방향 전환 동작

4. 리소스 파일

4-1. BlockState JSON — 4방향 variant

FACING 속성이 NORTH/SOUTH/EAST/WEST에 따라 모델이 회전합니다.

// assets/master_machine/blockstates/crusher.json
{
  "variants": {
    "facing=north": { "model": "master_machine:block/crusher" },
    "facing=south": { "model": "master_machine:block/crusher", "y": 180 },
    "facing=east":  { "model": "master_machine:block/crusher", "y": 90 },
    "facing=west":  { "model": "master_machine:block/crusher", "y": 270 }
  }
}

4-2. 블록 모델 JSON — orientable (전면 텍스처 구분)

item/orientable을 사용하면 front·side·top 텍스처를 별도로 지정할 수 있습니다.

// assets/master_machine/models/block/crusher.json
{
  "parent": "minecraft:block/orientable",
  "textures": {
    "top":   "master_machine:block/crusher_top",
    "front": "master_machine:block/crusher_front",
    "side":  "master_machine:block/crusher_side"
  }
}

4-3. 아이템 모델 JSON

// assets/master_machine/models/item/crusher.json
{
  "parent": "master_machine:block/crusher"
}

4-4. 언어 파일

// assets/master_machine/lang/ko_kr.json
{
  "block.master_machine.crusher": "분쇄기"
}
// assets/master_machine/lang/en_us.json
{
  "block.master_machine.crusher": "Crusher"
}

5. 인게임 확인 — 4방향 회전

블록이 등록된 후 인게임에서 4방향으로 설치해 FACING이 올바르게 작동하는지 확인합니다.

ℹ️

📷 스크린샷 자리 (직접 캡처해 추가하세요)

BlockState 4방향 — 분쇄기 설치 방향 확인

  1. 크리에이티브 탭에서 분쇄기 아이템 검색
  2. 동/서/남/북 방향으로 각각 설치
  3. F3 디버그 화면에서 block_state 항목의 facing= 값 확인
  4. 전면 텍스처(crusher_front)가 플레이어 쪽을 향하는지 육안 확인

모델만 있고 BlockEntity 없음: 현 챕터에서는 블록이 시각적으로만 존재합니다. 진행 상태 저장(에너지 Bar, 진행 게이지)은 다음 챕터의 CrusherBlockEntity에서 구현합니다.


정리

항목내용
CrusherBlock.FACINGDirectionProperty — N/S/E/W 4방향 BlockState
getStateForPlacement설치 시 플레이어 방향의 반대를 자동 계산
BLOCKS / ITEMSDeferredRegister로 분리 등록, 이벤트 버스에 연결
BlockState JSON4 variant → y 회전값으로 모델 방향 전환
블록 모델orientable 부모 — top/front/side 텍스처 분리

다음 챕터에서는 CrusherBlockEntity를 구현하여 에너지·진행도·인벤토리를 저장하는 기계 블록을 완성합니다.

마스터 트랙 #3: 기계 모드 프로젝트 셋업

examplemod-master-projects/machine/ 에서 Crusher 기계 블록 + BlockEntity + GUI + 레시피 시스템 + 네트워킹을 만드는 독립 마스터 모드의 초기 구조를 설정합니다.

BlockEntity + 인벤토리 — ItemStackHandler

CrusherBlockEntity에 ItemStackHandler로 2슬롯 인벤토리를 구현하고, NBT 직렬화와 Capability 등록으로 Hopper 자동 투입을 지원합니다.

On this page

분쇄기 블록 등록 — CrusherBlock + facing BlockState1. CrusherBlock 클래스2. MasterMachineMod.java — BLOCKS·ITEMS 등록3. ⚠️ FACING 속성 누락 — 가장 흔한 실수4. 리소스 파일4-1. BlockState JSON — 4방향 variant4-2. 블록 모델 JSON — orientable (전면 텍스처 구분)4-3. 아이템 모델 JSON4-4. 언어 파일5. 인게임 확인 — 4방향 회전정리
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