
Fake Player Plugin (FPP)
Spawn realistic fake players on your Paper server — complete with tab list presence, server list counts, join/quit messages, and in-world entities. Can also be used as configurable AFK bots to keep your server active.
Core Updates
- nLogin compatibility —
NmsPlayerSpawnernow suppresses nLogin (com.nickuc.*)PlayerJoinEventlisteners for fake players alongside the existing SimpleVoiceChat suppression. Auth plugins that expect normal client login pipelines no longer kick/despawn FPP bots during spawn.
- nLogin compatibility —
v1.6.6.12.6 (Synthetic Quit Kick Fix)
Core Updates
- Synthetic quit kick handling —
FakePlayerKickListenernow marks kicked bots as synthetic quits viaFakePlayerManager.addSyntheticQuit(UUID)before despawning. This ensures the manager treats server kicks as synthetic quits and despawns the bot with consistent quit-event semantics instead of treating it as a raw deletion. addSyntheticQuit(UUID)helper — added null-checkedaddSyntheticQuit(UUID)toFakePlayerManagerso callers can safely record synthetic quit UUIDs without duplicating null-guard logic.
- Synthetic quit kick handling —
Core Updates
- Version bump — plugin metadata and Gradle version are now
1.6.6.12.5. - Core scope reduction — advanced pathfinding movement, follow, sleep, and rich combat behavior moved out of core and into extension-owned systems.
- Directional move only — core
/fpp movenow accepts--direction forward|backward|left|rightwith optional--seconds/--ticksand--stop. - Basic attack only — core
/fpp attackreduced to--once/--stop. Rich hunting/mob targeting is extension-owned. - Sneak command — added core
/fpp sneak <bot> [on|off|toggle]withfpp.sneakpermission. - Click API — added public
FppClickModeandFppApi.leftClick/rightClickoverloads so extensions can trigger core click actions without dispatching commands. - Tab completion hardening —
CommandManagernow guards tab completion against exceptions fromcanUse()andtabComplete()in both core and addon commands. - Spawn location correctness — normal
/fpp spawnreasserts requested spawn location after join/spawn redirects; early join handling consumes pending locations at LOWEST priority. - Shutdown persistence — non-destructive shutdown save: empty snapshots do not clear
persistence.active-bots; addon shutdown runs before final bot persistence save. - Inventory persistence fix — empty inventories saved with
__emptymarker; restore clears slots before applying saved data so old items do not survive. - Damage/knockback — preserved Paper/Bukkit damage event semantics; explicit FPP knockback restored for allowed damage; suppressed for cancelled events; cross-world teleports reset transient damage state.
- Removed broad core protection gates — WorldGuard helper removed from core; external protection plugins own cancellation decisions.
- Removed core commands —
FollowCommandandSleepCommandremoved from core; follow/sleep are extension-owned. - Build output —
shadowJarcopies the shaded runnable jar to workspace root asfake-player-plugin-1.6.6.12.5.jar; plainjarrefreshesbuild/fpp.jarwithout overwriting the deployable root jar. - FastStats packaging —
shadowJarverifies FastStats classes are present; metrics initialization is fail-safe so a thin jar cannot break startup. - Config —
config-versionis74; reorganized and heavily documented; debug settings moved todebug.yml.
First-Party Extensions
- Gradle extension build —
fpp-extensionsis a Gradle multi-project that builds individual module jars into workspacebuilds/. - Bundle rename — aggregate first-party bundle is now
fpp-spoof.jarinstead offpp-extensions-bundle.jar. - Current modules —
fpp-aichat,fpp-chat,fpp-command,fpp-groups,fpp-list,fpp-luckperms,fpp-nametag,fpp-pathfinder,fpp-peaks,fpp-ping,fpp-skin,fpp-swap, andfpp-waypoints.
- Version bump — plugin metadata and Gradle version are now
v1.6.6.12.4 (Debug GUI, Left-Click Combat & Stability)
🎯 Main Focus
- Fix bot despawn after spawn bug — bots no longer instantly despawn due to stale spawn-protection checks or missing WorldGuard session state after teleport/respawn
- PacketEvents fail injection — suppressed kicks caused by
"packetevents"+"inject"errors that triggered an infinite despawn loop on every bot join - LuckPerms patch — pre-caches LuckPerms user data before
placeNewPlayer()to preventServerThreadLookupExceptionon Folia and ensure Vault/WG hooks resolve correctly at spawn time
🐛 Debug GUI & Chat Broadcasting
- Debug Settings GUI —
/fpp settingsnow has a 🐛 ᴅᴇʙᴜɢ category with 23 clickable toggles for everydebug.ymlcategory (master, general, startup, NMS, database, packets, network, config-sync, chat, swap, commands, head-ai, right-click, etc.) - Debug Chat Broadcast — new
debug-chat: falsekey indebug.yml. When enabled, allFppLogger.debug()output is sent to online players withfpp.oporfpp.notifyas in-game chat messages (gray prefix:[ꜰᴘᴘ DEBUG/<topic>] <message>) - Runtime debug toggling — debug categories can be flipped on/off without restarting via the GUI; changes are saved to
debug.ymlimmediately
🖱️ Left-Click Command Improvements
- Auto-target hostile mobs — bots now automatically detect and attack hostile mobs (Monsters, Slimes, Ghasts, Phantoms, Hoglins, Shulkers, EnderDragon) in their forward cone when no block is targeted
- Auto-aiming — bot head and body smoothly rotate to face the targeted mob
- Multi-flag parsing — fixed
--once,--repeat,--hold, and--stopflag handling so multiple flags can be specified correctly in a single command
🔧 Bug Fixes & Stability
- LuckPerms cache warmup —
NmsPlayerSpawnerpre-loads LuckPerms user data beforeplaceNewPlayer()to preventServerThreadLookupExceptionon Folia - WorldGuard session refresh — complete rewrite using cold re-initialization via reflection (
tryRemoveSession+Session.initialize()) to prevent stale region data after bot teleports/world changes - Teleport/respawn WG refresh —
FakePlayerEntityListeneraddsPlayerTeleportEvent.MONITORandPlayerRespawnEventhandlers with delayed (1-2 tick) WG session refresh - Spawn protection teleport fix —
BotSpawnProtectionListenernow allowsPLUGINandCOMMANDteleports during the grace window so/fpp tphand cross-world moves work correctly; portals are still blocked - Despawn reason tracking — all
removeBot()calls now pass descriptive reasons (spawn_body_failed,command_despawn,gui_delete,badword_cleanup,packetevents_kick,kicked_by_server,api_despawn,rename_swap,body_remove, etc.) instead of"unspecified" - PacketEvents kick suppression —
FakePlayerKickListenersilently cancels kicks containing"packetevents"+"inject"instead of despawning the bot, preventing instant-despawn loops - Attribution/logging cleanup — silenced license heartbeat, JSON response, and integrity check logs unless explicitly enabled via
debug.yml - Placeholder formatting — cleaned up
formatUptimeone-liner inFppPlaceholderExpansion - Help GUI formatting — fixed indentation in lore builder
v1.6.6.12.3 (Folia Config Patch)
🔧 Folia Config Patch
- Folia config issue patched — formatting normalization across
build.gradle.kts,Config.java, andplugin.ymlto resolve Folia-related configuration loading problems
- Folia config issue patched — formatting normalization across
v1.6.6.12.2 (FOLIA SUPPORT IS BACK !)
Major Features
-
Left/Right Click Commands — Replaced legacy Mine/Use/Place commands with unified click automation
/fpp left-click <bot> [--once|--repeat|--hold|--stop]— Bot left-clicks (breaks blocks, attacks entities)/fpp right-click <bot> [--once|--repeat|--hold|--stop]— Bot right-clicks (uses items, interacts)- Supports walking to target before clicking if out of reach
- Ray-tracing for block and entity targeting
- Integrated with FindCommand for automated mining workflows
-
Folia Support Restored — Full compatibility with Folia's region-threaded architecture
- Automatic Folia detection at startup
- Bot spawning routes through region scheduler when on Folia
folia-supported: truein plugin.yml- FppScheduler guards for cross-thread operations
-
Launcher Entrypoint — Added standalone launcher for JAR execution
- Opens wiki homepage when JAR is executed directly
- Main-Class manifest attribute set in shadowJar
License System Updates
-
Silent Verification — License verification now runs silently without debug spam
- Removed verbose logging (Team ID, Product ID, challenge, response JSON)
- Only shows error message if verification fails
- Cleaner startup logs for production servers
-
Offline Fallback Mode — Plugin no longer disables when credentials fetch fails
- Creates minimal dummy credentials to continue in limited mode
- Improved error messages and logging
- Discord support link added to warning messages
Debug Logging Cleanup
-
Config-Fixed Debug Methods — All debug methods now independent and respect
debug.yml- Fixed
debugNmsBot(),debugNms(),debugNmsPhysics()to not cascade - 17 debug log calls in
FakePlayerManager.javaandNmsPlayerSpawner.javafixed - Bot despawn operations no longer spam console when debug disabled
- Fixed
-
debug.yml Updated — Removed
licensedebug category (no longer needed)- All debug settings now in separate file for better organization
- Master
enabled: falseswitch controls all categories
Startup & Shutdown Logs
-
Startup Banner Simplified — Removed clutter from startup logs
- Removed
Backupscount (not useful for most users) - Removed
Name poolsize (internal detail) - Removed
Debugsection (showed authors when debug enabled) - Cleaner, more focused information display
- Removed
-
Shutdown Banner Minimal — Reduced from 7 lines to 4 lines
- Shows only session uptime and bots removed
- Removed: bots saved, tasks persisted, DB sessions details
Config Migration System
- v75 Migration — Removes
logging.debug.*keys from config.yml- All debug settings now live in
debug.ymlonly - Automatic migration on first startup after update
- Keys removed:
logging.debug.startup,logging.debug.nms,logging.debug.packets,logging.debug.network,logging.debug.config-sync,logging.debug.database,logging.debug.skin,logging.debug.license,logging.debug.commands,logging.debug.chat,logging.debug.swap,logging.debug.right-click,logging.debug.right-click-head,logging.debug.head-ai,logging.debug.general
- All debug settings now live in
Permission System
- BotAccess Checks — Added ownership validation for multi-bot operations
/fpp attack --allnow respects bot ownership/fpp follow --allchecks admin permissions/fpp despawn --own— New flag to despawn only your own bots- Non-admin players can only administer bots they spawned
Command Changes
- MineCommand Removed — Functionality moved to LeftClickCommand
- UseCommand Removed — Functionality moved to RightClickCommand
- PlaceCommand — Still available, integrated with click system
- FindCommand — Updated to work with click commands instead of mine
- StopCommand — Updated to stop left/right click tasks
- AttackCommand — Added
--stopflag (removed legacystopkeyword) - DeleteCommand — Added
--ownflag for user-tier bot removal
Documentation
- AGENTS.md Added — Development guide for AI assistants
- Project overview and architecture
- Critical gotchas (license, Folia, command registration)
- Build commands and testing checklist
- Package structure reference
Bug Fixes
- Tab Complete — Removed duplicate legacy keywords
- Permission Checks — Fixed admin bypass for bulk operations
- Persistence Wiring — Updated to use click commands instead of mine/use/place
- Debug Spam — Fixed all NMS-BOT debug messages respecting config
Build System
- Version Bump — 1.6.6.12.1 → 1.6.6.12.2
- Manifest Attributes — Added Main-Class for launcher support
- Dependencies — PlaceholderAPI updated to 2.12.2
Code Quality
- Removed 1449 lines of legacy MineCommand code
- Removed 713 lines of legacy UseCommand code
- Added 733 lines for LeftClickCommand
- Added 932 lines for RightClickCommand
- Net reduction: ~500 lines of code
- Improved separation of concerns for click automation
-
License System Updates
- License server migration — Switched license verification from
license.fpp.wtftoapp.lukittu.com - Frontend credential fetch — Credentials now fetched from
fpp.wtf/api/license/freewith HMAC signature verification - Improved license logging — Better error messages and debug logging for license verification failures
- API key authentication — Added Bearer token authentication for frontend API requests
Bug Fixes
- License credentials fetch — Fixed API key encoding for frontend authentication
- License server migration — Switched license verification from
Breaking Changes
- Folia support removed — FPP no longer supports Folia due to fundamental incompatibilities with regionised threading and entity ticking. Use Paper/Purpur instead.
- Body disable system removed —
body.enabledconfig option removed. Bots always spawn with physical bodies (tab-list only mode no longer available). - SpigotMC distribution removed — Plugin no longer distributed on SpigotMC. Download from Modrinth, PaperMC Hangar, or BuiltByBit.
Features Removed
%fpp_body%placeholder — Removed along with body disable system.- Body toggle in GUI — Removed from Settings GUI (body category).
- Skin system toggle — Removed from Settings GUI.
New Features & Improvements
- Pathfinding overhaul — Major improvements to
BotPathfinder.javaandPathfindingService.javawith better A* navigation, gap walking, block break/place support, and stuck detection. - Mine command improvements — Added actual block breaking via
nms.gameMode.destroyBlock(), improved progress tracking, and pickup flow. - Use command enhancements — Combined Use+Place functionality with
UseModeenum, flexible targeting from bot look direction, and better ray-tracing. - Head AI action locking — Added
actingBotsconcurrent set to fully disable head AI while bots perform actions (mining, using, placing).
Bug Fixes
- PacketEvents injection error — Added try-catch wrapper around PacketEvents registration to prevent GrimAC/ViaVersion compatibility issues from breaking bot spawns.
- UseCommand NPE — Fixed null pointer when storing ray-trace targets; only stores non-null targets.
- Head AI during actions — Bots now properly disable head rotation while performing mine/use/place actions.
- Mining not breaking blocks — MineCommand now actually breaks blocks via NMS game mode.
Code Quality
- Removed
spawnBody()config method and all references to body disable logic - Cleaned up
FakePlayerManager.javaspawn logic (no more bodyless mode) - Updated startup banner, metrics, and placeholders to remove body enable references
- Removed unused custom metrics from
FppMetrics.java - Removed outdated
AGENTS.mdfile - Added
note.mddevelopment tracking document
Documentation
- Updated all wiki pages to reflect Paper/Purpur-only support
- Removed Folia-Support wiki page
- Updated FAQ to explicitly state Folia is not supported
- Updated legal documents (copyright, privacy-policy, extensions, terms-of-service)
- Updated README.md with platform changes
Bug Fixes
- Online player count — bots now correctly subtracted from real-player count in
/fpp statsand network totals (commit6afca8a) - Database flush — runs outside the main thread to prevent server lag spikes (
f671781) - Batching logic — added proper batching for DB writes and network heartbeats (
528cf0e) - Removed dead writer/health-check logic that caused unnecessary DB overhead (
fcbe072) - Removed pointless bot record update before clearing the list on shutdown (
8c1eb56)
Code Quality
- Removed unnecessarily fully qualified class names across codebase (
001416d) - General cleanup of dead code, unused fields, and redundant calls (
14d1803)
Documentation
- Updated command reference with
extension --list,spawn --notp, andattack --moveflags - Synced config docs with
pathfinding.*,skin.*,help.*,ping.*,metrics.debug, andheartbeat.enabled
- Online player count — bots now correctly subtracted from real-player count in
v1.6.6.10.1
Attribution & Author Updates
- Hardcoded original author updated from
el_pepestoF_PPacross codebase
FastStats Metrics System Overhaul
- ErrorTracker — context-aware error tracking via FastStats API
- Debug toggle —
metrics.debugoption inconfig.yml(defaultfalse) - onFlush callback — logs at debug level when metrics are flushed to FastStats
- New metrics added:
active_features(string array), feature flags, installed plugins (LuckPerms, PlaceholderAPI, WorldGuard, WorldEdit, NameTag), server info, PvE settings, automation toggles - trackError() helpers — two public overloads (
ThrowableandString) for external error reporting - Added
getFppMetrics()public getter onFakePlayerPlugin.java
Bug Fixes
- FakeChannelPipeline deprecation warning — added
@SuppressWarnings("deprecation")to suppress unavoidable NettyChannelPipelineAPI deprecation warnings forEventExecutorGroupoverloads - PluginRemapper duplicate entries —
pom.xmlnow properly excludes Mojang-mappedpaper-serverNMS classes from shaded JAR, fixing Paper 1.21.11 runtime remapping crash - SQLite AUTO_INCREMENT syntax — split
fpp_network_taskstable creation into SQLite (INTEGER PRIMARY KEY AUTOINCREMENT) and MySQL (BIGINT AUTO_INCREMENT) variants, fixingSQLITE_ERROR near "AUTO_INCREMENT": syntax error
Deprecations & Removals
- None
- Hardcoded original author updated from
v1.6.6.10
Requires MySQL for cross-server features.
Network Architecture
Proxy-merged database — all backends share live bot registry and player counts via MySQL.
- Schema v25:
fpp_network_bots,fpp_server_heartbeat,fpp_network_tasks - NetworkHeartbeatManager — publishes local bots / reads remote bots every 5s, stale pruning every 60s
- Proxy companions (Velocity + Bungee) push
NETWORK_STATSto all backends independently of players RemoteBotCachenow survives restarts via DB (no longer messaging-only)
PlaceholderAPI — 70+ placeholders
New cross-server placeholders:
%fpp_network_total%,%fpp_network_real%,%fpp_network_bots%
Also added: server performance, extensions, 30+ config toggles, player-relative per-world, per-bot dynamic lookups.Extension System
/fpp extensionbare command → marketplace link/fpp extension --list→ loaded extensions detail table- Extension data folders fixed (
getName()instead of JAR filename)
Deprecations & Fixes
getServers()→getServersCopy(),FixedMetadataValue→PersistentDataContainer, unchecked warnings cleaned- Startup banner shows extension count
- Authors updated to
F_PPandKyttu
Legal
Added
frontend/legal/pages (copyright, extension policy, privacy, ToS)- Schema v25:
v1.6.6.9 (Current)
- Fall damage implemented (configurable via
combat.fall-damage) - Fall damage tracking fixed in
FakePlayerManagertick loop - Skin injector fixes for skin extension compatibility
- Config migrator improvements (v71→v72 cleanup)
- Extension bundle support
- Config YML extension removal & migration handling
- Further API additions for extensions
- Database/config migration improvements
v1.6.6.8
- Spoofing features moved to
fpp-spoof.jarextension — fake chat, AI conversations, swap system, peak-hours scheduler, ping command, bot groups, and stored commands are no longer in core; they now ship as thefpp-spoof.jarextension - PvE Smart Attack Mode: tri-state per-bot setting (OFF / ON_NO_MOVE / ON_MOVE)
- Hunt mode (
--hunt) for roaming mob hunting - New commands:
/fpp save,/fpp setowner - Per-bot overrides:
respawn-on-death,auto-eat,auto-place-bed BotSettingGuioverhaul: new PvE tab, Pathfinding tab, share control- Extension config & resources support (
extension-resources/in JAR) - DB schema v22: new columns for PvE, automation, ping, LuckPerms
- Fall damage implemented (configurable via
v1.6.6.8 (2026-05-02)
Bot Join/Leave Message Overhaul
- Bot join/leave messages now use custom
bot-join/bot-leavelang keys fromen.ymlinstead of vanilla "joined/left the game" — fully customizable with MiniMessage formatting - Vanilla quit messages are always nulled for bots; leave messages are broadcast explicitly via
BotBroadcast.broadcastLeaveByDisplayName()— no more missing leave messages - Death-despawn leave messages fire 20 ticks after death (after kill message + entity removal) for proper ordering: kill message → leave message
Skin System Improvements
- Skin fetch retry count increased from 3→5 (
MAX_FALLBACK_ATTEMPTS) — bots try up to 5 pool names before falling back to Steve/Alex SkinRepository.getAnyValidSkin()retries with different random names on failure;SkinManager.tryFallback()handles null/invalid results gracefully- All skin retry/failure messages converted to
Config.debugSkin()— silent by default, visible only withlogging.debug.skin: true
Ping System
ping.enableddefault changed fromtruetofalse— ping simulation is now opt-in (existing configs unaffected; migration v69→v70)
Help Menu
HelpGuinow includesping(REPEATER) andskin(PLAYER_HEAD) commands in the Bots category
Extension Config & Resource System
FppExtensionnow provides 6 convenience methods:getDataFolder(),getConfig(),saveDefaultConfig(),saveDefaultResources(),saveResource(),reloadConfig()FppApiexposes 3 cross-extension methods:getExtensionDataFolder(),saveDefaultExtensionConfig(),getExtensionConfig()ExtensionLoadercreates per-extension data folders automatically;/fpp reload extensionsnow syncs config keys
Per-Bot Settings GUI Overhaul
- BotSettingGui now has 5 categories: ⚙ General · 💬 Chat · 🗡 PvE · 🧭 Pathfinding · ⚠ Danger
- General: frozen, respawn-on-death (new), head-AI, swim-AI, chunk-radius, pick-up-items, pick-up-xp, rename, share-control (new)
- PvE (new, replaces PvP): smart-attack mode (OFF/ON still/ON move), mob type selector (90+ entries), detect range, target priority
- Pathfinding (new): follow-player, parkour, break-blocks, place-blocks
- Danger: reset-all-settings (new), delete bot — both double-click confirm
PvE Smart Attack Mode
- Per-bot tri-state:
OFF/ON_NO_MOVE(stationary) /ON_MOVE(pursues via PathfindingService); persisted in DB v21 /fpp attack <bot> --mob --movemaps toON_MOVE;pveEnabledis now a convenience accessor
Attack Hunt Mode
- New
/fpp attack <bot|all> --hunt [<mob>] [--range <n>] [--priority <mode>]— autonomous roaming mob hunt (range 32, not locked); Permission:fpp.attack.hunt
New Commands
/fpp save— checkpoint all bot data to disk (Perm:fpp.save)/fpp setowner <bot> <player>— transfer bot ownership (Perm:fpp.setowner)/fpp bots [bot]— paginated GUI of manageable bots (aliases:mybots,botmenu; Perm:fpp.settings)/fpp skin <bot> <username|url|reset>— apply Mojang/URL skin or reset (Perm:fpp.skin)/fpp find <bot> <block> [--radius] [--count]— scan + mine nearby blocks (Perm:fpp.find)/fpp groups [gui|list|create|delete|add|remove]— personal bot groups (Perm:fpp.groups)/fpp sleep <bot|all> <x y z> <radius>— auto-sleep at night (Perm:fpp.sleep)/fpp stop [<bot>|all]— cancel all active tasks (Perm:fpp.stop)/fpp move <bot> --coords <x> <y> <z>— navigate to coordinates with~offsets/fpp move <bot> --roam [x,y,z] [radius]— autonomous random wandering (persists across restarts)
Per-Bot Features
respawnOnDeath— auto-respawn on death;autoEatEnabled/autoPlaceBedEnabled— per-bot automation overridesnavAvoidWater/navAvoidLava— per-bot pathfinding avoidance;defaultWaterPathAvoidanceEnabled(init:true)- Mob type selector GUI — 54-slot paginated chest for toggling specific mob types per-bot
- Share control — grant/revoke controller access to other players from BotSettingGui
Extension / Addon API
FppExtensioninterface — drop.jarfiles intoextensions/; auto-loaded, sorted by priority; lifecycle:onEnable(FppApi)/onDisable()- 20+ API event classes; full access to commands, tick handlers, settings GUI tabs, navigation, service registry
Random Name Generator
bot-name.mode: random(new default) — generates realistic Minecraft-style usernames on the fly; no moreBot1234
WorldEdit Integration
--weselflag for/fpp mineand/fpp place— uses current WorldEdit selection; Permissions:fpp.mine.wesel,fpp.place.wesel
Automation Defaults
- New
automationsection:auto-eat: true,auto-place-bed: true— copied to new/restored bots; existing bots keep per-bot values
Pathfinding & Knockback Fixes
- Door/gate/trapdoor handling; ladder/vine/scaffolding climbing; knockback fix for 1.21.9+; organic walk wobble (±5°); sprint-jump on airborne→ground transition
Folia Support
folia-supported: trueinplugin.yml; compatible with Folia's regionised threading model
Configuration
- Config version: 65 → 70 (v65→v67: mass-disable-threshold, bot-name.mode, follow-recalc-interval; v67→v70: ping latency-effect, spike, enabled-default changes)
- DB Schema: v18 → v22 (v18→v19: nav_avoid_water/lava; v19→v20: ping; v20→v21: pve_smart_attack_mode, respawn_on_death; v21→v22: auto_milk_enabled, prevent_bad_omen, ping_user_set)
Permissions
- New nodes:
fpp.save,fpp.setowner,fpp.skin,fpp.attack.hunt,fpp.find,fpp.sleep,fpp.stop,fpp.mine.wesel,fpp.place.wesel,fpp.tph.all
- Bot join/leave messages now use custom
v1.6.6.7 (2026-04-26)
Extension / Addon API
- New
FppExtensioninterface — third-party developers can drop.jarfiles intoplugins/FakePlayerPlugin/extensions/and FPP will auto-load them on startup ExtensionLoaderscans extension jars forFppExtensionimplementations, instantiates them, and registers them as addons sorted by priority- Full addon lifecycle:
onEnable(FppApi)/onDisable()with access to commands, events, tick handlers, settings GUI tabs, metadata, navigation API, and service registry - 20+ API event classes for bot interactions (spawn, despawn, move, mine, place, attack, follow, chat, etc.)
- See
EXTENSIONS.mdin the repository for the complete addon developer guide
Random Name Generator
- New
bot-name.mode: random(default) — generates realistic Minecraft-style usernames on the fly when the name pool is empty or whenmode: randomis set bot-name.mode: pool— legacy behaviour, picks frombot-names.yml- No more
Bot1234fallback names; every auto-generated name looks like a real player
New Commands
/fpp find <bot> <block> [--radius <n>] [--count <n>]— bot scans nearby chunks for the target block type, reserves matching locations, and mines them one by one. Async chunk snapshot scanning with progressive mining and raytrace visibility check. Permission:fpp.find/fpp groups [gui|list|create <name>|delete <name>|add <group> <bot>|remove <group> <bot>]— personal bot groups with GUI management. Group bots together for bulk commands. Permission:fpp.groups/fpp sleep <bot|all> <x y z> <radius>— registers a sleep-origin; bot auto-walks to the nearest free bed within radius at night and sleeps./fpp sleep <bot|all> --stopclears the origin. NMS sleep/wake with temporary bed placement. Permission:fpp.sleep/fpp stop [<bot>|all]— instantly cancels all active tasks for a bot (move, mine, place, use, attack, follow, find, sleep). Permission:fpp.stop/fpp move <bot> --coords <x> <y> <z>— navigate a bot to exact world coordinates; supports~relative offsets. Permission:fpp.move/fpp attack <bot> --mob --move— PvE mob-targeting mode now supports pursuit; bot chases the target when out of melee range and stops to attack when in reach. Permission:fpp.attack
WorldEdit Integration
- New
--weselflag for/fpp mineand/fpp place— uses the player's current WorldEdit selection as the work area instead of manual--pos1/--pos2 - Soft-dependency:
WorldEditadded toplugin.ymlsoftdepend list - Permissions:
fpp.mine.wesel,fpp.place.wesel
Automation Defaults
- New
automationconfig section:auto-eat: true— bots eat food from inventory when hunger prevents sprintingauto-place-bed: true— bots may place a bed from inventory for auto-sleep, then break it after waking
- Values are copied to newly spawned/restored bots; existing bots keep per-bot overrides
Pathfinding & Knockback Fixes
- Door handling — bots now correctly open and pass through wooden doors, fence gates, and trapdoors during pathfinding
- Ladder and vine climbing — ASCEND/DESCEND moves now support ladders, vines, and scaffolding
- Knockback fix double-check — resolved residual knockback issues on 1.21.9+ with tiered strategy verification
- Organic walk wobble — subtle sine-wave yaw drift (±5°) on straight WALK segments for more human-like movement
- Sprint-jump naturalness — jump fires on first airborne→ground transition instead of fixed 6-tick timer
Folia Support
folia-supported: truedeclared inplugin.yml- Compatible with Folia's regionised threading model
Proxy & Communication
- Enhanced proxy communication with error handling and pending bot despawn management
fpp.tph.allpermission — teleports all accessible bots to the sender at once
Configuration
- Config version: 65 → 67
chunk-loading.mass-disable-threshold: 100— auto-releases chunk tickets when bot count exceeds this threshold to prevent mass-bot lagbot-name.mode: random(new default)pathfinding.follow-recalc-interval: 100(new key)
Permissions
- New nodes:
fpp.find,fpp.sleep,fpp.stop,fpp.attack.hunt,fpp.mine.wesel,fpp.place.wesel,fpp.tph.all - All nodes declared in
plugin.ymlfor LuckPerms tab-completion
Technical
- Database schema updates for bot groups and despawn snapshot persistence
BotGroupCommand,BotGroupStorefor group managementFindCommandwith async chunk snapshot scanning and block reservation systemSleepCommandwith NMS sleep/wake and night-watch repeating taskStopCommandwith dependency injection of other command instances for bulk cancellation
- New
v1.6.6.2 (2026-04-21)
🐛 Critical Bug Fixes
-
/fpp despawn allinventory preservation — Fixed critical bug where bulk despawn (/fpp despawn all,/fpp despawn --random [n],/fpp despawn --num <n>) completely erased all bot inventories and XP. Root cause:FakePlayerManager.removeAll()had zero snapshot logic — it just cleared internal maps and scheduled entity removal without capturing any data. Single-bot despawn (/fpp despawn <name>) worked correctly because it called a different method (delete()) that had proper snapshot code.removeAll()now implements the same synchronous snapshot system: captures inventory (main/armor/extra) and XP (total/level/progress) for ALL bots before any maps are cleared or entities are removed. Bulk and single-bot despawn now behave identically. -
Dimension spawn coordinate fix — Bots spawned directly in the Nether or End now stay at their exact spawn coordinates. Previously, Minecraft's portal/respawn logic would teleport bots during the 5-tick spawn grace period, corrupting coordinates.
BotSpawnProtectionListenernow blocks ALL teleport causes (PLUGIN,UNKNOWN,NETHER_PORTAL,END_PORTAL,END_GATEWAY) during the spawn window, not justPLUGINandUNKNOWN. Bot identification during spawn also improved — fallback UUID lookup ensures bots are recognized even before the PDC key is written.
💾 Despawn Snapshot Persistence Across Restarts
-
Remember bot inventory when rejoining — Bot inventory and XP are now fully preserved across server restarts after manual despawn. When you
/fpp despawn <name>(withbody.drop-items-on-despawn: false), the bot's inventory (main/armor/extra slots) and XP (total/level/progress) are saved to a persistent snapshot (stored in thefpp_despawn_snapshotsdatabase table ordata/despawn-snapshots.ymlfallback when DB is disabled). When you/fpp spawnthe same bot name later — even after a server restart — the snapshot is automatically restored, giving the bot back everything it had before despawn. -
New database table
fpp_despawn_snapshots— Schema v17 → v18 adds a dedicated table for despawn snapshot persistence:bot_name,server_id,inventory_data(pipe-separated slot encoding),xp_total,xp_level,xp_progress,saved_at. Snapshots are loaded at startup viaFakePlayerManager.initDespawnSnapshots()and consumed on next same-name spawn. YAML fallbackdata/despawn-snapshots.ymlis used whendatabase.enabled: false. -
Respects
body.drop-items-on-despawntoggle — Whentrue, items physically drop to the ground (old behavior, no snapshot). Whenfalse(new default for all existing installs via config migration v64→v65), inventory and XP are snapshotted and restored on respawn.
⚙️ Configuration & Settings
-
New config key:
messages.death-message(defaulttrue) — Controls whether bots broadcast vanilla death messages. Whenfalse, death messages are suppressed at the event level (PlayerDeathEvent.deathMessage(null)), preventing any death announcements for bots. Added in config v63→v64. -
Config migration v64→v65 — Forces
body.drop-items-on-despawn: falsefor all existing installs. The old JAR default (true) caused silent item loss on/fpp despawnbecause items would drop to the ground and disappear. The new default (false) preserves inventory via snapshots — bots keep their items across despawn/spawn cycles and server restarts. -
SettingGui improvements — Body category now has a
body.drop-items-on-despawntoggle (chest icon — "Drop items on despawn: drop inventory + xp when despawned vs preserve for next spawn"). Messages category now has amessages.death-messagetoggle (skeleton skull icon — "Broadcast vanilla death message when a bot dies").
🔧 Technical Improvements
-
SettingGui branding update —
SKIN_OWNER_NAMEchanged from"El_Pepes"to"F_PP"for UI skull rendering consistency. -
BotSpawnProtectionListener detection robustness —
isFppBot()is now instance-based (not static) and includes a UUID-based fallback lookup againstFakePlayerManager.activePlayersfor bots that haven't had their PDC key written yet (fires during the very firstPlayerJoinEventinsideplaceNewPlayer()). -
Language file cleanup — Fixed several rendering inconsistencies in
en.ymlmessage keys (delete-success,bot-rename,chat-*,swap-*,move-listpos-empty,place-*— corrected character sequences for consistent display).
📋 Config & Database Versions
-
Config version: 63 → 65
- v63→v64: Added
messages.death-message: true - v64→v65: Forced
body.drop-items-on-despawn: falsefor existing installs
- v63→v64: Added
-
Database schema: 17 → 18
- v17→v18: New
fpp_despawn_snapshotstable for inventory/XP persistence across restarts
- v17→v18: New
-
v1.6.6.1 (2026-04-20)
FPP BungeeCord Companion (
fpp-bungee.jar)- New standalone BungeeCord/Waterfall proxy plugin — drop
fpp-bungee.jarinto your BungeeCordplugins/folder; no config needed - Registers
fpp:proxyplugin-messaging channel; listens forBOT_SPAWN,BOT_DESPAWN,SERVER_OFFLINEmessages from backend servers - Maintains a live bot registry; pings all backend servers every 5 s and caches total player counts
- Intercepts
ProxyPingEventto inflate the proxy-level server-list player count and hover sample list (up to 12 bot names shown) - Prints a prominent anti-scam warning on every startup — FPP and this companion are 100% free; if you paid for them you were scammed
- Source:
bungee-companion/module in the FPP repository
Bug Fixes
- Bot join/leave message color fix —
BotBroadcastnow parses display names with full MiniMessage + legacy&/§color support. Previously, color tags in bot display names could render as raw text in join/leave broadcasts; display names now render exactly as defined inen.yml
- New standalone BungeeCord/Waterfall proxy plugin — drop
v1.6.6 (2026-04-20)
FPP Velocity Companion (
fpp-velocity.jar)- New standalone Velocity proxy plugin — drop
fpp-velocity.jarinto your Velocityplugins/folder; no config needed - Registers
fpp:proxyplugin-messaging channel; listens forBOT_SPAWN,BOT_DESPAWN,SERVER_OFFLINEmessages from backend servers - Maintains a live bot registry; pings all backend servers every 5 s and caches total player counts
- Intercepts
ProxyPingEventto inflate the proxy-level server-list player count and hover sample list (up to 12 bot names shown) - Prints a prominent anti-scam warning on every startup — FPP and this companion are 100% free; if you paid for them you were scammed
- ⚠️ See the Velocity Companion section above for install steps and official download links
Follow-Target Automation (
/fpp follow)- New
/fpp follow <bot|all> <player> [--stop]command — bot continuously follows an online player; path recalculates whenever the target moves >3.5 blocks --stopcancels following on one or all bots- FOLLOW task type persisted in
fpp_bot_tasks— bot resumes following after server restart if the target is online - Permission:
fpp.follow
Per-Bot PvE Settings (now fully live)
BotSettingGuiPvP tab now has live-editable per-bot PvE controls:pveEnabledtoggle,pveRange,pvePriority(nearest/lowest-health),pveMobTypes(entity-type whitelist — empty = all hostile)- Settings persisted in
fpp_active_bots(DB schema v15→v16) - Config keys:
attack-mob.default-range,attack-mob.default-priority,attack-mob.smooth-rotation-speed,attack-mob.retarget-interval,attack-mob.line-of-sight
Skin Persistence Across Restarts (DB v16→v17)
- Resolved bot skins are now saved to
fpp_active_bots(skin_texture+skin_signaturecolumns) - Bots reload their cached skin on server restart — no additional Mojang API round-trip needed
Server-List Config Keys
- New
server-list.count-bots(defaulttrue) — controls whether bots are included in the displayed server-list player count - New
server-list.include-remote-bots(defaultfalse) — include remote proxy bots in the server-list count (NETWORK mode) - Config v60→v61 migration adds both keys with no behaviour change for existing installs
pathfinding.max-fall- New
pathfinding.max-fallkey (default3) — A* pathfinder will not descend more than this many blocks in a single unbroken fall
Bug Fixes & Build
Attribute.MAX_HEALTHcompatibility — fixedNoSuchFieldErrorcrash on Paper/Purpur 1.21.1 and older. NewAttributeCompatutility resolves the correct enum constant at class-load time (MAX_HEALTHon 1.21.3+,GENERIC_MAX_HEALTHon older builds) — all Paper 1.21.x versions are now fully supported- FPP Velocity banner — replaced
█block characters in the anti-scam section with═double-line rules matching the rest of the console banner style; version bumped to 1.6.6 - IntelliJ build —
fpp-velocity.imlwas missing, causing the IntelliJ artifact builder to output an emptyfpp-velocity.jar; the module file is now committed with the correct source root and full Velocity API transitive classpath
DB Schema v15 → v16 → v17
- v15→v16:
fpp_active_botsgainspve_enabled BOOLEAN DEFAULT 0,pve_range DOUBLE DEFAULT 16.0,pve_priority VARCHAR(16),pve_mob_type VARCHAR(64)— per-bot PvE settings - v16→v17:
fpp_active_botsgainsskin_texture TEXT,skin_signature TEXT— persists resolved skin data across restarts
Config v60 → v61 → v62 → v63
- v60→v61:
server-listsection added (count-bots,include-remote-bots) - v61→v62:
pathfinding.max-falladded - v62→v63:
attack-mob.*default config keys added
- New standalone Velocity proxy plugin — drop
v1.6.5.1 (2026-04-17)
BotSettingGui Now Publicly Available
- Per-bot settings GUI (shift+right-click any bot) is no longer dev-only — available to all users with
fpp.settingspermission - Removed developer UUID gate; any player with
fpp.settingsnow opens the 6-row settings chest (General · Chat · PvP · Cmds · Danger) - Grant
fpp.settingsvia LuckPerms to allow non-op users to manage their own bots' per-bot settings
- Per-bot settings GUI (shift+right-click any bot) is no longer dev-only — available to all users with
v1.6.5 (2026-04-17)
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);--randomassigns 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.adminnode as preferred alias forfpp.op— both grant full access identically - New
fpp.despawnnode as preferred alias forfpp.delete; newfpp.despawn.bulkandfpp.despawn.ownsub-nodes - Granular sub-nodes for chat (
fpp.chat.global,.tier,.mute,.say), move (fpp.move.to,.waypoint,.stop), mine (fpp.mine.start,.once,.stop,.area), place (fpp.place.start,.once,.stop), use (fpp.useitem.start,.once,.stop), rank (fpp.rank.set,.clear,.bulk), inventory (fpp.inventory.cmd,.rightclick), ping (fpp.ping.set,.random,.bulk) - New
fpp.command(controls/fppvisibility),fpp.plugininfo(full info panel),fpp.spawn.multiple/.mass/.coords,fpp.notify(update notifications) - All nodes declared in both
Perm.javaandplugin.ymlfor LuckPerms tab-completion
Skin Mode Rename
skin.modevalues renamed:auto→player,custom→random,off→none- Legacy values still accepted as aliases — no migration needed for existing configs
FlagParser Utility
- New reusable command argument/flag parser with deprecation aliases, duplicate detection, and conflict detection
- Used by
/fpp pingand available for future commands
UpdateChecker Beta Detection
latestKnownVersionandisRunningBetafields on plugin — detects when running a build newer than the latest published release
- New
v1.6.4 (2026-04-16)
NameTag Plugin Integration
- New soft-dependency on the NameTag plugin — fully optional, auto-detected at startup
- Nick-conflict guard — prevents spawning a bot whose
--namematches 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 so the bot's actual MC name becomes the nick (nametag-integration.sync-nick-as-rename: false— opt-in) - NameTag skin sync — bots inherit skins assigned via NameTag;
SkinManager.getPreferredSkin()checks NameTag-assigned skins first - New
NameTagHelperutility class: nick reading, skin reading, cache isolation, formatting strip, nick-conflict checks - New
FakePlayer.nameTagNickfield tracks the cached nick from NameTag - New lang key
spawn-name-taken-nickshown when a bot name conflicts with a real player's nick
Skin System Overhaul
- New
SkinManagerclass — centralised skin lifecycle: resolve, apply, cache, fallback, NameTag priority - Hardcoded 1000-player fallback skin pool — replaces the old
skin.fallback-poolandskin.fallback-nameconfig keys; bots with non-Mojang names always get a real-looking skin from the built-in pool - DB skin cache — new
fpp_skin_cachetable with 7-day TTL and auto-cleanup; resolved skins cached to database to avoid repeated Mojang API lookups skin.modedefault enforced asplayerfor existing installs that had it disabled (v58→v59 migration)guaranteed-skindefault enforced astruefor existing installs (v58→v59 migration)skin.fallback-poolandskin.fallback-nameconfig keys removed — now hardcoded in SkinManager (v59→v60 migration)- Exposed via
plugin.getSkinManager()— public API:resolveEffectiveSkin,applySkinByPlayerName,applySkinFromProfile,applyNameTagSkin,resetToDefaultSkin,preloadSkin,clearCache
Per-Bot Swim AI & Chunk Load Radius
- Each bot now has an individual swim AI toggle — override the global
swim-ai.enabledper-bot without restarting - Each bot now has an individual chunk load radius —
-1= follow globalchunk-loading.radius,0= disable chunk loading for this bot,1-N= fixed radius (capped at global max) - Both fields are initialised from the global config at spawn, fully persisted across restarts (DB column + YAML key), and editable at runtime
BotSettingGui General Tab Expanded
- General tab now has 7 action slots: Frozen · Head-AI · Swim-AI (new) · Chunk-Load-Radius (new, numeric prompt) · Pick-Up-Items · Pick-Up-XP · Rename
- Chunk-load-radius uses a chat-input numeric prompt (same interaction model as
/fpp settingsnumeric fields); type a number or-1to reset to global
BotSettingGui PvP Tab
- PvP category now shows full coming-soon override previews: difficulty, combat-mode, critting, s-tapping, strafing, shielding, speed-buffs, jump-reset, random, gear, defensive-mode
DB Schema v14 → v15
- v14:
fpp_active_botsgainsswim_ai_enabled BOOLEAN DEFAULT 1,chunk_load_radius INT DEFAULT -1 - v15: new
fpp_skin_cachetable (skin name → texture/signature/source/cached_at) with expiry index - Fully backward-compatible — existing rows receive safe defaults on schema upgrade
Config v53 → v60
- v53→v54:
body.drop-items-on-despawn: falseinjected into existing installs - v54→v55: shared global pathfinding tuning keys added
- v55→v56:
nametag-integrationsection added (block-nick-conflicts, bot-isolation) - v56→v57:
nametag-integration.sync-nick-as-renameadded - v58→v59:
skin.mode=player,guaranteed-skin=true,logging.debug.skin=trueenforced for existing installs - v59→v60: removed
skin.fallback-poolandskin.fallback-name(hardcoded in SkinManager)

