BotSettingGui Now Publicly Available
- Per-bot settings GUI (shift+right-click any bot) is no longer dev-only — available to all users with fpp.settings permission
- Removed developer UUID gate; any player with fpp.settings now opens the 6-row settings chest (General · Chat · PvP · Cmds · Danger)
- Grant fpp.settings via LuckPerms to allow non-op users to manage per-bot settings
Tab-List Ping Simulation (/fpp ping)
- New /fpp ping [<bot>] [--ping <ms>|--random] [--count <n>] command — set the visible tab-list latency for one or all bots
- --ping <ms> sets a specific latency (0–9999); --random assigns random realistic values; no flag shows current ping
- --count <n> targets N random bots for bulk operations
- 4 granular permissions: fpp.ping (view), fpp.ping.set (set), fpp.ping.random (random), fpp.ping.bulk (bulk --count)
⚔ PvE Attack Automation (/fpp attack)
- New /fpp attack <bot> [--stop] command — bot walks to the command sender and continuously attacks nearby entities
- Respects 1.9+ attack cooldown and item-specific cooldown timers dynamically
- Permission: fpp.attack
Permission System Restructure
- New fpp.admin node as preferred alias for fpp.op — both grant full access identically
- New fpp.despawn node as preferred alias for fpp.delete; new fpp.despawn.bulk and fpp.despawn.own sub-nodes
- Granular sub-nodes for chat, move, mine, place, use, rank, inventory, and ping commands
- New fpp.command (controls /fpp visibility), fpp.plugininfo, fpp.spawn.multiple, fpp.notify
- All nodes declared in both Perm.java and plugin.yml for LuckPerms tab-completion
Skin Mode Rename
- skin.mode values renamed: auto → player, custom → random, off → none
- Legacy values still accepted as aliases — no migration needed
NameTag Plugin Integration
- New soft-dependency on the NameTag plugin — fully optional, auto-detected at startup
- Nick-conflict guard — prevents spawning a bot whose --name matches a real player's current NameTag nickname (nametag-integration.block-nick-conflicts: true)
- Bot isolation — after each bot spawns, FPP removes it from NameTag's internal player cache to prevent NameTag from treating bots as real players (nametag-integration.bot-isolation: true)
- Sync-nick-as-rename — when a bot has a NameTag nick set (e.g. via /nick BotA Steve), FPP auto-triggers a full rename (nametag-integration.sync-nick-as-rename: false — opt-in)
- NameTag skin sync — bots inherit skins assigned via NameTag; preferred skin check runs before all other skin modes
- New NameTagHelper utility class: nick reading, skin reading, cache isolation, formatting strip, nick-conflict checks
- New FakePlayer.nameTagNick field; new lang key spawn-name-taken-nick
Skin System Overhaul
- New SkinManager class — centralised skin lifecycle: resolve, apply, cache, fallback, NameTag priority
- Hardcoded 1000-player fallback skin pool — replaces old skin.fallback-pool and skin.fallback-name config keys; bots with non-Mojang names always get a real-looking skin
- DB skin cache — new fpp_skin_cache table with 7-day TTL and auto-cleanup; avoids repeated Mojang API lookups
- skin.mode default enforced as player for existing installs that had it disabled (v58→v59 migration)
- skin.fallback-pool and skin.fallback-name removed — hardcoded in SkinManager (v59→v60 migration)
- Exposed via plugin.getSkinManager() — public API for skin resolution, application, caching, and preloading
Despawn Safety Guard
- despawn all, --random <n>, and --num <n> are now blocked while bot persistence restoration is in progress at startup — prevents startup-queued console commands from killing bots mid-restore during the ~2–3 second restore window
- New lang key delete-restore-in-progress shown to sender when the operation is blocked
- Single-bot despawn (/fpp despawn <name>) is not affected — only bulk operations
Waypoint Auto-Create
- /fpp wp add <route> now auto-creates the route if it doesn't exist — no separate create step needed
- In-chat tip shown via new wp-route-auto-created lang key when a route is implicitly created
- /fpp wp create still exists and is valid, but is now optional
- wp-usage updated so add leads the usage string; wp-list-empty hint updated to point directly to /fpp wp add <route>
AI Conversations
- New AI DM system — bots respond to /msg, /tell, /whisper with AI-generated replies
- 7 provider support: OpenAI · Anthropic · Groq · Google Gemini · Ollama · Copilot/Azure · Custom OpenAI-compatible
- API keys stored in plugins/FakePlayerPlugin/secrets.yml (never in config.yml)
- Per-bot personality assignment via /fpp personality; personalities stored as .txt files in personalities/ folder
- Bundled sample personalities: friendly · grumpy · noob
- BotConversationManager — per-player conversation history, rate limiting, typing delay simulation
New Commands
- /fpp place <bot> [once|stop] — continuous or one-shot block placing with supply-container restocking. Permission: fpp.place
- /fpp storage <bot> [name|--list|--remove|--clear] — register supply containers for mine/place jobs. Permission: fpp.storage
- /fpp use <bot> — bot right-clicks / activates the block it's looking at. Permission: fpp.useitem
- /fpp waypoint <name> [add|remove|list|clear] — manage named patrol route waypoints. Permission: fpp.waypoint
- /fpp personality [list|reload|<bot> set <name>|reset|show] — assign AI personalities. Permission: fpp.personality
- /fpp badword add|remove|list|reload — manage runtime badword filter list. Permission: fpp.badword
- /fpp rename <old> <new> — rename bot with full state preservation (inventory, XP, LP group, AI personality, tasks). Permissions: fpp.rename (any) / fpp.rename.own (own only)
- /fpp mine --pos1/--pos2/--start/--stop — area-selection cuboid mining mode
Per-Bot Settings GUI
- Shift+right-click any bot to open BotSettingGui — 6-row chest with 5 categories: ⚙ General ·
Chat · ⚔ PvP ·
Cmds · ⚠ Danger
- Toggle freeze, head-AI, chat tier, AI personality selector, stored command, rename action, delete bot
- Controlled by bot-interaction.shift-right-click-settings config key
Area Mining Mode
- /fpp mine <bot> --pos1 / --pos2 — select a cuboid mining region
- /fpp mine <bot> --start — begin mining the selected area continuously
- Auto-restocks from nearest registered StorageStore container when inventory fills
- Selections persisted to data/mine-selections.yml — survive restarts and auto-resume
Task Persistence (DB Schema v13)
- Active tasks (mine/use/place/patrol) saved to fpp_bot_tasks DB table and data/bot-tasks.yml on shutdown
- Bots automatically resume their job after server restart
Navigation & Interaction Engine
- PathfindingService — centralised navigation service eliminating duplicate nav code across commands
- NavigationRequest with lockOnArrival for atomic nav→action lock handoff
- BotNavUtil — static helpers: findStandLocation, faceToward, isAtActionLocation, useStorageBlock
- StorageInteractionHelper — shared lock→open-container→transfer→unlock lifecycle
Per-Bot Item & XP Pickup Toggles
- body.pick-up-items and body.pick-up-xp global defaults (both true)
- Per-bot overrides in BotSettingGui — toggling off immediately drops current inventory / XP to ground
- BotXpPickupListener gates both pickup events per-bot
Config v47 → v53
- Added bot-interaction, ai-conversations, badword-filter sections
- Added body.drop-items-on-despawn key
- Config reorganized into 10 clearly numbered sections with better flow and organization
- pathfinding moved into section 4 (AI & Navigation)
Interactive Help GUI
- /fpp help now opens a 54-slot double-chest GUI — paginated, permission-filtered, click-navigable; replaces text output
- Each command gets a semantically meaningful Material icon (compass for move, chest for inventory, diamond pickaxe for mine, etc.)
- Displays command name, description, usage modes, and permission node per item; up to 45 commands per page; close button
/fpp inventory (new)
- 54-slot double-chest GUI showing the bot's full inventory — main storage, hotbar, equipment slots, and offhand
- Equipment slots enforce type restrictions (boots/leggings/chestplate/helmet/offhand)
- Right-click any bot entity to open without a command
- Permission: fpp.inventory
/fpp move (new)
- Navigate a bot to an online player using server-side A* pathfinding
- Supports WALK, ASCEND, DESCEND, PARKOUR, BREAK, PLACE move types; max 64-block range, 2000-node search
- Stuck detection + path recalculation when target moves; swim-safe jump coordination
- Permission: fpp.move; Pathfinding options configurable via pathfinding.* config section
/fpp xp (new)
- Transfer the bot's entire XP pool to yourself; clears bot levels and progress
- 30-second post-collection cooldown on bot XP pickup (gated by BotXpPickupListener)
- Permission: fpp.user.xp (user-tier, included in fpp.use)
/fpp cmd (new)
- /fpp cmd <bot> <command> — dispatch a command as the bot via Bukkit.dispatchCommand()
- --add <command> stores a right-click command; --clear removes it; --show displays it
- Right-clicking a bot with a stored command runs it instead of opening inventory GUI
- Permission: fpp.cmd
/fpp mine (new)
- /fpp mine <bot> — continuous block mining at the bot's look target
- once breaks a single block; stop cancels mining; /fpp mine stop stops all mining bots
- Creative mode = instant break with 5-tick cooldown; survival = progressive mining with destroy progress packets
- Permission: fpp.mine
Settings GUI Expanded
- Settings GUI now has 7 categories: General, Body, Chat, Swap, Peak Hours, PvP, Pathfinding (up from 5)
- New pathfinding toggles: parkour, break-blocks, place-blocks, place-material
- New PvP AI settings: difficulty, defensive-mode, detect-range
WorldGuard Integration
- Bots protected from player-sourced PvP damage inside WorldGuard no-PvP regions
- WorldGuardHelper.isPvpAllowed(location) — fail-open: only explicit DENY blocks bot damage
- Soft-depend: WorldGuard auto-detected, fully optional; uses ClassLoader guard identical to LuckPerms pattern
Config
- Config version bumped from v47 → v51 — adds pathfinding section, XP pickup gate, and cmd/mine subsystem keys
- New body.pick-up-xp flag — gate orb pickup globally (true by default)
- New pathfinding.* section: parkour, break-blocks, place-blocks, place-material
Swap System — Critical Fix & Major Enhancements
- Critical bug fix: bots now actually rejoin after swapping out. The rejoin timer was being silently cancelled by delete() calling cancel(uuid) — bots left but never came back. Fixed by registering the rejoin task after delete() runs so cancel() finds nothing to cancel.
- New swap.min-online: 0 — minimum bots that must stay online; swap skips if removing one would drop below this floor
- New swap.retry-rejoin: true / swap.retry-delay: 60 — auto-retry failed rejoins (e.g. max-bots cap temporarily full)
- Better bot identification on rejoin: same-name rejoins use getByName(); random-name rejoins use UUID diff
- New Personality.SPORADIC type — unpredictable session variance for more natural patterns
- Expanded farewell/greeting message pools (~50 entries each)
- New /fpp swap info <bot> — shows personality, cycle count, time until next leave, and offline-waiting count
- /fpp swap list now shows time remaining in each session
- /fpp swap status now shows the min-online floor setting
- New logging.debug.swap: false — dedicated swap lifecycle debug channel
Performance Optimizations
- O(1) bot name lookup via secondary nameIndex map — getByName() was O
linear scan, now O(1) ConcurrentHashMap lookup maintained at all add/remove sites
- Position sync distance culling — position packets only broadcast to players within performance.position-sync-distance: 128.0 blocks (0 = unlimited); saves significant packet overhead on large servers
Log Cleanup
- NmsPlayerSpawner per-spawn/despawn log messages demoted from INFO → DEBUG; no more log spam on every bot cycle
Config Reorganization
- config.yml restructured into 9 clearly labelled sections: Spawning · Appearance · Body & Combat · AI Systems · Bot Chat · Scheduling · Database & Network · Performance · Debug & Logging
- Config version → v47
Config Clarity Improvements
- All timing-related values now clearly state their unit (ticks or seconds) with human-readable conversion examples
- join-delay / leave-delay header updated: "Values are in TICKS — 20 ticks = 1 second" with quick-reference line; min/max keys now carry inline tick-unit comments
- death.respawn-delay comment shows seconds equivalents: 15 = 0.75 s · 60 = 3 s · 100 = 5 s
- chunk-loading.update-interval clarified: "in ticks (20 ticks = 1 second). Lower = more responsive, higher = less overhead."
- swap.session / swap.absence inline comments updated with real-world time examples
Build Pipeline Fixes
- ProGuard: removed **.yml from -adaptresourcefilecontents — prevents charset corruption of plugin.yml and language files on Windows builds
- ProGuard: removed -dontpreverify — StackMapTable attributes preserved; obfuscated jar passes JVM verifier
- ProGuard: MySQL / SQLite shaded classes excluded from preverification to prevent IncompleteClassHierarchyException; merged back verbatim into final jar
