Add a species
We will add a Stegosaurus to a pack called mypack. Nothing here needs a mod build or a Java compiler.
1. Model it
Open Blockbench and start a Bedrock Entity project. Build the model, then:
- box UV and per-face UV both work
- name the bones something you will recognise; animations target them by name
- set the geometry identifier to
geometry.stegosaurus
Export as Bedrock Geometry to:
assets/mypack/ancientcreature/geo/stegosaurus.geo.jsonThen animate it and export as Bedrock Animation to:
assets/mypack/ancientcreature/animations/stegosaurus.animation.jsonName the animations animation.stegosaurus.idle, animation.stegosaurus.walk, and so on.
2. Gameplay
data/mypack/ancientcreature/species/stegosaurus.json
{
"format_version": 1,
"entity_category": "land",
"physical": {
"width": 1.6,
"height": 2.0,
"eye_height": 1.5
},
"attributes": {
"max_health": 60.0,
"movement_speed": 0.2,
"attack_damage": 10.0,
"attack_knockback": 1.8,
"follow_range": 24.0,
"knockback_resistance": 0.7
},
"growth": {
"adult_age": 24000,
"baby_scale": 0.45
},
"behavior": {
"profile": "ancientcreature:defensive_herbivore"
},
"diet": {
"items": ["minecraft:fern", "minecraft:large_fern"]
},
"spawn": {
"biomes": "#minecraft:is_forest",
"incubation_time": 1400
},
"sounds": {
"ambient": "minecraft:entity.ravager.ambient",
"hurt": "minecraft:entity.ravager.hurt",
"death": "minecraft:entity.ravager.death",
"step": "minecraft:entity.ravager.step",
"ambient_interval": 260
},
"loot_table": "ancientcreature:entities/large_herbivore",
"care": {
"climate": "temperate",
"social": "herd",
"group_min": 2,
"group_max": 6
},
"riding": {
"ability": "tail_sweep",
"cooldown": 80
}
}loot_table, care and riding are optional: what it drops, what keeps it comfortable, and its mount ability. Full field list: Species JSON.
3. Appearance
assets/mypack/ancientcreature/entity/stegosaurus.entity.json
{
"format_version": "1.10.0",
"minecraft:client_entity": {
"description": {
"identifier": "mypack:stegosaurus",
"materials": { "default": "entity_alphatest" },
"textures": { "default": "textures/entity/stegosaurus" },
"geometry": { "default": "geometry.stegosaurus" },
"animations": {
"idle": "animation.stegosaurus.idle",
"walk": "animation.stegosaurus.walk",
"attack": "animation.stegosaurus.attack",
"main": "controller.animation.stegosaurus.main"
},
"scripts": { "animate": ["main"] }
}
}
}This is a standard Bedrock client entity, the kind Blockbench can export. Its identifier is the species id. Texture paths are relative to the pack root and leave out .png, so drop the texture at assets/mypack/textures/entity/stegosaurus.png.
The texture does not have to be 16×16. Set the Blockbench project's texture resolution to the PNG's real dimensions before export; the resulting texture_width and texture_height are read directly.
Optionally, add assets/mypack/ancientcreature/species/stegosaurus.json to set the shadow and how the creature is framed in GUIs:
{
"format_version": 2,
"shadow_radius": 1.0,
"gui": { "scale": 11.0, "rotation": [0.0, 215.0, 0.0] }
}To show saddles, armor and skin variants, add a render controller. See Species (resource pack).
4. Decide when animations play
assets/mypack/ancientcreature/animation_controllers/stegosaurus.controller.json
{
"format_version": "1.10.0",
"animation_controllers": {
"controller.animation.stegosaurus.main": {
"initial_state": "idle",
"states": {
"idle": {
"animations": ["idle"],
"blend_transition": 0.2,
"transitions": [
{ "attack": "query.action == 'attack'" },
{ "walk": "query.is_moving" }
]
},
"walk": {
"animations": ["walk"],
"blend_transition": 0.15,
"transitions": [
{ "attack": "query.action == 'attack'" },
{ "idle": "!query.is_moving" }
]
},
"attack": {
"animations": ["attack"],
"blend_transition": 0.08,
"transitions": [
{ "walk": "query.action != 'attack' && query.is_moving" },
{ "idle": "query.action != 'attack'" }
]
}
}
}
}
}The controller is optional. Without one (drop main from scripts.animate) the creature renders in its rest pose, which is a perfectly good way to check the model before animating it.
5. Name it
Add to your language file, assets/mypack/lang/en_us.json:
{
"species.mypack.stegosaurus": "Stegosaurus"
}The translation key follows the species id: species.<namespace>.<path>.
6. Load it
Put the datapack half in the world's datapacks/ folder (or a datapack that is already enabled), the resource pack half in resourcepacks/, and enable both.
/reload
/ancientcreature species listYou should see mypack:stegosaurus listed. Then:
/ancientcreature summon mypack:stegosaurusIf something is wrong, the log says what and where. Keep going with Testing a species.
