Content generated with AI — it may contain mistakes.

Reference

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

plugins/ExyliaPracticeBotV3/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: 16

config-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

KeyDefaultWhat it does
modePOT_PVPNONE, 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.
difficultyNORMALEASY, 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 BotName 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:

ModeWhat it fights with
SWORDSword and shield, almost no crits, all movement.
POT_PVPCrits on nearly every swing, splashes and gapples.
UHCAxe and shield, guard breaks, cobweb, lava, water.
CRYSTAL_PVPObsidian, crystals, anchors, pearls and totems.
MACE_PVPWind charges and pearls up, mace smashes down.
BOXINGHits 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.

A fresh install spawns nothing until you edit this

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

KeyDefaultWhat it does
enabledtrueWhether a killed bot comes back on its own.
delay-seconds2.0Seconds before it does. Converted to ticks and never less than one tick.

interaction

KeyDefaultWhat it does
shift-click-opens-menutrueShift right-clicking your own bot opens its menu.

advanced

Sandbox knobs and per-mode tuning. Safe to ignore.

Four of these are only starting values

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

KeyDefaultWhat it does
reach3.0Blocks the bot can hit from. Vanilla players get 3.0.
damage7.0Damage of a fully charged, non-critical hit, in half-hearts. Cooldown scaling and crits are applied on top, exactly like vanilla.
speed-multiplier1.0Multiplies 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

KeyDefaultWhat it does
speed-multiplier1.0Multiplies walk and sprint speed. 1.0 is a vanilla player.
follow-distance3.0How close it stays when it is not fighting.

advanced.health

KeyDefaultWhat it does
max20.0Maximum health, in half-hearts.
invinciblefalseNever dies. Useful for practising combos.
totems-1Spare 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

KeyDefaultWhat it does
shield-disable-seconds5.0How long an axe hit keeps the bot's shield down.
anti-knockbackfalseIgnore knockback entirely. Off by default: knockback is half of PvP.
slow-fallingfalsePermanent Slow Falling.

advanced.pot-pvp

KeyDefaultWhat it does
apple-percent35.0Health 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-percent70.0Health 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-applesfalseEat 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

KeyDefaultWhat it does
range5.0Blocks from the opponent within which it will start a crystal chain.
self-preservation-percent30.0Below this health it stops placing crystals right against itself.
anchortrueAlso use charged respawn anchors.
traptrueWall a low opponent in before detonating.
ender-pearlstruePearl at the opponent's feet to close the gap. Crystal PvP is an aggressive format: the bot chases, it does not kite.
break-blockstrueReal 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

KeyDefaultWhat it does
apple-percent60.0Health 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.
cobwebtrueTrap the opponent in a cobweb to hold them still for a combo.
lavatrueDump lava at the opponent's feet. Placed without a block update, so the source never flows, and taken back up on a timer.
watertrueCarry 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.

KeyDefaultWhat it does
enabledtrueTurns the search off entirely; the bot then only ever steers straight at its target.
max-search-radius-horizontal16Blocks out from the bot the search may expand, and the distance past which it does not bother searching at all.
max-search-radius-vertical10The same ceiling and floor, vertically.
max-expanded-nodes200Nodes one search may expand before it gives up.
max-search-time-micros1500Microseconds 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-safe3Blocks the bot will drop down on a route.
max-drop-height-protected10The same, for a bot that would survive it — one with Slow Falling or invincibility on.
max-gap-jump-columns1How many empty columns wide a gap may be for the route to jump it.
stuck-check-interval-ticks10Ticks between two progress checks.
stuck-progress-epsilon0.5Blocks it must have moved horizontally in that interval to count as progress.
stuck-strikes-threshold2Failed checks in a row before it counts as stuck and asks for a path.
path-stale-distance5.0Blocks the target may drift from where the path was built to before the path is thrown away.
path-max-age-ticks60Ticks a path is kept regardless.
checkpoint-reached-radius0.6Horizontal distance at which a checkpoint counts as reached.
consecutive-failed-searches-before-cooldown3Failed searches in a row before it stops trying.
give-up-cooldown-ticks60Ticks 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.

FieldKey pairDefault range
attack_speedmin-attack-speed / max-attack-speed0.25 – 4.0
movement_speedmin-movement-speed / max-movement-speed0.25 – 3.0
attack_reachmin-attack-reach / max-attack-reach1.0 – 6.0
follow_distancemin-follow-distance / max-follow-distance1.0 – 12.0
attack_damagemin-attack-damage / max-attack-damage0.5 – 40.0
max_healthmin-max-health / max-max-health1.0 – 40.0
shield_disablemin-shield-disable / max-shield-disable0.0 – 20.0
totemsmin-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.

SectionHolds
prefix{primary}&lEXYLIA PRACTICEBOT &8•&r by default. Every line's %prefix% expands to it.
botThe 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).
placeholdersThe 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