Mob reference
A mob is a vanilla base type with overrides. Bestiary does not register new entity types: that is a registry-level NMS commitment which breaks on every Minecraft release, and buys almost nothing the Goal API and display entities cannot fake.
Under mobs/, the first directory is the namespace, so mobs/aether/valkyrie_champion.yml defines aether:valkyrie_champion. One file may hold any number of mobs, keyed by id.
example_boss:
type: ravager
display: "<gradient:#e8d9a0:#c9a227>Example Champion</gradient>"
health: 200
damage: 10
armor: 8
knockback_resistance: 1.0
movement_speed: 0.28
follow_range: 40
type is the only required key. Every attribute left out keeps the vanilla value for that entity type rather than being forced to a default.
Identity and attributes
typeentity typerequiredThe vanilla base, e.g.
ravager,stray,wither_skeleton. Resolved through the registry rather than an enum constant, so types that moved between versions still work.displayMiniMessageThe name shown. Gradients, colours and any other MiniMessage tag survive, and a bracketed token in a namespace Bestiary does not own is left exactly as written.
healthnumberMaximum health. Also sets current health on spawn.
damagenumberMelee attack damage.
armornumberArmour points.
armor_toughnessnumberArmour toughness.
knockback_resistancenumber0.0to1.0.1.0is immovable.movement_speednumberBase movement speed. Vanilla values are small, and a zombie is
0.23.follow_rangenumberHow far the mob will track a target.
scalenumberEntity scale. Needs a server new enough to have the attribute; gated and reported otherwise.
levelnumberdefault1The level a mob spawns at when none is given. Readable in expressions as
<caster.level>.level_modifierstringHow attributes scale with level.
factionstringMobs sharing a faction do not target each other.
modelstringA ModelEngine model id. A no-op with one report line when ModelEngine is absent, since Bestiary does not do models itself.
dropsdrop table idThe table rolled on death.
drop_tableis accepted as an alias.suppress_external_xpbooleandefaultfalseSuppresses mcMMO and Jobs XP for this mob. A 400 HP boss otherwise distorts both economies. The server-wide defaults in
config.ymlare on.
options
Per-mob switches that are not attributes.
despawnbooleandefaultfalseMaps to
PersistenceRequired. The default is the right one: a custom mob that vanishes because a player walked 40 blocks away is never what was wanted.prevent_other_dropsbooleandefaulttrueSuppresses the vanilla drops of the base type, so a custom ravager does not also drop saddles.
prevent_mob_kill_dropsbooleandefaultfalseDrops nothing when killed by something other than a player.
prevent_random_equipmentbooleandefaulttrueStops vanilla handing the mob random armour on spawn.
prevent_sunburnbooleandefaulttrueUndead do not burn in daylight.
dig_out_of_groundbooleandefaulttrueLifts a mob spawned inside terrain to the surface instead of leaving it suffocating.
silentbooleandefaultfalseSuppresses the entity's own sounds. Sounds a skill plays still fire.
collidablebooleandefaulttrueWhether players and mobs push it.
always_show_namebooleandefaultfalseShows
displaywithout needing to look at the mob.glowingbooleandefaultfalseThe outline seen through walls.
invulnerablebooleandefaultfalseImmune to everything. Use
damage_modifiersfor anything finer.gravitybooleandefaulttruefalsefor something that should hover without a flying navigation.aibooleandefaulttruefalsedisables vanilla AI entirely. Scripted movement mechanics still work.
equipment
Slots accept an item id directly, or a map with a drop chance.
equipment:
head: diamond_helmet
mainhand: { item: netherite_axe, drop_chance: 0.05 }
offhand: shield
Slot names accept both spellings: head/helmet, chest/chestplate, legs/leggings, feet/boots, mainhand/hand/weapon, and offhand. drop_chance defaults to 0.
threat
An explicit threat table, off unless the section is present.
threat: { enabled: true, decay: 0.05 }
enabledbooleandefaulttrueWhen the section exists at all.
decaynumberdefault0Threat lost per second.
damage_factornumberdefault1.0Threat per point of damage dealt.
healing_factornumberdefault0.5Threat per point healed, so healers are targetable without being top of the list immediately.
switch_thresholdnumberdefault1.5How far ahead a new contender must be before the mob switches. Without it a boss flickers between two players of near-equal threat.
phases
An ordered list. A mob advances when the current phase's until conditions pass, and never goes back.
phases:
- name: ground
until: { health_percent: "<= 60" }
- name: enraged
on_enter: example_enrage
namestringrequiredMatched by
?phase{(is = ground)}and by the~onPhasetrigger.untilmap or condition listWhat advances past this phase. The map form is shorthand: each key becomes a condition and its value is offered as both
amountandis, so numeric and string conditions both find it.on_enterskill idCast once on entering.
on_exitskill idCast once on leaving.
bossbar_titleMiniMessageReplaces the bossbar title while in this phase.
skills
The mob's own skill lines. These are the only place triggers are read: a skill file defines what happens, a mob file decides when.
skills:
- skill{s=example_shockwave} ~onTimer:160 ?phase{is=ground}
- skill{s=example_scaled_bolt} ~onTimer:100 ?phase{is=enraged}
- skill{s=example_enrage} ~onHealthThreshold:25
Both definition forms work here too; see Skills for the full grammar and the trigger list.
bossbar
bossbar:
title: "<gold>Example Champion <gray>- <white><caster.hp.percent>%"
color: yellow
style: segmented_10
range: 48
enabledbooleandefaulttrueSet
falseto keep the settings but hide the bar.titleMiniMessageExpressions are resolved live, so
<caster.hp.percent>tracks.colorstringdefaultwhitecolouris accepted too.stylestringdefaultsolidsolid, or a segmented style such assegmented_10.rangenumberdefault48Who sees it.
show_healthbooleandefaulttrueDrives the bar's progress from the mob's health.
damage_modifiers
Per-cause multipliers, for resistances and weaknesses.
damage_modifiers:
melee: 0.5
projectile: 2.0
magic: 0.25
causes:
fall: 0
melee, projectile and magic are the grouped forms; causes takes individual vanilla damage causes for anything finer. 0 is immunity.
A complete mob
example_boss:
type: ravager
display: "<gradient:#e8d9a0:#c9a227>Example Champion</gradient>"
health: 200
damage: 10
armor: 8
knockback_resistance: 1.0
movement_speed: 0.28
follow_range: 40
options:
despawn: false
prevent_other_drops: true
always_show_name: false
faction: example
threat: { enabled: true, decay: 0.05 }
ai:
goals:
- clear: [MOVE, TARGET]
- bestiary:melee_attack{speed=1.0}
- bestiary:look_at_target
- bestiary:return_to_anchor{distance=24}
- bestiary:avoid_void
phases:
- name: ground
until: { health_percent: "<= 60" }
- name: enraged
on_enter: example_enrage
skills:
- skill{s=example_shockwave} ~onTimer:160 ?phase{is=ground}
- skill{s=example_scaled_bolt} ~onTimer:100 ?phase{is=enraged}
- skill{s=example_enrage} ~onHealthThreshold:25
bossbar:
title: "<gold>Example Champion <gray>- <white><caster.hp.percent>%"
color: yellow
style: segmented_10
range: 48
drops: example_boss_drops
This ships as mobs/bestiary/example.yml, and has no Java behind it.
Verify a mob
After reload, /bestiary info <mob> is authoritative for the resolved entity type, scaled
attributes, options, phases, triggers and drop table. Spawn a disposable copy at an explicit level
when testing scaling, for example /bestiary spawn <mob> 5. Live mobs are rebound on reload, but
their current phase and fight state can still affect what you observe.