Repository navigation
FAQ
A: Paper/Purpur 1.21+ (up to 1.21.11 and the year-based 26.1.x–26.3.x releases) and Folia. FPP has full Folia support with region-threaded bot spawning.
A: No. FPP uses Paper-specific APIs and NMS Mojang-mapped classes.
A: JDK 21+ for both the server and for building from source.
A: Yes, but the server itself must be Paper 1.21+ - ViaVersion only affects the client versions that can connect, not the server's own version. If ViaVersion is installed, bots automatically register themselves with it as running the server's own native protocol version, so Via never treats a bot as an unrecognized connection (no "can't find version" console warnings).
A: The nametag above every bot shows its live activity (idle / moving / mining / fighting /
eating / searching / sneaking …), updated twice a second. The /fpp list GUI shows the same activity per
bot, and the pathfinding particle debug view (per-bot settings → 🧭 ᴘᴀᴛʜꜰɪɴᴅɪɴɢ → ꜱʜᴏᴡ ᴘᴀᴛʜ, or
globally via /fpp settings → 🐛 ᴅᴇʙᴜɢ → ꜱʜᴏᴡ ᴀʟʟ ᴘᴀᴛʜꜱ) renders each bot's route.
A: Yes. Enable debug-chat: true in debug.yml (or via /fpp settings → Debug). All debug output will be sent to online players with fpp.op or fpp.notify as chat messages.
A: By design. Bots are unlisted in the tab by default, subtracted from the server-list ping
count, and removed from its hover sample. They also earn no advancements and send no
join/leave/death/advancement chat messages (bots never produce chat events at all). An admin can enable tab-list.enabled (or the Body toggle in
/fpp settings); bots are then listed only as [Bot] - <botname>. They are never counted as
players in %fpp_online% / %fpp_total% either way.
A: That's body.auto-mount (on by default): vehicles pick bots up the way they pick up
villagers. Turn it off in the config or /fpp settings → Body. A bot only leaves a seat when
deliberately dismounted (/fpp sneak) and a real player boarding a boat always takes the first
(controlling) seat.
A: Same as a real player logging out: if the bot was the only player aboard, the vehicle goes
with it and is re-created, with the bot seated, the next time that bot spawns. If another player
was aboard, the vehicle stays and the bot boards it again when it comes back. Saved in
data/bot-mounts.yml.
A: Fixed in v2.1.0. Bots' vanilla names are hidden with a hand-pushed scoreboard team that could desync from another plugin's team (TAB, LuckPerms prefixes, AFK displays). A per-viewer packet guard now keeps every client's team state consistent.
A: Skins come from the rarity pools in plugins/FakePlayerPlugin/skins/ (main_skin.txt +
1-<N>%.txt files of NameMC URLs). A fresh skin needs one MineSkin signing round-trip (a few
seconds) the first time it's ever used; after that it's cached forever in data/skin-cache.yml.
Enable the skin-pool debug topic to trace the pipeline. To disable skins set
skin.rare-pools: false.
A: By design. The name tag is a real world entity, so anything that can remove an entity can remove it - but a self-heal check runs every 10 ticks and respawns it the moment it's gone. There's no way to make a bot permanently tag-less; the mandatory "ʙᴏᴛ ʙʏ {owner}" disclosure row can't be disabled either.
A: The vanilla over-head name is hidden by putting each bot on a packet-only scoreboard team, and
that is re-applied every few ticks. Since v2.0.6.1 those packets no longer depend on the tab-list
packet setup, which was the most likely reason the hide was skipped. If you still see it, another plugin
may be moving bots onto its own scoreboard team (a player can only be on one team at a time) - enable
debug and look for sendTeam / hideVanillaNameNow / "hide-nametag" lines in the log.
A: Deterministic and name-derived with a recognizable fb07 prefix: bot →
fb070000-0000-0000-0000-000000000001, bot2 → …-000000000002; custom names hash into the low
bits. They can never collide with real accounts.
A: Set spawn-cooldown: 0 in config.yml or grant fpp.bypass.cooldown.
A: The limit is both global (limits.max-bots) and personal (fpp.spawn.limit.N). Check both.
A: No - /fpp spawn intentionally creates exactly one bot per command (auto-named, or
--name <name> for a custom name).
A: Yes, if you hold fpp.spawn (the admin tier) - but you must pass --location <x> <y> <z> <world>, since neither has a location of its own to spawn at by default. fpp.spawn.user (personal
bot limit, ownership, cooldown) needs a real player and isn't usable from console/command blocks.
A: Admins (fpp.spawn) can with /fpp spawn --location <x> <y> <z> <world>, combinable with
--name. User-tier spawns (fpp.spawn.user) always spawn at the sender's own location.
A: One line: /fpp attack <bot> makes it guard its post and hit hostile mobs that come into reach
(an AFK mob farm); /fpp attack <bot> --chase --range 16 hunts them through pathfinding and returns to
its post afterwards. Narrow it with --mobs zombie,skeleton, --priority lowest-health, or use --any;
/fpp attack <bot> --status shows what it is fighting. The same settings live in the bot's 🗡 ᴘᴠᴇ GUI
page and persist across restarts. Hits are real client attacks (crosshair pick, full attack charge, best
weapon auto-equipped), so damage, cooldowns and enchantments are the server's own.
A: Yes - /fpp move <bot> --to <bot|player> follows a target live, and
/fpp move <bot> --coords <x> <y> <z> [world] walks to a fixed point. Both are backed by the
built-in A* pathfinder, which also climbs, swims, opens doors and - when enabled for the bot - parkours,
digs and builds.
A: The pathfinder auto-recalculates when stuck, and abandons a target after a few fruitless
cycles (pathfinding.max-stuck-cycles). Enable the pathfinding debug topic for grep-friendly
event=STUCK/PATH_REJECTED/… console lines explaining exactly what happened. /fpp stop <bot>
cancels everything manually.
A: It looks for blocks the bot could actually see - ones with an exposed face - ranks them by
walking effort, walks there, mines with the real client dig logic, and keeps following the vein as it
opens up. Buried ore is never detected (it is not X-ray); use --scan to see what is visible. It
auto-equips the best tool, skips unreachable blocks, and when the inventory runs low it deposits into the
nearest registered storage (/fpp storage) before resuming. Accepts lists and aliases:
/fpp find bot ores, /fpp find bot oak_log,birch_log.
A: /fpp clear <bot> clears the chunk the bot stands in, layer by layer from the surface down; use
--area x1 y1 z1 x2 y2 z2, --selection (WorldEdit) or --radius n for other shapes, and
--depth n/--bottom y to limit how far down it goes. It runs on its own: it digs inside the region
only, seals water/lava, collects drops, deposits at a registered storage (or --trash junk), recovers
when stuck and builds up with scaffold blocks if it must. Check /fpp clear <bot> --status.
A: Yes - add an action to the spawn command: /fpp spawn --name Guard attack --chase,
/fpp spawn --count 3 --preset guard, /fpp spawn --name Miner clear --chunk then wait 30s attack.
Presets live under spawn-actions.presets.
A: Yes. Starting a new task (move / find / left-click / right-click / attack) no longer
stops the bot's other running tasks, and PVE auto-combat always fights back regardless of what else
the bot is doing. The one real limit is movement: a bot has one body, so only one thing can actually be
walking it around at a time. That's arbitrated by priority instead of by cancelling - an explicit
/fpp move always wins, a manual task's own walk-to-reach outranks background movement (PVE's chase,
an auto-deposit trip), and whichever loses out just waits its turn instead of hijacking the bot mid-walk.
Two hand-actions aimed at two different targets at once will still visibly alternate the bot's aim
between them each tick (one head, one main hand) - that's a real single-body limit, not a bug.
A: Open its settings → 🍖 ᴀᴜᴛᴏ-ᴇᴀᴛ. Toggle ᴀᴜᴛᴏ-ᴇᴀᴛ on, set the ʜᴜɴɢᴇʀ ᴛʜʀᴇꜱʜᴏʟᴅ
(0-19; the bot eats at or below it), and open ᴀʟʟᴏᴡᴇᴅ ꜰᴏᴏᴅꜱ to pick which foods it may eat
(none selected = any food). When hungry the bot prefers food in its off-hand, then hotbar, then
inventory. Eating from the off-hand - the default/preferred source - runs fully in parallel: it
doesn't pause mining, moving, or combat at all, the same way a real player can snack on something in
their off-hand mid-task. Only the main-hand fallback (no off-hand food available) still briefly pauses
hand-actions, since it has to borrow the main hand itself for the eat animation. The global default
threshold is automation.auto-eat-threshold in config.yml.
A: Fixed - the bot now must aim at the button/lever's actual hit box to trigger it, exactly like a real player. Aiming at the block it's mounted on (or a corner of that face) no longer activates the switch.
A: If the target is already in reach it clicks from where it is. If not, it walks to a spot it can reach the target from - preferring your own standing location (since you just aimed at the target from there, it's a provably reachable vantage) before falling back to searching around the target itself.
A: Set economy.enabled: true in config.yml, install Vault (or ExcellentEconomy), and set your
prices under economy.rental.*. Players then use /fpp rent buy <hours> /
/fpp rent extend <bot> <hours>. See Economy for full setup.
A: Yes - FPP talks to Vault's Economy service, which any Vault-compatible plugin (EssentialsX,
CMI, the "Vault2.0" reimplementation, ExcellentEconomy-with-Vault-present, …) registers into. You
don't need the literal Vault.jar specifically as long as something provides that service.
Q: Can I use my own shop plugin (ShopGUIPlus, EconomyShopGUI, …) instead of FPP's built-in charging?
A: Yes - that's exactly what /fpp rent give <player> <bot|--new> <hours> is for. It never
touches an economy plugin itself; point your shop's reward/command action at it and your shop plugin
handles the payment however it already does. economy.enabled doesn't even need to be true for
this path.
A: It despawns through the same safe path as /fpp despawn (inventory/XP saved normally) and the
owner is notified if online. They get a one-time warning economy.rental.warn-minutes-before-expiry
minutes beforehand too.
A: Grant fpp.rent.unlimited - that player's rented bots never expire from time running out,
regardless of what rentalExpiresAt they were given.
A: No. SQLite is local-only. Use MySQL for multi-server setups.
A: Verify credentials, firewall rules, and that the MySQL user has CREATE/ALTER permissions (schema migrations need them).
A:
- Lower
chunk-loading.view-distanceor setmass-disable-thresholdlower (bots then report a smaller render distance; the server's own chunk system does the rest) - Reduce
head-ai.tick-rate - Increase
performance.position-sync-distance(or set to128) - Reduce bot count or spawn in batches
- Use
/fpp perf top//fpp perf reportto measure
A: Check the Build row in the startup banner, hover the creator head at the bottom-left of any menu, or use %fpp_build%. The build ID changes on every build.
A: JDK 21+ and ./gradlew clean shadowJar. The paperweight dev bundle downloads automatically.
A: These directories are .gitignored and may not exist. Only build them if you have the companion source.
A: body.damageable only controls player/entity damage. Fall damage is governed by combat.fall-damage.enabled and is independent. Set combat.fall-damage.enabled: false to disable fall damage entirely.