错误修复
- 已移除 ByNameExecutor 中的调试日志
- 执行 dash 技能会让同一世界中的所有人都听到激活音效。
完整更新日志: https://github.com/NiFeather/FeatherMorph/compare/2.8.0...2.8.1
新功能
- 现在在进行伪装时会显示当前伪装的图标
- 带有
feathermorph_nogrant标签的实体现在在被击杀时,不会再为玩家解锁对应的伪装。 - 现在可以使用
/fm extract language <lang>命令导出内置语言文件- 此命令所需权限为
feathermorph.admin。 - 如果磁盘上已经有匹配的文件,导出的文件默认会安装到
messages/<lang>.fmnew.json - 你可以使用
/fm extract language <lang> true进行覆盖。此操作需要你再次执行该命令来确认
- 此命令所需权限为
- 现在为人体模型触发 Interaction Mirror 时,玩家需要拥有触发 Interaction Mirror 的权限
- Instance Network 中的从节点现在会在玩家加入时为其请求数据,而不是由主服务器在启动时加载并将所有数据同步到从节点。
- 现在可以在
PlayerUnMorphEvent中获取对应的DisguiseState实例。 - 第三方插件现在可以在引导阶段将它们的
SingleProperty实例添加到DisguiseProperties中,从而支持根据玩家输入自动赋值。 - 新增对 Zombie Nautilus 变体属性的支持。
- 现在
DisguiseProperty的实例可以声明自己对客户端模组不可见- FeatherMorph 目前还没有需要此功能的属性;这主要是为其他插件的开发准备的。
- 为 InputHandles 新增了
readString方法。 - 如果异常发生在更新过程中,或已被转发到
DisguiseState,插件现在会尝试显示该异常的消息。 - 将 Instance Network 中异步加载玩家数据的能力带到了
IManagePlayerData。- 目前只有在启用 Instance Network,且当前服务器是网络中的从服务器时,异步加载功能才会被完整利用。
- 如果支持该功能,当玩家进入配置状态时,插件会尝试异步加载其数据,并为每名玩家最多等待 150ms;超时后仍允许其继续登录,并在数据加载完成后通知其客户端。
最多等待 150ms 是为了确保在性能较好的机器上,玩家登录后立刻就能使用伪装解锁数据。而且这个等待机制可能会在下一个(编辑:下一个或未来的)版本中移除,因为它从字面意义上就和 async 的概念相冲突…… 🤯\- 从服务器现在不再为主服务器响应我们的查询请求最多等待 150ms
- 为 Nautilus 和 Zombie Nautilus 新增能力
- 伪装成 Nautilus 现在会让玩家获得水下呼吸能力,并在空气中逐渐干枯
- 伪装成 Zombie Nautilus 时,如果没有装备头盔,玩家还会在阳光下燃烧。
- 新增 Dash 技能
- 伪装成 Camel/Camel Husk 现在可以在地面上或水下冲刺
- 伪装成 Nautilus/Zombie Nautilus 现在可以在水下冲刺
- backport:允许服务器通过配置禁用伪装路标点
Bug 修复
- 从
1.21.11/feature-next分支回移植了一项变通修复,以防止错误的组件输入被应用并导致正在查看的玩家被踢出服务器- 不过我也不确定这个问题是否应该归类到 FeatherMorph……
- 修复了一个回归问题:当面对其他伪装成另一名玩家的人时,尝试伪装成某个玩家会复制对方的属性,而无视伪装目标是否相同。
- 修复了检查当前代码是否运行在某个实体的 tick 线程上时可能出现的错误。
- 现在当目标人体模型没有描述时,人体模型伪装的描述属性也会被正确设置
- 修复了在丢弃/缓存皮肤后,SkinStorage 的缓存不会更新的问题
- 修复了一个回归问题:使用
by_name选择器时,已伪装玩家仍然会被选为 Interaction Mirror 目标。 - 修复了一个回归问题:如果控制玩家伪装成了与目标相同的玩家,则已伪装玩家无法被选为 Interaction Mirror 目标。
- 修复了初始技能配置设置后,Package Version 未被保存的问题
其他
- 移除了
feathermorph.disguise_use_real_uuid权限的使用 - 服务器关闭时,当前激活的伪装现在会保存到磁盘
- Offline Disguise 现在会保存伪装属性
- Skin Storage 和 Offline Disguise Storage 现在改为基于目录的存储。
- 这大幅提升了在存储大量数据时对单个皮肤/伪装进行读写的性能。
- 我们会尝试迁移先前存储的皮肤;而离线伪装不会被迁移,因为我们没有从 NBT -> Disguise Properties 的转换方法。
- 人体模型现在会被 Interaction Mirror Executors 正常选中,而不再被当作特殊对象处理。
by_sight镜像模式现在会遵守配置中设置的最大影响距离- 现在可使用 Gradle 任务
runFolia - 伪装的 actionbar 消息现在由
DisguiseState处理。 InputHandles中的readRotations现在会在玩家提供超过 3 个元素时报错- 这意味着,对于装备架伪装的各种旋转属性,若提供超过 3 个元素,现在会显示错误消息。
- 将配置定义从插件自身的
ConfigOption枚举迁移到了 PluginBase 的ConfigOption类 - 简化了部分位置的异常处理。
- 语言文件中的消息
morph.error_while_disguising_user_fault已重命名为morph.error_parsing_property。 - 为适配新的
IManagePlayerData#loadPlayerDataAsync方法,批量处理玩家数据请求的间隔已从 10 tick 改为 2 tick - 插件现在会根据服务器规格检查
Paper或Folia平台更新。 - Offline Disguises 现在改名为 Saved Disguises
变更内容
- 由 @MATRIX-feather 在 https://github.com/NiFeather/FeatherMorph/pull/61 中将 2.8.0 从 1.21.11/feature 合并
完整更新日志:https://github.com/NiFeather/FeatherMorph/compare/2.5.2...2.8.0
2.8.0-rc.6
on 2026 Mar 25Bug 修复
- 初始技能配置设置后,包版本未被保存
完整更新日志: https://github.com/NiFeather/FeatherMorph/compare/2.8.0-rc.5...2.8.0-rc.6
2.8.0-rc.5
on 2026 Mar 08新功能
- 向后移植:允许服务器通过配置禁用伪装航点
其他
- 已将 2.8.0 合并到
1.21.11/main- 由 @MATRIX-feather 在 https://github.com/NiFeather/FeatherMorph/pull/61 将来自 1.21.11/feature 的 2.8.0 合并
完整更新日志:https://github.com/NiFeather/FeatherMorph/compare/2.8.0-rc.3...2.8.0-rc.5
2.8.0-rc.3
on 2026 Feb 28所以我又回来更新这个资源了,因为我仍然希望在即将到来的 26.1 及后续版本中,将它用在我和朋友们一起玩的小型服务器上。😄
问题修复
- 修复了 SkinStorage 的缓存在丢弃/缓存皮肤后未更新的问题
- 修复了一个回归问题:当面向其他伪装成其他玩家的玩家时尝试伪装成某玩家,可能会复制对方的属性,而忽略了伪装目标是否相同
- 修复了一个回归问题:使用
by_name选择器时,伪装后的玩家仍可能被选为交互镜像的目标 - 修复了一个回归问题:如果控制玩家伪装成了与目标玩家相同的玩家,则该伪装玩家无法被选为交互镜像的目标
其他
- 从
1.21.11/feature-next分支向后移植了一个临时解决方案,以防止错误的组件输入被应用并导致查看玩家被踢出服务器- 不确定这个问题是否应该归入 FeatherMorph 的待处理事项……
完整更新日志:https://github.com/NiFeather/FeatherMorph/compare/2.8.0-beta.4...2.8.0-rc.3
2.8.0-rc.1
on 2026 Feb 17Bug Fix
- Mannequin disguises' description property is now correctly set up when the target mannequin does not have a description
Other
- Removed usage of
feathermorph.disguise_use_real_uuidpermission - Active disguises will now save to disk when the server shuts down
- For slave servers in the instance network, we no longer wait for up to 150ms for the master server to respond to our lookup request
- Offline Disguise now saves disguise properties
- Skin Storage and Offline Disguise Storage are now directory-based.
- This improves performance a lot when we read/write for a single skin/disguise, especially when there's a large amount of data stored.
- We will try to migrate previously stored skins; offline disguises will not get migrated, as we don't have a NBT -> Disguise Properties convertion exists.
- Plugin now checks for
PaperorFoliaplatform for update, depending on the server spec. - Offline Disguises is now called Saved Disguises
2.8.0-beta.4
on 2025 Dec 20这是一个基于 1.21.11/feature 的构建。
我们建议所有使用 1.21.11/feature 分支并启用了实例网络功能的用户,在所有从服务器上更新到此版本。
修复内容
- 实例网络:从服务器在应用来自主服务器的同步数据前未清除现有数据
- 此问题还可能引发另一个问题,即发送给玩家的字符串命令过大
- 此问题不影响
1.21.11/main分支的构建,因为它们不包含部分同步功能
- 在 Folia 上伪装时有极小概率失败,错误信息为
... this.revealingHandler is null.
完整更新日志: https://github.com/NiFeather/FeatherMorph/compare/2.8.0-beta.2...2.8.0-beta.4
2.6.0-alpha.4
on 2025 Dec 20这是基于 1.21.10/feature 的构建。
我们建议使用 1.21.10/feature 分支并启用实例网络功能的所有从服务器更新到此版本。
新功能
- 假装装备技能已扩展至更多生物
修复内容
- 实例网络:从服务器在应用来自主服务器的同步数据前未清理现有数据
- 此问题还可能引发另一个问题,即发送给玩家的字符串命令过大
- 此问题不影响
1.21.10/main分支的构建,因为它们不包含部分同步功能
完整变更日志: https://github.com/NiFeather/FeatherMorph/compare/2.6.0-alpha.3...2.6.0-alpha.4
2.8.0-beta.2
on 2025 Dec 17新增特性
- 为鹦鹉螺和僵尸鹦鹉螺添加能力
- 变形为鹦鹉螺现在会使玩家获得水下呼吸效果,并在空气中脱水
- 变形为僵尸鹦鹉螺还会使玩家在未装备头盔时于阳光下燃烧
- 添加冲刺技能
- 变形为骆驼/荒漠骆驼现在可在地面或水下冲刺
- 变形为鹦鹉螺/僵尸鹦鹉螺现在可在水下冲刺
修复问题
- 修复了检查当前代码是否运行在实体tick线程时可能发生的错误
完整更新日志: https://github.com/NiFeather/FeatherMorph/compare/2.8.0-alpha.2...2.8.0-beta.2
修复
- 修复了在检查当前代码是否处于实体的tick线程时可能出现的错误。
完整更新日志: https://github.com/NiFeather/FeatherMorph/compare/2.7.0...2.7.1
2.8.0-alpha.2
on 2025 Dec 11修复内容
- 修复在控制台中,每当调用伪装文本图标时,调试信息
Text icon for <...> is <...>会大量刷屏的问题
完整更新日志: https://github.com/NiFeather/FeatherMorph/compare/2.8.0-alpha.1...2.8.0-alpha.2
2.6.0-alpha.3
on 2025 Dec 10新特性
- 现在
DisguiseProperty的实例可以声明其对客户端模组不可见- FeatherMorph 目前尚无需要此功能的属性;该功能主要为其他插件开发准备。
- 为
InputHandles添加了readString方法。 - 当更新期间发生异常或异常被转发至
DisguiseState时,插件现在会尝试显示异常消息。 - 将异步玩家数据加载能力引入 Instance Network 的
IManagePlayerData。- 目前仅当启用 Instance Network 且当前服务器为网络中的从属服务器(Slave Server)时,才会完全使用异步加载功能。
- 若支持,当玩家进入配置状态时,插件将尝试异步加载其数据,并最多等待每名玩家 150 毫秒;超时后允许其继续登录,并在玩家数据加载完成时通知其客户端。
- 我们设置最多 150 毫秒的等待时间,是为了确保在快速机器上伪装解锁数据能在玩家登录后立即可用。
- 并且这个等待功能可能在下一个(编辑:下一个或未来的版本)中被移除,因为它实际上与 异步 概念冲突…… 🤯
其他
- 简化了部分位置的异常处理。
- 语言文件中的消息
morph.error_while_disguising_user_fault已重命名为morph.error_parsing_property。 - 批量处理玩家数据请求的间隔已从 10 ticks 调整为 2 ticks,以适配新的
IManagePlayerData#loadPlayerDataAsync方法。
完整更新日志: https://github.com/NiFeather/FeatherMorph/compare/2.6.0-alpha.2...2.6.0-alpha.3
2.8.0-alpha.1
on 2025 Dec 10这是 1.21.11/feature 分支的一次发布。
新特性
- [2.7.0] 添加了新的调试命令
/debugForValue,用于列出指定值集合中所有已注册的SingleValue。 - 增加对 Zombie Nautilus 变体属性的支持。
其他更新
- [2.7.0] 现在支持 1.21.11
- [2.7.0] 将 PacketEvents 升级至 2.11.0
- [2.7.0] 添加了一项临时解决方案,避免发送数据量过大的数据包。
- 这可以防止在尝试发送大量可用伪装或伪装数据时抛出异常。
- 目前尚无彻底解决此问题的方法,因此暂时不进行列表同步。玩家仍可通过
/morph命令选择伪装,其他功能也依然可用……除非数据仍然超出限制。
完整更新日志: https://github.com/NiFeather/FeatherMorph/compare/2.6.0-alpha.3...2.8.0-alpha.1
这是 1.21.11/main 分支的一次发布。有关即将推出的新特性,请参见 https://github.com/NiFeather/FeatherMorph/pull/61
新特性
- 新增调试指令
/debugForValue,用于列出指定值集合中所有已注册的SingleValue。
其他
- 现在支持 1.21.11
- 升级 PacketEvents 至 2.11.0
- 添加了一项规避措施:当数据体过大时不再发送数据包。
- 这可以防止在尝试发送大量可用伪装或庞大伪装数据时抛出异常。
- 目前尚不清楚如何彻底解决此问题,因此暂不同步该列表。玩家仍可通过
/morph指令选择伪装,其他功能也依然可用……除非数据仍然超出限制。
完整更新日志: https://github.com/NiFeather/FeatherMorph/compare/2.5.2...2.7.0
2.6.0-alpha.2
on 2025 Dec 04新特性
- 现在对模特使用交互镜子也需要玩家拥有正常的交互镜子权限
- 在新安装的实例中,默认会在快捷栏上方显示当前伪装的图标
- 击杀带有
feathermorph_nogrant标签的生物将不再为玩家解锁相关伪装 - 重构了插件向玩家发送消息的方式
- 现在可以使用
/fm extract language <lang>命令提取内置语言文件- 该命令的权限为
feathermorph.admin。 - 如果磁盘上已存在匹配的文件,默认会将提取的文件安装到
messages/<lang>.fmnew.json - 您可以通过使用
/fm extract language <lang> true来覆盖原文件,此操作需要再次执行以确认
- 该命令的权限为
- 实例网络中的从机现在在玩家加入时请求玩家数据,而不是主服务器在启动时加载并将所有数据同步到从机
- 现在可以在
PlayerUnMorphEvent中获取相关的DisguiseState实例 - 第三方插件现在能够在启动时将其
SingleProperty实例添加到DisguiseProperties,从而允许从玩家输入中自动分配
其他
- 模特现在会被交互镜子执行者正常选择,而不再被视为特殊对象
by_sight镜子模式现在会遵守配置文件中设置的最大影响距离- Gradle 任务
runFolia现已可用 - 伪装的快捷栏上方消息现在由
DisguiseState处理 - InputHandles 中的
readRotations在玩家提供超过 3 个元素时会抛出错误- 这意味着为盔甲架伪装的各种旋转属性提供超过 3 个元素时将导致错误消息
- 配置定义已从插件自身的
ConfigOption枚举迁移到 PluginBase 的ConfigOption类
完整更新日志: https://github.com/NiFeather/FeatherMorph/compare/2.5.2...2.6.0-alpha.2
这是 2.5 系列的一个维护版本。有关即将推出的新功能,请参见 2.6 alpha:https://github.com/NiFeather/FeatherMorph/pull/59
错误修复
- 附加击退能力在 Y 轴运动变化时始终增加 0.345584025,且不会对 X 和 Z 轴运动变化应用击退抗性。
- 当绑定的玩家退出时,伪装信标点未被移除的问题。
- 使
MorphBasicAvoidPlayerGoal在需要回避的玩家处于不同世界时忽略执行。- 此更改修复了在某些异常情况下 AI 抛出错误的问题。
其他
- 处理
MIC2SLoginCommand中无效的协议层级
完整更新日志:https://github.com/NiFeather/FeatherMorph/compare/2.5.1...2.5.2
从2025/11/3(YYYY/MM/DD)起,我们将1.21.10分支拆分为1.21.10/main和1.21.10/feature。
如果您在此之前克隆了仓库,请在拉取更新前删除本地存储的1.21.10分支!
2.5.1 版本变更
错误修复
entity/equipment输入为空时会导致未处理的异常
2.5.0 版本变更
新功能
- 现在玩家可以保存他们的伪装,并应用本地存储的伪装
- 这要求玩家使用客户端模组 0.16.0-beta.5 或更高版本!
- 为
entity/custom_name、mannequin/description和mannequin/hide_description属性添加权限feathermorph.custom_text,默认对玩家开放 - 添加用于使用伪装属性的权限:
feathermorph.disguise_properties.use - 添加用于为
entity/equipment属性中的物品设置自定义皮肤配置文件的权限,默认仅限管理员:feathermorph.disguise_properties.custom_skin_on_items - 添加对 模特 伪装的支持
- 默认情况下,无法使用 魔法瓶 收集 模特 伪装
- 模特 伪装具有与盔甲架和玩家伪装相同的 仿制装备 技能
mannequin/skin属性默认仅限管理员使用。您可为玩家授予feathermorph.custom_skin权限以启用该功能
- 添加对 铜傀儡 伪装的支持
- 默认情况下,可使用 魔法瓶 收集 铜傀儡 伪装
- 为铜傀儡伪装添加天气状态属性
- 初步兼容(?) Ping Wheel
- 使用官方 Ping Wheel 插件 可以正常工作,但在伪装状态下标记不会隐藏标记者身份
- ……因此我制作了一个自定义插件来临时解决此问题,可在 https://github.com/MATRIX-feather/pingwheel-plugin-forked 找到
- 初步支持拥有
feathermorph.mirror.mannequin权限的玩家将其潜行动作同步至与其伪装同名且描述相同的模特- 对于 BY_NAME 执行器,会选择范围内的模特,将影响距离设为 -1 可禁用范围限制
- 对于 BY_SIGHT 和 BY_RANGE,将在视线5格范围内选择目标模特
错误修复
- 当授予
feathermorph.disguise_use_real_uuid权限时,玩家伪装存在多个问题- 取消伪装时玩家会从TAB列表中消失
- 从远处传送或从旁观模式切换游戏模式时伪装不显示
slime_magma/size属性的随机范围错误- 覆盖方法中无人调用
BaseLivingEntityProperties#setupPropertiesFromEntity- 导致具有额外属性的伪装无法复制目标实体的自定义名称
其他
- 我们计划未来移除 BY_RANGE 镜像执行器,因其在网络状况不佳的玩家中引发混乱
- 现在部分抛出的异常将转发至 DisguiseState 并导致玩家取消伪装
- 调整了服务器渲染器重建从服务器发送的实体元数据包的方式
- 移除了伪装 NBT 黑名单配置
- 因其已不再使用
entity/custom_name和mannequin/description现在接受以{开头的 JSON 文本组件- 将部分伪装验证移至伪装准备早期阶段
2.5.0-rc.5
on 2025 Nov 12从2025/11/3(YYYY/MM/DD)开始,我们将1.21.10分支拆分为1.21.10/main和1.21.10/feature。
如果您在此之前已克隆了仓库,请在拉取更新前删除本地存储的1.21.10分支!
修复内容
- 为
ResolvableProfile添加了SkinPatch支持,修复了部分皮肤设置在客户端无法正确显示的问题。 - 明确声明
MorphResolvableProfileStruct是否正在呈现动态的ResolvableProfile,修复了部分皮肤在客户端无法显示的问题。- 上述两项修复要求玩家将客户端模组更新至
0.16.0-beta.6!
- 上述两项修复要求玩家将客户端模组更新至
entity/custom_name现在始终从目标实体复制,不再忽略实体类型- 在覆写方法中无人调用
BaseLivingEntityProperties#setupPropertiesFromEntity- 这导致具有额外属性的伪装形态无法复制目标实体的自定义名称。
完整更新日志:https://github.com/NiFeather/FeatherMorph/compare/2.5.0-rc.4...2.5.0-rc.5
从 2025/11/3(YYYY/MM/DD)起,我们将 1.21.10 分支拆分为 1.21.10/main 和 1.21.10/feature。
如果你在此日期前已克隆过仓库,请在拉取更新前删除本地存储的 1.21.10 分支!
修复
- 修复了当玩家语言环境为 "en_US" 而非 "en_us" 时导致的堆栈溢出(StackOverflow)问题
完整变更日志: https://github.com/NiFeather/FeatherMorph/compare/2.4.5...2.4.6
2.5.0-rc.3
on 2025 Nov 05修复
- 在之前的 2.5.0 beta 版本中,伪装有时会报告无法更新,并可能导致附近玩家因协议错误而断开连接
其他
- 捕获解析客户端
entity/equipment输入时的 JSON 错误,并将其包装为 ParseErrorException,以告知玩家数据格式不正确
完整更新日志: https://github.com/NiFeather/FeatherMorph/compare/2.5.0-rc.2...2.5.0-rc.3



