All Mods Resource Packs Data Packs Shaders Modpacks Plugins
FeatherMorph

FeatherMorph

by MATRIX-feather • Downloads: 0 • Followers: 0
Description
Gallery
Changelog
Versions

Archived, feel free to fork, although I would suggest making your own, as there aren't many documents about this project :D

cover

A morph plugin for survival servers

GH Actions Latest Release

Client Integration | Wiki (WIP) | 中文介绍

Features

  • Simple and easy to use

  • Implemented disguise abilities and skills covering most of the vanilla features

  • Change players' bounding box depending on their disguise ( !!!REQUIRES CLIENT INTEGRATION MOD!!! )

  • Enhance experiences with Client Integration

    • Currently: GUI disguise selection, action hotkeys, see your disguise on the client side, and see other's disguise if the server doesn't support displaying disguise on their side
  • Translatable messages with MiniMessage support (Check our Wiki for more information!)

  • ChatOverride - Masks away your name when chatting, available for player disguises

  • InteractionMirror - Make another player do the same thing as you did when disguising as them

Dependencies

  • To run this plugin, you will need: A Paper or Paper-based server
  • These are required to display disguises on the server side:

bStats

bStats

All Versions

+ Add Version
Name Game version Platforms Published Downloads Actions
1.21.11
Folia Paper
22h ago 1
1.21.11
Folia Paper
22h ago 1
1.21.11
Folia Paper
22h ago 1
1.21.11
Folia Paper
22h ago 1
1.21.11
Folia Paper
22h ago 1
1.21.11
Folia Paper
22h ago 1
1.21.11
Folia Paper
22h ago 1
1.21.10
Paper
22h ago 1
1.21.11
Folia Paper
22h ago 1
1.21.11
Folia Paper
22h ago 1
1.21.11
Paper
22h ago 1
1.21.10
Paper
22h ago 1
1.21.11
Paper
22h ago 1
1.21.11
Paper
22h ago 1
1.21.10
Paper
22h ago 1
1.21.10
Paper
22h ago 1
1.21.10
Paper
22h ago 1
1.21.10
Paper
22h ago 1
1.21.8
Folia Paper
22h ago 1
1.21.10
Paper
22h ago 1
1.21.10
Paper
22h ago 1
1.21.8
Folia Paper
22h ago 1
1.21.10
Paper
22h ago 1
1.21.10
Paper
22h ago 1
1.21.8
Paper
22h ago 1
1.21.10
Paper
22h ago 1
1.21.9
Paper
22h ago 1
1.21.9
Paper
22h ago 1
1.21.8
Folia Paper
22h ago 1
1.21.8
Folia Paper
22h ago 1
1.21.8
Folia Paper
22h ago 1
1.21.8
Folia Paper
22h ago 1
1.21.8
Folia Paper
22h ago 1
1.21.8
Folia Paper
22h ago 1
1.21.4
Folia Paper
22h ago 1
1.21.8
Folia Paper
22h ago 1
1.21.8
Folia Paper
22h ago 1
1.21.8
Folia Paper
22h ago 1
1.21.7
Folia Paper
22h ago 1
1.21.4
Folia Paper
22h ago 1
1.21.7
Folia Paper
22h ago 1
1.21.6
Folia Paper
22h ago 1
1.21.4
Folia Paper
22h ago 1
1.21.5
Folia Paper
22h ago 1
1.21.4
Folia Paper
22h ago 1
1.21.5
Folia Paper
22h ago 1
1.21.4
Folia Paper
22h ago 1
1.21.5
Paper
22h ago 1
1.21.4
Folia Paper
22h ago 1
1.21.5
Paper
22h ago 1
1.21.5
Paper
22h ago 1
1.21.4
Folia Paper
22h ago 1
1.21.4
Folia Paper
22h ago 1
1.21.5
Paper
22h ago 1
1.21.5
Paper
22h ago 1
1.21.5
Paper
22h ago 1
1.21.5
Paper
22h ago 1
1.21.4
Folia Paper
22h ago 1
1.21.4
Folia Paper
22h ago 1
1.21.1
Folia Paper
22h ago 1
1.21.1
Folia Paper
22h ago 1
1.21.4
Folia Paper
22h ago 1
1.21.4
Folia Paper
22h ago 1
1.21.4
Folia Paper
22h ago 1
1.21.4
Folia Paper
22h ago 1
1.21.4
Folia Paper
22h ago 1
1.21.x
Folia Paper Purpur
22h ago 1
1.21.4
Folia Paper Purpur
22h ago 1
1.21.4
Folia Paper
22h ago 1
1.21.4
Folia Paper
22h ago 1
1.21.4
Folia Paper
22h ago 1
1.21.4
Folia Paper Purpur
22h ago 1
1.21.4
Folia Paper Purpur
22h ago 1
1.21.3
Folia Paper
22h ago 1
1.21.x
Folia Paper Purpur
22h ago 1
1.21.3
Folia Paper
22h ago 1
1.21.x
Folia Paper Purpur
22h ago 1
1.21.3
Paper
22h ago 1
1.21.x
Folia Paper Purpur
22h ago 1
1.21.x
Folia Paper Purpur
22h ago 1
1.21.x
Folia Paper Purpur
22h ago 1
1.21.x
Folia Paper Purpur
22h ago 1
1.21.1
Folia Paper Purpur
22h ago 1
1.21.1
Folia Paper Purpur
22h ago 1
1.21.1
Folia Paper Purpur
22h ago 1
1.21
Folia Paper Purpur
22h ago 1
1.21
Folia Paper Purpur
22h ago 1
1.21
Folia Paper Purpur
22h ago 1
1.21
Folia Paper Purpur
22h ago 1
1.21
Folia Paper Purpur
22h ago 1
1.21
Folia Paper Purpur
22h ago 1
1.21
Folia Paper Purpur
22h ago 1
1.21
Folia Paper Purpur
22h ago 1
1.20.6
Folia Paper Purpur
22h ago 1
1.20.6
Folia Paper Purpur
22h ago 1
1.20.6
Folia Paper Purpur
22h ago 1
1.20.4
Folia Paper Purpur
22h ago 1
1.20.6
Folia Paper
22h ago 1
1.20.6
Paper
22h ago 1
1.20.4
Folia Paper Purpur
22h ago 1
1.20.4
Folia Paper Purpur
22h ago 1
1.20.4
Folia Paper Purpur
22h ago 1
1.20.4
Folia
22h ago 1
1.20.4
Paper Purpur
22h ago 1
1.20.2
Paper Purpur
22h ago 1
1.20.4
Folia
22h ago 1
1.20.4
Paper Purpur
22h ago 1
1.20.4
Folia
22h ago 1
1.20.4
Folia
22h ago 1
1.20.2
Paper Purpur
22h ago 1
1.20.4
Paper Purpur
22h ago 1
1.20.2
Paper Purpur
22h ago 1
1.20.4
Paper Purpur
22h ago 1
1.20.4
Folia
22h ago 1
1.20.2
Paper Purpur
22h ago 1
1.20.4
Paper Purpur
22h ago 1
1.20.2
Paper Purpur
22h ago 1
1.20.4
Paper Purpur
22h ago 1
1.20.4
Paper Purpur
22h ago 1
1.20.2
Paper Purpur
22h ago 1
1.20.4
Paper Purpur
22h ago 1
1.20.2
Paper Purpur
22h ago 1
1.20.x
Paper Purpur
22h ago 1
1.20.2
Paper Purpur
22h ago 1
1.20.4
Paper Purpur
22h ago 1
1.20.4
Paper Purpur
22h ago 1
1.20.2
Paper Purpur
22h ago 1
1.20.2
Paper Purpur
22h ago 1
1.20.4
Paper Purpur
22h ago 1
1.20.2
Paper Purpur
22h ago 1
1.20.4
Paper Purpur
22h ago 1
1.20.2
Paper Purpur
22h ago 1
1.20.4
Paper Purpur
22h ago 1
1.20.4
Paper Purpur
22h ago 1
1.20.x
Paper Purpur
22h ago 1
1.20.2
Paper Purpur
22h ago 1
1.20.2
Folia
22h ago 1
1.20.2
Paper Purpur
22h ago 1
1.20.2
Folia
22h ago 1
1.20.x
Paper Purpur
22h ago 1
1.20.2
Paper Purpur
22h ago 1
1.20.2
Paper Purpur
22h ago 1
1.20.2
Paper
22h ago 1
1.20.x
Paper Purpur
22h ago 1
1.20.x
Paper Purpur
22h ago 1
1.20.x
Paper Purpur
22h ago 1
1.20.x
Paper Purpur
22h ago 1
1.20.x
Paper Purpur
22h ago 1
1.20.x
Paper Purpur
22h ago 1
1.20.x
Paper Purpur
22h ago 1
1.20.x
Paper Purpur
22h ago 1
1.20.1
Paper Purpur
22h ago 1
1.20.x
Paper Purpur
22h ago 1
1.20.x
Paper Purpur
22h ago 1
1.20
Paper Purpur
22h ago 1
1.20
Paper Purpur
22h ago 1
1.19.4
Paper Purpur
22h ago 1
1.19.4
Paper Purpur
22h ago 1
1.19.4
Paper Purpur
22h ago 1
1.19.4
Paper Purpur
22h ago 1
1.19.4
Paper Purpur
22h ago 1
1.19.4
Paper Purpur
22h ago 1
1.19.4
Paper Purpur
22h ago 1
1.19.4
Paper Purpur
22h ago 1
1.19.4
Paper Purpur
22h ago 1
1.19.4
Paper Purpur
22h ago 1
1.19.4
Paper Purpur
22h ago 1
1.19.4
Paper Purpur
22h ago 1
1.19.4
Paper Purpur
22h ago 1
1.19.4
Paper Purpur
22h ago 1
1.19.4
Paper
22h ago 1
1.19.3
Paper Purpur
22h ago 1
1.19.3
Paper Purpur
22h ago 1
1.19.3
Paper Purpur
22h ago 1
1.19.3
Paper Purpur
22h ago 1
1.19.3
Paper Purpur
22h ago 1
1.19.3
Paper Purpur
22h ago 1
1.19.3
Paper Purpur
22h ago 1
[2.8.1] 2.8.1 by MATRIX-feather on Oct 12, 2026
Download
## Bug Fixes
  • Removed debug logging in ByNameExecutor
  • Executing the *dash* skill makes everyone in the same world hear the activation sound.

[2.8.0] 2.8.0 by MATRIX-feather on Oct 12, 2026
Download
## New Features
  • The icon of the current disguise is now displayed when disguising**
  • Entities with tag feathermorph_nogrant now won't unlock the relevant disguise for the player when being killed.**
  • It's now possible to extract the built-in language file using the /fm extract language <lang> command**
  • Permission for this command is feathermorph.admin.
  • If there's already a matching file on the disk, the extracted file will install to messages/<lang>.fmnew.json by default
  • You can overwrite it by using /fm extract language <lang> true. This operation requires you to confirm by executing again
  • Triggering Interaction Mirror for mannequins now requires the player to have permission to trigger Interaction Mirror
  • Slaves in the Instance Network now request data for the player when they join, instead of the master server loading and syncing all data to slaves upon startup.
  • It's now possible to get the relevant DisguiseState instance in PlayerUnMorphEvent.
  • Third-party plugins are now able to add their SingleProperty instances to DisguiseProperties on bootstrap, which would allow automatic assignment from player inputs.
  • Added support for Zombie Nautilus's variant property.
  • Now an instance of DisguiseProperty can declare that it's invisible for the client mod
  • FeatherMorph doesn't have properties that require this feature yet; it's mainly made for other plugins' development.
  • Added readString method for InputHandles.
  • The plugin will now attempt to show the exception's message if it occurred while updating or has been forwarded to the DisguiseState.
  • Bring the ability for async player data loading in Instance Network to IManagePlayerData.
  • Currently, only when the Instance Network is enabled, and the current server is a Slave Server in the network, the async loading feature is fully utilized.
  • If supported, when a player enters the configuration state, the plugin will attempt to load their data async, and wait for up to 150ms per player, then allow them to keep logging in after the timeout, and notify their client when the data finishes loading.
  • ~~*We wait for up to 150ms is to make sure that the disguise unlock data can immediately be available after the player logs in on fast machines.*~~
  • ~~*And maybe this waiting feature would be removed in the next (edit: next or future) releases, as it literally conflicts with the **async** concept...* 🤯~~\
  • Slave servers no longer wait for up to 150ms for the master server to respond to our lookup request**
  • Added abilities for Nautilus and Zombie Nautilus
  • Disguising as Nautilus now gives the player the ability to breathe underwater and dryout in the air
  • Disguising as Zombie Nautilus would additionally make the player burn under the sun if not equipped with a helmet.
  • Added Dash skill
  • Disguising as Camel/Camel Husk now can dash on the ground or underwater
  • Disguising as Nautilus/Zombie Nautilus now can dash underwater
  • backport: Allow server to disable disguise waypoints via config

## Bug Fixes
  • Backport a workaround from 1.21.11/feature-next branch, to prevent bad component input from applying and kicking viewing players out of the server**
  • But I'm not sure if this issue should be triaged to FeatherMorph though...
  • Fixed a regression where trying to disguise as a player when facing others disguised as another player could copy their properties, ignoring whether the disguise target is the same.
  • Potential error when checking whether the current code is on an Entity's tick thread.
  • Mannequin disguises' description property is now correctly set up when the target mannequin does not have a description
  • Cache for SkinStorage is not being updated after dropping/caching a skin
  • Fixed a regression where disguised players can still get selected as an Interaction Mirror target when using the by_name selector.
  • Fixed a regression where disguised players can't get selected as an Interaction Mirror target if the controlling player is disguised as the same player they disguise.
  • Package Version not saved after initial skill configuration setup

## Others
  • Removed usage of feathermorph.disguise_use_real_uuid permission**
  • Active disguises will now save to disk when the server shuts down**
  • 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 if 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 conversion.
  • Mannequins would now be normally selected by Interaction Mirror Executors, instead of being treated as specials.
  • by_sight mirror mode now respects the maximum affect distance set in the config
  • Gradle task runFolia is now available
  • The actionbar message for disguise is now handled by DisguiseState.
  • readRotations from InputHandles now throws an error when the player gives more than 3 elements
  • This means that giving more than 3 elements for various rotation properties for the Armor Stand disguise will now result in an error message.
  • Migrated configuration definition from plugin's own ConfigOption enum to ConfigOption class from PluginBase
  • Simplified exception handling in some places.
  • The message morph.error_while_disguising_user_fault in the language file has been renamed to morph.error_parsing_property.
  • The interval of batching player data requests has been changed from 10 ticks to 2 ticks, to adapt to the new IManagePlayerData#loadPlayerDataAsync method
  • Plugin now checks for Paper or Folia platform for update, depending on the server spec.
  • Offline Disguises is now called Saved Disguises

## What's Changed

[2.8.0-rc.6] 2.8.0-rc.6 by MATRIX-feather on Oct 12, 2026
Download
## Bug Fix
  • Package Version not saved after initial skill configuration setup

[2.8.0-rc.5] 2.8.0-rc.5 by MATRIX-feather on Oct 12, 2026
Download
## New Feature
  • backport: Allow server to disable disguise waypoints via config

## Other


[2.8.0-rc.3] 2.8.0-rc.3 by MATRIX-feather on Oct 12, 2026
Download
So I'm back updating this resource, as I still wish to have this on a tiny server that I play with my friends for the upcoming 26.1 and later. 😄

## Bug Fixes
  • Cache for SkinStorage is not being updated after dropping/caching a skin
  • Fixed a regression where trying to disguise as a player when facing others disguised as another player could copy their properties, ignoring whether the disguise target is the same.
  • Fixed a regression where disguised players can still get selected as an Interaction Mirror target when using the by_name selector.
  • Fixed a regression where disguised players can't get selected as an Interaction Mirror target if the controlling player is disguised as the same player they disguise.

## Other
  • Backport a workaround from 1.21.11/feature-next branch, to prevent bad component input from applying and kicking viewing players out of the server**
  • Not sure if this issue should be triaged to FeatherMorph though...

[2.8.0-rc.1] 2.8.0-rc.1 by MATRIX-feather on Oct 12, 2026
Download
## Bug 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_uuid permission**
  • 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 if 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 Paper or Folia platform for update, depending on the server spec.
  • Offline Disguises is now called Saved Disguises
[2.8.0-beta.4] 2.8.0-beta.4 by MATRIX-feather on Oct 12, 2026
Download
This is a build on 1.21.11/feature.

  • We suggest that everyone on the 1.21.11/feature branch using the Instance Network feature update to this version on all Slave Servers.**

## Bug Fix
  • Instance Network: Slave Servers not cleaning the existing data before applying new data synced from the master server**
  • This issue can also trigger another issue where the string command sent to the player is too large
  • This doesn't affect builds on 1.21.11/main as they don't have the partial sync feature
  • Disguising on Folia has a rare chance to fail about ... this.revealingHandler is null.

[2.6.0-alpha.4] 2.6.0-alpha.4 by MATRIX-feather on Oct 12, 2026
Download
This is a build on 1.21.10/feature.

  • We suggest that everyone on the 1.21.10/feature branch using the Instance Network feature update to this version on all Slave Servers.**

## New Feature
  • The Fake Equip skill has been extended to more mobs

## Bug Fix
  • Instance Network: Slave Servers not cleaning the existing data before applying new data synced from the master server**
  • This issue can also trigger another issue where the string command sent to the player is too large
  • This doesn't affect builds on 1.21.10/main as they don't have the partial sync feature

[2.8.0-beta.2] 2.8.0-beta.2 by MATRIX-feather on Oct 12, 2026
Download
## New Features
  • Added abilities for Nautilus and Zombie Nautilus
  • Disguising as Nautilus now gives the player the ability to breathe underwater and dryout in the air
  • Disguising as Zombie Nautilus would additionally make the player burn under the sun if not equipping a helmet.
  • Added Dash skill
  • Disguising as Camel/Camel Husk now can dash on the ground or underwater
  • Disguising as Nautilus/Zombie Nautilus now can dash underwater

## Bug Fix
  • Potential error when checking whether the current code is on an Entity's tick thread.

[2.7.1] 2.7.1 by MATRIX-feather on Oct 12, 2026
Download
## Bug Fix
  • Potential error when checking whether the current code is on an Entity's tick thread.

[2.8.0-alpha.2] 2.8.0-alpha.2 by MATRIX-feather on Oct 12, 2026
Download
## Bug Fix
  • Debug message Text icon for <...> is <...> spamming in console if any usage of disguise text icon is invoked

[2.6.0-alpha.3] 2.6.0-alpha.3 by MATRIX-feather on Oct 12, 2026
Download
## New Features
  • Now an instance of DisguiseProperty can declare that it's invisible for the client mod
  • FeatherMorph doesn't have properties that require this feature yet; it's mainly made for other plugins' development.
  • Added readString method for InputHandles.
  • The plugin will now attempt to show the exception's message if it occurred while updating or has been forwarded to the DisguiseState.
  • Bring the ability for async player data loading in Instance Network to IManagePlayerData.
  • Currently, only when the Instance Network is enabled, and the current server is a Slave Server in the network, the async loading feature is fully utilized.
  • If supported, when a player enters the configuration state, the plugin will attempt to load their data async, and wait for up to 150ms per player, then allow them to keep logging in after the timeout, and notify their client when the data finishes loading.
  • We wait for up to 150ms is to make sure that the disguise unlock data can immediately be available after the player logs in on fast machines.*
  • And maybe this waiting feature would be removed in the next (edit: next or future) releases, as it literally conflicts with the **async** concept...* 🤯

## Other
  • Simplified exception handling in some places.
  • The message morph.error_while_disguising_user_fault in the language file has been renamed to morph.error_parsing_property.
  • The interval of batching player data requests has been changed from 10 ticks to 2 ticks, to adapt to the new IManagePlayerData#loadPlayerDataAsync method

[2.8.0-alpha.1] 2.8.0-alpha.1 by MATRIX-feather on Oct 12, 2026
Download
This is a release on the 1.21.11/feature branch.

## New Feature
  • [2.7.0] Added new debug command /debugForValue, for listing all registered SingleValue in the given value set.
  • Added support for Zombie Nautilus's variant property.

## Other
  • [2.7.0] We are now 1.21.11
  • [2.7.0] Bumped PacketEvents to 2.11.0
  • [2.7.0] Added a workaround not to send the packet if we have a huge data body.
  • This prevents exceptions from being thrown when trying to send a huge amount of available disguise or a huge disguise data.
  • Currently, I have no idea how to solve the problem, so let's not sync the list for now. Players can still select the disguise using the /morph command, and other features would still work... Unless the data still exceeds the limit.

[2.7.0] 2.7.0 by MATRIX-feather on Oct 12, 2026
Download
This is a release on the 1.21.11/main branch. For the upcoming new features, see https://github.com/NiFeather/FeatherMorph/pull/61

## New Feature
  • Added new debug command /debugForValue, for listing all registered SingleValue in the given value set.

## Other
  • We are now 1.21.11
  • Bumped PacketEvents to 2.11.0
  • Added a workaround not to send the packet if we have a huge data body.
  • This prevents exceptions from being thrown when trying to send a huge amount of available disguise or a huge disguise data.
  • Currently, I have no idea how to solve the problem, so let's not sync the list for now. Players can still select the disguise using the /morph command, and other features would still work... Unless the data still exceeds the limit.

[2.6.0-alpha.2] 2.6.0-alpha.2 by MATRIX-feather on Oct 12, 2026
Download
## New Features
  • Now applying the Interaction Mirror for mannequins also requires the player to have the normal Interaction Mirror permission
  • On new installations, the Icon for the current disguise is now shown in the actionbar by default
  • Killing mobs with feathermorph_nogrant tag will now not unlock the relevant disguise for the player
  • Refactored how the plugin sends messages to players
  • It's now possible to extract the built-in language file using the /fm extract language <lang> command
  • Permission for this command is feathermorph.admin.
  • If there's already a matching file on the disk, the extracted file will install to messages/<lang>.fmnew.json by default
  • You can overwrite it by using /fm extract language <lang> true, this operation requires you to confirm by executing again
  • Slaves in the Instance Network now request data for the player when they join, instead of the master server loading and syncing all data to slaves upon startup.
  • It's now possible to get the relevant DisguiseState instance in PlayerUnMorphEvent.
  • Third-party plugins are now able to add their SingleProperty instances to DisguiseProperties on bootstrap, which would allow automatic assignment from player inputs.

## Other
  • Mannequins would now be normally selected by Interaction Mirror Executors, instead of being treated as specials.
  • by_sight mirror mode now respects the maximum affect distance set in the config
  • Gradle task runFolia is now available
  • The actionbar message for disguise is now handled by DisguiseState.
  • readRotations from InputHandles now throws an error when the player gives more than 3 elements
  • This means that giving more than 3 elements for various rotation properties for the Armor Stand disguise will now result in an error message.
  • Migrated configuration definition from plugin's own ConfigOption enum to ConfigOption class from PluginBase

[2.5.2] 2.5.2 by MATRIX-feather on Oct 12, 2026
Download
This is a maintenance release for the 2.5 series. For the upcoming new features, see 2.6 alpha at: https://github.com/NiFeather/FeatherMorph/pull/59

## Bug Fixes
  • The Extra Knockback ability always adds 0.345584025 for Y Motion changes, and does not apply knockback resistance for X and Z Motion changes.
  • Disguise waypoint not getting removed when the binding player quits.
  • Make MorphBasicAvoidPlayerGoal ignore when the player to avoid is in a different world
  • This fixes the AI throwing error under some weird situations.

## Other
  • Handle invalid protocol level in MIC2SLoginCommand

[2.5.1] 2.5.1 by MATRIX-feather on Oct 12, 2026
Download
  • Starting from 2025/11/3 (YYYY/MM/DD), we have split the 1.21.10 branch to 1.21.10/main and 1.21.10/feature.*

  • If you cloned the repo before, you might want to delete the locally stored 1.21.10 branch before pulling any updates!*


# Changes in 2.5.1

## Bug Fix
  • Empty input for entity/equipment would cause unhandled exceptions


# Changes in 2.5.0

## New Features
  • It's now possible for players to save their disguise and apply their locally stored disguises**
  • This requires players to use 0.16.0-beta.5 or higher version of the client mod!
  • Added permission feathermorph.custom_text for entity/custom_name, mannequin/description, and mannequin/hide_description property, and it's available for players by default
  • Added permission for using disguise properties: feathermorph.disguise_properties.use
  • Added permission for setting a custom skin profile for items in entity/equipment property, restricted to ops by default: feathermorph.disguise_properties.custom_skin_on_items
  • Added support for Mannequin disguise
  • Mannequin disguise is not collectable using the Magic Bottle by default
  • Mannequin disguises have the Fake Equip skill, like Armor Stand and Player disguise
  • mannequin/skin property is restricted to ops by default. You can set feathermorph.custom_skin permission for players so they can use this property.
  • Added support for Copper Golem disguise
  • Copper Golem disguise is collectable using the Magic Bottle by default
  • Added Weather State property for Copper Golem disguise
  • Initial compatibility(?) for Ping Wheel
  • Using the official Ping Wheel plugin **will work**, but pinging while disguising doesn't mask the pinger
  • ...So I made a custom plugin to temporarily solve the problem, which can be found at https://github.com/MATRIX-feather/pingwheel-plugin-forked
  • Initial support for players with permission feathermorph.mirror.mannequin to mirror their sneaking actions to mannequins that have the same name and description as their disguise
  • For BY_NAME executor, mannequins within a range are selected, while setting the affect distance to -1 would disable the range limit
  • For BY_SIGHT and BY_RANGE, the targeting mannequin within 5 blocks of sight will be selected

## Bug Fixes
  • Several bugs with Player Disguises when feathermorph.disguise_use_real_uuid permission is given
  • Players got removed from their TAB view when undisguising
  • Disguise not presenting when teleported from far away, or switching gamemode from spectator
  • slime_magma/size property has a wrong random range
  • Nobody is calling BaseLivingEntityProperties#setupPropertiesFromEntity in the override methods
  • This makes disguises that have extra properties not copy the target entity's custom name.

## Other
  • We are planning to remove the BY_RANGE mirror executor in the future, as it's causing chaos when we have players with bad networking**
  • Some exceptions thrown will now be forwarded to DisguiseState and will undisguise the player
  • Tweaked how Server Renderer rebuilds entity metadata packets sent from the server
  • Removed disguise NBT blacklist configuration
  • As they are not being used anymore
  • entity/custom_name and mannequin/description now accept JSON text component starting with {
  • Moved some disguise validation to early disguise preparation
[2.5.0-rc.5] 2.5.0-rc.5 by MATRIX-feather on Oct 12, 2026
Download
  • Starting from 2025/11/3 (YYYY/MM/DD), we have split the 1.21.10 branch to 1.21.10/main and 1.21.10/feature.*

  • If you cloned the repo before, you might want to delete the locally stored 1.21.10 branch before pulling any updates!*


## Bug Fixes
  • Added SkinPatch support for ResolvableProfile, which fixes some skin setups not presenting properly on the client.
  • Explicitly declare whether a MorphResolvableProfileStruct is presenting a dynamic ResolvableProfile, which fixes some skin not displaying on the client side.
  • These two fixes above require players to update their client mod to 0.16.0-beta.6!
  • entity/custom_name always copies from the target entity, ignoring the entity's type
  • Nobody is calling BaseLivingEntityProperties#setupPropertiesFromEntity in the override methods
  • This makes disguises that have extra properties not copy the target entity's custom name.

[2.4.6] 2.4.6 by MATRIX-feather on Oct 12, 2026
Download
  • Starting from 2025/11/3 (YYYY/MM/DD), we have split the 1.21.10 branch to 1.21.10/main and 1.21.10/feature.*

  • If you cloned the repo before, you might want to delete the locally stored 1.21.10 branch before pulling any updates!*

## Bug Fix
  • StackOverflow when a player has a locale that is "en_US" rather than "en_us"

[2.5.0-rc.4] 2.5.0-rc.4 by MATRIX-feather on Oct 12, 2026
Download
  • Starting from 2025/11/3 (YYYY/MM/DD), we have split the 1.21.10 branch to 1.21.10/main and 1.21.10/feature.*

  • If you cloned the repo before, you might want to delete the locally stored 1.21.10 branch before pulling any updates!*

## Bug Fixes
  • Player disguise always copies the target player's skin, not checking conditions
  • StackOverflow when a player has a locale that is "en_US" rather than "en_us"

## Other
  • Allow bukkitEntity is null for FoliaThreadUtils#isTickThreadFor
  • Make ServerBackend#disguise and SpawnPacketHandler#onEntityAddPacket fail softly if timed out waiting for the player's thread.
  • In beta.6, some exceptions are forwarded to the player's DisguiseState, including waiting timeouts when building virtual entity packets
  • Once timed out, the player will get unmorphed once ticked, even if it only affects the virtual entity displaying
  • This may improve player experience when the server is lagging

[2.5.0-rc.3] 2.5.0-rc.3 by MATRIX-feather on Oct 12, 2026
Download
## Bug Fix
  • In previous 2.5.0 beta releases, sometimes the disguise reporting it fails to update and (may) cause nearby players to disconnect with a protocol error**

## Other
  • Catch JSON error when parsing client entity/equipment input and wrap it as a ParseErrorException, to tell players that the data is malformed

[2.4.5] 2.4.5 by MATRIX-feather on Oct 12, 2026
Download
## Bug Fix
  • Skill execution event not triggering**

[2.5.0-rc.2] 2.5.0-rc.2 by MATRIX-feather on Oct 12, 2026
Download
  • We are now slowly migrating our wiki to the docs/ directory under the repository. You can have a look if interested!*

## New Feature
  • [rc.1] Added permission for using disguise properties: feathermorph.disguise_properties.use
  • [rc.1] Added permission for setting a custom skin profile for items in entity/equipment property: feathermorph.disguise_properties.custom_skin_on_items

## Bug Fix
  • [rc.2] Disguising as other entities can also trigger the Interaction Mirror for mannequins
  • [rc.2] The Interaction Mirror for mannequins triggers ignoring the difference in NPC description

## Other
  • [rc.1] Moved some disguise validation to early disguise preparation
  • [rc.1] Bump PacketEvents to 2.10.0

[2.5.0-beta.6] 2.5.0-beta.6 by MATRIX-feather on Oct 12, 2026
Download
## New Feature
  • Players with permission feathermorph.mirror.mannequin are now able to apply the sneaking mirror to mannequins that have the same name as their disguise**
  • For BY_NAME executor, mannequins within a range are selected, while setting the affect distance to -1 would disable the range limit
  • For BY_SIGHT and BY_RANGE, the targeting mannequin within 5 blocks of sight will be selected
  • Bump API to 17
  • It's now possible for client mods to include property inputs in the C2S Morph command
  • Setting the Interaction Mirror Affect Distance (Control distance) in-game is now possible with /fm option mirror_control_distance

## Bug Fix
  • Skill execution event not triggering**
  • slime_magma/size property has a wrong random range

## Other
  • We are planning to remove the BY_RANGE mirror executor in the future, as it's causing chaos when we have players with bad networking
  • Some exceptions thrown will now be forwarded to DisguiseState and will undisguise the player
  • Tweaked how Server Renderer rebuilds entity metadata packets sent from the server

[2.4.4] 2.4.4 by MATRIX-feather on Oct 12, 2026
Download
## New Features

## Bug Fixes
  • Disguise status synced from slave servers doesn't really apply to the master server**
  • Players got removed from their TAB view when undisguising, when feathermorph.disguise_use_real_uuid is set to true
[2.5.0-beta.5] 2.5.0-beta.5 by MATRIX-feather on Oct 12, 2026
Download
## Bug Fix
  • Disguise status synced from slave servers doesn't really apply to the master server**

## Other
  • We are now 1.21.10
  • We now compile against PacketEvents 2.10.0-SNAPSHOT dev build
  • So that CI is working again!
[2.5.0-beta.3] 2.5.0-beta.3 by MATRIX-feather on Oct 12, 2026
Download
## New Feature
  • Added permission feathermorph.custom_text for entity/custom_name, mannequin/description, and mannequin/hide_description property, and it's available for players by default
  • Mannequin and Copper Golem disguise is now available for Server Renderer**
  • Would require PacketEvents built from [This PR](https://github.com/retrooper/packetevents/pull/1361)

## Other
  • Several disguise property changes, players will need to update their mod to 0.16.0-beta.2!**
  • Merged mannequin/skin_internal and mannequin/skin property. mannequin/skin property is now used for skin input and property syncing**
  • Changed how plugin syncs mannequin/skin to the player**
  • entity/custom_name and mannequin/description now accept JSON text component starting with {
  • player/skin now accepts GameProfile compound string
  • mannequin/skin now accepts a valid string for MorphResolvableProfileStruct starting with {
[2.5.0-beta.2] 2.5.0-beta.2 by MATRIX-feather on Oct 12, 2026
Download
This is a beta release for 1.21.9. Please note that this release **may not support displaying Mannequin and Copper Golem disguise using Server Renderer** as PacketEvents haven't been updated yet.

## New Features
  • API version is now 16**
  • Skin for player disguise and Equipment for any entity disguise are now managed as disguise properties
  • Compatibility for clients that don't support disguise properties will end at 2026, or when 1.22 comes out
  • Added support for Mannequin disguise
  • Mannequin disguise is not collectable using the Magic Bottle by default
  • Mannequin disguises have the Fake Equip skill, like Armor Stand and Player disguise
  • mannequin/skin property is restricted to ops, as the plugin will try to fetch and cache skin from the given input. You can set feathermorph.custom_skin permission for players so they can use this property.
  • Added support for Copper Golem disguise
  • Copper Golem disguise is collectable using the Magic Bottle by default
  • Added Weather State property for Copper Golem disguise
  • Initial compatibility for Ping Wheel
  • Currently requires a custom plugin, which can be found at https://github.com/MATRIX-feather/pingwheel-plugin-forked

## Bug Fixes
  • Several bugs with Player disguises when feathermorph.disguise_use_real_uuid is set to true
  • Players got removed from their TAB view when undisguising
  • Disguise not presenting when teleported from far away, or switching gamemode from spectator

## Other
  • Removed disguise NBT blacklist configuration
  • As they are not being used anymore

[2.4.3] 2.4.3 by MATRIX-feather on Oct 12, 2026
Download
## This release may require some manual operations

Disguise Tool and Magic Bottle's recipe is now registered using a datapack. While this can allow you to customize even more, you would need to install a recipe management plugin if you wish to disable one of them specifically.

If you have already disabled recipes using a management plugin, then no operations would be required. (As the datapack is using the same recipe ID as the old behavior)

You might also want to read the 2.4.1 changelog if you are updating from older versions.


## New Features
  • The collected result for the empty Magic Bottle is now a loot table**
  • By default, the plugin will process all output items that come from the loot table
  • You can set custom data feathermorph:skip_magic_bottle_setup to true to make the plugin skip a specific item
  • For more details, see the [Loot table datapack](https://github.com/NiFeather/FeatherMorph/tree/1.21.8/src/main/resources/datapacks/loot_tables/data/feathermorph/loot_table)
  • Due to a limitation, not all loot table types are supported. Currently, empty and entity are tested to work well**
  • Added permission feathermorph.acquire_morph to control whether a specific player can unlock disguises via gameplay
  • Added permission feathermorph.disguise_use_real_uuid to control whether a disguise should use the player's real UUID for the virtual entity
  • This may help to improve compatibility with Simple Voice Chat, etc.
  • However, this should be tricked as a *hack* or *workaround*
  • Players are now able to discard their unlocked disguises using the /discard-morph command

## Bug Fixes
  • Cat and Wolf disguises don't have collar color property applied if targeting a valid entity
  • /fm make_disguise_tool command not registering
  • AI Modification failed to inject and caused a log spam for some setup**

## Other
  • AI Modification is now disabled by default for new installations**
  • We now use NMS to inject goals again, as using the API is causing issues...

[2.4.2] 2.4.2 by MATRIX-feather on Oct 12, 2026
Download
## This release may require some manual operations

Disguise Tool and Magic Bottle's recipe is now registered using a datapack. While this can allow you to customize even more, you would need to install a recipe management plugin if you wish to disable one of them specifically.

If you have already disabled recipes using a management plugin, then no operations would be required. (As the datapack is using the same recipe ID as the old behavior)

  • This version is known to have issues with AI modification on Folia. We recommend disabling this feature on Folia servers ASAP**


## Bug Fix
  • Some mobs don't panic from players where they should
  • Cats and Ocelots are missing an attack goal for players' disguise
  • Tamed mobs still run the custom attack goal

## Other
  • Removed debug output (*"ToAvoid is xxxxx"*) spamming in MorphBasicAvoidPlayerGoal**
  • Ensure that the target entity is on the same thread as the running mob in MorphBasicAvoidPlayerGoal
  • Nobody reported relevant issues before, but just in case :D
FeatherMorph Icon
Download FeatherMorph
Select game version
Select platform