
Fake Player Plugin (FPP)
Server-side bots that act like real players — pathfind, mine, fight, and auto-eat. For Paper, Purpur & Folia 1.21+
- Загрузки
- 15K
- Подписчики
- 36
- Обновлён
- 6 июля 2026 г.
- Лицензия
- FPP-License
Опубликован 8 марта 2026 г.
FakePlayerPlugin (FPP)
Advanced NPC / Bot plugin for Paper, Purpur, and Folia 1.21+
FPP spawns server-side bot entities that behave like real players — useful for AFK farms, automated tasks, testing, and NPC simulations. It is deliberately not a fake-online-count or player-spoofing tool: bots are hidden from the tab list and server-list ping, always wear a mandatory "ʙᴏᴛ ʙʏ {owner}" nametag, earn no advancements, and can never take a real account's identity.
Features
- 🧭 Real pathfinding engine — Pathetic-backed A* navigation with parkour, block-breaking, bridging, stuck detection with a hard give-up budget, pre-flight path verification, and a Baritone-style particle debug view
- 🗡️ PVE combat — per-bot smart attack with mob-type selection, detect range, target priority, real weapon-cooldown pacing, and pathfinding-linked chasing
- ⛏️ Find automation —
/fpp findsearch → path → mine loops with tool auto-equip, anti-stuck watchdogs, and inventory-aware deposits into registered storages - 🎯 Precise clicking —
/fpp left-click//fpp right-clickaim at the exact point you're looking at, walk to a reachable vantage (preferring your own standing spot) when the target is out of reach, and only trigger a button/lever when actually aimed at its hit box - ⏸️ One action at a time — tasks are mutually exclusive (no multitasking); an interrupt such as auto-eat pauses the current task and resumes it afterward
- 🍗 Auto-eat — per bot: eats from its inventory when hungry (off-hand → hotbar → inventory priority), with a configurable allowed-food list and hunger threshold; pauses the current task, eats, then switches back to what it was holding
- 🎨 Rarity skin pools — bots roll their skin from configurable rarity tiers
(
skins/1-<N>%.txtfiles of NameMC URLs), signed once via MineSkin and cached forever, with slim/classic model auto-detection - 🆔 Readable bot UUIDs — deterministic
fb07…UUIDs with the bot number embedded (bot2→fb070000-…-000000000002); zero collision risk with real accounts - 🏷️ Live nametags — three-row mannequin-style tag with a real-time activity line (idle / moving / mining / fighting / eating / searching / sneaking …)
- 🖥️ Full GUI suite — bot list hub (search, sort, live refresh, spawn & settings shortcuts), per-bot settings (general, PVE, pathfinding, skin, auto-eat, rename, danger), global settings with runtime debug toggles, and a categorized help GUI
- 🫥 Invisible to players — no tab-list entry, no server-list count/sample entry, no advancements, no join/leave/death chat noise
- 💾 Persistence — bots, inventories, XP, and tasks survive restarts (SQLite or MySQL)
- 🌐 Proxy networks — Velocity/BungeeCord support with shared MySQL, cross-server placeholders, and config sync
- ✅ Folia support — full compatibility with Folia's region-threaded architecture
- 📊 Performance tooling —
/fpp perfdashboard, history, benchmark reports, Spark integration
Quick Start
- Drop
fake-player-plugin-<version>-all.jarintoplugins/and restart. - Grant yourself access:
/lp user <you> permission set fpp.admin true /fpp spawn— spawns one auto-named bot (bot,bot2, …) at your location./fpp spawn --name Miner— spawns one custom-named bot./fpp list— the GUI hub: click a bot to manage it, spawn more, or open global settings.
Full documentation lives in the wiki: commands, permissions, configuration, placeholders, database/proxy setup, and FAQ.
Deliberately Removed Capabilities
Several capabilities were intentionally removed from this codebase and should not be reintroduced — pull requests restoring them will be declined. See CONTRIBUTING.md for the full policy and rationale:
- Player spoofing / impersonation — anything that lets a bot pose as a specific real player (real-account UUIDs, premium skin/identity lookups by player name, removing the mandatory bot nametag, showing bots in the tab list or server-list ping)
- Bot chat — bots are fully silent in chat by design
- The runtime extension/addon loader — external code cannot be loaded into FPP; integrate from
a normal Bukkit plugin via the fired
FppBot*events instead - License/DRM checks — the plugin is open source and runs unconditionally
Links
- Discord: https://discord.gg/Q9cd9frzRt
- Modrinth: https://modrinth.com/plugin/fake-player-plugin-(fpp)
- Wiki: frontend/wiki/Home.md
License
MIT — see LICENSE.
Ченджлог
2.0.1Бета26.1.1, 26.1.2, 26.2 · 6 июля 2026 г.
v2.0.1 (Beta)
Changed — Left/Right-Click Are Now Real Clicks (Authentic Serverbound Packets)
The bot left-click and right-click systems no longer re-implement what the server does on a click. Every action is now
dispatched as an authentic serverbound packet through the bot's real packet handler
(FakeServerGamePacketListenerImpl), so the server performs the click exactly as it does for a real player — full
reach/anti-cheat validation, native Bukkit events (BlockBreakEvent, PlayerInteractEvent,
PlayerInteractEntityEvent, …), item durability, hunger, use-timing and every item's own behaviour.
- New
BotClickDispatcherbuilds and dispatchesServerboundPlayerActionPacket(dig),ServerboundAttackPacket,ServerboundInteractPacket,ServerboundUseItemOnPacket,ServerboundUseItemPacketandServerboundSwingPacketthrough the connection's livehandle*methods. It first sends aServerboundPlayerLoadedPacket(what a real client sends) so the server'shasClientLoaded()gate lets bot interactions through. - Left-click mining now sends
START_DESTROY_BLOCKand lets the server drive destroy progress, sendingSTOP_DESTROY_BLOCKon a client-faithful predictor (creative/instant-break complete on the START tick). Removed the hand-rolled progress loop and directgameMode.destroyBlockcalls. - Left-click attacks go through the real attack packet (respecting the attack-strength cooldown), replacing the
performAttack+ forced-attack-ticker hack. - Right-click routes block use, item use and entity interaction through the real handlers, and deletes the
fake shortcuts: directly
setType-ing planted crops from a hardcoded seed→crop table,applyBoneMeal, and the manual place/plant/bonemeal branches. The server'suseItemOnnow handles placement, planting, bone meal, hoeing, bucket use, etc. natively for any item. - Protection plugins (WorldGuard, etc.) now block bot clicks the same way they block real players, since the real events fire.
- 1:1 vanilla click resolution — the bot's clicks now resolve targets exactly like a real client's pick: the
combined block+entity ray from the bot's own eyes, nearest hit wins. Left-click attacks the entity directly under the
crosshair (paced by the real attack-speed attribute) or digs the block; right-click interacts with the entity under
the crosshair (armor-stand equip, feeding, breeding, trading, mounting) and, when that PASSes, falls through to the
in-hand item use — the same order
Minecraft.startUseItemfollows. Removed all non-vanilla targeting: sender-aim entity picks (rayTraceHostileEntity,rayTraceEntity, the right-clickrayTraceTargetPlayerentity branch), the left-click forward-cone auto-attack (findBestMobTarget), and target lock-on. An entity behind the aimed block is never picked; the sender's crosshair only designates which block to work on. - Full debug tracing — new
left-click/left-click-headdebug categories (indebug.yml, plusConfig.debugLeftClick()/debugLeftClickHead()) mirroringright-click. Both systems now log the whole pipeline: target resolution, navigation, every dispatched packet (dig START/STOP/ABORT, attack, useItemOn, useItem, entity interact), consume detection and stop/cleanup.
Fixed — Use Packets Silently Dropped by the Spam Limiter + Aim Drift
Two bugs that made --hold/--repeat clicks stop working after a few seconds:
- Spam-limiter drop —
handleUseItem/handleUseItemOnfeed the packet's Spigot-addedtimestampfield into Paper's incoming-packet spam limiter (checkLimit). Directly-constructed packets leave that field0, which looks like "no time passed since the last packet", so after ~8 uses the server permanently dropped every use packet (eating, placing, doors — everything).BotClickDispatchernow stampsSystem.currentTimeMillis()ontoServerboundUseItemPacket/ServerboundUseItemOnPacket(reflection-probed, no-op if the field ever disappears), so the limiter sees real inter-packet timing exactly as for a networked client. - Aim tracking — the bot's head was rotated once when the command started and could drift off the commanded target
(knockback, entity interactions), leaving it staring at the wrong block forever. Both click loops now re-aim at the
commanded target every tick (new
aimTarget/aimPointin the click state, never overwritten by transient per-tick picks): a passing entity still gets vanilla nearest-hit treatment, and the moment it's gone the crosshair is back on the commanded block.
Fixed — Left-Click Resumes Mining After the Crosshair Leaves an Entity
Block re-resolution in the left-click loop was gated behind a "dynamic target" flag that was false when the click started without a block pick (entity in front of the crosshair, a resumed task after restart, or a plain self-view click) — so once the entity was gone, the bot stopped instead of mining the block now under its crosshair. The loop now re-resolves the block pick unconditionally every tick, matching a real held click: entity in front → attack it; entity gone → seamlessly dig whatever the crosshair sees. The dead flag was removed.
Fixed — Full Weapon Damage & Right-Click Arm Swings
- Attacks now use the held weapon's real damage — bots aren't driven by the normal player tick path, so two things
a real client gets for free never happened: the held weapon's attribute modifiers were never registered
(
ATTACK_DAMAGEstayed at fist level) and the attack-strength ticker never advanced (every hit was scaled to the ~20% spam-click minimum → a sword dealt ~1 damage).BotClickDispatcher.attacknow callsdetectEquipmentUpdates()and primes the attack-strength ticker before each attack; since the click loop already paces attacks at the real weapon cooldown, every hit lands at full strength — sword/axe damage, sweep, knockback and enchantments all apply. - Right-click now swings the arm — the server only broadcasts SERVER-sourced swings; for most interactions the vanilla client swings itself, which a bot has no client to do. The bot now sends its own swing on every consumed right-click (buttons, levers, bone meal, planting, placing, entity interactions) and on instant item uses (throwing pearls/eggs) — but not when a multi-tick use starts (eating, bow draw), matching the vanilla client exactly.
Fixed — Bots No Longer Lose Inventory & Active Task Across Restarts
Two persistence defects made every server restart / plugin update wipe bot inventories and running tasks:
- Inventory/XP restore was a one-shot timer — applied a fixed 10–12 ticks after the restore chain spawned the bot, with a silent give-up if the body hadn't finished spawning yet (typical right after startup while chunks load). Both now use a retry loop (every 5 ticks, up to 30 s) that waits until the bot is online + valid, and log a warning instead of silently dropping if the bot never spawns.
- Task persistence was hollow since the click-system migration — the task snapshot hardcoded every field to
null/0 ("legacy mine/use/place removed") and the restore hook was an empty stub, so the active task was lost by
design. The persistence layer now saves each bot's active left/right-click task (mode + world + exact aim point)
to both the unified YAML and the
fpp_bot_tasksDB table (LEFT_CLICK/RIGHT_CLICKrows), and resumes it after the restart: once the bot is fully spawned and its inventory (tools!) is restored, it re-aims at the saved point and restarts the same click mode via the normal task pipeline. NewSavedClickTasksnapshot +getSavedTask/resumeSavedTaskAPIs on both click commands; the dead 30-field legacy task model was replaced with a compact one.
Fixed — Block Interactions Blocked by the Unconfirmed-Teleport Gate
handleUseItemOn refuses every block interaction while awaitingPositionFromClient is armed — and it gets armed by
any teleport/rotation done through the connection (bot spawn, /fpp tp, action locks, CraftPlayer#setRotation). A
real client confirms teleports instantly; the bot never did, so levers, buttons, bone meal, planting and placement
silently no-oped (the packet fell into the build-limit-message branch). Two-part fix:
BotClickDispatchernow confirms pending teleports like a real client before every interaction packet: if the connection is awaiting a position confirm, it dispatches aServerboundAcceptTeleportationPacketwith the pending id (clears the gate, snaps to the awaited position — the same thing a vanilla client does).refreshAimrotates via NMSabsSnapRotationToinstead ofCraftPlayer#setRotation, which internally performs a connection teleport and would re-arm the gate every tick.
Changed — Vanilla Click Timing & Armor-Stand Parity
- Right-click at vanilla speed — held right-click now acts once per 4 ticks (the vanilla client's
rightClickDelay), instead of every 8: the extra post-action pulse skip was removed. Bone meal, levers, buttons, doors and planting now trigger at real-player pace. - No more eating through armor stands — the vanilla client hardcodes
interactAton a non-marker armor stand as SUCCESS client-side, so a real player's click is always consumed there and never falls through to eating/using the held item. The bot now mirrors that: aiming at an armor stand consumes the right-click even when the server-side equipment swap does nothing. - Held left-click attacks at exact weapon speed — entity attacks are now paced solely by the bot's real attack-speed attribute (swing + attack packet each cycle); the loop's post-break pause no longer stacks on top (previously ≈16 ticks between sword hits instead of 12). Mining keeps its vanilla-like ~4-tick post-break pause.
Added — Minecraft 26.2 Support
Extended the runtime compatibility gate to cover the year-based 26.2.x releases (Minecraft 26.2 "Chaos Cubed").
CompatibilityChecker.isSupportedVersionnow accepts26.2.xalongside26.1.x(old1.x.yremains supported below1.21.12).- The unsupported-version warning banner and wiki version ranges updated to read
up to 1.21.11, and 26.1.x–26.2.x. - Compile-time Paper dev bundle stays on the stable
26.1.2.build.65-stable; 26.2 runs via the existing version-safe NMS reflection.
2.0.0Бета26.1.1, 26.1.2, 26.2 · 5 июля 2026 г.
v2.0.0
Added — Minecraft 26.2 Support
- Added support for Minecraft 26.2.x (Chaos Cubed).
CompatibilityCheckernow supports 26.1.x and 26.2.x, while older versions remain supported up to 1.21.11.- Updated version warnings and documentation.
- Continues compiling against Paper 26.1.2 while remaining compatible with 26.2.
Version 2.0
- Updated plugin version from 1.6.6.12.8 to 2.0.0.
- Moved the Personality API into the core plugin.
Fixed — Right-Click Interaction
- Bots now only activate buttons, levers, and switches when directly aiming at them.
- Clicking the block they are attached to no longer activates them.
Added — Better Out-of-Reach Clicking
- Bots now try to move near the player's position before searching around the target.
- Console and bot-issued commands still use the original behavior.
- Commands still report "no path" if no valid location is found.
Changed — Accurate Clicking
- Bots now click the exact point the player is aiming at instead of the center of the block.
- The aim remains accurate even after moving.
- Falls back to the block-face center if an exact hit point isn't available.
Documentation
- Updated the README, wiki, FAQ, configuration, permissions, placeholders, and other documentation.
- Removed outdated information and references to removed features.
Permissions
- Removed the unused
fpp.farmpermission. - Added missing permissions to the admin wildcard.
- Clarified how per-bot GUI permissions work.
Added — Task Pause & Single-Action System
- Bots can now perform only one task at a time.
- Starting a new task automatically stops the current one.
- Auto-combat pauses during manual tasks and resumes afterward.
- Added a pause/resume system that allows interrupted tasks to continue where they left off.
Overhauled — Auto-Eat
- Replaced the old instant-eat system with a full Auto-Eat Controller.
- Added:
- Per-bot enable/disable toggle.
- Configurable hunger threshold.
- Selectable allowed foods.
- Food priority (off-hand → hotbar → inventory).
- Bots now eat naturally, pause their current task, then resume it afterward.
- Nametags show when a bot is eating.
- Auto-eat settings are saved across restarts.
1.0.0Релиз1.21.9, 1.21.10, 1.21.11 · 8 марта 2026 г.
v1.0.0 (2026-03-08)
- First stable release
- Full permission system with
fpp.user.*,fpp.bot.<num>limit nodes, and LuckPerms support - User-tier commands:
/fpp spawn,/fpp tph,/fpp info(own bots only) - Bot persistence across server restarts (leave on shutdown, rejoin on startup at last position)
- O(1) entity lookup via entity-id index (performance)
- Reflection hot-path caching in
PacketHelper(no per-call method scanning) - Allocation-free
BotChatAIsync loop - Reservoir-sampling name picker (no full candidate list allocation per spawn)
- Config default values aligned with
config.yml; removed deprecatedshowSkin()method - Cleaned
config.yml: removed unusedspawn-count-presets.usersection, fixed all comment inaccuracies
Комментарии
Загружаем…