이 챕터에서는 마스터 트랙 기계 모드의 핵심 블록인 분쇄기(Crusher) 를 등록합니다. 단순 블록 등록을 넘어, HorizontalDirectionalBlock.FACINGBlockState 속성을 추가하여 플레이어가 블록을 설치할 때 자동으로 방향이 결정되도록 구현합니다.
이 챕터의 범위: 블록 클래스 + BlockState(방향) + 리소스 파일. 진행 상태 저장(BlockEntity)은 다음 챕터에서 다룹니다.
Block을 직접 상속하고, FACING DirectionProperty를 선언합니다. registerDefaultState에서 기본 방향을 NORTH로 설정하고, getStateForPlacement에서 플레이어가 바라보는 방향의 반대를 반환합니다.
// examplemod-master-projects/machine/src/main/java/com/example/master/machine/block/CrusherBlock.javapackage 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()); }}
DeferredRegister.createBlocks()와 DeferredRegister.createItems()로 분쇄기를 등록합니다. 블록 아이템(BlockItem)도 함께 등록해야 인벤토리에서 블록을 다룰 수 있습니다.
// examplemod-master-projects/machine/src/main/java/com/example/master/machine/MasterMachineMod.javapackage 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); }}
// ❌ FACING 속성을 정의하지 않으면 어떤 방향으로 설치해도 항상 NORTHpublic class CrusherBlock extends Block { // createBlockStateDefinition 오버라이드 없음 // getStateForPlacement 오버라이드 없음}// ✅ HorizontalDirectionalBlock.FACING 추가// registerDefaultState + createBlockStateDefinition + getStateForPlacement// 세 가지 모두 있어야 방향 전환 동작