Skip to content

Custom species ​

Every creature in Ancient Creature, including all 25 that ship with the mod, runs on one data-driven species system. A datapack and a resource pack can add a new one. There is no Java involved.

A species is identified by a resource id, like ancientcreature:triceratops or mypack:stegosaurus, and defined by a handful of files:

data/<namespace>/ancientcreature/species/<name>.json                              gameplay
assets/<namespace>/ancientcreature/entity/<name>.entity.json                      appearance (Bedrock client entity)
assets/<namespace>/ancientcreature/geo/<name>.geo.json                            model
assets/<namespace>/ancientcreature/animations/<name>.animation.json               animations
assets/<namespace>/ancientcreature/animation_controllers/<name>.controller.json   when to play what
assets/<namespace>/ancientcreature/render_controllers/<name>.render_controllers.json   skins and gear (optional)
assets/<namespace>/ancientcreature/species/<name>.json                            shadow and GUI framing (optional)

Everything under assets/ is a standard Bedrock file Blockbench can export.

  • One entity, any creature. Every species runs on a single generic entity. Size, attributes, AI, sounds and growth all come from JSON.
  • Blockbench in, creature out. Export a Bedrock model, animations, controllers and client entity straight from Blockbench, with full Molang. They load from the resource pack and reload with F3+T.
  • Safe by construction. JSON can only pick from a fixed set of behaviour components. A broken file is reported with the reason and skipped; it never takes the world down.
  • Reloadable. Edit a species, run /reload, and loaded creatures pick up new attributes, size and AI in place.

A new species joins the whole game loop: its fossils drop in the biomes you list, it gets its own DNA, genome and egg, and it shows up in JEI and the Species Journal.

Beta

The species format is still in beta. format_version is validated on load, so a future format change will tell you rather than silently misreading your files, but expect changes.

Where things live ​

ConcernLocationReloads with
Gameplay: size, attributes, AI, sounds, growth, diet, hunger, fossil biome, drops, skin variants, care, mount ability, hybrid parentsdata/<ns>/ancientcreature/species/<name>.json/reload
Appearance: geometry, textures, animations, scriptsassets/<ns>/ancientcreature/entity/<name>.entity.jsonF3+T
Skin and gear layersassets/<ns>/ancientcreature/render_controllers/<name>.render_controllers.jsonF3+T
Shadow, GUI framingassets/<ns>/ancientcreature/species/<name>.jsonF3+T
Modelassets/<ns>/ancientcreature/geo/<name>.geo.jsonF3+T
Animationsassets/<ns>/ancientcreature/animations/<name>.animation.jsonF3+T
Animation controllerassets/<ns>/ancientcreature/animation_controllers/<name>.controller.jsonF3+T

The file's path under species/ is the id. A file at data/mypack/ancientcreature/species/stegosaurus.json defines mypack:stegosaurus.

Why gameplay and appearance are separate ​

Gameplay data lives under data/ and appearance under assets/ so that:

  • a dedicated server never loads a model, texture or animation — it only needs the data/ half;
  • a resource pack can restyle a creature without touching balance;
  • a datapack can rebalance a creature without shipping any art.

The server sends its species definitions to each client on join and after every reload, because the client needs the physical size and growth to size the entity locally. Models and textures are never sent through packets — they come from the resource pack like any other asset.

One entity type ​

Every species spawns as ancientcreature:ancient_creature. It swaps its navigation and movement control when the species is applied, so land, aquatic and flying creatures all share the single type.

The three ids from before the migration — ancientcreature:triceratops, :tyrannosaurus_rex and :megalodon — remain as compatibility registrations so creatures already placed in older worlds are not lost. New creatures, including Pteranodon and pack-added species, use the single generic entity. See Migration.

Predators hunt when hungry ​

Every creature has a hunger meter. Predators only pick prey once it falls far enough, and stop once they have eaten, so they do not attack everything that walks past.

This gates prey selection only. Fighting back, driving off hostile mobs and the attack goals themselves are never gated, so a well-fed creature still defends itself.

What a pack cannot do ​

Behaviour is chosen from a closed set of components. A pack picks and configures them; it cannot introduce new Java behaviour. Molang in the resource pack is purely presentational: it picks animations and layers, and can never change gameplay.

Anything a pack gets wrong is reported in the log with the file and the reason, and that one file is skipped. Other species keep loading.

Next ​

Ancient Creature is in beta; species formats may change between releases.