Skip to main content

๐ŸŽจ Item Models

Your item works, but it looks exactly like the vanilla version. Time to give it a custom look.

CraftEngine offers three ways to configure models, simplest first:

ApproachSyntaxWhen to use
Simplified texturetexture: pathYou have a single texture โ€” let the plugin do the rest
Auto-generatemodel: + generation:You need a specific parent, multiple texture layers, or display transforms
External modelmodel: pathYou already have a model JSON file

โš ๏ธ This chapter involves editing resource pack files (textures / models). Run /ce reload all afterwards, not config. Running config alone will not push your texture changes โ€” this is the single most-asked question in the entire tutorial.

Where models and textures goโ€‹

Your pack's resourcepack/ mirrors a vanilla resource pack:

resourcepack/assets/tutorial
models
textures

When referencing files, the models/ and textures/ prefixes are implied: tutorial:item/toxic_sword resolves to models/item/toxic_sword.json in a model context, and textures/item/toxic_sword.png in a texture context.

โš ๏ธ Textures must go in textures/item/ or textures/block/. Minecraft's texture atlas only loads those two directories. Put textures anywhere else and they won't load โ€” you'll see the purple-black missing-texture pattern.

โš ๏ธ Model texture dimensions must be powers of twoโ€”for example, 16ร—16, 32ร—48, or 64ร—64. Textures that do not meet this requirement cause the client to downgrade mipmapping.

Prepare the textureโ€‹

โฌ‡ Download the tutorial sword texture and place it at:

resourcepack/assets/tutorial/textures/item/toxic_sword.png

Approach 1: just texture โ€” one lineโ€‹

The simplest form. CraftEngine picks the parent model automatically based on your material, generates the model JSON, and handles CustomModelData allocation.

items:
tutorial:toxic_sword:
material: golden_sword
data:
item_name: "<!i><#3CB371>Toxic Sword"
texture: tutorial:item/toxic_sword

/ce reload all, then /ce item get tutorial:toxic_sword. Your sword now has the custom texture.

CraftEngine infers the parent from the material: golden_sword โ†’ handheld (tool), paper โ†’ generated (flat icon), block items โ†’ cube_all. You don't need to specify a parent, write a model block, or touch CustomModelData.

texture: (singular) is for single-state items โ€” which covers most items. Multi-state items (bows, crossbows, fishing rods) use textures: (plural), covered below.

Approach 2: generation for full controlโ€‹

When texture: isn't enough โ€” you want a different parent or display transforms โ€” use the generation format.

Basic syntaxโ€‹

items:
tutorial:toxic_sword:
material: golden_sword
data:
item_name: "<!i><#3CB371>Toxic Sword"
model:
path: tutorial:item/toxic_sword
generation:
parent: minecraft:item/handheld
textures:
layer0: tutorial:item/toxic_sword
FieldRequiredDescription
parentyesParent model to inherit from. Determines what texture variables exist
texturesnoAssign textures to the variables defined by the parent
displaynoPer-context rotation / translation / scale
gui_lightnoGUI lighting: front (flat) or side (3D, default)

Common parentsโ€‹

parentBest for
minecraft:item/handheldSwords, pickaxes, tools
minecraft:item/generatedFood, ingots, materials
minecraft:block/cube_allBlocks

โš ๏ธ The texture variable names are determined by the parent, not by you. handheld and generated use layer0. cube_all uses all. If you write the wrong name, the model breaks. Before picking a parent, look up its JSON on misode.github.io/assets/model to see what texture variables it defines.

How texture: and generation: relateโ€‹

texture: tutorial:item/toxic_sword is equivalent to:

model:
path: tutorial:item/toxic_sword
generation:
parent: minecraft:item/handheld # inferred from material
textures:
layer0: tutorial:item/toxic_sword

Stick with texture: unless you need a different parent, multiple texture layers, or display transforms.

Multi-state itemsโ€‹

Items like bows, crossbows, and fishing rods have multiple states (idle / pulling / loaded), each with its own texture. CraftEngine provides a textures: (plural) shortcut:

# Bow โ€” 4 slots
items:
tutorial:my_bow:
material: bow
textures:
- tutorial:item/bow # idle
- tutorial:item/bow_pulling_0 # start pulling
- tutorial:item/bow_pulling_1 # mid-pull
- tutorial:item/bow_pulling_2 # fully pulled

โš ๏ธ Slot order is fixed per material. Get the order wrong and your bow will show the pulled texture when idle.

Common slot counts:

materialslotsDescription
bow4idle + pull 0/1/2
crossbow6idle + pull 0/1/2 + arrow + firework
fishing_rod2idle + cast
shield2idle + blocking
elytra2intact + broken

Approach 3: external model filesโ€‹

If you have a pre-made model JSON โ€” from BlockBench, a download, or a purchased pack โ€” use it directly:

items:
tutorial:toxic_sword:
material: golden_sword
data:
item_name: "<!i><#3CB371>Toxic Sword"
model: tutorial:item/toxic_sword

CraftEngine uses the existing JSON file as-is. Texture paths are already baked into the model file.

For multi-state items like bows or shields that need different model files per state, use models: (plural) โ€” the slot order and count are the same as with textures::

items:
tutorial:my_shield:
material: shield
models:
- tutorial:item/shield # idle
- tutorial:item/shield_blocking # blocking

๐Ÿ’ก CraftEngine's resourcepack/ is a complete Minecraft resource pack. You can open model JSONs directly in BlockBench โ€” the file structure matches vanilla, so BlockBench can resolve texture paths. This makes it easy to verify your textures without loading the game.

โš ๏ธ Filenames must follow namespace path rules: lowercase letters, digits, -, _, ., / only. Uppercase or special characters will cause load failures.

Texture paths inside modelsโ€‹

Open a model JSON and look at the textures section:

{
"textures": {
"0": "tutorial:item/toxic_sword",
"particle": "tutorial:item/toxic_sword"
}
}

"tutorial:item/toxic_sword" resolves to assets/tutorial/textures/item/toxic_sword.png.

Common issues:

What you seeWhyFix
Texture path contains C:\Users\... or /home/...BlockBench saved to the wrong locationReplace all texture paths with namespace:item/filename, move PNGs to textures/item/
Texture path uses minecraft:item/xxxModel copied from vanilla assetsSwitch to your namespace, or make sure the corresponding texture file exists
Path looks correct but still purple-blackFiles missing or typos in the filenameCheck filenames are all lowercase and spelled correctly

Repurposing a purchased model packโ€‹

Models you buy typically use the author's namespace (e.g. fantasy_pack). To switch it to tutorial:

  1. Open the model JSON in VS Code
  2. Ctrl+H โ€” find fantasy_pack:, replace with tutorial:
  3. Save
  4. Move the PNGs from assets/fantasy_pack/textures/item/ to assets/tutorial/textures/item/
  5. /ce reload all