BlockBehaviour.Properties — strength, lightLevel, sound, requiresCorrectToolForDrops
BlockBehaviour.Properties 빌더의 주요 메소드를 학습하고 각 속성이 인게임 블록에 어떤 효과를 주는지 이해합니다.
BlockBehaviour.Properties — 블록 속성 빌더
블록을 등록할 때 BLOCKS.registerBlock("id", Block::new, props -> props...) 형태로 BlockBehaviour.Properties를 변형합니다. BlockBehaviour.Properties는 빌더 패턴으로 설계되어 있어서 메소드를 체이닝하면서 블록의 물리적 동작을 세밀하게 조정할 수 있습니다.
1. 빌더 패턴 기본 구조
registerBlock에 블록 팩토리(Block::new)와 Properties 변형 람다(props -> props...)를 넘깁니다. NeoForge 26.1.2에서는 registerBlock 계열이 내부에서 Properties.setId(...)를 호출하므로, 직접 new Block(Properties.of())를 만들면 "id not set"으로 크래시합니다.
// examplemod-template-26.1.2/src/main/java/com/example/examplemod/ExampleMod.java
public static final DeferredBlock<Block> METAL_BLOCK = BLOCKS.registerBlock("metal_block",
Block::new,
props -> props.strength(3.5f, 6.0f)
.lightLevel(s -> 15)
.sound(SoundType.METAL)
.requiresCorrectToolForDrops()
.mapColor(MapColor.METAL));메소드를 하나도 체이닝하지 않으면 기본값이 적용됩니다. 기본 블록은 채굴 시간 0, 폭발 저항 0, 소리 없음입니다.
2. 주요 속성 메소드
| 메소드 | 효과 | 예시 |
|---|---|---|
strength(h, r) | 채굴 시간, 폭발 저항 | .strength(3.5f, 6.0f) |
lightLevel(s -> N) | 발광 (0~15) | .lightLevel(s -> 15) |
sound(SoundType) | 발자국/채굴 소리 | .sound(SoundType.METAL) |
requiresCorrectToolForDrops() | 올바른 도구만 drop | (괄호 없음) |
mapColor(MapColor) | 지도 색상 | .mapColor(MapColor.METAL) |
noOcclusion() | 투명도 (유리 등) | (괄호 없음) |
pushReaction(PushReaction) | 피스톤 반응 | .pushReaction(PushReaction.BLOCK) |
3. strength
블록의 채굴 시간(hardness)과 폭발 저항(resistance)을 설정합니다. 인수를 하나만 넘기면 두 값이 같아집니다.
// hardness 3.5f, resistance 6.0f
BlockBehaviour.Properties.of().strength(3.5f, 6.0f)
// hardness = resistance = 2.0f (단일 인수)
BlockBehaviour.Properties.of().strength(2.0f)hardness가 -1이면 파괴 불가 블록(베드락 등)이 됩니다.
| 바닐라 블록 | hardness | resistance |
|---|---|---|
| 흙 | 0.5f | 0.5f |
| 돌 | 1.5f | 6.0f |
| 철 블록 | 5.0f | 6.0f |
| 흑요석 | 50.0f | 1200.0f |
| 베드락 | -1.0f | 3600000.0f |
4. lightLevel
블록이 방출하는 빛의 세기를 설정합니다. 람다 s -> N에서 s는 BlockState이고 N은 0~15 사이 정수입니다. 블록 상태에 따라 다른 밝기를 줄 수도 있습니다.
// 항상 최대 밝기 (횃불 수준)
BlockBehaviour.Properties.of().lightLevel(s -> 15)
// 항상 어두움 (기본값과 동일)
BlockBehaviour.Properties.of().lightLevel(s -> 0)s를 활용하면 블록 상태(예: 켜짐/꺼짐 프로퍼티)에 따라 밝기를 동적으로 바꿀 수 있습니다.
5. sound
블록을 밟거나 채굴할 때 나는 소리를 설정합니다. SoundType enum에서 선택합니다.
BlockBehaviour.Properties.of().sound(SoundType.METAL)자주 쓰는 SoundType 값:
| SoundType | 대표 바닐라 블록 |
|---|---|
SoundType.STONE | 돌, 조약돌 |
SoundType.METAL | 철 블록, 금 블록 |
SoundType.WOOD | 나무 판자 |
SoundType.GLASS | 유리 |
SoundType.GRAVEL | 자갈 |
SoundType.WET_GRASS | 잔디, 흙 |
SoundType.SLIME_BLOCK | 슬라임 블록 |
SoundType.AMETHYST | 자수정 블록 |
6. requiresCorrectToolForDrops
이 메소드를 붙이면 올바른 도구(곡괭이, 도끼 등)로 채굴해야만 블록이 드롭됩니다.
BlockBehaviour.Properties.of().requiresCorrectToolForDrops()⚠️ requiresCorrectToolForDrops + 맨손 채굴
.requiresCorrectToolForDrops() // 곡괭이 필수맨손으로 채굴 시 블록은 깨지지만 드롭 0개입니다. 해결: 올바른 도구 사용, 또는 mineable 태그 추가 (block tag).
7. mapColor
지도(Map)에서 이 블록이 표시될 색상을 설정합니다. MapColor enum에서 선택합니다.
BlockBehaviour.Properties.of().mapColor(MapColor.METAL)MapColor는 50개 이상의 값을 제공합니다. 대표적인 것들:
| MapColor | 색상 |
|---|---|
MapColor.NONE | 투명 (지도에 표시 안 됨) |
MapColor.STONE | 회색 |
MapColor.WATER | 파란색 |
MapColor.WOOD | 갈색 |
MapColor.METAL | 은색 |
MapColor.FIRE | 주황색 |
⚠️ MaterialColor는 사용 금지
구버전 코드에서
MaterialColor를 볼 수 있지만 NeoForge 26.1에서는 deprecated입니다. 반드시MapColor를 사용하세요.
8. noOcclusion
블록이 인접한 블록의 면을 가리지 않도록 설정합니다. 유리나 반투명 블록에 필수입니다.
BlockBehaviour.Properties.of().noOcclusion()이 설정 없이 투명 텍스처를 쓰면 인접 블록의 면이 렌더링되지 않아 검은 면이 보입니다.
9. pushReaction
피스톤이 이 블록을 밀거나 당길 때의 반응을 설정합니다.
BlockBehaviour.Properties.of().pushReaction(PushReaction.BLOCK)| PushReaction | 동작 |
|---|---|
PushReaction.NORMAL | 피스톤이 밀고 당길 수 있음 (기본) |
PushReaction.BLOCK | 피스톤이 밀 수 없음 |
PushReaction.DESTROY | 피스톤이 밀면 블록 파괴 |
PushReaction.IGNORE | 피스톤이 통과 (공기처럼) |
10. 조합 예시
// examplemod-template-26.1.2/src/main/java/com/example/examplemod/ExampleMod.java
// 발광 금속 블록 — 곡괭이 필수, 지도에 은색
public static final DeferredBlock<Block> METAL_BLOCK = BLOCKS.registerBlock("metal_block",
Block::new,
props -> props.strength(3.5f, 6.0f)
.lightLevel(s -> 15)
.sound(SoundType.METAL)
.requiresCorrectToolForDrops()
.mapColor(MapColor.METAL));
// 유리 블록 — 투명, 피스톤에 파괴됨 (같은 registerBlock 패턴으로 추가 가능)
public static final DeferredBlock<Block> CRYSTAL_BLOCK = BLOCKS.registerBlock("crystal_block",
Block::new,
props -> props.strength(0.3f)
.sound(SoundType.GLASS)
.noOcclusion()
.pushReaction(PushReaction.DESTROY));요약
BlockBehaviour.Properties.of()는 빌더 패턴. 메소드를 체이닝해서 블록 동작을 설정합니다.strength(h, r): 채굴 시간과 폭발 저항. hardness -1이면 파괴 불가.lightLevel(s -> N): 발광 세기 0~15. 람다로 블록 상태별 동적 설정 가능.sound(SoundType): 발자국/채굴 소리. STONE, METAL, WOOD, GLASS 등.requiresCorrectToolForDrops(): 올바른 도구 없으면 드롭 0개.mapColor(MapColor): 지도 색상.MaterialColor는 deprecated.noOcclusion(): 투명 블록에 필수. 없으면 인접 면이 검게 보임.pushReaction(PushReaction): 피스톤 반응 제어.
다음 챕터에서는 블록 상태(BlockState)와 프로퍼티를 추가하는 방법을 다룹니다.