Configuration
config.yml key by key, with every default, and what messages.yml holds.
Both files are generated in plugins/ExyliaPracticeBotV3/ the first time the plugin starts, with the
comments below already in them. Edit the files there, never the copies in the jar, and run
/bot reload afterwards — it re-reads config.yml, messages.yml and both
menu files. Colours use palette tokens such as {primary} or
{success}.
The file is deliberately shallow at the top: bot.mode and bot.difficulty are the only two keys
anybody has to understand. The mode decides the kit and which techniques exist, the difficulty decides
how well they are executed, and everything under advanced already has a value that works.
config.yml
config-version: 2
bot:
mode: POT_PVP
difficulty: NORMAL
name: "{primary}%player%'s Bot"
skin: "%player%"
worlds:
- exylia_sandbox_badlands
- exylia_sandbox_desert
- exylia_sandbox_mushroom
- exylia_sandbox_plains
- exylia_sandbox_snowy
respawn:
enabled: true
delay-seconds: 2.0
interaction:
shift-click-opens-menu: true
advanced:
attack:
reach: 3.0
damage: 7.0
speed-multiplier: 1.0
movement:
speed-multiplier: 1.0
follow-distance: 3.0
health:
max: 20.0
invincible: false
totems: -1
defense:
shield-disable-seconds: 5.0
anti-knockback: false
slow-falling: false
pot-pvp:
apple-percent: 35.0
potion-percent: 70.0
enchanted-apples: false
crystal-pvp:
range: 5.0
self-preservation-percent: 30.0
anchor: true
trap: true
ender-pearls: true
break-blocks: true
uhc:
apple-percent: 60.0
cobweb: true
lava: true
water: true
pathfinding:
enabled: true
max-search-radius-horizontal: 16
max-search-radius-vertical: 10
max-expanded-nodes: 200
max-search-time-micros: 1500
max-drop-height-safe: 3
max-drop-height-protected: 10
max-gap-jump-columns: 1
stuck-check-interval-ticks: 10
stuck-progress-epsilon: 0.5
stuck-strikes-threshold: 2
path-stale-distance: 5.0
path-max-age-ticks: 60
checkpoint-reached-radius: 0.6
consecutive-failed-searches-before-cooldown: 3
give-up-cooldown-ticks: 60
limits:
min-attack-speed: 0.25
max-attack-speed: 4.0
min-movement-speed: 0.25
max-movement-speed: 3.0
min-attack-reach: 1.0
max-attack-reach: 6.0
min-follow-distance: 1.0
max-follow-distance: 12.0
min-attack-damage: 0.5
max-attack-damage: 40.0
min-max-health: 1.0
max-max-health: 40.0
min-shield-disable: 0.0
max-shield-disable: 20.0
min-totems: -1.0
max-totems: 16.0
max-bots: 16config-version is written and maintained by the plugin; leave it alone. A file written by version 1
is migrated to this layout on the first start rather than replaced — every value you could plausibly
have changed is moved, and the per-mode chance sliders are dropped on purpose, because difficulty
derives all of them now.
bot
| Key | Default | What it does |
|---|---|---|
mode | POT_PVP | NONE, SWORD, POT_PVP, UHC, CRYSTAL_PVP, MACE_PVP or BOXING. Picking a mode applies that mode's kit and its combat model. An unrecognised name falls back to NONE. See Modes. |
difficulty | NORMAL | EASY, NORMAL, HARD, INSANE or EXTREME. Reaction time, aim, cooldown discipline and technique all come from this. An unrecognised name falls back to NORMAL. See Difficulty. |
name | {primary}%player%'s Bot | Name above the bot. %player% is its owner. |
skin | %player% | Skin to wear. %player% copies the owner's skin. |
The mode's own comment block in the generated file summarises the seven:
| Mode | What it fights with |
|---|---|
SWORD | Sword and shield, almost no crits, all movement. |
POT_PVP | Crits on nearly every swing, splashes and gapples. |
UHC | Axe and shield, guard breaks, cobweb, lava, water. |
CRYSTAL_PVP | Obsidian, crystals, anchors, pearls and totems. |
MACE_PVP | Wind charges and pearls up, mace smashes down. |
BOXING | Hits are counted, not dealt. Combo practice. |
NONE is the plain vanilla setting: no techniques, no consumables.
Both keys are the server default. Every player has their own mode and difficulty from the moment they
open /bot, and changing these afterwards does not touch a player who has already saved settings.
worlds
A plain list of world names: the worlds where a bot may be spawned. A player who tries anywhere else
gets the world-not-allowed message and no bot.
The five defaults are Exylia's own sandbox worlds and exist on no other server, so out of the box every spawn is refused. Replace the list with your own world names before anything works. An empty list is not a wildcard — empty means nowhere.
The key was restrictions.allowed-worlds in version 1. A file written by that version has it moved to
worlds automatically on the first start, with the list intact.
respawn
| Key | Default | What it does |
|---|---|---|
enabled | true | Whether a killed bot comes back on its own. |
delay-seconds | 2.0 | Seconds before it does. Converted to ticks and never less than one tick. |
interaction
| Key | Default | What it does |
|---|---|---|
shift-click-opens-menu | true | Shift right-clicking your own bot opens its menu. |
advanced
Sandbox knobs and per-mode tuning. Safe to ignore.
advanced.attack, advanced.movement, advanced.health and advanced.defense are what a player's
settings start at and what Reset settings puts them back to. From then on each player owns their
own copy and moves it from the Fine tuning menu. The per-mode
blocks below them — pot-pvp, crystal-pvp, uhc — and pathfinding are not per-player: they are
read live by the AI and apply to every bot on the server.
advanced.attack
| Key | Default | What it does |
|---|---|---|
reach | 3.0 | Blocks the bot can hit from. Vanilla players get 3.0. |
damage | 7.0 | Damage of a fully charged, non-critical hit, in half-hearts. Cooldown scaling and crits are applied on top, exactly like vanilla. |
speed-multiplier | 1.0 | Multiplies the cadence the mode chose; 1.0 leaves it alone. The mode already picks the right tempo — a modern bar for crystal and mace, a click rate for pot PvP. Raise this only to push a mode past what a player could do. |
advanced.movement
| Key | Default | What it does |
|---|---|---|
speed-multiplier | 1.0 | Multiplies walk and sprint speed. 1.0 is a vanilla player. |
follow-distance | 3.0 | How close it stays when it is not fighting. |
advanced.health
| Key | Default | What it does |
|---|---|---|
max | 20.0 | Maximum health, in half-hearts. |
invincible | false | Never dies. Useful for practising combos. |
totems | -1 | Spare totems the bot re-arms with after one of its pops, per life. It fetches them like a player: one at a time, with a beat to get the next into its hand. 0 means the one in its kit is the only one it gets, and -1 means it never runs out. |
advanced.defense
| Key | Default | What it does |
|---|---|---|
shield-disable-seconds | 5.0 | How long an axe hit keeps the bot's shield down. |
anti-knockback | false | Ignore knockback entirely. Off by default: knockback is half of PvP. |
slow-falling | false | Permanent Slow Falling. |
advanced.pot-pvp
| Key | Default | What it does |
|---|---|---|
apple-percent | 35.0 | Health percentage at which it starts looking for a safe moment to eat. An apple is thirty-two ticks of standing still, so keep this low: it is the heal of last resort, not the one the fight is played with. |
potion-percent | 70.0 | Health percentage at which it splashes Instant Health II immediately. This is the bot's first-line heal and should sit well above apple-percent — a splash costs it a tick and no ground. |
enchanted-apples | false | Eat enchanted golden apples instead of normal ones. Ignored when another plugin sent the bot a kit: it eats whatever apple is in it. |
advanced.crystal-pvp
| Key | Default | What it does |
|---|---|---|
range | 5.0 | Blocks from the opponent within which it will start a crystal chain. |
self-preservation-percent | 30.0 | Below this health it stops placing crystals right against itself. |
anchor | true | Also use charged respawn anchors. |
trap | true | Wall a low opponent in before detonating. |
ender-pearls | true | Pearl at the opponent's feet to close the gap. Crystal PvP is an aggressive format: the bot chases, it does not kite. |
break-blocks | true | Real crystal PvP: the blasts destroy terrain and the obsidian the bot places stays where it put it. Turn this off in a world you care about — the bot will then clean up after itself. |
advanced.uhc
| Key | Default | What it does |
|---|---|---|
apple-percent | 60.0 | Health percentage at which it eats a golden apple. UHC has no splash potions, so the apple is the only heal there is and this sits far higher than the pot PvP equivalent. |
cobweb | true | Trap the opponent in a cobweb to hold them still for a combo. |
lava | true | Dump lava at the opponent's feet. Placed without a block update, so the source never flows, and taken back up on a timer. |
water | true | Carry a water bucket, to put itself out and to wash lava away. |
advanced.pathfinding
Local grid search used only when direct steering cannot get past terrain. In open ground the bot walks straight at its target and none of this runs.
| Key | Default | What it does |
|---|---|---|
enabled | true | Turns the search off entirely; the bot then only ever steers straight at its target. |
max-search-radius-horizontal | 16 | Blocks out from the bot the search may expand, and the distance past which it does not bother searching at all. |
max-search-radius-vertical | 10 | The same ceiling and floor, vertically. |
max-expanded-nodes | 200 | Nodes one search may expand before it gives up. |
max-search-time-micros | 1500 | Microseconds one search may take before it gives up. This is the key that keeps a full server's bots off the tick. |
max-drop-height-safe | 3 | Blocks the bot will drop down on a route. |
max-drop-height-protected | 10 | The same, for a bot that would survive it — one with Slow Falling or invincibility on. |
max-gap-jump-columns | 1 | How many empty columns wide a gap may be for the route to jump it. |
stuck-check-interval-ticks | 10 | Ticks between two progress checks. |
stuck-progress-epsilon | 0.5 | Blocks it must have moved horizontally in that interval to count as progress. |
stuck-strikes-threshold | 2 | Failed checks in a row before it counts as stuck and asks for a path. |
path-stale-distance | 5.0 | Blocks the target may drift from where the path was built to before the path is thrown away. |
path-max-age-ticks | 60 | Ticks a path is kept regardless. |
checkpoint-reached-radius | 0.6 | Horizontal distance at which a checkpoint counts as reached. |
consecutive-failed-searches-before-cooldown | 3 | Failed searches in a row before it stops trying. |
give-up-cooldown-ticks | 60 | Ticks it waits before trying again. |
limits
Bounds the in-game menu clamps its sliders to. Each pair is the floor and ceiling of one
adjust field, and a value outside them cannot be reached from a
menu.
| Field | Key pair | Default range |
|---|---|---|
attack_speed | min-attack-speed / max-attack-speed | 0.25 – 4.0 |
movement_speed | min-movement-speed / max-movement-speed | 0.25 – 3.0 |
attack_reach | min-attack-reach / max-attack-reach | 1.0 – 6.0 |
follow_distance | min-follow-distance / max-follow-distance | 1.0 – 12.0 |
attack_damage | min-attack-damage / max-attack-damage | 0.5 – 40.0 |
max_health | min-max-health / max-max-health | 1.0 – 40.0 |
shield_disable | min-shield-disable / max-shield-disable | 0.0 – 20.0 |
totems | min-totems / max-totems | −1.0 – 16.0 |
Totems stop at -1, which is the unlimited setting. Every adjusted value is rounded to one decimal
after the clamp. See Limits.
max-bots
16 by default. How many bots may exist on the server at once. Every bot thinks once per tick and
searches for its own path, so this is a real ceiling and not a formality — raise it only after watching
the tick time with the current one full. A spawn past the ceiling is refused with the limit-reached
message, and the API refuses it with a BotLimitReachedException. A value below 1 is read as 1.
messages.yml
Every player-facing line, with the same config-version header. Colour placeholders come from
ExyliaCommons, so recolouring the network never means editing this file. A line may open with an effect
tag that never reaches the screen — [sound:NAME|volume|pitch] and [particle:NAME|count] — and the
defaults use them throughout.
| Section | Holds |
|---|---|
prefix | {primary}&lEXYLIA PRACTICEBOT &8•&r by default. Every line's %prefix% expands to it. |
bot | The sixteen lines the plugin says: spawned, removed, no-bot, already-has-bot, world-not-allowed, removed-death, removed-world-change, removed-too-far, teleported-to-bot, teleported-bot-to-you, respawning, respawned, settings-reset, mode-changed (%mode%), difficulty-changed (%difficulty%), limit-reached (%limit%) and boxing-score (%player_hits%, %bot_hits%, shown on the action bar during a boxing round). |
placeholders | The display labels the menus print: enabled, disabled, unlimited, and one block each for armor, enchant, main-hand, off-hand, knockback, strength, speed, mode and difficulty. |
The mode and difficulty blocks each hold two things per value: the name, and the one-line summary
the menu shows under it — pot-pvp and pot-pvp-summary, hard and hard-summary. Those summaries
are what %mode_summary% and %difficulty_summary% print, which is why a cycling button can explain
itself without four buttons each describing themselves.
Renaming or recolouring anything here changes only what players read. The values the plugin stores are the enum names on Equipment, Modes and Difficulty, and they are unaffected.
database.yml
Written by ExyliaLib the first time the plugin starts: H2 by default, with MySQL, MariaDB, PostgreSQL and MongoDB as alternatives. One row per player, holding every setting on this page's per-player half. See the library's database page.
Something missing on this page? Tell us on Discord