Description
Gallery
Changelog
Versions

All Versions
+ Add Version
[2.1.0] Fake Player Plugin 2.0 (FPP) 2.1.0
by Janky-Development on Oct 12, 2026
Download
### Fixed
### Changed
### Added
- Network Protocol Error kick** (
Cannot remove from team ...): a per-viewer packet guard keeps scoreboard teams consistent, so TAB/LuckPerms/AFK-display teams can no longer desync a client. - Hot reload** (PlugManX): classes preloaded, shutdown steps isolated, leftover bots purged.
### Changed
- Honest bots:** tab list off by default (
tab-list.enabled; when on, listed only as[Bot] - name, enforced for every viewer); no fabricated ping;%fpp_online%/%fpp_total%count real players only; bots can't take a real account's name. - Name tag:** three separate rows with vanilla-style plates (
nametag.second-line.background-opacity,row-spacing); name#A78BFA, indicator#BAFF4F. Vanilla name can't reappear, and the tag follows a mounted bot without lag.
### Added
- Auto mount** (
body.auto-mount, default on): boats and moving minecarts pick bots up like villagers; bots stay seated; a real player boarding a boat takes the first seat. - Mount memory:** a bot that despawns in a vehicle returns in it (a shared vehicle is re-boarded), like a player logging back in.
- Auto update** (
update-checker.auto-update, default on): Modrinth release is downloaded toplugins/update/, SHA-512 verified, installed on restart.
[2.0.6.1] Fake Player Plugin 2.0 (FPP) 2.0.6.1
by Janky-Development on Oct 12, 2026
Download
### Added - Minecraft 26.3 Support
### Fixed - Vanilla Bot Name Showing Over the Custom Nametag
drew on top of the custom text_display tag. Those packets no longer depend on it.
### Added - Console & Command-Block Spawning
neither has a location of its own to fall back on. User-tier spawns (
a real player: personal bot ownership, the per-player bot limit, and the spawn cooldown all key off
a player's UUID, which console/command-block senders don't have.
CompatibilityChecker.isSupportedVersionnow accepts26.3.xalongside26.1.xand26.2.x. The
up to 1.21.11, and 26.1.x–26.3.x.- Compile-time Paper dev bundle stays on
26.1.2.build.65-stable.
### Fixed - Vanilla Bot Name Showing Over the Custom Nametag
- The team packets that hide a bot's vanilla over-head name were gated on
PacketHelper's unrelated
drew on top of the custom text_display tag. Those packets no longer depend on it.
- Failures while sending the hide-team packets are now written to the debug log, and a failure to
### Added - Console & Command-Block Spawning
/fpp spawncan now be run from the server console and from command blocks, not just in-game -
fpp.spawn) only, and --location <x> <y> <z> <world> is now mandatory for them sinceneither has a location of its own to fall back on. User-tier spawns (
fpp.spawn.user) still requirea real player: personal bot ownership, the per-player bot limit, and the spawn cooldown all key off
a player's UUID, which console/command-block senders don't have.
[2.0.6] Fake Player Plugin 2.0 (FPP) 2.0.6
by Janky-Development on Oct 12, 2026
Download
### Added -
(
coordinates and world names.
### Improved - Left/Right-Click Overhaul
the way a competent player would. Toggle via
on). Reuses the same tool-selection logic
second copy of it.
hand-loop exactly. Bots carrying a shield or food off-hand can now actually use it; previously the
off-hand was never touched by right-click at all.
start a default click. Now always gated on the resolved mode's permission, matching
now rebuilds a fresh aim from the bot's own view and resumes normally, matching
~1000-line copies; the three parallel
/fpp spawn --location- Admins (
fpp.spawn) can now spawn a bot at an arbitrary spot instead of only their own location:
/fpp spawn --location <x> <y> <z> <world>, combinable with --name. User-tier spawns(
fpp.spawn.user) are unaffected and still always spawn at the sender's own location. Tab-completescoordinates and world names.
### Improved - Left/Right-Click Overhaul
- Auto tool-switch**: before mining a block,
/fpp left-clicknow auto-equips the best available
the way a competent player would. Toggle via
left-click.auto-tool-switch in config.yml (defaulton). Reuses the same tool-selection logic
/fpp find's auto-mining already relied on, instead of asecond copy of it.
- Off-hand fallback for right-click**: a bot's right-click now tries the main hand first and, only
hand-loop exactly. Bots carrying a shield or food off-hand can now actually use it; previously the
off-hand was never touched by right-click at all.
- Fixed:** a bare
/fpp right-click <bot>(no--once/--repeat/--holdflag) skipped the
fpp.right-click.stop could stillstart a default click. Now always gated on the resolved mode's permission, matching
left-click.- Fixed:**
/fpp right-click's task-resume path silently did nothing if its cached aim state was
now rebuilds a fresh aim from the bot's own view and resumes normally, matching
left-click.- Internal:
LeftClickCommand/RightClickCommandnow share one base class for aim geometry,
~1000-line copies; the three parallel
ONCE/REPEAT/HOLD/STOP mode enums collapsed into one.
[2.0.5] Fake Player Plugin (FPP) 2.0.5
by Janky-Development on Oct 12, 2026
Download
### Added — Bot Auth System
Bots can now play along with a login-wall plugin instead of sitting there unauthenticated. Off by
default (
config.yml or logs), then sends
delay. Every later join sends
CrazyLogin, and xAuth. Commands are replayed exactly like a real client's typed chat command
(through
event directly (most login plugins, including nLogin) still see the attempt.
nLogin isn't installed.
exactly like a real not-yet-authenticated player;
so an unrecognized response never leaves a bot stuck frozen.
### Added — "Bot Console" Color Theme
Every chat message, GUI, and console log now pulls from one consistent violet/lime palette instead
of the scattered ad-hoc colors (blue accents, plain named colors, mismatched grays) used previously.
Purely visual — no config or permission changes.
and dividers.
### Added — Auth & Perf Settings/Help Categories
self-profiler, with changes restarting the monitor live instead of requiring
Bots can now play along with a login-wall plugin instead of sitting there unauthenticated. Off by
default (
auth.enabled: false); needs database.enabled: true to remember passwords across joins.- Auto-register / auto-login**: on a bot's first join it generates a strong random password,
auth.key in the plugin data folder, never inconfig.yml or logs), then sends
auth.register-command as the bot after a randomized human-likedelay. Every later join sends
auth.login-command with the same remembered password instead.- Works against any login plugin** built around a
/register <password> <password>/
/login <password> command shape — the defaults already match nLogin, AuthMe, LoginSecurity,CrazyLogin, and xAuth. Commands are replayed exactly like a real client's typed chat command
(through
PlayerCommandPreprocessEvent), not a bare command dispatch, so plugins that hook thatevent directly (most login plugins, including nLogin) still see the attempt.
- Dedicated nLogin integration**: nLogin's command path throws for a bot's connection no matter
nLogin isn't installed.
- A bot stands still and doesn't turn its head** from the moment it joins until its register/login
exactly like a real not-yet-authenticated player;
auth.pending-timeout-ticks is the hard fallbackso an unrecognized response never leaves a bot stuck frozen.
- New
/fpp authcommand**:on/off,status [bot],reset <bot>,setpassword <bot> <password>.
fpp.auth (default op, included in fpp.op).- New settings GUI category** (
🔐 ᴀᴜᴛʜ): toggle, register/login command templates, delay/timeout
### Added — "Bot Console" Color Theme
Every chat message, GUI, and console log now pulls from one consistent violet/lime palette instead
of the scattered ad-hoc colors (blue accents, plain named colors, mismatched grays) used previously.
Purely visual — no config or permission changes.
- Chat/GUI text: violet (
#A78BFA) primary accent, lime (#BAFF4F) success/highlight, red
#FF6A5C) errors, plus a consistent ink/mute/mute-2/line neutral scale for body text, captions,and dividers.
- Console output (
FppLogger, the startup/shutdown banners) recolored to match with true-color ANSI. language/en.yml's header now documents the full palette for anyone customizing messages by hand.
### Added — Auth & Perf Settings/Help Categories
- The settings GUI (
/fpp settings) gained a **🔐 ᴀᴜᴛʜ** and a **📈 ᴘᴇʀꜰ** category (general, body,
performance.* config option, including theself-profiler, with changes restarting the monitor live instead of requiring
/fpp reload.- The help GUI (
/fpp help) splitauthandperfout of the catch-all **ᴄᴏʀᴇ** category into their
[2.0.4] Fake Player Plugin (FPP) 2.0.4
by Janky-Development on Oct 12, 2026
Download
### Added — Multitasking (Reverses the v2.0.0 Single-Action System)
Bots can now run multiple tasks at once instead of being limited to one. Starting a new task no
longer cancels every other running task for that bot —
simultaneously, the same way
(
movement never interrupts anything. A request that loses out declines gracefully instead of
hijacking the bot mid-walk.
### Added — Configurable Left/Right-Click Interval
The pacing of held
longer a fixed constant — it's a server-wide default that every bot can individually override.
paced solely by the held weapon's real attack-speed cooldown, exactly like a real player.
### Fixed — Dead
Removed
from the old
versions ago. They were still being silently granted through
having their own permission declaration, and nothing in the codebase checked them. A full audit
confirmed every other permission in
dangling wildcard references.
### Added — Bot Rental Economy
Players can now pay real economy currency to rent a bot for a set number of hours; the bot
auto-despawns the moment its paid time runs out. Off by default (
with zero compile-time dependency on any of them.
### Hardened — Vanilla Nametag Hiding Now Self-Heals Unconditionally
The bot's real name is hidden via a packet-only scoreboard team, but anything that puts a bot on a
for every active bot unconditionally, instead of only when the activity label changed — the hide
no longer lapses for more than one sweep interval, regardless of cause.
Bots can now run multiple tasks at once instead of being limited to one. Starting a new task no
longer cancels every other running task for that bot —
move, find, left-click, right-click,attack, and PVE auto-combat are now independent systems that can all be active on the same botsimultaneously, the same way
auto-eat already ran alongside a paused task.- PVE always runs.** Auto-combat no longer stands down while a manual task is active; it only
- Movement is arbitrated by priority, not cancellation.** Only one navigation can drive the bot
/fpp move always gets it, a manual hand-action's short walk-to-reach(
left-click/right-click/find) outranks background movement (PVE's chase), and backgroundmovement never interrupts anything. A request that loses out declines gracefully instead of
hijacking the bot mid-walk.
/fpp findno longer collides with/fpp left-click** — each now has its own navigation owner.- Auto-eat is fully parallel when eating from the off-hand** — mining, moving, and combat all
- Restart persistence now resumes both click tasks** if a bot had
left-clickandright-click
- Every command's cleanup is now scoped to what it actually owns**, so stopping one task can no
- What this doesn't change:** a bot still has one head and one main hand — two hand-actions aimed
### Added — Configurable Left/Right-Click Interval
The pacing of held
/fpp left-click//fpp right-click automation (--repeat/--hold) is nolonger a fixed constant — it's a server-wide default that every bot can individually override.
- New config options**:
left-click.interval-ticks(default4, matches vanilla's own block
destroyDelay) and right-click.interval-ticks (default 4, matches the vanilla client's ownrightClickDelay) in config.yml. Entity attacks are unaffected either way — those are stillpaced solely by the held weapon's real attack-speed cooldown, exactly like a real player.
- Per-bot override**: each bot's
⚙ ɢᴇɴᴇʀᴀʟsettings category now has **ʟᴇꜰᴛ-ᴄʟɪᴄᴋ ɪɴᴛᴇʀᴠᴀʟ** and - ʀɪɢʜᴛ-ᴄʟɪᴄᴋ ɪɴᴛᴇʀᴠᴀʟ** tiles (1–40 ticks); leaving a bot on the global default requires no
- No new permission node — gated by the existing
fpp.settingsbot-ownership model, same as
chunk-load-radius and the PVE range tile.### Fixed — Dead
fpp.mine.* Permission NodesRemoved
fpp.mine, fpp.mine.start, fpp.mine.once, fpp.mine.stop, fpp.mine.area — leftoversfrom the old
/fpp mine command that was replaced by /fpp left-click//fpp right-click severalversions ago. They were still being silently granted through
fpp.op's children list without everhaving their own permission declaration, and nothing in the codebase checked them. A full audit
confirmed every other permission in
Perm.java now has exactly one plugin.yml declaration with nodangling wildcard references.
### Added — Bot Rental Economy
Players can now pay real economy currency to rent a bot for a set number of hours; the bot
auto-despawns the moment its paid time runs out. Off by default (
economy.enabled: false).- New
/fpp rentcommand family**:buy <hours>,extend <bot> <hours>,info [bot],
give <player> <bot|--new> <hours> (grant hours without charging — console-usable), clear <bot>.- Provider-agnostic economy layer**: reflective, soft-dependency support for **Vault**,
- [Vault2.0](https://github.com/shalom25/Vault2.0)** (same
Economyinterface, transparently
with zero compile-time dependency on any of them.
- Shop-plugin friendly**:
/fpp rent givenever touches an economy plugin itself — any shop
- Expiry sweep**: warns the owner before time runs out, then despawns safely at zero.
fpp.rent.unlimited exempts a player's bots from expiring.- Settings GUI tile** (
⚙ ɢᴇɴᴇʀᴀʟ→ ʀᴇɴᴛᴀʟ ᴛɪᴍᴇ) and new placeholders%fpp_rental_count%,
%fpp_rental_remaining%. Persists across restarts (YAML + DB, schema bumped to v26).- New permissions**:
fpp.rent/fpp.rent.info(infpp.use),fpp.rent.give,
fpp.rent.unlimited (both default op). New wiki page: [Economy](Economy).### Hardened — Vanilla Nametag Hiding Now Self-Heals Unconditionally
The bot's real name is hidden via a packet-only scoreboard team, but anything that puts a bot on a
- different* team (another plugin, an admin's
/scoreboard teams join, …) silently evicts it,
for every active bot unconditionally, instead of only when the activity label changed — the hide
no longer lapses for more than one sweep interval, regardless of cause.
[2.0.3] Fake Player Plugin (FPP) 2.0.3
by Janky-Development on Oct 12, 2026
Download
## v2.0.3 (Beta)
### Fixed — Left-Click Mining Could Get a Bot Kicked ("Invalid Entity Attacked")
arrow** floating near the block it was breaking and sending an attack packet at it. The vanilla server
disconnects any client that attacks one of those
(
with left-click, so this path only existed because a bot drives raw packets directly. The crosshair
ray trace in
attack targets, matching what
### Fixed — Bot Nametag Could Be Permanently Lost
loop only checked whether its cached reference was
so an externally-removed tag never came back. It now checks
half a second (10 ticks) of it disappearing, making the tag effectively unremovable instead of merely
"usually present."
### Added — ViaVersion-Aware Bot Connections
console warnings about not being able to determine a bot's client version. Bots are now registered
with Via's connection manager as running the **server's own native protocol version** (i.e. "no
translation needed"), using the same
own channel initializer uses for a real connection, and unregistered again on despawn. Entirely
reflective and a no-op if ViaVersion isn't installed or its internals ever change shape.
### Fixed — Left-Click Mining Could Get a Bot Kicked ("Invalid Entity Attacked")
- While mining, a held left-click resolves its target with the same combined block+entity ray a real
arrow** floating near the block it was breaking and sending an attack packet at it. The vanilla server
disconnects any client that attacks one of those
(
multiplayer.disconnect.invalid_entity_attacked) — a real client's own UI never lets you target themwith left-click, so this path only existed because a bot drives raw packets directly. The crosshair
ray trace in
LeftClickCommand now excludes Item, ExperienceOrb, and AbstractArrow from validattack targets, matching what
AttackCommand's ray trace (via Entity#isAttackable()) already did.### Fixed — Bot Nametag Could Be Permanently Lost
- The bot's floating name tag is a real world entity (a
TextDisplay), so anything capable of removing
/kill, WorldEdit, another plugin's cleanup pass — could remove it. The periodic refreshloop only checked whether its cached reference was
null, not whether the entity was still *valid*,so an externally-removed tag never came back. It now checks
isValid() and respawns the tag withinhalf a second (10 ticks) of it disappearing, making the tag effectively unremovable instead of merely
"usually present."
### Added — ViaVersion-Aware Bot Connections
- A bot's connection never performs a real handshake/login, so ViaVersion (when installed) had no
console warnings about not being able to determine a bot's client version. Bots are now registered
with Via's connection manager as running the **server's own native protocol version** (i.e. "no
translation needed"), using the same
UserConnectionImpl + ProtocolPipelineImpl construction Via'sown channel initializer uses for a real connection, and unregistered again on despawn. Entirely
reflective and a no-op if ViaVersion isn't installed or its internals ever change shape.
[2.0.2] Fake Player Plugin (FPP) 2.0.2
by Janky-Development on Oct 12, 2026
Download
## v2.0.2 (Beta)
### Fixed — Permissions No Longer Bypass LuckPerms
explicitly denied the relevant
LuckPerms grants/denies are always respected, operators included.
fine-grained nodes were ever checked.
### Fixed — Folia Compatibility
of running on the global region thread.
hiding the vanilla name no longer touches
directly from NMS and its
("Network Protocol Error"). The plugin now only sends a removal for a name it actually tracked as hidden.
directly instead of scheduling it — safe, since Folia halts all region ticking before
on Paper.
### Changed —
### Performance
scales linearly with bot count, so the win grows with server size.
### Fixed — Permissions No Longer Bypass LuckPerms
- Removed the hard-coded
player.isOp()shortcuts (Perm.hasOrOp,BotAccess.isAdmin,BotListGui.isAdmin,
BotSettingGui.isOp) that granted admin access to server operators even when a permissions plugin like LuckPermsexplicitly denied the relevant
fpp.* node. Every permission check now goes through hasPermission() only, soLuckPerms grants/denies are always respected, operators included.
- Fixed
canUse()gates that were stricter than the granular permission nodes they were meant to allow — players
fpp.left-click.once/.stop, fpp.right-click.once/.stop, fpp.despawn.own,fpp.move.to/.coords, or fpp.inventory.own were previously blocked at the command dispatcher before thosefine-grained nodes were ever checked.
- Added the missing
fpp.inventory.ownpermission constant and wired it into the/fpp inventorycommand and the
plugin.yml but had no effect at all.### Fixed — Folia Compatibility
- Fixed a
TickThreadcrash ("Accessing entity state off owning region's thread") when refreshing a bot's floating
of running on the global region thread.
- Fixed bots showing their vanilla over-head name doubled up with the custom name-tag display on Folia. Folia's
hiding the vanilla name no longer touches
Bukkit.getScoreboardManager()/Team at all — a PlayerTeam is builtdirectly from NMS and its
ClientboundSetPlayerTeamPackets are sent straight down each viewer's connection.- Fixed a client-crashing bug in that same rework: sending a "remove from team" packet for a bot whose name had never
("Network Protocol Error"). The plugin now only sends a removal for a name it actually tracked as hidden.
- Fixed
onDisable()crashing on Folia withIllegalPluginAccessException("Plugin attempted to register task while
FppScheduler now detects a disabled plugin and runs the workdirectly instead of scheduling it — safe, since Folia halts all region ticking before
onDisable() runs.- Fixed Head-AI being hard-disabled on Folia entirely. The restriction predated the current per-bot region-thread
on Paper.
### Changed —
/fpp spawn Is Now In-Game Only/fpp spawncan no longer be run from the server console (or dispatched as console) — it requires a real player
- Removed world/coordinate targeting (
/fpp spawn <world> [x y z]) — a bot always spawns at the commanding player's
fpp.spawn.coords permission node is gone along with it.### Performance
- Removed reflective
Method.invoke()calls from every hot per-tick NMS path inNmsPlayerSpawner(doTick(),
getHandle(), and everything built on it — setJumping, setHeadYaw, setMovementForward,setMovementStrafe, applyServerVelocity, and more) in favor of direct calls. ServerPlayer.tickPhysics()'sdoTick() invocation alone accounted for ~69% of the plugin's own profiled self-time in benchmark reports; thisscales linearly with bot count, so the win grows with server size.
[2.0.1] Fake Player Plugin (FPP) 2.0.1
by Janky-Development on Oct 12, 2026
Download
## 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
(
reach/anti-cheat validation, native Bukkit events (
through the connection's live
sends) so the server's
hand-rolled progress loop and direct
place/plant/bonemeal branches. The server's
etc. natively for any item.
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
entity picks (
left-click forward-cone auto-attack (
never picked; the sender's crosshair only designates which block to work on.
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
like "no time passed since the last packet", so after ~8 uses the server **permanently dropped every use packet**
(eating, placing, doors — everything).
the limiter sees real inter-packet timing exactly as for a networked client.
commanded target every tick** (new
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
(
~20% spam-click minimum → a sword dealt ~1 damage).
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 (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:
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.
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
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. New
compact one.
### Fixed — Block Interactions Blocked by the Unconfirmed-Teleport Gate
any teleport/rotation done through the connection (bot spawn,
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:
(clears the gate, snaps to the awaited position — the same thing a vanilla client does).
### Changed — Vanilla Click Timing & Armor-Stand Parity
doors and planting now trigger at real-player pace.
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.
(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
### 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 — fullreach/anti-cheat validation, native Bukkit events (
BlockBreakEvent, PlayerInteractEvent,PlayerInteractEntityEvent, …), item durability, hunger, use-timing and every item's own behaviour.- New
BotClickDispatcher** builds and dispatchesServerboundPlayerActionPacket(dig),ServerboundAttackPacket,
ServerboundInteractPacket, ServerboundUseItemOnPacket, ServerboundUseItemPacket and ServerboundSwingPacketthrough the connection's live
handle* methods. It first sends a ServerboundPlayerLoadedPacket (what a real clientsends) so the server's
hasClientLoaded() gate lets bot interactions through.- Left-click mining** now sends
START_DESTROY_BLOCKand lets the server drive destroy progress, sending
STOP_DESTROY_BLOCK on a client-faithful predictor (creative/instant-break complete on the START tick). Removed thehand-rolled progress loop and direct
gameMode.destroyBlock calls.- 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
setType-ing planted crops from a hardcoded seed→crop table, applyBoneMeal, and the manualplace/plant/bonemeal branches. The server's
useItemOn now 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
- 1:1 vanilla click resolution** — the bot's clicks now resolve targets exactly like a real client's pick: 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.startUseItem follows. Removed all non-vanilla targeting: sender-aimentity picks (
rayTraceHostileEntity, rayTraceEntity, the right-click rayTraceTargetPlayer entity branch), theleft-click forward-cone auto-attack (
findBestMobTarget), and target lock-on. An entity behind the aimed block isnever picked; the sender's crosshair only designates which block to work on.
- Full debug tracing** — new
left-click/left-click-headdebug categories (indebug.yml, plus
Config.debugLeftClick()/debugLeftClickHead()) mirroring right-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
checkLimit). Directly-constructed packets leave that field 0, which lookslike "no time passed since the last packet", so after ~8 uses the server **permanently dropped every use packet**
(eating, placing, doors — everything).
BotClickDispatcher now stamps System.currentTimeMillis() ontoServerboundUseItemPacket/ServerboundUseItemOnPacket (reflection-probed, no-op if the field ever disappears), sothe 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
commanded target every tick** (new
aimTarget/aimPoint in the click state, never overwritten by transient per-tickpicks): 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
(
ATTACK_DAMAGE stayed 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.attack now calls detectEquipmentUpdates()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
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,
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
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_tasks DB table (LEFT_CLICK/RIGHT_CLICK rows), and resumes it after therestart: 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. New
SavedClickTask snapshot +getSavedTask/resumeSavedTask APIs on both click commands; the dead 30-field legacy task model was replaced with acompact one.
### Fixed — Block Interactions Blocked by the Unconfirmed-Teleport Gate
handleUseItemOn refuses **every** block interaction while awaitingPositionFromClient is armed — and it gets armed byany teleport/rotation done through the connection (bot spawn,
/fpp tp, action locks, CraftPlayer#setRotation). Areal 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
ServerboundAcceptTeleportationPacket with 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
### 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
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
(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] Fake Player Plugin (FPP) 2.0.0
by Janky-Development on Oct 12, 2026
Download
# v2.0.0
## Added — Minecraft 26.2 Support
## Version 2.0
## Fixed — Right-Click Interaction
## Added — Better Out-of-Reach Clicking
## Changed — Accurate Clicking
## Documentation
## Permissions
## Added — Task Pause & Single-Action System
## Overhauled — Auto-Eat
## 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] Fake Player Plugin (FPP) 1.0.0
by Janky-Development on Oct 12, 2026
Download
### 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