Better Spoofer v2.2
Advanced Fake Player Spoofing for Paper 1.21+
Version 2.2.0
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
What's new β 10 Fixes Β· 4 Improvements
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Fixes
β The server no longer freezes for a moment
- On servers with the LuckPerms permissions plugin, adding fake players (especially a whole batch at once, or on startup) used to stall the server for a second or two. That freeze is gone.
β Webhook messages are no longer lost
- If fake players were added and then removed close together, only the "added" message used to arrive and the "removed" one was silently dropped. Now both always show up - just spaced out a little so Discord does not rate-limit you.
β Fake players no longer disappear after a restart
- On servers where real fake players are turned off, or on server versions the plugin cannot fully support, your fake players used to silently vanish after a restart. What you set up is now kept the way you set it up.
β Fake players can't get "stuck" anymore
- If the server ever struggles to remove a fake player, the plugin now keeps trying instead of leaving it stuck forever and counting it as online. Your numbers stay honest.
β Wrong version? The plugin now tells you clearly
- If the plugin jar does not match your server version (for example the regular jar on a Minecraft 26 server), you will see a clear message in the console, and the plugin keeps working safely with simple fake players instead of failing silently over and over.
β "Remove all fake players" really removes everything now
- Before, fake players that were still being added in the background could pop back up a second later. Not anymore.
β Adding many fake players at once no longer loses the last few
- On servers with WorldGuard, freshly added fake players were sometimes mistaken for "ghosts" and cleaned up too early. Now they all stay.
β Reloading the plugin no longer leaves things half-done
- No more leftover half-added fake players that made your counts look wrong.
β Fake players no longer show up from way across the map
- The in-world distance setting is now respected - fake players only appear to players within the range you set, instead of being sent to everyone in the render distance.
β Holograms can now show through walls
- Text above fake players is no longer hidden behind blocks - it renders as intended.
Improvements
β A safety limit for fake players
- A new option in the config (scheduler.max-fakes) lets you cap how many fake players can exist at once. A typo like a huge scheduler override can no longer bring your server to its knees.
β Your language files update themselves too
- New message texts are added automatically when you update the plugin (just like the config already did). Your translations are kept, and a backup is saved - no more weird key names like "add-bulk-done" showing up in chat.
β A broken config can't sneak by
- If your config.yml is damaged, the plugin now says so clearly and stops safely, instead of quietly running with default settings. Your old config is kept as a backup.
β The GUI asks before wiping everything
- The "Remove all fakes" button in the GUI now needs a second click to confirm, just like the command - a misclick can no longer delete your whole fake population.
Upgrading from 2.1.0
- Stop the server, swap the jar, start it back up. That is it.
- Your config stays as it is. The new option is added for you on first start (a backup is saved as config.yml.bak).
- On Minecraft 26.1 or 26.2 use the special 26.x build of the plugin. It needs the 26.x version of PacketEvents installed.
More versions. More stable. Same easy plugin.
Β
Version 2.1.0
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Compatibility β 1 Critical Fix Β· 6 Improvements
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Critical Fix
β Fake players finally stop where they should
- Before, the number of fake players kept bouncing around and never really settled - it could even climb far past the highest point you set in the curve. Now the daily target is calm and steady: fake players are added or removed gently, and the count stays right where your curve says it should be.
Improvements
β Smoother changes through the day
- Fake players now come and go gradually instead of all at once. The change feels natural, and your server is not hit with a sudden wave of joins or leaves.
β No more sudden jump at midnight
- The day is now treated like a loop: the count flows smoothly from the evening into the next morning, instead of snapping to a different number right at 00:00.
β Fake players leave when the curve says so
- Previously, fake players could get "stuck" for a few minutes even when the curve wanted fewer of them. Now the scheduler has its own setting for this (off by default), so the count follows your curve on the way down too.
β A small mistake in the curve can no longer break things
- If two points in the curve had the same hour, the plugin could get confused. These mistakes are now fixed on their own when the plugin starts, and the console lets you know.
β An easy way to watch the scheduler work
- You can turn on a simple log in the config that shows what the scheduler is doing all day long - handy when you just want to check that everything looks right.
β Your config updates itself
- When you update the plugin, the new options are added to your config.yml on their own. Everything you already set stays exactly the same, and a backup of the old config is saved just in case. No more hunting for new settings.
Upgrading from 2.0.0
- Stop the server, swap the jar, start it back up. That is it.
- Your config stays as it is. The new options are added for you on first start (a backup is saved as config.yml.bak).
- On Minecraft 26.1 or 26.2 use the special 26.x build of the plugin. It needs the 26.x version of PacketEvents installed.
More versions. More stable. Same easy plugin.
Β
Version 2.0.0
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Compatibility β 2 Fixes
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Fixes
β Real fakes no longer time out and get re-spawned in a loop
- Fakes never answer keepalive challenges, so the server timed them out after ~30 s - on some versions that disconnect bypasses PlayerKickEvent, dropping the fake while it stays in the registry, which the ghost-cleanup then removed and the scheduler re-added: constant "fake players joining" forever. The fake's packet listener now clears the keepalive-pending flag every tick, so fakes stay put and only join when the daily curve actually changes.
β Despawn now starts with PlayerList#remove
- Building on the 1.9 despawn verification, removal now begins with PlayerList#remove (via reflection) instead of the kick - the kick is a silent no-op on some versions (notably the unverified 26.x placeholder support), so starting with the real removal avoids the extra kick/fail cycle and guarantees fakes actually leave the player list and world.
Upgrading from 1.9.0
- Stop the server, swap the jar, start it back up. That is it.
- Your config files stay the same. Nothing is reset.
- On Minecraft 26.1 or 26.2 use the special 26.x build of the plugin. It needs the 26.x version of PacketEvents installed.
More versions. More stable. Same easy plugin.
Β
Version 1.9.0
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Compatibility β 1 Critical Fix β 1 Improvement
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Fixes
β Real fake players are now actually removed - no more endless joining / growing counts
- Fixed the "fake players keep entering the server and never leave" report. On some versions (notably the unverified 26.2 placeholder support) the despawn kick was a silent no-op: the fake was removed from the plugin's registry but its ServerPlayer stayed in the world forever. The daily scheduler then kept re-adding to reach its target, so the online count climbed without bound while old fakes accumulated.
- Despawn now VERIFIES the fake actually left and escalates if not: PlayerList#remove (via reflection - the signature changed in 1.21.11), a direct connection.disconnect, and one more kick. If a fake is still online after all of that, the plugin logs a loud warning instead of silently accumulating ghosts.
Improvements
β Safe path on 26.x: scheduler phantom-fallback
- Real (NMS) fake support on 26.2 was previously a placeholder and is now proven fragile - spawn works, but some server internals changed. If you still see fakes accumulate on 26.x after this update, set nms.real-fakes-enabled: false: with scheduler.phantom-fallback (default on, added in 1.8) the daily curve automatically drives packet-only phantoms instead, which are cleanly despawned and never accumulate.
Upgrading from 1.8.0
- Stop the server, swap the jar, start it back up. That is it.
- Your config files stay the same. Nothing is reset.
- On Minecraft 26.1 or 26.2 use the special 26.x build of the plugin. It needs the 26.x version of PacketEvents installed.
- This release builds on the 1.8.0 changes (scheduler overshoot fix, GUI/command QOL, ghost cleanup, scheduler override & status, holograms for real fakes, etc.) - see CHANGELOG-v1.8.md for the full list.
More versions. More stable. Same easy plugin.
Β
Version 1.8.0
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Compatibility β 8 Fixes β 6 Improvements
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Fixes
β Daily scheduler no longer overshoots the curve target
- Fixed fake counts climbing far past the configured curve (e.g. 150+ with a max of 78) on WorldGuard servers and on fast tick intervals. The scheduler counted only already-registered fakes while spawns were still queued/paced, so it kept adding past the target and every queued fake later appeared at once. It now counts committed (registered + in-flight) fakes, so it stops exactly at the target.
β Skin changes on real fakes no longer burst WorldGuard
- /spoofer skin on a real (NMS) fake re-spawned it with a raw, unstaggered PlayerJoinEvent - the exact "Could not pass event PlayerJoinEvent to WorldGuard / RejectedExecutionException" overflow the 1.7.0 pacing already fixed for the scheduler. Skin changes now go through the same paced, retried spawn path, and a fake that cannot be re-spawned is cleaned up instead of being left half-registered.
β Management GUI no longer leaks click listeners
- Closing the per-fake detail view (Remove / Move / Chat buttons) left the GUI's inventory listener registered until the player quit or reopened the GUI. Each open/close now fully cleans up its listener and tracking entry.
β Holograms now appear above real (NMS) fake players
- Previously only phantom (packet) fakes got holograms; real fakes silently had none even though entities.holograms-enabled is on. Real fakes now get the same configured lines, they follow the fake as it walks/teleports, and they are removed together with the fake.
β Sort-team no longer keeps stale entries for removed real fakes
- Removing a real fake left its name in the ~bsFakes scoreboard team for the whole server session (a real player later taking that name would be sorted after fakes). Real fakes now clean up their team entry on removal and on plugin disable.
β Expired fakes are cleaned up even with scheduler AND join-leave off
- The max-stay cleanup only ran when join-leave was enabled; with both features disabled an expired fake could linger forever. The cleanup now runs whenever a max-stay is configured.
β Wandering no longer teleports fakes that did not move
- The 5-second wander tick fired a teleport (and PlayerTeleportEvent / anti-cheat noise) even when a fake had no displacement. It now skips the teleport when nothing changed.
β Restore-on-startup no longer wastes Mojang/Mineskin API calls
- Fakes restored without a stored skin previously queried the configured skin source with a random fake name (always 404 to Steve). Legacy restores now resolve from the built-in pool - offline and instant.
Improvements
β /spoofer add reports the real result
- The success message no longer appears the instant the spawn is merely queued - it now fires when the fake is actually spawned, and a failed spawn (after retries) tells you exactly what happened.
β Faster skin loading for network skin sources
- The skin executor was doubled from 2 to 4 threads, so MOJANG/MINESKIN lookups during large scheduler ramps no longer serialize into multi-minute spawns.
β Clearer webhook misconfiguration warning
- Enabling the webhook with an empty URL used to silently drop every event; the plugin now warns on startup and reload.
β Bulk-add, scheduler status, pagination and more
- /spoofer add --count N bulk-adds N fakes (names auto-generated, pacing respected).
- /spoofer scheduler status shows enabled/paused, timezone, current hour, target, committed and registered counts, tick/jitter/gradual.
- /spoofer list [page] is paginated; /spoofer info now also shows fake type (real/phantom) and world + x/y/z.
- /spoofer remove --all now requires an explicit --confirm so it can never wipe all fakes by accident.
- New placeholders: betterspoofer_scheduler_enabled, betterspoofer_online, betterspoofer_phantom_count.
β More hardening
- Real-fake animations/head-look now respect permissions.viewer-permission.
- Malformed lines in lang files can no longer crash a command (safe text fallback).
- Ping count/max values are clamped to non-negative; join-leave min/max-stay are validated.
- Clear warnings when chat/name pools are empty, or a webhook is enabled with an empty URL, and a helpful error for a trailing --skin.
- Scheduler hysteresis stops the jittered target from spawning/removing a fake every tick (less join/leave + webhook churn).
- Removed the dead despawnAt field; the plugin config reference is now volatile (safe concurrent reads after reload); fixed a malformed Javadoc.
β Scheduler everywhere + override + dashboard
- scheduler.phantom-fallback (default on): when real NMS fakes are unavailable/disabled the daily curve now drives packet-only phantoms, so the scheduler works on every server instead of doing nothing.
- /spoofer scheduler override - temporary fixed target (events/maintenance) with jitter disabled; /spoofer status shows it too.
- /spoofer status - one-command dashboard (TAB/ping/MOTD/entities/chat/join-leave/scheduler/webhook + live counts).
- Ghost-fake cleanup: real fakes whose ServerPlayer vanished (world unload, third-party despawn) are auto-removed every 60 s so counts never lie.
- Type-filtered removal: /spoofer remove --real / --phantom / --all --real/--phantom (still requires --confirm).
- GUI: Add 5 fakes button and the fake's location shown on each head; /spoofer reload re-registers PlaceholderAPI and re-prints the WorldGuard notice.
Upgrading from 1.7.0
- Stop the server, swap the jar, start it back up. That is it.
- Your config files stay the same. Nothing is reset.
- New optional scheduler.phantom-fallback (default on) - existing configs keep working unchanged; add it to config.yml only if you want to tweak it.
- On Minecraft 26.1 or 26.2 use the special 26.x build of the plugin. It needs the 26.x version of PacketEvents installed.
More versions. More stable. Same easy plugin.
Β
Version 1.7.0
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Compatibility β 1 Fix β 1 Improvement
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Fixes
β Real fakes no longer overload WorldGuard and crash the server
- Fixed "Could not pass event PlayerJoinEvent to WorldGuard / RejectedExecutionException". WorldGuard's join handler has no NPC check and submits work to a tiny single-threaded executor; restoring many real fakes at once (or spawning on a busy server) overflowed it, which on some Paper forks (e.g. AdvancedSlimePaper) kept memory climbing and crashed the server. Real fakes are now spawned slowly and retried with backoff so WorldGuard's executor can keep up.
Improvements
β Automatic safe pace for real fakes on WorldGuard servers
- When WorldGuard is loaded, the plugin now automatically spaces real fake spawns at least 2 seconds apart and waits 5 seconds after startup before the first one, and retries a failed spawn up to 3 times before giving up. No config change needed - nms.spawn-stagger-ticks still works and acts as the minimum gap.
- On startup you will see a short notice explaining that real fakes are being paced for WorldGuard, and what to do if you still see the error on a very busy server.
Upgrading from 1.6.0
- Stop the server, swap the jar, start it back up. That is it.
- Your config files stay the same. Nothing is reset.
- On Minecraft 26.1 or 26.2 use the special 26.x build of the plugin. It needs the 26.x version of PacketEvents installed.
More versions. More stable. Same easy plugin.
Β
Version 1.4.0
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
More Versions β 2 Fixes β 4 Improvements
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Fixes
β Real fake players now work on every supported version
- Before, real fake players (the ones that walk around in the world) only worked on one Minecraft version. On other versions they could only be seen in the player list. Now they work on all supported versions.
β Adding a fake player now explains why it failed
- If /spoofer add cannot add a fake player, you now get a clear reason in your language (English or Polish) instead of a strange English error.
Improvements
β Works on all Paper 1.21.5 - 1.21.11 versions
- The plugin now detects the server version by itself. One jar works on every Paper server from 1.21.5 up to 1.21.11 - no need to wait for a special build.
β Minecraft 26.1 and 26.2 are ready
- Support for the newest Minecraft versions is prepared. For Minecraft 26.x you use a special build of the plugin (see below).
β New versions will be added much faster
- The plugin was rebuilt so that adding support for a new Minecraft version no longer requires rewriting the whole plugin. Updates for new versions will come out sooner.
β More automatic tests
- Added many automatic tests (33 in total) that check the plugin on every version, so it stays stable and nothing breaks between updates.
Upgrading from 1.3.0
- Stop the server, swap the jar, start it back up. That is it.
- Your config files stay the same. Nothing is reset.
- On Minecraft 26.1 or 26.2 use the special 26.x build of the plugin. It needs the 26.x version of PacketEvents installed.
More versions. More stable. Same easy plugin.
Β
Version 1.3.0
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Stability and Quality β 12 Fixes β 6 Improvements
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Fixes
β Plugin no longer fails to start on a bad webhook setting
- If the webhook daily summary hour was set to a wrong value, the plugin could not start at all. It now ignores the wrong value and starts normally.
β Random fake names no longer cause an error
- In rare cases a generated fake player name caused a crash. Names are now created in a safe way.
β Expired fakes are removed even with the scheduler off
- Fake players that stayed longer than the max stay time are now cleaned up even when the daily scheduler is turned off.
β Update checker compares versions correctly
- Version 1.10 is now seen as newer than version 1.9. The old check compared text, not numbers.
β Real fakes are no longer counted twice
- Real fake players (NMS) were counted as real players and as fake players at the same time. This made the server ping count, /spoofer count and PlaceholderAPI show wrong numbers.
β No more entity ID conflicts
- Phantom fake players and holograms used two separate ID counters that could collide. They now share one safe counter.
β GUI works on all Paper 1.21 versions
- The management GUI could crash on Minecraft versions other than 1.21.11. It now uses a safe API that works everywhere.
β Safer shutdown and reload
- Disabling or reloading the plugin no longer causes errors when a webhook task is still running.
β Skin change now updates real fakes in the world
- Changing the skin of a real fake player used to update only the player list. The fake is now respawned so the new skin shows in the world too.
β Name pool is checked for valid usernames
- Names from names.yml and builtin-names.yml are now checked against Minecraft username rules before use.
β Small memory leak fixed
- A small amount of memory stayed in use after removing a fake player. It is now cleaned up correctly.
β Polish language file cleaned up
- Fixed several spelling mistakes in the Polish messages.
Improvements
β Faster startup with restored fakes
- Restoring many fake players from the save file no longer freezes the server while it starts.
β Reload refreshes entity and hologram settings
- /spoofer reload now also applies changes to the entity and hologram options without a restart.
β Less lag from holograms
- Holograms are no longer sent to players who are too far away to see them. This helps on big servers.
β Safer fake names in messages
- Fake player names are treated as plain text in more places so they cannot be misused.
β Quieter bStats message
- The startup message about bStats is no longer shown on every start.
β Unit tests added
- Added 22 unit tests for the core logic to keep the plugin stable in the future.
Upgrading from 1.2.0
- Stop the server, swap the jar, start it back up. That is it.
- Your config files stay the same. Nothing is reset.
- This update fixes many small problems and makes the plugin more stable on large servers.
More stable. Faster. Ready for big servers.
Β
Changelog
Released June 2026
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β New Features
Β
- Hologram System (TextDisplay) Holograms are now fully implemented using PacketEvents TextDisplay entities. Each fake player spawns configurable name and ping holograms above their head with billboard CENTER rotation, see-through rendering, and true shadows. Format supports MiniMessage and legacy &x codes with
<name>and<ping>placeholders. - Phantom Fake Player Mode Added
--realand--phantomflags to/spoofer add. Administrators can now explicitly choose between NMS-backed interactive fakes and lightweight packet-only phantoms. Auto-detection remains the default when no flag is specified. - Webhook Rate Limiting Discord webhook integration now uses a batched queue system. Add and remove events are collected and flushed every 3 seconds as grouped messages. A 1.5-second global cooldown prevents all rate limit hits. HTTPS-only enforcement blocks accidental plain-HTTP URLs.
Β
- Webhook Daily Summary Precision The daily activity summary now fires exactly at the configured hour in the server's timezone instead of on a random minute. Uses calculated delay instead of hourly polling.
- Command Name Validation
/spoofer addnow validates usernames against Minecraft rules (1-16 chars,A-Za-z0-9_) before attempting spawn. Invalid names are rejected with a clear error message. - Shared Location Resolution Extracted duplicated spawn-location fallback logic into a single
resolveDefaultSpawnLocation()method shared byFakePlayerServiceandPersistenceStore. All three fallback tiers (exact coords, default-world + radius, first-loaded-world) are now maintained in one place. - Hologram Position Sync Holograms now follow fake players during random wandering via
moveAll(). Joining players receive hologram snapshots alongside entity and TAB snapshots.
Β
- Entity ID CAS Edge Case Replaced the manual CAS loop in
FakePlayer.nextEntityId()withAtomicInteger.getAndUpdate(), eliminating a potential ID collision when the wrap-around reset raced between concurrent spawn threads. - Scheduler Expired Fake Cleanup Fakes that exceed
max-stay-minutesare now force-removed regardless of the scheduler's paused state. Previously, pausing the scheduler could leave expired fakes lingering indefinitely. - Config Default Mismatch Fixed
look-at-nearby-playersdefaulting totruein code whileconfig.ymlshipped withfalse. Both now default tofalse. - Skin Command Message Key Fixed
/spoofer skinusing a non-existentunknown-subcommandmessage key when an invalid skin source was provided. Now correctly falls back tounknown-command.
Β
FakePlayerService- added public staticresolveDefaultSpawnLocation(SpooferConfig, Logger)HologramManager- rewritten from stub to full TextDisplay implementation withspawn(),despawn(),sendInitialSnapshot(),moveAll()WebhookSender- added batched queue withaddQueue,removeQueue,flushBatched(),scheduleFlush(), globallastSendMscooldownSpooferCommand- addedMC_NAMEregex pattern,--real/--phantomflag parsing,explicitRealresolution logicFakePlayer-nextEntityId()simplified to singlegetAndUpdate()callDailyCurveScheduler- reordered tick logic: forced expiry removal before paused checkRealPlayerListener- addedhologramManager.sendInitialSnapshot()on player joinFakeEntityManager- addedhologramManager.moveAll()intickWander()PersistenceStore- replaced duplicated location resolution with sharedFakePlayerService.resolveDefaultSpawnLocation()ConfigLoader- correctedlook-at-nearby-playersdefault fromtruetofalse
BetterSpoofer by Bishyy - Paper 1.21+ - NMS-backed fake player management
Statistics
Views
Purchases
Downloads
File size
Published
Updated
Info
Share & Earn
Share and earn part of the profits, an estimated €0.5 per product sale.