Releases: EndlessPixel-Studio/FakePlayer-CE
Release list
FakePlayer-CE.Build12
FakePlayer-CE.Build12
Folia Support, Login Plugin Compatibility, Chat Event Pipeline & Instant Cleanup
This release adds first-class Folia support (verified on Folia 26.2: fake players spawn, tick and stay alive 90s+ with zero keep-alive kicks), marks fake players as logged in for AuthMe, CatSeedLogin and LibreLogin, routes /fp say through the real chat event pipeline so chat-formatting plugins work again, and adds a follow-quiting-force option that removes a creator's fake players the moment they quit.
Highlights
- Folia Support: FakePlayer-CE now runs on Folia and other regionised servers. Every scheduling call goes through a single unified scheduler API (global / region / entity / async) that automatically falls back to the main thread on Bukkit/Paper/Spigot; fake-player ticking is driven by the entity scheduler, spawning runs on the region thread with
teleportAsync, and the fake connection answers keep-alive packets itself — so fake players are no longer kicked for being "timed out". - Login Plugin Compatibility: fake players are now marked as logged in for AuthMe / AuthMeReloaded (public API
forceLogin/forceRegister, unregistered names auto-registered with a random short password), CatSeedLogin / ReCatSeedLogin (added to the plugin'sloginPlayerslist) and LibreLogin (Paper) / LibreLoginNext (Paper) (a temporary unregistered record is created for the online fake player, authorized on spawn, and removed on disconnect or orderly shutdown). All three are declared assoftdependand only load when that plugin is installed. /fp sayNow Goes Through the Chat Event Pipeline: messages are sent as unsigned chat throughChatProcessor, fully triggeringAsyncPlayerChatEvent/AsyncChatEvent, so chat-formatting plugins (EssentialsX Chat, Vane, …) can modify the format again; the result is broadcast unless the event is cancelled. Previously/fp saywas silently dropped on modern versions because of chat signature verification (#21).- New
follow-quiting-forceOption: a creator's fake players are removed right after the creator quits (afterfollow-quiting-force-delayseconds, default 3) instead of waiting for the periodic cleanup.
Breaking Changes
/fp sayoutput is now processed by chat plugins. Because messages go through the real chat events, any installed chat formatter will reformat/fp sayoutput, and if a plugin cancelsAsyncPlayerChatEvent/AsyncChatEventthe message is not broadcast. This is the intended fix for the silent-drop bug, but it does change how/fp sayrenders on servers with chat formatters.
Critical Fixes
- Fixed fake players being kicked as "timed out" on Folia (the connection now answers keep-alive packets itself).
- Fixed fake-player spawning on Folia:
No currently ticking regionwhile creating the player, and illegal synchronous teleport inside a region thread (nowteleportAsyncon the region thread). - Fixed AuthMe login failing with short passwords.
- Fixed CatSeedLogin compatibility when its classes live in a different location.
- Fixed command help ignoring the configured locale — help text is now resolved with the plugin's configured locale (#20).
Important Notes
config.ymlis bumped to version 22; existing configs keep working and fall back to defaults for the new keys.follow-quiting-forceis disabled by default. Note that enabling it also removes the fake players when the creator merely switches servers on a proxy (the usual "server switching does not trigger follow-quiting" guard is bypassed).- Login plugin compatibility is opt-in by presence: nothing is loaded unless the corresponding login plugin is installed.
- Known low-priority leftovers on Folia shutdown:
PlayerList.removereports a reflectiveInvocationTargetException, and CommandAPI logs a "cannot register/unregister commands after the server is done starting" warning. Neither affects gameplay.
Usage
- Java: 21+ (Java 25 recommended for 26.x support)
- Server: Paper / Leaf 1.20.1+ (Purpur compatible; Folia supported — verified on 26.2)
- API: CommandAPI 12.0.0+ (Mandatory dependency)
Credits
- CE Maintenance: @EndlessPixel
- @ifloppy (PR #25: honor the configured locale in command help; PR #26: Paper LibreLogin compatibility)
- @MCForgeTitle123 (PR #22:
/fp saynow triggers Bukkit chat events; reported issues #17, #20, #21)
FakePlayer-CE.Build12 —— Folia 支持、登录插件兼容、聊天事件管线与退出即时清理
本次更新带来首等 Folia 支持(已在 Folia 26.2 实测:假人成功生成、持续 tick 且存活 90 秒以上,零 keep-alive 踢出),为假人补齐 AuthMe、CatSeedLogin、LibreLogin 登录插件兼容,让 /fp say 重新走真正的聊天事件管线(聊天格式化插件恢复生效),并新增 follow-quiting-force 配置,在创建者退出瞬间清理其假人。
核心特性
- Folia 支持:FakePlayer-CE 现可在 Folia 及其他区域化服务端上运行。所有调度统一走一套调度 API(全局 / 区域 / 实体 / 异步),在 Bukkit/Paper/Spigot 上自动回落到主线程;假人 tick 改由实体调度器驱动,生成在区域线程执行并改用
teleportAsync,连接会自行回应 keep-alive 包,假人不再被判定超时踢出。 - 登录插件兼容:假人生成时会被标记为已登录,支持 AuthMe / AuthMeReloaded(走公开 API
forceLogin/forceRegister,未注册的名称用随机短密码自动注册)、CatSeedLogin / ReCatSeedLogin(写入插件的loginPlayers名单)与 LibreLogin(Paper)/ LibreLoginNext(Paper)(为在线假人创建临时未注册记录、生成时授权、断开连接或正常关闭时清理)。三者均以softdepend声明,仅在对应插件安装时加载。 /fp say走聊天事件管线:消息以未签名形式交给ChatProcessor处理,完整触发AsyncPlayerChatEvent/AsyncChatEvent,聊天格式化插件(EssentialsX Chat、Vane 等)可再次介入修改格式;事件未取消时按结果广播。此前因聊天签名校验,/fp say在新版服务端会被静默丢弃(#21)。- 新增
follow-quiting-force配置:创建者退出后立即清理其假人(延迟follow-quiting-force-delay秒,默认 3),无需等待定时轮询。
破坏性变更
/fp say的输出现在会经过聊天插件处理。 因为消息走真实聊天事件,已安装的聊天格式化插件会重新格式化/fp say的输出;若有插件取消了AsyncPlayerChatEvent/AsyncChatEvent,该消息将不再广播。这是修复「静默丢弃」的预期行为,但在装有聊天格式化插件的服务器上,/fp say的呈现会与之前不同。
关键修复
- 修复假人在 Folia 上被判定
keepalive timeout踢出(连接现在自行回应 keep-alive 包)。 - 修复 Folia 上的假人生成:创建时的
No currently ticking region,以及区域线程内禁止同步 teleport(现改为区域线程内teleportAsync)。 - 修复 AuthMe 短密码登录失败。
- 修复 CatSeedLogin 类位于不同位置时的兼容问题。
- 修复命令帮助未遵循配置语言:帮助文本现按插件配置的 locale 解析(#20)。
重要说明
config.yml版本号提升至 22;旧配置可继续使用,新配置项自动采用默认值。follow-quiting-force默认关闭。注意:开启后会绕过「仅切换服务器不触发跟随下线」的判断,代理服上玩家仅切换服务器时其假人也会被清理。- 登录插件兼容按「是否安装」生效:未安装对应插件时不会加载任何相关逻辑。
- Folia 关服时的已知低优先遗留:
PlayerList.remove反射调用报InvocationTargetException,CommandAPI 输出 "cannot register/unregister commands after the server is done starting" 告警。均不影响游戏运行。
使用要求
- Java: 21+(26.x 建议 Java 25)
- 服务端: Paper / Leaf 1.20.1+(兼容 Purpur;支持 Folia,已在 26.2 验证)
- 前置依赖: CommandAPI 12.0.0 及以上(必需)
鸣谢
- CE 维护: @EndlessPixel
- @ifloppy(PR #25:命令帮助遵循配置语言;PR #26:Paper LibreLogin 兼容)
- @MCForgeTitle123(PR #22:
/fp say触发 Bukkit 聊天事件;提出 issue #17、#20、#21)
FakePlayer-CE.Build11
FakePlayer-CE.Build11
Ender Chest, PlaceholderAPI Expansion, Expanded HTTP API & Security Hardening
This release adds ender chest access for fake players, a large batch of new PlaceholderAPI placeholders, expands the built-in HTTP admin API from 5 to 18 endpoints with security hardening (header-only tokens, rate limiting, DNS-rebinding protection), introduces the replace_tools feature, broadens replenish, and fixes command tab-completion in non-English locales.
Highlights
- Ender Chest Access: new
/fp enderchest(alias/fp ec) opens a fake player's ender chest under the same world/permission rules as/fp invsee; shift-right-clicking a fake player also opens it. New permissionfakeplayer.command.enderchest. - More PlaceholderAPI Placeholders: added list placeholders (
%fakeplayer_list%,%fakeplayer_list_<index>%,%fakeplayer_isfake%) and fake-player attributes (%fakeplayer_name%,%fakeplayer_uuid%,%fakeplayer_world%, coordinates, health, food, level, gamemode, creator, spawn time, running actions, etc.). - Expanded HTTP Admin API (5 → 18 endpoints): new query
/statusand/info, control/action,/stop,/teleport,/look,/hold,/swap,/respawn,/cmd, and batch/kickall,/killall,/sayall; each is independently toggleable underhttp-admin.interface. replace_toolsFeature: non-Mending tools are replaced after breaking; Mending tools are replaced at a configured low-durability threshold.- Broadened
replenish:/fp drop//fp dropstackrefill the main hand after its last item is dropped; consumed milk/stews/honey/potions are refilled from their returned container.
Breaking Changes
- The HTTP token is now header-only —
Authorization: Bearer <token>is the only accepted auth method. The?token=query parameter is removed, so tokens no longer leak through URLs, proxy logs, browser history orRefererheaders.
Critical Fixes
- HTTP API security hardening: token comparison is now constant-time; any
tokenparameter is redacted from logs; JSON responses escape control characters; per-source-IP rate limiting and lockout;Host/Originchecks mitigate DNS rebinding; routing is exact-path;POSTis supported. - Command tab-completion in non-English locales: case conversions now use
Locale.ROOT, so/fpsuggestions are correct on servers with non-English locales (e.g. Turkishtr_TR).
Important Notes
config.ymlis bumped to version 20; existing configs keep working and fall back to defaults for the new keys.http-adminis disabled by default. Prefer theAuthorization: Bearerheader and restrict access at the firewall level; rate limiting defaults to 120 requests/min per IP, with a 60s lockout after 10 consecutive auth failures.
Usage
- Java: 21+ (Java 25 recommended for 26.x support)
- Server: Paper / Leaf 1.20.1+ (Purpur compatible)
- API: CommandAPI 12.0.0+ (Mandatory dependency)
Credits
- CE Maintenance: @EndlessPixel
- @ifloppy (PRs #10–#13:
replace_toolsfeature & broadenedreplenish)
FakePlayer-CE.Build11 —— 末影箱、PlaceholderAPI 扩展、HTTP 接口扩充与安全加固
本次更新为假人新增末影箱访问、一大批 PlaceholderAPI 占位符,将内置 HTTP 管理接口从 5 个扩展到 18 个并做了安全加固(令牌仅走请求头、限流、DNS rebinding 防护),新增 replace_tools 特性、扩展 replenish,并修复非英文区域下的指令补全。
核心特性
- 末影箱访问:新增
/fp enderchest(别名/fp ec)打开假人的末影箱,判定规则(同世界、权限)与/fp invsee一致;潜行右键假人也可直接打开。新增权限节点fakeplayer.command.enderchest。 - 扩充 PlaceholderAPI 占位符:新增列表占位符(
%fakeplayer_list%、%fakeplayer_list_<序号>%、%fakeplayer_isfake%)与假人属性(%fakeplayer_name%、%fakeplayer_uuid%、%fakeplayer_world%、坐标、血量、饥饿、等级、模式、创建者、生成时间、正在进行的动作等)。 - HTTP 管理接口扩充(5 → 18 个):新增查询类
/status、/info,控制类/action、/stop、/teleport、/look、/hold、/swap、/respawn、/cmd,以及批量/kickall、/killall、/sayall;各接口在http-admin.interface下独立开关。 replace_tools特性:非经验修补工具损坏后更换;经验修补工具在达到配置的低耐久阈值时更换。- 扩展
replenish:/fp drop//fp dropstack丢空主手最后一个物品后自动补货;消耗奶桶、炖菜、蜂蜜瓶、药水后从返回的容器补回原物。
破坏性变更
- HTTP 令牌改为只走请求头 —— 鉴权统一使用
Authorization: Bearer <token>,不再接受?token=查询参数,令牌不再出现在 URL、代理日志、浏览器历史与Referer中。
关键修复
- HTTP 接口安全加固:令牌改为定长比较;日志脱敏
token参数;响应转义控制字符;按来源 IP 限流与失败锁定;校验Host/Origin缓解 DNS rebinding;路径精确匹配;支持POST。 - 非英文区域指令补全:大小写转换现统一使用
Locale.ROOT,在土耳其语tr_TR等非英文区域服务端下/fp补全建议均正确。
重要说明
config.yml版本号提升至 20;旧配置可继续使用,新配置项自动采用默认值。http-admin默认关闭。建议优先使用Authorization: Bearer请求头并在防火墙层面限制来源;限流默认每 IP 120 请求/分钟,连续 10 次鉴权失败后锁定 60 秒。
使用要求
- Java: 21+(26.x 建议 Java 25)
- 服务端: Paper / Leaf 1.20.1+(兼容 Purpur)
- 前置依赖: CommandAPI 12.0.0 及以上(必需)
鸣谢
- CE 维护: @EndlessPixel
- @ifloppy(PR #10–#13:
replace_tools特性与扩展的replenish)
FakePlayer-CE.Build10
FakePlayer-CE.Build10
HTTP Admin API & Corrected Kick/Kill Semantics
This release introduces a built-in HTTP admin API for remote management (/list, /spawn, /kick, /kill, /say, with token auth and call logging), corrects the long-standing kick/kill semantics (/fp kill now truly kills, removal moves to /fp kick), and fixes the /fp say single-argument fallback.
Highlights
- Built-in HTTP Admin API: Optional remote management for web panels and automation —
GET /list,/spawn,/kick,/kill,/say. Token auth via?token=orAuthorization: Bearer; every endpoint has its own switch underhttp-admin.interface; all calls are logged to the console with the token redacted. - Corrected Kick/Kill Semantics:
/fp kick(single) //fp kickall(all) now take over the "remove" behavior, while/fp kill//fp killalltruly kill fake players through the real death flow and follow thekick-on-deadconfig. /fp saySingle-Argument Fallback:/fp say once 1234works again — a lone argument is treated as the message instead of a fake player name.
Breaking Changes
/fp kill//fp killallused to remove fake players; they now truly kill them (real death flow viasetHealth(0)). Scripts and habits built on the old removal behavior should switch to/fp kick//fp kickall.- New permission node
fakeplayer.command.kick; thefakeplayer.spawnpermission group now grantskickinstead ofkill(the latter now gates the real kill commands).
Critical Fixes
- Fixed HTTP query parameters not being URL-decoded: messages with Chinese characters, spaces and other special characters (URL-encoded) now parse correctly — also fixes
/spawn?name=中文名. - Fixed thread safety of HTTP handlers:
/killand/sayare dispatched to the main thread viaBukkit.getScheduler().callSyncMethod, no longer touching Bukkit API from HTTP worker threads.
Important Notes
http-adminis disabled by default. Iftokenis left empty, a random token is generated at startup and printed to the console; prefer theAuthorization: Bearerheader over?token=(URLs are often logged by proxies) and restrict access at the firewall level./fp killfollowskick-on-dead: by default the fake player is removed right after death (no loot); withkick-on-dead: falsethe corpse stays and can be revived via/fp respawnwith normal loot rules.- Repository layout only: version modules are consolidated under
versions/(no runtime impact).
Usage
- Java: 21+ (Java 25 recommended for 26.x support)
- Server: Paper / Leaf 1.20.1+ (Purpur compatible)
- API: CommandAPI 12.0.0+ (Mandatory dependency)
Credits
- CE Maintenance: @EndlessPixel
FakePlayer-CE.Build10 —— HTTP 远程管理接口与踢出/击杀语义修正
本次更新引入内置 HTTP 远程管理接口(/list、/spawn、/kick、/kill、/say,支持 token 鉴权与调用日志),修正长期存在的"踢出/击杀"语义混淆(/fp kill 现为真正杀死,移除功能交由 /fp kick),并修复 /fp say 单参数回退问题。
核心特性
- 内置 HTTP 管理接口:可选的远程管理能力,适用于 Web 面板与自动化脚本 ——
GET /list、/spawn、/kick、/kill、/say。通过?token=或Authorization: Bearer鉴权;各接口在http-admin.interface下独立开关;所有调用均输出控制台日志(token 已脱敏)。 - 踢出/击杀语义修正:
/fp kick(单个)//fp kickall(批量)承接"移除假人",/fp kill//fp killall则通过真实死亡流程真正击杀假人,并遵循kick-on-dead配置。 /fp say单参数回退:/fp say once 1234恢复正常 —— 单独一个参数会被当作文本消息,而不是假人名。
破坏性变更
/fp kill//fp killall原为"移除假人",现为"真正杀死"(通过setHealth(0)走真实死亡流程)。依赖旧移除行为的脚本与习惯请改用/fp kick//fp kickall。- 新增权限节点
fakeplayer.command.kick;fakeplayer.spawn权限组现授予kick而非kill(kill现在对应真杀死命令)。
关键修复
- 修复 HTTP 参数未做 URL 解码:携带中文、空格等特殊字符(经 URL 编码)的消息现在可正确解析 —— 同时修复
/spawn?name=中文名。 - 修复 HTTP 处理线程的线程安全问题:
/kill、/say现通过Bukkit.getScheduler().callSyncMethod调度到主线程执行,不再从 HTTP 工作线程直接调用 Bukkit API。
重要说明
http-admin默认关闭。token留空时启动会随机生成并打印到控制台;建议优先使用Authorization: Bearer请求头而非 URL 传递 token(URL 常被代理记录),并配合防火墙限制访问来源。/fp kill遵循kick-on-dead配置:默认假人死亡后即被移除(不掉落物品);kick-on-dead: false时保留尸体,可用/fp respawn复活,掉落按服务端规则生效。- 仓库结构变化:版本兼容模块统一收纳于
versions/目录(运行时无影响)。
使用要求
- Java: 21+(26.x 建议 Java 25)
- 服务端: Paper / Leaf 1.20.1+(兼容 Purpur)
- 前置依赖: CommandAPI 12.0.0 及以上(必需)
鸣谢
- CE 维护: @EndlessPixel
FakePlayer-CE.Build9
FakePlayer-CE.Build9
Fake Player Auto-Login & Password Management
This release introduces automatic login (auto-login) for fake players, a built-in password database, and the /fp password / /fp changepassword commands, plus a forced-execution switch to bypass the version check.
Highlights
- Auto-Login for Fake Players: When enabled, a fake player automatically runs the configured register/login commands after spawn, with the password stored in the plugin database — solving the long-standing issue of AuthMe-style plugins kicking fake players for being "not logged in".
- Password Database &
/fp password: Store a login password per fake player via/fp password <name> <password>; no more plaintext passwords inself-commands. /fp changepasswordwith Optional Old Password: Change a fake player's password and sync it to the auth plugin. The old password can be omitted — when omitted, the stored password is used directly, so a forgotten random password can still be reset.- Random Password Generation:
random-passwordcharset andrandom-password-lengthconfig; when auto-login is on and no password was set, a strong random password is generated and used to register/login automatically. forced-executionSwitch: Ignore the NMSBridge version check and force the plugin to run on unsupported Minecraft versions (falls back to the first available NMSBridge implementation; NMS incompatibility risk is on you).
Critical Fixes
- Fixed missing permission nodes in plugin.yml: added
fakeplayer.command.password,fakeplayer.command.changepassword, andfakeplayer.command.say, and folded them into thefakeplayer.*aggregate permission. - Updated README.md / README_zh.md command tables to document the two new commands.
Important Notes
- The auto-login feature itself is version-agnostic: commands are dispatched via
Player.performCommand, so it is unaffected by the 1.19.3+ chat signing changes. - The core (NMSBridge) currently covers only
1.20.1 ~ 26.2and does NOT include1.19.x. To run on 1.19.x you must provide a matching NMS adapter module, or enableforced-executionat your own risk. - Vanilla native
/kickcannot affect fake players by design; use/fp killor/fp killallinstead.
Usage
- Java: 21+ (Java 25 recommended for 26.x support)
- Server: Paper / Leaf 1.20.1+ (Purpur compatible)
- API: CommandAPI 12.0.0+ (Mandatory dependency)
Credits
- CE Maintenance: @EndlessPixel
FakePlayer-CE.Build9 —— 假人自动登录与密码管理
假人自动登录、密码库与 forced-execution 版本强制开关
本次更新为假人引入自动登录(auto-login)能力,新增插件内密码库与 /fp password、/fp changepassword 命令,并提供 forced-execution 开关以忽略版本检查强制运行。
核心特性
- 假人自动登录:开启后,假人生成即自动执行配置的 register/login 命令,密码统一存于插件数据库,彻底解决 AuthMe 等登录插件因「长时间未登录」踢出假人的问题。
- 密码库与
/fp password:通过/fp password <名称> <密码>为指定假人设置登录密码并持久化到插件数据库,无需在self-commands中明文写密码。 /fp changepassword旧密码可省略:修改假人密码并同步登录插件账户;省略旧密码时直接用库内密码执行改密,忘记随机密码也能重置。- 随机密码生成:新增
random-password字符集与random-password-length配置,auto-login 开启且未手动设密码时自动生成高强度随机密码并完成注册/登录。 forced-execution开关:忽略 NMSBridge 版本检查,强制在不被原生支持的版本运行(以首个可用实现兜底,NMS 不兼容风险自负)。
关键修复
- 补全 plugin.yml 缺失权限节点:
fakeplayer.command.password、fakeplayer.command.changepassword、fakeplayer.command.say,并纳入fakeplayer.*聚合权限。 - 更新 README.md / README_zh.md 命令表,补充上述两个新命令说明。
重要说明
- 自动登录功能本身跨版本无碍:命令通过
Player.performCommand派发,不受 1.19.3+ 聊天签名影响。 - 插件核心(NMSBridge)当前仅覆盖
1.20.1 ~ 26.2,不含 1.19.x。如需在 1.19.x 运行,请先提供对应版本的 NMS 适配模块,或开启forced-execution自行承担兼容风险。 - 原版原生
/kick依设计无法影响假人,请改用/fp kill或/fp killall。
使用要求
- Java: 21+(26.x 建议 Java 25)
- 服务端: Paper / Leaf 1.20.1+(兼容 Purpur)
- 前置依赖: CommandAPI 12.0.0 及以上(必需)
鸣谢
- CE 维护: @EndlessPixel
FakePlayer-CE.Build8
FakePlayer-CE.Build8
Non-OP Fake Player Inventory Access, Real-Player Data Reuse & Stability Fixes
This release adds a global config (allow-non-op-open-inv) letting non-OP players open fake player inventories (with a no-permission hint), introduces a fakeplayer.command.spawn.name.force-real permission to spawn a fake player reusing a real player's data when the name is taken, and bundles several stability fixes (auto-replenish after item use, lag-level concurrency, empty fp say message, etc.). It inherits all Build7 chat and fp say overhaul fixes.
Highlights
- Non-OP inventory access: new global config
allow-non-op-open-inv(defaultfalse). When enabled, any player can open a fake player's inventory via right-click or/fp invsee. Opening is granted if the viewer hasfakeplayer.command.invseepermission, is OP, is the fake player's creator, or the config is on. A new "you don't have permission to open this fake player's inventory" hint (en / zh / zh_HK / zh_TW) is shown otherwise./fp invseeno longer requires the hard permission node — command and right-click now behave identically. - Real-player data reuse: new
fakeplayer.command.spawn.name.force-realpermission (default op). When the requested name belongs to a real player who has played before, players with this permission can force-spawn a fake player using that real player's UUID, reusing their data (inventory, ender chest, xp, etc.). Without it, the existing "name already used" error is shown.
Critical Fixes
- Auto-replenish after item use (#10):
FakeplayerReplenishManagerrewritten so fake players replenish consumed/used items correctly; added pre-replenish validation of player and inventory state to prevent NPEs. - Lag-level concurrency: the scheduler previously decremented
lagleveland calledBukkit.broadcastoff the main thread, causing race conditions and illegal Bukkit API access. Now wrapped inBukkit.getScheduler().runTaskon the main thread. - Empty
fp saymessage:/fp saynow handles empty messages gracefully and shows a dedicated error hint instead of failing. - Fixed
tpscommand's short-description message key.
Important Notes
- Enabling
allow-non-op-open-invlets every player inspect fake player inventories; keep it off on public servers unless intended. fakeplayer.command.spawn.name.force-realdefaults to op; granting it lets players reuse a real player's stored data — exercise caution.
Usage
- Java: 21+ (Java 25 recommended for 26.x support)
- Server: Paper / Leaf 1.20.1+ (Purpur compatible)
- API: CommandAPI 12.0.0+ (Mandatory dependency)
Credits
- CE Maintenance: @EndlessPixel
- Contributions: @ifloppy (force-real data reuse, #8), community (replenish fix, #10)
FakePlayer-CE.Build8 —— 非 OP 假人背包访问、真实玩家数据复用与稳定性修复
本次更新新增全局配置 allow-non-op-open-inv 允许非 OP 玩家打开假人背包(含无权限提示),新增 fakeplayer.command.spawn.name.force-real 权限支持在名称被真实玩家占用时复用其数据生成假人,并修复了多项稳定性问题(使用物品后自动补货、卡顿等级并发、空 fp say 消息等)。完整继承 Build7 的聊天与 fp say 动作化重构修复。
核心特性
- 非 OP 假人背包访问:新增全局配置
allow-non-op-open-inv(默认false)。开启后任意玩家均可右键或/fp invsee打开假人背包。打开判定:拥有fakeplayer.command.invsee权限 / OP / 假人创建者 / 配置开启,任一满足即可;否则提示新增文案「你没有权限打开假人的背包」(已补充 en / zh / zh_HK / zh_TW)。/fp invsee不再强制要求权限节点,命令与右键行为完全一致。 - 真实玩家数据复用:新增
fakeplayer.command.spawn.name.force-real权限(默认 op)。当指定名称属于曾登录过的真实玩家时,拥有该权限的玩家可强制以该真实玩家 UUID 生成假人,从而复用其玩家数据(背包、末影箱、经验等);无权限时仍提示「名称已被使用」错误。
关键修复
- 使用物品后自动补货(#10):重写
FakeplayerReplenishManager,假人使用/消耗物品后正确补货;补货前增加玩家与背包状态校验,规避 NPE。 - 卡顿等级并发修复:调度器此前在主线程外递减
laglevel并调用Bukkit.broadcast,引发竞争与主线程外 Bukkit API 调用。现已用Bukkit.getScheduler().runTask包裹至主线程执行。 - 空
fp say消息:/fp say现可优雅处理空消息,并给出专用错误提示而非报错。 - 修正
tps命令简短描述键名。
注意事项
- 开启
allow-non-op-open-inv将允许所有玩家查看假人背包,公共服务器请谨慎开启。 fakeplayer.command.spawn.name.force-real默认仅 OP;授予后可令玩家复用真实玩家已存储数据,请谨慎分配。
使用要求
- Java: 21+(26.x 建议 Java 25)
- 服务端: Paper / Leaf 1.20.1+(兼容 Purpur)
- API: CommandAPI 12.0.0+(强制依赖)
维护者
- CE 维护: @EndlessPixel
- 贡献: @ifloppy(真实玩家数据复用,#8)、社区(补货修复,#10)
FakePlayer-CE.Build7
FakePlayer-CE.Build7
Fake Player Chat Fix & fp say Action Subcommand Overhaul
This release fixes fake players being completely unable to send chat messages on modern Leaf forks, overhauls the fp say command to align with the action command syntax (supporting once / continuous / interval / stop), and inherits all removal and compatibility fixes from Build6.
Highlights
- Working Fake Player Chat: Replaced the signature-gated
connection.chat(...)path with a direct unsignedPlayerChatMessagebroadcast, so fake players can actually speak on Leaf 26.2+ (and all modern versions). fp sayNow an Action Command:fp saygains the sameonce / continuous / interval / stop / helpsubcommands as other actions, with TAB-completable fake player names and a<name> <msg>argument layout.- Iterative Optimization Based on Build6: Inherits Build6's complete fake player removal fix, Leaf
CraftServer#getServer()adaptation, and all stability improvements.
Critical Fixes - Fixed fake players cannot send chat messages (Leaf 26.2+):
ServerGamePacketListenerImpl.chat(String, LastSeenMessages, boolean)runs the message through the signed-chat validation chain; fake players have no real session, so a null signature was silently discarded. The newNMSServerPlayer.chatbroadcasts an unsignedPlayerChatMessageviaPlayerList.broadcastChatMessage, bypassing signature validation entirely. - Fixed
fp sayhad no fake player name argument and no TAB completion: the command previously registered only a greedy message argument, so it could not target a specific fake player nor complete names. It now registers an optionalfakeplayer("name")argument shared across all action subcommands. - Added
ActionType.SAYandSayAction: a new repeatable action that emits the chat message on every tick (driven byActionManager), carrying the text through a newmessagefield onActionSetting.ActionTickerImplin all 13 version modules was updated to handle the new enum value.
Important Notes - Vanilla native
/kickcannot affect fake players by design, as fake players do not occupy real server connections. Use/fp killor/fp killallinstead. - Use
/fp say once <name> <msg>for a single message,/fp say continuous <name> <msg>for every-tick spam (stop with/fp say stop <name>), and/fp say interval <ticks> <name> <msg>for periodic messages.
Usage - Java: 21+ (Java 25 recommended for 26.x support)
- Server: Paper / Leaf 1.20.1+ (Purpur compatible)
- API: CommandAPI 12.0.0+ (Mandatory dependency)
Credits - CE Maintenance: @EndlessPixel
FakePlayer-CE.Build7 —— 假人聊天修复与 fp say 动作化重构
假人聊天失效修复、fp say 动作子命令化重构
本次更新修复了现代 Leaf 分支下假人完全无法发送聊天消息的问题,将 fp say 命令重构为与其他动作命令一致的 once / continuous / interval / stop 子命令体系,并完整继承 Build6 的假人移除与兼容性修复。
核心特性
- 假人聊天真正生效:弃用受签名校验拦截的
connection.chat(...),改为直接广播未签名PlayerChatMessage,使假人在 Leaf 26.2+(及所有现代版本)均可正常发言。 fp say升级为动作命令:现在支持once / continuous / interval / stop / help子命令,与其他动作命令一致,假人名可 TAB 补全,参数为<name> <msg>。- 迭代继承 Build6 修复:完整保留 Build6 的假人彻底移除修复、Leaf
CraftServer#getServer()适配及全部稳定性改进。
关键修复 - 修复假人无法发送聊天消息(Leaf 26.2+):新版
ServerGamePacketListenerImpl.chat走聊天签名校验链,假人无真实会话,传入 null 签名被静默丢弃。新NMSServerPlayer.chat改用PlayerList.broadcastChatMessage直接广播未签名消息,彻底绕过签名校验。 - 修复
fp say缺假人名参数、无法 TAB 补全:旧命令仅注册贪婪文本参数,既不能指定说话的假人也无法补全名字。现统一注册可选fakeplayer("name")参数,覆盖全部动作子命令。 - 新增
ActionType.SAY与SayAction:新增可重复动作,按ActionManager调度在每 tick 广播聊天内容,文本通过ActionSetting新增的message字段携带;全 13 个版本模块的ActionTickerImpl均已补充新枚举分支。
注意事项 - 原版原生
/kick依设计无法影响假人,因假人不占用真实服务器连接。请改用/fp kill或/fp killall移除假人实体。 - 单次发言用
/fp say once <name> <msg>,持续刷屏用/fp say continuous <name> <msg>(用/fp say stop <name>停止),定时发言用/fp say interval <ticks> <name> <msg>。
使用要求 - Java: 21+(26.x 建议 Java 25)
- 服务端: Paper / Leaf 1.20.1+(兼容 Purpur)
- API: CommandAPI 12.0.0+(强制依赖)
维护者 - CE 维护: @EndlessPixel
FakePlayer-CE.Build6
FakePlayer-CE.Build6
Fake Player Entity Removal Fix & Full Leaf Compatibility Polish
This release fixes the core issue that fake players could not be completely removed from the server, thoroughly optimizes the fake player cleanup logic, perfects compatibility with all modern Leaf forks, and inherits all stability fixes from Build5.
Highlights
- Complete Fake Player Removal: Overhauled fake player cleanup logic, truly deregisters fake player entities from the server via native NMS methods, completely resolving the residual fake player issue.
- Full Leaf Fork Compatibility: Adapted to Leaf’s special CraftServer#getServer() return logic, ensuring removal commands work normally on all Leaf versions.
- Iterative Optimization Based on Build5: Inherits all Build5 fixes, including Leaf spawn exception fixes and CommandAPI 12.0.0 adaptation, for more stable overall performance.
Critical Fixes - Fixed fake players cannot be completely removed (Issue #3): Traditional Player.kick() is a no-op for custom NetworkManager-injected fake players. The old logic only cleared internal plugin records but did not disconnect server-side entities. The new cleanup process calls NMS native PlayerList.remove(ServerPlayer) to permanently deregister fake player entities from the server. Fully compatible with Leaf forks that directly return PlayerList via CraftServer#getServer().
- Inherited Build5 Compatibility Fix: Resolved ClassCastException when executing/fp spawn on Leaf 1.21.11 / 26.2, fixing the type conversion error between DedicatedPlayerList and MinecraftServer.
Important Notes - Vanilla native /kick command cannot affect fake players by design, as fake players do not occupy real server connections.
- Please use the dedicated plugin commands /fp kill or /fp killall to remove fake player entities.
Usage - Java: 21+ (Java 25 recommended for 26.x support)
- Server: Paper / Leaf 1.20.1+ (Purpur compatible)
- API: CommandAPI 12.0.0+ (Mandatory dependency)
Credits - CE Maintenance: @EndlessPixel
FakePlayer-CE.Build6 —— 假人彻底移除修复与 Leaf 兼容性完善
假人实体彻底移除修复、全版本 Leaf 分支兼容优化
本次更新修复了假人无法从服务器彻底删除的核心问题,全面重构假人清理逻辑,完善对全系现代 Leaf 服务端分支的适配,并继承 Build5 所有稳定性修复内容。
核心特性
- 假人彻底移除机制:全面改版假人清理逻辑,通过 NMS 原生方法从服务端注销假人实体,彻底解决假人残留、无法删除的问题。
- 全量 Leaf 分支兼容:适配 Leaf 服务端 CraftServer#getServer() 特殊返回逻辑,确保假人删除指令在所有 Leaf 版本正常生效。
- 迭代继承 Build5 修复:完整保留 Build5 所有修复内容,包含 Leaf 假人生成异常修复、CommandAPI 12.0.0 适配,整体运行更稳定。
关键修复 - 修复假人无法彻底移除问题(Issue #3):插件假人通过自定义 NetworkManager注入服务端,原生 Player.kick() 对假人连接为空操作。旧版逻辑仅清空插件内部记录,未真正断开服务端实体。新版清理流程调用 NMS 原生 PlayerList.remove(ServerPlayer),可从服务器彻底注销假人实体,同时完美适配 CraftServer#getServer() 直接返回PlayerList 的 Leaf 分支服务端。
- 继承 Build5 兼容性修复:解决 Leaf 1.21.11 / 26.2 版本中,执行 /fp spawn 出现的类型转换异常,修复 DedicatedPlayerList 无法转换为 MinecraftServer 的报错。
重要说明 - 服务端原版 /kick 指令对假人无效,属于设计特性,原因是假人并非真实客户端连接。
- 移除假人请使用插件专属指令:/fp kill(移除单个假人)或 /fp killall(移除所有假人)。
使用要求 - Java: 21+(26.x 服务端推荐使用 Java 25)
- 服务端: Paper / Leaf 1.20.1+(兼容 Purpur 服务端)
- 前置依赖: CommandAPI 12.0.0 及以上(必需前置)
鸣谢 - CE 维护: @EndlessPixel
FakePlayer-CE.Build5
FakePlayer-CE.Build5
Loader & Spawn Compatibility: CommandAPI 12, Adventure 4.x & Leaf Forks
This release makes FakePlayer-CE load and spawn correctly on modern Leaf/Paper forks. It upgrades to CommandAPI 12.0.0, shades a self-contained adventure copy (fixing the UTF8ResourceBundleControl startup crash), and fixes a ClassCastException that broke /fp spawn on Leaf 1.21.11 / 26.2.
Highlights
- CommandAPI 12.0.0 Support: Updated command argument construction to the new
Argument(String, ArgumentType)signature. - Self-Contained Adventure:
adventure-api/adventure-text-minimessageare now shaded into the plugin (previouslycompileOnly), so the plugin no longer relies on the server's adventure copy. - Leaf Spawn Fix:
/fp spawnno longer throwsClassCastExceptionon Leaf forks whoseCraftServer#getServer()returns the player list instead of theMinecraftServer.
Critical Fixes
- Fixed Startup
NoClassDefFoundError(Leaf 26.2 + CommandAPI 12.0.0): adventure 4.17 removednet.kyori.adventure.util.UTF8ResourceBundleControl, which devtools still references, and the server's adventure copy is not visible to the plugin classloader. Added a self-containedUTF8ResourceBundleControl(pure JDKResourceBundle.Control, UTF-8 properties) and changed adventure dependencies toimplementationso the plugin shades its own copy. - Fixed
ClassCastExceptionon/fp spawn(Leaf 1.21.11 / 26.2):Reflections.getServer()calledCraftServer.getServer(), which on Leaf forks returns theDedicatedPlayerListrather than theMinecraftServer, causingDedicatedPlayerList cannot be cast to MinecraftServeratNMSServerImpl.<init>. AddedReflections.getMinecraftServer(server, mcServerClass)which resolves theMinecraftServervia its exact-typedconsolefield and only falls back togetServer()when no such field exists. Verified locally:/fp spawncreates a fake player correctly on Leaf 26.2 + CommandAPI 12.0.0.
Usage
- Java: 21+ (Java 25 recommended for 26.x support)
- Server: Paper / Leaf 1.20.1+ (Purpur compatible)
- API: CommandAPI 12.0.0+
Credits
- CE Maintenance: @EndlessPixel
FakePlayer-CE.Build5 —— 加载与生成兼容:CommandAPI 12、Adventure 4.x 与 Leaf 分支
本次更新让 FakePlayer-CE 能在现代的 Leaf / Paper 分支上正常加载并生成假人。我们升级到 CommandAPI 12.0.0,将 adventure 以自包含方式打包(修复 UTF8ResourceBundleControl 启动崩溃),并修复了在 Leaf 1.21.11 / 26.2 上导致 /fp spawn 失败的 ClassCastException。
核心特性
- 支持 CommandAPI 12.0.0:命令参数构造已更新为新的
Argument(String, ArgumentType)签名。 - 自包含 adventure:
adventure-api/adventure-text-minimessage现在被打包进插件(此前为compileOnly),不再依赖服务端自带的 adventure。 - 修复 Leaf 生成崩溃:在
CraftServer#getServer()返回玩家列表而非MinecraftServer的 Leaf 分支上,/fp spawn不再抛出ClassCastException。
关键修复
- 修复启动
NoClassDefFoundError(Leaf 26.2 + CommandAPI 12.0.0):adventure 4.17 移除了net.kyori.adventure.util.UTF8ResourceBundleControl,而 devtools 仍引用该类,且服务端自带的 adventure 对插件类加载器不可见。新增自包含的UTF8ResourceBundleControl(纯 JDKResourceBundle.Control,UTF-8 读取 properties),并将 adventure 依赖改为implementation打包进插件。 - 修复
/fp spawn的ClassCastException(Leaf 1.21.11 / 26.2):Reflections.getServer()调用CraftServer.getServer(),在 Leaf 分支上该方法返回的是DedicatedPlayerList而非MinecraftServer,导致在NMSServerImpl.<init>处报DedicatedPlayerList cannot be cast to MinecraftServer。新增Reflections.getMinecraftServer(server, mcServerClass),优先按精确类型反射CraftServer上的console字段获取MinecraftServer,仅当找不到该字段时才回退到getServer()。本地实测:在 Leaf 26.2 + CommandAPI 12.0.0 上/fp spawn已能正确创建假人。
使用要求
- Java: 21+ (推荐 Java 25 以支持 26.x)
- 服务端: Paper / Leaf 1.20.1+ (兼容 Purpur)
- API: CommandAPI 12.0.0+
鸣谢
- CE 维护: @EndlessPixel
FakePlayer-CE.Build4
FakePlayer-CE.Build4
Interaction & Stability: Replenish, Live Config & Loader Compatibility
This release fixes long-standing Fakeplayer quirks: tools now auto-repair under replenish, config changes apply immediately to online Fakeplayers, and Mohist loading no longer crashes. We also hardened the look/movement logic against remapped server implementations.
Highlights
- Live Config Applied Instantly: Changing
/fp config(e.g. invulnerable, collidable, pickup_items) now takes effect on already-online Fakeplayers without respawn. - Tool Auto-Repair: Replenish now periodically repairs worn tools whose durability drops (previously only event-triggered consumables were refilled).
- Mohist Compatibility: Removed direct dependency on
io.papermc.paper.entity.LookAnchor, eliminatingNoClassDefFoundErroron remapped (Mohist) servers.
Critical Fixes
- Fixed Invincible Fakeplayers (#178, #181, #199):
setFeaturepreviously only persisted to DB and never re-applied modifiers to live Fakeplayers, soinvulnerable falsehad no effect. Now saved changes are pushed to the creator's online Fakeplayers immediately. - Fixed Tools Not Replenished (#195): Tools wear via durability loss, which fires no refill event. Added a periodic check (
replenish.tools.durability-thresholdinconfig.yml, 0–100% wear, default off) that repairs held items once worn past the threshold. - Fixed Mohist Load Crash (#200):
LookAtEntityActionandRotationCommandreferencedio.papermc.paper.entity.LookAnchor, which Mohist remaps and fails to find. Replaced with pure NMS angle calculation (LookUtils), noio.papermcdependency at load time.
Usage
- Java: 21+ (Java 25 recommended for 26.x support)
- Server: Paper 1.20.1+ (Purpur compatible)
- API: CommandAPI 11.1.0+
Credits
- CE Maintenance: @EndlessPixel
FakePlayer-CE.Build4 —— 交互与稳定性:自动补货、实时配置与加载兼容
本次更新修复了多个长期存在的假人问题:自动补货现在会修复磨损的工具,配置修改会立即作用于在线假人,并且 Mohist 端加载不再崩溃。同时强化了朝向/移动逻辑以兼容被重映射的服务端实现。
核心特性
- 配置实时生效:修改
/fp config(如无敌、可碰撞、拾取物品)现在会立即作用于已经在线(spawned)的假人,无需重新生成。 - 工具自动修复:开启自动补货后,会周期性修复耐久下降的工具(此前仅补充由事件触发的消耗品)。
- Mohist 兼容:移除了对
io.papermc.paper.entity.LookAnchor的直接依赖,消除在 Mohist 等重映射服务端上的NoClassDefFoundError。
关键修复
- 修复假人无法取消无敌(#178, #181, #199):
setFeature此前只写入数据库、不会把 modifier 重新应用到在线假人,导致invulnerable false不生效。现在保存后会立即将变更推送给该创造者的在线假人。 - 修复工具不被补货(#195):工具靠耐久磨损消耗,而磨损不触发任何补货事件。新增周期性检查(在
config.yml配置replenish.tools.durability-threshold,0–100% 磨损阈值,默认关闭),磨损超过阈值时自动修复手中物品。 - 修复 Mohist 加载崩溃(#200):
LookAtEntityAction与RotationCommand引用了io.papermc.paper.entity.LookAnchor,Mohist 会重映射该类导致其找不到。改用纯 NMS 角度计算(LookUtils),加载时不依赖io.papermc。
使用要求
- Java: 21+ (推荐 Java 25 以支持 26.x)
- 服务端: Paper 1.20.1+ (兼容 Purpur)
- API: CommandAPI 11.1.0+
鸣谢
- CE 维护: @EndlessPixel
FakePlayer-CE.Build3
FakePlayer-CE.Build3
Stabilizing the Core: NMS Lifecycle & Interaction Fixes
This release focuses on internal stability, fixing critical crashes during plugin reloads and enhancing NMS compatibility for the latest Minecraft versions. We also introduced a new interaction command for Fakeplayers.
Highlights
- New
/fp sayCommand: Fakeplayers can now send chat messages directly via NMS network packets. - NMS Stability: Fixed lifecycle management issues, preventing crashes during
/reloador plugin disabling. - Slim & Efficient: Continued use of ShadowJar to ensure a lightweight build (~500KB).
Critical Fixes
- Fixed Chat Method Signature: Adapted to the new API by adding the missing
lastSeenMessagesparameter, resolvingNoSuchMethodErrorin newer versions. - Fixed Plugin Reload Crashes: Implemented graceful shutdown logic to unregister commands and clean up resources, preventing
IllegalPluginAccessException. - Fixed NMS Packet Handling: Refined
ClientboundRespawnPacketand motion packet handling for better cross-version compatibility (1.20.1 - 26.2). - Fixed BungeeCord Channel: Corrected plugin message channel validation to ensure compatibility with proxy networks.
Usage
- Java: 21+ (Java 25 recommended for 26.x support)
- Server: Paper 1.20.1+ (Purpur compatible)
- API: CommandAPI 11.1.0+
️ Credits
- CE Maintenance: @EndlessPixel
- NMS Patches: @ifloppy (for lifecycle stability fixes)
FakePlayer-CE.Build3 —— 核心稳固:NMS 生命周期与交互修复
本次更新专注于内部稳定性,修复了插件重载时的关键崩溃问题,并增强了针对最新 Minecraft 版本的 NMS 兼容性。同时,我们为假人引入了全新的交互指令。
核心特性
- 新增
/fp say命令:假人现在可以通过 NMS 网络包直接发送聊天消息。 - NMS 稳定性提升:修复了生命周期管理问题,防止在执行
/reload或禁用插件时发生崩溃。 - 轻量高效:继续使用 ShadowJar 构建,保持极致轻量的体积 (~500KB)。
关键修复
- 修复聊天方法签名不匹配:适配新版 API,补充了缺失的
lastSeenMessages参数,解决了新版服务端报错的问题。 - 修复插件重载崩溃:实现了优雅停机逻辑,正确注销命令并清理资源,防止出现
IllegalPluginAccessException。 - 修复 NMS 数据包处理:优化了
ClientboundRespawnPacket和实体运动包的处理逻辑,提升跨版本兼容性 (1.20.1 - 26.2)。 - 修复 BungeeCord 通道问题:修正了插件消息通道的校验逻辑,确保在代理网络环境下的兼容性。
使用要求
- Java: 21+ (推荐 Java 25 以支持 26.x)
- 服务端: Paper 1.20.1+ (兼容 Purpur)
- API: CommandAPI 11.1.0+
️ 鸣谢
- CE 维护: @EndlessPixel
- NMS 补丁: @ifloppy (贡献了生命周期稳定性修复)