Overview
A species in Ancient Creature is identified by a resource id — ancientcreature:triceratops, mypack:stegosaurus — and defined entirely by data files. There is no Java involved in adding one.
Where things live
| Concern | Location | Reloads with |
|---|---|---|
| Gameplay: size, attributes, AI, sounds, growth, diet, hunger, fossil biome | data/<ns>/ancientcreature/species/<name>.json | /reload |
| Appearance: geometry, texture, variants, GUI framing | assets/<ns>/ancientcreature/species/<name>.json | F3+T |
| Model | assets/<ns>/ancientcreature/geo/<name>.geo.json | F3+T |
| Animations | assets/<ns>/ancientcreature/animations/<name>.animation.json | F3+T |
| Animation controller | assets/<ns>/ancientcreature/animation_controllers/<name>.controller.json | F3+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 — are no longer registered, which means creatures saved under them in an older world are lost. 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. Animation controller conditions use a small documented expression grammar, not arbitrary code.
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
- Add a species — the five files, start to finish
- Species JSON — every gameplay field
- Behaviour components — the AI catalogue