đ§ą Your First Block
Now make something you can place in the world.
Step 1: the smallest possible blockâ
âŦ Download the topaz block texture and place it at:
resourcepack/assets/tutorial/textures/block/topaz_block.png
Square PNG, power-of-two dimensions (16/32/64).
Then write the config â inline, everything in one item entry:
items:
tutorial:topaz_block:
material: paper
behavior:
type: block_item
block:
state:
auto_state: note_block
texture: tutorial:block/topaz_block
/ce reload all
/ce item get tutorial:topaz_block
Right-click the ground â your block appears.

What you just wroteâ
type: block_itemâ this item places a block on right-clickblock:â everything below defines the block itselfstateâ required. What the block looks likeauto_state: note_blockâ let CraftEngine automatically pick an unused note block state to render your block. Don't worry about which onetexture: tutorial:block/topaz_blockâ same as with items, auto-generates a cube model with this texture on all six faces
Step 2: make it feel real â hardness & soundsâ
Right now the block drops nothing and has no custom sounds. Add settings:
items:
tutorial:topaz_block:
material: paper
behavior:
type: block_item
block:
state:
auto_state: note_block
texture: tutorial:block/topaz_block
settings:
hardness: 4.5
sounds:
break: minecraft:block.stone.break
step: minecraft:block.stone.step
place: minecraft:block.stone.place
hit: minecraft:block.stone.hit
fall: minecraft:block.stone.fall
tags:
- minecraft:mineable/pickaxe
hardness: 4.5â how long it takes to break. Higher = longersoundsâ break, step, place, hit, fall. Format:minecraft:block.<name>.<action>tags: [minecraft:mineable/pickaxe]â tells Minecraft this block needs a pickaxe. With this tag, a pickaxe mines it fast; your fist mines it slowly
Step 3: make it drop itselfâ
Without a loot table, breaking the block drops nothing:
settings:
hardness: 4.5
sounds: ...
tags:
- minecraft:mineable/pickaxe
loot:
template: default:loot_table/self
default:loot_table/self is a built-in template â just use it for now. Without it, breaking the block gives you nothing.
Step 4: how blocks actually workâ
Minecraft has a fixed pool of block states â you can't create new ones. CraftEngine "borrows" unused vanilla states and overlays custom models on top. These borrowed states are called visual block states â what players actually see on their client.
auto_state: note_block means: pick an available state from the note block group and use it for this block. States within the same group share the same collision shape.
Common auto_state groups:
| group | source blocks | collision shape | use for |
|---|---|---|---|
note_block | all note blocks | full cube (1Ã1Ã1) | stone, ore, wood â default pick |
solid | note blocks + mushroom blocks | full cube | same, larger pool |
mushroom_stem | mushroom stems | full cube | backup option |
tripwire | all tripwires | thin | crops, small plants, decorations |
sapling | all saplings | small | saplings, flowers |
leaves | all leaves | full cube | leaves (non-waterloggable) |
waterlogged_leaves | all leaves | full cube | leaves (waterloggable) |
đĄ For most full blocks,
note_blockorsolidis all you need. The other groups are for specific shapes.
Step 5: different ways to write the modelâ
Block models have three forms:
â Single texture â texture: (what you just used)
state:
auto_state: note_block
texture: tutorial:block/topaz_block
Auto-generates a cube with the same texture on every face.
⥠Multiple textures â textures: list
state:
auto_state: note_block
model:
path: tutorial:block/topaz_block # required with 2+ textures
textures:
- tutorial:block/topaz_block_top
- tutorial:block/topaz_block_side
Texture count determines the model type: 2 â column (top + side), 3 â bottom + side + top. path is required when using multiple textures.
âĸ Custom parent â generation
state:
auto_state: note_block
model:
path: tutorial:block/topaz_block
generation:
parent: minecraft:block/cube_bottom_top
textures:
bottom: tutorial:block/topaz_block_bottom
side: tutorial:block/topaz_block_side
top: tutorial:block/topaz_block_top
Use when you need a specific parent model. The texture variable names are determined by the parent â look it up on Data Pack Generator before writing them.
â ī¸ When using a bare
model:path, ensure texture paths inside the model JSON are correct and point to files undertextures/block/.
Step 6: stop showing paper in the inventoryâ
Your block item currently shows as a piece of paper. The block generates a model from texture: â let the item reference it:
items:
tutorial:topaz_block:
material: paper
model: tutorial:block/topaz_block # â add this
behavior:
type: block_item
block: ...
Now the inventory icon shows a miniature version of your block instead of paper.