#### Bug Fixes
- **Bot rank colour preserved after restart** — bot display names now always reconstruct from the current LuckPerms prefix + name format on restore; colours are no longer stripped when saving to the database, and a post-restore prefix refresh runs automatically after all bots are re-queued.
- **Join / leave delay timing fixed** — config values (`join-delay` / `leave-delay`) were being multiplied by 20 internally, making all delays 20× too long. Values are now treated as ticks directly as documented (e.g. `max: 20` = 1 second).
- **`/fpp reload` now refreshes all bot prefixes** — LP cache is invalidated and `updateAllBotPrefixes()` is called, so prefix changes take effect immediately without a restart.
#### New Features
- **`/fpp despawn random [amount]`** — removes a random selection of active bots (default 1). Useful for gradual scale-down.
- **Beta version detection** — when the running version is newer than the latest published release, admins see a styled in-game warning identifying the build as a beta. The message is also delivered to admins who join after the check completes, identical to how update-available notifications work.
#### Internals
- Config-version bumped to **25** (housekeeping stamp — no structural changes).
#### New Features
- **LuckPerms auto-update** — bot display names, tab-list entries, and nametags now update in real-time when LuckPerms group data changes (prefix, weight, colours). No reload or respawn needed.
- **Full LuckPerms colour support** — all colour formats now render correctly in bot prefixes: MiniMessage tags (`<rainbow>`, `<gradient:#FF0000:#0000FF>`), hex colours (`<#9782ff>`), LuckPerms gradient shorthand (`{#FFFFFF>}text{#FFFFFF<}`), and mixed formats (`&7[<#9782ff>Phantom</#9782ff>&7]`).
- **LuckPerms weight ordering** — bot tab-list entries sort below all real players by default; bots always use the default group (never inherit spawner permissions or weight).
- **Multi-platform download links** — update notifications and `/fpp` info screen show clickable links to Modrinth, SpigotMC, PaperMC Hangar, and BuiltByBit.
- **Enhanced reload command** — `/fpp reload` shows step-by-step progress with a checkmark per subsystem and total reload time on completion.
- **Update checker improvements** — Modrinth API is now the primary version source; console output is a clean one-liner; in-game notifications use a bordered style matching the help menu.
- **Tab-list bot visibility** — `tab-list.enabled: true/false` controls whether bots appear in the tab list. When `false`, bots are hidden but still count in the server player count. Hot-reloadable via `/fpp reload`.
- **No external API requirement** — physical bot bodies no longer depend on any external plugin API; works on any compatible Paper server out of the box.
#### Bug Fixes
- Fixed join/leave messages rendering raw gradient tags (e.g. `{#FFFFFF>}[PLAYER]{#FFFFFF<}`) instead of the formatted text — LuckPerms gradient shorthand is now fully resolved in all broadcast messages.
- Fixed bot display names restoring as literal `bot-{spawner}-{num}` placeholder text after a server restart — names are now reconstructed correctly from saved data on restore.
- Fixed `StackOverflowError` in `visualChain` when spawning large batches of bots with `join-delay: 0` and some bots deleted mid-spawn.
- Fixed `NullPointerException` in `PlayerWorldChangeListener` on non-Folia servers (replaced Folia-specific `player.getScheduler()` with standard Bukkit scheduler).
- Fixed unclosed hex colour tags (e.g. `<#9782ff>`) at the end of LuckPerms prefixes causing broken text — trailing unclosed tags are now stripped before parsing.
- Fixed tab-list migration incorrectly applying `enabled: false` (the old header/footer toggle) as bot visibility for users upgrading from older versions.
- Fixed startup log pause/lag caused by blocking update checker — now runs asynchronously with a fast timeout.
-
Bug fix — bots restored after a server restart no longer show literal `{spawner}`, `{num}`, or `{bot_name}` in their display name; stale saves from older versions are detected and the display name is rebuilt correctly.
-
Bug fix — trailing unclosed hex color tags (e.g. `<#9782ff>`) at the end of LuckPerms prefixes are now stripped before parsing, preventing broken text in nametags and the tab list.
- Added a proper version check to the update checker (previously it only checked if the API was reachable, not if the version was actually newer).
- Fixed a bug where the update checker would report an update available when the API was reachable but returned an error or invalid response.
- Compatibility checks: detect non-Paper servers and Minecraft versions below 1.21.9 and enter a restricted compatibility mode when needed (physical bodies and chunk-loading disabled).
- Added runtime guard for missing server API classes (prevents NoClassDefFoundError when the Mannequin class is absent).
- Admin-facing in-game compatibility warning (configurable) sent on enable and on admin join.
- Teleport commands updated: `/fpp tp` and `/fpp tph` now report when no physical body is available; `/fpp info` shows "No Body" when bodies are disabled.
- Command rename: `/fpp delete` renamed to `/fpp despawn` (permission node `fpp.delete` retained for compatibility).