From a02a0dadc4b0a11c333682073b42614ec29ee837 Mon Sep 17 00:00:00 2001
From: MATRIX-feather <midnightcarnival@outlook.com>
Date: Tue, 8 Oct 2024 23:12:30 +0800
Subject: [PATCH 01/28] =?UTF-8?q?misc:=20=E4=B8=80=E4=BA=9B=E6=B3=A8?=
 =?UTF-8?q?=E9=87=8A?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/main/resources/recipes.yml | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/src/main/resources/recipes.yml b/src/main/resources/recipes.yml
index bcb086f3..106abd00 100644
--- a/src/main/resources/recipes.yml
+++ b/src/main/resources/recipes.yml
@@ -1,7 +1,20 @@
+# - x - x - x - x - x - x - x - x - x - x - x - x - x - x - x - x - x -
+#
+# Please note that we only provide a very basic crafting recipe support.
+# We recommend using other recipe plugins to get more advanced management experience!
+#
+# - x - x - x - x - x - x - x - x - x - x - x - x - x - x - x - x - x -
 root:
   # Item crafting options
   item_crafting:
     # Options for the Disguise Tool
+    #
+    # PS:
+    #     You can make an item a disguise tool by executing `/fm make_disguise_tool` command
+    #     while holding it on your main hand.
+    #
+    #     You can also give yourself a disguise tool by setting its custom data:
+    #       `/give @s minecraft:feather[minecraft:custom_data={"feathermorph:is_disguise_tool": true}]`
     disguise_tool:
       enabled: true
 

From 40780c39149516d37f638328c203aaca8111f287 Mon Sep 17 00:00:00 2001
From: MATRIX-feather <midnightcarnival@outlook.com>
Date: Wed, 9 Oct 2024 22:38:31 +0800
Subject: [PATCH 02/28] =?UTF-8?q?misc:=20!!!=E6=9B=B4=E6=8D=A2=E6=9D=83?=
 =?UTF-8?q?=E9=99=90=E5=89=8D=E7=BC=80!!!=E3=80=81=E6=9B=B4=E6=8D=A2?=
 =?UTF-8?q?=E5=8C=85=E5=90=8D?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 build.gradle.kts                              |  2 +-
 .../datawatcher/values/MonsterValues.java     |  5 --
 .../values/basetypes/AbstractGolemValues.java |  7 --
 .../values/basetypes/AgeableMobValues.java    | 16 ----
 .../values/basetypes/AnimalValues.java        |  5 --
 .../values/basetypes/WaterAnimalValues.java   |  7 --
 .../animation/AnimationProvider.java          | 14 ----
 .../bundled/FallbackAnimationSet.java         |  7 --
 .../storage/offlinestore/IOfflineState.java   |  5 --
 .../nifeather}/morph/MorphManager.java        | 73 ++++++++++---------
 .../nifeather}/morph/MorphPlugin.java         | 49 +++++++------
 .../nifeather}/morph/MorphPluginObject.java   |  2 +-
 .../nifeather}/morph/RequestManager.java      | 20 ++---
 .../nifeather}/morph/RevealingHandler.java    |  8 +-
 .../morph/abilities/AbilityManager.java       | 19 +++--
 .../morph/abilities/AbilityType.java          |  2 +-
 .../morph/abilities/AbilityUpdater.java       | 14 ++--
 .../morph/abilities/EffectMorphAbility.java   |  6 +-
 .../morph/abilities/IMorphAbility.java        |  6 +-
 .../morph/abilities/MorphAbility.java         |  8 +-
 .../impl/AttributeModifyingAbility.java       | 10 +--
 .../morph/abilities/impl/BossbarAbility.java  | 16 ++--
 .../abilities/impl/BurnsUnderSunAbility.java  |  6 +-
 .../abilities/impl/ChatOverrideAbility.java   | 20 ++---
 .../abilities/impl/DamageReducingAbility.java |  8 +-
 .../abilities/impl/DryOutInAirAbility.java    | 16 ++--
 .../morph/abilities/impl/FlyAbility.java      | 22 +++---
 .../impl/HealsFromEntityAbility.java          | 20 ++---
 .../abilities/impl/NoFallDamageAbility.java   |  4 +-
 .../abilities/impl/NoOpOptionAbility.java     |  6 +-
 .../impl/NoSweetBushDamageAbility.java        |  4 +-
 .../morph/abilities/impl/OnAttackAbility.java |  6 +-
 .../impl/ReduceFallDamageAbility.java         |  6 +-
 .../impl/ReduceMagicDamageAbility.java        |  6 +-
 .../abilities/impl/SmallJumpBoostAbility.java |  6 +-
 .../morph/abilities/impl/SnowyAbility.java    |  6 +-
 .../morph/abilities/impl/SpiderAbility.java   | 14 ++--
 .../impl/TakesDamageFromWaterAbility.java     | 10 +--
 .../morph/abilities/impl/WardenAbility.java   |  4 +-
 .../impl/WardenLessAwareAbility.java          |  4 +-
 .../impl/onAttack/ExtraKnockbackAbility.java  | 10 +--
 .../impl/onAttack/PotionOnAttackAbility.java  | 10 +--
 .../impl/potion/BreatheUnderWaterAbility.java |  6 +-
 .../impl/potion/FeatherFallingAbility.java    |  6 +-
 .../impl/potion/FireResistanceAbility.java    |  6 +-
 .../impl/potion/JumpBoostAbility.java         |  6 +-
 .../impl/potion/NightVisionAbility.java       |  6 +-
 .../impl/potion/SpeedBoostAbility.java        |  6 +-
 .../options/AttributeModifyOption.java        |  4 +-
 .../abilities/options/BossbarOption.java      |  4 +-
 .../abilities/options/ChatOverrideOption.java |  4 +-
 .../options/DryoutAbilityOption.java          |  4 +-
 .../options/ExtraKnockbackOption.java         |  4 +-
 .../morph/abilities/options/FlyOption.java    |  4 +-
 .../options/HealsFromEntityOption.java        |  4 +-
 .../abilities/options/PotionEffectOption.java |  4 +-
 .../abilities/options/ReduceDamageOption.java |  4 +-
 .../options/TakesDamageFromWaterOption.java   |  4 +-
 .../morph/backends/DisguiseBackend.java       |  4 +-
 .../morph/backends/DisguiseWrapper.java       | 12 +--
 .../morph/backends/EventWrapper.java          |  4 +-
 .../morph/backends/WrapperAttribute.java      |  2 +-
 .../morph/backends/WrapperEvent.java          |  2 +-
 .../morph/backends/fallback/NilBackend.java   | 14 ++--
 .../morph/backends/fallback/NilDisguise.java  |  2 +-
 .../morph/backends/fallback/NilWrapper.java   | 20 ++---
 .../morph/backends/modelengine/MEBackend.java | 12 +--
 .../modelengine/MEDisguiseInstance.java       |  2 +-
 .../modelengine/MEDisguiseWrapper.java        | 16 ++--
 .../modelengine/vanish/IVanishSource.java     |  2 +-
 .../vanish/ProtocolLibVanishSource.java       | 16 ++--
 .../vanish/VanillaVanishSource.java           |  4 +-
 .../morph/backends/server/ServerBackend.java  | 18 ++---
 .../morph/backends/server/ServerDisguise.java |  2 +-
 .../server/ServerDisguiseWrapper.java         | 34 ++++-----
 .../server/renderer/ServerRenderer.java       | 22 +++---
 .../renderer/network/DisplayParameters.java   |  7 +-
 .../renderer/network/PacketFactory.java       | 21 +++---
 .../renderer/network/ProtocolEquipment.java   |  6 +-
 .../renderer/network/ProtocolHandler.java     |  6 +-
 .../renderer/network/TestPacketListener.java  |  6 +-
 .../datawatcher/values/AbstractValues.java    |  6 +-
 .../datawatcher/values/AllayValues.java       |  2 +-
 .../datawatcher/values/ArmadilloValues.java   |  4 +-
 .../datawatcher/values/ArmorStandValues.java  |  4 +-
 .../datawatcher/values/AxolotlValues.java     |  4 +-
 .../network/datawatcher/values/CatValues.java |  6 +-
 .../datawatcher/values/CreeperValues.java     |  2 +-
 .../network/datawatcher/values/FoxValues.java |  4 +-
 .../datawatcher/values/FrogValues.java        |  6 +-
 .../datawatcher/values/GhastValues.java       |  2 +-
 .../datawatcher/values/GoatValues.java        |  4 +-
 .../datawatcher/values/GuardianValues.java    |  2 +-
 .../datawatcher/values/HorseValues.java       |  4 +-
 .../datawatcher/values/LlamaValues.java       |  4 +-
 .../network/datawatcher/values/MobValues.java |  4 +-
 .../datawatcher/values/MonsterValues.java     |  5 ++
 .../datawatcher/values/MooshroomValues.java   |  4 +-
 .../datawatcher/values/PandaValues.java       |  4 +-
 .../datawatcher/values/ParrotValues.java      |  4 +-
 .../datawatcher/values/PhantomValues.java     |  2 +-
 .../datawatcher/values/PiglinValues.java      |  4 +-
 .../datawatcher/values/PlayerValues.java      |  4 +-
 .../datawatcher/values/PufferfishValues.java  |  4 +-
 .../datawatcher/values/RabbitValues.java      |  4 +-
 .../datawatcher/values/SheepValues.java       |  4 +-
 .../datawatcher/values/ShulkerValues.java     |  2 +-
 .../datawatcher/values/SingleValue.java       |  2 +-
 .../datawatcher/values/SlimeValues.java       |  2 +-
 .../datawatcher/values/SnifferValues.java     |  4 +-
 .../datawatcher/values/SnowGolemValues.java   |  4 +-
 .../values/TropicalFishValues.java            |  4 +-
 .../datawatcher/values/VillagerValues.java    |  4 +-
 .../datawatcher/values/WolfValues.java        |  6 +-
 .../datawatcher/values/ZoglinValues.java      |  2 +-
 .../datawatcher/values/ZombieValues.java      |  2 +-
 .../values/ZombieVillagerValues.java          |  2 +-
 .../values/basetypes/AbstractFishValues.java  |  4 +-
 .../values/basetypes/AbstractGolemValues.java |  7 ++
 .../values/basetypes/AbstractHorseValues.java |  4 +-
 .../basetypes/AbstractVillagerValues.java     |  4 +-
 .../values/basetypes/AgeableMobValues.java    | 16 ++++
 .../values/basetypes/AnimalValues.java        |  5 ++
 .../values/basetypes/BasePiglinValues.java    |  6 +-
 .../values/basetypes/ChestedHorseValues.java  |  4 +-
 .../values/basetypes/EntityValues.java        |  6 +-
 .../values/basetypes/LivingEntityValues.java  |  4 +-
 .../basetypes/TameableAnimalValues.java       |  4 +-
 .../values/basetypes/WaterAnimalValues.java   |  7 ++
 .../datawatcher/watchers/SingleWatcher.java   | 19 +++--
 .../watchers/types/AgeableMobWatcher.java     |  4 +-
 .../watchers/types/AllayWatcher.java          | 10 +--
 .../watchers/types/ArmadilloWatcher.java      | 10 +--
 .../watchers/types/ArmorStandWatcher.java     | 11 ++-
 .../watchers/types/AxolotlWatcher.java        | 10 +--
 .../watchers/types/CatWatcher.java            | 18 ++---
 .../watchers/types/CreeperWatcher.java        |  4 +-
 .../watchers/types/DonkeyWatcher.java         |  4 +-
 .../types/EHasAttackAnimationWatcher.java     |  6 +-
 .../watchers/types/EntityWatcher.java         | 12 +--
 .../watchers/types/FoxWatcher.java            | 16 ++--
 .../watchers/types/FrogWatcher.java           | 16 ++--
 .../watchers/types/GhastWatcher.java          |  4 +-
 .../watchers/types/GoatWatcher.java           | 10 +--
 .../watchers/types/GuardianWatcher.java       |  4 +-
 .../watchers/types/HoglinWatcher.java         |  4 +-
 .../types/InventoryLivingWatcher.java         |  8 +-
 .../watchers/types/LivingEntityWatcher.java   |  6 +-
 .../watchers/types/MooshroomWatcher.java      | 10 +--
 .../watchers/types/PandaWatcher.java          | 16 ++--
 .../watchers/types/ParrotWatcher.java         | 10 +--
 .../watchers/types/PhantomWatcher.java        |  4 +-
 .../watchers/types/PiglinWatcher.java         | 10 +--
 .../watchers/types/PlayerWatcher.java         | 17 ++---
 .../watchers/types/PufferfishWatcher.java     | 12 +--
 .../watchers/types/RabbitWatcher.java         | 10 +--
 .../watchers/types/SheepWatcher.java          |  4 +-
 .../watchers/types/ShulkerWatcher.java        | 10 +--
 .../watchers/types/SnifferWatcher.java        | 10 +--
 .../watchers/types/SnowGolemWatcher.java      |  6 +-
 .../watchers/types/TameableAnimalWatcher.java |  4 +-
 .../watchers/types/TropicalFishWatcher.java   |  4 +-
 .../watchers/types/VillagerWatcher.java       | 14 ++--
 .../watchers/types/WardenWatcher.java         | 16 ++--
 .../watchers/types/WolfWatcher.java           | 16 ++--
 .../watchers/types/ZoglinWatcher.java         |  4 +-
 .../watchers/types/ZombieVillagerWatcher.java | 15 ++--
 .../watchers/types/ZombieWatcher.java         |  4 +-
 .../types/horses/AbstractHorseWatcher.java    |  6 +-
 .../types/horses/ChestedHorseWatcher.java     |  4 +-
 .../watchers/types/horses/HorseWatcher.java   | 10 +--
 .../types/horses/SkeletonHorseWatcher.java    |  2 +-
 .../types/horses/ZombieHorseWatcher.java      |  2 +-
 .../watchers/types/llama/LlamaWatcher.java    | 12 +--
 .../types/llama/TraderLlamaWatcher.java       |  4 +-
 .../slimemagma/AbstractSlimeWatcher.java      |  8 +-
 .../types/slimemagma/MagmaWatcher.java        |  2 +-
 .../types/slimemagma/SlimeWatcher.java        |  2 +-
 .../listeners/AnimationPacketListener.java    |  4 +-
 .../listeners/EquipmentPacketListener.java    |  7 +-
 .../network/listeners/MetaPacketListener.java |  8 +-
 .../listeners/PlayerLookPacketListener.java   |  7 +-
 .../network/listeners/ProtocolListener.java   | 19 ++---
 .../network/listeners/SoundListener.java      |  7 +-
 .../network/listeners/SpawnPacketHandler.java | 18 ++---
 .../renderer/network/queue/PacketQueue.java   |  4 +-
 .../renderer/network/queue/QueueEntry.java    |  2 +-
 .../network/registries/CustomEntries.java     |  4 +-
 .../registries/RegisterParameters.java        |  2 +-
 .../network/registries/RegistryKey.java       |  2 +-
 .../network/registries/RenderRegistry.java    | 10 +--
 .../network/registries/ValueIndex.java        | 10 +--
 .../network/registries/WatcherIndex.java      | 21 +++---
 .../server/renderer/utilties/HolderUtils.java |  2 +-
 .../utilties/ProtocolRegistryUtils.java       |  6 +-
 .../renderer/utilties/WatcherUtils.java       |  6 +-
 .../morph/commands/AnimationCommand.java      | 16 ++--
 .../morph/commands/MorphCommand.java          | 14 ++--
 .../morph/commands/MorphCommandManager.java   |  4 +-
 .../morph/commands/MorphPlayerCommand.java    | 12 +--
 .../morph/commands/MorphPluginCommand.java    |  7 +-
 .../morph/commands/MorphTabCompleter.java     |  2 +-
 .../morph/commands/RequestCommand.java        | 12 +--
 .../morph/commands/UnMorphCommand.java        | 10 +--
 .../subcommands/MorphSubCommandHandler.java   |  8 +-
 .../subcommands/SubCommandGenerator.java      |  4 +-
 .../subcommands/plugin/BackendSubCommand.java | 18 ++---
 .../plugin/CheckUpdateSubCommand.java         | 12 +--
 .../plugin/DisguiseManageSubCommand.java      | 14 ++--
 .../subcommands/plugin/HelpSubCommand.java    | 14 ++--
 .../subcommands/plugin/LookupSubCommand.java  | 12 +--
 .../plugin/MakeSkillItemSubCommand.java       | 12 +--
 .../subcommands/plugin/OptionSubCommand.java  | 17 +++--
 .../plugin/QueryAllSubCommand.java            | 12 +--
 .../subcommands/plugin/QuerySubCommand.java   | 12 +--
 .../subcommands/plugin/ReloadSubCommand.java  | 30 ++++----
 .../plugin/SkinCacheSubCommand.java           | 30 ++++----
 .../subcommands/plugin/StatSubCommand.java    | 18 ++---
 .../plugin/ToggleSelfSubCommand.java          | 10 +--
 .../plugin/helpsections/Entry.java            |  2 +-
 .../plugin/helpsections/Section.java          |  2 +-
 .../management/ForceMorphSubCommand.java      | 14 ++--
 .../management/ForceUnmorphSubCommand.java    | 14 ++--
 .../management/GrantDisguiseSubCommand.java   |  9 ++-
 .../management/RevokeDisguiseSubCommand.java  | 14 ++--
 .../skincache/cmdTree/CommandBuilder.java     |  2 +-
 .../plugin/skincache/cmdTree/TreeCommand.java |  4 +-
 .../subcommands/request/AcceptSubCommand.java | 12 +--
 .../subcommands/request/DenySubCommand.java   | 12 +--
 .../subcommands/request/SendSubCommand.java   | 16 ++--
 .../nifeather}/morph/config/ConfigOption.java |  9 +--
 .../morph/config/MorphConfigManager.java      |  8 +-
 .../morph/events/CommonEventProcessor.java    | 48 ++++++------
 .../events/DisguiseAnimationProcessor.java    |  6 +-
 .../morph/events/EntityProcessor.java         | 23 +++---
 .../morph/events/ForcedDisguiseProcessor.java | 16 ++--
 .../events/InteractionMirrorProcessor.java    | 38 +++++-----
 .../morph/events/PlayerSkinProcessor.java     |  6 +-
 .../morph/events/PlayerTracker.java           |  4 +-
 .../morph/events/PluginEventListener.java     |  4 +-
 .../morph/events/RevealingEventProcessor.java | 18 ++---
 .../PlayerDisguisedFromOfflineStateEvent.java |  4 +-
 .../api/gameplay/PlayerExecuteSkillEvent.java |  4 +-
 .../PlayerJoinedWithDisguiseEvent.java        |  4 +-
 .../api/gameplay/PlayerMorphEarlyEvent.java   |  4 +-
 .../events/api/gameplay/PlayerMorphEvent.java |  4 +-
 .../api/gameplay/PlayerUnMorphEarlyEvent.java |  4 +-
 .../api/gameplay/PlayerUnMorphEvent.java      |  2 +-
 .../AbilitiesFinishedInitializeEvent.java     |  4 +-
 .../lifecycle/ConfigurationReloadEvent.java   |  2 +-
 .../ManagerFinishedInitializeEvent.java       |  4 +-
 .../SkillsFinishedInitializeEvent.java        |  4 +-
 .../interfaces/IManageOfflineStates.java      |  6 +-
 .../morph/interfaces/IManagePlayerData.java   |  6 +-
 .../morph/interfaces/IManageRequests.java     |  4 +-
 .../morph/messages/AbstractMorphStrings.java  |  4 +-
 .../morph/messages/BackendStrings.java        |  2 +-
 .../morph/messages/CapeStrings.java           |  2 +-
 .../morph/messages/CommandNameStrings.java    |  2 +-
 .../morph/messages/CommandStrings.java        |  2 +-
 .../morph/messages/CommonStrings.java         |  2 +-
 .../morph/messages/EmoteStrings.java          |  5 +-
 .../nifeather}/morph/messages/GuiStrings.java |  2 +-
 .../morph/messages/HelpStrings.java           |  2 +-
 .../morph/messages/HintStrings.java           |  2 +-
 .../morph/messages/MessageUtils.java          | 12 +--
 .../morph/messages/MorphMessageStore.java     |  8 +-
 .../morph/messages/MorphMessageSubStore.java  |  6 +-
 .../morph/messages/MorphStrings.java          |  2 +-
 .../morph/messages/RequestStrings.java        |  2 +-
 .../morph/messages/SkillStrings.java          |  2 +-
 .../morph/messages/SkinCacheStrings.java      |  2 +-
 .../morph/messages/StatStrings.java           |  2 +-
 .../morph/messages/TypesString.java           |  2 +-
 .../morph/messages/UpdateStrings.java         |  2 +-
 .../vanilla/BasicVanillaMessageStore.java     |  4 +-
 .../messages/vanilla/VanillaMessageStore.java |  6 +-
 .../vanilla/VanillaMessageSubStore.java       |  2 +-
 .../nifeather}/morph/misc/AnimationNames.java |  2 +-
 .../morph/misc/AnimationSequence.java         |  8 +-
 .../morph/misc/BlockDestroyHandler.java       |  2 +-
 .../nifeather}/morph/misc/CapeURL.java        |  6 +-
 .../morph/misc/CollisionBoxRecord.java        |  2 +-
 .../morph/misc/DisguiseBuildResult.java       |  4 +-
 .../morph/misc/DisguiseEquipment.java         |  6 +-
 .../nifeather}/morph/misc/DisguiseMeta.java   |  8 +-
 .../nifeather}/morph/misc/DisguiseState.java  | 46 ++++++------
 .../morph/misc/DisguiseStateGenerator.java    | 18 ++---
 .../nifeather}/morph/misc/DisguiseTypes.java  |  2 +-
 .../morph/misc/MorphChatRenderer.java         | 16 ++--
 .../morph/misc/MorphGameProfile.java          |  2 +-
 .../morph/misc/MorphParameters.java           |  2 +-
 .../morph/misc/NetworkingHelper.java          | 16 ++--
 .../morph/misc/NilCommandSource.java          |  2 +-
 .../nifeather}/morph/misc/NmsRecord.java      |  2 +-
 .../morph/misc/OfflineDisguiseResult.java     |  2 +-
 .../morph/misc/PlayerOperationSimulator.java  |  8 +-
 .../nifeather}/morph/misc/RequestInfo.java    |  2 +-
 .../nifeather}/morph/misc/SoundHandler.java   | 12 +--
 .../disguiseProperty/DisguiseProperties.java  |  4 +-
 .../disguiseProperty/PropertyHandler.java     |  6 +-
 .../misc/disguiseProperty/SingleProperty.java |  2 +-
 .../values/AbstractProperties.java            |  6 +-
 .../values/ArmorStandProperties.java          |  4 +-
 .../values/AxolotlProperties.java             |  4 +-
 .../values/CatProperties.java                 |  4 +-
 .../values/DefaultProperties.java             |  2 +-
 .../values/FoxProperties.java                 |  4 +-
 .../values/FrogProperties.java                |  4 +-
 .../values/GoatProperties.java                |  4 +-
 .../values/HorseProperties.java               |  4 +-
 .../values/LlamaProperties.java               |  4 +-
 .../values/MooshroomProperties.java           |  4 +-
 .../values/PandaProperties.java               |  4 +-
 .../values/ParrotProperties.java              |  4 +-
 .../values/RabbitProperties.java              |  4 +-
 .../values/VillagerProperties.java            |  4 +-
 .../values/WolfProperties.java                |  4 +-
 .../misc/gui/AnimSelectScreenWrapper.java     | 14 ++--
 .../misc/gui/DisguiseSelectScreenWrapper.java | 23 ++----
 .../nifeather}/morph/misc/gui/IconLookup.java |  6 +-
 .../morph/misc/gui/ScreenWrapper.java         |  7 +-
 .../modelengine/ModelEngineHelper.java        | 10 +--
 .../placeholderapi/IPlaceholderProvider.java  |  2 +-
 .../placeholderapi/MatchMode.java             |  2 +-
 .../PlaceholderIntegration.java               |  6 +-
 .../builtin/AvaliableDisguisesProvider.java   | 12 +--
 .../builtin/StateNameProvider.java            | 10 +--
 .../residence/ResidenceEventProcessor.java    |  6 +-
 .../misc/integrations/tab/TabAdapter.java     | 12 +--
 .../misc/mobs/MorphBukkitVexModifier.java     |  2 +-
 .../misc/permissions/CommonPermissions.java   |  6 +-
 .../misc/playerList/PlayerListHandler.java    |  6 +-
 .../morph/misc/recipe/RecipeManager.java      |  8 +-
 .../morph/misc/recipe/RecipeOptions.java      |  2 +-
 .../morph/misc/recipe/RecipeProperty.java     |  2 +-
 .../misc/recipe/RecipeYamlConfigManager.java  |  4 +-
 .../recipe/StandaloneYamlConfigManager.java   |  4 +-
 .../morph/misc/skins/PlayerSkinProvider.java  |  8 +-
 .../morph/misc/skins/SingleSkin.java          |  4 +-
 .../morph/misc/skins/SkinCache.java           |  4 +-
 .../morph/misc/skins/SkinCacheRoot.java       |  2 +-
 .../nifeather}/morph/network/ReasonCodes.java |  2 +-
 .../modrinthapi/ModrinthVersionResponse.java  |  2 +-
 .../multiInstance/IInstanceService.java       |  2 +-
 .../multiInstance/MultiInstanceService.java   | 22 +++---
 .../multiInstance/master/InstanceServer.java  |  4 +-
 .../multiInstance/master/MasterInstance.java  | 30 ++++----
 .../master/NetworkDisguiseManager.java        | 10 +--
 .../protocol/IClientHandler.java              |  8 +-
 .../protocol/IMasterHandler.java              | 12 +--
 .../multiInstance/protocol/Operation.java     |  2 +-
 .../multiInstance/protocol/ProtocolLevel.java |  2 +-
 .../protocol/SocketDisguiseMeta.java          |  2 +-
 .../protocol/c2s/MIC2SCommand.java            |  6 +-
 .../c2s/MIC2SDisguiseMetaCommand.java         | 10 +--
 .../protocol/c2s/MIC2SLoginCommand.java       |  8 +-
 .../protocol/s2c/MIS2CCommand.java            |  6 +-
 .../protocol/s2c/MIS2CDisconnectCommand.java  |  6 +-
 .../protocol/s2c/MIS2CLoginResultCommand.java |  4 +-
 .../protocol/s2c/MIS2CStateCommand.java       |  4 +-
 .../protocol/s2c/MIS2CSyncMetaCommand.java    | 10 +--
 .../protocol/s2c/ProtocolState.java           |  2 +-
 .../multiInstance/slave/InstanceClient.java   |  4 +-
 .../multiInstance/slave/SlaveInstance.java    | 32 ++++----
 .../network/server/MorphClientHandler.java    | 26 +++----
 .../network/server/ServerSetEquipCommand.java |  4 +-
 .../animation/AnimationProvider.java          | 15 ++++
 .../providers/animation/AnimationSet.java     |  4 +-
 .../providers/animation/SingleAnimation.java  |  2 +-
 .../animation/bundled/AllayAnimationSet.java  |  8 +-
 .../bundled/ArmadilloAnimationSet.java        |  8 +-
 .../animation/bundled/CatAnimationSet.java    |  8 +-
 .../bundled/FallbackAnimationSet.java         |  7 ++
 .../animation/bundled/FoxAnimationSet.java    |  8 +-
 .../animation/bundled/FrogAnimationSet.java   |  8 +-
 .../animation/bundled/PandaAnimationSet.java  |  8 +-
 .../animation/bundled/ParrotAnimationSet.java |  8 +-
 .../animation/bundled/PiglinAnimationSet.java |  8 +-
 .../animation/bundled/PlayerAnimationSet.java |  8 +-
 .../bundled/PufferfishAnimationSet.java       |  8 +-
 .../bundled/ShulkerAnimationSet.java          |  8 +-
 .../bundled/SnifferAnimationSet.java          |  8 +-
 .../animation/bundled/WardenAnimationSet.java |  8 +-
 .../animation/bundled/WolfAnimationSet.java   |  8 +-
 .../provider/DefaultAnimationProvider.java    |  8 +-
 .../provider/FallbackAnimationProvider.java   |  9 +--
 .../provider/PlayerAnimationProvider.java     |  9 +--
 .../provider/VanillaAnimationProvider.java    |  7 +-
 .../disguise/DefaultDisguiseProvider.java     | 22 +++---
 .../providers/disguise/DisguiseProvider.java  | 23 +++---
 .../providers/disguise/DisguiseResult.java    |  4 +-
 .../disguise/FallbackDisguiseProvider.java    | 12 +--
 .../disguise/ModelEngineProvider.java         | 19 +++--
 .../disguise/PlayerDisguiseProvider.java      | 26 +++----
 .../disguise/VanillaDisguiseProvider.java     | 32 ++++----
 .../morph/skills/DefaultConfigGenerator.java  | 26 ++++---
 .../nifeather}/morph/skills/IMorphSkill.java  | 12 +--
 .../nifeather}/morph/skills/MorphSkill.java   | 12 +--
 .../morph/skills/MorphSkillHandler.java       | 30 ++++----
 .../morph/skills/SkillCooldownInfo.java       |  2 +-
 .../nifeather}/morph/skills/SkillType.java    |  2 +-
 .../skills/impl/ApplyEffectMorphSkill.java    | 16 ++--
 .../morph/skills/impl/DelayedMorphSkill.java  | 12 +--
 .../morph/skills/impl/ExplodeMorphSkill.java  | 16 ++--
 .../skills/impl/InventoryMorphSkill.java      | 20 ++---
 .../impl/LaunchProjectileMorphSkill.java      | 18 ++---
 .../morph/skills/impl/NoneMorphSkill.java     | 12 +--
 .../skills/impl/SonicBoomMorphSkill.java      | 16 ++--
 .../morph/skills/impl/SplashPotionSkill.java  | 14 ++--
 .../skills/impl/SummonFangsMorphSkill.java    | 20 ++---
 .../morph/skills/impl/TeleportMorphSkill.java | 16 ++--
 .../skills/options/EffectConfiguration.java   |  4 +-
 .../options/ExplosionConfiguration.java       |  4 +-
 .../skills/options/NoOpConfiguration.java     |  4 +-
 .../options/ProjectileConfiguration.java      |  4 +-
 .../skills/options/SummonConfiguration.java   |  4 +-
 .../skills/options/TeleportConfiguration.java |  4 +-
 .../morph/storage/DirectoryStorage.java       |  4 +-
 .../morph/storage/MorphJsonBasedStorage.java  |  4 +-
 .../mirrorlogging/MirrorSingleEntry.java      |  2 +-
 .../storage/mirrorlogging/OperationType.java  |  2 +-
 .../storage/offlinestore/IOfflineState.java   |  5 ++
 .../offlinestore/OfflineDisguiseState.java    |  2 +-
 .../offlinestore/OfflineStateContainer.java   |  2 +-
 .../offlinestore/OfflineStateStore.java       | 10 +--
 .../storage/playerdata/PlayerDataStore.java   | 18 ++---
 .../morph/storage/playerdata/PlayerMeta.java  |  6 +-
 .../playerdata/PlayerMetaContainer.java       |  2 +-
 .../morph/storage/skill/ISkillOption.java     |  4 +-
 .../skill/SkillAbilityConfiguration.java      | 16 ++--
 .../SkillAbilityConfigurationContainer.java   |  2 +-
 .../skill/SkillAbilityConfigurationStore.java | 34 ++++-----
 .../morph/transforms/BindableTransform.java   |  4 +-
 .../morph/transforms/DelayTransform.java      |  4 +-
 .../morph/transforms/GenericTransform.java    |  4 +-
 .../nifeather}/morph/transforms/Recorder.java |  2 +-
 .../morph/transforms/Transform.java           |  4 +-
 .../morph/transforms/TransformUtils.java      |  4 +-
 .../morph/transforms/Transformer.java         |  8 +-
 .../morph/transforms/easings/Easing.java      |  4 +-
 .../morph/transforms/easings/IEasing.java     |  2 +-
 .../transforms/easings/impl/EasingImpl.java   |  6 +-
 .../nifeather}/morph/updates/Platforms.java   |  2 +-
 .../morph/updates/SingleUpdateInfoMeta.java   |  4 +-
 .../morph/updates/UpdateHandler.java          | 16 ++--
 .../morph/updates/VersionHandling.java        |  2 +-
 .../morph/utilities/BindableUtils.java        |  2 +-
 .../morph/utilities/CollisionUtils.java       |  2 +-
 .../morph/utilities/DamageSourceUtils.java    |  2 +-
 .../morph/utilities/DisguiseUtils.java        |  6 +-
 .../morph/utilities/EntityTypeUtils.java      |  6 +-
 .../nifeather}/morph/utilities/ItemUtils.java |  5 +-
 .../morph/utilities/MapMetaUtils.java         |  2 +-
 .../nifeather}/morph/utilities/MathUtils.java |  2 +-
 .../nifeather}/morph/utilities/NbtUtils.java  |  6 +-
 .../nifeather}/morph/utilities/NmsUtils.java  |  4 +-
 .../morph/utilities/PermissionUtils.java      |  2 +-
 .../morph/utilities/PluginAssetUtils.java     |  4 +-
 .../morph/utilities/ReflectionUtils.java      |  2 +-
 .../morph/utilities/SoundUtils.java           |  2 +-
 461 files changed, 1843 insertions(+), 1866 deletions(-)
 delete mode 100644 src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/MonsterValues.java
 delete mode 100644 src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/basetypes/AbstractGolemValues.java
 delete mode 100644 src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/basetypes/AgeableMobValues.java
 delete mode 100644 src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/basetypes/AnimalValues.java
 delete mode 100644 src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/basetypes/WaterAnimalValues.java
 delete mode 100644 src/main/java/xiamomc/morph/providers/animation/AnimationProvider.java
 delete mode 100644 src/main/java/xiamomc/morph/providers/animation/bundled/FallbackAnimationSet.java
 delete mode 100644 src/main/java/xiamomc/morph/storage/offlinestore/IOfflineState.java
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/MorphManager.java (96%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/MorphPlugin.java (86%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/MorphPluginObject.java (96%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/RequestManager.java (92%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/RevealingHandler.java (97%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/abilities/AbilityManager.java (90%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/abilities/AbilityType.java (98%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/abilities/AbilityUpdater.java (95%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/abilities/EffectMorphAbility.java (89%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/abilities/IMorphAbility.java (95%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/abilities/MorphAbility.java (95%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/abilities/impl/AttributeModifyingAbility.java (93%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/abilities/impl/BossbarAbility.java (90%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/abilities/impl/BurnsUnderSunAbility.java (86%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/abilities/impl/ChatOverrideAbility.java (82%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/abilities/impl/DamageReducingAbility.java (85%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/abilities/impl/DryOutInAirAbility.java (78%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/abilities/impl/FlyAbility.java (93%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/abilities/impl/HealsFromEntityAbility.java (93%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/abilities/impl/NoFallDamageAbility.java (88%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/abilities/impl/NoOpOptionAbility.java (61%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/abilities/impl/NoSweetBushDamageAbility.java (90%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/abilities/impl/OnAttackAbility.java (82%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/abilities/impl/ReduceFallDamageAbility.java (79%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/abilities/impl/ReduceMagicDamageAbility.java (79%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/abilities/impl/SmallJumpBoostAbility.java (79%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/abilities/impl/SnowyAbility.java (89%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/abilities/impl/SpiderAbility.java (82%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/abilities/impl/TakesDamageFromWaterAbility.java (74%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/abilities/impl/WardenAbility.java (96%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/abilities/impl/WardenLessAwareAbility.java (92%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/abilities/impl/onAttack/ExtraKnockbackAbility.java (90%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/abilities/impl/onAttack/PotionOnAttackAbility.java (83%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/abilities/impl/potion/BreatheUnderWaterAbility.java (78%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/abilities/impl/potion/FeatherFallingAbility.java (78%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/abilities/impl/potion/FireResistanceAbility.java (78%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/abilities/impl/potion/JumpBoostAbility.java (77%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/abilities/impl/potion/NightVisionAbility.java (80%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/abilities/impl/potion/SpeedBoostAbility.java (77%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/abilities/options/AttributeModifyOption.java (97%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/abilities/options/BossbarOption.java (96%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/abilities/options/ChatOverrideOption.java (86%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/abilities/options/DryoutAbilityOption.java (85%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/abilities/options/ExtraKnockbackOption.java (91%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/abilities/options/FlyOption.java (91%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/abilities/options/HealsFromEntityOption.java (93%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/abilities/options/PotionEffectOption.java (89%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/abilities/options/ReduceDamageOption.java (90%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/abilities/options/TakesDamageFromWaterOption.java (79%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/DisguiseBackend.java (98%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/DisguiseWrapper.java (97%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/EventWrapper.java (94%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/WrapperAttribute.java (97%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/WrapperEvent.java (80%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/fallback/NilBackend.java (93%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/fallback/NilDisguise.java (96%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/fallback/NilWrapper.java (91%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/modelengine/MEBackend.java (95%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/modelengine/MEDisguiseInstance.java (76%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/modelengine/MEDisguiseWrapper.java (94%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/modelengine/vanish/IVanishSource.java (73%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/modelengine/vanish/ProtocolLibVanishSource.java (87%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/modelengine/vanish/VanillaVanishSource.java (85%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/ServerBackend.java (95%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/ServerDisguise.java (97%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/ServerDisguiseWrapper.java (90%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/ServerRenderer.java (79%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/DisplayParameters.java (83%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/PacketFactory.java (94%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/ProtocolEquipment.java (93%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/ProtocolHandler.java (93%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/TestPacketListener.java (95%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/values/AbstractValues.java (87%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/values/AllayValues.java (79%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/values/ArmadilloValues.java (71%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/values/ArmorStandValues.java (86%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/values/AxolotlValues.java (72%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/values/CatValues.java (81%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/values/CreeperValues.java (85%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/values/FoxValues.java (75%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/values/FrogValues.java (79%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/values/GhastValues.java (73%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/values/GoatValues.java (71%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/values/GuardianValues.java (82%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/values/HorseValues.java (55%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/values/LlamaValues.java (63%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/values/MobValues.java (55%)
 create mode 100644 src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/MonsterValues.java
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/values/MooshroomValues.java (66%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/values/PandaValues.java (80%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/values/ParrotValues.java (58%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/values/PhantomValues.java (72%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/values/PiglinValues.java (70%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/values/PlayerValues.java (82%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/values/PufferfishValues.java (68%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/values/RabbitValues.java (55%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/values/SheepValues.java (55%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/values/ShulkerValues.java (85%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/values/SingleValue.java (97%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/values/SlimeValues.java (72%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/values/SnifferValues.java (69%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/values/SnowGolemValues.java (66%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/values/TropicalFishValues.java (57%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/values/VillagerValues.java (71%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/values/WolfValues.java (89%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/values/ZoglinValues.java (73%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/values/ZombieValues.java (84%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/values/ZombieVillagerValues.java (87%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/values/basetypes/AbstractFishValues.java (58%)
 create mode 100644 src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/basetypes/AbstractGolemValues.java
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/values/basetypes/AbstractHorseValues.java (57%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/values/basetypes/AbstractVillagerValues.java (60%)
 create mode 100644 src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/basetypes/AgeableMobValues.java
 create mode 100644 src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/basetypes/AnimalValues.java
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/values/basetypes/BasePiglinValues.java (50%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/values/basetypes/ChestedHorseValues.java (58%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/values/basetypes/EntityValues.java (82%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/values/basetypes/LivingEntityValues.java (88%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/values/basetypes/TameableAnimalValues.java (71%)
 create mode 100644 src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/basetypes/WaterAnimalValues.java
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/watchers/SingleWatcher.java (95%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/watchers/types/AgeableMobWatcher.java (69%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/watchers/types/AllayWatcher.java (71%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/watchers/types/ArmadilloWatcher.java (84%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/watchers/types/ArmorStandWatcher.java (93%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/watchers/types/AxolotlWatcher.java (80%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/watchers/types/CatWatcher.java (89%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/watchers/types/CreeperWatcher.java (83%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/watchers/types/DonkeyWatcher.java (53%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/watchers/types/EHasAttackAnimationWatcher.java (77%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/watchers/types/EntityWatcher.java (87%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/watchers/types/FoxWatcher.java (77%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/watchers/types/FrogWatcher.java (88%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/watchers/types/GhastWatcher.java (67%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/watchers/types/GoatWatcher.java (82%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/watchers/types/GuardianWatcher.java (74%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/watchers/types/HoglinWatcher.java (79%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/watchers/types/InventoryLivingWatcher.java (69%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/watchers/types/LivingEntityWatcher.java (94%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/watchers/types/MooshroomWatcher.java (77%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/watchers/types/PandaWatcher.java (84%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/watchers/types/ParrotWatcher.java (78%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/watchers/types/PhantomWatcher.java (82%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/watchers/types/PiglinWatcher.java (80%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/watchers/types/PlayerWatcher.java (84%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/watchers/types/PufferfishWatcher.java (79%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/watchers/types/RabbitWatcher.java (79%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/watchers/types/SheepWatcher.java (82%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/watchers/types/ShulkerWatcher.java (83%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/watchers/types/SnifferWatcher.java (79%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/watchers/types/SnowGolemWatcher.java (79%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/watchers/types/TameableAnimalWatcher.java (90%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/watchers/types/TropicalFishWatcher.java (83%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/watchers/types/VillagerWatcher.java (92%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/watchers/types/WardenWatcher.java (91%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/watchers/types/WolfWatcher.java (89%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/watchers/types/ZoglinWatcher.java (79%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/watchers/types/ZombieVillagerWatcher.java (92%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/watchers/types/ZombieWatcher.java (81%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/watchers/types/horses/AbstractHorseWatcher.java (70%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/watchers/types/horses/ChestedHorseWatcher.java (79%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/watchers/types/horses/HorseWatcher.java (85%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/watchers/types/horses/SkeletonHorseWatcher.java (73%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/watchers/types/horses/ZombieHorseWatcher.java (72%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/watchers/types/llama/LlamaWatcher.java (74%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/watchers/types/llama/TraderLlamaWatcher.java (67%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/watchers/types/slimemagma/AbstractSlimeWatcher.java (75%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/watchers/types/slimemagma/MagmaWatcher.java (70%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/datawatcher/watchers/types/slimemagma/SlimeWatcher.java (70%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/listeners/AnimationPacketListener.java (93%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/listeners/EquipmentPacketListener.java (90%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/listeners/MetaPacketListener.java (90%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/listeners/PlayerLookPacketListener.java (96%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/listeners/ProtocolListener.java (84%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/listeners/SoundListener.java (95%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/listeners/SpawnPacketHandler.java (91%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/queue/PacketQueue.java (95%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/queue/QueueEntry.java (94%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/registries/CustomEntries.java (93%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/registries/RegisterParameters.java (60%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/registries/RegistryKey.java (92%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/registries/RenderRegistry.java (94%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/registries/ValueIndex.java (90%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/network/registries/WatcherIndex.java (77%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/utilties/HolderUtils.java (94%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/utilties/ProtocolRegistryUtils.java (89%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/backends/server/renderer/utilties/WatcherUtils.java (84%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/commands/AnimationCommand.java (88%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/commands/MorphCommand.java (87%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/commands/MorphCommandManager.java (96%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/commands/MorphPlayerCommand.java (88%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/commands/MorphPluginCommand.java (87%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/commands/MorphTabCompleter.java (97%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/commands/RequestCommand.java (73%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/commands/UnMorphCommand.java (81%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/commands/subcommands/MorphSubCommandHandler.java (79%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/commands/subcommands/SubCommandGenerator.java (96%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/commands/subcommands/plugin/BackendSubCommand.java (84%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/commands/subcommands/plugin/CheckUpdateSubCommand.java (83%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/commands/subcommands/plugin/DisguiseManageSubCommand.java (67%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/commands/subcommands/plugin/HelpSubCommand.java (94%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/commands/subcommands/plugin/LookupSubCommand.java (86%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/commands/subcommands/plugin/MakeSkillItemSubCommand.java (84%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/commands/subcommands/plugin/OptionSubCommand.java (96%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/commands/subcommands/plugin/QueryAllSubCommand.java (89%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/commands/subcommands/plugin/QuerySubCommand.java (90%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/commands/subcommands/plugin/ReloadSubCommand.java (80%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/commands/subcommands/plugin/SkinCacheSubCommand.java (95%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/commands/subcommands/plugin/StatSubCommand.java (90%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/commands/subcommands/plugin/ToggleSelfSubCommand.java (81%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/commands/subcommands/plugin/helpsections/Entry.java (79%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/commands/subcommands/plugin/helpsections/Section.java (93%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/commands/subcommands/plugin/management/ForceMorphSubCommand.java (88%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/commands/subcommands/plugin/management/ForceUnmorphSubCommand.java (86%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/commands/subcommands/plugin/management/GrantDisguiseSubCommand.java (94%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/commands/subcommands/plugin/management/RevokeDisguiseSubCommand.java (90%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/commands/subcommands/plugin/skincache/cmdTree/CommandBuilder.java (67%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/commands/subcommands/plugin/skincache/cmdTree/TreeCommand.java (97%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/commands/subcommands/request/AcceptSubCommand.java (85%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/commands/subcommands/request/DenySubCommand.java (85%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/commands/subcommands/request/SendSubCommand.java (86%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/config/ConfigOption.java (98%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/config/MorphConfigManager.java (98%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/events/CommonEventProcessor.java (93%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/events/DisguiseAnimationProcessor.java (90%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/events/EntityProcessor.java (97%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/events/ForcedDisguiseProcessor.java (87%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/events/InteractionMirrorProcessor.java (96%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/events/PlayerSkinProcessor.java (77%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/events/PlayerTracker.java (99%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/events/PluginEventListener.java (92%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/events/RevealingEventProcessor.java (92%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/events/api/gameplay/PlayerDisguisedFromOfflineStateEvent.java (90%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/events/api/gameplay/PlayerExecuteSkillEvent.java (93%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/events/api/gameplay/PlayerJoinedWithDisguiseEvent.java (90%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/events/api/gameplay/PlayerMorphEarlyEvent.java (95%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/events/api/gameplay/PlayerMorphEvent.java (89%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/events/api/gameplay/PlayerUnMorphEarlyEvent.java (95%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/events/api/gameplay/PlayerUnMorphEvent.java (92%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/events/api/lifecycle/AbilitiesFinishedInitializeEvent.java (84%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/events/api/lifecycle/ConfigurationReloadEvent.java (93%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/events/api/lifecycle/ManagerFinishedInitializeEvent.java (86%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/events/api/lifecycle/SkillsFinishedInitializeEvent.java (84%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/interfaces/IManageOfflineStates.java (63%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/interfaces/IManagePlayerData.java (91%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/interfaces/IManageRequests.java (90%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/messages/AbstractMorphStrings.java (84%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/messages/BackendStrings.java (96%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/messages/CapeStrings.java (98%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/messages/CommandNameStrings.java (97%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/messages/CommandStrings.java (99%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/messages/CommonStrings.java (96%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/messages/EmoteStrings.java (94%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/messages/GuiStrings.java (96%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/messages/HelpStrings.java (99%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/messages/HintStrings.java (97%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/messages/MessageUtils.java (93%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/messages/MorphMessageStore.java (96%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/messages/MorphMessageSubStore.java (94%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/messages/MorphStrings.java (99%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/messages/RequestStrings.java (98%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/messages/SkillStrings.java (98%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/messages/SkinCacheStrings.java (98%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/messages/StatStrings.java (98%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/messages/TypesString.java (94%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/messages/UpdateStrings.java (96%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/messages/vanilla/BasicVanillaMessageStore.java (97%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/messages/vanilla/VanillaMessageStore.java (94%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/messages/vanilla/VanillaMessageSubStore.java (88%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/misc/AnimationNames.java (98%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/misc/AnimationSequence.java (95%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/misc/BlockDestroyHandler.java (99%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/misc/CapeURL.java (97%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/misc/CollisionBoxRecord.java (94%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/misc/DisguiseBuildResult.java (91%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/misc/DisguiseEquipment.java (98%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/misc/DisguiseMeta.java (95%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/misc/DisguiseState.java (95%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/misc/DisguiseStateGenerator.java (90%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/misc/DisguiseTypes.java (98%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/misc/MorphChatRenderer.java (90%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/misc/MorphGameProfile.java (98%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/misc/MorphParameters.java (98%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/misc/NetworkingHelper.java (91%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/misc/NilCommandSource.java (97%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/misc/NmsRecord.java (98%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/misc/OfflineDisguiseResult.java (68%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/misc/PlayerOperationSimulator.java (98%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/misc/RequestInfo.java (91%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/misc/SoundHandler.java (93%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/misc/disguiseProperty/DisguiseProperties.java (94%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/misc/disguiseProperty/PropertyHandler.java (94%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/misc/disguiseProperty/SingleProperty.java (96%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/misc/disguiseProperty/values/AbstractProperties.java (87%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/misc/disguiseProperty/values/ArmorStandProperties.java (65%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/misc/disguiseProperty/values/AxolotlProperties.java (73%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/misc/disguiseProperty/values/CatProperties.java (77%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/misc/disguiseProperty/values/DefaultProperties.java (52%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/misc/disguiseProperty/values/FoxProperties.java (70%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/misc/disguiseProperty/values/FrogProperties.java (75%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/misc/disguiseProperty/values/GoatProperties.java (78%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/misc/disguiseProperty/values/HorseProperties.java (78%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/misc/disguiseProperty/values/LlamaProperties.java (73%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/misc/disguiseProperty/values/MooshroomProperties.java (77%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/misc/disguiseProperty/values/PandaProperties.java (80%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/misc/disguiseProperty/values/ParrotProperties.java (74%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/misc/disguiseProperty/values/RabbitProperties.java (73%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/misc/disguiseProperty/values/VillagerProperties.java (85%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/misc/disguiseProperty/values/WolfProperties.java (84%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/misc/gui/AnimSelectScreenWrapper.java (93%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/misc/gui/DisguiseSelectScreenWrapper.java (93%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/misc/gui/IconLookup.java (97%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/misc/gui/ScreenWrapper.java (92%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/misc/integrations/modelengine/ModelEngineHelper.java (75%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/misc/integrations/placeholderapi/IPlaceholderProvider.java (91%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/misc/integrations/placeholderapi/MatchMode.java (74%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/misc/integrations/placeholderapi/PlaceholderIntegration.java (91%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/misc/integrations/placeholderapi/builtin/AvaliableDisguisesProvider.java (79%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/misc/integrations/placeholderapi/builtin/StateNameProvider.java (80%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/misc/integrations/residence/ResidenceEventProcessor.java (91%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/misc/integrations/tab/TabAdapter.java (84%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/misc/mobs/MorphBukkitVexModifier.java (99%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/misc/permissions/CommonPermissions.java (95%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/misc/playerList/PlayerListHandler.java (97%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/misc/recipe/RecipeManager.java (97%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/misc/recipe/RecipeOptions.java (97%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/misc/recipe/RecipeProperty.java (93%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/misc/recipe/RecipeYamlConfigManager.java (95%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/misc/recipe/StandaloneYamlConfigManager.java (98%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/misc/skins/PlayerSkinProvider.java (97%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/misc/skins/SingleSkin.java (92%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/misc/skins/SkinCache.java (95%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/misc/skins/SkinCacheRoot.java (88%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/network/ReasonCodes.java (65%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/network/modrinthapi/ModrinthVersionResponse.java (95%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/network/multiInstance/IInstanceService.java (73%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/network/multiInstance/MultiInstanceService.java (83%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/network/multiInstance/master/InstanceServer.java (95%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/network/multiInstance/master/MasterInstance.java (91%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/network/multiInstance/master/NetworkDisguiseManager.java (88%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/network/multiInstance/protocol/IClientHandler.java (58%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/network/multiInstance/protocol/IMasterHandler.java (52%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/network/multiInstance/protocol/Operation.java (53%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/network/multiInstance/protocol/ProtocolLevel.java (93%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/network/multiInstance/protocol/SocketDisguiseMeta.java (96%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/network/multiInstance/protocol/c2s/MIC2SCommand.java (85%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/network/multiInstance/protocol/c2s/MIC2SDisguiseMetaCommand.java (81%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/network/multiInstance/protocol/c2s/MIC2SLoginCommand.java (85%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/network/multiInstance/protocol/s2c/MIS2CCommand.java (85%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/network/multiInstance/protocol/s2c/MIS2CDisconnectCommand.java (88%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/network/multiInstance/protocol/s2c/MIS2CLoginResultCommand.java (79%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/network/multiInstance/protocol/s2c/MIS2CStateCommand.java (85%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/network/multiInstance/protocol/s2c/MIS2CSyncMetaCommand.java (78%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/network/multiInstance/protocol/s2c/ProtocolState.java (84%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/network/multiInstance/slave/InstanceClient.java (94%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/network/multiInstance/slave/SlaveInstance.java (89%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/network/server/MorphClientHandler.java (97%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/network/server/ServerSetEquipCommand.java (92%)
 create mode 100644 src/main/java/xyz/nifeather/morph/providers/animation/AnimationProvider.java
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/providers/animation/AnimationSet.java (97%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/providers/animation/SingleAnimation.java (84%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/providers/animation/bundled/AllayAnimationSet.java (67%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/providers/animation/bundled/ArmadilloAnimationSet.java (78%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/providers/animation/bundled/CatAnimationSet.java (72%)
 create mode 100644 src/main/java/xyz/nifeather/morph/providers/animation/bundled/FallbackAnimationSet.java
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/providers/animation/bundled/FoxAnimationSet.java (73%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/providers/animation/bundled/FrogAnimationSet.java (54%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/providers/animation/bundled/PandaAnimationSet.java (66%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/providers/animation/bundled/ParrotAnimationSet.java (67%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/providers/animation/bundled/PiglinAnimationSet.java (67%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/providers/animation/bundled/PlayerAnimationSet.java (72%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/providers/animation/bundled/PufferfishAnimationSet.java (67%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/providers/animation/bundled/ShulkerAnimationSet.java (75%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/providers/animation/bundled/SnifferAnimationSet.java (56%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/providers/animation/bundled/WardenAnimationSet.java (87%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/providers/animation/bundled/WolfAnimationSet.java (65%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/providers/animation/provider/DefaultAnimationProvider.java (73%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/providers/animation/provider/FallbackAnimationProvider.java (52%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/providers/animation/provider/PlayerAnimationProvider.java (53%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/providers/animation/provider/VanillaAnimationProvider.java (86%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/providers/disguise/DefaultDisguiseProvider.java (91%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/providers/disguise/DisguiseProvider.java (94%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/providers/disguise/DisguiseResult.java (90%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/providers/disguise/FallbackDisguiseProvider.java (86%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/providers/disguise/ModelEngineProvider.java (92%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/providers/disguise/PlayerDisguiseProvider.java (91%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/providers/disguise/VanillaDisguiseProvider.java (94%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/skills/DefaultConfigGenerator.java (94%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/skills/IMorphSkill.java (87%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/skills/MorphSkill.java (92%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/skills/MorphSkillHandler.java (93%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/skills/SkillCooldownInfo.java (96%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/skills/SkillType.java (97%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/skills/impl/ApplyEffectMorphSkill.java (85%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/skills/impl/DelayedMorphSkill.java (89%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/skills/impl/ExplodeMorphSkill.java (88%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/skills/impl/InventoryMorphSkill.java (79%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/skills/impl/LaunchProjectileMorphSkill.java (88%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/skills/impl/NoneMorphSkill.java (73%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/skills/impl/SonicBoomMorphSkill.java (89%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/skills/impl/SplashPotionSkill.java (91%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/skills/impl/SummonFangsMorphSkill.java (89%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/skills/impl/TeleportMorphSkill.java (88%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/skills/options/EffectConfiguration.java (95%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/skills/options/ExplosionConfiguration.java (92%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/skills/options/NoOpConfiguration.java (86%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/skills/options/ProjectileConfiguration.java (96%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/skills/options/SummonConfiguration.java (79%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/skills/options/TeleportConfiguration.java (84%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/storage/DirectoryStorage.java (98%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/storage/MorphJsonBasedStorage.java (76%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/storage/mirrorlogging/MirrorSingleEntry.java (96%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/storage/mirrorlogging/OperationType.java (74%)
 create mode 100644 src/main/java/xyz/nifeather/morph/storage/offlinestore/IOfflineState.java
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/storage/offlinestore/OfflineDisguiseState.java (96%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/storage/offlinestore/OfflineStateContainer.java (83%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/storage/offlinestore/OfflineStateStore.java (89%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/storage/playerdata/PlayerDataStore.java (94%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/storage/playerdata/PlayerMeta.java (95%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/storage/playerdata/PlayerMetaContainer.java (88%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/storage/skill/ISkillOption.java (99%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/storage/skill/SkillAbilityConfiguration.java (95%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/storage/skill/SkillAbilityConfigurationContainer.java (87%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/storage/skill/SkillAbilityConfigurationStore.java (93%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/transforms/BindableTransform.java (90%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/transforms/DelayTransform.java (83%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/transforms/GenericTransform.java (90%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/transforms/Recorder.java (92%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/transforms/Transform.java (93%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/transforms/TransformUtils.java (96%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/transforms/Transformer.java (94%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/transforms/easings/Easing.java (84%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/transforms/easings/IEasing.java (60%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/transforms/easings/impl/EasingImpl.java (96%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/updates/Platforms.java (93%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/updates/SingleUpdateInfoMeta.java (96%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/updates/UpdateHandler.java (96%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/updates/VersionHandling.java (98%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/utilities/BindableUtils.java (92%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/utilities/CollisionUtils.java (95%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/utilities/DamageSourceUtils.java (98%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/utilities/DisguiseUtils.java (94%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/utilities/EntityTypeUtils.java (99%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/utilities/ItemUtils.java (97%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/utilities/MapMetaUtils.java (98%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/utilities/MathUtils.java (95%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/utilities/NbtUtils.java (98%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/utilities/NmsUtils.java (98%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/utilities/PermissionUtils.java (88%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/utilities/PluginAssetUtils.java (94%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/utilities/ReflectionUtils.java (99%)
 rename src/main/java/{xiamomc => xyz/nifeather}/morph/utilities/SoundUtils.java (96%)

diff --git a/build.gradle.kts b/build.gradle.kts
index 26611af0..ad89e15a 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -130,7 +130,7 @@ bukkit {
         featherMorphCommand.aliases = listOf("fm");
     }
 
-    val permissionRoot = "xiamomc.morph."
+    val permissionRoot = "feathermorph."
 
     permissions {
         register(permissionRoot + "morph")
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/MonsterValues.java b/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/MonsterValues.java
deleted file mode 100644
index 7c6251d3..00000000
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/MonsterValues.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.values;
-
-public class MonsterValues extends MobValues
-{
-}
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/basetypes/AbstractGolemValues.java b/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/basetypes/AbstractGolemValues.java
deleted file mode 100644
index 8553895d..00000000
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/basetypes/AbstractGolemValues.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.values.basetypes;
-
-import xiamomc.morph.backends.server.renderer.network.datawatcher.values.MobValues;
-
-public class AbstractGolemValues extends MobValues
-{
-}
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/basetypes/AgeableMobValues.java b/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/basetypes/AgeableMobValues.java
deleted file mode 100644
index 14269228..00000000
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/basetypes/AgeableMobValues.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.values.basetypes;
-
-import xiamomc.morph.backends.server.renderer.network.datawatcher.values.MobValues;
-import xiamomc.morph.backends.server.renderer.network.datawatcher.values.SingleValue;
-
-public class AgeableMobValues extends MobValues
-{
-    public final SingleValue<Boolean> IS_BABY = createSingle("ageable_mob_is_baby", false);
-
-    public AgeableMobValues()
-    {
-        super();
-
-        registerSingle(IS_BABY);
-    }
-}
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/basetypes/AnimalValues.java b/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/basetypes/AnimalValues.java
deleted file mode 100644
index 44c93576..00000000
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/basetypes/AnimalValues.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.values.basetypes;
-
-public class AnimalValues extends AgeableMobValues
-{
-}
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/basetypes/WaterAnimalValues.java b/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/basetypes/WaterAnimalValues.java
deleted file mode 100644
index 1dc91e31..00000000
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/basetypes/WaterAnimalValues.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.values.basetypes;
-
-import xiamomc.morph.backends.server.renderer.network.datawatcher.values.MobValues;
-
-public class WaterAnimalValues extends MobValues
-{
-}
diff --git a/src/main/java/xiamomc/morph/providers/animation/AnimationProvider.java b/src/main/java/xiamomc/morph/providers/animation/AnimationProvider.java
deleted file mode 100644
index c5f7709a..00000000
--- a/src/main/java/xiamomc/morph/providers/animation/AnimationProvider.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package xiamomc.morph.providers.animation;
-
-import org.jetbrains.annotations.NotNull;
-import xiamomc.morph.MorphPluginObject;
-
-public abstract class AnimationProvider extends MorphPluginObject
-{
-    /**
-     * @param disguiseID
-     * @return The sequence of the given parameters, {@link xiamomc.morph.providers.animation.bundled.FallbackAnimationSet} if invalid.
-     */
-    @NotNull
-    public abstract AnimationSet getAnimationSetFor(String disguiseID);
-}
diff --git a/src/main/java/xiamomc/morph/providers/animation/bundled/FallbackAnimationSet.java b/src/main/java/xiamomc/morph/providers/animation/bundled/FallbackAnimationSet.java
deleted file mode 100644
index 7d96aa8b..00000000
--- a/src/main/java/xiamomc/morph/providers/animation/bundled/FallbackAnimationSet.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package xiamomc.morph.providers.animation.bundled;
-
-import xiamomc.morph.providers.animation.AnimationSet;
-
-public class FallbackAnimationSet extends AnimationSet
-{
-}
diff --git a/src/main/java/xiamomc/morph/storage/offlinestore/IOfflineState.java b/src/main/java/xiamomc/morph/storage/offlinestore/IOfflineState.java
deleted file mode 100644
index 6de723ca..00000000
--- a/src/main/java/xiamomc/morph/storage/offlinestore/IOfflineState.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package xiamomc.morph.storage.offlinestore;
-
-public interface IOfflineState
-{
-}
diff --git a/src/main/java/xiamomc/morph/MorphManager.java b/src/main/java/xyz/nifeather/morph/MorphManager.java
similarity index 96%
rename from src/main/java/xiamomc/morph/MorphManager.java
rename to src/main/java/xyz/nifeather/morph/MorphManager.java
index ed5c5a10..78244dd5 100644
--- a/src/main/java/xiamomc/morph/MorphManager.java
+++ b/src/main/java/xyz/nifeather/morph/MorphManager.java
@@ -1,4 +1,4 @@
-package xiamomc.morph;
+package xyz.nifeather.morph;
 
 import ca.spottedleaf.moonrise.common.util.TickThread;
 import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap;
@@ -17,48 +17,51 @@
 import org.jetbrains.annotations.ApiStatus;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.backends.DisguiseBackend;
-import xiamomc.morph.backends.DisguiseWrapper;
-import xiamomc.morph.backends.WrapperAttribute;
-import xiamomc.morph.backends.fallback.NilBackend;
-import xiamomc.morph.backends.server.ServerBackend;
-import xiamomc.morph.misc.playerList.PlayerListHandler;
-import xiamomc.morph.config.ConfigOption;
-import xiamomc.morph.config.MorphConfigManager;
+import xyz.nifeather.morph.backends.DisguiseBackend;
+import xyz.nifeather.morph.backends.DisguiseWrapper;
+import xyz.nifeather.morph.backends.WrapperAttribute;
+import xyz.nifeather.morph.backends.fallback.NilBackend;
+import xyz.nifeather.morph.backends.server.ServerBackend;
+import xyz.nifeather.morph.events.api.gameplay.*;
+import xyz.nifeather.morph.misc.*;
+import xyz.nifeather.morph.morph.events.api.gameplay.*;
+import xyz.nifeather.morph.misc.playerList.PlayerListHandler;
+import xyz.nifeather.morph.config.ConfigOption;
+import xyz.nifeather.morph.config.MorphConfigManager;
 import xiamomc.morph.events.api.gameplay.*;
-import xiamomc.morph.events.api.lifecycle.ManagerFinishedInitializeEvent;
-import xiamomc.morph.interfaces.IManagePlayerData;
-import xiamomc.morph.messages.CommandStrings;
-import xiamomc.morph.messages.HintStrings;
-import xiamomc.morph.messages.MessageUtils;
-import xiamomc.morph.messages.MorphStrings;
-import xiamomc.morph.messages.vanilla.VanillaMessageStore;
+import xyz.nifeather.morph.events.api.lifecycle.ManagerFinishedInitializeEvent;
+import xyz.nifeather.morph.interfaces.IManagePlayerData;
+import xyz.nifeather.morph.messages.CommandStrings;
+import xyz.nifeather.morph.messages.HintStrings;
+import xyz.nifeather.morph.messages.MessageUtils;
+import xyz.nifeather.morph.messages.MorphStrings;
+import xyz.nifeather.morph.messages.vanilla.VanillaMessageStore;
 import xiamomc.morph.misc.*;
-import xiamomc.morph.misc.disguiseProperty.DisguiseProperties;
-import xiamomc.morph.misc.disguiseProperty.SingleProperty;
-import xiamomc.morph.misc.permissions.CommonPermissions;
+import xyz.nifeather.morph.misc.disguiseProperty.DisguiseProperties;
+import xyz.nifeather.morph.misc.disguiseProperty.SingleProperty;
+import xyz.nifeather.morph.misc.permissions.CommonPermissions;
 import xiamomc.morph.network.commands.S2C.clientrender.S2CRenderMapAddCommand;
 import xiamomc.morph.network.commands.S2C.clientrender.S2CRenderMapSyncCommand;
 import xiamomc.morph.network.commands.S2C.map.S2CMapCommand;
 import xiamomc.morph.network.commands.S2C.map.S2CMapRemoveCommand;
 import xiamomc.morph.network.commands.S2C.map.S2CPartialMapCommand;
 import xiamomc.morph.network.commands.S2C.set.*;
-import xiamomc.morph.network.multiInstance.MultiInstanceService;
-import xiamomc.morph.network.multiInstance.protocol.Operation;
-import xiamomc.morph.network.server.MorphClientHandler;
-import xiamomc.morph.providers.disguise.DisguiseProvider;
-import xiamomc.morph.providers.disguise.FallbackDisguiseProvider;
-import xiamomc.morph.providers.disguise.PlayerDisguiseProvider;
-import xiamomc.morph.providers.disguise.VanillaDisguiseProvider;
-import xiamomc.morph.skills.MorphSkillHandler;
-import xiamomc.morph.skills.SkillCooldownInfo;
-import xiamomc.morph.skills.SkillType;
-import xiamomc.morph.storage.offlinestore.OfflineDisguiseState;
-import xiamomc.morph.storage.offlinestore.OfflineStateStore;
-import xiamomc.morph.storage.playerdata.PlayerDataStore;
-import xiamomc.morph.storage.playerdata.PlayerMeta;
-import xiamomc.morph.utilities.DisguiseUtils;
-import xiamomc.morph.utilities.PermissionUtils;
+import xyz.nifeather.morph.network.multiInstance.MultiInstanceService;
+import xyz.nifeather.morph.network.multiInstance.protocol.Operation;
+import xyz.nifeather.morph.network.server.MorphClientHandler;
+import xyz.nifeather.morph.providers.disguise.DisguiseProvider;
+import xyz.nifeather.morph.providers.disguise.FallbackDisguiseProvider;
+import xyz.nifeather.morph.providers.disguise.PlayerDisguiseProvider;
+import xyz.nifeather.morph.providers.disguise.VanillaDisguiseProvider;
+import xyz.nifeather.morph.skills.MorphSkillHandler;
+import xyz.nifeather.morph.skills.SkillCooldownInfo;
+import xyz.nifeather.morph.skills.SkillType;
+import xyz.nifeather.morph.storage.offlinestore.OfflineDisguiseState;
+import xyz.nifeather.morph.storage.offlinestore.OfflineStateStore;
+import xyz.nifeather.morph.storage.playerdata.PlayerDataStore;
+import xyz.nifeather.morph.storage.playerdata.PlayerMeta;
+import xyz.nifeather.morph.utilities.DisguiseUtils;
+import xyz.nifeather.morph.utilities.PermissionUtils;
 import xiamomc.pluginbase.Annotations.Initializer;
 import xiamomc.pluginbase.Annotations.Resolved;
 import xiamomc.pluginbase.Bindables.Bindable;
diff --git a/src/main/java/xiamomc/morph/MorphPlugin.java b/src/main/java/xyz/nifeather/morph/MorphPlugin.java
similarity index 86%
rename from src/main/java/xiamomc/morph/MorphPlugin.java
rename to src/main/java/xyz/nifeather/morph/MorphPlugin.java
index dc5183e8..91dac299 100644
--- a/src/main/java/xiamomc/morph/MorphPlugin.java
+++ b/src/main/java/xyz/nifeather/morph/MorphPlugin.java
@@ -1,4 +1,4 @@
-package xiamomc.morph;
+package xyz.nifeather.morph;
 
 import com.ticxo.modelengine.api.ModelEngineAPI;
 import net.kyori.adventure.text.minimessage.MiniMessage;
@@ -8,30 +8,31 @@
 import org.bukkit.plugin.PluginManager;
 import org.bukkit.scoreboard.Scoreboard;
 import org.jetbrains.annotations.ApiStatus;
-import xiamomc.morph.abilities.AbilityManager;
-import xiamomc.morph.commands.MorphCommandManager;
-import xiamomc.morph.config.MorphConfigManager;
+import xyz.nifeather.morph.abilities.AbilityManager;
+import xyz.nifeather.morph.commands.MorphCommandManager;
+import xyz.nifeather.morph.config.MorphConfigManager;
 import xiamomc.morph.events.*;
-import xiamomc.morph.interfaces.IManagePlayerData;
-import xiamomc.morph.interfaces.IManageRequests;
-import xiamomc.morph.messages.MessageUtils;
-import xiamomc.morph.messages.MorphMessageStore;
-import xiamomc.morph.messages.vanilla.VanillaMessageStore;
-import xiamomc.morph.misc.NetworkingHelper;
-import xiamomc.morph.misc.PlayerOperationSimulator;
-import xiamomc.morph.misc.recipe.RecipeManager;
-import xiamomc.morph.misc.disguiseProperty.DisguiseProperties;
-import xiamomc.morph.misc.gui.IconLookup;
-import xiamomc.morph.misc.integrations.modelengine.ModelEngineHelper;
-import xiamomc.morph.misc.integrations.placeholderapi.PlaceholderIntegration;
-import xiamomc.morph.misc.integrations.residence.ResidenceEventProcessor;
-import xiamomc.morph.misc.integrations.tab.TabAdapter;
-import xiamomc.morph.network.multiInstance.MultiInstanceService;
-import xiamomc.morph.network.server.MorphClientHandler;
-import xiamomc.morph.skills.MorphSkillHandler;
-import xiamomc.morph.storage.skill.SkillAbilityConfigurationStore;
-import xiamomc.morph.transforms.Transformer;
-import xiamomc.morph.updates.UpdateHandler;
+import xyz.nifeather.morph.events.*;
+import xyz.nifeather.morph.interfaces.IManagePlayerData;
+import xyz.nifeather.morph.interfaces.IManageRequests;
+import xyz.nifeather.morph.messages.MessageUtils;
+import xyz.nifeather.morph.messages.MorphMessageStore;
+import xyz.nifeather.morph.messages.vanilla.VanillaMessageStore;
+import xyz.nifeather.morph.misc.NetworkingHelper;
+import xyz.nifeather.morph.misc.PlayerOperationSimulator;
+import xyz.nifeather.morph.misc.recipe.RecipeManager;
+import xyz.nifeather.morph.misc.disguiseProperty.DisguiseProperties;
+import xyz.nifeather.morph.misc.gui.IconLookup;
+import xyz.nifeather.morph.misc.integrations.modelengine.ModelEngineHelper;
+import xyz.nifeather.morph.misc.integrations.placeholderapi.PlaceholderIntegration;
+import xyz.nifeather.morph.misc.integrations.residence.ResidenceEventProcessor;
+import xyz.nifeather.morph.misc.integrations.tab.TabAdapter;
+import xyz.nifeather.morph.network.multiInstance.MultiInstanceService;
+import xyz.nifeather.morph.network.server.MorphClientHandler;
+import xyz.nifeather.morph.skills.MorphSkillHandler;
+import xyz.nifeather.morph.storage.skill.SkillAbilityConfigurationStore;
+import xyz.nifeather.morph.transforms.Transformer;
+import xyz.nifeather.morph.updates.UpdateHandler;
 import xiamomc.pluginbase.Command.CommandHelper;
 import xiamomc.pluginbase.Messages.MessageStore;
 import xiamomc.pluginbase.XiaMoJavaPlugin;
diff --git a/src/main/java/xiamomc/morph/MorphPluginObject.java b/src/main/java/xyz/nifeather/morph/MorphPluginObject.java
similarity index 96%
rename from src/main/java/xiamomc/morph/MorphPluginObject.java
rename to src/main/java/xyz/nifeather/morph/MorphPluginObject.java
index fd80dfdf..15034b35 100644
--- a/src/main/java/xiamomc/morph/MorphPluginObject.java
+++ b/src/main/java/xyz/nifeather/morph/MorphPluginObject.java
@@ -1,4 +1,4 @@
-package xiamomc.morph;
+package xyz.nifeather.morph;
 
 import org.bukkit.Bukkit;
 import org.bukkit.entity.Entity;
diff --git a/src/main/java/xiamomc/morph/RequestManager.java b/src/main/java/xyz/nifeather/morph/RequestManager.java
similarity index 92%
rename from src/main/java/xiamomc/morph/RequestManager.java
rename to src/main/java/xyz/nifeather/morph/RequestManager.java
index e0d5878b..01f6e2e7 100644
--- a/src/main/java/xiamomc/morph/RequestManager.java
+++ b/src/main/java/xyz/nifeather/morph/RequestManager.java
@@ -1,17 +1,17 @@
-package xiamomc.morph;
+package xyz.nifeather.morph;
 
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
 import org.bukkit.entity.Player;
-import xiamomc.morph.interfaces.IManagePlayerData;
-import xiamomc.morph.interfaces.IManageRequests;
-import xiamomc.morph.messages.CommandStrings;
-import xiamomc.morph.messages.MessageUtils;
-import xiamomc.morph.messages.RequestStrings;
-import xiamomc.morph.misc.DisguiseTypes;
-import xiamomc.morph.misc.RequestInfo;
-import xiamomc.morph.misc.permissions.CommonPermissions;
+import xyz.nifeather.morph.interfaces.IManagePlayerData;
+import xyz.nifeather.morph.interfaces.IManageRequests;
+import xyz.nifeather.morph.messages.CommandStrings;
+import xyz.nifeather.morph.messages.MessageUtils;
+import xyz.nifeather.morph.messages.RequestStrings;
+import xyz.nifeather.morph.misc.DisguiseTypes;
+import xyz.nifeather.morph.misc.RequestInfo;
+import xyz.nifeather.morph.misc.permissions.CommonPermissions;
 import xiamomc.morph.network.commands.S2C.S2CRequestCommand;
-import xiamomc.morph.network.server.MorphClientHandler;
+import xyz.nifeather.morph.network.server.MorphClientHandler;
 import xiamomc.pluginbase.Annotations.Initializer;
 import xiamomc.pluginbase.Annotations.Resolved;
 
diff --git a/src/main/java/xiamomc/morph/RevealingHandler.java b/src/main/java/xyz/nifeather/morph/RevealingHandler.java
similarity index 97%
rename from src/main/java/xiamomc/morph/RevealingHandler.java
rename to src/main/java/xyz/nifeather/morph/RevealingHandler.java
index 409046f7..2ff75c91 100644
--- a/src/main/java/xiamomc/morph/RevealingHandler.java
+++ b/src/main/java/xyz/nifeather/morph/RevealingHandler.java
@@ -1,13 +1,13 @@
-package xiamomc.morph;
+package xyz.nifeather.morph;
 
 import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap;
 import org.bukkit.entity.Player;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.misc.DisguiseState;
+import xyz.nifeather.morph.misc.DisguiseState;
 import xiamomc.morph.network.commands.S2C.set.S2CSetRevealingCommand;
-import xiamomc.morph.network.server.MorphClientHandler;
-import xiamomc.morph.utilities.MathUtils;
+import xyz.nifeather.morph.network.server.MorphClientHandler;
+import xyz.nifeather.morph.utilities.MathUtils;
 import xiamomc.pluginbase.Annotations.Initializer;
 import xiamomc.pluginbase.Annotations.Resolved;
 import xiamomc.pluginbase.Bindables.Bindable;
diff --git a/src/main/java/xiamomc/morph/abilities/AbilityManager.java b/src/main/java/xyz/nifeather/morph/abilities/AbilityManager.java
similarity index 90%
rename from src/main/java/xiamomc/morph/abilities/AbilityManager.java
rename to src/main/java/xyz/nifeather/morph/abilities/AbilityManager.java
index cc83a2c0..5baa1a4d 100644
--- a/src/main/java/xiamomc/morph/abilities/AbilityManager.java
+++ b/src/main/java/xyz/nifeather/morph/abilities/AbilityManager.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.abilities;
+package xyz.nifeather.morph.abilities;
 
 import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
@@ -7,15 +7,18 @@
 import org.bukkit.NamespacedKey;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.MorphManager;
-import xiamomc.morph.MorphPluginObject;
+import xyz.nifeather.morph.MorphManager;
+import xyz.nifeather.morph.MorphPluginObject;
 import xiamomc.morph.abilities.impl.*;
-import xiamomc.morph.abilities.impl.onAttack.ExtraKnockbackAbility;
-import xiamomc.morph.abilities.impl.onAttack.PotionOnAttackAbility;
+import xyz.nifeather.morph.abilities.impl.*;
+import xyz.nifeather.morph.abilities.impl.potion.*;
+import xyz.nifeather.morph.abilities.impl.onAttack.ExtraKnockbackAbility;
+import xyz.nifeather.morph.abilities.impl.onAttack.PotionOnAttackAbility;
 import xiamomc.morph.abilities.impl.potion.*;
-import xiamomc.morph.events.api.lifecycle.AbilitiesFinishedInitializeEvent;
-import xiamomc.morph.storage.skill.SkillAbilityConfiguration;
-import xiamomc.morph.storage.skill.SkillAbilityConfigurationStore;
+import xyz.nifeather.morph.morph.abilities.impl.potion.*;
+import xyz.nifeather.morph.events.api.lifecycle.AbilitiesFinishedInitializeEvent;
+import xyz.nifeather.morph.storage.skill.SkillAbilityConfiguration;
+import xyz.nifeather.morph.storage.skill.SkillAbilityConfigurationStore;
 import xiamomc.pluginbase.Annotations.Initializer;
 import xiamomc.pluginbase.Annotations.Resolved;
 
diff --git a/src/main/java/xiamomc/morph/abilities/AbilityType.java b/src/main/java/xyz/nifeather/morph/abilities/AbilityType.java
similarity index 98%
rename from src/main/java/xiamomc/morph/abilities/AbilityType.java
rename to src/main/java/xyz/nifeather/morph/abilities/AbilityType.java
index b6c8b21b..cd82c09d 100644
--- a/src/main/java/xiamomc/morph/abilities/AbilityType.java
+++ b/src/main/java/xyz/nifeather/morph/abilities/AbilityType.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.abilities;
+package xyz.nifeather.morph.abilities;
 
 import org.bukkit.NamespacedKey;
 
diff --git a/src/main/java/xiamomc/morph/abilities/AbilityUpdater.java b/src/main/java/xyz/nifeather/morph/abilities/AbilityUpdater.java
similarity index 95%
rename from src/main/java/xiamomc/morph/abilities/AbilityUpdater.java
rename to src/main/java/xyz/nifeather/morph/abilities/AbilityUpdater.java
index 1b3abb2a..c6a3dc9f 100644
--- a/src/main/java/xiamomc/morph/abilities/AbilityUpdater.java
+++ b/src/main/java/xyz/nifeather/morph/abilities/AbilityUpdater.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.abilities;
+package xyz.nifeather.morph.abilities;
 
 import it.unimi.dsi.fastutil.Pair;
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
@@ -8,12 +8,12 @@
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 import org.jetbrains.annotations.Unmodifiable;
-import xiamomc.morph.MorphPluginObject;
-import xiamomc.morph.config.ConfigOption;
-import xiamomc.morph.config.MorphConfigManager;
-import xiamomc.morph.misc.DisguiseState;
-import xiamomc.morph.misc.permissions.CommonPermissions;
-import xiamomc.morph.utilities.PermissionUtils;
+import xyz.nifeather.morph.MorphPluginObject;
+import xyz.nifeather.morph.config.ConfigOption;
+import xyz.nifeather.morph.config.MorphConfigManager;
+import xyz.nifeather.morph.misc.DisguiseState;
+import xyz.nifeather.morph.misc.permissions.CommonPermissions;
+import xyz.nifeather.morph.utilities.PermissionUtils;
 import xiamomc.pluginbase.Annotations.Initializer;
 import xiamomc.pluginbase.Bindables.Bindable;
 
diff --git a/src/main/java/xiamomc/morph/abilities/EffectMorphAbility.java b/src/main/java/xyz/nifeather/morph/abilities/EffectMorphAbility.java
similarity index 89%
rename from src/main/java/xiamomc/morph/abilities/EffectMorphAbility.java
rename to src/main/java/xyz/nifeather/morph/abilities/EffectMorphAbility.java
index dbe7f1aa..141665ff 100644
--- a/src/main/java/xiamomc/morph/abilities/EffectMorphAbility.java
+++ b/src/main/java/xyz/nifeather/morph/abilities/EffectMorphAbility.java
@@ -1,9 +1,9 @@
-package xiamomc.morph.abilities;
+package xyz.nifeather.morph.abilities;
 
 import org.bukkit.entity.Player;
 import org.bukkit.potion.PotionEffect;
-import xiamomc.morph.abilities.impl.NoOpOptionAbility;
-import xiamomc.morph.misc.DisguiseState;
+import xyz.nifeather.morph.abilities.impl.NoOpOptionAbility;
+import xyz.nifeather.morph.misc.DisguiseState;
 import xiamomc.pluginbase.Annotations.Initializer;
 
 public abstract class EffectMorphAbility extends NoOpOptionAbility
diff --git a/src/main/java/xiamomc/morph/abilities/IMorphAbility.java b/src/main/java/xyz/nifeather/morph/abilities/IMorphAbility.java
similarity index 95%
rename from src/main/java/xiamomc/morph/abilities/IMorphAbility.java
rename to src/main/java/xyz/nifeather/morph/abilities/IMorphAbility.java
index 3d2f2460..6a824ec9 100644
--- a/src/main/java/xiamomc/morph/abilities/IMorphAbility.java
+++ b/src/main/java/xyz/nifeather/morph/abilities/IMorphAbility.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.abilities;
+package xyz.nifeather.morph.abilities;
 
 import org.bukkit.NamespacedKey;
 import org.bukkit.entity.Player;
@@ -7,8 +7,8 @@
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 import org.slf4j.LoggerFactory;
-import xiamomc.morph.misc.DisguiseState;
-import xiamomc.morph.storage.skill.ISkillOption;
+import xyz.nifeather.morph.misc.DisguiseState;
+import xyz.nifeather.morph.storage.skill.ISkillOption;
 
 import java.util.List;
 import java.util.UUID;
diff --git a/src/main/java/xiamomc/morph/abilities/MorphAbility.java b/src/main/java/xyz/nifeather/morph/abilities/MorphAbility.java
similarity index 95%
rename from src/main/java/xiamomc/morph/abilities/MorphAbility.java
rename to src/main/java/xyz/nifeather/morph/abilities/MorphAbility.java
index aaaff20b..e5ab6aa8 100644
--- a/src/main/java/xiamomc/morph/abilities/MorphAbility.java
+++ b/src/main/java/xyz/nifeather/morph/abilities/MorphAbility.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.abilities;
+package xyz.nifeather.morph.abilities;
 
 import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
@@ -6,9 +6,9 @@
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 import org.jetbrains.annotations.Unmodifiable;
-import xiamomc.morph.MorphPluginObject;
-import xiamomc.morph.misc.DisguiseState;
-import xiamomc.morph.storage.skill.ISkillOption;
+import xyz.nifeather.morph.MorphPluginObject;
+import xyz.nifeather.morph.misc.DisguiseState;
+import xyz.nifeather.morph.storage.skill.ISkillOption;
 
 import java.util.List;
 import java.util.Map;
diff --git a/src/main/java/xiamomc/morph/abilities/impl/AttributeModifyingAbility.java b/src/main/java/xyz/nifeather/morph/abilities/impl/AttributeModifyingAbility.java
similarity index 93%
rename from src/main/java/xiamomc/morph/abilities/impl/AttributeModifyingAbility.java
rename to src/main/java/xyz/nifeather/morph/abilities/impl/AttributeModifyingAbility.java
index 2e758d8b..423ffb66 100644
--- a/src/main/java/xiamomc/morph/abilities/impl/AttributeModifyingAbility.java
+++ b/src/main/java/xyz/nifeather/morph/abilities/impl/AttributeModifyingAbility.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.abilities.impl;
+package xyz.nifeather.morph.abilities.impl;
 
 import org.bukkit.NamespacedKey;
 import org.bukkit.attribute.Attribute;
@@ -8,10 +8,10 @@
 import org.bukkit.inventory.EquipmentSlotGroup;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.abilities.AbilityType;
-import xiamomc.morph.abilities.MorphAbility;
-import xiamomc.morph.abilities.options.AttributeModifyOption;
-import xiamomc.morph.misc.DisguiseState;
+import xyz.nifeather.morph.abilities.AbilityType;
+import xyz.nifeather.morph.abilities.MorphAbility;
+import xyz.nifeather.morph.abilities.options.AttributeModifyOption;
+import xyz.nifeather.morph.misc.DisguiseState;
 
 import java.util.Arrays;
 import java.util.Objects;
diff --git a/src/main/java/xiamomc/morph/abilities/impl/BossbarAbility.java b/src/main/java/xyz/nifeather/morph/abilities/impl/BossbarAbility.java
similarity index 90%
rename from src/main/java/xiamomc/morph/abilities/impl/BossbarAbility.java
rename to src/main/java/xyz/nifeather/morph/abilities/impl/BossbarAbility.java
index d35d4ec0..0a6a3d75 100644
--- a/src/main/java/xiamomc/morph/abilities/impl/BossbarAbility.java
+++ b/src/main/java/xyz/nifeather/morph/abilities/impl/BossbarAbility.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.abilities.impl;
+package xyz.nifeather.morph.abilities.impl;
 
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
 import net.kyori.adventure.bossbar.BossBar;
@@ -11,13 +11,13 @@
 import org.bukkit.attribute.Attribute;
 import org.bukkit.entity.Player;
 import org.jetbrains.annotations.NotNull;
-import xiamomc.morph.abilities.AbilityType;
-import xiamomc.morph.abilities.MorphAbility;
-import xiamomc.morph.abilities.options.BossbarOption;
-import xiamomc.morph.config.ConfigOption;
-import xiamomc.morph.config.MorphConfigManager;
-import xiamomc.morph.misc.DisguiseState;
-import xiamomc.morph.utilities.DisguiseUtils;
+import xyz.nifeather.morph.abilities.AbilityType;
+import xyz.nifeather.morph.abilities.MorphAbility;
+import xyz.nifeather.morph.abilities.options.BossbarOption;
+import xyz.nifeather.morph.config.ConfigOption;
+import xyz.nifeather.morph.config.MorphConfigManager;
+import xyz.nifeather.morph.misc.DisguiseState;
+import xyz.nifeather.morph.utilities.DisguiseUtils;
 import xiamomc.pluginbase.Annotations.Initializer;
 import xiamomc.pluginbase.Bindables.Bindable;
 
diff --git a/src/main/java/xiamomc/morph/abilities/impl/BurnsUnderSunAbility.java b/src/main/java/xyz/nifeather/morph/abilities/impl/BurnsUnderSunAbility.java
similarity index 86%
rename from src/main/java/xiamomc/morph/abilities/impl/BurnsUnderSunAbility.java
rename to src/main/java/xyz/nifeather/morph/abilities/impl/BurnsUnderSunAbility.java
index bed2a496..d4bae01f 100644
--- a/src/main/java/xiamomc/morph/abilities/impl/BurnsUnderSunAbility.java
+++ b/src/main/java/xyz/nifeather/morph/abilities/impl/BurnsUnderSunAbility.java
@@ -1,11 +1,11 @@
-package xiamomc.morph.abilities.impl;
+package xyz.nifeather.morph.abilities.impl;
 
 import org.bukkit.NamespacedKey;
 import org.bukkit.World;
 import org.bukkit.entity.Player;
 import org.jetbrains.annotations.NotNull;
-import xiamomc.morph.abilities.AbilityType;
-import xiamomc.morph.misc.DisguiseState;
+import xyz.nifeather.morph.abilities.AbilityType;
+import xyz.nifeather.morph.misc.DisguiseState;
 
 public class BurnsUnderSunAbility extends NoOpOptionAbility
 {
diff --git a/src/main/java/xiamomc/morph/abilities/impl/ChatOverrideAbility.java b/src/main/java/xyz/nifeather/morph/abilities/impl/ChatOverrideAbility.java
similarity index 82%
rename from src/main/java/xiamomc/morph/abilities/impl/ChatOverrideAbility.java
rename to src/main/java/xyz/nifeather/morph/abilities/impl/ChatOverrideAbility.java
index 18b1905b..8f22cd8f 100644
--- a/src/main/java/xiamomc/morph/abilities/impl/ChatOverrideAbility.java
+++ b/src/main/java/xyz/nifeather/morph/abilities/impl/ChatOverrideAbility.java
@@ -1,19 +1,19 @@
-package xiamomc.morph.abilities.impl;
+package xyz.nifeather.morph.abilities.impl;
 
 import io.papermc.paper.event.player.AsyncChatEvent;
 import org.bukkit.NamespacedKey;
 import org.bukkit.event.EventHandler;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.MorphManager;
-import xiamomc.morph.abilities.AbilityType;
-import xiamomc.morph.abilities.MorphAbility;
-import xiamomc.morph.abilities.options.ChatOverrideOption;
-import xiamomc.morph.config.ConfigOption;
-import xiamomc.morph.config.MorphConfigManager;
-import xiamomc.morph.misc.DisguiseState;
-import xiamomc.morph.misc.MorphChatRenderer;
-import xiamomc.morph.misc.permissions.CommonPermissions;
+import xyz.nifeather.morph.MorphManager;
+import xyz.nifeather.morph.abilities.AbilityType;
+import xyz.nifeather.morph.abilities.MorphAbility;
+import xyz.nifeather.morph.abilities.options.ChatOverrideOption;
+import xyz.nifeather.morph.config.ConfigOption;
+import xyz.nifeather.morph.config.MorphConfigManager;
+import xyz.nifeather.morph.misc.DisguiseState;
+import xyz.nifeather.morph.misc.MorphChatRenderer;
+import xyz.nifeather.morph.misc.permissions.CommonPermissions;
 import xiamomc.pluginbase.Annotations.Initializer;
 import xiamomc.pluginbase.Annotations.Resolved;
 import xiamomc.pluginbase.Bindables.Bindable;
diff --git a/src/main/java/xiamomc/morph/abilities/impl/DamageReducingAbility.java b/src/main/java/xyz/nifeather/morph/abilities/impl/DamageReducingAbility.java
similarity index 85%
rename from src/main/java/xiamomc/morph/abilities/impl/DamageReducingAbility.java
rename to src/main/java/xyz/nifeather/morph/abilities/impl/DamageReducingAbility.java
index e48c32ca..1e480ea4 100644
--- a/src/main/java/xiamomc/morph/abilities/impl/DamageReducingAbility.java
+++ b/src/main/java/xyz/nifeather/morph/abilities/impl/DamageReducingAbility.java
@@ -1,11 +1,11 @@
-package xiamomc.morph.abilities.impl;
+package xyz.nifeather.morph.abilities.impl;
 
 import org.bukkit.entity.Player;
 import org.bukkit.event.EventHandler;
 import org.bukkit.event.entity.EntityDamageEvent;
-import xiamomc.morph.MorphManager;
-import xiamomc.morph.abilities.MorphAbility;
-import xiamomc.morph.abilities.options.ReduceDamageOption;
+import xyz.nifeather.morph.MorphManager;
+import xyz.nifeather.morph.abilities.MorphAbility;
+import xyz.nifeather.morph.abilities.options.ReduceDamageOption;
 import xiamomc.pluginbase.Annotations.Resolved;
 
 public abstract class DamageReducingAbility<T extends ReduceDamageOption> extends MorphAbility<T>
diff --git a/src/main/java/xiamomc/morph/abilities/impl/DryOutInAirAbility.java b/src/main/java/xyz/nifeather/morph/abilities/impl/DryOutInAirAbility.java
similarity index 78%
rename from src/main/java/xiamomc/morph/abilities/impl/DryOutInAirAbility.java
rename to src/main/java/xyz/nifeather/morph/abilities/impl/DryOutInAirAbility.java
index 02c41e34..9b08ca7e 100644
--- a/src/main/java/xiamomc/morph/abilities/impl/DryOutInAirAbility.java
+++ b/src/main/java/xyz/nifeather/morph/abilities/impl/DryOutInAirAbility.java
@@ -1,16 +1,16 @@
-package xiamomc.morph.abilities.impl;
+package xyz.nifeather.morph.abilities.impl;
 
 import org.bukkit.NamespacedKey;
 import org.bukkit.entity.Player;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.abilities.AbilityType;
-import xiamomc.morph.abilities.MorphAbility;
-import xiamomc.morph.abilities.options.DryoutAbilityOption;
-import xiamomc.morph.misc.DisguiseState;
-import xiamomc.morph.misc.NmsRecord;
-import xiamomc.morph.utilities.DamageSourceUtils;
-import xiamomc.morph.utilities.MathUtils;
+import xyz.nifeather.morph.abilities.AbilityType;
+import xyz.nifeather.morph.abilities.MorphAbility;
+import xyz.nifeather.morph.abilities.options.DryoutAbilityOption;
+import xyz.nifeather.morph.misc.DisguiseState;
+import xyz.nifeather.morph.misc.NmsRecord;
+import xyz.nifeather.morph.utilities.DamageSourceUtils;
+import xyz.nifeather.morph.utilities.MathUtils;
 
 public class DryOutInAirAbility extends MorphAbility<DryoutAbilityOption>
 {
diff --git a/src/main/java/xiamomc/morph/abilities/impl/FlyAbility.java b/src/main/java/xyz/nifeather/morph/abilities/impl/FlyAbility.java
similarity index 93%
rename from src/main/java/xiamomc/morph/abilities/impl/FlyAbility.java
rename to src/main/java/xyz/nifeather/morph/abilities/impl/FlyAbility.java
index 3724f9fb..180b0f6b 100644
--- a/src/main/java/xiamomc/morph/abilities/impl/FlyAbility.java
+++ b/src/main/java/xyz/nifeather/morph/abilities/impl/FlyAbility.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.abilities.impl;
+package xyz.nifeather.morph.abilities.impl;
 
 import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
 import net.minecraft.world.level.GameType;
@@ -11,16 +11,16 @@
 import org.bukkit.event.EventHandler;
 import org.bukkit.event.player.PlayerGameModeChangeEvent;
 import org.jetbrains.annotations.NotNull;
-import xiamomc.morph.MorphManager;
-import xiamomc.morph.abilities.AbilityType;
-import xiamomc.morph.abilities.MorphAbility;
-import xiamomc.morph.abilities.options.FlyOption;
-import xiamomc.morph.config.ConfigOption;
-import xiamomc.morph.config.MorphConfigManager;
-import xiamomc.morph.misc.DisguiseState;
-import xiamomc.morph.misc.permissions.CommonPermissions;
-import xiamomc.morph.utilities.MathUtils;
-import xiamomc.morph.utilities.PermissionUtils;
+import xyz.nifeather.morph.MorphManager;
+import xyz.nifeather.morph.abilities.AbilityType;
+import xyz.nifeather.morph.abilities.MorphAbility;
+import xyz.nifeather.morph.abilities.options.FlyOption;
+import xyz.nifeather.morph.config.ConfigOption;
+import xyz.nifeather.morph.config.MorphConfigManager;
+import xyz.nifeather.morph.misc.DisguiseState;
+import xyz.nifeather.morph.misc.permissions.CommonPermissions;
+import xyz.nifeather.morph.utilities.MathUtils;
+import xyz.nifeather.morph.utilities.PermissionUtils;
 import xiamomc.pluginbase.Annotations.Initializer;
 import xiamomc.pluginbase.Annotations.Resolved;
 import xiamomc.pluginbase.Bindables.Bindable;
diff --git a/src/main/java/xiamomc/morph/abilities/impl/HealsFromEntityAbility.java b/src/main/java/xyz/nifeather/morph/abilities/impl/HealsFromEntityAbility.java
similarity index 93%
rename from src/main/java/xiamomc/morph/abilities/impl/HealsFromEntityAbility.java
rename to src/main/java/xyz/nifeather/morph/abilities/impl/HealsFromEntityAbility.java
index ea8d384c..7f70a6a8 100644
--- a/src/main/java/xiamomc/morph/abilities/impl/HealsFromEntityAbility.java
+++ b/src/main/java/xyz/nifeather/morph/abilities/impl/HealsFromEntityAbility.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.abilities.impl;
+package xyz.nifeather.morph.abilities.impl;
 
 import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
 import net.minecraft.nbt.CompoundTag;
@@ -12,16 +12,16 @@
 import org.bukkit.entity.Projectile;
 import org.bukkit.event.entity.EntityDamageByEntityEvent;
 import org.jetbrains.annotations.NotNull;
-import xiamomc.morph.abilities.AbilityType;
-import xiamomc.morph.abilities.MorphAbility;
-import xiamomc.morph.abilities.options.HealsFromEntityOption;
-import xiamomc.morph.misc.DisguiseState;
-import xiamomc.morph.misc.NmsRecord;
+import xyz.nifeather.morph.abilities.AbilityType;
+import xyz.nifeather.morph.abilities.MorphAbility;
+import xyz.nifeather.morph.abilities.options.HealsFromEntityOption;
+import xyz.nifeather.morph.misc.DisguiseState;
+import xyz.nifeather.morph.misc.NmsRecord;
 import xiamomc.morph.network.commands.S2C.set.S2CSetSNbtCommand;
-import xiamomc.morph.network.server.MorphClientHandler;
-import xiamomc.morph.utilities.DamageSourceUtils;
-import xiamomc.morph.utilities.EntityTypeUtils;
-import xiamomc.morph.utilities.NbtUtils;
+import xyz.nifeather.morph.network.server.MorphClientHandler;
+import xyz.nifeather.morph.utilities.DamageSourceUtils;
+import xyz.nifeather.morph.utilities.EntityTypeUtils;
+import xyz.nifeather.morph.utilities.NbtUtils;
 import xiamomc.pluginbase.Annotations.Resolved;
 
 import java.util.Map;
diff --git a/src/main/java/xiamomc/morph/abilities/impl/NoFallDamageAbility.java b/src/main/java/xyz/nifeather/morph/abilities/impl/NoFallDamageAbility.java
similarity index 88%
rename from src/main/java/xiamomc/morph/abilities/impl/NoFallDamageAbility.java
rename to src/main/java/xyz/nifeather/morph/abilities/impl/NoFallDamageAbility.java
index 4dc1dc5a..515c934c 100644
--- a/src/main/java/xiamomc/morph/abilities/impl/NoFallDamageAbility.java
+++ b/src/main/java/xyz/nifeather/morph/abilities/impl/NoFallDamageAbility.java
@@ -1,11 +1,11 @@
-package xiamomc.morph.abilities.impl;
+package xyz.nifeather.morph.abilities.impl;
 
 import org.bukkit.NamespacedKey;
 import org.bukkit.entity.Player;
 import org.bukkit.event.EventHandler;
 import org.bukkit.event.entity.EntityDamageEvent;
 import org.jetbrains.annotations.NotNull;
-import xiamomc.morph.abilities.AbilityType;
+import xyz.nifeather.morph.abilities.AbilityType;
 
 public class NoFallDamageAbility extends NoOpOptionAbility
 {
diff --git a/src/main/java/xiamomc/morph/abilities/impl/NoOpOptionAbility.java b/src/main/java/xyz/nifeather/morph/abilities/impl/NoOpOptionAbility.java
similarity index 61%
rename from src/main/java/xiamomc/morph/abilities/impl/NoOpOptionAbility.java
rename to src/main/java/xyz/nifeather/morph/abilities/impl/NoOpOptionAbility.java
index 934b9ded..87f76aab 100644
--- a/src/main/java/xiamomc/morph/abilities/impl/NoOpOptionAbility.java
+++ b/src/main/java/xyz/nifeather/morph/abilities/impl/NoOpOptionAbility.java
@@ -1,8 +1,8 @@
-package xiamomc.morph.abilities.impl;
+package xyz.nifeather.morph.abilities.impl;
 
 import org.jetbrains.annotations.NotNull;
-import xiamomc.morph.abilities.MorphAbility;
-import xiamomc.morph.skills.options.NoOpConfiguration;
+import xyz.nifeather.morph.abilities.MorphAbility;
+import xyz.nifeather.morph.skills.options.NoOpConfiguration;
 
 public abstract class NoOpOptionAbility extends MorphAbility<NoOpConfiguration>
 {
diff --git a/src/main/java/xiamomc/morph/abilities/impl/NoSweetBushDamageAbility.java b/src/main/java/xyz/nifeather/morph/abilities/impl/NoSweetBushDamageAbility.java
similarity index 90%
rename from src/main/java/xiamomc/morph/abilities/impl/NoSweetBushDamageAbility.java
rename to src/main/java/xyz/nifeather/morph/abilities/impl/NoSweetBushDamageAbility.java
index 065183d6..d71af7e4 100644
--- a/src/main/java/xiamomc/morph/abilities/impl/NoSweetBushDamageAbility.java
+++ b/src/main/java/xyz/nifeather/morph/abilities/impl/NoSweetBushDamageAbility.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.abilities.impl;
+package xyz.nifeather.morph.abilities.impl;
 
 import org.bukkit.Material;
 import org.bukkit.NamespacedKey;
@@ -7,7 +7,7 @@
 import org.bukkit.event.entity.EntityDamageByBlockEvent;
 import org.bukkit.event.entity.EntityDamageEvent;
 import org.jetbrains.annotations.NotNull;
-import xiamomc.morph.abilities.AbilityType;
+import xyz.nifeather.morph.abilities.AbilityType;
 
 public class NoSweetBushDamageAbility extends NoOpOptionAbility
 {
diff --git a/src/main/java/xiamomc/morph/abilities/impl/OnAttackAbility.java b/src/main/java/xyz/nifeather/morph/abilities/impl/OnAttackAbility.java
similarity index 82%
rename from src/main/java/xiamomc/morph/abilities/impl/OnAttackAbility.java
rename to src/main/java/xyz/nifeather/morph/abilities/impl/OnAttackAbility.java
index 8777701e..10caae26 100644
--- a/src/main/java/xiamomc/morph/abilities/impl/OnAttackAbility.java
+++ b/src/main/java/xyz/nifeather/morph/abilities/impl/OnAttackAbility.java
@@ -1,11 +1,11 @@
-package xiamomc.morph.abilities.impl;
+package xyz.nifeather.morph.abilities.impl;
 
 import org.bukkit.entity.LivingEntity;
 import org.bukkit.entity.Player;
 import org.bukkit.event.EventHandler;
 import org.bukkit.event.entity.EntityDamageByEntityEvent;
-import xiamomc.morph.abilities.MorphAbility;
-import xiamomc.morph.storage.skill.ISkillOption;
+import xyz.nifeather.morph.abilities.MorphAbility;
+import xyz.nifeather.morph.storage.skill.ISkillOption;
 
 public abstract class OnAttackAbility<T extends ISkillOption> extends MorphAbility<T>
 {
diff --git a/src/main/java/xiamomc/morph/abilities/impl/ReduceFallDamageAbility.java b/src/main/java/xyz/nifeather/morph/abilities/impl/ReduceFallDamageAbility.java
similarity index 79%
rename from src/main/java/xiamomc/morph/abilities/impl/ReduceFallDamageAbility.java
rename to src/main/java/xyz/nifeather/morph/abilities/impl/ReduceFallDamageAbility.java
index 9024b79b..c7d277c1 100644
--- a/src/main/java/xiamomc/morph/abilities/impl/ReduceFallDamageAbility.java
+++ b/src/main/java/xyz/nifeather/morph/abilities/impl/ReduceFallDamageAbility.java
@@ -1,10 +1,10 @@
-package xiamomc.morph.abilities.impl;
+package xyz.nifeather.morph.abilities.impl;
 
 import org.bukkit.NamespacedKey;
 import org.bukkit.event.entity.EntityDamageEvent;
 import org.jetbrains.annotations.NotNull;
-import xiamomc.morph.abilities.AbilityType;
-import xiamomc.morph.abilities.options.ReduceDamageOption;
+import xyz.nifeather.morph.abilities.AbilityType;
+import xyz.nifeather.morph.abilities.options.ReduceDamageOption;
 
 public class ReduceFallDamageAbility extends DamageReducingAbility<ReduceDamageOption>
 {
diff --git a/src/main/java/xiamomc/morph/abilities/impl/ReduceMagicDamageAbility.java b/src/main/java/xyz/nifeather/morph/abilities/impl/ReduceMagicDamageAbility.java
similarity index 79%
rename from src/main/java/xiamomc/morph/abilities/impl/ReduceMagicDamageAbility.java
rename to src/main/java/xyz/nifeather/morph/abilities/impl/ReduceMagicDamageAbility.java
index 1e4ae300..5e14172f 100644
--- a/src/main/java/xiamomc/morph/abilities/impl/ReduceMagicDamageAbility.java
+++ b/src/main/java/xyz/nifeather/morph/abilities/impl/ReduceMagicDamageAbility.java
@@ -1,10 +1,10 @@
-package xiamomc.morph.abilities.impl;
+package xyz.nifeather.morph.abilities.impl;
 
 import org.bukkit.NamespacedKey;
 import org.bukkit.event.entity.EntityDamageEvent;
 import org.jetbrains.annotations.NotNull;
-import xiamomc.morph.abilities.AbilityType;
-import xiamomc.morph.abilities.options.ReduceDamageOption;
+import xyz.nifeather.morph.abilities.AbilityType;
+import xyz.nifeather.morph.abilities.options.ReduceDamageOption;
 
 public class ReduceMagicDamageAbility extends DamageReducingAbility<ReduceDamageOption>
 {
diff --git a/src/main/java/xiamomc/morph/abilities/impl/SmallJumpBoostAbility.java b/src/main/java/xyz/nifeather/morph/abilities/impl/SmallJumpBoostAbility.java
similarity index 79%
rename from src/main/java/xiamomc/morph/abilities/impl/SmallJumpBoostAbility.java
rename to src/main/java/xyz/nifeather/morph/abilities/impl/SmallJumpBoostAbility.java
index 88fbebf3..d42042f0 100644
--- a/src/main/java/xiamomc/morph/abilities/impl/SmallJumpBoostAbility.java
+++ b/src/main/java/xyz/nifeather/morph/abilities/impl/SmallJumpBoostAbility.java
@@ -1,11 +1,11 @@
-package xiamomc.morph.abilities.impl;
+package xyz.nifeather.morph.abilities.impl;
 
 import org.bukkit.NamespacedKey;
 import org.bukkit.potion.PotionEffect;
 import org.bukkit.potion.PotionEffectType;
 import org.jetbrains.annotations.NotNull;
-import xiamomc.morph.abilities.AbilityType;
-import xiamomc.morph.abilities.EffectMorphAbility;
+import xyz.nifeather.morph.abilities.AbilityType;
+import xyz.nifeather.morph.abilities.EffectMorphAbility;
 
 public class SmallJumpBoostAbility extends EffectMorphAbility
 {
diff --git a/src/main/java/xiamomc/morph/abilities/impl/SnowyAbility.java b/src/main/java/xyz/nifeather/morph/abilities/impl/SnowyAbility.java
similarity index 89%
rename from src/main/java/xiamomc/morph/abilities/impl/SnowyAbility.java
rename to src/main/java/xyz/nifeather/morph/abilities/impl/SnowyAbility.java
index 08d6b5af..9730eb1c 100644
--- a/src/main/java/xiamomc/morph/abilities/impl/SnowyAbility.java
+++ b/src/main/java/xyz/nifeather/morph/abilities/impl/SnowyAbility.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.abilities.impl;
+package xyz.nifeather.morph.abilities.impl;
 
 import org.bukkit.Material;
 import org.bukkit.NamespacedKey;
@@ -6,8 +6,8 @@
 import org.bukkit.event.EventHandler;
 import org.bukkit.event.entity.EntityDamageEvent;
 import org.jetbrains.annotations.NotNull;
-import xiamomc.morph.abilities.AbilityType;
-import xiamomc.morph.misc.DisguiseState;
+import xyz.nifeather.morph.abilities.AbilityType;
+import xyz.nifeather.morph.misc.DisguiseState;
 
 public class SnowyAbility extends NoOpOptionAbility
 {
diff --git a/src/main/java/xiamomc/morph/abilities/impl/SpiderAbility.java b/src/main/java/xyz/nifeather/morph/abilities/impl/SpiderAbility.java
similarity index 82%
rename from src/main/java/xiamomc/morph/abilities/impl/SpiderAbility.java
rename to src/main/java/xyz/nifeather/morph/abilities/impl/SpiderAbility.java
index 0655019f..215a850a 100644
--- a/src/main/java/xiamomc/morph/abilities/impl/SpiderAbility.java
+++ b/src/main/java/xyz/nifeather/morph/abilities/impl/SpiderAbility.java
@@ -1,15 +1,15 @@
-package xiamomc.morph.abilities.impl;
+package xyz.nifeather.morph.abilities.impl;
 
 import org.bukkit.NamespacedKey;
 import org.bukkit.entity.Player;
 import org.bukkit.util.Vector;
 import org.jetbrains.annotations.NotNull;
-import xiamomc.morph.abilities.AbilityType;
-import xiamomc.morph.config.ConfigOption;
-import xiamomc.morph.config.MorphConfigManager;
-import xiamomc.morph.misc.DisguiseState;
-import xiamomc.morph.misc.NmsRecord;
-import xiamomc.morph.utilities.CollisionUtils;
+import xyz.nifeather.morph.abilities.AbilityType;
+import xyz.nifeather.morph.config.ConfigOption;
+import xyz.nifeather.morph.config.MorphConfigManager;
+import xyz.nifeather.morph.misc.DisguiseState;
+import xyz.nifeather.morph.misc.NmsRecord;
+import xyz.nifeather.morph.utilities.CollisionUtils;
 import xiamomc.pluginbase.Annotations.Initializer;
 import xiamomc.pluginbase.Bindables.Bindable;
 
diff --git a/src/main/java/xiamomc/morph/abilities/impl/TakesDamageFromWaterAbility.java b/src/main/java/xyz/nifeather/morph/abilities/impl/TakesDamageFromWaterAbility.java
similarity index 74%
rename from src/main/java/xiamomc/morph/abilities/impl/TakesDamageFromWaterAbility.java
rename to src/main/java/xyz/nifeather/morph/abilities/impl/TakesDamageFromWaterAbility.java
index 8ff5bcda..9191c6f7 100644
--- a/src/main/java/xiamomc/morph/abilities/impl/TakesDamageFromWaterAbility.java
+++ b/src/main/java/xyz/nifeather/morph/abilities/impl/TakesDamageFromWaterAbility.java
@@ -1,12 +1,12 @@
-package xiamomc.morph.abilities.impl;
+package xyz.nifeather.morph.abilities.impl;
 
 import org.bukkit.NamespacedKey;
 import org.bukkit.entity.Player;
 import org.jetbrains.annotations.NotNull;
-import xiamomc.morph.abilities.AbilityType;
-import xiamomc.morph.abilities.MorphAbility;
-import xiamomc.morph.abilities.options.TakesDamageFromWaterOption;
-import xiamomc.morph.misc.DisguiseState;
+import xyz.nifeather.morph.abilities.AbilityType;
+import xyz.nifeather.morph.abilities.MorphAbility;
+import xyz.nifeather.morph.abilities.options.TakesDamageFromWaterOption;
+import xyz.nifeather.morph.misc.DisguiseState;
 
 public class TakesDamageFromWaterAbility extends MorphAbility<TakesDamageFromWaterOption>
 {
diff --git a/src/main/java/xiamomc/morph/abilities/impl/WardenAbility.java b/src/main/java/xyz/nifeather/morph/abilities/impl/WardenAbility.java
similarity index 96%
rename from src/main/java/xiamomc/morph/abilities/impl/WardenAbility.java
rename to src/main/java/xyz/nifeather/morph/abilities/impl/WardenAbility.java
index 21ee6664..53a64efb 100644
--- a/src/main/java/xiamomc/morph/abilities/impl/WardenAbility.java
+++ b/src/main/java/xyz/nifeather/morph/abilities/impl/WardenAbility.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.abilities.impl;
+package xyz.nifeather.morph.abilities.impl;
 
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
 import org.bukkit.GameEvent;
@@ -7,7 +7,7 @@
 import org.bukkit.event.EventHandler;
 import org.bukkit.event.world.GenericGameEvent;
 import org.jetbrains.annotations.NotNull;
-import xiamomc.morph.abilities.AbilityType;
+import xyz.nifeather.morph.abilities.AbilityType;
 
 import java.util.List;
 
diff --git a/src/main/java/xiamomc/morph/abilities/impl/WardenLessAwareAbility.java b/src/main/java/xyz/nifeather/morph/abilities/impl/WardenLessAwareAbility.java
similarity index 92%
rename from src/main/java/xiamomc/morph/abilities/impl/WardenLessAwareAbility.java
rename to src/main/java/xyz/nifeather/morph/abilities/impl/WardenLessAwareAbility.java
index 7b7cd5d4..4cbf409a 100644
--- a/src/main/java/xiamomc/morph/abilities/impl/WardenLessAwareAbility.java
+++ b/src/main/java/xyz/nifeather/morph/abilities/impl/WardenLessAwareAbility.java
@@ -1,11 +1,11 @@
-package xiamomc.morph.abilities.impl;
+package xyz.nifeather.morph.abilities.impl;
 
 import io.papermc.paper.event.entity.WardenAngerChangeEvent;
 import org.bukkit.NamespacedKey;
 import org.bukkit.entity.Player;
 import org.bukkit.event.EventHandler;
 import org.jetbrains.annotations.NotNull;
-import xiamomc.morph.abilities.AbilityType;
+import xyz.nifeather.morph.abilities.AbilityType;
 
 public class WardenLessAwareAbility extends NoOpOptionAbility
 {
diff --git a/src/main/java/xiamomc/morph/abilities/impl/onAttack/ExtraKnockbackAbility.java b/src/main/java/xyz/nifeather/morph/abilities/impl/onAttack/ExtraKnockbackAbility.java
similarity index 90%
rename from src/main/java/xiamomc/morph/abilities/impl/onAttack/ExtraKnockbackAbility.java
rename to src/main/java/xyz/nifeather/morph/abilities/impl/onAttack/ExtraKnockbackAbility.java
index 9a695ed4..2d432dae 100644
--- a/src/main/java/xiamomc/morph/abilities/impl/onAttack/ExtraKnockbackAbility.java
+++ b/src/main/java/xyz/nifeather/morph/abilities/impl/onAttack/ExtraKnockbackAbility.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.abilities.impl.onAttack;
+package xyz.nifeather.morph.abilities.impl.onAttack;
 
 import net.minecraft.world.entity.LivingEntity;
 import net.minecraft.world.entity.ai.attributes.Attributes;
@@ -6,10 +6,10 @@
 import org.bukkit.craftbukkit.entity.CraftEntity;
 import org.bukkit.entity.Player;
 import org.jetbrains.annotations.NotNull;
-import xiamomc.morph.MorphManager;
-import xiamomc.morph.abilities.AbilityType;
-import xiamomc.morph.abilities.impl.OnAttackAbility;
-import xiamomc.morph.abilities.options.ExtraKnockbackOption;
+import xyz.nifeather.morph.MorphManager;
+import xyz.nifeather.morph.abilities.AbilityType;
+import xyz.nifeather.morph.abilities.impl.OnAttackAbility;
+import xyz.nifeather.morph.abilities.options.ExtraKnockbackOption;
 import xiamomc.pluginbase.Annotations.Resolved;
 
 public class ExtraKnockbackAbility extends OnAttackAbility<ExtraKnockbackOption>
diff --git a/src/main/java/xiamomc/morph/abilities/impl/onAttack/PotionOnAttackAbility.java b/src/main/java/xyz/nifeather/morph/abilities/impl/onAttack/PotionOnAttackAbility.java
similarity index 83%
rename from src/main/java/xiamomc/morph/abilities/impl/onAttack/PotionOnAttackAbility.java
rename to src/main/java/xyz/nifeather/morph/abilities/impl/onAttack/PotionOnAttackAbility.java
index 18b5c338..3fd8b25a 100644
--- a/src/main/java/xiamomc/morph/abilities/impl/onAttack/PotionOnAttackAbility.java
+++ b/src/main/java/xyz/nifeather/morph/abilities/impl/onAttack/PotionOnAttackAbility.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.abilities.impl.onAttack;
+package xyz.nifeather.morph.abilities.impl.onAttack;
 
 import org.bukkit.NamespacedKey;
 import org.bukkit.entity.LivingEntity;
@@ -6,10 +6,10 @@
 import org.bukkit.potion.PotionEffect;
 import org.bukkit.potion.PotionEffectType;
 import org.jetbrains.annotations.NotNull;
-import xiamomc.morph.MorphManager;
-import xiamomc.morph.abilities.AbilityType;
-import xiamomc.morph.abilities.impl.OnAttackAbility;
-import xiamomc.morph.abilities.options.PotionEffectOption;
+import xyz.nifeather.morph.MorphManager;
+import xyz.nifeather.morph.abilities.AbilityType;
+import xyz.nifeather.morph.abilities.impl.OnAttackAbility;
+import xyz.nifeather.morph.abilities.options.PotionEffectOption;
 import xiamomc.pluginbase.Annotations.Resolved;
 
 public class PotionOnAttackAbility extends OnAttackAbility<PotionEffectOption>
diff --git a/src/main/java/xiamomc/morph/abilities/impl/potion/BreatheUnderWaterAbility.java b/src/main/java/xyz/nifeather/morph/abilities/impl/potion/BreatheUnderWaterAbility.java
similarity index 78%
rename from src/main/java/xiamomc/morph/abilities/impl/potion/BreatheUnderWaterAbility.java
rename to src/main/java/xyz/nifeather/morph/abilities/impl/potion/BreatheUnderWaterAbility.java
index 4674db3b..75d1fa6b 100644
--- a/src/main/java/xiamomc/morph/abilities/impl/potion/BreatheUnderWaterAbility.java
+++ b/src/main/java/xyz/nifeather/morph/abilities/impl/potion/BreatheUnderWaterAbility.java
@@ -1,11 +1,11 @@
-package xiamomc.morph.abilities.impl.potion;
+package xyz.nifeather.morph.abilities.impl.potion;
 
 import org.bukkit.NamespacedKey;
 import org.bukkit.potion.PotionEffect;
 import org.bukkit.potion.PotionEffectType;
 import org.jetbrains.annotations.NotNull;
-import xiamomc.morph.abilities.AbilityType;
-import xiamomc.morph.abilities.EffectMorphAbility;
+import xyz.nifeather.morph.abilities.AbilityType;
+import xyz.nifeather.morph.abilities.EffectMorphAbility;
 
 public class BreatheUnderWaterAbility extends EffectMorphAbility
 {
diff --git a/src/main/java/xiamomc/morph/abilities/impl/potion/FeatherFallingAbility.java b/src/main/java/xyz/nifeather/morph/abilities/impl/potion/FeatherFallingAbility.java
similarity index 78%
rename from src/main/java/xiamomc/morph/abilities/impl/potion/FeatherFallingAbility.java
rename to src/main/java/xyz/nifeather/morph/abilities/impl/potion/FeatherFallingAbility.java
index 2f7e0b12..0c174cce 100644
--- a/src/main/java/xiamomc/morph/abilities/impl/potion/FeatherFallingAbility.java
+++ b/src/main/java/xyz/nifeather/morph/abilities/impl/potion/FeatherFallingAbility.java
@@ -1,11 +1,11 @@
-package xiamomc.morph.abilities.impl.potion;
+package xyz.nifeather.morph.abilities.impl.potion;
 
 import org.bukkit.NamespacedKey;
 import org.bukkit.potion.PotionEffect;
 import org.bukkit.potion.PotionEffectType;
 import org.jetbrains.annotations.NotNull;
-import xiamomc.morph.abilities.AbilityType;
-import xiamomc.morph.abilities.EffectMorphAbility;
+import xyz.nifeather.morph.abilities.AbilityType;
+import xyz.nifeather.morph.abilities.EffectMorphAbility;
 
 public class FeatherFallingAbility extends EffectMorphAbility
 {
diff --git a/src/main/java/xiamomc/morph/abilities/impl/potion/FireResistanceAbility.java b/src/main/java/xyz/nifeather/morph/abilities/impl/potion/FireResistanceAbility.java
similarity index 78%
rename from src/main/java/xiamomc/morph/abilities/impl/potion/FireResistanceAbility.java
rename to src/main/java/xyz/nifeather/morph/abilities/impl/potion/FireResistanceAbility.java
index d30cbc17..54abe687 100644
--- a/src/main/java/xiamomc/morph/abilities/impl/potion/FireResistanceAbility.java
+++ b/src/main/java/xyz/nifeather/morph/abilities/impl/potion/FireResistanceAbility.java
@@ -1,11 +1,11 @@
-package xiamomc.morph.abilities.impl.potion;
+package xyz.nifeather.morph.abilities.impl.potion;
 
 import org.bukkit.NamespacedKey;
 import org.bukkit.potion.PotionEffect;
 import org.bukkit.potion.PotionEffectType;
 import org.jetbrains.annotations.NotNull;
-import xiamomc.morph.abilities.AbilityType;
-import xiamomc.morph.abilities.EffectMorphAbility;
+import xyz.nifeather.morph.abilities.AbilityType;
+import xyz.nifeather.morph.abilities.EffectMorphAbility;
 
 public class FireResistanceAbility extends EffectMorphAbility
 {
diff --git a/src/main/java/xiamomc/morph/abilities/impl/potion/JumpBoostAbility.java b/src/main/java/xyz/nifeather/morph/abilities/impl/potion/JumpBoostAbility.java
similarity index 77%
rename from src/main/java/xiamomc/morph/abilities/impl/potion/JumpBoostAbility.java
rename to src/main/java/xyz/nifeather/morph/abilities/impl/potion/JumpBoostAbility.java
index a70458dd..d529d801 100644
--- a/src/main/java/xiamomc/morph/abilities/impl/potion/JumpBoostAbility.java
+++ b/src/main/java/xyz/nifeather/morph/abilities/impl/potion/JumpBoostAbility.java
@@ -1,11 +1,11 @@
-package xiamomc.morph.abilities.impl.potion;
+package xyz.nifeather.morph.abilities.impl.potion;
 
 import org.bukkit.NamespacedKey;
 import org.bukkit.potion.PotionEffect;
 import org.bukkit.potion.PotionEffectType;
 import org.jetbrains.annotations.NotNull;
-import xiamomc.morph.abilities.AbilityType;
-import xiamomc.morph.abilities.EffectMorphAbility;
+import xyz.nifeather.morph.abilities.AbilityType;
+import xyz.nifeather.morph.abilities.EffectMorphAbility;
 
 public class JumpBoostAbility extends EffectMorphAbility
 {
diff --git a/src/main/java/xiamomc/morph/abilities/impl/potion/NightVisionAbility.java b/src/main/java/xyz/nifeather/morph/abilities/impl/potion/NightVisionAbility.java
similarity index 80%
rename from src/main/java/xiamomc/morph/abilities/impl/potion/NightVisionAbility.java
rename to src/main/java/xyz/nifeather/morph/abilities/impl/potion/NightVisionAbility.java
index 91ab8da9..54ff217c 100644
--- a/src/main/java/xiamomc/morph/abilities/impl/potion/NightVisionAbility.java
+++ b/src/main/java/xyz/nifeather/morph/abilities/impl/potion/NightVisionAbility.java
@@ -1,11 +1,11 @@
-package xiamomc.morph.abilities.impl.potion;
+package xyz.nifeather.morph.abilities.impl.potion;
 
 import org.bukkit.NamespacedKey;
 import org.bukkit.potion.PotionEffect;
 import org.bukkit.potion.PotionEffectType;
 import org.jetbrains.annotations.NotNull;
-import xiamomc.morph.abilities.AbilityType;
-import xiamomc.morph.abilities.EffectMorphAbility;
+import xyz.nifeather.morph.abilities.AbilityType;
+import xyz.nifeather.morph.abilities.EffectMorphAbility;
 
 public class NightVisionAbility extends EffectMorphAbility
 {
diff --git a/src/main/java/xiamomc/morph/abilities/impl/potion/SpeedBoostAbility.java b/src/main/java/xyz/nifeather/morph/abilities/impl/potion/SpeedBoostAbility.java
similarity index 77%
rename from src/main/java/xiamomc/morph/abilities/impl/potion/SpeedBoostAbility.java
rename to src/main/java/xyz/nifeather/morph/abilities/impl/potion/SpeedBoostAbility.java
index 4bba7fc2..a61da821 100644
--- a/src/main/java/xiamomc/morph/abilities/impl/potion/SpeedBoostAbility.java
+++ b/src/main/java/xyz/nifeather/morph/abilities/impl/potion/SpeedBoostAbility.java
@@ -1,11 +1,11 @@
-package xiamomc.morph.abilities.impl.potion;
+package xyz.nifeather.morph.abilities.impl.potion;
 
 import org.bukkit.NamespacedKey;
 import org.bukkit.potion.PotionEffect;
 import org.bukkit.potion.PotionEffectType;
 import org.jetbrains.annotations.NotNull;
-import xiamomc.morph.abilities.AbilityType;
-import xiamomc.morph.abilities.EffectMorphAbility;
+import xyz.nifeather.morph.abilities.AbilityType;
+import xyz.nifeather.morph.abilities.EffectMorphAbility;
 
 @Deprecated
 public class SpeedBoostAbility extends EffectMorphAbility
diff --git a/src/main/java/xiamomc/morph/abilities/options/AttributeModifyOption.java b/src/main/java/xyz/nifeather/morph/abilities/options/AttributeModifyOption.java
similarity index 97%
rename from src/main/java/xiamomc/morph/abilities/options/AttributeModifyOption.java
rename to src/main/java/xyz/nifeather/morph/abilities/options/AttributeModifyOption.java
index 528db34e..3b590c5c 100644
--- a/src/main/java/xiamomc/morph/abilities/options/AttributeModifyOption.java
+++ b/src/main/java/xyz/nifeather/morph/abilities/options/AttributeModifyOption.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.abilities.options;
+package xyz.nifeather.morph.abilities.options;
 
 import com.google.gson.annotations.Expose;
 import com.google.gson.annotations.SerializedName;
@@ -7,7 +7,7 @@
 import org.bukkit.attribute.Attribute;
 import org.bukkit.attribute.AttributeModifier;
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.storage.skill.ISkillOption;
+import xyz.nifeather.morph.storage.skill.ISkillOption;
 
 import java.util.List;
 import java.util.Map;
diff --git a/src/main/java/xiamomc/morph/abilities/options/BossbarOption.java b/src/main/java/xyz/nifeather/morph/abilities/options/BossbarOption.java
similarity index 96%
rename from src/main/java/xiamomc/morph/abilities/options/BossbarOption.java
rename to src/main/java/xyz/nifeather/morph/abilities/options/BossbarOption.java
index df490a86..dbd0fb19 100644
--- a/src/main/java/xiamomc/morph/abilities/options/BossbarOption.java
+++ b/src/main/java/xyz/nifeather/morph/abilities/options/BossbarOption.java
@@ -1,11 +1,11 @@
-package xiamomc.morph.abilities.options;
+package xyz.nifeather.morph.abilities.options;
 
 import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
 import it.unimi.dsi.fastutil.objects.ObjectArraySet;
 import net.kyori.adventure.bossbar.BossBar;
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.storage.skill.ISkillOption;
+import xyz.nifeather.morph.storage.skill.ISkillOption;
 
 import java.util.List;
 import java.util.Map;
diff --git a/src/main/java/xiamomc/morph/abilities/options/ChatOverrideOption.java b/src/main/java/xyz/nifeather/morph/abilities/options/ChatOverrideOption.java
similarity index 86%
rename from src/main/java/xiamomc/morph/abilities/options/ChatOverrideOption.java
rename to src/main/java/xyz/nifeather/morph/abilities/options/ChatOverrideOption.java
index 482b652d..514d1778 100644
--- a/src/main/java/xiamomc/morph/abilities/options/ChatOverrideOption.java
+++ b/src/main/java/xyz/nifeather/morph/abilities/options/ChatOverrideOption.java
@@ -1,9 +1,9 @@
-package xiamomc.morph.abilities.options;
+package xyz.nifeather.morph.abilities.options;
 
 import com.google.gson.annotations.Expose;
 import com.google.gson.annotations.SerializedName;
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.storage.skill.ISkillOption;
+import xyz.nifeather.morph.storage.skill.ISkillOption;
 
 public class ChatOverrideOption implements ISkillOption
 {
diff --git a/src/main/java/xiamomc/morph/abilities/options/DryoutAbilityOption.java b/src/main/java/xyz/nifeather/morph/abilities/options/DryoutAbilityOption.java
similarity index 85%
rename from src/main/java/xiamomc/morph/abilities/options/DryoutAbilityOption.java
rename to src/main/java/xyz/nifeather/morph/abilities/options/DryoutAbilityOption.java
index d68b5684..7bba0390 100644
--- a/src/main/java/xiamomc/morph/abilities/options/DryoutAbilityOption.java
+++ b/src/main/java/xyz/nifeather/morph/abilities/options/DryoutAbilityOption.java
@@ -1,8 +1,8 @@
-package xiamomc.morph.abilities.options;
+package xyz.nifeather.morph.abilities.options;
 
 import com.google.gson.annotations.Expose;
 import com.google.gson.annotations.SerializedName;
-import xiamomc.morph.storage.skill.ISkillOption;
+import xyz.nifeather.morph.storage.skill.ISkillOption;
 
 public class DryoutAbilityOption implements ISkillOption
 {
diff --git a/src/main/java/xiamomc/morph/abilities/options/ExtraKnockbackOption.java b/src/main/java/xyz/nifeather/morph/abilities/options/ExtraKnockbackOption.java
similarity index 91%
rename from src/main/java/xiamomc/morph/abilities/options/ExtraKnockbackOption.java
rename to src/main/java/xyz/nifeather/morph/abilities/options/ExtraKnockbackOption.java
index ac12adca..fbd65656 100644
--- a/src/main/java/xiamomc/morph/abilities/options/ExtraKnockbackOption.java
+++ b/src/main/java/xyz/nifeather/morph/abilities/options/ExtraKnockbackOption.java
@@ -1,9 +1,9 @@
-package xiamomc.morph.abilities.options;
+package xyz.nifeather.morph.abilities.options;
 
 import com.google.gson.annotations.Expose;
 import com.google.gson.annotations.SerializedName;
 import net.minecraft.world.phys.Vec3;
-import xiamomc.morph.storage.skill.ISkillOption;
+import xyz.nifeather.morph.storage.skill.ISkillOption;
 
 public class ExtraKnockbackOption implements ISkillOption
 {
diff --git a/src/main/java/xiamomc/morph/abilities/options/FlyOption.java b/src/main/java/xyz/nifeather/morph/abilities/options/FlyOption.java
similarity index 91%
rename from src/main/java/xiamomc/morph/abilities/options/FlyOption.java
rename to src/main/java/xyz/nifeather/morph/abilities/options/FlyOption.java
index b3f4127f..27de80b7 100644
--- a/src/main/java/xiamomc/morph/abilities/options/FlyOption.java
+++ b/src/main/java/xyz/nifeather/morph/abilities/options/FlyOption.java
@@ -1,8 +1,8 @@
-package xiamomc.morph.abilities.options;
+package xyz.nifeather.morph.abilities.options;
 
 import com.google.gson.annotations.Expose;
 import com.google.gson.annotations.SerializedName;
-import xiamomc.morph.storage.skill.ISkillOption;
+import xyz.nifeather.morph.storage.skill.ISkillOption;
 
 public class FlyOption implements ISkillOption
 {
diff --git a/src/main/java/xiamomc/morph/abilities/options/HealsFromEntityOption.java b/src/main/java/xyz/nifeather/morph/abilities/options/HealsFromEntityOption.java
similarity index 93%
rename from src/main/java/xiamomc/morph/abilities/options/HealsFromEntityOption.java
rename to src/main/java/xyz/nifeather/morph/abilities/options/HealsFromEntityOption.java
index 6d8132e4..d259d041 100644
--- a/src/main/java/xiamomc/morph/abilities/options/HealsFromEntityOption.java
+++ b/src/main/java/xyz/nifeather/morph/abilities/options/HealsFromEntityOption.java
@@ -1,10 +1,10 @@
-package xiamomc.morph.abilities.options;
+package xyz.nifeather.morph.abilities.options;
 
 import com.google.gson.annotations.Expose;
 import com.google.gson.annotations.SerializedName;
 import org.bukkit.entity.EntityType;
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.storage.skill.ISkillOption;
+import xyz.nifeather.morph.storage.skill.ISkillOption;
 
 public class HealsFromEntityOption implements ISkillOption
 {
diff --git a/src/main/java/xiamomc/morph/abilities/options/PotionEffectOption.java b/src/main/java/xyz/nifeather/morph/abilities/options/PotionEffectOption.java
similarity index 89%
rename from src/main/java/xiamomc/morph/abilities/options/PotionEffectOption.java
rename to src/main/java/xyz/nifeather/morph/abilities/options/PotionEffectOption.java
index 7bac2262..1ef1275b 100644
--- a/src/main/java/xiamomc/morph/abilities/options/PotionEffectOption.java
+++ b/src/main/java/xyz/nifeather/morph/abilities/options/PotionEffectOption.java
@@ -1,9 +1,9 @@
-package xiamomc.morph.abilities.options;
+package xyz.nifeather.morph.abilities.options;
 
 import com.google.gson.annotations.Expose;
 import com.google.gson.annotations.SerializedName;
 import org.bukkit.potion.PotionEffectType;
-import xiamomc.morph.storage.skill.ISkillOption;
+import xyz.nifeather.morph.storage.skill.ISkillOption;
 
 public class PotionEffectOption implements ISkillOption
 {
diff --git a/src/main/java/xiamomc/morph/abilities/options/ReduceDamageOption.java b/src/main/java/xyz/nifeather/morph/abilities/options/ReduceDamageOption.java
similarity index 90%
rename from src/main/java/xiamomc/morph/abilities/options/ReduceDamageOption.java
rename to src/main/java/xyz/nifeather/morph/abilities/options/ReduceDamageOption.java
index bdafd190..7bc61567 100644
--- a/src/main/java/xiamomc/morph/abilities/options/ReduceDamageOption.java
+++ b/src/main/java/xyz/nifeather/morph/abilities/options/ReduceDamageOption.java
@@ -1,8 +1,8 @@
-package xiamomc.morph.abilities.options;
+package xyz.nifeather.morph.abilities.options;
 
 import com.google.gson.annotations.Expose;
 import com.google.gson.annotations.SerializedName;
-import xiamomc.morph.storage.skill.ISkillOption;
+import xyz.nifeather.morph.storage.skill.ISkillOption;
 
 public class ReduceDamageOption implements ISkillOption
 {
diff --git a/src/main/java/xiamomc/morph/abilities/options/TakesDamageFromWaterOption.java b/src/main/java/xyz/nifeather/morph/abilities/options/TakesDamageFromWaterOption.java
similarity index 79%
rename from src/main/java/xiamomc/morph/abilities/options/TakesDamageFromWaterOption.java
rename to src/main/java/xyz/nifeather/morph/abilities/options/TakesDamageFromWaterOption.java
index 1a550783..a9687445 100644
--- a/src/main/java/xiamomc/morph/abilities/options/TakesDamageFromWaterOption.java
+++ b/src/main/java/xyz/nifeather/morph/abilities/options/TakesDamageFromWaterOption.java
@@ -1,8 +1,8 @@
-package xiamomc.morph.abilities.options;
+package xyz.nifeather.morph.abilities.options;
 
 import com.google.gson.annotations.Expose;
 import com.google.gson.annotations.SerializedName;
-import xiamomc.morph.storage.skill.ISkillOption;
+import xyz.nifeather.morph.storage.skill.ISkillOption;
 
 public class TakesDamageFromWaterOption implements ISkillOption
 {
diff --git a/src/main/java/xiamomc/morph/backends/DisguiseBackend.java b/src/main/java/xyz/nifeather/morph/backends/DisguiseBackend.java
similarity index 98%
rename from src/main/java/xiamomc/morph/backends/DisguiseBackend.java
rename to src/main/java/xyz/nifeather/morph/backends/DisguiseBackend.java
index 548e4171..d4613670 100644
--- a/src/main/java/xiamomc/morph/backends/DisguiseBackend.java
+++ b/src/main/java/xyz/nifeather/morph/backends/DisguiseBackend.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.backends;
+package xyz.nifeather.morph.backends;
 
 import org.bukkit.entity.Entity;
 import org.bukkit.entity.EntityType;
@@ -6,7 +6,7 @@
 import org.jetbrains.annotations.ApiStatus;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.MorphPluginObject;
+import xyz.nifeather.morph.MorphPluginObject;
 import xiamomc.pluginbase.Messages.FormattableMessage;
 
 import java.util.Collection;
diff --git a/src/main/java/xiamomc/morph/backends/DisguiseWrapper.java b/src/main/java/xyz/nifeather/morph/backends/DisguiseWrapper.java
similarity index 97%
rename from src/main/java/xiamomc/morph/backends/DisguiseWrapper.java
rename to src/main/java/xyz/nifeather/morph/backends/DisguiseWrapper.java
index c2b60f1b..d7c1f94f 100644
--- a/src/main/java/xiamomc/morph/backends/DisguiseWrapper.java
+++ b/src/main/java/xyz/nifeather/morph/backends/DisguiseWrapper.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.backends;
+package xyz.nifeather.morph.backends;
 
 import com.mojang.authlib.GameProfile;
 import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap;
@@ -16,11 +16,11 @@
 import org.jetbrains.annotations.Nullable;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import xiamomc.morph.MorphPlugin;
-import xiamomc.morph.misc.CollisionBoxRecord;
-import xiamomc.morph.misc.DisguiseState;
-import xiamomc.morph.misc.disguiseProperty.SingleProperty;
-import xiamomc.morph.utilities.EntityTypeUtils;
+import xyz.nifeather.morph.MorphPlugin;
+import xyz.nifeather.morph.misc.CollisionBoxRecord;
+import xyz.nifeather.morph.misc.DisguiseState;
+import xyz.nifeather.morph.misc.disguiseProperty.SingleProperty;
+import xyz.nifeather.morph.utilities.EntityTypeUtils;
 
 import java.util.Map;
 import java.util.Objects;
diff --git a/src/main/java/xiamomc/morph/backends/EventWrapper.java b/src/main/java/xyz/nifeather/morph/backends/EventWrapper.java
similarity index 94%
rename from src/main/java/xiamomc/morph/backends/EventWrapper.java
rename to src/main/java/xyz/nifeather/morph/backends/EventWrapper.java
index 47cbd036..be6c3d2d 100644
--- a/src/main/java/xiamomc/morph/backends/EventWrapper.java
+++ b/src/main/java/xyz/nifeather/morph/backends/EventWrapper.java
@@ -1,13 +1,11 @@
-package xiamomc.morph.backends;
+package xyz.nifeather.morph.backends;
 
-import com.mojang.authlib.GameProfile;
 import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap;
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
 import org.jetbrains.annotations.NotNull;
 
 import java.util.List;
 import java.util.Map;
-import java.util.Optional;
 import java.util.function.Consumer;
 
 public abstract class EventWrapper<TInstance> extends DisguiseWrapper<TInstance>
diff --git a/src/main/java/xiamomc/morph/backends/WrapperAttribute.java b/src/main/java/xyz/nifeather/morph/backends/WrapperAttribute.java
similarity index 97%
rename from src/main/java/xiamomc/morph/backends/WrapperAttribute.java
rename to src/main/java/xyz/nifeather/morph/backends/WrapperAttribute.java
index d25603ef..2ac75b59 100644
--- a/src/main/java/xiamomc/morph/backends/WrapperAttribute.java
+++ b/src/main/java/xyz/nifeather/morph/backends/WrapperAttribute.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.backends;
+package xyz.nifeather.morph.backends;
 
 import com.mojang.authlib.GameProfile;
 import net.minecraft.nbt.CompoundTag;
diff --git a/src/main/java/xiamomc/morph/backends/WrapperEvent.java b/src/main/java/xyz/nifeather/morph/backends/WrapperEvent.java
similarity index 80%
rename from src/main/java/xiamomc/morph/backends/WrapperEvent.java
rename to src/main/java/xyz/nifeather/morph/backends/WrapperEvent.java
index cad3d19f..3ea5f7f2 100644
--- a/src/main/java/xiamomc/morph/backends/WrapperEvent.java
+++ b/src/main/java/xyz/nifeather/morph/backends/WrapperEvent.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.backends;
+package xyz.nifeather.morph.backends;
 
 import com.mojang.authlib.GameProfile;
 
diff --git a/src/main/java/xiamomc/morph/backends/fallback/NilBackend.java b/src/main/java/xyz/nifeather/morph/backends/fallback/NilBackend.java
similarity index 93%
rename from src/main/java/xiamomc/morph/backends/fallback/NilBackend.java
rename to src/main/java/xyz/nifeather/morph/backends/fallback/NilBackend.java
index b797e8b9..8704d5e5 100644
--- a/src/main/java/xiamomc/morph/backends/fallback/NilBackend.java
+++ b/src/main/java/xyz/nifeather/morph/backends/fallback/NilBackend.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.backends.fallback;
+package xyz.nifeather.morph.backends.fallback;
 
 import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
@@ -8,14 +8,14 @@
 import org.bukkit.entity.Player;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.backends.DisguiseBackend;
-import xiamomc.morph.backends.DisguiseWrapper;
-import xiamomc.morph.backends.WrapperAttribute;
-import xiamomc.morph.messages.BackendStrings;
-import xiamomc.morph.misc.NetworkingHelper;
+import xyz.nifeather.morph.backends.DisguiseBackend;
+import xyz.nifeather.morph.backends.DisguiseWrapper;
+import xyz.nifeather.morph.backends.WrapperAttribute;
+import xyz.nifeather.morph.messages.BackendStrings;
+import xyz.nifeather.morph.misc.NetworkingHelper;
 import xiamomc.morph.network.commands.S2C.clientrender.S2CRenderMapAddCommand;
 import xiamomc.morph.network.commands.S2C.clientrender.S2CRenderMapRemoveCommand;
-import xiamomc.morph.network.server.MorphClientHandler;
+import xyz.nifeather.morph.network.server.MorphClientHandler;
 import xiamomc.pluginbase.Annotations.Resolved;
 import xiamomc.pluginbase.Messages.FormattableMessage;
 
diff --git a/src/main/java/xiamomc/morph/backends/fallback/NilDisguise.java b/src/main/java/xyz/nifeather/morph/backends/fallback/NilDisguise.java
similarity index 96%
rename from src/main/java/xiamomc/morph/backends/fallback/NilDisguise.java
rename to src/main/java/xyz/nifeather/morph/backends/fallback/NilDisguise.java
index e2078d14..231a0acd 100644
--- a/src/main/java/xiamomc/morph/backends/fallback/NilDisguise.java
+++ b/src/main/java/xyz/nifeather/morph/backends/fallback/NilDisguise.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.backends.fallback;
+package xyz.nifeather.morph.backends.fallback;
 
 import com.mojang.authlib.GameProfile;
 import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
diff --git a/src/main/java/xiamomc/morph/backends/fallback/NilWrapper.java b/src/main/java/xyz/nifeather/morph/backends/fallback/NilWrapper.java
similarity index 91%
rename from src/main/java/xiamomc/morph/backends/fallback/NilWrapper.java
rename to src/main/java/xyz/nifeather/morph/backends/fallback/NilWrapper.java
index c0ec0357..5d98f067 100644
--- a/src/main/java/xiamomc/morph/backends/fallback/NilWrapper.java
+++ b/src/main/java/xyz/nifeather/morph/backends/fallback/NilWrapper.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.backends.fallback;
+package xyz.nifeather.morph.backends.fallback;
 
 import com.mojang.authlib.GameProfile;
 import net.minecraft.nbt.CompoundTag;
@@ -11,15 +11,15 @@
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 import org.slf4j.Logger;
-import xiamomc.morph.MorphPlugin;
-import xiamomc.morph.backends.DisguiseWrapper;
-import xiamomc.morph.backends.EventWrapper;
-import xiamomc.morph.backends.WrapperAttribute;
-import xiamomc.morph.backends.WrapperEvent;
-import xiamomc.morph.misc.DisguiseEquipment;
-import xiamomc.morph.misc.DisguiseState;
-import xiamomc.morph.misc.disguiseProperty.SingleProperty;
-import xiamomc.morph.utilities.NbtUtils;
+import xyz.nifeather.morph.MorphPlugin;
+import xyz.nifeather.morph.backends.DisguiseWrapper;
+import xyz.nifeather.morph.backends.EventWrapper;
+import xyz.nifeather.morph.backends.WrapperAttribute;
+import xyz.nifeather.morph.backends.WrapperEvent;
+import xyz.nifeather.morph.misc.DisguiseEquipment;
+import xyz.nifeather.morph.misc.DisguiseState;
+import xyz.nifeather.morph.misc.disguiseProperty.SingleProperty;
+import xyz.nifeather.morph.utilities.NbtUtils;
 
 import java.util.Map;
 import java.util.Optional;
diff --git a/src/main/java/xiamomc/morph/backends/modelengine/MEBackend.java b/src/main/java/xyz/nifeather/morph/backends/modelengine/MEBackend.java
similarity index 95%
rename from src/main/java/xiamomc/morph/backends/modelengine/MEBackend.java
rename to src/main/java/xyz/nifeather/morph/backends/modelengine/MEBackend.java
index da68f515..ced2aa87 100644
--- a/src/main/java/xiamomc/morph/backends/modelengine/MEBackend.java
+++ b/src/main/java/xyz/nifeather/morph/backends/modelengine/MEBackend.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.backends.modelengine;
+package xyz.nifeather.morph.backends.modelengine;
 
 import com.ticxo.modelengine.api.ModelEngineAPI;
 import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap;
@@ -8,11 +8,11 @@
 import org.bukkit.entity.Player;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.backends.DisguiseBackend;
-import xiamomc.morph.backends.DisguiseWrapper;
-import xiamomc.morph.backends.modelengine.vanish.IVanishSource;
-import xiamomc.morph.backends.modelengine.vanish.ProtocolLibVanishSource;
-import xiamomc.morph.backends.modelengine.vanish.VanillaVanishSource;
+import xyz.nifeather.morph.backends.DisguiseBackend;
+import xyz.nifeather.morph.backends.DisguiseWrapper;
+import xyz.nifeather.morph.backends.modelengine.vanish.IVanishSource;
+import xyz.nifeather.morph.backends.modelengine.vanish.ProtocolLibVanishSource;
+import xyz.nifeather.morph.backends.modelengine.vanish.VanillaVanishSource;
 import xiamomc.pluginbase.Messages.FormattableMessage;
 
 import java.util.Collection;
diff --git a/src/main/java/xiamomc/morph/backends/modelengine/MEDisguiseInstance.java b/src/main/java/xyz/nifeather/morph/backends/modelengine/MEDisguiseInstance.java
similarity index 76%
rename from src/main/java/xiamomc/morph/backends/modelengine/MEDisguiseInstance.java
rename to src/main/java/xyz/nifeather/morph/backends/modelengine/MEDisguiseInstance.java
index 008cd6c5..c2c96488 100644
--- a/src/main/java/xiamomc/morph/backends/modelengine/MEDisguiseInstance.java
+++ b/src/main/java/xyz/nifeather/morph/backends/modelengine/MEDisguiseInstance.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.backends.modelengine;
+package xyz.nifeather.morph.backends.modelengine;
 
 public class MEDisguiseInstance
 {
diff --git a/src/main/java/xiamomc/morph/backends/modelengine/MEDisguiseWrapper.java b/src/main/java/xyz/nifeather/morph/backends/modelengine/MEDisguiseWrapper.java
similarity index 94%
rename from src/main/java/xiamomc/morph/backends/modelengine/MEDisguiseWrapper.java
rename to src/main/java/xyz/nifeather/morph/backends/modelengine/MEDisguiseWrapper.java
index a6f0e758..2ce4bd96 100644
--- a/src/main/java/xiamomc/morph/backends/modelengine/MEDisguiseWrapper.java
+++ b/src/main/java/xyz/nifeather/morph/backends/modelengine/MEDisguiseWrapper.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.backends.modelengine;
+package xyz.nifeather.morph.backends.modelengine;
 
 import com.ticxo.modelengine.api.ModelEngineAPI;
 import com.ticxo.modelengine.api.model.ActiveModel;
@@ -15,13 +15,13 @@
 import org.jetbrains.annotations.Nullable;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import xiamomc.morph.MorphPlugin;
-import xiamomc.morph.backends.DisguiseBackend;
-import xiamomc.morph.backends.DisguiseWrapper;
-import xiamomc.morph.backends.WrapperEvent;
-import xiamomc.morph.misc.DisguiseEquipment;
-import xiamomc.morph.misc.DisguiseState;
-import xiamomc.morph.misc.disguiseProperty.SingleProperty;
+import xyz.nifeather.morph.MorphPlugin;
+import xyz.nifeather.morph.backends.DisguiseBackend;
+import xyz.nifeather.morph.backends.DisguiseWrapper;
+import xyz.nifeather.morph.backends.WrapperEvent;
+import xyz.nifeather.morph.misc.DisguiseEquipment;
+import xyz.nifeather.morph.misc.DisguiseState;
+import xyz.nifeather.morph.misc.disguiseProperty.SingleProperty;
 
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
diff --git a/src/main/java/xiamomc/morph/backends/modelengine/vanish/IVanishSource.java b/src/main/java/xyz/nifeather/morph/backends/modelengine/vanish/IVanishSource.java
similarity index 73%
rename from src/main/java/xiamomc/morph/backends/modelengine/vanish/IVanishSource.java
rename to src/main/java/xyz/nifeather/morph/backends/modelengine/vanish/IVanishSource.java
index a85094fd..d3b3c94c 100644
--- a/src/main/java/xiamomc/morph/backends/modelengine/vanish/IVanishSource.java
+++ b/src/main/java/xyz/nifeather/morph/backends/modelengine/vanish/IVanishSource.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.backends.modelengine.vanish;
+package xyz.nifeather.morph.backends.modelengine.vanish;
 
 import org.bukkit.entity.Player;
 
diff --git a/src/main/java/xiamomc/morph/backends/modelengine/vanish/ProtocolLibVanishSource.java b/src/main/java/xyz/nifeather/morph/backends/modelengine/vanish/ProtocolLibVanishSource.java
similarity index 87%
rename from src/main/java/xiamomc/morph/backends/modelengine/vanish/ProtocolLibVanishSource.java
rename to src/main/java/xyz/nifeather/morph/backends/modelengine/vanish/ProtocolLibVanishSource.java
index 914d2c90..7d0bcbeb 100644
--- a/src/main/java/xiamomc/morph/backends/modelengine/vanish/ProtocolLibVanishSource.java
+++ b/src/main/java/xyz/nifeather/morph/backends/modelengine/vanish/ProtocolLibVanishSource.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.backends.modelengine.vanish;
+package xyz.nifeather.morph.backends.modelengine.vanish;
 
 import com.comphenix.protocol.PacketType;
 import com.comphenix.protocol.ProtocolLibrary;
@@ -12,13 +12,13 @@
 import net.minecraft.network.protocol.game.ClientboundRemoveEntitiesPacket;
 import org.bukkit.entity.EntityType;
 import org.bukkit.entity.Player;
-import xiamomc.morph.MorphPlugin;
-import xiamomc.morph.MorphPluginObject;
-import xiamomc.morph.backends.server.renderer.network.PacketFactory;
-import xiamomc.morph.backends.server.renderer.network.datawatcher.watchers.types.PlayerWatcher;
-import xiamomc.morph.backends.server.renderer.utilties.WatcherUtils;
-import xiamomc.morph.misc.NmsRecord;
-import xiamomc.morph.utilities.EntityTypeUtils;
+import xyz.nifeather.morph.MorphPlugin;
+import xyz.nifeather.morph.MorphPluginObject;
+import xyz.nifeather.morph.backends.server.renderer.network.PacketFactory;
+import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers.types.PlayerWatcher;
+import xyz.nifeather.morph.backends.server.renderer.utilties.WatcherUtils;
+import xyz.nifeather.morph.misc.NmsRecord;
+import xyz.nifeather.morph.utilities.EntityTypeUtils;
 
 import java.util.List;
 
diff --git a/src/main/java/xiamomc/morph/backends/modelengine/vanish/VanillaVanishSource.java b/src/main/java/xyz/nifeather/morph/backends/modelengine/vanish/VanillaVanishSource.java
similarity index 85%
rename from src/main/java/xiamomc/morph/backends/modelengine/vanish/VanillaVanishSource.java
rename to src/main/java/xyz/nifeather/morph/backends/modelengine/vanish/VanillaVanishSource.java
index 279d181f..563a30af 100644
--- a/src/main/java/xiamomc/morph/backends/modelengine/vanish/VanillaVanishSource.java
+++ b/src/main/java/xyz/nifeather/morph/backends/modelengine/vanish/VanillaVanishSource.java
@@ -1,9 +1,9 @@
-package xiamomc.morph.backends.modelengine.vanish;
+package xyz.nifeather.morph.backends.modelengine.vanish;
 
 import org.bukkit.entity.Player;
 import org.bukkit.potion.PotionEffect;
 import org.bukkit.potion.PotionEffectType;
-import xiamomc.morph.MorphPluginObject;
+import xyz.nifeather.morph.MorphPluginObject;
 
 public class VanillaVanishSource extends MorphPluginObject implements IVanishSource
 {
diff --git a/src/main/java/xiamomc/morph/backends/server/ServerBackend.java b/src/main/java/xyz/nifeather/morph/backends/server/ServerBackend.java
similarity index 95%
rename from src/main/java/xiamomc/morph/backends/server/ServerBackend.java
rename to src/main/java/xyz/nifeather/morph/backends/server/ServerBackend.java
index 43e236cc..482c58df 100644
--- a/src/main/java/xiamomc/morph/backends/server/ServerBackend.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/ServerBackend.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.backends.server;
+package xyz.nifeather.morph.backends.server;
 
 import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
 import net.minecraft.nbt.CompoundTag;
@@ -6,14 +6,14 @@
 import org.bukkit.entity.EntityType;
 import org.bukkit.entity.Player;
 import org.jetbrains.annotations.NotNull;
-import xiamomc.morph.backends.DisguiseBackend;
-import xiamomc.morph.backends.DisguiseWrapper;
-import xiamomc.morph.backends.WrapperEvent;
-import xiamomc.morph.backends.server.renderer.ServerRenderer;
-import xiamomc.morph.backends.server.renderer.network.registries.CustomEntries;
-import xiamomc.morph.messages.BackendStrings;
-import xiamomc.morph.misc.playerList.PlayerListHandler;
-import xiamomc.morph.utilities.NbtUtils;
+import xyz.nifeather.morph.backends.DisguiseBackend;
+import xyz.nifeather.morph.backends.DisguiseWrapper;
+import xyz.nifeather.morph.backends.WrapperEvent;
+import xyz.nifeather.morph.backends.server.renderer.ServerRenderer;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.CustomEntries;
+import xyz.nifeather.morph.messages.BackendStrings;
+import xyz.nifeather.morph.misc.playerList.PlayerListHandler;
+import xyz.nifeather.morph.utilities.NbtUtils;
 import xiamomc.pluginbase.Messages.FormattableMessage;
 
 import javax.annotation.Nullable;
diff --git a/src/main/java/xiamomc/morph/backends/server/ServerDisguise.java b/src/main/java/xyz/nifeather/morph/backends/server/ServerDisguise.java
similarity index 97%
rename from src/main/java/xiamomc/morph/backends/server/ServerDisguise.java
rename to src/main/java/xyz/nifeather/morph/backends/server/ServerDisguise.java
index 1eff24f5..52f976a0 100644
--- a/src/main/java/xiamomc/morph/backends/server/ServerDisguise.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/ServerDisguise.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.backends.server;
+package xyz.nifeather.morph.backends.server;
 
 import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
 import net.minecraft.nbt.CompoundTag;
diff --git a/src/main/java/xiamomc/morph/backends/server/ServerDisguiseWrapper.java b/src/main/java/xyz/nifeather/morph/backends/server/ServerDisguiseWrapper.java
similarity index 90%
rename from src/main/java/xiamomc/morph/backends/server/ServerDisguiseWrapper.java
rename to src/main/java/xyz/nifeather/morph/backends/server/ServerDisguiseWrapper.java
index e227f0cb..cf1b9ca5 100644
--- a/src/main/java/xiamomc/morph/backends/server/ServerDisguiseWrapper.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/ServerDisguiseWrapper.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.backends.server;
+package xyz.nifeather.morph.backends.server;
 
 import com.mojang.authlib.GameProfile;
 import net.minecraft.nbt.CompoundTag;
@@ -11,22 +11,22 @@
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 import org.slf4j.Logger;
-import xiamomc.morph.MorphPlugin;
-import xiamomc.morph.backends.DisguiseWrapper;
-import xiamomc.morph.backends.EventWrapper;
-import xiamomc.morph.backends.WrapperAttribute;
-import xiamomc.morph.backends.WrapperEvent;
-import xiamomc.morph.backends.server.renderer.network.datawatcher.watchers.SingleWatcher;
-import xiamomc.morph.backends.server.renderer.network.datawatcher.watchers.types.AgeableMobWatcher;
-import xiamomc.morph.backends.server.renderer.network.datawatcher.watchers.types.InventoryLivingWatcher;
-import xiamomc.morph.backends.server.renderer.network.registries.CustomEntries;
-import xiamomc.morph.backends.server.renderer.network.registries.ValueIndex;
-import xiamomc.morph.backends.server.renderer.utilties.WatcherUtils;
-import xiamomc.morph.misc.DisguiseEquipment;
-import xiamomc.morph.misc.DisguiseState;
-import xiamomc.morph.misc.playerList.PlayerListHandler;
-import xiamomc.morph.misc.disguiseProperty.SingleProperty;
-import xiamomc.morph.utilities.NbtUtils;
+import xyz.nifeather.morph.MorphPlugin;
+import xyz.nifeather.morph.backends.DisguiseWrapper;
+import xyz.nifeather.morph.backends.EventWrapper;
+import xyz.nifeather.morph.backends.WrapperAttribute;
+import xyz.nifeather.morph.backends.WrapperEvent;
+import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers.SingleWatcher;
+import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers.types.AgeableMobWatcher;
+import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers.types.InventoryLivingWatcher;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.CustomEntries;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.ValueIndex;
+import xyz.nifeather.morph.backends.server.renderer.utilties.WatcherUtils;
+import xyz.nifeather.morph.misc.DisguiseEquipment;
+import xyz.nifeather.morph.misc.DisguiseState;
+import xyz.nifeather.morph.misc.playerList.PlayerListHandler;
+import xyz.nifeather.morph.misc.disguiseProperty.SingleProperty;
+import xyz.nifeather.morph.utilities.NbtUtils;
 
 import java.util.Map;
 import java.util.Objects;
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/ServerRenderer.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/ServerRenderer.java
similarity index 79%
rename from src/main/java/xiamomc/morph/backends/server/renderer/ServerRenderer.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/ServerRenderer.java
index 657287e4..222d527f 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/ServerRenderer.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/ServerRenderer.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.backends.server.renderer;
+package xyz.nifeather.morph.backends.server.renderer;
 
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
 import org.bukkit.Bukkit;
@@ -8,16 +8,16 @@
 import org.bukkit.event.Listener;
 import org.bukkit.event.player.PlayerInteractEvent;
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.MorphPluginObject;
-import xiamomc.morph.backends.server.renderer.network.PacketFactory;
-import xiamomc.morph.backends.server.renderer.network.ProtocolHandler;
-import xiamomc.morph.backends.server.renderer.network.datawatcher.watchers.SingleWatcher;
-import xiamomc.morph.backends.server.renderer.network.datawatcher.watchers.types.LivingEntityWatcher;
-import xiamomc.morph.backends.server.renderer.network.registries.CustomEntries;
-import xiamomc.morph.backends.server.renderer.network.registries.RegisterParameters;
-import xiamomc.morph.backends.server.renderer.network.registries.RenderRegistry;
-import xiamomc.morph.config.ConfigOption;
-import xiamomc.morph.config.MorphConfigManager;
+import xyz.nifeather.morph.MorphPluginObject;
+import xyz.nifeather.morph.backends.server.renderer.network.PacketFactory;
+import xyz.nifeather.morph.backends.server.renderer.network.ProtocolHandler;
+import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers.SingleWatcher;
+import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers.types.LivingEntityWatcher;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.CustomEntries;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.RegisterParameters;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.RenderRegistry;
+import xyz.nifeather.morph.config.ConfigOption;
+import xyz.nifeather.morph.config.MorphConfigManager;
 import xiamomc.pluginbase.Annotations.Initializer;
 import xiamomc.pluginbase.Bindables.Bindable;
 
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/DisplayParameters.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/DisplayParameters.java
similarity index 83%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/DisplayParameters.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/DisplayParameters.java
index ead8a806..83ceb179 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/DisplayParameters.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/DisplayParameters.java
@@ -1,11 +1,10 @@
-package xiamomc.morph.backends.server.renderer.network;
+package xyz.nifeather.morph.backends.server.renderer.network;
 
 import com.mojang.authlib.GameProfile;
 import org.bukkit.entity.EntityType;
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.backends.server.renderer.network.datawatcher.watchers.SingleWatcher;
-import xiamomc.morph.backends.server.renderer.network.datawatcher.watchers.types.PlayerWatcher;
-import xiamomc.morph.backends.server.renderer.network.registries.CustomEntries;
+import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers.SingleWatcher;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.CustomEntries;
 
 public class DisplayParameters
 {
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/PacketFactory.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/PacketFactory.java
similarity index 94%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/PacketFactory.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/PacketFactory.java
index c3ce8e6d..cdeee67e 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/PacketFactory.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/PacketFactory.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.backends.server.renderer.network;
+package xyz.nifeather.morph.backends.server.renderer.network;
 
 import com.comphenix.protocol.PacketType;
 import com.comphenix.protocol.events.PacketContainer;
@@ -12,20 +12,19 @@
 import net.minecraft.network.protocol.game.*;
 import net.minecraft.world.entity.ai.attributes.AttributeInstance;
 import net.minecraft.world.level.GameType;
-import org.bukkit.Bukkit;
 import org.bukkit.craftbukkit.entity.CraftEntity;
 import org.bukkit.entity.EntityType;
 import org.bukkit.entity.Player;
 import org.bukkit.inventory.EntityEquipment;
-import xiamomc.morph.MorphPluginObject;
-import xiamomc.morph.backends.server.renderer.network.datawatcher.values.AbstractValues;
-import xiamomc.morph.backends.server.renderer.network.datawatcher.watchers.SingleWatcher;
-import xiamomc.morph.backends.server.renderer.network.registries.CustomEntries;
-import xiamomc.morph.backends.server.renderer.utilties.ProtocolRegistryUtils;
-import xiamomc.morph.misc.DisguiseEquipment;
-import xiamomc.morph.misc.NmsRecord;
-import xiamomc.morph.utilities.EntityTypeUtils;
-import xiamomc.morph.utilities.NmsUtils;
+import xyz.nifeather.morph.MorphPluginObject;
+import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values.AbstractValues;
+import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers.SingleWatcher;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.CustomEntries;
+import xyz.nifeather.morph.backends.server.renderer.utilties.ProtocolRegistryUtils;
+import xyz.nifeather.morph.misc.DisguiseEquipment;
+import xyz.nifeather.morph.misc.NmsRecord;
+import xyz.nifeather.morph.utilities.EntityTypeUtils;
+import xyz.nifeather.morph.utilities.NmsUtils;
 
 import java.util.*;
 import java.util.concurrent.TimeUnit;
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/ProtocolEquipment.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/ProtocolEquipment.java
similarity index 93%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/ProtocolEquipment.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/ProtocolEquipment.java
index a5c28c2a..b38b4dad 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/ProtocolEquipment.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/ProtocolEquipment.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.backends.server.renderer.network;
+package xyz.nifeather.morph.backends.server.renderer.network;
 
 import com.mojang.datafixers.util.Pair;
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
@@ -7,8 +7,8 @@
 import org.bukkit.Material;
 import org.bukkit.craftbukkit.inventory.CraftInventoryPlayer;
 import org.bukkit.inventory.EntityEquipment;
-import xiamomc.morph.MorphPlugin;
-import xiamomc.morph.utilities.ItemUtils;
+import xyz.nifeather.morph.MorphPlugin;
+import xyz.nifeather.morph.utilities.ItemUtils;
 
 public class ProtocolEquipment
 {
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/ProtocolHandler.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/ProtocolHandler.java
similarity index 93%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/ProtocolHandler.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/ProtocolHandler.java
index cbc7494e..28ca7998 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/ProtocolHandler.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/ProtocolHandler.java
@@ -1,10 +1,12 @@
-package xiamomc.morph.backends.server.renderer.network;
+package xyz.nifeather.morph.backends.server.renderer.network;
 
 import com.comphenix.protocol.ProtocolLibrary;
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
-import xiamomc.morph.MorphPluginObject;
+import xyz.nifeather.morph.MorphPluginObject;
 import xiamomc.morph.backends.server.renderer.network.listeners.*;
 import xiamomc.pluginbase.Annotations.Initializer;
+import xyz.nifeather.morph.backends.server.renderer.network.listeners.*;
+import xyz.nifeather.morph.morph.backends.server.renderer.network.listeners.*;
 
 import java.util.List;
 
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/TestPacketListener.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/TestPacketListener.java
similarity index 95%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/TestPacketListener.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/TestPacketListener.java
index 1f1e793e..0a8b7eab 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/TestPacketListener.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/TestPacketListener.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.backends.server.renderer.network;
+package xyz.nifeather.morph.backends.server.renderer.network;
 
 import com.comphenix.protocol.PacketType;
 import com.comphenix.protocol.events.ListeningWhitelist;
@@ -7,8 +7,8 @@
 import com.comphenix.protocol.injector.GamePhase;
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
 import org.bukkit.plugin.Plugin;
-import xiamomc.morph.MorphPlugin;
-import xiamomc.morph.MorphPluginObject;
+import xyz.nifeather.morph.MorphPlugin;
+import xyz.nifeather.morph.MorphPluginObject;
 import xiamomc.pluginbase.Annotations.Initializer;
 
 public class TestPacketListener extends MorphPluginObject implements PacketListener
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/AbstractValues.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/AbstractValues.java
similarity index 87%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/AbstractValues.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/AbstractValues.java
index 3db463df..15bd50a9 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/AbstractValues.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/AbstractValues.java
@@ -1,9 +1,9 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.values;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values;
 
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
 import org.slf4j.Logger;
-import xiamomc.morph.MorphPlugin;
-import xiamomc.morph.backends.server.renderer.utilties.ProtocolRegistryUtils;
+import xyz.nifeather.morph.MorphPlugin;
+import xyz.nifeather.morph.backends.server.renderer.utilties.ProtocolRegistryUtils;
 
 import java.util.List;
 
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/AllayValues.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/AllayValues.java
similarity index 79%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/AllayValues.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/AllayValues.java
index 9ac4df3a..fbe74131 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/AllayValues.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/AllayValues.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.values;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values;
 
 public class AllayValues extends MobValues
 {
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/ArmadilloValues.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/ArmadilloValues.java
similarity index 71%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/ArmadilloValues.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/ArmadilloValues.java
index 6e4dd8c0..8d5a9baa 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/ArmadilloValues.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/ArmadilloValues.java
@@ -1,8 +1,8 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.values;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values;
 
 import com.comphenix.protocol.wrappers.WrappedDataWatcher;
 import net.minecraft.world.entity.animal.armadillo.Armadillo;
-import xiamomc.morph.backends.server.renderer.network.datawatcher.values.basetypes.AnimalValues;
+import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values.basetypes.AnimalValues;
 
 public class ArmadilloValues extends AnimalValues
 {
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/ArmorStandValues.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/ArmorStandValues.java
similarity index 86%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/ArmorStandValues.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/ArmorStandValues.java
index 8c255af9..073090f1 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/ArmorStandValues.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/ArmorStandValues.java
@@ -1,7 +1,7 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.values;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values;
 
 import net.minecraft.core.Rotations;
-import xiamomc.morph.backends.server.renderer.network.datawatcher.values.basetypes.LivingEntityValues;
+import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values.basetypes.LivingEntityValues;
 
 public class ArmorStandValues extends LivingEntityValues
 {
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/AxolotlValues.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/AxolotlValues.java
similarity index 72%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/AxolotlValues.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/AxolotlValues.java
index 05b79259..fb75c0e2 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/AxolotlValues.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/AxolotlValues.java
@@ -1,6 +1,6 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.values;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values;
 
-import xiamomc.morph.backends.server.renderer.network.datawatcher.values.basetypes.AnimalValues;
+import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values.basetypes.AnimalValues;
 
 public class AxolotlValues extends AnimalValues
 {
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/CatValues.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/CatValues.java
similarity index 81%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/CatValues.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/CatValues.java
index 06f50d20..bb538953 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/CatValues.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/CatValues.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.values;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values;
 
 import com.comphenix.protocol.wrappers.WrappedDataWatcher;
 import net.minecraft.core.Holder;
@@ -6,8 +6,8 @@
 import net.minecraft.network.syncher.EntityDataSerializers;
 import net.minecraft.resources.ResourceKey;
 import net.minecraft.world.entity.animal.CatVariant;
-import xiamomc.morph.backends.server.renderer.network.datawatcher.values.basetypes.TameableAnimalValues;
-import xiamomc.morph.backends.server.renderer.utilties.HolderUtils;
+import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values.basetypes.TameableAnimalValues;
+import xyz.nifeather.morph.backends.server.renderer.utilties.HolderUtils;
 
 public class CatValues extends TameableAnimalValues
 {
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/CreeperValues.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/CreeperValues.java
similarity index 85%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/CreeperValues.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/CreeperValues.java
index 3dbdfa92..6355e134 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/CreeperValues.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/CreeperValues.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.values;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values;
 
 public class CreeperValues extends MonsterValues
 {
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/FoxValues.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/FoxValues.java
similarity index 75%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/FoxValues.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/FoxValues.java
index cb5d716f..e63ca2d3 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/FoxValues.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/FoxValues.java
@@ -1,6 +1,6 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.values;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values;
 
-import xiamomc.morph.backends.server.renderer.network.datawatcher.values.basetypes.AnimalValues;
+import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values.basetypes.AnimalValues;
 
 import java.util.UUID;
 
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/FrogValues.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/FrogValues.java
similarity index 79%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/FrogValues.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/FrogValues.java
index 97c02d2f..584c4ad3 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/FrogValues.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/FrogValues.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.values;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values;
 
 import com.comphenix.protocol.wrappers.WrappedDataWatcher;
 import net.minecraft.core.Holder;
@@ -6,8 +6,8 @@
 import net.minecraft.network.syncher.EntityDataSerializers;
 import net.minecraft.resources.ResourceKey;
 import net.minecraft.world.entity.animal.FrogVariant;
-import xiamomc.morph.backends.server.renderer.network.datawatcher.values.basetypes.AnimalValues;
-import xiamomc.morph.backends.server.renderer.utilties.HolderUtils;
+import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values.basetypes.AnimalValues;
+import xyz.nifeather.morph.backends.server.renderer.utilties.HolderUtils;
 
 public class FrogValues extends AnimalValues
 {
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/GhastValues.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/GhastValues.java
similarity index 73%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/GhastValues.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/GhastValues.java
index 9210e746..2e38496f 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/GhastValues.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/GhastValues.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.values;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values;
 
 public class GhastValues extends MobValues
 {
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/GoatValues.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/GoatValues.java
similarity index 71%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/GoatValues.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/GoatValues.java
index 0eae411c..83bd35a1 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/GoatValues.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/GoatValues.java
@@ -1,6 +1,6 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.values;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values;
 
-import xiamomc.morph.backends.server.renderer.network.datawatcher.values.basetypes.AnimalValues;
+import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values.basetypes.AnimalValues;
 
 public class GoatValues extends AnimalValues
 {
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/GuardianValues.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/GuardianValues.java
similarity index 82%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/GuardianValues.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/GuardianValues.java
index e6e38f55..dd786d6b 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/GuardianValues.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/GuardianValues.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.values;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values;
 
 public class GuardianValues extends MonsterValues
 {
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/HorseValues.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/HorseValues.java
similarity index 55%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/HorseValues.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/HorseValues.java
index 1e7786c7..5d170b08 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/HorseValues.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/HorseValues.java
@@ -1,6 +1,6 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.values;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values;
 
-import xiamomc.morph.backends.server.renderer.network.datawatcher.values.basetypes.AbstractHorseValues;
+import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values.basetypes.AbstractHorseValues;
 
 public class HorseValues extends AbstractHorseValues
 {
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/LlamaValues.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/LlamaValues.java
similarity index 63%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/LlamaValues.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/LlamaValues.java
index 2afedbe2..ea4e2804 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/LlamaValues.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/LlamaValues.java
@@ -1,6 +1,6 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.values;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values;
 
-import xiamomc.morph.backends.server.renderer.network.datawatcher.values.basetypes.ChestedHorseValues;
+import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values.basetypes.ChestedHorseValues;
 
 public class LlamaValues extends ChestedHorseValues
 {
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/MobValues.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/MobValues.java
similarity index 55%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/MobValues.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/MobValues.java
index 698ccba0..eb65b931 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/MobValues.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/MobValues.java
@@ -1,6 +1,6 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.values;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values;
 
-import xiamomc.morph.backends.server.renderer.network.datawatcher.values.basetypes.LivingEntityValues;
+import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values.basetypes.LivingEntityValues;
 
 public class MobValues extends LivingEntityValues
 {
diff --git a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/MonsterValues.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/MonsterValues.java
new file mode 100644
index 00000000..235a4a5e
--- /dev/null
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/MonsterValues.java
@@ -0,0 +1,5 @@
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values;
+
+public class MonsterValues extends MobValues
+{
+}
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/MooshroomValues.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/MooshroomValues.java
similarity index 66%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/MooshroomValues.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/MooshroomValues.java
index bf5e814c..8ce30051 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/MooshroomValues.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/MooshroomValues.java
@@ -1,6 +1,6 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.values;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values;
 
-import xiamomc.morph.backends.server.renderer.network.datawatcher.values.basetypes.AnimalValues;
+import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values.basetypes.AnimalValues;
 
 public class MooshroomValues extends AnimalValues
 {
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/PandaValues.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/PandaValues.java
similarity index 80%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/PandaValues.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/PandaValues.java
index fb5b75a1..0ef93324 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/PandaValues.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/PandaValues.java
@@ -1,6 +1,6 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.values;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values;
 
-import xiamomc.morph.backends.server.renderer.network.datawatcher.values.basetypes.AnimalValues;
+import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values.basetypes.AnimalValues;
 
 public class PandaValues extends AnimalValues
 {
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/ParrotValues.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/ParrotValues.java
similarity index 58%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/ParrotValues.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/ParrotValues.java
index 41fc9140..620e362c 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/ParrotValues.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/ParrotValues.java
@@ -1,6 +1,6 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.values;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values;
 
-import xiamomc.morph.backends.server.renderer.network.datawatcher.values.basetypes.TameableAnimalValues;
+import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values.basetypes.TameableAnimalValues;
 
 public class ParrotValues extends TameableAnimalValues
 {
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/PhantomValues.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/PhantomValues.java
similarity index 72%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/PhantomValues.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/PhantomValues.java
index f394986c..b42a5ac0 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/PhantomValues.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/PhantomValues.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.values;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values;
 
 public class PhantomValues extends MobValues
 {
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/PiglinValues.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/PiglinValues.java
similarity index 70%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/PiglinValues.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/PiglinValues.java
index 57795383..1eb2dc3e 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/PiglinValues.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/PiglinValues.java
@@ -1,6 +1,6 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.values;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values;
 
-import xiamomc.morph.backends.server.renderer.network.datawatcher.values.basetypes.BasePiglinValues;
+import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values.basetypes.BasePiglinValues;
 
 public class PiglinValues extends BasePiglinValues
 {
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/PlayerValues.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/PlayerValues.java
similarity index 82%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/PlayerValues.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/PlayerValues.java
index 8f5d8faf..918d828d 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/PlayerValues.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/PlayerValues.java
@@ -1,7 +1,7 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.values;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values;
 
 import net.minecraft.nbt.CompoundTag;
-import xiamomc.morph.backends.server.renderer.network.datawatcher.values.basetypes.LivingEntityValues;
+import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values.basetypes.LivingEntityValues;
 
 public class PlayerValues extends LivingEntityValues
 {
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/PufferfishValues.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/PufferfishValues.java
similarity index 68%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/PufferfishValues.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/PufferfishValues.java
index 098b87ed..8093a593 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/PufferfishValues.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/PufferfishValues.java
@@ -1,6 +1,6 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.values;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values;
 
-import xiamomc.morph.backends.server.renderer.network.datawatcher.values.basetypes.AbstractFishValues;
+import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values.basetypes.AbstractFishValues;
 
 public class PufferfishValues extends AbstractFishValues
 {
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/RabbitValues.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/RabbitValues.java
similarity index 55%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/RabbitValues.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/RabbitValues.java
index 4727f8a9..1bae6f65 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/RabbitValues.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/RabbitValues.java
@@ -1,6 +1,6 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.values;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values;
 
-import xiamomc.morph.backends.server.renderer.network.datawatcher.values.basetypes.AnimalValues;
+import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values.basetypes.AnimalValues;
 
 public class RabbitValues extends AnimalValues
 {
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/SheepValues.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/SheepValues.java
similarity index 55%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/SheepValues.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/SheepValues.java
index 89ee824b..54585e88 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/SheepValues.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/SheepValues.java
@@ -1,6 +1,6 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.values;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values;
 
-import xiamomc.morph.backends.server.renderer.network.datawatcher.values.basetypes.AnimalValues;
+import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values.basetypes.AnimalValues;
 
 public class SheepValues extends AnimalValues
 {
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/ShulkerValues.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/ShulkerValues.java
similarity index 85%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/ShulkerValues.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/ShulkerValues.java
index e89aeb59..458bec78 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/ShulkerValues.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/ShulkerValues.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.values;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values;
 
 import net.minecraft.core.Direction;
 
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/SingleValue.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/SingleValue.java
similarity index 97%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/SingleValue.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/SingleValue.java
index 26762647..2f0acc5f 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/SingleValue.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/SingleValue.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.values;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values;
 
 import com.comphenix.protocol.wrappers.WrappedDataWatcher;
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/SlimeValues.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/SlimeValues.java
similarity index 72%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/SlimeValues.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/SlimeValues.java
index 975298cd..b3728561 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/SlimeValues.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/SlimeValues.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.values;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values;
 
 public class SlimeValues extends MobValues
 {
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/SnifferValues.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/SnifferValues.java
similarity index 69%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/SnifferValues.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/SnifferValues.java
index 5dc41c5f..5efed4fd 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/SnifferValues.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/SnifferValues.java
@@ -1,7 +1,7 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.values;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values;
 
 import net.minecraft.world.entity.animal.sniffer.Sniffer;
-import xiamomc.morph.backends.server.renderer.network.datawatcher.values.basetypes.AnimalValues;
+import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values.basetypes.AnimalValues;
 
 public class SnifferValues extends AnimalValues
 {
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/SnowGolemValues.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/SnowGolemValues.java
similarity index 66%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/SnowGolemValues.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/SnowGolemValues.java
index 7e8143ab..df1a8fec 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/SnowGolemValues.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/SnowGolemValues.java
@@ -1,6 +1,6 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.values;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values;
 
-import xiamomc.morph.backends.server.renderer.network.datawatcher.values.basetypes.AbstractGolemValues;
+import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values.basetypes.AbstractGolemValues;
 
 public class SnowGolemValues extends AbstractGolemValues
 {
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/TropicalFishValues.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/TropicalFishValues.java
similarity index 57%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/TropicalFishValues.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/TropicalFishValues.java
index 0ef41d98..25b3171e 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/TropicalFishValues.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/TropicalFishValues.java
@@ -1,6 +1,6 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.values;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values;
 
-import xiamomc.morph.backends.server.renderer.network.datawatcher.values.basetypes.AbstractFishValues;
+import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values.basetypes.AbstractFishValues;
 
 public class TropicalFishValues extends AbstractFishValues
 {
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/VillagerValues.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/VillagerValues.java
similarity index 71%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/VillagerValues.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/VillagerValues.java
index 2c8c3414..26e10038 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/VillagerValues.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/VillagerValues.java
@@ -1,9 +1,9 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.values;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values;
 
 import net.minecraft.world.entity.npc.VillagerData;
 import net.minecraft.world.entity.npc.VillagerProfession;
 import net.minecraft.world.entity.npc.VillagerType;
-import xiamomc.morph.backends.server.renderer.network.datawatcher.values.basetypes.AbstractVillagerValues;
+import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values.basetypes.AbstractVillagerValues;
 
 public class VillagerValues extends AbstractVillagerValues
 {
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/WolfValues.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/WolfValues.java
similarity index 89%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/WolfValues.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/WolfValues.java
index 3151e119..984edae0 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/WolfValues.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/WolfValues.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.values;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values;
 
 import com.comphenix.protocol.wrappers.WrappedDataWatcher;
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
@@ -9,8 +9,8 @@
 import net.minecraft.world.entity.animal.WolfVariant;
 import net.minecraft.world.entity.animal.WolfVariants;
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.backends.server.renderer.network.datawatcher.values.basetypes.TameableAnimalValues;
-import xiamomc.morph.backends.server.renderer.utilties.HolderUtils;
+import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values.basetypes.TameableAnimalValues;
+import xyz.nifeather.morph.backends.server.renderer.utilties.HolderUtils;
 
 public class WolfValues extends TameableAnimalValues
 {
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/ZoglinValues.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/ZoglinValues.java
similarity index 73%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/ZoglinValues.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/ZoglinValues.java
index cb3dceb2..ce3841bd 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/ZoglinValues.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/ZoglinValues.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.values;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values;
 
 public class ZoglinValues extends MonsterValues
 {
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/ZombieValues.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/ZombieValues.java
similarity index 84%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/ZombieValues.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/ZombieValues.java
index bb191056..469d8d7a 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/ZombieValues.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/ZombieValues.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.values;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values;
 
 public class ZombieValues extends MonsterValues
 {
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/ZombieVillagerValues.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/ZombieVillagerValues.java
similarity index 87%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/ZombieVillagerValues.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/ZombieVillagerValues.java
index 47c75528..9f8f6819 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/ZombieVillagerValues.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/ZombieVillagerValues.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.values;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values;
 
 import net.minecraft.world.entity.npc.VillagerData;
 import net.minecraft.world.entity.npc.VillagerProfession;
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/basetypes/AbstractFishValues.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/basetypes/AbstractFishValues.java
similarity index 58%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/basetypes/AbstractFishValues.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/basetypes/AbstractFishValues.java
index 401999f8..3b23412d 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/basetypes/AbstractFishValues.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/basetypes/AbstractFishValues.java
@@ -1,6 +1,6 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.values.basetypes;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values.basetypes;
 
-import xiamomc.morph.backends.server.renderer.network.datawatcher.values.SingleValue;
+import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values.SingleValue;
 
 public class AbstractFishValues extends WaterAnimalValues
 {
diff --git a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/basetypes/AbstractGolemValues.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/basetypes/AbstractGolemValues.java
new file mode 100644
index 00000000..8b960d2f
--- /dev/null
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/basetypes/AbstractGolemValues.java
@@ -0,0 +1,7 @@
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values.basetypes;
+
+import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values.MobValues;
+
+public class AbstractGolemValues extends MobValues
+{
+}
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/basetypes/AbstractHorseValues.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/basetypes/AbstractHorseValues.java
similarity index 57%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/basetypes/AbstractHorseValues.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/basetypes/AbstractHorseValues.java
index ef7236b7..72a9ec4e 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/basetypes/AbstractHorseValues.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/basetypes/AbstractHorseValues.java
@@ -1,6 +1,6 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.values.basetypes;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values.basetypes;
 
-import xiamomc.morph.backends.server.renderer.network.datawatcher.values.SingleValue;
+import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values.SingleValue;
 
 public class AbstractHorseValues extends AgeableMobValues
 {
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/basetypes/AbstractVillagerValues.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/basetypes/AbstractVillagerValues.java
similarity index 60%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/basetypes/AbstractVillagerValues.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/basetypes/AbstractVillagerValues.java
index b0e2f3b0..9ce0e324 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/basetypes/AbstractVillagerValues.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/basetypes/AbstractVillagerValues.java
@@ -1,6 +1,6 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.values.basetypes;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values.basetypes;
 
-import xiamomc.morph.backends.server.renderer.network.datawatcher.values.SingleValue;
+import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values.SingleValue;
 
 public class AbstractVillagerValues extends AgeableMobValues
 {
diff --git a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/basetypes/AgeableMobValues.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/basetypes/AgeableMobValues.java
new file mode 100644
index 00000000..b49f487a
--- /dev/null
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/basetypes/AgeableMobValues.java
@@ -0,0 +1,16 @@
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values.basetypes;
+
+import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values.MobValues;
+import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values.SingleValue;
+
+public class AgeableMobValues extends MobValues
+{
+    public final SingleValue<Boolean> IS_BABY = createSingle("ageable_mob_is_baby", false);
+
+    public AgeableMobValues()
+    {
+        super();
+
+        registerSingle(IS_BABY);
+    }
+}
diff --git a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/basetypes/AnimalValues.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/basetypes/AnimalValues.java
new file mode 100644
index 00000000..fe4d41f3
--- /dev/null
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/basetypes/AnimalValues.java
@@ -0,0 +1,5 @@
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values.basetypes;
+
+public class AnimalValues extends AgeableMobValues
+{
+}
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/basetypes/BasePiglinValues.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/basetypes/BasePiglinValues.java
similarity index 50%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/basetypes/BasePiglinValues.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/basetypes/BasePiglinValues.java
index ee68e767..889bc718 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/basetypes/BasePiglinValues.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/basetypes/BasePiglinValues.java
@@ -1,7 +1,7 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.values.basetypes;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values.basetypes;
 
-import xiamomc.morph.backends.server.renderer.network.datawatcher.values.MonsterValues;
-import xiamomc.morph.backends.server.renderer.network.datawatcher.values.SingleValue;
+import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values.MonsterValues;
+import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values.SingleValue;
 
 public class BasePiglinValues extends MonsterValues
 {
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/basetypes/ChestedHorseValues.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/basetypes/ChestedHorseValues.java
similarity index 58%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/basetypes/ChestedHorseValues.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/basetypes/ChestedHorseValues.java
index 2be94e76..366ab5bd 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/basetypes/ChestedHorseValues.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/basetypes/ChestedHorseValues.java
@@ -1,6 +1,6 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.values.basetypes;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values.basetypes;
 
-import xiamomc.morph.backends.server.renderer.network.datawatcher.values.SingleValue;
+import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values.SingleValue;
 
 public class ChestedHorseValues extends AbstractHorseValues
 {
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/basetypes/EntityValues.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/basetypes/EntityValues.java
similarity index 82%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/basetypes/EntityValues.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/basetypes/EntityValues.java
index 15f5ae36..b89ba8a3 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/basetypes/EntityValues.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/basetypes/EntityValues.java
@@ -1,10 +1,10 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.values.basetypes;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values.basetypes;
 
 import com.comphenix.protocol.wrappers.WrappedDataWatcher;
 import net.minecraft.network.chat.Component;
 import net.minecraft.world.entity.Pose;
-import xiamomc.morph.backends.server.renderer.network.datawatcher.values.AbstractValues;
-import xiamomc.morph.backends.server.renderer.network.datawatcher.values.SingleValue;
+import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values.AbstractValues;
+import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values.SingleValue;
 
 import java.util.Optional;
 
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/basetypes/LivingEntityValues.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/basetypes/LivingEntityValues.java
similarity index 88%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/basetypes/LivingEntityValues.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/basetypes/LivingEntityValues.java
index 01047e1b..d9879a3e 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/basetypes/LivingEntityValues.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/basetypes/LivingEntityValues.java
@@ -1,10 +1,10 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.values.basetypes;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values.basetypes;
 
 import com.comphenix.protocol.wrappers.WrappedDataWatcher;
 import net.minecraft.core.BlockPos;
 import net.minecraft.core.particles.ParticleOptions;
 import net.minecraft.network.syncher.EntityDataSerializers;
-import xiamomc.morph.backends.server.renderer.network.datawatcher.values.SingleValue;
+import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values.SingleValue;
 
 import java.util.List;
 import java.util.Optional;
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/basetypes/TameableAnimalValues.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/basetypes/TameableAnimalValues.java
similarity index 71%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/basetypes/TameableAnimalValues.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/basetypes/TameableAnimalValues.java
index ed37889b..96333dc5 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/values/basetypes/TameableAnimalValues.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/basetypes/TameableAnimalValues.java
@@ -1,7 +1,7 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.values.basetypes;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values.basetypes;
 
 import net.minecraft.Util;
-import xiamomc.morph.backends.server.renderer.network.datawatcher.values.SingleValue;
+import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values.SingleValue;
 
 import java.util.Optional;
 import java.util.UUID;
diff --git a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/basetypes/WaterAnimalValues.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/basetypes/WaterAnimalValues.java
new file mode 100644
index 00000000..47b0af5d
--- /dev/null
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/basetypes/WaterAnimalValues.java
@@ -0,0 +1,7 @@
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values.basetypes;
+
+import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values.MobValues;
+
+public class WaterAnimalValues extends MobValues
+{
+}
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/SingleWatcher.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/SingleWatcher.java
similarity index 95%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/SingleWatcher.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/SingleWatcher.java
index 809b6c4b..16cc07e9 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/SingleWatcher.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/SingleWatcher.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.watchers;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers;
 
 import com.comphenix.protocol.ProtocolLibrary;
 import com.comphenix.protocol.events.PacketContainer;
@@ -10,15 +10,14 @@
 import org.bukkit.entity.Player;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.MorphPluginObject;
-import xiamomc.morph.backends.server.renderer.network.PacketFactory;
-import xiamomc.morph.backends.server.renderer.network.datawatcher.values.AbstractValues;
-import xiamomc.morph.backends.server.renderer.network.datawatcher.values.SingleValue;
-import xiamomc.morph.backends.server.renderer.network.registries.CustomEntries;
-import xiamomc.morph.backends.server.renderer.network.registries.RegistryKey;
-import xiamomc.morph.backends.server.renderer.network.registries.RenderRegistry;
-import xiamomc.morph.backends.server.renderer.utilties.WatcherUtils;
-import xiamomc.morph.misc.disguiseProperty.SingleProperty;
+import xyz.nifeather.morph.MorphPluginObject;
+import xyz.nifeather.morph.backends.server.renderer.network.PacketFactory;
+import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values.AbstractValues;
+import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values.SingleValue;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.RegistryKey;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.RenderRegistry;
+import xyz.nifeather.morph.backends.server.renderer.utilties.WatcherUtils;
+import xyz.nifeather.morph.misc.disguiseProperty.SingleProperty;
 import xiamomc.pluginbase.Annotations.Initializer;
 import xiamomc.pluginbase.Annotations.Resolved;
 import xiamomc.pluginbase.Exceptions.NullDependencyException;
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/AgeableMobWatcher.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/AgeableMobWatcher.java
similarity index 69%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/AgeableMobWatcher.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/AgeableMobWatcher.java
index 51de4172..198c3360 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/AgeableMobWatcher.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/AgeableMobWatcher.java
@@ -1,8 +1,8 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.watchers.types;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers.types;
 
 import org.bukkit.entity.EntityType;
 import org.bukkit.entity.Player;
-import xiamomc.morph.backends.server.renderer.network.registries.ValueIndex;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.ValueIndex;
 
 public class AgeableMobWatcher extends LivingEntityWatcher
 {
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/AllayWatcher.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/AllayWatcher.java
similarity index 71%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/AllayWatcher.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/AllayWatcher.java
index 66591f7a..4f9eb623 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/AllayWatcher.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/AllayWatcher.java
@@ -1,11 +1,11 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.watchers.types;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers.types;
 
 import org.bukkit.entity.EntityType;
 import org.bukkit.entity.Player;
-import xiamomc.morph.backends.server.renderer.network.registries.CustomEntries;
-import xiamomc.morph.backends.server.renderer.network.registries.RegistryKey;
-import xiamomc.morph.backends.server.renderer.network.registries.ValueIndex;
-import xiamomc.morph.misc.AnimationNames;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.CustomEntries;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.RegistryKey;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.ValueIndex;
+import xyz.nifeather.morph.misc.AnimationNames;
 
 public class AllayWatcher extends LivingEntityWatcher
 {
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/ArmadilloWatcher.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/ArmadilloWatcher.java
similarity index 84%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/ArmadilloWatcher.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/ArmadilloWatcher.java
index a5cb9419..39c72499 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/ArmadilloWatcher.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/ArmadilloWatcher.java
@@ -1,13 +1,13 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.watchers.types;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers.types;
 
 import net.minecraft.world.entity.animal.armadillo.Armadillo;
 import org.bukkit.Sound;
 import org.bukkit.entity.EntityType;
 import org.bukkit.entity.Player;
-import xiamomc.morph.backends.server.renderer.network.registries.CustomEntries;
-import xiamomc.morph.backends.server.renderer.network.registries.RegistryKey;
-import xiamomc.morph.backends.server.renderer.network.registries.ValueIndex;
-import xiamomc.morph.misc.AnimationNames;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.CustomEntries;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.RegistryKey;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.ValueIndex;
+import xyz.nifeather.morph.misc.AnimationNames;
 
 public class ArmadilloWatcher extends LivingEntityWatcher
 {
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/ArmorStandWatcher.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/ArmorStandWatcher.java
similarity index 93%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/ArmorStandWatcher.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/ArmorStandWatcher.java
index 95a9703c..87c4a432 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/ArmorStandWatcher.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/ArmorStandWatcher.java
@@ -1,15 +1,14 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.watchers.types;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers.types;
 
 import net.minecraft.core.Rotations;
 import net.minecraft.nbt.CompoundTag;
 import net.minecraft.nbt.ListTag;
 import org.bukkit.entity.EntityType;
 import org.bukkit.entity.Player;
-import xiamomc.morph.backends.server.renderer.network.registries.ValueIndex;
-import xiamomc.morph.misc.disguiseProperty.DisguiseProperties;
-import xiamomc.morph.misc.disguiseProperty.SingleProperty;
-import xiamomc.morph.misc.disguiseProperty.values.ArmorStandProperties;
-import xiamomc.morph.misc.disguiseProperty.values.AxolotlProperties;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.ValueIndex;
+import xyz.nifeather.morph.misc.disguiseProperty.DisguiseProperties;
+import xyz.nifeather.morph.misc.disguiseProperty.SingleProperty;
+import xyz.nifeather.morph.misc.disguiseProperty.values.ArmorStandProperties;
 
 public class ArmorStandWatcher extends InventoryLivingWatcher
 {
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/AxolotlWatcher.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/AxolotlWatcher.java
similarity index 80%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/AxolotlWatcher.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/AxolotlWatcher.java
index 9cf90d04..0d76d8e1 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/AxolotlWatcher.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/AxolotlWatcher.java
@@ -1,13 +1,13 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.watchers.types;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers.types;
 
 import net.minecraft.nbt.CompoundTag;
 import org.bukkit.entity.Axolotl;
 import org.bukkit.entity.EntityType;
 import org.bukkit.entity.Player;
-import xiamomc.morph.backends.server.renderer.network.registries.ValueIndex;
-import xiamomc.morph.misc.disguiseProperty.DisguiseProperties;
-import xiamomc.morph.misc.disguiseProperty.SingleProperty;
-import xiamomc.morph.misc.disguiseProperty.values.AxolotlProperties;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.ValueIndex;
+import xyz.nifeather.morph.misc.disguiseProperty.DisguiseProperties;
+import xyz.nifeather.morph.misc.disguiseProperty.SingleProperty;
+import xyz.nifeather.morph.misc.disguiseProperty.values.AxolotlProperties;
 
 public class AxolotlWatcher extends LivingEntityWatcher
 {
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/CatWatcher.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/CatWatcher.java
similarity index 89%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/CatWatcher.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/CatWatcher.java
index 0f28f2d7..420cd4d0 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/CatWatcher.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/CatWatcher.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.watchers.types;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers.types;
 
 import net.kyori.adventure.key.Key;
 import net.minecraft.core.Holder;
@@ -14,15 +14,13 @@
 import org.bukkit.entity.Cat;
 import org.bukkit.entity.EntityType;
 import org.bukkit.entity.Player;
-import xiamomc.morph.backends.server.renderer.network.registries.CustomEntries;
-import xiamomc.morph.backends.server.renderer.network.registries.RegistryKey;
-import xiamomc.morph.backends.server.renderer.network.registries.ValueIndex;
-import xiamomc.morph.misc.AnimationNames;
-import xiamomc.morph.misc.disguiseProperty.DisguiseProperties;
-import xiamomc.morph.misc.disguiseProperty.SingleProperty;
-import xiamomc.morph.misc.disguiseProperty.values.CatProperties;
-
-import java.util.Arrays;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.CustomEntries;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.RegistryKey;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.ValueIndex;
+import xyz.nifeather.morph.misc.AnimationNames;
+import xyz.nifeather.morph.misc.disguiseProperty.DisguiseProperties;
+import xyz.nifeather.morph.misc.disguiseProperty.SingleProperty;
+import xyz.nifeather.morph.misc.disguiseProperty.values.CatProperties;
 
 public class CatWatcher extends TameableAnimalWatcher
 {
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/CreeperWatcher.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/CreeperWatcher.java
similarity index 83%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/CreeperWatcher.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/CreeperWatcher.java
index aca94c3b..1684f46a 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/CreeperWatcher.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/CreeperWatcher.java
@@ -1,9 +1,9 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.watchers.types;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers.types;
 
 import net.minecraft.nbt.CompoundTag;
 import org.bukkit.entity.EntityType;
 import org.bukkit.entity.Player;
-import xiamomc.morph.backends.server.renderer.network.registries.ValueIndex;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.ValueIndex;
 
 public class CreeperWatcher extends LivingEntityWatcher
 {
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/DonkeyWatcher.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/DonkeyWatcher.java
similarity index 53%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/DonkeyWatcher.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/DonkeyWatcher.java
index a45fccf6..e3a48e84 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/DonkeyWatcher.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/DonkeyWatcher.java
@@ -1,8 +1,8 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.watchers.types;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers.types;
 
 import org.bukkit.entity.EntityType;
 import org.bukkit.entity.Player;
-import xiamomc.morph.backends.server.renderer.network.datawatcher.watchers.types.horses.ChestedHorseWatcher;
+import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers.types.horses.ChestedHorseWatcher;
 
 public class DonkeyWatcher extends ChestedHorseWatcher
 {
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/EHasAttackAnimationWatcher.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/EHasAttackAnimationWatcher.java
similarity index 77%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/EHasAttackAnimationWatcher.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/EHasAttackAnimationWatcher.java
index c0704b43..0566c147 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/EHasAttackAnimationWatcher.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/EHasAttackAnimationWatcher.java
@@ -1,12 +1,12 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.watchers.types;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers.types;
 
 import com.comphenix.protocol.events.PacketContainer;
 import net.minecraft.network.protocol.game.ClientboundEntityEventPacket;
 import org.bukkit.craftbukkit.entity.CraftPlayer;
 import org.bukkit.entity.EntityType;
 import org.bukkit.entity.Player;
-import xiamomc.morph.backends.server.renderer.network.registries.CustomEntries;
-import xiamomc.morph.backends.server.renderer.network.registries.RegistryKey;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.CustomEntries;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.RegistryKey;
 
 public class EHasAttackAnimationWatcher extends LivingEntityWatcher
 {
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/EntityWatcher.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/EntityWatcher.java
similarity index 87%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/EntityWatcher.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/EntityWatcher.java
index 3dc67e97..f730d32d 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/EntityWatcher.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/EntityWatcher.java
@@ -1,15 +1,15 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.watchers.types;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers.types;
 
 import net.minecraft.nbt.CompoundTag;
 import net.minecraft.network.chat.Component;
 import net.minecraft.server.MinecraftServer;
 import org.bukkit.entity.EntityType;
 import org.bukkit.entity.Player;
-import xiamomc.morph.backends.server.renderer.network.datawatcher.watchers.SingleWatcher;
-import xiamomc.morph.backends.server.renderer.network.registries.CustomEntries;
-import xiamomc.morph.backends.server.renderer.network.registries.RegistryKey;
-import xiamomc.morph.backends.server.renderer.network.registries.ValueIndex;
-import xiamomc.morph.misc.NmsRecord;
+import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers.SingleWatcher;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.CustomEntries;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.RegistryKey;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.ValueIndex;
+import xyz.nifeather.morph.misc.NmsRecord;
 
 import java.util.Optional;
 
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/FoxWatcher.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/FoxWatcher.java
similarity index 77%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/FoxWatcher.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/FoxWatcher.java
index ba7e34d8..4ea93c67 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/FoxWatcher.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/FoxWatcher.java
@@ -1,16 +1,16 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.watchers.types;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers.types;
 
 import net.minecraft.nbt.CompoundTag;
 import org.bukkit.entity.EntityType;
 import org.bukkit.entity.Fox;
 import org.bukkit.entity.Player;
-import xiamomc.morph.backends.server.renderer.network.registries.CustomEntries;
-import xiamomc.morph.backends.server.renderer.network.registries.RegistryKey;
-import xiamomc.morph.backends.server.renderer.network.registries.ValueIndex;
-import xiamomc.morph.misc.AnimationNames;
-import xiamomc.morph.misc.disguiseProperty.DisguiseProperties;
-import xiamomc.morph.misc.disguiseProperty.SingleProperty;
-import xiamomc.morph.misc.disguiseProperty.values.FoxProperties;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.CustomEntries;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.RegistryKey;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.ValueIndex;
+import xyz.nifeather.morph.misc.AnimationNames;
+import xyz.nifeather.morph.misc.disguiseProperty.DisguiseProperties;
+import xyz.nifeather.morph.misc.disguiseProperty.SingleProperty;
+import xyz.nifeather.morph.misc.disguiseProperty.values.FoxProperties;
 
 public class FoxWatcher extends AgeableMobWatcher
 {
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/FrogWatcher.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/FrogWatcher.java
similarity index 88%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/FrogWatcher.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/FrogWatcher.java
index 26dd399c..13509873 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/FrogWatcher.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/FrogWatcher.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.watchers.types;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers.types;
 
 import net.minecraft.core.Holder;
 import net.minecraft.core.registries.Registries;
@@ -15,13 +15,13 @@
 import org.bukkit.entity.EntityType;
 import org.bukkit.entity.Frog;
 import org.bukkit.entity.Player;
-import xiamomc.morph.backends.server.renderer.network.registries.CustomEntries;
-import xiamomc.morph.backends.server.renderer.network.registries.RegistryKey;
-import xiamomc.morph.backends.server.renderer.network.registries.ValueIndex;
-import xiamomc.morph.misc.AnimationNames;
-import xiamomc.morph.misc.disguiseProperty.DisguiseProperties;
-import xiamomc.morph.misc.disguiseProperty.SingleProperty;
-import xiamomc.morph.misc.disguiseProperty.values.FrogProperties;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.CustomEntries;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.RegistryKey;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.ValueIndex;
+import xyz.nifeather.morph.misc.AnimationNames;
+import xyz.nifeather.morph.misc.disguiseProperty.DisguiseProperties;
+import xyz.nifeather.morph.misc.disguiseProperty.SingleProperty;
+import xyz.nifeather.morph.misc.disguiseProperty.values.FrogProperties;
 import xiamomc.pluginbase.Exceptions.NullDependencyException;
 
 public class FrogWatcher extends LivingEntityWatcher
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/GhastWatcher.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/GhastWatcher.java
similarity index 67%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/GhastWatcher.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/GhastWatcher.java
index 7b63d674..7c6bbcda 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/GhastWatcher.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/GhastWatcher.java
@@ -1,8 +1,8 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.watchers.types;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers.types;
 
 import org.bukkit.entity.EntityType;
 import org.bukkit.entity.Player;
-import xiamomc.morph.backends.server.renderer.network.registries.ValueIndex;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.ValueIndex;
 
 public class GhastWatcher extends LivingEntityWatcher
 {
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/GoatWatcher.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/GoatWatcher.java
similarity index 82%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/GoatWatcher.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/GoatWatcher.java
index cf708b9a..067e7525 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/GoatWatcher.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/GoatWatcher.java
@@ -1,12 +1,12 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.watchers.types;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers.types;
 
 import net.minecraft.nbt.CompoundTag;
 import org.bukkit.entity.EntityType;
 import org.bukkit.entity.Player;
-import xiamomc.morph.backends.server.renderer.network.registries.ValueIndex;
-import xiamomc.morph.misc.disguiseProperty.DisguiseProperties;
-import xiamomc.morph.misc.disguiseProperty.SingleProperty;
-import xiamomc.morph.misc.disguiseProperty.values.GoatProperties;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.ValueIndex;
+import xyz.nifeather.morph.misc.disguiseProperty.DisguiseProperties;
+import xyz.nifeather.morph.misc.disguiseProperty.SingleProperty;
+import xyz.nifeather.morph.misc.disguiseProperty.values.GoatProperties;
 
 public class GoatWatcher extends LivingEntityWatcher
 {
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/GuardianWatcher.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/GuardianWatcher.java
similarity index 74%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/GuardianWatcher.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/GuardianWatcher.java
index 9d86774f..f4c8c3f2 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/GuardianWatcher.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/GuardianWatcher.java
@@ -1,8 +1,8 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.watchers.types;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers.types;
 
 import org.bukkit.entity.EntityType;
 import org.bukkit.entity.Player;
-import xiamomc.morph.backends.server.renderer.network.registries.ValueIndex;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.ValueIndex;
 
 public class GuardianWatcher extends LivingEntityWatcher
 {
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/HoglinWatcher.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/HoglinWatcher.java
similarity index 79%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/HoglinWatcher.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/HoglinWatcher.java
index 5992d12d..71304624 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/HoglinWatcher.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/HoglinWatcher.java
@@ -1,9 +1,9 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.watchers.types;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers.types;
 
 import net.minecraft.nbt.CompoundTag;
 import org.bukkit.entity.EntityType;
 import org.bukkit.entity.Player;
-import xiamomc.morph.backends.server.renderer.network.registries.ValueIndex;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.ValueIndex;
 
 public class HoglinWatcher extends EHasAttackAnimationWatcher
 {
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/InventoryLivingWatcher.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/InventoryLivingWatcher.java
similarity index 69%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/InventoryLivingWatcher.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/InventoryLivingWatcher.java
index 1143e790..e63edecd 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/InventoryLivingWatcher.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/InventoryLivingWatcher.java
@@ -1,10 +1,10 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.watchers.types;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers.types;
 
 import org.bukkit.entity.EntityType;
 import org.bukkit.entity.Player;
-import xiamomc.morph.backends.server.renderer.network.PacketFactory;
-import xiamomc.morph.backends.server.renderer.network.registries.CustomEntries;
-import xiamomc.morph.backends.server.renderer.network.registries.RegistryKey;
+import xyz.nifeather.morph.backends.server.renderer.network.PacketFactory;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.CustomEntries;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.RegistryKey;
 import xiamomc.pluginbase.Annotations.Resolved;
 
 public class InventoryLivingWatcher extends LivingEntityWatcher
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/LivingEntityWatcher.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/LivingEntityWatcher.java
similarity index 94%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/LivingEntityWatcher.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/LivingEntityWatcher.java
index 6325e8c0..03d48df6 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/LivingEntityWatcher.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/LivingEntityWatcher.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.watchers.types;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers.types;
 
 import it.unimi.dsi.fastutil.Pair;
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
@@ -14,8 +14,8 @@
 import org.bukkit.event.player.PlayerInteractEvent;
 import org.bukkit.inventory.EquipmentSlot;
 import org.bukkit.potion.PotionEffect;
-import xiamomc.morph.backends.server.renderer.network.registries.ValueIndex;
-import xiamomc.morph.misc.NmsRecord;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.ValueIndex;
+import xyz.nifeather.morph.misc.NmsRecord;
 
 import java.util.List;
 import java.util.Optional;
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/MooshroomWatcher.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/MooshroomWatcher.java
similarity index 77%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/MooshroomWatcher.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/MooshroomWatcher.java
index 6aefe824..5db898b1 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/MooshroomWatcher.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/MooshroomWatcher.java
@@ -1,13 +1,13 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.watchers.types;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers.types;
 
 import net.minecraft.nbt.CompoundTag;
 import org.bukkit.entity.EntityType;
 import org.bukkit.entity.MushroomCow;
 import org.bukkit.entity.Player;
-import xiamomc.morph.backends.server.renderer.network.registries.ValueIndex;
-import xiamomc.morph.misc.disguiseProperty.DisguiseProperties;
-import xiamomc.morph.misc.disguiseProperty.SingleProperty;
-import xiamomc.morph.misc.disguiseProperty.values.MooshroomProperties;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.ValueIndex;
+import xyz.nifeather.morph.misc.disguiseProperty.DisguiseProperties;
+import xyz.nifeather.morph.misc.disguiseProperty.SingleProperty;
+import xyz.nifeather.morph.misc.disguiseProperty.values.MooshroomProperties;
 
 public class MooshroomWatcher extends LivingEntityWatcher
 {
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/PandaWatcher.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/PandaWatcher.java
similarity index 84%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/PandaWatcher.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/PandaWatcher.java
index 3dfe2157..a0165e1f 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/PandaWatcher.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/PandaWatcher.java
@@ -1,16 +1,16 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.watchers.types;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers.types;
 
 import net.minecraft.nbt.CompoundTag;
 import org.bukkit.entity.EntityType;
 import org.bukkit.entity.Panda;
 import org.bukkit.entity.Player;
-import xiamomc.morph.backends.server.renderer.network.registries.CustomEntries;
-import xiamomc.morph.backends.server.renderer.network.registries.RegistryKey;
-import xiamomc.morph.backends.server.renderer.network.registries.ValueIndex;
-import xiamomc.morph.misc.AnimationNames;
-import xiamomc.morph.misc.disguiseProperty.DisguiseProperties;
-import xiamomc.morph.misc.disguiseProperty.SingleProperty;
-import xiamomc.morph.misc.disguiseProperty.values.PandaProperties;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.CustomEntries;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.RegistryKey;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.ValueIndex;
+import xyz.nifeather.morph.misc.AnimationNames;
+import xyz.nifeather.morph.misc.disguiseProperty.DisguiseProperties;
+import xyz.nifeather.morph.misc.disguiseProperty.SingleProperty;
+import xyz.nifeather.morph.misc.disguiseProperty.values.PandaProperties;
 
 import java.util.Arrays;
 
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/ParrotWatcher.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/ParrotWatcher.java
similarity index 78%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/ParrotWatcher.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/ParrotWatcher.java
index e5a5c0a3..c6e8d9d2 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/ParrotWatcher.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/ParrotWatcher.java
@@ -1,13 +1,13 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.watchers.types;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers.types;
 
 import net.minecraft.nbt.CompoundTag;
 import org.bukkit.entity.EntityType;
 import org.bukkit.entity.Parrot;
 import org.bukkit.entity.Player;
-import xiamomc.morph.backends.server.renderer.network.registries.ValueIndex;
-import xiamomc.morph.misc.disguiseProperty.DisguiseProperties;
-import xiamomc.morph.misc.disguiseProperty.SingleProperty;
-import xiamomc.morph.misc.disguiseProperty.values.ParrotProperties;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.ValueIndex;
+import xyz.nifeather.morph.misc.disguiseProperty.DisguiseProperties;
+import xyz.nifeather.morph.misc.disguiseProperty.SingleProperty;
+import xyz.nifeather.morph.misc.disguiseProperty.values.ParrotProperties;
 
 public class ParrotWatcher extends TameableAnimalWatcher
 {
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/PhantomWatcher.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/PhantomWatcher.java
similarity index 82%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/PhantomWatcher.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/PhantomWatcher.java
index 104fd015..e0bac4a2 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/PhantomWatcher.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/PhantomWatcher.java
@@ -1,9 +1,9 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.watchers.types;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers.types;
 
 import net.minecraft.nbt.CompoundTag;
 import org.bukkit.entity.EntityType;
 import org.bukkit.entity.Player;
-import xiamomc.morph.backends.server.renderer.network.registries.ValueIndex;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.ValueIndex;
 
 public class PhantomWatcher extends LivingEntityWatcher
 {
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/PiglinWatcher.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/PiglinWatcher.java
similarity index 80%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/PiglinWatcher.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/PiglinWatcher.java
index 083dd62f..449be033 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/PiglinWatcher.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/PiglinWatcher.java
@@ -1,13 +1,13 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.watchers.types;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers.types;
 
 import net.minecraft.nbt.CompoundTag;
 import org.bukkit.Sound;
 import org.bukkit.entity.EntityType;
 import org.bukkit.entity.Player;
-import xiamomc.morph.backends.server.renderer.network.registries.CustomEntries;
-import xiamomc.morph.backends.server.renderer.network.registries.RegistryKey;
-import xiamomc.morph.backends.server.renderer.network.registries.ValueIndex;
-import xiamomc.morph.misc.AnimationNames;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.CustomEntries;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.RegistryKey;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.ValueIndex;
+import xyz.nifeather.morph.misc.AnimationNames;
 
 public class PiglinWatcher extends LivingEntityWatcher
 {
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/PlayerWatcher.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/PlayerWatcher.java
similarity index 84%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/PlayerWatcher.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/PlayerWatcher.java
index 9c52ba26..d0b23f6b 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/PlayerWatcher.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/PlayerWatcher.java
@@ -1,21 +1,18 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.watchers.types;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers.types;
 
 import com.comphenix.protocol.ProtocolLibrary;
 import com.comphenix.protocol.events.PacketContainer;
 import com.destroystokyo.paper.ClientOption;
-import com.mojang.authlib.GameProfile;
 import net.minecraft.network.protocol.game.ClientboundRemoveEntitiesPacket;
 import net.minecraft.world.entity.Pose;
 import org.bukkit.entity.EntityType;
 import org.bukkit.entity.Player;
-import xiamomc.morph.backends.server.renderer.network.DisplayParameters;
-import xiamomc.morph.backends.server.renderer.network.registries.CustomEntries;
-import xiamomc.morph.backends.server.renderer.network.registries.RegistryKey;
-import xiamomc.morph.backends.server.renderer.network.registries.ValueIndex;
-import xiamomc.morph.misc.NmsRecord;
-import xiamomc.morph.misc.AnimationNames;
-
-import java.util.UUID;
+import xyz.nifeather.morph.backends.server.renderer.network.DisplayParameters;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.CustomEntries;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.RegistryKey;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.ValueIndex;
+import xyz.nifeather.morph.misc.NmsRecord;
+import xyz.nifeather.morph.misc.AnimationNames;
 
 public class PlayerWatcher extends InventoryLivingWatcher
 {
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/PufferfishWatcher.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/PufferfishWatcher.java
similarity index 79%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/PufferfishWatcher.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/PufferfishWatcher.java
index 16128bff..374a2856 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/PufferfishWatcher.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/PufferfishWatcher.java
@@ -1,14 +1,14 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.watchers.types;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers.types;
 
 import org.bukkit.Sound;
 import org.bukkit.SoundCategory;
 import org.bukkit.entity.EntityType;
 import org.bukkit.entity.Player;
-import xiamomc.morph.backends.server.renderer.network.datawatcher.values.PufferfishValues;
-import xiamomc.morph.backends.server.renderer.network.registries.CustomEntries;
-import xiamomc.morph.backends.server.renderer.network.registries.RegistryKey;
-import xiamomc.morph.backends.server.renderer.network.registries.ValueIndex;
-import xiamomc.morph.misc.AnimationNames;
+import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values.PufferfishValues;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.CustomEntries;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.RegistryKey;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.ValueIndex;
+import xyz.nifeather.morph.misc.AnimationNames;
 
 public class PufferfishWatcher extends LivingEntityWatcher
 {
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/RabbitWatcher.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/RabbitWatcher.java
similarity index 79%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/RabbitWatcher.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/RabbitWatcher.java
index 9bf922c5..20ae1c95 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/RabbitWatcher.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/RabbitWatcher.java
@@ -1,13 +1,13 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.watchers.types;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers.types;
 
 import net.minecraft.nbt.CompoundTag;
 import org.bukkit.entity.EntityType;
 import org.bukkit.entity.Player;
 import org.bukkit.entity.Rabbit;
-import xiamomc.morph.backends.server.renderer.network.registries.ValueIndex;
-import xiamomc.morph.misc.disguiseProperty.DisguiseProperties;
-import xiamomc.morph.misc.disguiseProperty.SingleProperty;
-import xiamomc.morph.misc.disguiseProperty.values.RabbitProperties;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.ValueIndex;
+import xyz.nifeather.morph.misc.disguiseProperty.DisguiseProperties;
+import xyz.nifeather.morph.misc.disguiseProperty.SingleProperty;
+import xyz.nifeather.morph.misc.disguiseProperty.values.RabbitProperties;
 
 import java.util.Arrays;
 
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/SheepWatcher.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/SheepWatcher.java
similarity index 82%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/SheepWatcher.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/SheepWatcher.java
index 7a882b33..1b211b5e 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/SheepWatcher.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/SheepWatcher.java
@@ -1,9 +1,9 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.watchers.types;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers.types;
 
 import net.minecraft.nbt.CompoundTag;
 import org.bukkit.entity.EntityType;
 import org.bukkit.entity.Player;
-import xiamomc.morph.backends.server.renderer.network.registries.ValueIndex;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.ValueIndex;
 
 public class SheepWatcher extends LivingEntityWatcher
 {
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/ShulkerWatcher.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/ShulkerWatcher.java
similarity index 83%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/ShulkerWatcher.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/ShulkerWatcher.java
index cb26e9ee..54eca71a 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/ShulkerWatcher.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/ShulkerWatcher.java
@@ -1,13 +1,13 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.watchers.types;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers.types;
 
 import org.bukkit.Sound;
 import org.bukkit.SoundCategory;
 import org.bukkit.entity.EntityType;
 import org.bukkit.entity.Player;
-import xiamomc.morph.backends.server.renderer.network.registries.CustomEntries;
-import xiamomc.morph.backends.server.renderer.network.registries.RegistryKey;
-import xiamomc.morph.backends.server.renderer.network.registries.ValueIndex;
-import xiamomc.morph.misc.AnimationNames;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.CustomEntries;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.RegistryKey;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.ValueIndex;
+import xyz.nifeather.morph.misc.AnimationNames;
 
 public class ShulkerWatcher extends LivingEntityWatcher
 {
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/SnifferWatcher.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/SnifferWatcher.java
similarity index 79%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/SnifferWatcher.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/SnifferWatcher.java
index 1b58d192..352d963e 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/SnifferWatcher.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/SnifferWatcher.java
@@ -1,14 +1,14 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.watchers.types;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers.types;
 
 import net.minecraft.world.entity.animal.sniffer.Sniffer;
 import org.bukkit.Sound;
 import org.bukkit.SoundCategory;
 import org.bukkit.entity.EntityType;
 import org.bukkit.entity.Player;
-import xiamomc.morph.backends.server.renderer.network.registries.CustomEntries;
-import xiamomc.morph.backends.server.renderer.network.registries.RegistryKey;
-import xiamomc.morph.backends.server.renderer.network.registries.ValueIndex;
-import xiamomc.morph.misc.AnimationNames;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.CustomEntries;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.RegistryKey;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.ValueIndex;
+import xyz.nifeather.morph.misc.AnimationNames;
 
 public class SnifferWatcher extends LivingEntityWatcher
 {
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/SnowGolemWatcher.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/SnowGolemWatcher.java
similarity index 79%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/SnowGolemWatcher.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/SnowGolemWatcher.java
index b43b7787..71930906 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/SnowGolemWatcher.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/SnowGolemWatcher.java
@@ -1,10 +1,10 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.watchers.types;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers.types;
 
 import net.minecraft.nbt.CompoundTag;
 import org.bukkit.entity.EntityType;
 import org.bukkit.entity.Player;
-import xiamomc.morph.backends.server.renderer.network.datawatcher.values.SnowGolemValues;
-import xiamomc.morph.backends.server.renderer.network.registries.ValueIndex;
+import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values.SnowGolemValues;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.ValueIndex;
 
 public class SnowGolemWatcher extends LivingEntityWatcher
 {
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/TameableAnimalWatcher.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/TameableAnimalWatcher.java
similarity index 90%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/TameableAnimalWatcher.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/TameableAnimalWatcher.java
index 293a3955..f4c88f6f 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/TameableAnimalWatcher.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/TameableAnimalWatcher.java
@@ -1,10 +1,10 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.watchers.types;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers.types;
 
 import net.minecraft.Util;
 import net.minecraft.nbt.CompoundTag;
 import org.bukkit.entity.EntityType;
 import org.bukkit.entity.Player;
-import xiamomc.morph.backends.server.renderer.network.registries.ValueIndex;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.ValueIndex;
 
 import java.util.Optional;
 import java.util.UUID;
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/TropicalFishWatcher.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/TropicalFishWatcher.java
similarity index 83%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/TropicalFishWatcher.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/TropicalFishWatcher.java
index 838c6a67..5de34d0d 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/TropicalFishWatcher.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/TropicalFishWatcher.java
@@ -1,9 +1,9 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.watchers.types;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers.types;
 
 import net.minecraft.nbt.CompoundTag;
 import org.bukkit.entity.EntityType;
 import org.bukkit.entity.Player;
-import xiamomc.morph.backends.server.renderer.network.registries.ValueIndex;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.ValueIndex;
 
 public class TropicalFishWatcher extends LivingEntityWatcher
 {
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/VillagerWatcher.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/VillagerWatcher.java
similarity index 92%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/VillagerWatcher.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/VillagerWatcher.java
index 2e3eaf74..cd9d49cb 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/VillagerWatcher.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/VillagerWatcher.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.watchers.types;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers.types;
 
 import net.minecraft.core.registries.BuiltInRegistries;
 import net.minecraft.nbt.CompoundTag;
@@ -9,13 +9,11 @@
 import org.bukkit.entity.EntityType;
 import org.bukkit.entity.Player;
 import org.bukkit.entity.Villager;
-import xiamomc.morph.backends.server.renderer.network.registries.ValueIndex;
-import xiamomc.morph.misc.disguiseProperty.DisguiseProperties;
-import xiamomc.morph.misc.disguiseProperty.SingleProperty;
-import xiamomc.morph.misc.disguiseProperty.values.VillagerProperties;
-import xiamomc.morph.utilities.MathUtils;
-
-import java.util.Arrays;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.ValueIndex;
+import xyz.nifeather.morph.misc.disguiseProperty.DisguiseProperties;
+import xyz.nifeather.morph.misc.disguiseProperty.SingleProperty;
+import xyz.nifeather.morph.misc.disguiseProperty.values.VillagerProperties;
+import xyz.nifeather.morph.utilities.MathUtils;
 
 public class VillagerWatcher extends LivingEntityWatcher
 {
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/WardenWatcher.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/WardenWatcher.java
similarity index 91%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/WardenWatcher.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/WardenWatcher.java
index 52e78ad6..09205398 100755
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/WardenWatcher.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/WardenWatcher.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.watchers.types;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers.types;
 
 import com.comphenix.protocol.ProtocolLibrary;
 import com.comphenix.protocol.events.PacketContainer;
@@ -10,14 +10,12 @@
 import org.bukkit.craftbukkit.entity.CraftPlayer;
 import org.bukkit.entity.EntityType;
 import org.bukkit.entity.Player;
-import xiamomc.morph.backends.server.renderer.network.DisplayParameters;
-import xiamomc.morph.backends.server.renderer.network.registries.CustomEntries;
-import xiamomc.morph.backends.server.renderer.network.registries.RegistryKey;
-import xiamomc.morph.backends.server.renderer.network.registries.ValueIndex;
-import xiamomc.morph.misc.NmsRecord;
-import xiamomc.morph.misc.AnimationNames;
-
-import java.util.concurrent.atomic.AtomicBoolean;
+import xyz.nifeather.morph.backends.server.renderer.network.DisplayParameters;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.CustomEntries;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.RegistryKey;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.ValueIndex;
+import xyz.nifeather.morph.misc.NmsRecord;
+import xyz.nifeather.morph.misc.AnimationNames;
 
 public class WardenWatcher extends EHasAttackAnimationWatcher
 {
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/WolfWatcher.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/WolfWatcher.java
similarity index 89%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/WolfWatcher.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/WolfWatcher.java
index 729d7ff2..c02825c6 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/WolfWatcher.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/WolfWatcher.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.watchers.types;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers.types;
 
 import net.minecraft.core.Holder;
 import net.minecraft.core.registries.Registries;
@@ -12,13 +12,13 @@
 import org.bukkit.entity.EntityType;
 import org.bukkit.entity.Player;
 import org.bukkit.entity.Wolf;
-import xiamomc.morph.backends.server.renderer.network.registries.CustomEntries;
-import xiamomc.morph.backends.server.renderer.network.registries.RegistryKey;
-import xiamomc.morph.backends.server.renderer.network.registries.ValueIndex;
-import xiamomc.morph.misc.AnimationNames;
-import xiamomc.morph.misc.disguiseProperty.DisguiseProperties;
-import xiamomc.morph.misc.disguiseProperty.SingleProperty;
-import xiamomc.morph.misc.disguiseProperty.values.WolfProperties;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.CustomEntries;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.RegistryKey;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.ValueIndex;
+import xyz.nifeather.morph.misc.AnimationNames;
+import xyz.nifeather.morph.misc.disguiseProperty.DisguiseProperties;
+import xyz.nifeather.morph.misc.disguiseProperty.SingleProperty;
+import xyz.nifeather.morph.misc.disguiseProperty.values.WolfProperties;
 import xiamomc.pluginbase.Exceptions.NullDependencyException;
 
 public class WolfWatcher extends TameableAnimalWatcher
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/ZoglinWatcher.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/ZoglinWatcher.java
similarity index 79%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/ZoglinWatcher.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/ZoglinWatcher.java
index 155209dd..7c8ee42c 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/ZoglinWatcher.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/ZoglinWatcher.java
@@ -1,9 +1,9 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.watchers.types;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers.types;
 
 import net.minecraft.nbt.CompoundTag;
 import org.bukkit.entity.EntityType;
 import org.bukkit.entity.Player;
-import xiamomc.morph.backends.server.renderer.network.registries.ValueIndex;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.ValueIndex;
 
 public class ZoglinWatcher extends EHasAttackAnimationWatcher
 {
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/ZombieVillagerWatcher.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/ZombieVillagerWatcher.java
similarity index 92%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/ZombieVillagerWatcher.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/ZombieVillagerWatcher.java
index d82e0e99..e71b0e85 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/ZombieVillagerWatcher.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/ZombieVillagerWatcher.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.watchers.types;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers.types;
 
 import net.minecraft.core.registries.BuiltInRegistries;
 import net.minecraft.nbt.CompoundTag;
@@ -6,17 +6,14 @@
 import net.minecraft.world.entity.npc.VillagerData;
 import net.minecraft.world.entity.npc.VillagerProfession;
 import net.minecraft.world.entity.npc.VillagerType;
-import org.bukkit.Registry;
 import org.bukkit.entity.EntityType;
 import org.bukkit.entity.Player;
 import org.bukkit.entity.Villager;
-import xiamomc.morph.backends.server.renderer.network.registries.ValueIndex;
-import xiamomc.morph.misc.disguiseProperty.DisguiseProperties;
-import xiamomc.morph.misc.disguiseProperty.SingleProperty;
-import xiamomc.morph.misc.disguiseProperty.values.VillagerProperties;
-import xiamomc.morph.utilities.MathUtils;
-
-import java.util.Arrays;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.ValueIndex;
+import xyz.nifeather.morph.misc.disguiseProperty.DisguiseProperties;
+import xyz.nifeather.morph.misc.disguiseProperty.SingleProperty;
+import xyz.nifeather.morph.misc.disguiseProperty.values.VillagerProperties;
+import xyz.nifeather.morph.utilities.MathUtils;
 
 public class ZombieVillagerWatcher extends ZombieWatcher
 {
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/ZombieWatcher.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/ZombieWatcher.java
similarity index 81%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/ZombieWatcher.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/ZombieWatcher.java
index 70d3bbbe..4c13cef7 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/ZombieWatcher.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/ZombieWatcher.java
@@ -1,9 +1,9 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.watchers.types;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers.types;
 
 import net.minecraft.nbt.CompoundTag;
 import org.bukkit.entity.EntityType;
 import org.bukkit.entity.Player;
-import xiamomc.morph.backends.server.renderer.network.registries.ValueIndex;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.ValueIndex;
 
 public class ZombieWatcher extends LivingEntityWatcher
 {
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/horses/AbstractHorseWatcher.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/horses/AbstractHorseWatcher.java
similarity index 70%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/horses/AbstractHorseWatcher.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/horses/AbstractHorseWatcher.java
index de79fdb5..2d7db5e6 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/horses/AbstractHorseWatcher.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/horses/AbstractHorseWatcher.java
@@ -1,10 +1,10 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.watchers.types.horses;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers.types.horses;
 
 import net.minecraft.nbt.CompoundTag;
 import org.bukkit.entity.EntityType;
 import org.bukkit.entity.Player;
-import xiamomc.morph.backends.server.renderer.network.datawatcher.watchers.types.AgeableMobWatcher;
-import xiamomc.morph.backends.server.renderer.network.registries.ValueIndex;
+import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers.types.AgeableMobWatcher;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.ValueIndex;
 
 public class AbstractHorseWatcher extends AgeableMobWatcher
 {
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/horses/ChestedHorseWatcher.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/horses/ChestedHorseWatcher.java
similarity index 79%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/horses/ChestedHorseWatcher.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/horses/ChestedHorseWatcher.java
index 6822ad39..535a046f 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/horses/ChestedHorseWatcher.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/horses/ChestedHorseWatcher.java
@@ -1,9 +1,9 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.watchers.types.horses;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers.types.horses;
 
 import net.minecraft.nbt.CompoundTag;
 import org.bukkit.entity.EntityType;
 import org.bukkit.entity.Player;
-import xiamomc.morph.backends.server.renderer.network.registries.ValueIndex;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.ValueIndex;
 
 public class ChestedHorseWatcher extends AbstractHorseWatcher
 {
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/horses/HorseWatcher.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/horses/HorseWatcher.java
similarity index 85%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/horses/HorseWatcher.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/horses/HorseWatcher.java
index 2db9000f..1f163079 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/horses/HorseWatcher.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/horses/HorseWatcher.java
@@ -1,13 +1,13 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.watchers.types.horses;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers.types.horses;
 
 import net.minecraft.nbt.CompoundTag;
 import org.bukkit.entity.EntityType;
 import org.bukkit.entity.Horse;
 import org.bukkit.entity.Player;
-import xiamomc.morph.backends.server.renderer.network.registries.ValueIndex;
-import xiamomc.morph.misc.disguiseProperty.DisguiseProperties;
-import xiamomc.morph.misc.disguiseProperty.SingleProperty;
-import xiamomc.morph.misc.disguiseProperty.values.HorseProperties;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.ValueIndex;
+import xyz.nifeather.morph.misc.disguiseProperty.DisguiseProperties;
+import xyz.nifeather.morph.misc.disguiseProperty.SingleProperty;
+import xyz.nifeather.morph.misc.disguiseProperty.values.HorseProperties;
 
 public class HorseWatcher extends AbstractHorseWatcher
 {
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/horses/SkeletonHorseWatcher.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/horses/SkeletonHorseWatcher.java
similarity index 73%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/horses/SkeletonHorseWatcher.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/horses/SkeletonHorseWatcher.java
index c0ff0f8c..23695793 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/horses/SkeletonHorseWatcher.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/horses/SkeletonHorseWatcher.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.watchers.types.horses;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers.types.horses;
 
 import org.bukkit.entity.EntityType;
 import org.bukkit.entity.Player;
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/horses/ZombieHorseWatcher.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/horses/ZombieHorseWatcher.java
similarity index 72%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/horses/ZombieHorseWatcher.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/horses/ZombieHorseWatcher.java
index b9cb482b..398838b1 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/horses/ZombieHorseWatcher.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/horses/ZombieHorseWatcher.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.watchers.types.horses;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers.types.horses;
 
 import org.bukkit.entity.EntityType;
 import org.bukkit.entity.Player;
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/llama/LlamaWatcher.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/llama/LlamaWatcher.java
similarity index 74%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/llama/LlamaWatcher.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/llama/LlamaWatcher.java
index f46028a0..44c51a51 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/llama/LlamaWatcher.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/llama/LlamaWatcher.java
@@ -1,14 +1,14 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.watchers.types.llama;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers.types.llama;
 
 import net.minecraft.nbt.CompoundTag;
 import org.bukkit.entity.EntityType;
 import org.bukkit.entity.Llama;
 import org.bukkit.entity.Player;
-import xiamomc.morph.backends.server.renderer.network.datawatcher.watchers.types.horses.ChestedHorseWatcher;
-import xiamomc.morph.backends.server.renderer.network.registries.ValueIndex;
-import xiamomc.morph.misc.disguiseProperty.DisguiseProperties;
-import xiamomc.morph.misc.disguiseProperty.SingleProperty;
-import xiamomc.morph.misc.disguiseProperty.values.LlamaProperties;
+import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers.types.horses.ChestedHorseWatcher;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.ValueIndex;
+import xyz.nifeather.morph.misc.disguiseProperty.DisguiseProperties;
+import xyz.nifeather.morph.misc.disguiseProperty.SingleProperty;
+import xyz.nifeather.morph.misc.disguiseProperty.values.LlamaProperties;
 
 public class LlamaWatcher extends ChestedHorseWatcher
 {
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/llama/TraderLlamaWatcher.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/llama/TraderLlamaWatcher.java
similarity index 67%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/llama/TraderLlamaWatcher.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/llama/TraderLlamaWatcher.java
index bea54d45..d81f4aa4 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/llama/TraderLlamaWatcher.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/llama/TraderLlamaWatcher.java
@@ -1,8 +1,8 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.watchers.types.llama;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers.types.llama;
 
 import org.bukkit.entity.EntityType;
 import org.bukkit.entity.Player;
-import xiamomc.morph.backends.server.renderer.network.registries.ValueIndex;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.ValueIndex;
 
 public class TraderLlamaWatcher extends LlamaWatcher
 {
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/slimemagma/AbstractSlimeWatcher.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/slimemagma/AbstractSlimeWatcher.java
similarity index 75%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/slimemagma/AbstractSlimeWatcher.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/slimemagma/AbstractSlimeWatcher.java
index a3421551..50155ae0 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/slimemagma/AbstractSlimeWatcher.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/slimemagma/AbstractSlimeWatcher.java
@@ -1,11 +1,11 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.watchers.types.slimemagma;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers.types.slimemagma;
 
 import net.minecraft.nbt.CompoundTag;
 import org.bukkit.entity.EntityType;
 import org.bukkit.entity.Player;
-import xiamomc.morph.backends.server.renderer.network.datawatcher.watchers.types.LivingEntityWatcher;
-import xiamomc.morph.backends.server.renderer.network.registries.CustomEntries;
-import xiamomc.morph.backends.server.renderer.network.registries.ValueIndex;
+import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers.types.LivingEntityWatcher;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.CustomEntries;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.ValueIndex;
 
 public class AbstractSlimeWatcher extends LivingEntityWatcher
 {
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/slimemagma/MagmaWatcher.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/slimemagma/MagmaWatcher.java
similarity index 70%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/slimemagma/MagmaWatcher.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/slimemagma/MagmaWatcher.java
index 552570e5..3872ff46 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/slimemagma/MagmaWatcher.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/slimemagma/MagmaWatcher.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.watchers.types.slimemagma;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers.types.slimemagma;
 
 import org.bukkit.entity.EntityType;
 import org.bukkit.entity.Player;
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/slimemagma/SlimeWatcher.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/slimemagma/SlimeWatcher.java
similarity index 70%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/slimemagma/SlimeWatcher.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/slimemagma/SlimeWatcher.java
index 3ae6890f..77a5ed8b 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/datawatcher/watchers/types/slimemagma/SlimeWatcher.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/slimemagma/SlimeWatcher.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.backends.server.renderer.network.datawatcher.watchers.types.slimemagma;
+package xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers.types.slimemagma;
 
 import org.bukkit.entity.EntityType;
 import org.bukkit.entity.Player;
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/listeners/AnimationPacketListener.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/listeners/AnimationPacketListener.java
similarity index 93%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/listeners/AnimationPacketListener.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/listeners/AnimationPacketListener.java
index 0c340e4b..3d7a4825 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/listeners/AnimationPacketListener.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/listeners/AnimationPacketListener.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.backends.server.renderer.network.listeners;
+package xyz.nifeather.morph.backends.server.renderer.network.listeners;
 
 import com.comphenix.protocol.PacketType;
 import com.comphenix.protocol.events.ListeningWhitelist;
@@ -6,7 +6,7 @@
 import com.comphenix.protocol.injector.GamePhase;
 import net.minecraft.network.protocol.game.ClientboundAnimatePacket;
 import org.bukkit.entity.Player;
-import xiamomc.morph.backends.server.renderer.network.registries.RenderRegistry;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.RenderRegistry;
 import xiamomc.pluginbase.Annotations.Resolved;
 
 public class AnimationPacketListener extends ProtocolListener
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/listeners/EquipmentPacketListener.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/listeners/EquipmentPacketListener.java
similarity index 90%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/listeners/EquipmentPacketListener.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/listeners/EquipmentPacketListener.java
index 30c0e41b..b4d2d773 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/listeners/EquipmentPacketListener.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/listeners/EquipmentPacketListener.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.backends.server.renderer.network.listeners;
+package xyz.nifeather.morph.backends.server.renderer.network.listeners;
 
 import com.comphenix.protocol.PacketType;
 import com.comphenix.protocol.events.ListeningWhitelist;
@@ -7,9 +7,8 @@
 import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
 import net.minecraft.network.protocol.game.ClientboundSetEquipmentPacket;
 import org.bukkit.entity.Player;
-import xiamomc.morph.backends.server.renderer.network.PacketFactory;
-import xiamomc.morph.backends.server.renderer.network.registries.CustomEntries;
-import xiamomc.morph.backends.server.renderer.network.registries.RenderRegistry;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.CustomEntries;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.RenderRegistry;
 import xiamomc.pluginbase.Annotations.Resolved;
 
 import java.util.Map;
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/listeners/MetaPacketListener.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/listeners/MetaPacketListener.java
similarity index 90%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/listeners/MetaPacketListener.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/listeners/MetaPacketListener.java
index 1aa5e3d5..88571b66 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/listeners/MetaPacketListener.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/listeners/MetaPacketListener.java
@@ -1,16 +1,14 @@
-package xiamomc.morph.backends.server.renderer.network.listeners;
+package xyz.nifeather.morph.backends.server.renderer.network.listeners;
 
 import com.comphenix.protocol.PacketType;
 import com.comphenix.protocol.events.ListeningWhitelist;
 import com.comphenix.protocol.events.PacketEvent;
 import com.comphenix.protocol.injector.GamePhase;
 import net.minecraft.network.protocol.game.ClientboundSetEntityDataPacket;
-import net.minecraft.network.syncher.SynchedEntityData;
 import org.bukkit.entity.EntityType;
 import org.bukkit.entity.Player;
-import xiamomc.morph.backends.server.renderer.network.PacketFactory;
-import xiamomc.morph.backends.server.renderer.network.registries.RenderRegistry;
-import xiamomc.morph.backends.server.renderer.network.registries.ValueIndex;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.RenderRegistry;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.ValueIndex;
 import xiamomc.pluginbase.Annotations.Resolved;
 
 public class MetaPacketListener extends ProtocolListener
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/listeners/PlayerLookPacketListener.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/listeners/PlayerLookPacketListener.java
similarity index 96%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/listeners/PlayerLookPacketListener.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/listeners/PlayerLookPacketListener.java
index 17081473..80be25ad 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/listeners/PlayerLookPacketListener.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/listeners/PlayerLookPacketListener.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.backends.server.renderer.network.listeners;
+package xyz.nifeather.morph.backends.server.renderer.network.listeners;
 
 import com.comphenix.protocol.PacketType;
 import com.comphenix.protocol.events.ListeningWhitelist;
@@ -10,9 +10,8 @@
 import net.minecraft.network.protocol.game.ClientboundTeleportEntityPacket;
 import org.bukkit.entity.EntityType;
 import org.bukkit.entity.Player;
-import xiamomc.morph.backends.server.renderer.network.PacketFactory;
-import xiamomc.morph.backends.server.renderer.network.registries.RenderRegistry;
-import xiamomc.morph.utilities.NmsUtils;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.RenderRegistry;
+import xyz.nifeather.morph.utilities.NmsUtils;
 import xiamomc.pluginbase.Annotations.Resolved;
 
 public class PlayerLookPacketListener extends ProtocolListener
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/listeners/ProtocolListener.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/listeners/ProtocolListener.java
similarity index 84%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/listeners/ProtocolListener.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/listeners/ProtocolListener.java
index 946c918c..00c3a163 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/listeners/ProtocolListener.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/listeners/ProtocolListener.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.backends.server.renderer.network.listeners;
+package xyz.nifeather.morph.backends.server.renderer.network.listeners;
 
 import com.comphenix.protocol.ProtocolLibrary;
 import com.comphenix.protocol.ProtocolManager;
@@ -7,22 +7,17 @@
 import net.minecraft.world.entity.Entity;
 import net.minecraft.world.entity.player.Player;
 import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.CraftWorld;
-import org.bukkit.craftbukkit.entity.CraftPlayer;
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.MorphPlugin;
-import xiamomc.morph.MorphPluginObject;
-import xiamomc.morph.backends.server.renderer.network.PacketFactory;
-import xiamomc.morph.config.ConfigOption;
-import xiamomc.morph.config.MorphConfigManager;
-import xiamomc.morph.utilities.NmsUtils;
+import xyz.nifeather.morph.MorphPlugin;
+import xyz.nifeather.morph.MorphPluginObject;
+import xyz.nifeather.morph.backends.server.renderer.network.PacketFactory;
+import xyz.nifeather.morph.config.ConfigOption;
+import xyz.nifeather.morph.config.MorphConfigManager;
+import xyz.nifeather.morph.utilities.NmsUtils;
 import xiamomc.pluginbase.Annotations.Initializer;
 import xiamomc.pluginbase.Annotations.Resolved;
 import xiamomc.pluginbase.Bindables.Bindable;
 
-import java.util.Optional;
-import java.util.function.Function;
-
 public abstract class ProtocolListener extends MorphPluginObject implements PacketListener
 {
     @Resolved(shouldSolveImmediately = true)
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/listeners/SoundListener.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/listeners/SoundListener.java
similarity index 95%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/listeners/SoundListener.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/listeners/SoundListener.java
index e67b9888..f1fa6fad 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/listeners/SoundListener.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/listeners/SoundListener.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.backends.server.renderer.network.listeners;
+package xyz.nifeather.morph.backends.server.renderer.network.listeners;
 
 import com.comphenix.protocol.PacketType;
 import com.comphenix.protocol.events.ListeningWhitelist;
@@ -11,9 +11,8 @@
 import net.minecraft.sounds.SoundEvent;
 import org.bukkit.entity.EntityType;
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.backends.server.renderer.network.PacketFactory;
-import xiamomc.morph.backends.server.renderer.network.registries.RenderRegistry;
-import xiamomc.morph.utilities.EntityTypeUtils;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.RenderRegistry;
+import xyz.nifeather.morph.utilities.EntityTypeUtils;
 import xiamomc.pluginbase.Annotations.Resolved;
 
 import java.util.concurrent.atomic.AtomicReference;
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/listeners/SpawnPacketHandler.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/listeners/SpawnPacketHandler.java
similarity index 91%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/listeners/SpawnPacketHandler.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/listeners/SpawnPacketHandler.java
index 5c333b5a..81e618de 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/listeners/SpawnPacketHandler.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/listeners/SpawnPacketHandler.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.backends.server.renderer.network.listeners;
+package xyz.nifeather.morph.backends.server.renderer.network.listeners;
 
 import com.comphenix.protocol.PacketType;
 import com.comphenix.protocol.ProtocolLibrary;
@@ -16,14 +16,14 @@
 import org.bukkit.entity.Player;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.backends.server.renderer.network.DisplayParameters;
-import xiamomc.morph.backends.server.renderer.network.datawatcher.watchers.SingleWatcher;
-import xiamomc.morph.backends.server.renderer.network.datawatcher.watchers.types.PlayerWatcher;
-import xiamomc.morph.backends.server.renderer.network.registries.CustomEntries;
-import xiamomc.morph.backends.server.renderer.network.registries.RenderRegistry;
-import xiamomc.morph.backends.server.renderer.utilties.WatcherUtils;
-import xiamomc.morph.misc.NmsRecord;
-import xiamomc.morph.misc.skins.PlayerSkinProvider;
+import xyz.nifeather.morph.backends.server.renderer.network.DisplayParameters;
+import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers.SingleWatcher;
+import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers.types.PlayerWatcher;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.CustomEntries;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.RenderRegistry;
+import xyz.nifeather.morph.backends.server.renderer.utilties.WatcherUtils;
+import xyz.nifeather.morph.misc.NmsRecord;
+import xyz.nifeather.morph.misc.skins.PlayerSkinProvider;
 import xiamomc.pluginbase.Annotations.Resolved;
 import xiamomc.pluginbase.Exceptions.NullDependencyException;
 
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/queue/PacketQueue.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/queue/PacketQueue.java
similarity index 95%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/queue/PacketQueue.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/queue/PacketQueue.java
index d77c2d24..3bb4a292 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/queue/PacketQueue.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/queue/PacketQueue.java
@@ -1,11 +1,11 @@
-package xiamomc.morph.backends.server.renderer.network.queue;
+package xyz.nifeather.morph.backends.server.renderer.network.queue;
 
 import com.comphenix.protocol.ProtocolLibrary;
 import com.comphenix.protocol.ProtocolManager;
 import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
 import org.bukkit.entity.Player;
-import xiamomc.morph.MorphPluginObject;
+import xyz.nifeather.morph.MorphPluginObject;
 import xiamomc.pluginbase.Annotations.Initializer;
 
 import java.util.List;
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/queue/QueueEntry.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/queue/QueueEntry.java
similarity index 94%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/queue/QueueEntry.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/queue/QueueEntry.java
index 67f1c3c2..7134802b 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/queue/QueueEntry.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/queue/QueueEntry.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.backends.server.renderer.network.queue;
+package xyz.nifeather.morph.backends.server.renderer.network.queue;
 
 import com.comphenix.protocol.ProtocolManager;
 import com.comphenix.protocol.events.PacketContainer;
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/registries/CustomEntries.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/registries/CustomEntries.java
similarity index 93%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/registries/CustomEntries.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/registries/CustomEntries.java
index 747acd86..ecf4df7b 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/registries/CustomEntries.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/registries/CustomEntries.java
@@ -1,8 +1,8 @@
-package xiamomc.morph.backends.server.renderer.network.registries;
+package xyz.nifeather.morph.backends.server.renderer.network.registries;
 
 import com.mojang.authlib.GameProfile;
 import net.minecraft.Util;
-import xiamomc.morph.misc.DisguiseEquipment;
+import xyz.nifeather.morph.misc.DisguiseEquipment;
 
 import java.util.UUID;
 
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/registries/RegisterParameters.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/registries/RegisterParameters.java
similarity index 60%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/registries/RegisterParameters.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/registries/RegisterParameters.java
index c54d11de..8facedf5 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/registries/RegisterParameters.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/registries/RegisterParameters.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.backends.server.renderer.network.registries;
+package xyz.nifeather.morph.backends.server.renderer.network.registries;
 
 import org.bukkit.entity.EntityType;
 
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/registries/RegistryKey.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/registries/RegistryKey.java
similarity index 92%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/registries/RegistryKey.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/registries/RegistryKey.java
index d3d1f3b5..52c241a8 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/registries/RegistryKey.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/registries/RegistryKey.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.backends.server.renderer.network.registries;
+package xyz.nifeather.morph.backends.server.renderer.network.registries;
 
 public class RegistryKey<T>
 {
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/registries/RenderRegistry.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/registries/RenderRegistry.java
similarity index 94%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/registries/RenderRegistry.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/registries/RenderRegistry.java
index 7e275019..a1e2d10d 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/registries/RenderRegistry.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/registries/RenderRegistry.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.backends.server.renderer.network.registries;
+package xyz.nifeather.morph.backends.server.renderer.network.registries;
 
 import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
@@ -7,10 +7,10 @@
 import org.bukkit.entity.Player;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.MorphPluginObject;
-import xiamomc.morph.backends.server.renderer.network.datawatcher.watchers.SingleWatcher;
-import xiamomc.morph.config.ConfigOption;
-import xiamomc.morph.config.MorphConfigManager;
+import xyz.nifeather.morph.MorphPluginObject;
+import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers.SingleWatcher;
+import xyz.nifeather.morph.config.ConfigOption;
+import xyz.nifeather.morph.config.MorphConfigManager;
 import xiamomc.pluginbase.Annotations.Resolved;
 import xiamomc.pluginbase.Bindables.Bindable;
 
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/registries/ValueIndex.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/registries/ValueIndex.java
similarity index 90%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/registries/ValueIndex.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/registries/ValueIndex.java
index 4106654d..26f52900 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/registries/ValueIndex.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/registries/ValueIndex.java
@@ -1,12 +1,10 @@
-package xiamomc.morph.backends.server.renderer.network.registries;
+package xyz.nifeather.morph.backends.server.renderer.network.registries;
 
-import org.bukkit.entity.EntityType;
-import org.jetbrains.annotations.NotNull;
 import xiamomc.morph.backends.server.renderer.network.datawatcher.values.*;
 import xiamomc.morph.backends.server.renderer.network.datawatcher.values.basetypes.*;
-
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
+import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values.*;
+import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values.basetypes.*;
+import xyz.nifeather.morph.morph.backends.server.renderer.network.datawatcher.values.basetypes.*;
 
 public class ValueIndex
 {
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/network/registries/WatcherIndex.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/registries/WatcherIndex.java
similarity index 77%
rename from src/main/java/xiamomc/morph/backends/server/renderer/network/registries/WatcherIndex.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/registries/WatcherIndex.java
index e35d1e9a..a78f254e 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/network/registries/WatcherIndex.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/registries/WatcherIndex.java
@@ -1,18 +1,19 @@
-package xiamomc.morph.backends.server.renderer.network.registries;
+package xyz.nifeather.morph.backends.server.renderer.network.registries;
 
 import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
 import org.bukkit.entity.EntityType;
 import org.bukkit.entity.Player;
-import xiamomc.morph.backends.server.renderer.network.datawatcher.watchers.SingleWatcher;
+import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers.SingleWatcher;
 import xiamomc.morph.backends.server.renderer.network.datawatcher.watchers.types.*;
-import xiamomc.morph.backends.server.renderer.network.datawatcher.watchers.types.horses.AbstractHorseWatcher;
-import xiamomc.morph.backends.server.renderer.network.datawatcher.watchers.types.horses.HorseWatcher;
-import xiamomc.morph.backends.server.renderer.network.datawatcher.watchers.types.horses.SkeletonHorseWatcher;
-import xiamomc.morph.backends.server.renderer.network.datawatcher.watchers.types.horses.ZombieHorseWatcher;
-import xiamomc.morph.backends.server.renderer.network.datawatcher.watchers.types.llama.LlamaWatcher;
-import xiamomc.morph.backends.server.renderer.network.datawatcher.watchers.types.llama.TraderLlamaWatcher;
-import xiamomc.morph.backends.server.renderer.network.datawatcher.watchers.types.slimemagma.MagmaWatcher;
-import xiamomc.morph.backends.server.renderer.network.datawatcher.watchers.types.slimemagma.SlimeWatcher;
+import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers.types.*;
+import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers.types.horses.AbstractHorseWatcher;
+import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers.types.horses.HorseWatcher;
+import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers.types.horses.SkeletonHorseWatcher;
+import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers.types.horses.ZombieHorseWatcher;
+import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers.types.llama.LlamaWatcher;
+import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers.types.llama.TraderLlamaWatcher;
+import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers.types.slimemagma.MagmaWatcher;
+import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers.types.slimemagma.SlimeWatcher;
 
 import java.util.Map;
 import java.util.function.Function;
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/utilties/HolderUtils.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/utilties/HolderUtils.java
similarity index 94%
rename from src/main/java/xiamomc/morph/backends/server/renderer/utilties/HolderUtils.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/utilties/HolderUtils.java
index 6c43f566..69740a83 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/utilties/HolderUtils.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/utilties/HolderUtils.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.backends.server.renderer.utilties;
+package xyz.nifeather.morph.backends.server.renderer.utilties;
 
 import net.minecraft.core.Holder;
 import net.minecraft.core.Registry;
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/utilties/ProtocolRegistryUtils.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/utilties/ProtocolRegistryUtils.java
similarity index 89%
rename from src/main/java/xiamomc/morph/backends/server/renderer/utilties/ProtocolRegistryUtils.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/utilties/ProtocolRegistryUtils.java
index 0911d201..c210f0b0 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/utilties/ProtocolRegistryUtils.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/utilties/ProtocolRegistryUtils.java
@@ -1,10 +1,10 @@
-package xiamomc.morph.backends.server.renderer.utilties;
+package xyz.nifeather.morph.backends.server.renderer.utilties;
 
 import com.comphenix.protocol.wrappers.WrappedDataWatcher;
 import net.minecraft.core.BlockPos;
 import net.minecraft.network.chat.Component;
-import xiamomc.morph.MorphPlugin;
-import xiamomc.morph.backends.server.renderer.network.datawatcher.values.SingleValue;
+import xyz.nifeather.morph.MorphPlugin;
+import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values.SingleValue;
 
 import java.util.Optional;
 
diff --git a/src/main/java/xiamomc/morph/backends/server/renderer/utilties/WatcherUtils.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/utilties/WatcherUtils.java
similarity index 84%
rename from src/main/java/xiamomc/morph/backends/server/renderer/utilties/WatcherUtils.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/utilties/WatcherUtils.java
index 8b2e376f..7382839f 100644
--- a/src/main/java/xiamomc/morph/backends/server/renderer/utilties/WatcherUtils.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/utilties/WatcherUtils.java
@@ -1,10 +1,10 @@
-package xiamomc.morph.backends.server.renderer.utilties;
+package xyz.nifeather.morph.backends.server.renderer.utilties;
 
 import net.minecraft.nbt.CompoundTag;
 import net.minecraft.world.level.GameType;
 import org.bukkit.entity.Player;
-import xiamomc.morph.backends.server.renderer.network.datawatcher.watchers.SingleWatcher;
-import xiamomc.morph.misc.NmsRecord;
+import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers.SingleWatcher;
+import xyz.nifeather.morph.misc.NmsRecord;
 
 import java.util.List;
 
diff --git a/src/main/java/xiamomc/morph/commands/AnimationCommand.java b/src/main/java/xyz/nifeather/morph/commands/AnimationCommand.java
similarity index 88%
rename from src/main/java/xiamomc/morph/commands/AnimationCommand.java
rename to src/main/java/xyz/nifeather/morph/commands/AnimationCommand.java
index 715df5d2..b2093d45 100644
--- a/src/main/java/xiamomc/morph/commands/AnimationCommand.java
+++ b/src/main/java/xyz/nifeather/morph/commands/AnimationCommand.java
@@ -1,16 +1,16 @@
-package xiamomc.morph.commands;
+package xyz.nifeather.morph.commands;
 
 import org.bukkit.command.Command;
 import org.bukkit.command.CommandSender;
 import org.bukkit.entity.Player;
 import org.jetbrains.annotations.NotNull;
-import xiamomc.morph.MorphManager;
-import xiamomc.morph.MorphPluginObject;
-import xiamomc.morph.messages.CommandStrings;
-import xiamomc.morph.messages.EmoteStrings;
-import xiamomc.morph.messages.HelpStrings;
-import xiamomc.morph.messages.MessageUtils;
-import xiamomc.morph.misc.gui.AnimSelectScreenWrapper;
+import xyz.nifeather.morph.MorphManager;
+import xyz.nifeather.morph.MorphPluginObject;
+import xyz.nifeather.morph.messages.CommandStrings;
+import xyz.nifeather.morph.messages.EmoteStrings;
+import xyz.nifeather.morph.messages.HelpStrings;
+import xyz.nifeather.morph.messages.MessageUtils;
+import xyz.nifeather.morph.misc.gui.AnimSelectScreenWrapper;
 import xiamomc.pluginbase.Annotations.Resolved;
 import xiamomc.pluginbase.Command.IPluginCommand;
 import xiamomc.pluginbase.Messages.FormattableMessage;
diff --git a/src/main/java/xiamomc/morph/commands/MorphCommand.java b/src/main/java/xyz/nifeather/morph/commands/MorphCommand.java
similarity index 87%
rename from src/main/java/xiamomc/morph/commands/MorphCommand.java
rename to src/main/java/xyz/nifeather/morph/commands/MorphCommand.java
index 0dfb1dce..a0a39924 100644
--- a/src/main/java/xiamomc/morph/commands/MorphCommand.java
+++ b/src/main/java/xyz/nifeather/morph/commands/MorphCommand.java
@@ -1,16 +1,16 @@
-package xiamomc.morph.commands;
+package xyz.nifeather.morph.commands;
 
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
 import org.bukkit.command.Command;
 import org.bukkit.command.CommandSender;
 import org.bukkit.entity.Player;
 import org.jetbrains.annotations.NotNull;
-import xiamomc.morph.MorphManager;
-import xiamomc.morph.MorphPluginObject;
-import xiamomc.morph.messages.HelpStrings;
-import xiamomc.morph.messages.MessageUtils;
-import xiamomc.morph.messages.MorphStrings;
-import xiamomc.morph.misc.gui.DisguiseSelectScreenWrapper;
+import xyz.nifeather.morph.MorphManager;
+import xyz.nifeather.morph.MorphPluginObject;
+import xyz.nifeather.morph.messages.HelpStrings;
+import xyz.nifeather.morph.messages.MessageUtils;
+import xyz.nifeather.morph.messages.MorphStrings;
+import xyz.nifeather.morph.misc.gui.DisguiseSelectScreenWrapper;
 import xiamomc.pluginbase.Annotations.Resolved;
 import xiamomc.pluginbase.Command.IPluginCommand;
 import xiamomc.pluginbase.Messages.FormattableMessage;
diff --git a/src/main/java/xiamomc/morph/commands/MorphCommandManager.java b/src/main/java/xyz/nifeather/morph/commands/MorphCommandManager.java
similarity index 96%
rename from src/main/java/xiamomc/morph/commands/MorphCommandManager.java
rename to src/main/java/xyz/nifeather/morph/commands/MorphCommandManager.java
index 60d9aa79..d6f4fe5f 100644
--- a/src/main/java/xiamomc/morph/commands/MorphCommandManager.java
+++ b/src/main/java/xyz/nifeather/morph/commands/MorphCommandManager.java
@@ -1,8 +1,8 @@
-package xiamomc.morph.commands;
+package xyz.nifeather.morph.commands;
 
 import it.unimi.dsi.fastutil.objects.ObjectList;
 import org.bukkit.Bukkit;
-import xiamomc.morph.MorphPlugin;
+import xyz.nifeather.morph.MorphPlugin;
 import xiamomc.pluginbase.Annotations.Resolved;
 import xiamomc.pluginbase.Command.CommandHelper;
 import xiamomc.pluginbase.Command.IPluginCommand;
diff --git a/src/main/java/xiamomc/morph/commands/MorphPlayerCommand.java b/src/main/java/xyz/nifeather/morph/commands/MorphPlayerCommand.java
similarity index 88%
rename from src/main/java/xiamomc/morph/commands/MorphPlayerCommand.java
rename to src/main/java/xyz/nifeather/morph/commands/MorphPlayerCommand.java
index d63f9f29..639e4328 100644
--- a/src/main/java/xiamomc/morph/commands/MorphPlayerCommand.java
+++ b/src/main/java/xyz/nifeather/morph/commands/MorphPlayerCommand.java
@@ -1,15 +1,15 @@
-package xiamomc.morph.commands;
+package xyz.nifeather.morph.commands;
 
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
 import org.bukkit.command.Command;
 import org.bukkit.command.CommandSender;
 import org.bukkit.entity.Player;
 import org.jetbrains.annotations.NotNull;
-import xiamomc.morph.MorphManager;
-import xiamomc.morph.MorphPluginObject;
-import xiamomc.morph.messages.HelpStrings;
-import xiamomc.morph.misc.DisguiseMeta;
-import xiamomc.morph.misc.DisguiseTypes;
+import xyz.nifeather.morph.MorphManager;
+import xyz.nifeather.morph.MorphPluginObject;
+import xyz.nifeather.morph.messages.HelpStrings;
+import xyz.nifeather.morph.misc.DisguiseMeta;
+import xyz.nifeather.morph.misc.DisguiseTypes;
 import xiamomc.pluginbase.Annotations.Resolved;
 import xiamomc.pluginbase.Command.IPluginCommand;
 import xiamomc.pluginbase.Messages.FormattableMessage;
diff --git a/src/main/java/xiamomc/morph/commands/MorphPluginCommand.java b/src/main/java/xyz/nifeather/morph/commands/MorphPluginCommand.java
similarity index 87%
rename from src/main/java/xiamomc/morph/commands/MorphPluginCommand.java
rename to src/main/java/xyz/nifeather/morph/commands/MorphPluginCommand.java
index 92adccf3..b341e45b 100644
--- a/src/main/java/xiamomc/morph/commands/MorphPluginCommand.java
+++ b/src/main/java/xyz/nifeather/morph/commands/MorphPluginCommand.java
@@ -1,9 +1,10 @@
-package xiamomc.morph.commands;
+package xyz.nifeather.morph.commands;
 
 import it.unimi.dsi.fastutil.objects.ObjectList;
-import xiamomc.morph.commands.subcommands.MorphSubCommandHandler;
+import xyz.nifeather.morph.commands.subcommands.MorphSubCommandHandler;
 import xiamomc.morph.commands.subcommands.plugin.*;
-import xiamomc.morph.messages.HelpStrings;
+import xyz.nifeather.morph.commands.subcommands.plugin.*;
+import xyz.nifeather.morph.messages.HelpStrings;
 import xiamomc.pluginbase.Command.ISubCommand;
 import xiamomc.pluginbase.Messages.FormattableMessage;
 
diff --git a/src/main/java/xiamomc/morph/commands/MorphTabCompleter.java b/src/main/java/xyz/nifeather/morph/commands/MorphTabCompleter.java
similarity index 97%
rename from src/main/java/xiamomc/morph/commands/MorphTabCompleter.java
rename to src/main/java/xyz/nifeather/morph/commands/MorphTabCompleter.java
index 2e10841a..b7cdcf94 100644
--- a/src/main/java/xiamomc/morph/commands/MorphTabCompleter.java
+++ b/src/main/java/xyz/nifeather/morph/commands/MorphTabCompleter.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.commands;
+package xyz.nifeather.morph.commands;
 
 import org.bukkit.command.Command;
 import org.bukkit.command.CommandSender;
diff --git a/src/main/java/xiamomc/morph/commands/RequestCommand.java b/src/main/java/xyz/nifeather/morph/commands/RequestCommand.java
similarity index 73%
rename from src/main/java/xiamomc/morph/commands/RequestCommand.java
rename to src/main/java/xyz/nifeather/morph/commands/RequestCommand.java
index 3e8fd883..ca95eec0 100644
--- a/src/main/java/xiamomc/morph/commands/RequestCommand.java
+++ b/src/main/java/xyz/nifeather/morph/commands/RequestCommand.java
@@ -1,11 +1,11 @@
-package xiamomc.morph.commands;
+package xyz.nifeather.morph.commands;
 
 import it.unimi.dsi.fastutil.objects.ObjectList;
-import xiamomc.morph.commands.subcommands.MorphSubCommandHandler;
-import xiamomc.morph.commands.subcommands.request.AcceptSubCommand;
-import xiamomc.morph.commands.subcommands.request.DenySubCommand;
-import xiamomc.morph.commands.subcommands.request.SendSubCommand;
-import xiamomc.morph.messages.HelpStrings;
+import xyz.nifeather.morph.commands.subcommands.MorphSubCommandHandler;
+import xyz.nifeather.morph.commands.subcommands.request.AcceptSubCommand;
+import xyz.nifeather.morph.commands.subcommands.request.DenySubCommand;
+import xyz.nifeather.morph.commands.subcommands.request.SendSubCommand;
+import xyz.nifeather.morph.messages.HelpStrings;
 import xiamomc.pluginbase.Command.ISubCommand;
 import xiamomc.pluginbase.Messages.FormattableMessage;
 
diff --git a/src/main/java/xiamomc/morph/commands/UnMorphCommand.java b/src/main/java/xyz/nifeather/morph/commands/UnMorphCommand.java
similarity index 81%
rename from src/main/java/xiamomc/morph/commands/UnMorphCommand.java
rename to src/main/java/xyz/nifeather/morph/commands/UnMorphCommand.java
index 49cdc8c1..8a8e6c81 100644
--- a/src/main/java/xiamomc/morph/commands/UnMorphCommand.java
+++ b/src/main/java/xyz/nifeather/morph/commands/UnMorphCommand.java
@@ -1,13 +1,13 @@
-package xiamomc.morph.commands;
+package xyz.nifeather.morph.commands;
 
 import org.bukkit.command.Command;
 import org.bukkit.command.CommandSender;
 import org.bukkit.entity.Player;
 import org.jetbrains.annotations.NotNull;
-import xiamomc.morph.MorphManager;
-import xiamomc.morph.MorphPluginObject;
-import xiamomc.morph.messages.HelpStrings;
-import xiamomc.morph.misc.permissions.CommonPermissions;
+import xyz.nifeather.morph.MorphManager;
+import xyz.nifeather.morph.MorphPluginObject;
+import xyz.nifeather.morph.messages.HelpStrings;
+import xyz.nifeather.morph.misc.permissions.CommonPermissions;
 import xiamomc.pluginbase.Annotations.Resolved;
 import xiamomc.pluginbase.Command.IPluginCommand;
 import xiamomc.pluginbase.Messages.FormattableMessage;
diff --git a/src/main/java/xiamomc/morph/commands/subcommands/MorphSubCommandHandler.java b/src/main/java/xyz/nifeather/morph/commands/subcommands/MorphSubCommandHandler.java
similarity index 79%
rename from src/main/java/xiamomc/morph/commands/subcommands/MorphSubCommandHandler.java
rename to src/main/java/xyz/nifeather/morph/commands/subcommands/MorphSubCommandHandler.java
index 9acb1613..a39735d7 100644
--- a/src/main/java/xiamomc/morph/commands/subcommands/MorphSubCommandHandler.java
+++ b/src/main/java/xyz/nifeather/morph/commands/subcommands/MorphSubCommandHandler.java
@@ -1,11 +1,11 @@
-package xiamomc.morph.commands.subcommands;
+package xyz.nifeather.morph.commands.subcommands;
 
 import org.bukkit.command.Command;
 import org.bukkit.command.CommandSender;
 import org.jetbrains.annotations.NotNull;
-import xiamomc.morph.MorphPlugin;
-import xiamomc.morph.messages.CommonStrings;
-import xiamomc.morph.messages.MessageUtils;
+import xyz.nifeather.morph.MorphPlugin;
+import xyz.nifeather.morph.messages.CommonStrings;
+import xyz.nifeather.morph.messages.MessageUtils;
 import xiamomc.pluginbase.Command.SubCommandHandler;
 
 public abstract class MorphSubCommandHandler extends SubCommandHandler<MorphPlugin>
diff --git a/src/main/java/xiamomc/morph/commands/subcommands/SubCommandGenerator.java b/src/main/java/xyz/nifeather/morph/commands/subcommands/SubCommandGenerator.java
similarity index 96%
rename from src/main/java/xiamomc/morph/commands/subcommands/SubCommandGenerator.java
rename to src/main/java/xyz/nifeather/morph/commands/subcommands/SubCommandGenerator.java
index 1ecc2de8..f1db2c1f 100644
--- a/src/main/java/xiamomc/morph/commands/subcommands/SubCommandGenerator.java
+++ b/src/main/java/xyz/nifeather/morph/commands/subcommands/SubCommandGenerator.java
@@ -1,9 +1,9 @@
-package xiamomc.morph.commands.subcommands;
+package xyz.nifeather.morph.commands.subcommands;
 
 import org.bukkit.command.CommandSender;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.MorphPluginObject;
+import xyz.nifeather.morph.MorphPluginObject;
 import xiamomc.pluginbase.Command.ISubCommand;
 import xiamomc.pluginbase.Messages.FormattableMessage;
 
diff --git a/src/main/java/xiamomc/morph/commands/subcommands/plugin/BackendSubCommand.java b/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/BackendSubCommand.java
similarity index 84%
rename from src/main/java/xiamomc/morph/commands/subcommands/plugin/BackendSubCommand.java
rename to src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/BackendSubCommand.java
index c3218400..c7b85d18 100644
--- a/src/main/java/xiamomc/morph/commands/subcommands/plugin/BackendSubCommand.java
+++ b/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/BackendSubCommand.java
@@ -1,16 +1,16 @@
-package xiamomc.morph.commands.subcommands.plugin;
+package xyz.nifeather.morph.commands.subcommands.plugin;
 
 import org.bukkit.command.CommandSender;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.MorphManager;
-import xiamomc.morph.MorphPlugin;
-import xiamomc.morph.MorphPluginObject;
-import xiamomc.morph.backends.DisguiseBackend;
-import xiamomc.morph.messages.BackendStrings;
-import xiamomc.morph.messages.CommandStrings;
-import xiamomc.morph.messages.MessageUtils;
-import xiamomc.morph.misc.permissions.CommonPermissions;
+import xyz.nifeather.morph.MorphManager;
+import xyz.nifeather.morph.MorphPlugin;
+import xyz.nifeather.morph.MorphPluginObject;
+import xyz.nifeather.morph.backends.DisguiseBackend;
+import xyz.nifeather.morph.messages.BackendStrings;
+import xyz.nifeather.morph.messages.CommandStrings;
+import xyz.nifeather.morph.messages.MessageUtils;
+import xyz.nifeather.morph.misc.permissions.CommonPermissions;
 import xiamomc.pluginbase.Annotations.Resolved;
 import xiamomc.pluginbase.Command.ISubCommand;
 import xiamomc.pluginbase.Messages.FormattableMessage;
diff --git a/src/main/java/xiamomc/morph/commands/subcommands/plugin/CheckUpdateSubCommand.java b/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/CheckUpdateSubCommand.java
similarity index 83%
rename from src/main/java/xiamomc/morph/commands/subcommands/plugin/CheckUpdateSubCommand.java
rename to src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/CheckUpdateSubCommand.java
index cdd9f441..39067373 100644
--- a/src/main/java/xiamomc/morph/commands/subcommands/plugin/CheckUpdateSubCommand.java
+++ b/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/CheckUpdateSubCommand.java
@@ -1,14 +1,14 @@
-package xiamomc.morph.commands.subcommands.plugin;
+package xyz.nifeather.morph.commands.subcommands.plugin;
 
 import org.bukkit.Bukkit;
 import org.bukkit.command.CommandSender;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.MorphPluginObject;
-import xiamomc.morph.messages.MessageUtils;
-import xiamomc.morph.messages.UpdateStrings;
-import xiamomc.morph.misc.permissions.CommonPermissions;
-import xiamomc.morph.updates.UpdateHandler;
+import xyz.nifeather.morph.MorphPluginObject;
+import xyz.nifeather.morph.messages.MessageUtils;
+import xyz.nifeather.morph.messages.UpdateStrings;
+import xyz.nifeather.morph.misc.permissions.CommonPermissions;
+import xyz.nifeather.morph.updates.UpdateHandler;
 import xiamomc.pluginbase.Annotations.Resolved;
 import xiamomc.pluginbase.Command.ISubCommand;
 import xiamomc.pluginbase.Messages.FormattableMessage;
diff --git a/src/main/java/xiamomc/morph/commands/subcommands/plugin/DisguiseManageSubCommand.java b/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/DisguiseManageSubCommand.java
similarity index 67%
rename from src/main/java/xiamomc/morph/commands/subcommands/plugin/DisguiseManageSubCommand.java
rename to src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/DisguiseManageSubCommand.java
index 32965772..3bd77ea3 100644
--- a/src/main/java/xiamomc/morph/commands/subcommands/plugin/DisguiseManageSubCommand.java
+++ b/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/DisguiseManageSubCommand.java
@@ -1,14 +1,14 @@
-package xiamomc.morph.commands.subcommands.plugin;
+package xyz.nifeather.morph.commands.subcommands.plugin;
 
 import it.unimi.dsi.fastutil.objects.ObjectList;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.MorphPluginObject;
-import xiamomc.morph.commands.subcommands.plugin.management.ForceMorphSubCommand;
-import xiamomc.morph.commands.subcommands.plugin.management.ForceUnmorphSubCommand;
-import xiamomc.morph.commands.subcommands.plugin.management.GrantDisguiseSubCommand;
-import xiamomc.morph.commands.subcommands.plugin.management.RevokeDisguiseSubCommand;
-import xiamomc.morph.messages.HelpStrings;
+import xyz.nifeather.morph.MorphPluginObject;
+import xyz.nifeather.morph.commands.subcommands.plugin.management.ForceMorphSubCommand;
+import xyz.nifeather.morph.commands.subcommands.plugin.management.ForceUnmorphSubCommand;
+import xyz.nifeather.morph.commands.subcommands.plugin.management.GrantDisguiseSubCommand;
+import xyz.nifeather.morph.commands.subcommands.plugin.management.RevokeDisguiseSubCommand;
+import xyz.nifeather.morph.messages.HelpStrings;
 import xiamomc.pluginbase.Command.ISubCommand;
 import xiamomc.pluginbase.Messages.FormattableMessage;
 
diff --git a/src/main/java/xiamomc/morph/commands/subcommands/plugin/HelpSubCommand.java b/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/HelpSubCommand.java
similarity index 94%
rename from src/main/java/xiamomc/morph/commands/subcommands/plugin/HelpSubCommand.java
rename to src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/HelpSubCommand.java
index cb4fd26d..09224af7 100644
--- a/src/main/java/xiamomc/morph/commands/subcommands/plugin/HelpSubCommand.java
+++ b/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/HelpSubCommand.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.commands.subcommands.plugin;
+package xyz.nifeather.morph.commands.subcommands.plugin;
 
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
 import it.unimi.dsi.fastutil.objects.ObjectList;
@@ -9,12 +9,12 @@
 import org.bukkit.command.CommandSender;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.MorphPluginObject;
-import xiamomc.morph.commands.MorphCommandManager;
-import xiamomc.morph.commands.subcommands.plugin.helpsections.Entry;
-import xiamomc.morph.commands.subcommands.plugin.helpsections.Section;
-import xiamomc.morph.messages.HelpStrings;
-import xiamomc.morph.messages.MessageUtils;
+import xyz.nifeather.morph.MorphPluginObject;
+import xyz.nifeather.morph.commands.MorphCommandManager;
+import xyz.nifeather.morph.commands.subcommands.plugin.helpsections.Entry;
+import xyz.nifeather.morph.commands.subcommands.plugin.helpsections.Section;
+import xyz.nifeather.morph.messages.HelpStrings;
+import xyz.nifeather.morph.messages.MessageUtils;
 import xiamomc.pluginbase.Annotations.Initializer;
 import xiamomc.pluginbase.Annotations.Resolved;
 import xiamomc.pluginbase.Command.ISubCommand;
diff --git a/src/main/java/xiamomc/morph/commands/subcommands/plugin/LookupSubCommand.java b/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/LookupSubCommand.java
similarity index 86%
rename from src/main/java/xiamomc/morph/commands/subcommands/plugin/LookupSubCommand.java
rename to src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/LookupSubCommand.java
index b47876e6..240cb12f 100644
--- a/src/main/java/xiamomc/morph/commands/subcommands/plugin/LookupSubCommand.java
+++ b/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/LookupSubCommand.java
@@ -1,14 +1,14 @@
-package xiamomc.morph.commands.subcommands.plugin;
+package xyz.nifeather.morph.commands.subcommands.plugin;
 
 import org.bukkit.Bukkit;
 import org.bukkit.command.CommandSender;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.MorphManager;
-import xiamomc.morph.MorphPluginObject;
-import xiamomc.morph.messages.CommandStrings;
-import xiamomc.morph.messages.MessageUtils;
-import xiamomc.morph.misc.permissions.CommonPermissions;
+import xyz.nifeather.morph.MorphManager;
+import xyz.nifeather.morph.MorphPluginObject;
+import xyz.nifeather.morph.messages.CommandStrings;
+import xyz.nifeather.morph.messages.MessageUtils;
+import xyz.nifeather.morph.misc.permissions.CommonPermissions;
 import xiamomc.pluginbase.Annotations.Resolved;
 import xiamomc.pluginbase.Command.ISubCommand;
 import xiamomc.pluginbase.Messages.FormattableMessage;
diff --git a/src/main/java/xiamomc/morph/commands/subcommands/plugin/MakeSkillItemSubCommand.java b/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/MakeSkillItemSubCommand.java
similarity index 84%
rename from src/main/java/xiamomc/morph/commands/subcommands/plugin/MakeSkillItemSubCommand.java
rename to src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/MakeSkillItemSubCommand.java
index a8e320f3..bb71bab4 100644
--- a/src/main/java/xiamomc/morph/commands/subcommands/plugin/MakeSkillItemSubCommand.java
+++ b/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/MakeSkillItemSubCommand.java
@@ -1,14 +1,14 @@
-package xiamomc.morph.commands.subcommands.plugin;
+package xyz.nifeather.morph.commands.subcommands.plugin;
 
 import org.bukkit.command.CommandSender;
 import org.bukkit.entity.Player;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.MorphPluginObject;
-import xiamomc.morph.messages.CommandStrings;
-import xiamomc.morph.messages.MessageUtils;
-import xiamomc.morph.misc.permissions.CommonPermissions;
-import xiamomc.morph.utilities.ItemUtils;
+import xyz.nifeather.morph.MorphPluginObject;
+import xyz.nifeather.morph.messages.CommandStrings;
+import xyz.nifeather.morph.messages.MessageUtils;
+import xyz.nifeather.morph.misc.permissions.CommonPermissions;
+import xyz.nifeather.morph.utilities.ItemUtils;
 import xiamomc.pluginbase.Command.ISubCommand;
 import xiamomc.pluginbase.Messages.FormattableMessage;
 
diff --git a/src/main/java/xiamomc/morph/commands/subcommands/plugin/OptionSubCommand.java b/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/OptionSubCommand.java
similarity index 96%
rename from src/main/java/xiamomc/morph/commands/subcommands/plugin/OptionSubCommand.java
rename to src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/OptionSubCommand.java
index 43d41763..bc6c1c90 100644
--- a/src/main/java/xiamomc/morph/commands/subcommands/plugin/OptionSubCommand.java
+++ b/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/OptionSubCommand.java
@@ -1,16 +1,17 @@
-package xiamomc.morph.commands.subcommands.plugin;
+package xyz.nifeather.morph.commands.subcommands.plugin;
 
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.MorphPluginObject;
-import xiamomc.morph.commands.subcommands.SubCommandGenerator;
-import xiamomc.morph.config.ConfigOption;
-import xiamomc.morph.config.MorphConfigManager;
-import xiamomc.morph.events.InteractionMirrorProcessor;
+import xyz.nifeather.morph.MorphPluginObject;
+import xyz.nifeather.morph.commands.subcommands.SubCommandGenerator;
+import xyz.nifeather.morph.config.ConfigOption;
+import xyz.nifeather.morph.config.MorphConfigManager;
+import xyz.nifeather.morph.events.InteractionMirrorProcessor;
 import xiamomc.morph.messages.*;
-import xiamomc.morph.misc.permissions.CommonPermissions;
-import xiamomc.morph.utilities.BindableUtils;
+import xyz.nifeather.morph.messages.*;
+import xyz.nifeather.morph.misc.permissions.CommonPermissions;
+import xyz.nifeather.morph.utilities.BindableUtils;
 import xiamomc.pluginbase.Annotations.Resolved;
 import xiamomc.pluginbase.Command.ISubCommand;
 import xiamomc.pluginbase.Exceptions.NullDependencyException;
diff --git a/src/main/java/xiamomc/morph/commands/subcommands/plugin/QueryAllSubCommand.java b/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/QueryAllSubCommand.java
similarity index 89%
rename from src/main/java/xiamomc/morph/commands/subcommands/plugin/QueryAllSubCommand.java
rename to src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/QueryAllSubCommand.java
index 9cfd76fa..8a9215ed 100644
--- a/src/main/java/xiamomc/morph/commands/subcommands/plugin/QueryAllSubCommand.java
+++ b/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/QueryAllSubCommand.java
@@ -1,12 +1,12 @@
-package xiamomc.morph.commands.subcommands.plugin;
+package xyz.nifeather.morph.commands.subcommands.plugin;
 
 import org.bukkit.command.CommandSender;
 import org.jetbrains.annotations.NotNull;
-import xiamomc.morph.MorphManager;
-import xiamomc.morph.MorphPluginObject;
-import xiamomc.morph.messages.CommandStrings;
-import xiamomc.morph.messages.HelpStrings;
-import xiamomc.morph.messages.MessageUtils;
+import xyz.nifeather.morph.MorphManager;
+import xyz.nifeather.morph.MorphPluginObject;
+import xyz.nifeather.morph.messages.CommandStrings;
+import xyz.nifeather.morph.messages.HelpStrings;
+import xyz.nifeather.morph.messages.MessageUtils;
 import xiamomc.pluginbase.Annotations.Resolved;
 import xiamomc.pluginbase.Command.ISubCommand;
 import xiamomc.pluginbase.Messages.FormattableMessage;
diff --git a/src/main/java/xiamomc/morph/commands/subcommands/plugin/QuerySubCommand.java b/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/QuerySubCommand.java
similarity index 90%
rename from src/main/java/xiamomc/morph/commands/subcommands/plugin/QuerySubCommand.java
rename to src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/QuerySubCommand.java
index d69b3042..b7dfebf6 100644
--- a/src/main/java/xiamomc/morph/commands/subcommands/plugin/QuerySubCommand.java
+++ b/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/QuerySubCommand.java
@@ -1,15 +1,15 @@
-package xiamomc.morph.commands.subcommands.plugin;
+package xyz.nifeather.morph.commands.subcommands.plugin;
 
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
 import org.bukkit.Bukkit;
 import org.bukkit.command.CommandSender;
 import org.bukkit.entity.Player;
 import org.jetbrains.annotations.NotNull;
-import xiamomc.morph.MorphManager;
-import xiamomc.morph.MorphPluginObject;
-import xiamomc.morph.messages.CommandStrings;
-import xiamomc.morph.messages.HelpStrings;
-import xiamomc.morph.messages.MessageUtils;
+import xyz.nifeather.morph.MorphManager;
+import xyz.nifeather.morph.MorphPluginObject;
+import xyz.nifeather.morph.messages.CommandStrings;
+import xyz.nifeather.morph.messages.HelpStrings;
+import xyz.nifeather.morph.messages.MessageUtils;
 import xiamomc.pluginbase.Annotations.Resolved;
 import xiamomc.pluginbase.Command.ISubCommand;
 import xiamomc.pluginbase.Messages.FormattableMessage;
diff --git a/src/main/java/xiamomc/morph/commands/subcommands/plugin/ReloadSubCommand.java b/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/ReloadSubCommand.java
similarity index 80%
rename from src/main/java/xiamomc/morph/commands/subcommands/plugin/ReloadSubCommand.java
rename to src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/ReloadSubCommand.java
index 5258df58..0852c5c1 100644
--- a/src/main/java/xiamomc/morph/commands/subcommands/plugin/ReloadSubCommand.java
+++ b/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/ReloadSubCommand.java
@@ -1,22 +1,22 @@
-package xiamomc.morph.commands.subcommands.plugin;
+package xyz.nifeather.morph.commands.subcommands.plugin;
 
 import it.unimi.dsi.fastutil.objects.ObjectImmutableList;
 import org.bukkit.command.CommandSender;
 import org.jetbrains.annotations.NotNull;
-import xiamomc.morph.MorphManager;
-import xiamomc.morph.MorphPluginObject;
-import xiamomc.morph.config.MorphConfigManager;
-import xiamomc.morph.events.api.lifecycle.ConfigurationReloadEvent;
-import xiamomc.morph.messages.CommandStrings;
-import xiamomc.morph.messages.HelpStrings;
-import xiamomc.morph.messages.MessageUtils;
-import xiamomc.morph.messages.MorphMessageStore;
-import xiamomc.morph.messages.vanilla.VanillaMessageStore;
-import xiamomc.morph.misc.recipe.RecipeManager;
-import xiamomc.morph.misc.skins.PlayerSkinProvider;
-import xiamomc.morph.network.multiInstance.MultiInstanceService;
-import xiamomc.morph.network.server.MorphClientHandler;
-import xiamomc.morph.storage.skill.SkillAbilityConfigurationStore;
+import xyz.nifeather.morph.MorphManager;
+import xyz.nifeather.morph.MorphPluginObject;
+import xyz.nifeather.morph.config.MorphConfigManager;
+import xyz.nifeather.morph.events.api.lifecycle.ConfigurationReloadEvent;
+import xyz.nifeather.morph.messages.CommandStrings;
+import xyz.nifeather.morph.messages.HelpStrings;
+import xyz.nifeather.morph.messages.MessageUtils;
+import xyz.nifeather.morph.messages.MorphMessageStore;
+import xyz.nifeather.morph.messages.vanilla.VanillaMessageStore;
+import xyz.nifeather.morph.misc.recipe.RecipeManager;
+import xyz.nifeather.morph.misc.skins.PlayerSkinProvider;
+import xyz.nifeather.morph.network.multiInstance.MultiInstanceService;
+import xyz.nifeather.morph.network.server.MorphClientHandler;
+import xyz.nifeather.morph.storage.skill.SkillAbilityConfigurationStore;
 import xiamomc.pluginbase.Annotations.Resolved;
 import xiamomc.pluginbase.Command.ISubCommand;
 import xiamomc.pluginbase.Messages.FormattableMessage;
diff --git a/src/main/java/xiamomc/morph/commands/subcommands/plugin/SkinCacheSubCommand.java b/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/SkinCacheSubCommand.java
similarity index 95%
rename from src/main/java/xiamomc/morph/commands/subcommands/plugin/SkinCacheSubCommand.java
rename to src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/SkinCacheSubCommand.java
index bfae411b..d89fcd56 100644
--- a/src/main/java/xiamomc/morph/commands/subcommands/plugin/SkinCacheSubCommand.java
+++ b/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/SkinCacheSubCommand.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.commands.subcommands.plugin;
+package xyz.nifeather.morph.commands.subcommands.plugin;
 
 import com.destroystokyo.paper.profile.CraftPlayerProfile;
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
@@ -9,20 +9,20 @@
 import org.bukkit.entity.Player;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.MorphManager;
-import xiamomc.morph.MorphPluginObject;
-import xiamomc.morph.commands.subcommands.plugin.skincache.cmdTree.CommandBuilder;
-import xiamomc.morph.config.ConfigOption;
-import xiamomc.morph.config.MorphConfigManager;
-import xiamomc.morph.messages.CommandStrings;
-import xiamomc.morph.messages.MessageUtils;
-import xiamomc.morph.messages.SkinCacheStrings;
-import xiamomc.morph.misc.CapeURL;
-import xiamomc.morph.misc.DisguiseTypes;
-import xiamomc.morph.misc.MorphGameProfile;
-import xiamomc.morph.misc.MorphParameters;
-import xiamomc.morph.misc.permissions.CommonPermissions;
-import xiamomc.morph.misc.skins.PlayerSkinProvider;
+import xyz.nifeather.morph.MorphManager;
+import xyz.nifeather.morph.MorphPluginObject;
+import xyz.nifeather.morph.commands.subcommands.plugin.skincache.cmdTree.CommandBuilder;
+import xyz.nifeather.morph.config.ConfigOption;
+import xyz.nifeather.morph.config.MorphConfigManager;
+import xyz.nifeather.morph.messages.CommandStrings;
+import xyz.nifeather.morph.messages.MessageUtils;
+import xyz.nifeather.morph.messages.SkinCacheStrings;
+import xyz.nifeather.morph.misc.CapeURL;
+import xyz.nifeather.morph.misc.DisguiseTypes;
+import xyz.nifeather.morph.misc.MorphGameProfile;
+import xyz.nifeather.morph.misc.MorphParameters;
+import xyz.nifeather.morph.misc.permissions.CommonPermissions;
+import xyz.nifeather.morph.misc.skins.PlayerSkinProvider;
 import xiamomc.pluginbase.Annotations.Initializer;
 import xiamomc.pluginbase.Annotations.Resolved;
 import xiamomc.pluginbase.Bindables.Bindable;
diff --git a/src/main/java/xiamomc/morph/commands/subcommands/plugin/StatSubCommand.java b/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/StatSubCommand.java
similarity index 90%
rename from src/main/java/xiamomc/morph/commands/subcommands/plugin/StatSubCommand.java
rename to src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/StatSubCommand.java
index 3c9ed2c5..779a7798 100644
--- a/src/main/java/xiamomc/morph/commands/subcommands/plugin/StatSubCommand.java
+++ b/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/StatSubCommand.java
@@ -1,16 +1,16 @@
-package xiamomc.morph.commands.subcommands.plugin;
+package xyz.nifeather.morph.commands.subcommands.plugin;
 
 import org.bukkit.Bukkit;
 import org.bukkit.command.CommandSender;
 import org.jetbrains.annotations.NotNull;
-import xiamomc.morph.MorphManager;
-import xiamomc.morph.MorphPluginObject;
-import xiamomc.morph.abilities.AbilityManager;
-import xiamomc.morph.messages.HelpStrings;
-import xiamomc.morph.messages.MessageUtils;
-import xiamomc.morph.messages.StatStrings;
-import xiamomc.morph.network.server.MorphClientHandler;
-import xiamomc.morph.skills.MorphSkillHandler;
+import xyz.nifeather.morph.MorphManager;
+import xyz.nifeather.morph.MorphPluginObject;
+import xyz.nifeather.morph.abilities.AbilityManager;
+import xyz.nifeather.morph.messages.HelpStrings;
+import xyz.nifeather.morph.messages.MessageUtils;
+import xyz.nifeather.morph.messages.StatStrings;
+import xyz.nifeather.morph.network.server.MorphClientHandler;
+import xyz.nifeather.morph.skills.MorphSkillHandler;
 import xiamomc.pluginbase.Annotations.Resolved;
 import xiamomc.pluginbase.Command.ISubCommand;
 import xiamomc.pluginbase.Messages.FormattableMessage;
diff --git a/src/main/java/xiamomc/morph/commands/subcommands/plugin/ToggleSelfSubCommand.java b/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/ToggleSelfSubCommand.java
similarity index 81%
rename from src/main/java/xiamomc/morph/commands/subcommands/plugin/ToggleSelfSubCommand.java
rename to src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/ToggleSelfSubCommand.java
index 2da0cc4a..256356ba 100644
--- a/src/main/java/xiamomc/morph/commands/subcommands/plugin/ToggleSelfSubCommand.java
+++ b/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/ToggleSelfSubCommand.java
@@ -1,12 +1,12 @@
-package xiamomc.morph.commands.subcommands.plugin;
+package xyz.nifeather.morph.commands.subcommands.plugin;
 
 import org.bukkit.command.CommandSender;
 import org.bukkit.entity.Player;
 import org.jetbrains.annotations.NotNull;
-import xiamomc.morph.MorphManager;
-import xiamomc.morph.MorphPluginObject;
-import xiamomc.morph.interfaces.IManagePlayerData;
-import xiamomc.morph.messages.HelpStrings;
+import xyz.nifeather.morph.MorphManager;
+import xyz.nifeather.morph.MorphPluginObject;
+import xyz.nifeather.morph.interfaces.IManagePlayerData;
+import xyz.nifeather.morph.messages.HelpStrings;
 import xiamomc.pluginbase.Annotations.Resolved;
 import xiamomc.pluginbase.Command.ISubCommand;
 import xiamomc.pluginbase.Messages.FormattableMessage;
diff --git a/src/main/java/xiamomc/morph/commands/subcommands/plugin/helpsections/Entry.java b/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/helpsections/Entry.java
similarity index 79%
rename from src/main/java/xiamomc/morph/commands/subcommands/plugin/helpsections/Entry.java
rename to src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/helpsections/Entry.java
index 7ae5e899..2d5ca65f 100644
--- a/src/main/java/xiamomc/morph/commands/subcommands/plugin/helpsections/Entry.java
+++ b/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/helpsections/Entry.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.commands.subcommands.plugin.helpsections;
+package xyz.nifeather.morph.commands.subcommands.plugin.helpsections;
 
 import xiamomc.pluginbase.Messages.FormattableMessage;
 
diff --git a/src/main/java/xiamomc/morph/commands/subcommands/plugin/helpsections/Section.java b/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/helpsections/Section.java
similarity index 93%
rename from src/main/java/xiamomc/morph/commands/subcommands/plugin/helpsections/Section.java
rename to src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/helpsections/Section.java
index f2bc29e1..3c260520 100644
--- a/src/main/java/xiamomc/morph/commands/subcommands/plugin/helpsections/Section.java
+++ b/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/helpsections/Section.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.commands.subcommands.plugin.helpsections;
+package xyz.nifeather.morph.commands.subcommands.plugin.helpsections;
 
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
 import org.jetbrains.annotations.Nullable;
diff --git a/src/main/java/xiamomc/morph/commands/subcommands/plugin/management/ForceMorphSubCommand.java b/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/management/ForceMorphSubCommand.java
similarity index 88%
rename from src/main/java/xiamomc/morph/commands/subcommands/plugin/management/ForceMorphSubCommand.java
rename to src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/management/ForceMorphSubCommand.java
index 99752ab5..14849512 100644
--- a/src/main/java/xiamomc/morph/commands/subcommands/plugin/management/ForceMorphSubCommand.java
+++ b/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/management/ForceMorphSubCommand.java
@@ -1,16 +1,16 @@
-package xiamomc.morph.commands.subcommands.plugin.management;
+package xyz.nifeather.morph.commands.subcommands.plugin.management;
 
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
 import org.bukkit.Bukkit;
 import org.bukkit.command.CommandSender;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.MorphManager;
-import xiamomc.morph.MorphPluginObject;
-import xiamomc.morph.messages.CommonStrings;
-import xiamomc.morph.messages.HelpStrings;
-import xiamomc.morph.messages.MessageUtils;
-import xiamomc.morph.misc.MorphParameters;
+import xyz.nifeather.morph.MorphManager;
+import xyz.nifeather.morph.MorphPluginObject;
+import xyz.nifeather.morph.messages.CommonStrings;
+import xyz.nifeather.morph.messages.HelpStrings;
+import xyz.nifeather.morph.messages.MessageUtils;
+import xyz.nifeather.morph.misc.MorphParameters;
 import xiamomc.pluginbase.Annotations.Resolved;
 import xiamomc.pluginbase.Command.ISubCommand;
 import xiamomc.pluginbase.Messages.FormattableMessage;
diff --git a/src/main/java/xiamomc/morph/commands/subcommands/plugin/management/ForceUnmorphSubCommand.java b/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/management/ForceUnmorphSubCommand.java
similarity index 86%
rename from src/main/java/xiamomc/morph/commands/subcommands/plugin/management/ForceUnmorphSubCommand.java
rename to src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/management/ForceUnmorphSubCommand.java
index 0de6f3cf..797eebc3 100644
--- a/src/main/java/xiamomc/morph/commands/subcommands/plugin/management/ForceUnmorphSubCommand.java
+++ b/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/management/ForceUnmorphSubCommand.java
@@ -1,16 +1,16 @@
-package xiamomc.morph.commands.subcommands.plugin.management;
+package xyz.nifeather.morph.commands.subcommands.plugin.management;
 
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
 import org.bukkit.Bukkit;
 import org.bukkit.command.CommandSender;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.MorphManager;
-import xiamomc.morph.MorphPluginObject;
-import xiamomc.morph.messages.CommandStrings;
-import xiamomc.morph.messages.CommonStrings;
-import xiamomc.morph.messages.HelpStrings;
-import xiamomc.morph.messages.MessageUtils;
+import xyz.nifeather.morph.MorphManager;
+import xyz.nifeather.morph.MorphPluginObject;
+import xyz.nifeather.morph.messages.CommandStrings;
+import xyz.nifeather.morph.messages.CommonStrings;
+import xyz.nifeather.morph.messages.HelpStrings;
+import xyz.nifeather.morph.messages.MessageUtils;
 import xiamomc.pluginbase.Annotations.Resolved;
 import xiamomc.pluginbase.Command.ISubCommand;
 import xiamomc.pluginbase.Messages.FormattableMessage;
diff --git a/src/main/java/xiamomc/morph/commands/subcommands/plugin/management/GrantDisguiseSubCommand.java b/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/management/GrantDisguiseSubCommand.java
similarity index 94%
rename from src/main/java/xiamomc/morph/commands/subcommands/plugin/management/GrantDisguiseSubCommand.java
rename to src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/management/GrantDisguiseSubCommand.java
index 2212ef3f..0c848bb0 100644
--- a/src/main/java/xiamomc/morph/commands/subcommands/plugin/management/GrantDisguiseSubCommand.java
+++ b/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/management/GrantDisguiseSubCommand.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.commands.subcommands.plugin.management;
+package xyz.nifeather.morph.commands.subcommands.plugin.management;
 
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
 import net.kyori.adventure.text.Component;
@@ -7,10 +7,11 @@
 import org.bukkit.entity.Player;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.MorphManager;
-import xiamomc.morph.MorphPluginObject;
+import xyz.nifeather.morph.MorphManager;
+import xyz.nifeather.morph.MorphPluginObject;
 import xiamomc.morph.messages.*;
-import xiamomc.morph.misc.DisguiseTypes;
+import xyz.nifeather.morph.messages.*;
+import xyz.nifeather.morph.misc.DisguiseTypes;
 import xiamomc.pluginbase.Annotations.Resolved;
 import xiamomc.pluginbase.Command.ISubCommand;
 import xiamomc.pluginbase.Messages.FormattableMessage;
diff --git a/src/main/java/xiamomc/morph/commands/subcommands/plugin/management/RevokeDisguiseSubCommand.java b/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/management/RevokeDisguiseSubCommand.java
similarity index 90%
rename from src/main/java/xiamomc/morph/commands/subcommands/plugin/management/RevokeDisguiseSubCommand.java
rename to src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/management/RevokeDisguiseSubCommand.java
index 3b86dcdd..5352b063 100644
--- a/src/main/java/xiamomc/morph/commands/subcommands/plugin/management/RevokeDisguiseSubCommand.java
+++ b/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/management/RevokeDisguiseSubCommand.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.commands.subcommands.plugin.management;
+package xyz.nifeather.morph.commands.subcommands.plugin.management;
 
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
 import net.kyori.adventure.text.Component;
@@ -6,12 +6,12 @@
 import org.bukkit.command.CommandSender;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.MorphManager;
-import xiamomc.morph.MorphPluginObject;
-import xiamomc.morph.messages.CommandStrings;
-import xiamomc.morph.messages.CommonStrings;
-import xiamomc.morph.messages.HelpStrings;
-import xiamomc.morph.messages.MessageUtils;
+import xyz.nifeather.morph.MorphManager;
+import xyz.nifeather.morph.MorphPluginObject;
+import xyz.nifeather.morph.messages.CommandStrings;
+import xyz.nifeather.morph.messages.CommonStrings;
+import xyz.nifeather.morph.messages.HelpStrings;
+import xyz.nifeather.morph.messages.MessageUtils;
 import xiamomc.pluginbase.Annotations.Resolved;
 import xiamomc.pluginbase.Command.ISubCommand;
 import xiamomc.pluginbase.Messages.FormattableMessage;
diff --git a/src/main/java/xiamomc/morph/commands/subcommands/plugin/skincache/cmdTree/CommandBuilder.java b/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/skincache/cmdTree/CommandBuilder.java
similarity index 67%
rename from src/main/java/xiamomc/morph/commands/subcommands/plugin/skincache/cmdTree/CommandBuilder.java
rename to src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/skincache/cmdTree/CommandBuilder.java
index 7ee59441..0965052b 100644
--- a/src/main/java/xiamomc/morph/commands/subcommands/plugin/skincache/cmdTree/CommandBuilder.java
+++ b/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/skincache/cmdTree/CommandBuilder.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.commands.subcommands.plugin.skincache.cmdTree;
+package xyz.nifeather.morph.commands.subcommands.plugin.skincache.cmdTree;
 
 public class CommandBuilder
 {
diff --git a/src/main/java/xiamomc/morph/commands/subcommands/plugin/skincache/cmdTree/TreeCommand.java b/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/skincache/cmdTree/TreeCommand.java
similarity index 97%
rename from src/main/java/xiamomc/morph/commands/subcommands/plugin/skincache/cmdTree/TreeCommand.java
rename to src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/skincache/cmdTree/TreeCommand.java
index 4e4223b7..c342f258 100644
--- a/src/main/java/xiamomc/morph/commands/subcommands/plugin/skincache/cmdTree/TreeCommand.java
+++ b/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/skincache/cmdTree/TreeCommand.java
@@ -1,11 +1,11 @@
-package xiamomc.morph.commands.subcommands.plugin.skincache.cmdTree;
+package xyz.nifeather.morph.commands.subcommands.plugin.skincache.cmdTree;
 
 import com.google.common.collect.ImmutableList;
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
 import org.bukkit.command.CommandSender;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.MorphPlugin;
+import xyz.nifeather.morph.MorphPlugin;
 import xiamomc.pluginbase.Command.ISubCommand;
 import xiamomc.pluginbase.Messages.FormattableMessage;
 
diff --git a/src/main/java/xiamomc/morph/commands/subcommands/request/AcceptSubCommand.java b/src/main/java/xyz/nifeather/morph/commands/subcommands/request/AcceptSubCommand.java
similarity index 85%
rename from src/main/java/xiamomc/morph/commands/subcommands/request/AcceptSubCommand.java
rename to src/main/java/xyz/nifeather/morph/commands/subcommands/request/AcceptSubCommand.java
index 62a1445b..d412a3db 100644
--- a/src/main/java/xiamomc/morph/commands/subcommands/request/AcceptSubCommand.java
+++ b/src/main/java/xyz/nifeather/morph/commands/subcommands/request/AcceptSubCommand.java
@@ -1,15 +1,15 @@
-package xiamomc.morph.commands.subcommands.request;
+package xyz.nifeather.morph.commands.subcommands.request;
 
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
 import org.bukkit.Bukkit;
 import org.bukkit.command.CommandSender;
 import org.bukkit.entity.Player;
 import org.jetbrains.annotations.NotNull;
-import xiamomc.morph.MorphPluginObject;
-import xiamomc.morph.interfaces.IManageRequests;
-import xiamomc.morph.messages.CommonStrings;
-import xiamomc.morph.messages.HelpStrings;
-import xiamomc.morph.messages.MessageUtils;
+import xyz.nifeather.morph.MorphPluginObject;
+import xyz.nifeather.morph.interfaces.IManageRequests;
+import xyz.nifeather.morph.messages.CommonStrings;
+import xyz.nifeather.morph.messages.HelpStrings;
+import xyz.nifeather.morph.messages.MessageUtils;
 import xiamomc.pluginbase.Annotations.Resolved;
 import xiamomc.pluginbase.Command.ISubCommand;
 import xiamomc.pluginbase.Messages.FormattableMessage;
diff --git a/src/main/java/xiamomc/morph/commands/subcommands/request/DenySubCommand.java b/src/main/java/xyz/nifeather/morph/commands/subcommands/request/DenySubCommand.java
similarity index 85%
rename from src/main/java/xiamomc/morph/commands/subcommands/request/DenySubCommand.java
rename to src/main/java/xyz/nifeather/morph/commands/subcommands/request/DenySubCommand.java
index 4990f703..47d5f73f 100644
--- a/src/main/java/xiamomc/morph/commands/subcommands/request/DenySubCommand.java
+++ b/src/main/java/xyz/nifeather/morph/commands/subcommands/request/DenySubCommand.java
@@ -1,15 +1,15 @@
-package xiamomc.morph.commands.subcommands.request;
+package xyz.nifeather.morph.commands.subcommands.request;
 
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
 import org.bukkit.Bukkit;
 import org.bukkit.command.CommandSender;
 import org.bukkit.entity.Player;
 import org.jetbrains.annotations.NotNull;
-import xiamomc.morph.MorphPluginObject;
-import xiamomc.morph.interfaces.IManageRequests;
-import xiamomc.morph.messages.CommonStrings;
-import xiamomc.morph.messages.HelpStrings;
-import xiamomc.morph.messages.MessageUtils;
+import xyz.nifeather.morph.MorphPluginObject;
+import xyz.nifeather.morph.interfaces.IManageRequests;
+import xyz.nifeather.morph.messages.CommonStrings;
+import xyz.nifeather.morph.messages.HelpStrings;
+import xyz.nifeather.morph.messages.MessageUtils;
 import xiamomc.pluginbase.Annotations.Resolved;
 import xiamomc.pluginbase.Command.ISubCommand;
 import xiamomc.pluginbase.Messages.FormattableMessage;
diff --git a/src/main/java/xiamomc/morph/commands/subcommands/request/SendSubCommand.java b/src/main/java/xyz/nifeather/morph/commands/subcommands/request/SendSubCommand.java
similarity index 86%
rename from src/main/java/xiamomc/morph/commands/subcommands/request/SendSubCommand.java
rename to src/main/java/xyz/nifeather/morph/commands/subcommands/request/SendSubCommand.java
index ef91f9fd..3df8c0f9 100644
--- a/src/main/java/xiamomc/morph/commands/subcommands/request/SendSubCommand.java
+++ b/src/main/java/xyz/nifeather/morph/commands/subcommands/request/SendSubCommand.java
@@ -1,17 +1,17 @@
-package xiamomc.morph.commands.subcommands.request;
+package xyz.nifeather.morph.commands.subcommands.request;
 
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
 import org.bukkit.Bukkit;
 import org.bukkit.command.CommandSender;
 import org.bukkit.entity.Player;
 import org.jetbrains.annotations.NotNull;
-import xiamomc.morph.MorphManager;
-import xiamomc.morph.MorphPluginObject;
-import xiamomc.morph.interfaces.IManageRequests;
-import xiamomc.morph.messages.CommonStrings;
-import xiamomc.morph.messages.HelpStrings;
-import xiamomc.morph.messages.MessageUtils;
-import xiamomc.morph.messages.RequestStrings;
+import xyz.nifeather.morph.MorphManager;
+import xyz.nifeather.morph.MorphPluginObject;
+import xyz.nifeather.morph.interfaces.IManageRequests;
+import xyz.nifeather.morph.messages.CommonStrings;
+import xyz.nifeather.morph.messages.HelpStrings;
+import xyz.nifeather.morph.messages.MessageUtils;
+import xyz.nifeather.morph.messages.RequestStrings;
 import xiamomc.pluginbase.Annotations.Resolved;
 import xiamomc.pluginbase.Command.ISubCommand;
 import xiamomc.pluginbase.Messages.FormattableMessage;
diff --git a/src/main/java/xiamomc/morph/config/ConfigOption.java b/src/main/java/xyz/nifeather/morph/config/ConfigOption.java
similarity index 98%
rename from src/main/java/xiamomc/morph/config/ConfigOption.java
rename to src/main/java/xyz/nifeather/morph/config/ConfigOption.java
index 43778af6..f87379a9 100644
--- a/src/main/java/xiamomc/morph/config/ConfigOption.java
+++ b/src/main/java/xyz/nifeather/morph/config/ConfigOption.java
@@ -1,13 +1,12 @@
-package xiamomc.morph.config;
+package xyz.nifeather.morph.config;
 
 import org.apache.commons.lang3.RandomStringUtils;
-import xiamomc.morph.MorphManager;
-import xiamomc.morph.events.InteractionMirrorProcessor;
-import xiamomc.morph.utilities.NbtUtils;
+import xyz.nifeather.morph.MorphManager;
+import xyz.nifeather.morph.events.InteractionMirrorProcessor;
+import xyz.nifeather.morph.utilities.NbtUtils;
 import xiamomc.pluginbase.Configuration.ConfigNode;
 
 import java.util.ArrayList;
-import java.util.HashMap;
 
 public enum ConfigOption
 {
diff --git a/src/main/java/xiamomc/morph/config/MorphConfigManager.java b/src/main/java/xyz/nifeather/morph/config/MorphConfigManager.java
similarity index 98%
rename from src/main/java/xiamomc/morph/config/MorphConfigManager.java
rename to src/main/java/xyz/nifeather/morph/config/MorphConfigManager.java
index ef08aecd..4e8e1a6e 100644
--- a/src/main/java/xiamomc/morph/config/MorphConfigManager.java
+++ b/src/main/java/xyz/nifeather/morph/config/MorphConfigManager.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.config;
+package xyz.nifeather.morph.config;
 
 import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
 import org.bukkit.Bukkit;
@@ -7,9 +7,9 @@
 import org.jetbrains.annotations.Nullable;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import xiamomc.morph.MorphPlugin;
-import xiamomc.morph.messages.CommonStrings;
-import xiamomc.morph.messages.MessageUtils;
+import xyz.nifeather.morph.MorphPlugin;
+import xyz.nifeather.morph.messages.CommonStrings;
+import xyz.nifeather.morph.messages.MessageUtils;
 import xiamomc.pluginbase.Bindables.Bindable;
 import xiamomc.pluginbase.Bindables.BindableList;
 import xiamomc.pluginbase.Configuration.ConfigNode;
diff --git a/src/main/java/xiamomc/morph/events/CommonEventProcessor.java b/src/main/java/xyz/nifeather/morph/events/CommonEventProcessor.java
similarity index 93%
rename from src/main/java/xiamomc/morph/events/CommonEventProcessor.java
rename to src/main/java/xyz/nifeather/morph/events/CommonEventProcessor.java
index c592ad69..c9390084 100644
--- a/src/main/java/xiamomc/morph/events/CommonEventProcessor.java
+++ b/src/main/java/xyz/nifeather/morph/events/CommonEventProcessor.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.events;
+package xyz.nifeather.morph.events;
 
 import com.destroystokyo.paper.event.player.PlayerClientOptionsChangeEvent;
 import com.destroystokyo.paper.event.player.PlayerPostRespawnEvent;
@@ -16,30 +16,30 @@
 import org.bukkit.event.entity.*;
 import org.bukkit.event.player.*;
 import org.bukkit.inventory.*;
-import xiamomc.morph.MorphManager;
-import xiamomc.morph.MorphPluginObject;
-import xiamomc.morph.RevealingHandler;
-import xiamomc.morph.abilities.impl.AttributeModifyingAbility;
-import xiamomc.morph.config.ConfigOption;
-import xiamomc.morph.config.MorphConfigManager;
-import xiamomc.morph.events.api.gameplay.PlayerJoinedWithDisguiseEvent;
-import xiamomc.morph.messages.HintStrings;
-import xiamomc.morph.messages.MessageUtils;
-import xiamomc.morph.messages.MorphStrings;
-import xiamomc.morph.messages.vanilla.VanillaMessageStore;
-import xiamomc.morph.misc.DisguiseTypes;
-import xiamomc.morph.misc.OfflineDisguiseResult;
-import xiamomc.morph.misc.gui.AnimSelectScreenWrapper;
-import xiamomc.morph.misc.gui.DisguiseSelectScreenWrapper;
-import xiamomc.morph.misc.playerList.PlayerListHandler;
-import xiamomc.morph.misc.permissions.CommonPermissions;
+import xyz.nifeather.morph.MorphManager;
+import xyz.nifeather.morph.MorphPluginObject;
+import xyz.nifeather.morph.RevealingHandler;
+import xyz.nifeather.morph.abilities.impl.AttributeModifyingAbility;
+import xyz.nifeather.morph.config.ConfigOption;
+import xyz.nifeather.morph.config.MorphConfigManager;
+import xyz.nifeather.morph.events.api.gameplay.PlayerJoinedWithDisguiseEvent;
+import xyz.nifeather.morph.messages.HintStrings;
+import xyz.nifeather.morph.messages.MessageUtils;
+import xyz.nifeather.morph.messages.MorphStrings;
+import xyz.nifeather.morph.messages.vanilla.VanillaMessageStore;
+import xyz.nifeather.morph.misc.DisguiseTypes;
+import xyz.nifeather.morph.misc.OfflineDisguiseResult;
+import xyz.nifeather.morph.misc.gui.AnimSelectScreenWrapper;
+import xyz.nifeather.morph.misc.gui.DisguiseSelectScreenWrapper;
+import xyz.nifeather.morph.misc.playerList.PlayerListHandler;
+import xyz.nifeather.morph.misc.permissions.CommonPermissions;
 import xiamomc.morph.network.commands.S2C.S2CSwapCommand;
 import xiamomc.morph.network.commands.S2C.map.S2CMapRemoveCommand;
-import xiamomc.morph.network.server.MorphClientHandler;
-import xiamomc.morph.network.server.ServerSetEquipCommand;
-import xiamomc.morph.skills.MorphSkillHandler;
-import xiamomc.morph.utilities.EntityTypeUtils;
-import xiamomc.morph.utilities.ItemUtils;
+import xyz.nifeather.morph.network.server.MorphClientHandler;
+import xyz.nifeather.morph.network.server.ServerSetEquipCommand;
+import xyz.nifeather.morph.skills.MorphSkillHandler;
+import xyz.nifeather.morph.utilities.EntityTypeUtils;
+import xyz.nifeather.morph.utilities.ItemUtils;
 import xiamomc.pluginbase.Annotations.Initializer;
 import xiamomc.pluginbase.Annotations.Resolved;
 import xiamomc.pluginbase.Bindables.Bindable;
@@ -47,7 +47,7 @@
 import java.util.List;
 import java.util.Random;
 
-import static xiamomc.morph.utilities.DisguiseUtils.itemOrAir;
+import static xyz.nifeather.morph.utilities.DisguiseUtils.itemOrAir;
 
 public class CommonEventProcessor extends MorphPluginObject implements Listener
 {
diff --git a/src/main/java/xiamomc/morph/events/DisguiseAnimationProcessor.java b/src/main/java/xyz/nifeather/morph/events/DisguiseAnimationProcessor.java
similarity index 90%
rename from src/main/java/xiamomc/morph/events/DisguiseAnimationProcessor.java
rename to src/main/java/xyz/nifeather/morph/events/DisguiseAnimationProcessor.java
index be2e2dbd..67a784ef 100644
--- a/src/main/java/xiamomc/morph/events/DisguiseAnimationProcessor.java
+++ b/src/main/java/xyz/nifeather/morph/events/DisguiseAnimationProcessor.java
@@ -1,11 +1,11 @@
-package xiamomc.morph.events;
+package xyz.nifeather.morph.events;
 
 import org.bukkit.event.EventHandler;
 import org.bukkit.event.Listener;
 import org.bukkit.event.entity.EntityDamageByEntityEvent;
 import org.bukkit.event.player.PlayerInteractEvent;
-import xiamomc.morph.MorphManager;
-import xiamomc.morph.MorphPluginObject;
+import xyz.nifeather.morph.MorphManager;
+import xyz.nifeather.morph.MorphPluginObject;
 import xiamomc.pluginbase.Annotations.Resolved;
 
 public class DisguiseAnimationProcessor extends MorphPluginObject implements Listener
diff --git a/src/main/java/xiamomc/morph/events/EntityProcessor.java b/src/main/java/xyz/nifeather/morph/events/EntityProcessor.java
similarity index 97%
rename from src/main/java/xiamomc/morph/events/EntityProcessor.java
rename to src/main/java/xyz/nifeather/morph/events/EntityProcessor.java
index b0d6d39d..376b1343 100644
--- a/src/main/java/xiamomc/morph/events/EntityProcessor.java
+++ b/src/main/java/xyz/nifeather/morph/events/EntityProcessor.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.events;
+package xyz.nifeather.morph.events;
 
 import com.destroystokyo.paper.event.entity.EntityAddToWorldEvent;
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
@@ -24,17 +24,16 @@
 import org.bukkit.event.EventHandler;
 import org.bukkit.event.Listener;
 import org.bukkit.event.entity.EntityTargetEvent;
-import xiamomc.morph.MorphManager;
-import xiamomc.morph.MorphPlugin;
-import xiamomc.morph.MorphPluginObject;
-import xiamomc.morph.config.ConfigOption;
-import xiamomc.morph.config.MorphConfigManager;
-import xiamomc.morph.messages.CommandStrings;
-import xiamomc.morph.messages.MessageUtils;
-import xiamomc.morph.misc.NmsRecord;
-import xiamomc.morph.misc.permissions.CommonPermissions;
-import xiamomc.morph.utilities.EntityTypeUtils;
-import xiamomc.morph.utilities.ReflectionUtils;
+import xyz.nifeather.morph.MorphManager;
+import xyz.nifeather.morph.MorphPluginObject;
+import xyz.nifeather.morph.config.ConfigOption;
+import xyz.nifeather.morph.config.MorphConfigManager;
+import xyz.nifeather.morph.messages.CommandStrings;
+import xyz.nifeather.morph.messages.MessageUtils;
+import xyz.nifeather.morph.misc.NmsRecord;
+import xyz.nifeather.morph.misc.permissions.CommonPermissions;
+import xyz.nifeather.morph.utilities.EntityTypeUtils;
+import xyz.nifeather.morph.utilities.ReflectionUtils;
 import xiamomc.pluginbase.Annotations.Resolved;
 import xiamomc.pluginbase.Bindables.Bindable;
 
diff --git a/src/main/java/xiamomc/morph/events/ForcedDisguiseProcessor.java b/src/main/java/xyz/nifeather/morph/events/ForcedDisguiseProcessor.java
similarity index 87%
rename from src/main/java/xiamomc/morph/events/ForcedDisguiseProcessor.java
rename to src/main/java/xyz/nifeather/morph/events/ForcedDisguiseProcessor.java
index ccf239af..a4f45456 100644
--- a/src/main/java/xiamomc/morph/events/ForcedDisguiseProcessor.java
+++ b/src/main/java/xyz/nifeather/morph/events/ForcedDisguiseProcessor.java
@@ -1,17 +1,17 @@
-package xiamomc.morph.events;
+package xyz.nifeather.morph.events;
 
 import org.bukkit.Bukkit;
 import org.bukkit.entity.Player;
 import org.bukkit.event.EventHandler;
 import org.bukkit.event.Listener;
 import org.bukkit.event.player.PlayerJoinEvent;
-import xiamomc.morph.MorphManager;
-import xiamomc.morph.MorphPluginObject;
-import xiamomc.morph.config.ConfigOption;
-import xiamomc.morph.config.MorphConfigManager;
-import xiamomc.morph.events.api.gameplay.PlayerMorphEarlyEvent;
-import xiamomc.morph.events.api.gameplay.PlayerUnMorphEarlyEvent;
-import xiamomc.morph.misc.MorphParameters;
+import xyz.nifeather.morph.MorphManager;
+import xyz.nifeather.morph.MorphPluginObject;
+import xyz.nifeather.morph.config.ConfigOption;
+import xyz.nifeather.morph.config.MorphConfigManager;
+import xyz.nifeather.morph.events.api.gameplay.PlayerMorphEarlyEvent;
+import xyz.nifeather.morph.events.api.gameplay.PlayerUnMorphEarlyEvent;
+import xyz.nifeather.morph.misc.MorphParameters;
 import xiamomc.pluginbase.Annotations.Initializer;
 import xiamomc.pluginbase.Annotations.Resolved;
 import xiamomc.pluginbase.Bindables.Bindable;
diff --git a/src/main/java/xiamomc/morph/events/InteractionMirrorProcessor.java b/src/main/java/xyz/nifeather/morph/events/InteractionMirrorProcessor.java
similarity index 96%
rename from src/main/java/xiamomc/morph/events/InteractionMirrorProcessor.java
rename to src/main/java/xyz/nifeather/morph/events/InteractionMirrorProcessor.java
index f3ed16c8..d8237a08 100644
--- a/src/main/java/xiamomc/morph/events/InteractionMirrorProcessor.java
+++ b/src/main/java/xyz/nifeather/morph/events/InteractionMirrorProcessor.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.events;
+package xyz.nifeather.morph.events;
 
 import ca.spottedleaf.moonrise.common.util.TickThread;
 import io.papermc.paper.event.player.PlayerArmSwingEvent;
@@ -17,25 +17,25 @@
 import org.jetbrains.annotations.Contract;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.MorphManager;
-import xiamomc.morph.MorphPluginObject;
-import xiamomc.morph.config.ConfigOption;
-import xiamomc.morph.config.MorphConfigManager;
-import xiamomc.morph.events.api.gameplay.PlayerJoinedWithDisguiseEvent;
-import xiamomc.morph.events.api.gameplay.PlayerMorphEvent;
-import xiamomc.morph.events.api.gameplay.PlayerUnMorphEvent;
-import xiamomc.morph.misc.DisguiseState;
-import xiamomc.morph.misc.DisguiseTypes;
-import xiamomc.morph.misc.NmsRecord;
-import xiamomc.morph.misc.PlayerOperationSimulator;
-import xiamomc.morph.misc.permissions.CommonPermissions;
+import xyz.nifeather.morph.MorphManager;
+import xyz.nifeather.morph.MorphPluginObject;
+import xyz.nifeather.morph.config.ConfigOption;
+import xyz.nifeather.morph.config.MorphConfigManager;
+import xyz.nifeather.morph.events.api.gameplay.PlayerJoinedWithDisguiseEvent;
+import xyz.nifeather.morph.events.api.gameplay.PlayerMorphEvent;
+import xyz.nifeather.morph.events.api.gameplay.PlayerUnMorphEvent;
+import xyz.nifeather.morph.misc.DisguiseState;
+import xyz.nifeather.morph.misc.DisguiseTypes;
+import xyz.nifeather.morph.misc.NmsRecord;
+import xyz.nifeather.morph.misc.PlayerOperationSimulator;
+import xyz.nifeather.morph.misc.permissions.CommonPermissions;
 import xiamomc.morph.network.commands.S2C.set.S2CSetSneakingCommand;
-import xiamomc.morph.network.server.MorphClientHandler;
-import xiamomc.morph.storage.DirectoryStorage;
-import xiamomc.morph.storage.mirrorlogging.MirrorSingleEntry;
-import xiamomc.morph.storage.mirrorlogging.OperationType;
-import xiamomc.morph.utilities.DisguiseUtils;
-import xiamomc.morph.utilities.ItemUtils;
+import xyz.nifeather.morph.network.server.MorphClientHandler;
+import xyz.nifeather.morph.storage.DirectoryStorage;
+import xyz.nifeather.morph.storage.mirrorlogging.MirrorSingleEntry;
+import xyz.nifeather.morph.storage.mirrorlogging.OperationType;
+import xyz.nifeather.morph.utilities.DisguiseUtils;
+import xyz.nifeather.morph.utilities.ItemUtils;
 import xiamomc.pluginbase.Annotations.Initializer;
 import xiamomc.pluginbase.Annotations.Resolved;
 import xiamomc.pluginbase.Bindables.Bindable;
diff --git a/src/main/java/xiamomc/morph/events/PlayerSkinProcessor.java b/src/main/java/xyz/nifeather/morph/events/PlayerSkinProcessor.java
similarity index 77%
rename from src/main/java/xiamomc/morph/events/PlayerSkinProcessor.java
rename to src/main/java/xyz/nifeather/morph/events/PlayerSkinProcessor.java
index d9afac1a..755e23de 100644
--- a/src/main/java/xiamomc/morph/events/PlayerSkinProcessor.java
+++ b/src/main/java/xyz/nifeather/morph/events/PlayerSkinProcessor.java
@@ -1,10 +1,10 @@
-package xiamomc.morph.events;
+package xyz.nifeather.morph.events;
 
 import org.bukkit.event.EventHandler;
 import org.bukkit.event.Listener;
 import org.bukkit.event.player.PlayerJoinEvent;
-import xiamomc.morph.MorphPluginObject;
-import xiamomc.morph.misc.skins.PlayerSkinProvider;
+import xyz.nifeather.morph.MorphPluginObject;
+import xyz.nifeather.morph.misc.skins.PlayerSkinProvider;
 
 public class PlayerSkinProcessor extends MorphPluginObject implements Listener
 {
diff --git a/src/main/java/xiamomc/morph/events/PlayerTracker.java b/src/main/java/xyz/nifeather/morph/events/PlayerTracker.java
similarity index 99%
rename from src/main/java/xiamomc/morph/events/PlayerTracker.java
rename to src/main/java/xyz/nifeather/morph/events/PlayerTracker.java
index d485a9d2..6cfd0759 100644
--- a/src/main/java/xiamomc/morph/events/PlayerTracker.java
+++ b/src/main/java/xyz/nifeather/morph/events/PlayerTracker.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.events;
+package xyz.nifeather.morph.events;
 
 import com.destroystokyo.paper.event.player.PlayerStartSpectatingEntityEvent;
 import com.destroystokyo.paper.event.player.PlayerStopSpectatingEntityEvent;
@@ -15,7 +15,7 @@
 import org.bukkit.event.player.*;
 import org.bukkit.inventory.EquipmentSlot;
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.MorphPluginObject;
+import xyz.nifeather.morph.MorphPluginObject;
 import xiamomc.pluginbase.Annotations.Initializer;
 
 import java.util.List;
diff --git a/src/main/java/xiamomc/morph/events/PluginEventListener.java b/src/main/java/xyz/nifeather/morph/events/PluginEventListener.java
similarity index 92%
rename from src/main/java/xiamomc/morph/events/PluginEventListener.java
rename to src/main/java/xyz/nifeather/morph/events/PluginEventListener.java
index 7715277c..8b27470f 100644
--- a/src/main/java/xiamomc/morph/events/PluginEventListener.java
+++ b/src/main/java/xyz/nifeather/morph/events/PluginEventListener.java
@@ -1,11 +1,11 @@
-package xiamomc.morph.events;
+package xyz.nifeather.morph.events;
 
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
 import org.bukkit.event.EventHandler;
 import org.bukkit.event.Listener;
 import org.bukkit.event.server.PluginDisableEvent;
 import org.bukkit.event.server.PluginEnableEvent;
-import xiamomc.morph.MorphPluginObject;
+import xyz.nifeather.morph.MorphPluginObject;
 
 import java.util.List;
 import java.util.function.Consumer;
diff --git a/src/main/java/xiamomc/morph/events/RevealingEventProcessor.java b/src/main/java/xyz/nifeather/morph/events/RevealingEventProcessor.java
similarity index 92%
rename from src/main/java/xiamomc/morph/events/RevealingEventProcessor.java
rename to src/main/java/xyz/nifeather/morph/events/RevealingEventProcessor.java
index 41a55ac0..69ff4bf8 100644
--- a/src/main/java/xiamomc/morph/events/RevealingEventProcessor.java
+++ b/src/main/java/xyz/nifeather/morph/events/RevealingEventProcessor.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.events;
+package xyz.nifeather.morph.events;
 
 import org.bukkit.craftbukkit.entity.CraftMob;
 import org.bukkit.entity.Player;
@@ -12,14 +12,14 @@
 import org.bukkit.event.player.PlayerInteractEntityEvent;
 import org.bukkit.event.player.PlayerInteractEvent;
 import org.bukkit.event.player.PlayerJoinEvent;
-import xiamomc.morph.MorphPluginObject;
-import xiamomc.morph.RevealingHandler;
-import xiamomc.morph.config.ConfigOption;
-import xiamomc.morph.config.MorphConfigManager;
-import xiamomc.morph.events.api.gameplay.PlayerMorphEvent;
-import xiamomc.morph.events.api.gameplay.PlayerUnMorphEvent;
-import xiamomc.morph.misc.DisguiseTypes;
-import xiamomc.morph.misc.NmsRecord;
+import xyz.nifeather.morph.MorphPluginObject;
+import xyz.nifeather.morph.RevealingHandler;
+import xyz.nifeather.morph.config.ConfigOption;
+import xyz.nifeather.morph.config.MorphConfigManager;
+import xyz.nifeather.morph.events.api.gameplay.PlayerMorphEvent;
+import xyz.nifeather.morph.events.api.gameplay.PlayerUnMorphEvent;
+import xyz.nifeather.morph.misc.DisguiseTypes;
+import xyz.nifeather.morph.misc.NmsRecord;
 import xiamomc.pluginbase.Annotations.Initializer;
 import xiamomc.pluginbase.Annotations.Resolved;
 import xiamomc.pluginbase.Bindables.Bindable;
diff --git a/src/main/java/xiamomc/morph/events/api/gameplay/PlayerDisguisedFromOfflineStateEvent.java b/src/main/java/xyz/nifeather/morph/events/api/gameplay/PlayerDisguisedFromOfflineStateEvent.java
similarity index 90%
rename from src/main/java/xiamomc/morph/events/api/gameplay/PlayerDisguisedFromOfflineStateEvent.java
rename to src/main/java/xyz/nifeather/morph/events/api/gameplay/PlayerDisguisedFromOfflineStateEvent.java
index 92de6860..5f96dbf1 100644
--- a/src/main/java/xiamomc/morph/events/api/gameplay/PlayerDisguisedFromOfflineStateEvent.java
+++ b/src/main/java/xyz/nifeather/morph/events/api/gameplay/PlayerDisguisedFromOfflineStateEvent.java
@@ -1,10 +1,10 @@
-package xiamomc.morph.events.api.gameplay;
+package xyz.nifeather.morph.events.api.gameplay;
 
 import org.bukkit.entity.Player;
 import org.bukkit.event.HandlerList;
 import org.bukkit.event.player.PlayerEvent;
 import org.jetbrains.annotations.NotNull;
-import xiamomc.morph.misc.DisguiseState;
+import xyz.nifeather.morph.misc.DisguiseState;
 
 public class PlayerDisguisedFromOfflineStateEvent extends PlayerEvent
 {
diff --git a/src/main/java/xiamomc/morph/events/api/gameplay/PlayerExecuteSkillEvent.java b/src/main/java/xyz/nifeather/morph/events/api/gameplay/PlayerExecuteSkillEvent.java
similarity index 93%
rename from src/main/java/xiamomc/morph/events/api/gameplay/PlayerExecuteSkillEvent.java
rename to src/main/java/xyz/nifeather/morph/events/api/gameplay/PlayerExecuteSkillEvent.java
index 58280439..d1968388 100644
--- a/src/main/java/xiamomc/morph/events/api/gameplay/PlayerExecuteSkillEvent.java
+++ b/src/main/java/xyz/nifeather/morph/events/api/gameplay/PlayerExecuteSkillEvent.java
@@ -1,11 +1,11 @@
-package xiamomc.morph.events.api.gameplay;
+package xyz.nifeather.morph.events.api.gameplay;
 
 import org.bukkit.entity.Player;
 import org.bukkit.event.Cancellable;
 import org.bukkit.event.HandlerList;
 import org.bukkit.event.player.PlayerEvent;
 import org.jetbrains.annotations.NotNull;
-import xiamomc.morph.misc.DisguiseState;
+import xyz.nifeather.morph.misc.DisguiseState;
 
 public class PlayerExecuteSkillEvent extends PlayerEvent implements Cancellable
 {
diff --git a/src/main/java/xiamomc/morph/events/api/gameplay/PlayerJoinedWithDisguiseEvent.java b/src/main/java/xyz/nifeather/morph/events/api/gameplay/PlayerJoinedWithDisguiseEvent.java
similarity index 90%
rename from src/main/java/xiamomc/morph/events/api/gameplay/PlayerJoinedWithDisguiseEvent.java
rename to src/main/java/xyz/nifeather/morph/events/api/gameplay/PlayerJoinedWithDisguiseEvent.java
index 2e8ce483..b1c74664 100644
--- a/src/main/java/xiamomc/morph/events/api/gameplay/PlayerJoinedWithDisguiseEvent.java
+++ b/src/main/java/xyz/nifeather/morph/events/api/gameplay/PlayerJoinedWithDisguiseEvent.java
@@ -1,10 +1,10 @@
-package xiamomc.morph.events.api.gameplay;
+package xyz.nifeather.morph.events.api.gameplay;
 
 import org.bukkit.entity.Player;
 import org.bukkit.event.HandlerList;
 import org.bukkit.event.player.PlayerEvent;
 import org.jetbrains.annotations.NotNull;
-import xiamomc.morph.misc.DisguiseState;
+import xyz.nifeather.morph.misc.DisguiseState;
 
 public class PlayerJoinedWithDisguiseEvent extends PlayerEvent
 {
diff --git a/src/main/java/xiamomc/morph/events/api/gameplay/PlayerMorphEarlyEvent.java b/src/main/java/xyz/nifeather/morph/events/api/gameplay/PlayerMorphEarlyEvent.java
similarity index 95%
rename from src/main/java/xiamomc/morph/events/api/gameplay/PlayerMorphEarlyEvent.java
rename to src/main/java/xyz/nifeather/morph/events/api/gameplay/PlayerMorphEarlyEvent.java
index eab35f73..8b186f46 100644
--- a/src/main/java/xiamomc/morph/events/api/gameplay/PlayerMorphEarlyEvent.java
+++ b/src/main/java/xyz/nifeather/morph/events/api/gameplay/PlayerMorphEarlyEvent.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.events.api.gameplay;
+package xyz.nifeather.morph.events.api.gameplay;
 
 import org.bukkit.entity.Player;
 import org.bukkit.event.Cancellable;
@@ -6,7 +6,7 @@
 import org.bukkit.event.player.PlayerEvent;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.misc.DisguiseState;
+import xyz.nifeather.morph.misc.DisguiseState;
 
 public class PlayerMorphEarlyEvent extends PlayerEvent implements Cancellable
 {
diff --git a/src/main/java/xiamomc/morph/events/api/gameplay/PlayerMorphEvent.java b/src/main/java/xyz/nifeather/morph/events/api/gameplay/PlayerMorphEvent.java
similarity index 89%
rename from src/main/java/xiamomc/morph/events/api/gameplay/PlayerMorphEvent.java
rename to src/main/java/xyz/nifeather/morph/events/api/gameplay/PlayerMorphEvent.java
index 04d737bd..805e63e3 100644
--- a/src/main/java/xiamomc/morph/events/api/gameplay/PlayerMorphEvent.java
+++ b/src/main/java/xyz/nifeather/morph/events/api/gameplay/PlayerMorphEvent.java
@@ -1,10 +1,10 @@
-package xiamomc.morph.events.api.gameplay;
+package xyz.nifeather.morph.events.api.gameplay;
 
 import org.bukkit.entity.Player;
 import org.bukkit.event.HandlerList;
 import org.bukkit.event.player.PlayerEvent;
 import org.jetbrains.annotations.NotNull;
-import xiamomc.morph.misc.DisguiseState;
+import xyz.nifeather.morph.misc.DisguiseState;
 
 public class PlayerMorphEvent extends PlayerEvent
 {
diff --git a/src/main/java/xiamomc/morph/events/api/gameplay/PlayerUnMorphEarlyEvent.java b/src/main/java/xyz/nifeather/morph/events/api/gameplay/PlayerUnMorphEarlyEvent.java
similarity index 95%
rename from src/main/java/xiamomc/morph/events/api/gameplay/PlayerUnMorphEarlyEvent.java
rename to src/main/java/xyz/nifeather/morph/events/api/gameplay/PlayerUnMorphEarlyEvent.java
index 2618119c..6f14e6a5 100644
--- a/src/main/java/xiamomc/morph/events/api/gameplay/PlayerUnMorphEarlyEvent.java
+++ b/src/main/java/xyz/nifeather/morph/events/api/gameplay/PlayerUnMorphEarlyEvent.java
@@ -1,11 +1,11 @@
-package xiamomc.morph.events.api.gameplay;
+package xyz.nifeather.morph.events.api.gameplay;
 
 import org.bukkit.entity.Player;
 import org.bukkit.event.Cancellable;
 import org.bukkit.event.HandlerList;
 import org.bukkit.event.player.PlayerEvent;
 import org.jetbrains.annotations.NotNull;
-import xiamomc.morph.misc.DisguiseState;
+import xyz.nifeather.morph.misc.DisguiseState;
 
 public class PlayerUnMorphEarlyEvent extends PlayerEvent implements Cancellable
 {
diff --git a/src/main/java/xiamomc/morph/events/api/gameplay/PlayerUnMorphEvent.java b/src/main/java/xyz/nifeather/morph/events/api/gameplay/PlayerUnMorphEvent.java
similarity index 92%
rename from src/main/java/xiamomc/morph/events/api/gameplay/PlayerUnMorphEvent.java
rename to src/main/java/xyz/nifeather/morph/events/api/gameplay/PlayerUnMorphEvent.java
index 985c5960..691e0e12 100644
--- a/src/main/java/xiamomc/morph/events/api/gameplay/PlayerUnMorphEvent.java
+++ b/src/main/java/xyz/nifeather/morph/events/api/gameplay/PlayerUnMorphEvent.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.events.api.gameplay;
+package xyz.nifeather.morph.events.api.gameplay;
 
 import org.bukkit.entity.Player;
 import org.bukkit.event.HandlerList;
diff --git a/src/main/java/xiamomc/morph/events/api/lifecycle/AbilitiesFinishedInitializeEvent.java b/src/main/java/xyz/nifeather/morph/events/api/lifecycle/AbilitiesFinishedInitializeEvent.java
similarity index 84%
rename from src/main/java/xiamomc/morph/events/api/lifecycle/AbilitiesFinishedInitializeEvent.java
rename to src/main/java/xyz/nifeather/morph/events/api/lifecycle/AbilitiesFinishedInitializeEvent.java
index e0e59139..54fef01f 100644
--- a/src/main/java/xiamomc/morph/events/api/lifecycle/AbilitiesFinishedInitializeEvent.java
+++ b/src/main/java/xyz/nifeather/morph/events/api/lifecycle/AbilitiesFinishedInitializeEvent.java
@@ -1,9 +1,9 @@
-package xiamomc.morph.events.api.lifecycle;
+package xyz.nifeather.morph.events.api.lifecycle;
 
 import org.bukkit.event.Event;
 import org.bukkit.event.HandlerList;
 import org.jetbrains.annotations.NotNull;
-import xiamomc.morph.abilities.AbilityManager;
+import xyz.nifeather.morph.abilities.AbilityManager;
 
 public class AbilitiesFinishedInitializeEvent extends Event
 {
diff --git a/src/main/java/xiamomc/morph/events/api/lifecycle/ConfigurationReloadEvent.java b/src/main/java/xyz/nifeather/morph/events/api/lifecycle/ConfigurationReloadEvent.java
similarity index 93%
rename from src/main/java/xiamomc/morph/events/api/lifecycle/ConfigurationReloadEvent.java
rename to src/main/java/xyz/nifeather/morph/events/api/lifecycle/ConfigurationReloadEvent.java
index 3a0751ce..adfdef60 100644
--- a/src/main/java/xiamomc/morph/events/api/lifecycle/ConfigurationReloadEvent.java
+++ b/src/main/java/xyz/nifeather/morph/events/api/lifecycle/ConfigurationReloadEvent.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.events.api.lifecycle;
+package xyz.nifeather.morph.events.api.lifecycle;
 
 import org.bukkit.event.Event;
 import org.bukkit.event.HandlerList;
diff --git a/src/main/java/xiamomc/morph/events/api/lifecycle/ManagerFinishedInitializeEvent.java b/src/main/java/xyz/nifeather/morph/events/api/lifecycle/ManagerFinishedInitializeEvent.java
similarity index 86%
rename from src/main/java/xiamomc/morph/events/api/lifecycle/ManagerFinishedInitializeEvent.java
rename to src/main/java/xyz/nifeather/morph/events/api/lifecycle/ManagerFinishedInitializeEvent.java
index aeafc31e..65be2d8c 100644
--- a/src/main/java/xiamomc/morph/events/api/lifecycle/ManagerFinishedInitializeEvent.java
+++ b/src/main/java/xyz/nifeather/morph/events/api/lifecycle/ManagerFinishedInitializeEvent.java
@@ -1,9 +1,9 @@
-package xiamomc.morph.events.api.lifecycle;
+package xyz.nifeather.morph.events.api.lifecycle;
 
 import org.bukkit.event.Event;
 import org.bukkit.event.HandlerList;
 import org.jetbrains.annotations.NotNull;
-import xiamomc.morph.MorphManager;
+import xyz.nifeather.morph.MorphManager;
 
 public class ManagerFinishedInitializeEvent extends Event
 {
diff --git a/src/main/java/xiamomc/morph/events/api/lifecycle/SkillsFinishedInitializeEvent.java b/src/main/java/xyz/nifeather/morph/events/api/lifecycle/SkillsFinishedInitializeEvent.java
similarity index 84%
rename from src/main/java/xiamomc/morph/events/api/lifecycle/SkillsFinishedInitializeEvent.java
rename to src/main/java/xyz/nifeather/morph/events/api/lifecycle/SkillsFinishedInitializeEvent.java
index d2a5595e..eb32e077 100644
--- a/src/main/java/xiamomc/morph/events/api/lifecycle/SkillsFinishedInitializeEvent.java
+++ b/src/main/java/xyz/nifeather/morph/events/api/lifecycle/SkillsFinishedInitializeEvent.java
@@ -1,9 +1,9 @@
-package xiamomc.morph.events.api.lifecycle;
+package xyz.nifeather.morph.events.api.lifecycle;
 
 import org.bukkit.event.Event;
 import org.bukkit.event.HandlerList;
 import org.jetbrains.annotations.NotNull;
-import xiamomc.morph.skills.MorphSkillHandler;
+import xyz.nifeather.morph.skills.MorphSkillHandler;
 
 public class SkillsFinishedInitializeEvent extends Event
 {
diff --git a/src/main/java/xiamomc/morph/interfaces/IManageOfflineStates.java b/src/main/java/xyz/nifeather/morph/interfaces/IManageOfflineStates.java
similarity index 63%
rename from src/main/java/xiamomc/morph/interfaces/IManageOfflineStates.java
rename to src/main/java/xyz/nifeather/morph/interfaces/IManageOfflineStates.java
index 2e8a7030..a83d5ef5 100644
--- a/src/main/java/xiamomc/morph/interfaces/IManageOfflineStates.java
+++ b/src/main/java/xyz/nifeather/morph/interfaces/IManageOfflineStates.java
@@ -1,7 +1,7 @@
-package xiamomc.morph.interfaces;
+package xyz.nifeather.morph.interfaces;
 
-import xiamomc.morph.misc.DisguiseState;
-import xiamomc.morph.storage.offlinestore.OfflineDisguiseState;
+import xyz.nifeather.morph.misc.DisguiseState;
+import xyz.nifeather.morph.storage.offlinestore.OfflineDisguiseState;
 
 import java.util.List;
 import java.util.UUID;
diff --git a/src/main/java/xiamomc/morph/interfaces/IManagePlayerData.java b/src/main/java/xyz/nifeather/morph/interfaces/IManagePlayerData.java
similarity index 91%
rename from src/main/java/xiamomc/morph/interfaces/IManagePlayerData.java
rename to src/main/java/xyz/nifeather/morph/interfaces/IManagePlayerData.java
index df5763af..87570343 100644
--- a/src/main/java/xiamomc/morph/interfaces/IManagePlayerData.java
+++ b/src/main/java/xyz/nifeather/morph/interfaces/IManagePlayerData.java
@@ -1,11 +1,11 @@
-package xiamomc.morph.interfaces;
+package xyz.nifeather.morph.interfaces;
 
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
 import org.bukkit.OfflinePlayer;
 import org.bukkit.entity.Player;
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.misc.DisguiseMeta;
-import xiamomc.morph.storage.playerdata.PlayerMeta;
+import xyz.nifeather.morph.misc.DisguiseMeta;
+import xyz.nifeather.morph.storage.playerdata.PlayerMeta;
 
 public interface IManagePlayerData
 {
diff --git a/src/main/java/xiamomc/morph/interfaces/IManageRequests.java b/src/main/java/xyz/nifeather/morph/interfaces/IManageRequests.java
similarity index 90%
rename from src/main/java/xiamomc/morph/interfaces/IManageRequests.java
rename to src/main/java/xyz/nifeather/morph/interfaces/IManageRequests.java
index c1f2191e..5ea58a47 100644
--- a/src/main/java/xiamomc/morph/interfaces/IManageRequests.java
+++ b/src/main/java/xyz/nifeather/morph/interfaces/IManageRequests.java
@@ -1,7 +1,7 @@
-package xiamomc.morph.interfaces;
+package xyz.nifeather.morph.interfaces;
 
 import org.bukkit.entity.Player;
-import xiamomc.morph.misc.RequestInfo;
+import xyz.nifeather.morph.misc.RequestInfo;
 
 import java.util.List;
 
diff --git a/src/main/java/xiamomc/morph/messages/AbstractMorphStrings.java b/src/main/java/xyz/nifeather/morph/messages/AbstractMorphStrings.java
similarity index 84%
rename from src/main/java/xiamomc/morph/messages/AbstractMorphStrings.java
rename to src/main/java/xyz/nifeather/morph/messages/AbstractMorphStrings.java
index b23f0875..bcbe7e5d 100644
--- a/src/main/java/xiamomc/morph/messages/AbstractMorphStrings.java
+++ b/src/main/java/xyz/nifeather/morph/messages/AbstractMorphStrings.java
@@ -1,6 +1,6 @@
-package xiamomc.morph.messages;
+package xyz.nifeather.morph.messages;
 
-import xiamomc.morph.MorphPlugin;
+import xyz.nifeather.morph.MorphPlugin;
 import xiamomc.pluginbase.Messages.FormattableMessage;
 import xiamomc.pluginbase.Messages.IStrings;
 
diff --git a/src/main/java/xiamomc/morph/messages/BackendStrings.java b/src/main/java/xyz/nifeather/morph/messages/BackendStrings.java
similarity index 96%
rename from src/main/java/xiamomc/morph/messages/BackendStrings.java
rename to src/main/java/xyz/nifeather/morph/messages/BackendStrings.java
index ae7b8dde..bb97f275 100644
--- a/src/main/java/xiamomc/morph/messages/BackendStrings.java
+++ b/src/main/java/xyz/nifeather/morph/messages/BackendStrings.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.messages;
+package xyz.nifeather.morph.messages;
 
 import xiamomc.pluginbase.Messages.FormattableMessage;
 
diff --git a/src/main/java/xiamomc/morph/messages/CapeStrings.java b/src/main/java/xyz/nifeather/morph/messages/CapeStrings.java
similarity index 98%
rename from src/main/java/xiamomc/morph/messages/CapeStrings.java
rename to src/main/java/xyz/nifeather/morph/messages/CapeStrings.java
index 3b3eb991..fc3f0cfb 100644
--- a/src/main/java/xiamomc/morph/messages/CapeStrings.java
+++ b/src/main/java/xyz/nifeather/morph/messages/CapeStrings.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.messages;
+package xyz.nifeather.morph.messages;
 
 import xiamomc.pluginbase.Messages.FormattableMessage;
 
diff --git a/src/main/java/xiamomc/morph/messages/CommandNameStrings.java b/src/main/java/xyz/nifeather/morph/messages/CommandNameStrings.java
similarity index 97%
rename from src/main/java/xiamomc/morph/messages/CommandNameStrings.java
rename to src/main/java/xyz/nifeather/morph/messages/CommandNameStrings.java
index 7882d6e2..50f06bc1 100644
--- a/src/main/java/xiamomc/morph/messages/CommandNameStrings.java
+++ b/src/main/java/xyz/nifeather/morph/messages/CommandNameStrings.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.messages;
+package xyz.nifeather.morph.messages;
 
 import xiamomc.pluginbase.Messages.FormattableMessage;
 
diff --git a/src/main/java/xiamomc/morph/messages/CommandStrings.java b/src/main/java/xyz/nifeather/morph/messages/CommandStrings.java
similarity index 99%
rename from src/main/java/xiamomc/morph/messages/CommandStrings.java
rename to src/main/java/xyz/nifeather/morph/messages/CommandStrings.java
index d178608b..21053be0 100644
--- a/src/main/java/xiamomc/morph/messages/CommandStrings.java
+++ b/src/main/java/xyz/nifeather/morph/messages/CommandStrings.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.messages;
+package xyz.nifeather.morph.messages;
 
 import xiamomc.pluginbase.Messages.FormattableMessage;
 
diff --git a/src/main/java/xiamomc/morph/messages/CommonStrings.java b/src/main/java/xyz/nifeather/morph/messages/CommonStrings.java
similarity index 96%
rename from src/main/java/xiamomc/morph/messages/CommonStrings.java
rename to src/main/java/xyz/nifeather/morph/messages/CommonStrings.java
index 5e4cd6e5..e27d7fb4 100644
--- a/src/main/java/xiamomc/morph/messages/CommonStrings.java
+++ b/src/main/java/xyz/nifeather/morph/messages/CommonStrings.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.messages;
+package xyz.nifeather.morph.messages;
 
 import xiamomc.pluginbase.Messages.FormattableMessage;
 
diff --git a/src/main/java/xiamomc/morph/messages/EmoteStrings.java b/src/main/java/xyz/nifeather/morph/messages/EmoteStrings.java
similarity index 94%
rename from src/main/java/xiamomc/morph/messages/EmoteStrings.java
rename to src/main/java/xyz/nifeather/morph/messages/EmoteStrings.java
index 152977c9..e654ce07 100644
--- a/src/main/java/xiamomc/morph/messages/EmoteStrings.java
+++ b/src/main/java/xyz/nifeather/morph/messages/EmoteStrings.java
@@ -1,9 +1,8 @@
-package xiamomc.morph.messages;
+package xyz.nifeather.morph.messages;
 
-import xiamomc.morph.MorphPlugin;
+import xyz.nifeather.morph.MorphPlugin;
 import xiamomc.pluginbase.Messages.FormattableMessage;
 
-import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 
diff --git a/src/main/java/xiamomc/morph/messages/GuiStrings.java b/src/main/java/xyz/nifeather/morph/messages/GuiStrings.java
similarity index 96%
rename from src/main/java/xiamomc/morph/messages/GuiStrings.java
rename to src/main/java/xyz/nifeather/morph/messages/GuiStrings.java
index 629078a2..d5e68bca 100644
--- a/src/main/java/xiamomc/morph/messages/GuiStrings.java
+++ b/src/main/java/xyz/nifeather/morph/messages/GuiStrings.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.messages;
+package xyz.nifeather.morph.messages;
 
 import xiamomc.pluginbase.Messages.FormattableMessage;
 
diff --git a/src/main/java/xiamomc/morph/messages/HelpStrings.java b/src/main/java/xyz/nifeather/morph/messages/HelpStrings.java
similarity index 99%
rename from src/main/java/xiamomc/morph/messages/HelpStrings.java
rename to src/main/java/xyz/nifeather/morph/messages/HelpStrings.java
index dfa38be1..eef4a1d9 100644
--- a/src/main/java/xiamomc/morph/messages/HelpStrings.java
+++ b/src/main/java/xyz/nifeather/morph/messages/HelpStrings.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.messages;
+package xyz.nifeather.morph.messages;
 
 import xiamomc.pluginbase.Messages.FormattableMessage;
 
diff --git a/src/main/java/xiamomc/morph/messages/HintStrings.java b/src/main/java/xyz/nifeather/morph/messages/HintStrings.java
similarity index 97%
rename from src/main/java/xiamomc/morph/messages/HintStrings.java
rename to src/main/java/xyz/nifeather/morph/messages/HintStrings.java
index 725ab32a..84e5c52a 100644
--- a/src/main/java/xiamomc/morph/messages/HintStrings.java
+++ b/src/main/java/xyz/nifeather/morph/messages/HintStrings.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.messages;
+package xyz.nifeather.morph.messages;
 
 import xiamomc.pluginbase.Messages.FormattableMessage;
 
diff --git a/src/main/java/xiamomc/morph/messages/MessageUtils.java b/src/main/java/xyz/nifeather/morph/messages/MessageUtils.java
similarity index 93%
rename from src/main/java/xiamomc/morph/messages/MessageUtils.java
rename to src/main/java/xyz/nifeather/morph/messages/MessageUtils.java
index 1aba85e0..3419f2bf 100644
--- a/src/main/java/xiamomc/morph/messages/MessageUtils.java
+++ b/src/main/java/xyz/nifeather/morph/messages/MessageUtils.java
@@ -1,15 +1,15 @@
-package xiamomc.morph.messages;
+package xyz.nifeather.morph.messages;
 
 import net.kyori.adventure.text.Component;
 import org.bukkit.command.CommandSender;
 import org.bukkit.entity.Player;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.MorphPlugin;
-import xiamomc.morph.MorphPluginObject;
-import xiamomc.morph.config.ConfigOption;
-import xiamomc.morph.config.MorphConfigManager;
-import xiamomc.morph.misc.NmsRecord;
+import xyz.nifeather.morph.MorphPlugin;
+import xyz.nifeather.morph.MorphPluginObject;
+import xyz.nifeather.morph.config.ConfigOption;
+import xyz.nifeather.morph.config.MorphConfigManager;
+import xyz.nifeather.morph.misc.NmsRecord;
 import xiamomc.pluginbase.Bindables.Bindable;
 import xiamomc.pluginbase.Managers.DependencyManager;
 import xiamomc.pluginbase.Messages.FormattableMessage;
diff --git a/src/main/java/xiamomc/morph/messages/MorphMessageStore.java b/src/main/java/xyz/nifeather/morph/messages/MorphMessageStore.java
similarity index 96%
rename from src/main/java/xiamomc/morph/messages/MorphMessageStore.java
rename to src/main/java/xyz/nifeather/morph/messages/MorphMessageStore.java
index 827d2dcb..f3406d2d 100644
--- a/src/main/java/xiamomc/morph/messages/MorphMessageStore.java
+++ b/src/main/java/xyz/nifeather/morph/messages/MorphMessageStore.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.messages;
+package xyz.nifeather.morph.messages;
 
 import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
@@ -6,9 +6,9 @@
 import org.jetbrains.annotations.Contract;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.MorphPlugin;
-import xiamomc.morph.config.ConfigOption;
-import xiamomc.morph.config.MorphConfigManager;
+import xyz.nifeather.morph.MorphPlugin;
+import xyz.nifeather.morph.config.ConfigOption;
+import xyz.nifeather.morph.config.MorphConfigManager;
 import xiamomc.pluginbase.Annotations.Initializer;
 import xiamomc.pluginbase.Bindables.Bindable;
 import xiamomc.pluginbase.Messages.IStrings;
diff --git a/src/main/java/xiamomc/morph/messages/MorphMessageSubStore.java b/src/main/java/xyz/nifeather/morph/messages/MorphMessageSubStore.java
similarity index 94%
rename from src/main/java/xiamomc/morph/messages/MorphMessageSubStore.java
rename to src/main/java/xyz/nifeather/morph/messages/MorphMessageSubStore.java
index 0260ce8f..1aebcf4d 100644
--- a/src/main/java/xiamomc/morph/messages/MorphMessageSubStore.java
+++ b/src/main/java/xyz/nifeather/morph/messages/MorphMessageSubStore.java
@@ -1,8 +1,8 @@
-package xiamomc.morph.messages;
+package xyz.nifeather.morph.messages;
 
 import org.jetbrains.annotations.NotNull;
-import xiamomc.morph.MorphPlugin;
-import xiamomc.morph.utilities.PluginAssetUtils;
+import xyz.nifeather.morph.MorphPlugin;
+import xyz.nifeather.morph.utilities.PluginAssetUtils;
 import xiamomc.pluginbase.Messages.IStrings;
 import xiamomc.pluginbase.Messages.MessageStore;
 
diff --git a/src/main/java/xiamomc/morph/messages/MorphStrings.java b/src/main/java/xyz/nifeather/morph/messages/MorphStrings.java
similarity index 99%
rename from src/main/java/xiamomc/morph/messages/MorphStrings.java
rename to src/main/java/xyz/nifeather/morph/messages/MorphStrings.java
index b5aab642..c33ede89 100644
--- a/src/main/java/xiamomc/morph/messages/MorphStrings.java
+++ b/src/main/java/xyz/nifeather/morph/messages/MorphStrings.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.messages;
+package xyz.nifeather.morph.messages;
 
 import xiamomc.pluginbase.Messages.FormattableMessage;
 
diff --git a/src/main/java/xiamomc/morph/messages/RequestStrings.java b/src/main/java/xyz/nifeather/morph/messages/RequestStrings.java
similarity index 98%
rename from src/main/java/xiamomc/morph/messages/RequestStrings.java
rename to src/main/java/xyz/nifeather/morph/messages/RequestStrings.java
index 467ddb0a..60d03984 100644
--- a/src/main/java/xiamomc/morph/messages/RequestStrings.java
+++ b/src/main/java/xyz/nifeather/morph/messages/RequestStrings.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.messages;
+package xyz.nifeather.morph.messages;
 
 import xiamomc.pluginbase.Messages.FormattableMessage;
 
diff --git a/src/main/java/xiamomc/morph/messages/SkillStrings.java b/src/main/java/xyz/nifeather/morph/messages/SkillStrings.java
similarity index 98%
rename from src/main/java/xiamomc/morph/messages/SkillStrings.java
rename to src/main/java/xyz/nifeather/morph/messages/SkillStrings.java
index 6b0412af..eb22a4c3 100644
--- a/src/main/java/xiamomc/morph/messages/SkillStrings.java
+++ b/src/main/java/xyz/nifeather/morph/messages/SkillStrings.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.messages;
+package xyz.nifeather.morph.messages;
 
 import xiamomc.pluginbase.Messages.FormattableMessage;
 
diff --git a/src/main/java/xiamomc/morph/messages/SkinCacheStrings.java b/src/main/java/xyz/nifeather/morph/messages/SkinCacheStrings.java
similarity index 98%
rename from src/main/java/xiamomc/morph/messages/SkinCacheStrings.java
rename to src/main/java/xyz/nifeather/morph/messages/SkinCacheStrings.java
index bb948833..108589ee 100644
--- a/src/main/java/xiamomc/morph/messages/SkinCacheStrings.java
+++ b/src/main/java/xyz/nifeather/morph/messages/SkinCacheStrings.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.messages;
+package xyz.nifeather.morph.messages;
 
 import xiamomc.pluginbase.Messages.FormattableMessage;
 
diff --git a/src/main/java/xiamomc/morph/messages/StatStrings.java b/src/main/java/xyz/nifeather/morph/messages/StatStrings.java
similarity index 98%
rename from src/main/java/xiamomc/morph/messages/StatStrings.java
rename to src/main/java/xyz/nifeather/morph/messages/StatStrings.java
index 4b1e395a..f5111cdb 100644
--- a/src/main/java/xiamomc/morph/messages/StatStrings.java
+++ b/src/main/java/xyz/nifeather/morph/messages/StatStrings.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.messages;
+package xyz.nifeather.morph.messages;
 
 import xiamomc.pluginbase.Messages.FormattableMessage;
 
diff --git a/src/main/java/xiamomc/morph/messages/TypesString.java b/src/main/java/xyz/nifeather/morph/messages/TypesString.java
similarity index 94%
rename from src/main/java/xiamomc/morph/messages/TypesString.java
rename to src/main/java/xyz/nifeather/morph/messages/TypesString.java
index d2f05a29..cd204162 100644
--- a/src/main/java/xiamomc/morph/messages/TypesString.java
+++ b/src/main/java/xyz/nifeather/morph/messages/TypesString.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.messages;
+package xyz.nifeather.morph.messages;
 
 import xiamomc.pluginbase.Messages.FormattableMessage;
 
diff --git a/src/main/java/xiamomc/morph/messages/UpdateStrings.java b/src/main/java/xyz/nifeather/morph/messages/UpdateStrings.java
similarity index 96%
rename from src/main/java/xiamomc/morph/messages/UpdateStrings.java
rename to src/main/java/xyz/nifeather/morph/messages/UpdateStrings.java
index bcd2e31a..0947b46b 100644
--- a/src/main/java/xiamomc/morph/messages/UpdateStrings.java
+++ b/src/main/java/xyz/nifeather/morph/messages/UpdateStrings.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.messages;
+package xyz.nifeather.morph.messages;
 
 import xiamomc.pluginbase.Messages.FormattableMessage;
 
diff --git a/src/main/java/xiamomc/morph/messages/vanilla/BasicVanillaMessageStore.java b/src/main/java/xyz/nifeather/morph/messages/vanilla/BasicVanillaMessageStore.java
similarity index 97%
rename from src/main/java/xiamomc/morph/messages/vanilla/BasicVanillaMessageStore.java
rename to src/main/java/xyz/nifeather/morph/messages/vanilla/BasicVanillaMessageStore.java
index d6fb78ca..5e5fedfe 100644
--- a/src/main/java/xiamomc/morph/messages/vanilla/BasicVanillaMessageStore.java
+++ b/src/main/java/xyz/nifeather/morph/messages/vanilla/BasicVanillaMessageStore.java
@@ -1,7 +1,7 @@
-package xiamomc.morph.messages.vanilla;
+package xyz.nifeather.morph.messages.vanilla;
 
 import org.jetbrains.annotations.NotNull;
-import xiamomc.morph.MorphPlugin;
+import xyz.nifeather.morph.MorphPlugin;
 import xiamomc.pluginbase.Messages.IStrings;
 import xiamomc.pluginbase.Messages.MessageStore;
 
diff --git a/src/main/java/xiamomc/morph/messages/vanilla/VanillaMessageStore.java b/src/main/java/xyz/nifeather/morph/messages/vanilla/VanillaMessageStore.java
similarity index 94%
rename from src/main/java/xiamomc/morph/messages/vanilla/VanillaMessageStore.java
rename to src/main/java/xyz/nifeather/morph/messages/vanilla/VanillaMessageStore.java
index a11fac97..fd82e386 100644
--- a/src/main/java/xiamomc/morph/messages/vanilla/VanillaMessageStore.java
+++ b/src/main/java/xyz/nifeather/morph/messages/vanilla/VanillaMessageStore.java
@@ -1,11 +1,11 @@
-package xiamomc.morph.messages.vanilla;
+package xyz.nifeather.morph.messages.vanilla;
 
 import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
 import net.kyori.adventure.text.Component;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.config.ConfigOption;
-import xiamomc.morph.config.MorphConfigManager;
+import xyz.nifeather.morph.config.ConfigOption;
+import xyz.nifeather.morph.config.MorphConfigManager;
 import xiamomc.pluginbase.Annotations.Initializer;
 import xiamomc.pluginbase.Bindables.Bindable;
 
diff --git a/src/main/java/xiamomc/morph/messages/vanilla/VanillaMessageSubStore.java b/src/main/java/xyz/nifeather/morph/messages/vanilla/VanillaMessageSubStore.java
similarity index 88%
rename from src/main/java/xiamomc/morph/messages/vanilla/VanillaMessageSubStore.java
rename to src/main/java/xyz/nifeather/morph/messages/vanilla/VanillaMessageSubStore.java
index 0733afb2..605f1e01 100644
--- a/src/main/java/xiamomc/morph/messages/vanilla/VanillaMessageSubStore.java
+++ b/src/main/java/xyz/nifeather/morph/messages/vanilla/VanillaMessageSubStore.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.messages.vanilla;
+package xyz.nifeather.morph.messages.vanilla;
 
 import org.jetbrains.annotations.NotNull;
 
diff --git a/src/main/java/xiamomc/morph/misc/AnimationNames.java b/src/main/java/xyz/nifeather/morph/misc/AnimationNames.java
similarity index 98%
rename from src/main/java/xiamomc/morph/misc/AnimationNames.java
rename to src/main/java/xyz/nifeather/morph/misc/AnimationNames.java
index 1dc5a13f..2f3360c3 100644
--- a/src/main/java/xiamomc/morph/misc/AnimationNames.java
+++ b/src/main/java/xyz/nifeather/morph/misc/AnimationNames.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.misc;
+package xyz.nifeather.morph.misc;
 
 public class AnimationNames
 {
diff --git a/src/main/java/xiamomc/morph/misc/AnimationSequence.java b/src/main/java/xyz/nifeather/morph/misc/AnimationSequence.java
similarity index 95%
rename from src/main/java/xiamomc/morph/misc/AnimationSequence.java
rename to src/main/java/xyz/nifeather/morph/misc/AnimationSequence.java
index 8e083415..f72992aa 100644
--- a/src/main/java/xiamomc/morph/misc/AnimationSequence.java
+++ b/src/main/java/xyz/nifeather/morph/misc/AnimationSequence.java
@@ -1,12 +1,12 @@
-package xiamomc.morph.misc;
+package xyz.nifeather.morph.misc;
 
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 import oshi.util.tuples.Pair;
-import xiamomc.morph.MorphPluginObject;
-import xiamomc.morph.providers.animation.SingleAnimation;
-import xiamomc.morph.providers.animation.AnimationSet;
+import xyz.nifeather.morph.MorphPluginObject;
+import xyz.nifeather.morph.providers.animation.SingleAnimation;
+import xyz.nifeather.morph.providers.animation.AnimationSet;
 
 import java.util.Collections;
 import java.util.List;
diff --git a/src/main/java/xiamomc/morph/misc/BlockDestroyHandler.java b/src/main/java/xyz/nifeather/morph/misc/BlockDestroyHandler.java
similarity index 99%
rename from src/main/java/xiamomc/morph/misc/BlockDestroyHandler.java
rename to src/main/java/xyz/nifeather/morph/misc/BlockDestroyHandler.java
index c30cf8fe..a9f839b9 100644
--- a/src/main/java/xiamomc/morph/misc/BlockDestroyHandler.java
+++ b/src/main/java/xyz/nifeather/morph/misc/BlockDestroyHandler.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.misc;
+package xyz.nifeather.morph.misc;
 
 import net.minecraft.server.level.ServerLevel;
 import net.minecraft.server.level.ServerPlayer;
diff --git a/src/main/java/xiamomc/morph/misc/CapeURL.java b/src/main/java/xyz/nifeather/morph/misc/CapeURL.java
similarity index 97%
rename from src/main/java/xiamomc/morph/misc/CapeURL.java
rename to src/main/java/xyz/nifeather/morph/misc/CapeURL.java
index eaa41dc1..e5749ac9 100644
--- a/src/main/java/xiamomc/morph/misc/CapeURL.java
+++ b/src/main/java/xyz/nifeather/morph/misc/CapeURL.java
@@ -1,7 +1,7 @@
-package xiamomc.morph.misc;
+package xyz.nifeather.morph.misc;
 
-import xiamomc.morph.MorphPlugin;
-import xiamomc.morph.messages.CapeStrings;
+import xyz.nifeather.morph.MorphPlugin;
+import xyz.nifeather.morph.messages.CapeStrings;
 import xiamomc.pluginbase.Messages.FormattableMessage;
 
 public class CapeURL
diff --git a/src/main/java/xiamomc/morph/misc/CollisionBoxRecord.java b/src/main/java/xyz/nifeather/morph/misc/CollisionBoxRecord.java
similarity index 94%
rename from src/main/java/xiamomc/morph/misc/CollisionBoxRecord.java
rename to src/main/java/xyz/nifeather/morph/misc/CollisionBoxRecord.java
index 8342e5e4..8aafcee4 100644
--- a/src/main/java/xiamomc/morph/misc/CollisionBoxRecord.java
+++ b/src/main/java/xyz/nifeather/morph/misc/CollisionBoxRecord.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.misc;
+package xyz.nifeather.morph.misc;
 
 import net.minecraft.world.phys.AABB;
 
diff --git a/src/main/java/xiamomc/morph/misc/DisguiseBuildResult.java b/src/main/java/xyz/nifeather/morph/misc/DisguiseBuildResult.java
similarity index 91%
rename from src/main/java/xiamomc/morph/misc/DisguiseBuildResult.java
rename to src/main/java/xyz/nifeather/morph/misc/DisguiseBuildResult.java
index bddc84ef..6b5cdbe1 100644
--- a/src/main/java/xiamomc/morph/misc/DisguiseBuildResult.java
+++ b/src/main/java/xyz/nifeather/morph/misc/DisguiseBuildResult.java
@@ -1,8 +1,8 @@
-package xiamomc.morph.misc;
+package xyz.nifeather.morph.misc;
 
 import org.bukkit.entity.Entity;
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.providers.disguise.DisguiseProvider;
+import xyz.nifeather.morph.providers.disguise.DisguiseProvider;
 
 import java.util.Objects;
 
diff --git a/src/main/java/xiamomc/morph/misc/DisguiseEquipment.java b/src/main/java/xyz/nifeather/morph/misc/DisguiseEquipment.java
similarity index 98%
rename from src/main/java/xiamomc/morph/misc/DisguiseEquipment.java
rename to src/main/java/xyz/nifeather/morph/misc/DisguiseEquipment.java
index d292b150..d93f1882 100644
--- a/src/main/java/xiamomc/morph/misc/DisguiseEquipment.java
+++ b/src/main/java/xyz/nifeather/morph/misc/DisguiseEquipment.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.misc;
+package xyz.nifeather.morph.misc;
 
 import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
 import org.apache.commons.lang3.NotImplementedException;
@@ -8,8 +8,8 @@
 import org.bukkit.inventory.ItemStack;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.utilities.DisguiseUtils;
-import xiamomc.morph.utilities.ItemUtils;
+import xyz.nifeather.morph.utilities.DisguiseUtils;
+import xyz.nifeather.morph.utilities.ItemUtils;
 
 import java.util.Arrays;
 import java.util.Map;
diff --git a/src/main/java/xiamomc/morph/misc/DisguiseMeta.java b/src/main/java/xyz/nifeather/morph/misc/DisguiseMeta.java
similarity index 95%
rename from src/main/java/xiamomc/morph/misc/DisguiseMeta.java
rename to src/main/java/xyz/nifeather/morph/misc/DisguiseMeta.java
index 074508ea..640c392f 100644
--- a/src/main/java/xiamomc/morph/misc/DisguiseMeta.java
+++ b/src/main/java/xyz/nifeather/morph/misc/DisguiseMeta.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.misc;
+package xyz.nifeather.morph.misc;
 
 import com.google.gson.annotations.Expose;
 import com.google.gson.annotations.SerializedName;
@@ -7,9 +7,9 @@
 import org.jetbrains.annotations.ApiStatus;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.MorphManager;
-import xiamomc.morph.providers.disguise.DisguiseProvider;
-import xiamomc.morph.utilities.EntityTypeUtils;
+import xyz.nifeather.morph.MorphManager;
+import xyz.nifeather.morph.providers.disguise.DisguiseProvider;
+import xyz.nifeather.morph.utilities.EntityTypeUtils;
 
 public class DisguiseMeta
 {
diff --git a/src/main/java/xiamomc/morph/misc/DisguiseState.java b/src/main/java/xyz/nifeather/morph/misc/DisguiseState.java
similarity index 95%
rename from src/main/java/xiamomc/morph/misc/DisguiseState.java
rename to src/main/java/xyz/nifeather/morph/misc/DisguiseState.java
index 5e173e42..c037b609 100644
--- a/src/main/java/xiamomc/morph/misc/DisguiseState.java
+++ b/src/main/java/xyz/nifeather/morph/misc/DisguiseState.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.misc;
+package xyz.nifeather.morph.misc;
 
 import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap;
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
@@ -13,38 +13,38 @@
 import org.jetbrains.annotations.ApiStatus;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.MorphManager;
-import xiamomc.morph.MorphPluginObject;
-import xiamomc.morph.abilities.AbilityUpdater;
-import xiamomc.morph.backends.DisguiseWrapper;
-import xiamomc.morph.messages.CommandStrings;
-import xiamomc.morph.messages.EmoteStrings;
-import xiamomc.morph.messages.MessageUtils;
-import xiamomc.morph.providers.animation.SingleAnimation;
-import xiamomc.morph.misc.disguiseProperty.PropertyHandler;
-import xiamomc.morph.misc.permissions.CommonPermissions;
+import xyz.nifeather.morph.MorphManager;
+import xyz.nifeather.morph.MorphPluginObject;
+import xyz.nifeather.morph.abilities.AbilityUpdater;
+import xyz.nifeather.morph.backends.DisguiseWrapper;
+import xyz.nifeather.morph.messages.CommandStrings;
+import xyz.nifeather.morph.messages.EmoteStrings;
+import xyz.nifeather.morph.messages.MessageUtils;
+import xyz.nifeather.morph.providers.animation.SingleAnimation;
+import xyz.nifeather.morph.misc.disguiseProperty.PropertyHandler;
+import xyz.nifeather.morph.misc.permissions.CommonPermissions;
 import xiamomc.morph.network.PlayerOptions;
 import xiamomc.morph.network.commands.S2C.S2CAnimationCommand;
 import xiamomc.morph.network.commands.S2C.set.S2CSetAnimationDisplayNameCommand;
 import xiamomc.morph.network.commands.S2C.set.S2CSetSkillCooldownCommand;
-import xiamomc.morph.network.server.MorphClientHandler;
-import xiamomc.morph.providers.disguise.DisguiseProvider;
-import xiamomc.morph.skills.IMorphSkill;
-import xiamomc.morph.skills.MorphSkillHandler;
-import xiamomc.morph.skills.SkillCooldownInfo;
-import xiamomc.morph.skills.SkillType;
-import xiamomc.morph.skills.impl.NoneMorphSkill;
-import xiamomc.morph.storage.playerdata.PlayerMeta;
-import xiamomc.morph.utilities.ItemUtils;
-import xiamomc.morph.utilities.NbtUtils;
-import xiamomc.morph.utilities.PermissionUtils;
+import xyz.nifeather.morph.network.server.MorphClientHandler;
+import xyz.nifeather.morph.providers.disguise.DisguiseProvider;
+import xyz.nifeather.morph.skills.IMorphSkill;
+import xyz.nifeather.morph.skills.MorphSkillHandler;
+import xyz.nifeather.morph.skills.SkillCooldownInfo;
+import xyz.nifeather.morph.skills.SkillType;
+import xyz.nifeather.morph.skills.impl.NoneMorphSkill;
+import xyz.nifeather.morph.storage.playerdata.PlayerMeta;
+import xyz.nifeather.morph.utilities.ItemUtils;
+import xyz.nifeather.morph.utilities.NbtUtils;
+import xyz.nifeather.morph.utilities.PermissionUtils;
 import xiamomc.pluginbase.Annotations.Resolved;
 import xiamomc.pluginbase.Exceptions.NullDependencyException;
 
 import java.util.*;
 import java.util.concurrent.atomic.AtomicBoolean;
 
-import static xiamomc.morph.utilities.DisguiseUtils.itemOrAir;
+import static xyz.nifeather.morph.utilities.DisguiseUtils.itemOrAir;
 
 public class DisguiseState extends MorphPluginObject
 {
diff --git a/src/main/java/xiamomc/morph/misc/DisguiseStateGenerator.java b/src/main/java/xyz/nifeather/morph/misc/DisguiseStateGenerator.java
similarity index 90%
rename from src/main/java/xiamomc/morph/misc/DisguiseStateGenerator.java
rename to src/main/java/xyz/nifeather/morph/misc/DisguiseStateGenerator.java
index cdbdd856..325177bc 100644
--- a/src/main/java/xiamomc/morph/misc/DisguiseStateGenerator.java
+++ b/src/main/java/xyz/nifeather/morph/misc/DisguiseStateGenerator.java
@@ -1,17 +1,17 @@
-package xiamomc.morph.misc;
+package xyz.nifeather.morph.misc;
 
 import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer;
 import org.bukkit.Bukkit;
 import org.bukkit.entity.Player;
-import xiamomc.morph.MorphManager;
-import xiamomc.morph.MorphPlugin;
-import xiamomc.morph.backends.DisguiseBackend;
+import xyz.nifeather.morph.MorphManager;
+import xyz.nifeather.morph.MorphPlugin;
+import xyz.nifeather.morph.backends.DisguiseBackend;
 import xiamomc.morph.network.PlayerOptions;
-import xiamomc.morph.skills.MorphSkillHandler;
-import xiamomc.morph.skills.SkillType;
-import xiamomc.morph.storage.offlinestore.OfflineDisguiseState;
-import xiamomc.morph.storage.playerdata.PlayerMeta;
-import xiamomc.morph.utilities.NbtUtils;
+import xyz.nifeather.morph.skills.MorphSkillHandler;
+import xyz.nifeather.morph.skills.SkillType;
+import xyz.nifeather.morph.storage.offlinestore.OfflineDisguiseState;
+import xyz.nifeather.morph.storage.playerdata.PlayerMeta;
+import xyz.nifeather.morph.utilities.NbtUtils;
 
 public class DisguiseStateGenerator
 {
diff --git a/src/main/java/xiamomc/morph/misc/DisguiseTypes.java b/src/main/java/xyz/nifeather/morph/misc/DisguiseTypes.java
similarity index 98%
rename from src/main/java/xiamomc/morph/misc/DisguiseTypes.java
rename to src/main/java/xyz/nifeather/morph/misc/DisguiseTypes.java
index fa772db5..7dac5057 100644
--- a/src/main/java/xiamomc/morph/misc/DisguiseTypes.java
+++ b/src/main/java/xyz/nifeather/morph/misc/DisguiseTypes.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.misc;
+package xyz.nifeather.morph.misc;
 
 import org.bukkit.NamespacedKey;
 
diff --git a/src/main/java/xiamomc/morph/misc/MorphChatRenderer.java b/src/main/java/xyz/nifeather/morph/misc/MorphChatRenderer.java
similarity index 90%
rename from src/main/java/xiamomc/morph/misc/MorphChatRenderer.java
rename to src/main/java/xyz/nifeather/morph/misc/MorphChatRenderer.java
index 3fc03da4..f33b1b90 100644
--- a/src/main/java/xiamomc/morph/misc/MorphChatRenderer.java
+++ b/src/main/java/xyz/nifeather/morph/misc/MorphChatRenderer.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.misc;
+package xyz.nifeather.morph.misc;
 
 import io.papermc.paper.chat.ChatRenderer;
 import net.kyori.adventure.audience.Audience;
@@ -6,13 +6,13 @@
 import org.bukkit.entity.Player;
 import org.bukkit.permissions.Permissible;
 import org.jetbrains.annotations.NotNull;
-import xiamomc.morph.MorphManager;
-import xiamomc.morph.MorphPlugin;
-import xiamomc.morph.MorphPluginObject;
-import xiamomc.morph.config.ConfigOption;
-import xiamomc.morph.config.MorphConfigManager;
-import xiamomc.morph.messages.MessageUtils;
-import xiamomc.morph.misc.permissions.CommonPermissions;
+import xyz.nifeather.morph.MorphManager;
+import xyz.nifeather.morph.MorphPlugin;
+import xyz.nifeather.morph.MorphPluginObject;
+import xyz.nifeather.morph.config.ConfigOption;
+import xyz.nifeather.morph.config.MorphConfigManager;
+import xyz.nifeather.morph.messages.MessageUtils;
+import xyz.nifeather.morph.misc.permissions.CommonPermissions;
 import xiamomc.pluginbase.Annotations.Resolved;
 import xiamomc.pluginbase.Messages.FormattableMessage;
 
diff --git a/src/main/java/xiamomc/morph/misc/MorphGameProfile.java b/src/main/java/xyz/nifeather/morph/misc/MorphGameProfile.java
similarity index 98%
rename from src/main/java/xiamomc/morph/misc/MorphGameProfile.java
rename to src/main/java/xyz/nifeather/morph/misc/MorphGameProfile.java
index c8598c4a..15c6f815 100644
--- a/src/main/java/xiamomc/morph/misc/MorphGameProfile.java
+++ b/src/main/java/xyz/nifeather/morph/misc/MorphGameProfile.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.misc;
+package xyz.nifeather.morph.misc;
 
 import com.destroystokyo.paper.profile.PlayerProfile;
 import com.mojang.authlib.GameProfile;
diff --git a/src/main/java/xiamomc/morph/misc/MorphParameters.java b/src/main/java/xyz/nifeather/morph/misc/MorphParameters.java
similarity index 98%
rename from src/main/java/xiamomc/morph/misc/MorphParameters.java
rename to src/main/java/xyz/nifeather/morph/misc/MorphParameters.java
index c81e4e3b..0e0470cb 100644
--- a/src/main/java/xiamomc/morph/misc/MorphParameters.java
+++ b/src/main/java/xyz/nifeather/morph/misc/MorphParameters.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.misc;
+package xyz.nifeather.morph.misc;
 
 import org.bukkit.command.CommandSender;
 import org.bukkit.entity.Entity;
diff --git a/src/main/java/xiamomc/morph/misc/NetworkingHelper.java b/src/main/java/xyz/nifeather/morph/misc/NetworkingHelper.java
similarity index 91%
rename from src/main/java/xiamomc/morph/misc/NetworkingHelper.java
rename to src/main/java/xyz/nifeather/morph/misc/NetworkingHelper.java
index 93e1d0e3..f5a594fe 100644
--- a/src/main/java/xiamomc/morph/misc/NetworkingHelper.java
+++ b/src/main/java/xyz/nifeather/morph/misc/NetworkingHelper.java
@@ -1,22 +1,22 @@
-package xiamomc.morph.misc;
+package xyz.nifeather.morph.misc;
 
 import com.mojang.authlib.GameProfile;
 import net.minecraft.Util;
 import org.bukkit.Bukkit;
 import org.bukkit.entity.Entity;
 import org.bukkit.inventory.EntityEquipment;
-import xiamomc.morph.MorphPluginObject;
-import xiamomc.morph.backends.DisguiseWrapper;
-import xiamomc.morph.backends.WrapperAttribute;
-import xiamomc.morph.misc.permissions.CommonPermissions;
+import xyz.nifeather.morph.MorphPluginObject;
+import xyz.nifeather.morph.backends.DisguiseWrapper;
+import xyz.nifeather.morph.backends.WrapperAttribute;
+import xyz.nifeather.morph.misc.permissions.CommonPermissions;
 import xiamomc.morph.network.commands.S2C.AbstractS2CCommand;
 import xiamomc.morph.network.commands.S2C.clientrender.S2CRenderMapAddCommand;
 import xiamomc.morph.network.commands.S2C.clientrender.S2CRenderMapMetaCommand;
 import xiamomc.morph.network.commands.S2C.clientrender.S2CRenderMeta;
 import xiamomc.morph.network.commands.S2C.map.S2CPartialMapCommand;
-import xiamomc.morph.network.server.MorphClientHandler;
-import xiamomc.morph.utilities.MapMetaUtils;
-import xiamomc.morph.utilities.NbtUtils;
+import xyz.nifeather.morph.network.server.MorphClientHandler;
+import xyz.nifeather.morph.utilities.MapMetaUtils;
+import xyz.nifeather.morph.utilities.NbtUtils;
 import xiamomc.pluginbase.Annotations.Resolved;
 
 import java.util.HashMap;
diff --git a/src/main/java/xiamomc/morph/misc/NilCommandSource.java b/src/main/java/xyz/nifeather/morph/misc/NilCommandSource.java
similarity index 97%
rename from src/main/java/xiamomc/morph/misc/NilCommandSource.java
rename to src/main/java/xyz/nifeather/morph/misc/NilCommandSource.java
index 49874b37..235f30fe 100644
--- a/src/main/java/xiamomc/morph/misc/NilCommandSource.java
+++ b/src/main/java/xyz/nifeather/morph/misc/NilCommandSource.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.misc;
+package xyz.nifeather.morph.misc;
 
 import net.kyori.adventure.text.Component;
 import org.bukkit.craftbukkit.command.ServerCommandSender;
diff --git a/src/main/java/xiamomc/morph/misc/NmsRecord.java b/src/main/java/xyz/nifeather/morph/misc/NmsRecord.java
similarity index 98%
rename from src/main/java/xiamomc/morph/misc/NmsRecord.java
rename to src/main/java/xyz/nifeather/morph/misc/NmsRecord.java
index 6efdd0d4..bc6f0635 100644
--- a/src/main/java/xiamomc/morph/misc/NmsRecord.java
+++ b/src/main/java/xyz/nifeather/morph/misc/NmsRecord.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.misc;
+package xyz.nifeather.morph.misc;
 
 import net.minecraft.server.level.ServerLevel;
 import net.minecraft.server.level.ServerPlayer;
diff --git a/src/main/java/xiamomc/morph/misc/OfflineDisguiseResult.java b/src/main/java/xyz/nifeather/morph/misc/OfflineDisguiseResult.java
similarity index 68%
rename from src/main/java/xiamomc/morph/misc/OfflineDisguiseResult.java
rename to src/main/java/xyz/nifeather/morph/misc/OfflineDisguiseResult.java
index 6b026d82..ce74c67b 100644
--- a/src/main/java/xiamomc/morph/misc/OfflineDisguiseResult.java
+++ b/src/main/java/xyz/nifeather/morph/misc/OfflineDisguiseResult.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.misc;
+package xyz.nifeather.morph.misc;
 
 public enum OfflineDisguiseResult
 {
diff --git a/src/main/java/xiamomc/morph/misc/PlayerOperationSimulator.java b/src/main/java/xyz/nifeather/morph/misc/PlayerOperationSimulator.java
similarity index 98%
rename from src/main/java/xiamomc/morph/misc/PlayerOperationSimulator.java
rename to src/main/java/xyz/nifeather/morph/misc/PlayerOperationSimulator.java
index 025bb883..7fa6bffb 100644
--- a/src/main/java/xiamomc/morph/misc/PlayerOperationSimulator.java
+++ b/src/main/java/xyz/nifeather/morph/misc/PlayerOperationSimulator.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.misc;
+package xyz.nifeather.morph.misc;
 
 import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
 import net.minecraft.core.Direction;
@@ -26,9 +26,9 @@
 import org.bukkit.plugin.PluginManager;
 import org.bukkit.util.RayTraceResult;
 import org.bukkit.util.Vector;
-import xiamomc.morph.MorphPluginObject;
-import xiamomc.morph.config.ConfigOption;
-import xiamomc.morph.config.MorphConfigManager;
+import xyz.nifeather.morph.MorphPluginObject;
+import xyz.nifeather.morph.config.ConfigOption;
+import xyz.nifeather.morph.config.MorphConfigManager;
 import xiamomc.pluginbase.Annotations.Initializer;
 import xiamomc.pluginbase.Bindables.Bindable;
 
diff --git a/src/main/java/xiamomc/morph/misc/RequestInfo.java b/src/main/java/xyz/nifeather/morph/misc/RequestInfo.java
similarity index 91%
rename from src/main/java/xiamomc/morph/misc/RequestInfo.java
rename to src/main/java/xyz/nifeather/morph/misc/RequestInfo.java
index 2eed6216..25dbc5bc 100644
--- a/src/main/java/xiamomc/morph/misc/RequestInfo.java
+++ b/src/main/java/xyz/nifeather/morph/misc/RequestInfo.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.misc;
+package xyz.nifeather.morph.misc;
 
 import org.bukkit.entity.Player;
 
diff --git a/src/main/java/xiamomc/morph/misc/SoundHandler.java b/src/main/java/xyz/nifeather/morph/misc/SoundHandler.java
similarity index 93%
rename from src/main/java/xiamomc/morph/misc/SoundHandler.java
rename to src/main/java/xyz/nifeather/morph/misc/SoundHandler.java
index 4338a334..dd5e917a 100644
--- a/src/main/java/xiamomc/morph/misc/SoundHandler.java
+++ b/src/main/java/xyz/nifeather/morph/misc/SoundHandler.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.misc;
+package xyz.nifeather.morph.misc;
 
 import net.kyori.adventure.sound.Sound;
 import net.minecraft.sounds.SoundEvents;
@@ -8,11 +8,11 @@
 import org.bukkit.entity.Player;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.config.ConfigOption;
-import xiamomc.morph.config.MorphConfigManager;
-import xiamomc.morph.utilities.EntityTypeUtils;
-import xiamomc.morph.utilities.MathUtils;
-import xiamomc.morph.utilities.SoundUtils;
+import xyz.nifeather.morph.config.ConfigOption;
+import xyz.nifeather.morph.config.MorphConfigManager;
+import xyz.nifeather.morph.utilities.EntityTypeUtils;
+import xyz.nifeather.morph.utilities.MathUtils;
+import xyz.nifeather.morph.utilities.SoundUtils;
 
 import java.util.Random;
 
diff --git a/src/main/java/xiamomc/morph/misc/disguiseProperty/DisguiseProperties.java b/src/main/java/xyz/nifeather/morph/misc/disguiseProperty/DisguiseProperties.java
similarity index 94%
rename from src/main/java/xiamomc/morph/misc/disguiseProperty/DisguiseProperties.java
rename to src/main/java/xyz/nifeather/morph/misc/disguiseProperty/DisguiseProperties.java
index 88d79dfd..3937681d 100644
--- a/src/main/java/xiamomc/morph/misc/disguiseProperty/DisguiseProperties.java
+++ b/src/main/java/xyz/nifeather/morph/misc/disguiseProperty/DisguiseProperties.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.misc.disguiseProperty;
+package xyz.nifeather.morph.misc.disguiseProperty;
 
 import org.bukkit.entity.EntityType;
 import org.jetbrains.annotations.NotNull;
@@ -6,6 +6,8 @@
 import org.slf4j.LoggerFactory;
 import xiamomc.morph.misc.disguiseProperty.values.*;
 import xiamomc.pluginbase.Exceptions.NullDependencyException;
+import xyz.nifeather.morph.misc.disguiseProperty.values.*;
+import xyz.nifeather.morph.morph.misc.disguiseProperty.values.*;
 
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
diff --git a/src/main/java/xiamomc/morph/misc/disguiseProperty/PropertyHandler.java b/src/main/java/xyz/nifeather/morph/misc/disguiseProperty/PropertyHandler.java
similarity index 94%
rename from src/main/java/xiamomc/morph/misc/disguiseProperty/PropertyHandler.java
rename to src/main/java/xyz/nifeather/morph/misc/disguiseProperty/PropertyHandler.java
index a2ea73f4..f24966aa 100644
--- a/src/main/java/xiamomc/morph/misc/disguiseProperty/PropertyHandler.java
+++ b/src/main/java/xyz/nifeather/morph/misc/disguiseProperty/PropertyHandler.java
@@ -1,12 +1,12 @@
-package xiamomc.morph.misc.disguiseProperty;
+package xyz.nifeather.morph.misc.disguiseProperty;
 
 import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap;
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
 import org.jetbrains.annotations.Contract;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.MorphPlugin;
-import xiamomc.morph.misc.disguiseProperty.values.AbstractProperties;
+import xyz.nifeather.morph.MorphPlugin;
+import xyz.nifeather.morph.misc.disguiseProperty.values.AbstractProperties;
 
 import java.util.List;
 import java.util.Map;
diff --git a/src/main/java/xiamomc/morph/misc/disguiseProperty/SingleProperty.java b/src/main/java/xyz/nifeather/morph/misc/disguiseProperty/SingleProperty.java
similarity index 96%
rename from src/main/java/xiamomc/morph/misc/disguiseProperty/SingleProperty.java
rename to src/main/java/xyz/nifeather/morph/misc/disguiseProperty/SingleProperty.java
index 3bc8da41..374d18b4 100644
--- a/src/main/java/xiamomc/morph/misc/disguiseProperty/SingleProperty.java
+++ b/src/main/java/xyz/nifeather/morph/misc/disguiseProperty/SingleProperty.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.misc.disguiseProperty;
+package xyz.nifeather.morph.misc.disguiseProperty;
 
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
 
diff --git a/src/main/java/xiamomc/morph/misc/disguiseProperty/values/AbstractProperties.java b/src/main/java/xyz/nifeather/morph/misc/disguiseProperty/values/AbstractProperties.java
similarity index 87%
rename from src/main/java/xiamomc/morph/misc/disguiseProperty/values/AbstractProperties.java
rename to src/main/java/xyz/nifeather/morph/misc/disguiseProperty/values/AbstractProperties.java
index 2996fc20..02f7fd76 100644
--- a/src/main/java/xiamomc/morph/misc/disguiseProperty/values/AbstractProperties.java
+++ b/src/main/java/xyz/nifeather/morph/misc/disguiseProperty/values/AbstractProperties.java
@@ -1,9 +1,9 @@
-package xiamomc.morph.misc.disguiseProperty.values;
+package xyz.nifeather.morph.misc.disguiseProperty.values;
 
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
 import org.slf4j.Logger;
-import xiamomc.morph.MorphPlugin;
-import xiamomc.morph.misc.disguiseProperty.SingleProperty;
+import xyz.nifeather.morph.MorphPlugin;
+import xyz.nifeather.morph.misc.disguiseProperty.SingleProperty;
 
 import java.util.List;
 
diff --git a/src/main/java/xiamomc/morph/misc/disguiseProperty/values/ArmorStandProperties.java b/src/main/java/xyz/nifeather/morph/misc/disguiseProperty/values/ArmorStandProperties.java
similarity index 65%
rename from src/main/java/xiamomc/morph/misc/disguiseProperty/values/ArmorStandProperties.java
rename to src/main/java/xyz/nifeather/morph/misc/disguiseProperty/values/ArmorStandProperties.java
index a59eb664..1ed6f086 100644
--- a/src/main/java/xiamomc/morph/misc/disguiseProperty/values/ArmorStandProperties.java
+++ b/src/main/java/xyz/nifeather/morph/misc/disguiseProperty/values/ArmorStandProperties.java
@@ -1,6 +1,6 @@
-package xiamomc.morph.misc.disguiseProperty.values;
+package xyz.nifeather.morph.misc.disguiseProperty.values;
 
-import xiamomc.morph.misc.disguiseProperty.SingleProperty;
+import xyz.nifeather.morph.misc.disguiseProperty.SingleProperty;
 
 public class ArmorStandProperties extends AbstractProperties
 {
diff --git a/src/main/java/xiamomc/morph/misc/disguiseProperty/values/AxolotlProperties.java b/src/main/java/xyz/nifeather/morph/misc/disguiseProperty/values/AxolotlProperties.java
similarity index 73%
rename from src/main/java/xiamomc/morph/misc/disguiseProperty/values/AxolotlProperties.java
rename to src/main/java/xyz/nifeather/morph/misc/disguiseProperty/values/AxolotlProperties.java
index 0ac4a9ce..f726ae98 100644
--- a/src/main/java/xiamomc/morph/misc/disguiseProperty/values/AxolotlProperties.java
+++ b/src/main/java/xyz/nifeather/morph/misc/disguiseProperty/values/AxolotlProperties.java
@@ -1,7 +1,7 @@
-package xiamomc.morph.misc.disguiseProperty.values;
+package xyz.nifeather.morph.misc.disguiseProperty.values;
 
 import org.bukkit.entity.Axolotl;
-import xiamomc.morph.misc.disguiseProperty.SingleProperty;
+import xyz.nifeather.morph.misc.disguiseProperty.SingleProperty;
 
 public class AxolotlProperties extends AbstractProperties
 {
diff --git a/src/main/java/xiamomc/morph/misc/disguiseProperty/values/CatProperties.java b/src/main/java/xyz/nifeather/morph/misc/disguiseProperty/values/CatProperties.java
similarity index 77%
rename from src/main/java/xiamomc/morph/misc/disguiseProperty/values/CatProperties.java
rename to src/main/java/xyz/nifeather/morph/misc/disguiseProperty/values/CatProperties.java
index b26e9181..62040c71 100644
--- a/src/main/java/xiamomc/morph/misc/disguiseProperty/values/CatProperties.java
+++ b/src/main/java/xyz/nifeather/morph/misc/disguiseProperty/values/CatProperties.java
@@ -1,8 +1,8 @@
-package xiamomc.morph.misc.disguiseProperty.values;
+package xyz.nifeather.morph.misc.disguiseProperty.values;
 
 import org.bukkit.Registry;
 import org.bukkit.entity.Cat;
-import xiamomc.morph.misc.disguiseProperty.SingleProperty;
+import xyz.nifeather.morph.misc.disguiseProperty.SingleProperty;
 
 public class CatProperties extends AbstractProperties
 {
diff --git a/src/main/java/xiamomc/morph/misc/disguiseProperty/values/DefaultProperties.java b/src/main/java/xyz/nifeather/morph/misc/disguiseProperty/values/DefaultProperties.java
similarity index 52%
rename from src/main/java/xiamomc/morph/misc/disguiseProperty/values/DefaultProperties.java
rename to src/main/java/xyz/nifeather/morph/misc/disguiseProperty/values/DefaultProperties.java
index 90c6e336..7a260d6e 100644
--- a/src/main/java/xiamomc/morph/misc/disguiseProperty/values/DefaultProperties.java
+++ b/src/main/java/xyz/nifeather/morph/misc/disguiseProperty/values/DefaultProperties.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.misc.disguiseProperty.values;
+package xyz.nifeather.morph.misc.disguiseProperty.values;
 
 public class DefaultProperties extends AbstractProperties
 {
diff --git a/src/main/java/xiamomc/morph/misc/disguiseProperty/values/FoxProperties.java b/src/main/java/xyz/nifeather/morph/misc/disguiseProperty/values/FoxProperties.java
similarity index 70%
rename from src/main/java/xiamomc/morph/misc/disguiseProperty/values/FoxProperties.java
rename to src/main/java/xyz/nifeather/morph/misc/disguiseProperty/values/FoxProperties.java
index 23034d66..477c5f43 100644
--- a/src/main/java/xiamomc/morph/misc/disguiseProperty/values/FoxProperties.java
+++ b/src/main/java/xyz/nifeather/morph/misc/disguiseProperty/values/FoxProperties.java
@@ -1,7 +1,7 @@
-package xiamomc.morph.misc.disguiseProperty.values;
+package xyz.nifeather.morph.misc.disguiseProperty.values;
 
 import org.bukkit.entity.Fox;
-import xiamomc.morph.misc.disguiseProperty.SingleProperty;
+import xyz.nifeather.morph.misc.disguiseProperty.SingleProperty;
 
 public class FoxProperties extends AbstractProperties
 {
diff --git a/src/main/java/xiamomc/morph/misc/disguiseProperty/values/FrogProperties.java b/src/main/java/xyz/nifeather/morph/misc/disguiseProperty/values/FrogProperties.java
similarity index 75%
rename from src/main/java/xiamomc/morph/misc/disguiseProperty/values/FrogProperties.java
rename to src/main/java/xyz/nifeather/morph/misc/disguiseProperty/values/FrogProperties.java
index fb368ce5..bfc4c6b0 100644
--- a/src/main/java/xiamomc/morph/misc/disguiseProperty/values/FrogProperties.java
+++ b/src/main/java/xyz/nifeather/morph/misc/disguiseProperty/values/FrogProperties.java
@@ -1,7 +1,7 @@
-package xiamomc.morph.misc.disguiseProperty.values;
+package xyz.nifeather.morph.misc.disguiseProperty.values;
 
 import org.bukkit.entity.Frog;
-import xiamomc.morph.misc.disguiseProperty.SingleProperty;
+import xyz.nifeather.morph.misc.disguiseProperty.SingleProperty;
 
 public class FrogProperties extends AbstractProperties
 {
diff --git a/src/main/java/xiamomc/morph/misc/disguiseProperty/values/GoatProperties.java b/src/main/java/xyz/nifeather/morph/misc/disguiseProperty/values/GoatProperties.java
similarity index 78%
rename from src/main/java/xiamomc/morph/misc/disguiseProperty/values/GoatProperties.java
rename to src/main/java/xyz/nifeather/morph/misc/disguiseProperty/values/GoatProperties.java
index 810374bb..89c6b13b 100644
--- a/src/main/java/xiamomc/morph/misc/disguiseProperty/values/GoatProperties.java
+++ b/src/main/java/xyz/nifeather/morph/misc/disguiseProperty/values/GoatProperties.java
@@ -1,6 +1,6 @@
-package xiamomc.morph.misc.disguiseProperty.values;
+package xyz.nifeather.morph.misc.disguiseProperty.values;
 
-import xiamomc.morph.misc.disguiseProperty.SingleProperty;
+import xyz.nifeather.morph.misc.disguiseProperty.SingleProperty;
 
 public class GoatProperties extends AbstractProperties
 {
diff --git a/src/main/java/xiamomc/morph/misc/disguiseProperty/values/HorseProperties.java b/src/main/java/xyz/nifeather/morph/misc/disguiseProperty/values/HorseProperties.java
similarity index 78%
rename from src/main/java/xiamomc/morph/misc/disguiseProperty/values/HorseProperties.java
rename to src/main/java/xyz/nifeather/morph/misc/disguiseProperty/values/HorseProperties.java
index 6491a1f9..517353a0 100644
--- a/src/main/java/xiamomc/morph/misc/disguiseProperty/values/HorseProperties.java
+++ b/src/main/java/xyz/nifeather/morph/misc/disguiseProperty/values/HorseProperties.java
@@ -1,7 +1,7 @@
-package xiamomc.morph.misc.disguiseProperty.values;
+package xyz.nifeather.morph.misc.disguiseProperty.values;
 
 import org.bukkit.entity.Horse;
-import xiamomc.morph.misc.disguiseProperty.SingleProperty;
+import xyz.nifeather.morph.misc.disguiseProperty.SingleProperty;
 
 public class HorseProperties extends AbstractProperties
 {
diff --git a/src/main/java/xiamomc/morph/misc/disguiseProperty/values/LlamaProperties.java b/src/main/java/xyz/nifeather/morph/misc/disguiseProperty/values/LlamaProperties.java
similarity index 73%
rename from src/main/java/xiamomc/morph/misc/disguiseProperty/values/LlamaProperties.java
rename to src/main/java/xyz/nifeather/morph/misc/disguiseProperty/values/LlamaProperties.java
index 283d94c3..c1163c50 100644
--- a/src/main/java/xiamomc/morph/misc/disguiseProperty/values/LlamaProperties.java
+++ b/src/main/java/xyz/nifeather/morph/misc/disguiseProperty/values/LlamaProperties.java
@@ -1,8 +1,8 @@
-package xiamomc.morph.misc.disguiseProperty.values;
+package xyz.nifeather.morph.misc.disguiseProperty.values;
 
 import org.bukkit.entity.Llama;
 import org.bukkit.entity.Llama.Color;
-import xiamomc.morph.misc.disguiseProperty.SingleProperty;
+import xyz.nifeather.morph.misc.disguiseProperty.SingleProperty;
 
 public class LlamaProperties extends AbstractProperties
 {
diff --git a/src/main/java/xiamomc/morph/misc/disguiseProperty/values/MooshroomProperties.java b/src/main/java/xyz/nifeather/morph/misc/disguiseProperty/values/MooshroomProperties.java
similarity index 77%
rename from src/main/java/xiamomc/morph/misc/disguiseProperty/values/MooshroomProperties.java
rename to src/main/java/xyz/nifeather/morph/misc/disguiseProperty/values/MooshroomProperties.java
index 5038632d..bfbb0adc 100644
--- a/src/main/java/xiamomc/morph/misc/disguiseProperty/values/MooshroomProperties.java
+++ b/src/main/java/xyz/nifeather/morph/misc/disguiseProperty/values/MooshroomProperties.java
@@ -1,7 +1,7 @@
-package xiamomc.morph.misc.disguiseProperty.values;
+package xyz.nifeather.morph.misc.disguiseProperty.values;
 
 import org.bukkit.entity.MushroomCow;
-import xiamomc.morph.misc.disguiseProperty.SingleProperty;
+import xyz.nifeather.morph.misc.disguiseProperty.SingleProperty;
 
 public class MooshroomProperties extends AbstractProperties
 {
diff --git a/src/main/java/xiamomc/morph/misc/disguiseProperty/values/PandaProperties.java b/src/main/java/xyz/nifeather/morph/misc/disguiseProperty/values/PandaProperties.java
similarity index 80%
rename from src/main/java/xiamomc/morph/misc/disguiseProperty/values/PandaProperties.java
rename to src/main/java/xyz/nifeather/morph/misc/disguiseProperty/values/PandaProperties.java
index 6f388ecc..06bf8421 100644
--- a/src/main/java/xiamomc/morph/misc/disguiseProperty/values/PandaProperties.java
+++ b/src/main/java/xyz/nifeather/morph/misc/disguiseProperty/values/PandaProperties.java
@@ -1,8 +1,8 @@
-package xiamomc.morph.misc.disguiseProperty.values;
+package xyz.nifeather.morph.misc.disguiseProperty.values;
 
 import org.bukkit.entity.Panda;
 import org.bukkit.entity.Panda.Gene;
-import xiamomc.morph.misc.disguiseProperty.SingleProperty;
+import xyz.nifeather.morph.misc.disguiseProperty.SingleProperty;
 
 public class PandaProperties extends AbstractProperties
 {
diff --git a/src/main/java/xiamomc/morph/misc/disguiseProperty/values/ParrotProperties.java b/src/main/java/xyz/nifeather/morph/misc/disguiseProperty/values/ParrotProperties.java
similarity index 74%
rename from src/main/java/xiamomc/morph/misc/disguiseProperty/values/ParrotProperties.java
rename to src/main/java/xyz/nifeather/morph/misc/disguiseProperty/values/ParrotProperties.java
index fdedda23..be78e46e 100644
--- a/src/main/java/xiamomc/morph/misc/disguiseProperty/values/ParrotProperties.java
+++ b/src/main/java/xyz/nifeather/morph/misc/disguiseProperty/values/ParrotProperties.java
@@ -1,8 +1,8 @@
-package xiamomc.morph.misc.disguiseProperty.values;
+package xyz.nifeather.morph.misc.disguiseProperty.values;
 
 import org.bukkit.entity.Parrot;
 import org.bukkit.entity.Parrot.Variant;
-import xiamomc.morph.misc.disguiseProperty.SingleProperty;
+import xyz.nifeather.morph.misc.disguiseProperty.SingleProperty;
 
 public class ParrotProperties extends AbstractProperties
 {
diff --git a/src/main/java/xiamomc/morph/misc/disguiseProperty/values/RabbitProperties.java b/src/main/java/xyz/nifeather/morph/misc/disguiseProperty/values/RabbitProperties.java
similarity index 73%
rename from src/main/java/xiamomc/morph/misc/disguiseProperty/values/RabbitProperties.java
rename to src/main/java/xyz/nifeather/morph/misc/disguiseProperty/values/RabbitProperties.java
index 59fa0f23..dd8bbcca 100644
--- a/src/main/java/xiamomc/morph/misc/disguiseProperty/values/RabbitProperties.java
+++ b/src/main/java/xyz/nifeather/morph/misc/disguiseProperty/values/RabbitProperties.java
@@ -1,8 +1,8 @@
-package xiamomc.morph.misc.disguiseProperty.values;
+package xyz.nifeather.morph.misc.disguiseProperty.values;
 
 import org.bukkit.entity.Rabbit;
 import org.bukkit.entity.Rabbit.Type;
-import xiamomc.morph.misc.disguiseProperty.SingleProperty;
+import xyz.nifeather.morph.misc.disguiseProperty.SingleProperty;
 
 public class RabbitProperties extends AbstractProperties
 {
diff --git a/src/main/java/xiamomc/morph/misc/disguiseProperty/values/VillagerProperties.java b/src/main/java/xyz/nifeather/morph/misc/disguiseProperty/values/VillagerProperties.java
similarity index 85%
rename from src/main/java/xiamomc/morph/misc/disguiseProperty/values/VillagerProperties.java
rename to src/main/java/xyz/nifeather/morph/misc/disguiseProperty/values/VillagerProperties.java
index 760be4f6..0080e352 100644
--- a/src/main/java/xiamomc/morph/misc/disguiseProperty/values/VillagerProperties.java
+++ b/src/main/java/xyz/nifeather/morph/misc/disguiseProperty/values/VillagerProperties.java
@@ -1,8 +1,8 @@
-package xiamomc.morph.misc.disguiseProperty.values;
+package xyz.nifeather.morph.misc.disguiseProperty.values;
 
 import org.bukkit.Registry;
 import org.bukkit.entity.Villager;
-import xiamomc.morph.misc.disguiseProperty.SingleProperty;
+import xyz.nifeather.morph.misc.disguiseProperty.SingleProperty;
 
 public class VillagerProperties extends AbstractProperties
 {
diff --git a/src/main/java/xiamomc/morph/misc/disguiseProperty/values/WolfProperties.java b/src/main/java/xyz/nifeather/morph/misc/disguiseProperty/values/WolfProperties.java
similarity index 84%
rename from src/main/java/xiamomc/morph/misc/disguiseProperty/values/WolfProperties.java
rename to src/main/java/xyz/nifeather/morph/misc/disguiseProperty/values/WolfProperties.java
index 6f0e814d..27c3a77e 100644
--- a/src/main/java/xiamomc/morph/misc/disguiseProperty/values/WolfProperties.java
+++ b/src/main/java/xyz/nifeather/morph/misc/disguiseProperty/values/WolfProperties.java
@@ -1,8 +1,8 @@
-package xiamomc.morph.misc.disguiseProperty.values;
+package xyz.nifeather.morph.misc.disguiseProperty.values;
 
 import org.bukkit.entity.Wolf;
 import org.bukkit.entity.Wolf.Variant;
-import xiamomc.morph.misc.disguiseProperty.SingleProperty;
+import xyz.nifeather.morph.misc.disguiseProperty.SingleProperty;
 
 public class WolfProperties extends AbstractProperties
 {
diff --git a/src/main/java/xiamomc/morph/misc/gui/AnimSelectScreenWrapper.java b/src/main/java/xyz/nifeather/morph/misc/gui/AnimSelectScreenWrapper.java
similarity index 93%
rename from src/main/java/xiamomc/morph/misc/gui/AnimSelectScreenWrapper.java
rename to src/main/java/xyz/nifeather/morph/misc/gui/AnimSelectScreenWrapper.java
index 7a28228b..ae544a70 100644
--- a/src/main/java/xiamomc/morph/misc/gui/AnimSelectScreenWrapper.java
+++ b/src/main/java/xyz/nifeather/morph/misc/gui/AnimSelectScreenWrapper.java
@@ -1,22 +1,18 @@
-package xiamomc.morph.misc.gui;
+package xyz.nifeather.morph.misc.gui;
 
 import de.themoep.inventorygui.DynamicGuiElement;
 import de.themoep.inventorygui.InventoryGui;
 import de.themoep.inventorygui.StaticGuiElement;
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
-import net.kyori.adventure.text.Component;
-import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer;
-import org.bukkit.Bukkit;
 import org.bukkit.Material;
 import org.bukkit.block.data.Levelled;
 import org.bukkit.inventory.ItemRarity;
 import org.bukkit.inventory.ItemStack;
 import org.bukkit.inventory.meta.BlockDataMeta;
-import xiamomc.morph.messages.EmoteStrings;
-import xiamomc.morph.messages.GuiStrings;
-import xiamomc.morph.messages.MessageUtils;
-import xiamomc.morph.messages.MorphStrings;
-import xiamomc.morph.misc.DisguiseState;
+import xyz.nifeather.morph.messages.EmoteStrings;
+import xyz.nifeather.morph.messages.GuiStrings;
+import xyz.nifeather.morph.messages.MorphStrings;
+import xyz.nifeather.morph.misc.DisguiseState;
 import xiamomc.pluginbase.Bindables.BindableList;
 
 import java.util.List;
diff --git a/src/main/java/xiamomc/morph/misc/gui/DisguiseSelectScreenWrapper.java b/src/main/java/xyz/nifeather/morph/misc/gui/DisguiseSelectScreenWrapper.java
similarity index 93%
rename from src/main/java/xiamomc/morph/misc/gui/DisguiseSelectScreenWrapper.java
rename to src/main/java/xyz/nifeather/morph/misc/gui/DisguiseSelectScreenWrapper.java
index 3cd9baa8..90b53775 100644
--- a/src/main/java/xiamomc/morph/misc/gui/DisguiseSelectScreenWrapper.java
+++ b/src/main/java/xyz/nifeather/morph/misc/gui/DisguiseSelectScreenWrapper.java
@@ -1,31 +1,24 @@
-package xiamomc.morph.misc.gui;
+package xyz.nifeather.morph.misc.gui;
 
 import de.themoep.inventorygui.DynamicGuiElement;
 import de.themoep.inventorygui.InventoryGui;
 import de.themoep.inventorygui.StaticGuiElement;
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
-import net.kyori.adventure.key.Key;
-import net.kyori.adventure.sound.Sound;
 import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer;
 import org.bukkit.Material;
 import org.bukkit.entity.Player;
-import org.bukkit.event.inventory.InventoryType;
 import org.bukkit.inventory.ItemStack;
-import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.MorphManager;
-import xiamomc.morph.MorphPluginObject;
-import xiamomc.morph.config.ConfigOption;
-import xiamomc.morph.config.MorphConfigManager;
-import xiamomc.morph.messages.GuiStrings;
-import xiamomc.morph.messages.MessageUtils;
-import xiamomc.morph.messages.MorphStrings;
-import xiamomc.morph.misc.DisguiseMeta;
-import xiamomc.morph.misc.DisguiseState;
+import xyz.nifeather.morph.MorphManager;
+import xyz.nifeather.morph.config.ConfigOption;
+import xyz.nifeather.morph.config.MorphConfigManager;
+import xyz.nifeather.morph.messages.GuiStrings;
+import xyz.nifeather.morph.messages.MorphStrings;
+import xyz.nifeather.morph.misc.DisguiseMeta;
+import xyz.nifeather.morph.misc.DisguiseState;
 import xiamomc.pluginbase.Annotations.Resolved;
 
 import java.util.List;
-import java.util.concurrent.atomic.AtomicBoolean;
 
 public class DisguiseSelectScreenWrapper extends ScreenWrapper
 {
diff --git a/src/main/java/xiamomc/morph/misc/gui/IconLookup.java b/src/main/java/xyz/nifeather/morph/misc/gui/IconLookup.java
similarity index 97%
rename from src/main/java/xiamomc/morph/misc/gui/IconLookup.java
rename to src/main/java/xyz/nifeather/morph/misc/gui/IconLookup.java
index 9930f24d..7bc61a13 100644
--- a/src/main/java/xiamomc/morph/misc/gui/IconLookup.java
+++ b/src/main/java/xyz/nifeather/morph/misc/gui/IconLookup.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.misc.gui;
+package xyz.nifeather.morph.misc.gui;
 
 import com.destroystokyo.paper.profile.CraftPlayerProfile;
 import org.bukkit.Material;
@@ -9,8 +9,8 @@
 import org.bukkit.inventory.meta.SkullMeta;
 import org.bukkit.potion.PotionEffect;
 import org.bukkit.potion.PotionEffectType;
-import xiamomc.morph.misc.DisguiseTypes;
-import xiamomc.morph.misc.skins.PlayerSkinProvider;
+import xyz.nifeather.morph.misc.DisguiseTypes;
+import xyz.nifeather.morph.misc.skins.PlayerSkinProvider;
 
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
diff --git a/src/main/java/xiamomc/morph/misc/gui/ScreenWrapper.java b/src/main/java/xyz/nifeather/morph/misc/gui/ScreenWrapper.java
similarity index 92%
rename from src/main/java/xiamomc/morph/misc/gui/ScreenWrapper.java
rename to src/main/java/xyz/nifeather/morph/misc/gui/ScreenWrapper.java
index 1f0d5645..ba666036 100644
--- a/src/main/java/xiamomc/morph/misc/gui/ScreenWrapper.java
+++ b/src/main/java/xyz/nifeather/morph/misc/gui/ScreenWrapper.java
@@ -1,13 +1,12 @@
-package xiamomc.morph.misc.gui;
+package xyz.nifeather.morph.misc.gui;
 
 import de.themoep.inventorygui.InventoryGui;
 import net.kyori.adventure.key.Key;
 import net.kyori.adventure.sound.Sound;
 import org.bukkit.entity.Player;
-import xiamomc.morph.MorphPluginObject;
-import xiamomc.morph.messages.MessageUtils;
+import xyz.nifeather.morph.MorphPluginObject;
+import xyz.nifeather.morph.messages.MessageUtils;
 import xiamomc.pluginbase.Bindables.Bindable;
-import xiamomc.pluginbase.Exceptions.NullDependencyException;
 import xiamomc.pluginbase.ScheduleInfo;
 
 public class ScreenWrapper extends MorphPluginObject
diff --git a/src/main/java/xiamomc/morph/misc/integrations/modelengine/ModelEngineHelper.java b/src/main/java/xyz/nifeather/morph/misc/integrations/modelengine/ModelEngineHelper.java
similarity index 75%
rename from src/main/java/xiamomc/morph/misc/integrations/modelengine/ModelEngineHelper.java
rename to src/main/java/xyz/nifeather/morph/misc/integrations/modelengine/ModelEngineHelper.java
index bf76a86e..329c947f 100644
--- a/src/main/java/xiamomc/morph/misc/integrations/modelengine/ModelEngineHelper.java
+++ b/src/main/java/xyz/nifeather/morph/misc/integrations/modelengine/ModelEngineHelper.java
@@ -1,11 +1,11 @@
-package xiamomc.morph.misc.integrations.modelengine;
+package xyz.nifeather.morph.misc.integrations.modelengine;
 
 import org.bukkit.event.EventHandler;
 import org.bukkit.event.Listener;
-import xiamomc.morph.MorphPluginObject;
-import xiamomc.morph.backends.modelengine.MEBackend;
-import xiamomc.morph.events.api.lifecycle.ManagerFinishedInitializeEvent;
-import xiamomc.morph.providers.disguise.ModelEngineProvider;
+import xyz.nifeather.morph.MorphPluginObject;
+import xyz.nifeather.morph.backends.modelengine.MEBackend;
+import xyz.nifeather.morph.events.api.lifecycle.ManagerFinishedInitializeEvent;
+import xyz.nifeather.morph.providers.disguise.ModelEngineProvider;
 
 public class ModelEngineHelper extends MorphPluginObject implements Listener
 {
diff --git a/src/main/java/xiamomc/morph/misc/integrations/placeholderapi/IPlaceholderProvider.java b/src/main/java/xyz/nifeather/morph/misc/integrations/placeholderapi/IPlaceholderProvider.java
similarity index 91%
rename from src/main/java/xiamomc/morph/misc/integrations/placeholderapi/IPlaceholderProvider.java
rename to src/main/java/xyz/nifeather/morph/misc/integrations/placeholderapi/IPlaceholderProvider.java
index 5dcbd299..f94b3875 100644
--- a/src/main/java/xiamomc/morph/misc/integrations/placeholderapi/IPlaceholderProvider.java
+++ b/src/main/java/xyz/nifeather/morph/misc/integrations/placeholderapi/IPlaceholderProvider.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.misc.integrations.placeholderapi;
+package xyz.nifeather.morph.misc.integrations.placeholderapi;
 
 import org.bukkit.entity.Player;
 import org.jetbrains.annotations.NotNull;
diff --git a/src/main/java/xiamomc/morph/misc/integrations/placeholderapi/MatchMode.java b/src/main/java/xyz/nifeather/morph/misc/integrations/placeholderapi/MatchMode.java
similarity index 74%
rename from src/main/java/xiamomc/morph/misc/integrations/placeholderapi/MatchMode.java
rename to src/main/java/xyz/nifeather/morph/misc/integrations/placeholderapi/MatchMode.java
index 3d8ab01b..a9621e4e 100644
--- a/src/main/java/xiamomc/morph/misc/integrations/placeholderapi/MatchMode.java
+++ b/src/main/java/xyz/nifeather/morph/misc/integrations/placeholderapi/MatchMode.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.misc.integrations.placeholderapi;
+package xyz.nifeather.morph.misc.integrations.placeholderapi;
 
 /**
  * ID匹配模式
diff --git a/src/main/java/xiamomc/morph/misc/integrations/placeholderapi/PlaceholderIntegration.java b/src/main/java/xyz/nifeather/morph/misc/integrations/placeholderapi/PlaceholderIntegration.java
similarity index 91%
rename from src/main/java/xiamomc/morph/misc/integrations/placeholderapi/PlaceholderIntegration.java
rename to src/main/java/xyz/nifeather/morph/misc/integrations/placeholderapi/PlaceholderIntegration.java
index f7596d71..9c0e1357 100644
--- a/src/main/java/xiamomc/morph/misc/integrations/placeholderapi/PlaceholderIntegration.java
+++ b/src/main/java/xyz/nifeather/morph/misc/integrations/placeholderapi/PlaceholderIntegration.java
@@ -1,12 +1,12 @@
-package xiamomc.morph.misc.integrations.placeholderapi;
+package xyz.nifeather.morph.misc.integrations.placeholderapi;
 
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
 import me.clip.placeholderapi.expansion.PlaceholderExpansion;
 import org.bukkit.entity.Player;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.misc.integrations.placeholderapi.builtin.AvaliableDisguisesProvider;
-import xiamomc.morph.misc.integrations.placeholderapi.builtin.StateNameProvider;
+import xyz.nifeather.morph.misc.integrations.placeholderapi.builtin.AvaliableDisguisesProvider;
+import xyz.nifeather.morph.misc.integrations.placeholderapi.builtin.StateNameProvider;
 import xiamomc.pluginbase.Managers.DependencyManager;
 
 import java.util.List;
diff --git a/src/main/java/xiamomc/morph/misc/integrations/placeholderapi/builtin/AvaliableDisguisesProvider.java b/src/main/java/xyz/nifeather/morph/misc/integrations/placeholderapi/builtin/AvaliableDisguisesProvider.java
similarity index 79%
rename from src/main/java/xiamomc/morph/misc/integrations/placeholderapi/builtin/AvaliableDisguisesProvider.java
rename to src/main/java/xyz/nifeather/morph/misc/integrations/placeholderapi/builtin/AvaliableDisguisesProvider.java
index e720aabd..14e07c4a 100644
--- a/src/main/java/xiamomc/morph/misc/integrations/placeholderapi/builtin/AvaliableDisguisesProvider.java
+++ b/src/main/java/xyz/nifeather/morph/misc/integrations/placeholderapi/builtin/AvaliableDisguisesProvider.java
@@ -1,14 +1,14 @@
-package xiamomc.morph.misc.integrations.placeholderapi.builtin;
+package xyz.nifeather.morph.misc.integrations.placeholderapi.builtin;
 
 import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer;
 import org.bukkit.entity.Player;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.MorphPluginObject;
-import xiamomc.morph.interfaces.IManagePlayerData;
-import xiamomc.morph.messages.MessageUtils;
-import xiamomc.morph.misc.integrations.placeholderapi.IPlaceholderProvider;
-import xiamomc.morph.misc.integrations.placeholderapi.MatchMode;
+import xyz.nifeather.morph.MorphPluginObject;
+import xyz.nifeather.morph.interfaces.IManagePlayerData;
+import xyz.nifeather.morph.messages.MessageUtils;
+import xyz.nifeather.morph.misc.integrations.placeholderapi.IPlaceholderProvider;
+import xyz.nifeather.morph.misc.integrations.placeholderapi.MatchMode;
 import xiamomc.pluginbase.Annotations.Resolved;
 
 public class AvaliableDisguisesProvider extends MorphPluginObject implements IPlaceholderProvider
diff --git a/src/main/java/xiamomc/morph/misc/integrations/placeholderapi/builtin/StateNameProvider.java b/src/main/java/xyz/nifeather/morph/misc/integrations/placeholderapi/builtin/StateNameProvider.java
similarity index 80%
rename from src/main/java/xiamomc/morph/misc/integrations/placeholderapi/builtin/StateNameProvider.java
rename to src/main/java/xyz/nifeather/morph/misc/integrations/placeholderapi/builtin/StateNameProvider.java
index c01b98df..27119a2d 100644
--- a/src/main/java/xiamomc/morph/misc/integrations/placeholderapi/builtin/StateNameProvider.java
+++ b/src/main/java/xyz/nifeather/morph/misc/integrations/placeholderapi/builtin/StateNameProvider.java
@@ -1,13 +1,13 @@
-package xiamomc.morph.misc.integrations.placeholderapi.builtin;
+package xyz.nifeather.morph.misc.integrations.placeholderapi.builtin;
 
 import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer;
 import org.bukkit.entity.Player;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.MorphManager;
-import xiamomc.morph.MorphPluginObject;
-import xiamomc.morph.misc.integrations.placeholderapi.IPlaceholderProvider;
-import xiamomc.morph.misc.integrations.placeholderapi.MatchMode;
+import xyz.nifeather.morph.MorphManager;
+import xyz.nifeather.morph.MorphPluginObject;
+import xyz.nifeather.morph.misc.integrations.placeholderapi.IPlaceholderProvider;
+import xyz.nifeather.morph.misc.integrations.placeholderapi.MatchMode;
 import xiamomc.pluginbase.Annotations.Resolved;
 
 public class StateNameProvider extends MorphPluginObject implements IPlaceholderProvider
diff --git a/src/main/java/xiamomc/morph/misc/integrations/residence/ResidenceEventProcessor.java b/src/main/java/xyz/nifeather/morph/misc/integrations/residence/ResidenceEventProcessor.java
similarity index 91%
rename from src/main/java/xiamomc/morph/misc/integrations/residence/ResidenceEventProcessor.java
rename to src/main/java/xyz/nifeather/morph/misc/integrations/residence/ResidenceEventProcessor.java
index be09c3e0..68b9ad86 100644
--- a/src/main/java/xiamomc/morph/misc/integrations/residence/ResidenceEventProcessor.java
+++ b/src/main/java/xyz/nifeather/morph/misc/integrations/residence/ResidenceEventProcessor.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.misc.integrations.residence;
+package xyz.nifeather.morph.misc.integrations.residence;
 
 import com.bekvon.bukkit.residence.containers.Flags;
 import com.bekvon.bukkit.residence.event.ResidenceChangedEvent;
@@ -6,8 +6,8 @@
 import com.bekvon.bukkit.residence.protection.FlagPermissions;
 import org.bukkit.event.EventHandler;
 import org.bukkit.event.Listener;
-import xiamomc.morph.MorphPluginObject;
-import xiamomc.morph.abilities.impl.FlyAbility;
+import xyz.nifeather.morph.MorphPluginObject;
+import xyz.nifeather.morph.abilities.impl.FlyAbility;
 
 public class ResidenceEventProcessor extends MorphPluginObject implements Listener
 {
diff --git a/src/main/java/xiamomc/morph/misc/integrations/tab/TabAdapter.java b/src/main/java/xyz/nifeather/morph/misc/integrations/tab/TabAdapter.java
similarity index 84%
rename from src/main/java/xiamomc/morph/misc/integrations/tab/TabAdapter.java
rename to src/main/java/xyz/nifeather/morph/misc/integrations/tab/TabAdapter.java
index 42affe22..a3a25441 100644
--- a/src/main/java/xiamomc/morph/misc/integrations/tab/TabAdapter.java
+++ b/src/main/java/xyz/nifeather/morph/misc/integrations/tab/TabAdapter.java
@@ -1,15 +1,15 @@
-package xiamomc.morph.misc.integrations.tab;
+package xyz.nifeather.morph.misc.integrations.tab;
 
 import com.google.common.io.ByteStreams;
 import me.neznamy.tab.shared.TAB;
 import org.bukkit.entity.Player;
 import org.bukkit.event.EventHandler;
 import org.bukkit.event.Listener;
-import xiamomc.morph.MorphPluginObject;
-import xiamomc.morph.events.api.gameplay.PlayerDisguisedFromOfflineStateEvent;
-import xiamomc.morph.events.api.gameplay.PlayerJoinedWithDisguiseEvent;
-import xiamomc.morph.events.api.gameplay.PlayerMorphEvent;
-import xiamomc.morph.events.api.gameplay.PlayerUnMorphEvent;
+import xyz.nifeather.morph.MorphPluginObject;
+import xyz.nifeather.morph.events.api.gameplay.PlayerDisguisedFromOfflineStateEvent;
+import xyz.nifeather.morph.events.api.gameplay.PlayerJoinedWithDisguiseEvent;
+import xyz.nifeather.morph.events.api.gameplay.PlayerMorphEvent;
+import xyz.nifeather.morph.events.api.gameplay.PlayerUnMorphEvent;
 import xiamomc.pluginbase.Annotations.Initializer;
 
 public class TabAdapter extends MorphPluginObject implements Listener
diff --git a/src/main/java/xiamomc/morph/misc/mobs/MorphBukkitVexModifier.java b/src/main/java/xyz/nifeather/morph/misc/mobs/MorphBukkitVexModifier.java
similarity index 99%
rename from src/main/java/xiamomc/morph/misc/mobs/MorphBukkitVexModifier.java
rename to src/main/java/xyz/nifeather/morph/misc/mobs/MorphBukkitVexModifier.java
index 00430e4c..bde331cd 100644
--- a/src/main/java/xiamomc/morph/misc/mobs/MorphBukkitVexModifier.java
+++ b/src/main/java/xyz/nifeather/morph/misc/mobs/MorphBukkitVexModifier.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.misc.mobs;
+package xyz.nifeather.morph.misc.mobs;
 
 import net.minecraft.world.entity.LivingEntity;
 import net.minecraft.world.entity.ai.goal.target.TargetGoal;
diff --git a/src/main/java/xiamomc/morph/misc/permissions/CommonPermissions.java b/src/main/java/xyz/nifeather/morph/misc/permissions/CommonPermissions.java
similarity index 95%
rename from src/main/java/xiamomc/morph/misc/permissions/CommonPermissions.java
rename to src/main/java/xyz/nifeather/morph/misc/permissions/CommonPermissions.java
index 80417a77..8cf0c0db 100644
--- a/src/main/java/xiamomc/morph/misc/permissions/CommonPermissions.java
+++ b/src/main/java/xyz/nifeather/morph/misc/permissions/CommonPermissions.java
@@ -1,10 +1,10 @@
-package xiamomc.morph.misc.permissions;
+package xyz.nifeather.morph.misc.permissions;
 
-import xiamomc.morph.misc.DisguiseTypes;
+import xyz.nifeather.morph.misc.DisguiseTypes;
 
 public class CommonPermissions
 {
-    private final static String PERM_ROOT = "xiamomc.morph.";
+    private final static String PERM_ROOT = "feathermorph.";
 
     public final static String SEND_REQUEST = PERM_ROOT + "request.send";
     public final static String ACCEPT_REQUEST = PERM_ROOT + "request.accept";
diff --git a/src/main/java/xiamomc/morph/misc/playerList/PlayerListHandler.java b/src/main/java/xyz/nifeather/morph/misc/playerList/PlayerListHandler.java
similarity index 97%
rename from src/main/java/xiamomc/morph/misc/playerList/PlayerListHandler.java
rename to src/main/java/xyz/nifeather/morph/misc/playerList/PlayerListHandler.java
index 60fb66e8..a87a4ea6 100644
--- a/src/main/java/xiamomc/morph/misc/playerList/PlayerListHandler.java
+++ b/src/main/java/xyz/nifeather/morph/misc/playerList/PlayerListHandler.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.misc.playerList;
+package xyz.nifeather.morph.misc.playerList;
 
 import com.mojang.authlib.GameProfile;
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
@@ -9,8 +9,8 @@
 import org.bukkit.Bukkit;
 import org.bukkit.entity.Player;
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.MorphPluginObject;
-import xiamomc.morph.misc.NmsRecord;
+import xyz.nifeather.morph.MorphPluginObject;
+import xyz.nifeather.morph.misc.NmsRecord;
 
 import java.util.*;
 import java.util.concurrent.ConcurrentHashMap;
diff --git a/src/main/java/xiamomc/morph/misc/recipe/RecipeManager.java b/src/main/java/xyz/nifeather/morph/misc/recipe/RecipeManager.java
similarity index 97%
rename from src/main/java/xiamomc/morph/misc/recipe/RecipeManager.java
rename to src/main/java/xyz/nifeather/morph/misc/recipe/RecipeManager.java
index dd65aa93..a11a7572 100644
--- a/src/main/java/xiamomc/morph/misc/recipe/RecipeManager.java
+++ b/src/main/java/xyz/nifeather/morph/misc/recipe/RecipeManager.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.misc.recipe;
+package xyz.nifeather.morph.misc.recipe;
 
 import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
@@ -10,9 +10,9 @@
 import org.bukkit.inventory.*;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.MorphPluginObject;
-import xiamomc.morph.config.MorphConfigManager;
-import xiamomc.morph.utilities.ItemUtils;
+import xyz.nifeather.morph.MorphPluginObject;
+import xyz.nifeather.morph.config.MorphConfigManager;
+import xyz.nifeather.morph.utilities.ItemUtils;
 import xiamomc.pluginbase.Annotations.Initializer;
 
 import java.io.*;
diff --git a/src/main/java/xiamomc/morph/misc/recipe/RecipeOptions.java b/src/main/java/xyz/nifeather/morph/misc/recipe/RecipeOptions.java
similarity index 97%
rename from src/main/java/xiamomc/morph/misc/recipe/RecipeOptions.java
rename to src/main/java/xyz/nifeather/morph/misc/recipe/RecipeOptions.java
index bfaa553d..42c5873a 100644
--- a/src/main/java/xiamomc/morph/misc/recipe/RecipeOptions.java
+++ b/src/main/java/xyz/nifeather/morph/misc/recipe/RecipeOptions.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.misc.recipe;
+package xyz.nifeather.morph.misc.recipe;
 
 import xiamomc.pluginbase.Configuration.ConfigNode;
 import xiamomc.pluginbase.Configuration.ConfigOption;
diff --git a/src/main/java/xiamomc/morph/misc/recipe/RecipeProperty.java b/src/main/java/xyz/nifeather/morph/misc/recipe/RecipeProperty.java
similarity index 93%
rename from src/main/java/xiamomc/morph/misc/recipe/RecipeProperty.java
rename to src/main/java/xyz/nifeather/morph/misc/recipe/RecipeProperty.java
index a0a70196..4ab68718 100644
--- a/src/main/java/xiamomc/morph/misc/recipe/RecipeProperty.java
+++ b/src/main/java/xyz/nifeather/morph/misc/recipe/RecipeProperty.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.misc.recipe;
+package xyz.nifeather.morph.misc.recipe;
 
 import net.kyori.adventure.text.Component;
 import org.bukkit.Material;
diff --git a/src/main/java/xiamomc/morph/misc/recipe/RecipeYamlConfigManager.java b/src/main/java/xyz/nifeather/morph/misc/recipe/RecipeYamlConfigManager.java
similarity index 95%
rename from src/main/java/xiamomc/morph/misc/recipe/RecipeYamlConfigManager.java
rename to src/main/java/xyz/nifeather/morph/misc/recipe/RecipeYamlConfigManager.java
index c7daba54..31015d99 100644
--- a/src/main/java/xiamomc/morph/misc/recipe/RecipeYamlConfigManager.java
+++ b/src/main/java/xyz/nifeather/morph/misc/recipe/RecipeYamlConfigManager.java
@@ -1,9 +1,9 @@
-package xiamomc.morph.misc.recipe;
+package xyz.nifeather.morph.misc.recipe;
 
 import com.google.common.base.Charsets;
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.utilities.PluginAssetUtils;
+import xyz.nifeather.morph.utilities.PluginAssetUtils;
 import xiamomc.pluginbase.Configuration.ConfigOption;
 
 import java.io.File;
diff --git a/src/main/java/xiamomc/morph/misc/recipe/StandaloneYamlConfigManager.java b/src/main/java/xyz/nifeather/morph/misc/recipe/StandaloneYamlConfigManager.java
similarity index 98%
rename from src/main/java/xiamomc/morph/misc/recipe/StandaloneYamlConfigManager.java
rename to src/main/java/xyz/nifeather/morph/misc/recipe/StandaloneYamlConfigManager.java
index d66b69f5..33f6737b 100644
--- a/src/main/java/xiamomc/morph/misc/recipe/StandaloneYamlConfigManager.java
+++ b/src/main/java/xyz/nifeather/morph/misc/recipe/StandaloneYamlConfigManager.java
@@ -1,10 +1,10 @@
-package xiamomc.morph.misc.recipe;
+package xyz.nifeather.morph.misc.recipe;
 
 import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
 import org.bukkit.configuration.file.YamlConfiguration;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.MorphPluginObject;
+import xyz.nifeather.morph.MorphPluginObject;
 import xiamomc.pluginbase.Configuration.ConfigNode;
 import xiamomc.pluginbase.Configuration.ConfigOption;
 
diff --git a/src/main/java/xiamomc/morph/misc/skins/PlayerSkinProvider.java b/src/main/java/xyz/nifeather/morph/misc/skins/PlayerSkinProvider.java
similarity index 97%
rename from src/main/java/xiamomc/morph/misc/skins/PlayerSkinProvider.java
rename to src/main/java/xyz/nifeather/morph/misc/skins/PlayerSkinProvider.java
index 6a503299..132251ea 100644
--- a/src/main/java/xiamomc/morph/misc/skins/PlayerSkinProvider.java
+++ b/src/main/java/xyz/nifeather/morph/misc/skins/PlayerSkinProvider.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.misc.skins;
+package xyz.nifeather.morph.misc.skins;
 
 import com.destroystokyo.paper.profile.PlayerProfile;
 import com.mojang.authlib.GameProfile;
@@ -11,9 +11,9 @@
 import org.bukkit.Bukkit;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.MorphPluginObject;
-import xiamomc.morph.misc.MorphGameProfile;
-import xiamomc.morph.misc.NmsRecord;
+import xyz.nifeather.morph.MorphPluginObject;
+import xyz.nifeather.morph.misc.MorphGameProfile;
+import xyz.nifeather.morph.misc.NmsRecord;
 
 import java.util.List;
 import java.util.Map;
diff --git a/src/main/java/xiamomc/morph/misc/skins/SingleSkin.java b/src/main/java/xyz/nifeather/morph/misc/skins/SingleSkin.java
similarity index 92%
rename from src/main/java/xiamomc/morph/misc/skins/SingleSkin.java
rename to src/main/java/xyz/nifeather/morph/misc/skins/SingleSkin.java
index c45de3ed..882d3abb 100644
--- a/src/main/java/xiamomc/morph/misc/skins/SingleSkin.java
+++ b/src/main/java/xyz/nifeather/morph/misc/skins/SingleSkin.java
@@ -1,10 +1,10 @@
-package xiamomc.morph.misc.skins;
+package xyz.nifeather.morph.misc.skins;
 
 import com.google.gson.annotations.Expose;
 import com.google.gson.annotations.SerializedName;
 import com.mojang.authlib.GameProfile;
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.utilities.NbtUtils;
+import xyz.nifeather.morph.utilities.NbtUtils;
 
 public class SingleSkin
 {
diff --git a/src/main/java/xiamomc/morph/misc/skins/SkinCache.java b/src/main/java/xyz/nifeather/morph/misc/skins/SkinCache.java
similarity index 95%
rename from src/main/java/xiamomc/morph/misc/skins/SkinCache.java
rename to src/main/java/xyz/nifeather/morph/misc/skins/SkinCache.java
index 038dba2b..4fe10daa 100644
--- a/src/main/java/xiamomc/morph/misc/skins/SkinCache.java
+++ b/src/main/java/xyz/nifeather/morph/misc/skins/SkinCache.java
@@ -1,10 +1,10 @@
-package xiamomc.morph.misc.skins;
+package xyz.nifeather.morph.misc.skins;
 
 import com.mojang.authlib.GameProfile;
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.storage.MorphJsonBasedStorage;
+import xyz.nifeather.morph.storage.MorphJsonBasedStorage;
 
 import java.util.List;
 import java.util.Optional;
diff --git a/src/main/java/xiamomc/morph/misc/skins/SkinCacheRoot.java b/src/main/java/xyz/nifeather/morph/misc/skins/SkinCacheRoot.java
similarity index 88%
rename from src/main/java/xiamomc/morph/misc/skins/SkinCacheRoot.java
rename to src/main/java/xyz/nifeather/morph/misc/skins/SkinCacheRoot.java
index d6384455..a026808a 100644
--- a/src/main/java/xiamomc/morph/misc/skins/SkinCacheRoot.java
+++ b/src/main/java/xyz/nifeather/morph/misc/skins/SkinCacheRoot.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.misc.skins;
+package xyz.nifeather.morph.misc.skins;
 
 import com.google.gson.annotations.Expose;
 import com.google.gson.annotations.SerializedName;
diff --git a/src/main/java/xiamomc/morph/network/ReasonCodes.java b/src/main/java/xyz/nifeather/morph/network/ReasonCodes.java
similarity index 65%
rename from src/main/java/xiamomc/morph/network/ReasonCodes.java
rename to src/main/java/xyz/nifeather/morph/network/ReasonCodes.java
index 8b1c1e2a..a0f9eda3 100644
--- a/src/main/java/xiamomc/morph/network/ReasonCodes.java
+++ b/src/main/java/xyz/nifeather/morph/network/ReasonCodes.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.network;
+package xyz.nifeather.morph.network;
 
 public class ReasonCodes
 {
diff --git a/src/main/java/xiamomc/morph/network/modrinthapi/ModrinthVersionResponse.java b/src/main/java/xyz/nifeather/morph/network/modrinthapi/ModrinthVersionResponse.java
similarity index 95%
rename from src/main/java/xiamomc/morph/network/modrinthapi/ModrinthVersionResponse.java
rename to src/main/java/xyz/nifeather/morph/network/modrinthapi/ModrinthVersionResponse.java
index 3232dc18..3154ef39 100644
--- a/src/main/java/xiamomc/morph/network/modrinthapi/ModrinthVersionResponse.java
+++ b/src/main/java/xyz/nifeather/morph/network/modrinthapi/ModrinthVersionResponse.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.network.modrinthapi;
+package xyz.nifeather.morph.network.modrinthapi;
 
 import com.google.gson.annotations.SerializedName;
 import org.jetbrains.annotations.Nullable;
diff --git a/src/main/java/xiamomc/morph/network/multiInstance/IInstanceService.java b/src/main/java/xyz/nifeather/morph/network/multiInstance/IInstanceService.java
similarity index 73%
rename from src/main/java/xiamomc/morph/network/multiInstance/IInstanceService.java
rename to src/main/java/xyz/nifeather/morph/network/multiInstance/IInstanceService.java
index 8653ebea..9e0434be 100644
--- a/src/main/java/xiamomc/morph/network/multiInstance/IInstanceService.java
+++ b/src/main/java/xyz/nifeather/morph/network/multiInstance/IInstanceService.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.network.multiInstance;
+package xyz.nifeather.morph.network.multiInstance;
 
 public interface IInstanceService
 {
diff --git a/src/main/java/xiamomc/morph/network/multiInstance/MultiInstanceService.java b/src/main/java/xyz/nifeather/morph/network/multiInstance/MultiInstanceService.java
similarity index 83%
rename from src/main/java/xiamomc/morph/network/multiInstance/MultiInstanceService.java
rename to src/main/java/xyz/nifeather/morph/network/multiInstance/MultiInstanceService.java
index 25391949..742c20df 100644
--- a/src/main/java/xiamomc/morph/network/multiInstance/MultiInstanceService.java
+++ b/src/main/java/xyz/nifeather/morph/network/multiInstance/MultiInstanceService.java
@@ -1,16 +1,16 @@
-package xiamomc.morph.network.multiInstance;
+package xyz.nifeather.morph.network.multiInstance;
 
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.MorphManager;
-import xiamomc.morph.MorphPluginObject;
-import xiamomc.morph.config.ConfigOption;
-import xiamomc.morph.config.MorphConfigManager;
-import xiamomc.morph.network.multiInstance.master.MasterInstance;
-import xiamomc.morph.network.multiInstance.protocol.Operation;
-import xiamomc.morph.network.multiInstance.protocol.SocketDisguiseMeta;
-import xiamomc.morph.network.multiInstance.protocol.c2s.MIC2SDisguiseMetaCommand;
-import xiamomc.morph.network.multiInstance.protocol.s2c.MIS2CSyncMetaCommand;
-import xiamomc.morph.network.multiInstance.slave.SlaveInstance;
+import xyz.nifeather.morph.MorphManager;
+import xyz.nifeather.morph.MorphPluginObject;
+import xyz.nifeather.morph.config.ConfigOption;
+import xyz.nifeather.morph.config.MorphConfigManager;
+import xyz.nifeather.morph.network.multiInstance.master.MasterInstance;
+import xyz.nifeather.morph.network.multiInstance.protocol.Operation;
+import xyz.nifeather.morph.network.multiInstance.protocol.SocketDisguiseMeta;
+import xyz.nifeather.morph.network.multiInstance.protocol.c2s.MIC2SDisguiseMetaCommand;
+import xyz.nifeather.morph.network.multiInstance.protocol.s2c.MIS2CSyncMetaCommand;
+import xyz.nifeather.morph.network.multiInstance.slave.SlaveInstance;
 import xiamomc.pluginbase.Annotations.Initializer;
 import xiamomc.pluginbase.Annotations.Resolved;
 import xiamomc.pluginbase.Bindables.Bindable;
diff --git a/src/main/java/xiamomc/morph/network/multiInstance/master/InstanceServer.java b/src/main/java/xyz/nifeather/morph/network/multiInstance/master/InstanceServer.java
similarity index 95%
rename from src/main/java/xiamomc/morph/network/multiInstance/master/InstanceServer.java
rename to src/main/java/xyz/nifeather/morph/network/multiInstance/master/InstanceServer.java
index 8360e167..773b1c9a 100644
--- a/src/main/java/xiamomc/morph/network/multiInstance/master/InstanceServer.java
+++ b/src/main/java/xyz/nifeather/morph/network/multiInstance/master/InstanceServer.java
@@ -1,11 +1,11 @@
-package xiamomc.morph.network.multiInstance.master;
+package xyz.nifeather.morph.network.multiInstance.master;
 
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
 import org.java_websocket.WebSocket;
 import org.java_websocket.handshake.ClientHandshake;
 import org.java_websocket.server.WebSocketServer;
 import org.slf4j.Logger;
-import xiamomc.morph.network.multiInstance.protocol.IClientHandler;
+import xyz.nifeather.morph.network.multiInstance.protocol.IClientHandler;
 import xiamomc.pluginbase.XiaMoJavaPlugin;
 
 import java.net.InetSocketAddress;
diff --git a/src/main/java/xiamomc/morph/network/multiInstance/master/MasterInstance.java b/src/main/java/xyz/nifeather/morph/network/multiInstance/master/MasterInstance.java
similarity index 91%
rename from src/main/java/xiamomc/morph/network/multiInstance/master/MasterInstance.java
rename to src/main/java/xyz/nifeather/morph/network/multiInstance/master/MasterInstance.java
index 0163c929..c1171b4a 100644
--- a/src/main/java/xiamomc/morph/network/multiInstance/master/MasterInstance.java
+++ b/src/main/java/xyz/nifeather/morph/network/multiInstance/master/MasterInstance.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.network.multiInstance.master;
+package xyz.nifeather.morph.network.multiInstance.master;
 
 import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap;
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
@@ -7,21 +7,23 @@
 import org.jetbrains.annotations.ApiStatus;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.MorphPluginObject;
-import xiamomc.morph.config.ConfigOption;
-import xiamomc.morph.config.MorphConfigManager;
-import xiamomc.morph.network.ReasonCodes;
+import xyz.nifeather.morph.MorphPluginObject;
+import xyz.nifeather.morph.config.ConfigOption;
+import xyz.nifeather.morph.config.MorphConfigManager;
+import xyz.nifeather.morph.network.ReasonCodes;
 import xiamomc.morph.network.commands.CommandRegistries;
-import xiamomc.morph.network.multiInstance.IInstanceService;
-import xiamomc.morph.network.multiInstance.protocol.IClientHandler;
-import xiamomc.morph.network.multiInstance.protocol.Operation;
-import xiamomc.morph.network.multiInstance.protocol.ProtocolLevel;
-import xiamomc.morph.network.multiInstance.protocol.c2s.MIC2SCommand;
-import xiamomc.morph.network.multiInstance.protocol.c2s.MIC2SDisguiseMetaCommand;
-import xiamomc.morph.network.multiInstance.protocol.c2s.MIC2SLoginCommand;
+import xyz.nifeather.morph.network.multiInstance.IInstanceService;
+import xyz.nifeather.morph.network.multiInstance.protocol.IClientHandler;
+import xyz.nifeather.morph.network.multiInstance.protocol.Operation;
+import xyz.nifeather.morph.network.multiInstance.protocol.ProtocolLevel;
+import xyz.nifeather.morph.network.multiInstance.protocol.c2s.MIC2SCommand;
+import xyz.nifeather.morph.network.multiInstance.protocol.c2s.MIC2SDisguiseMetaCommand;
+import xyz.nifeather.morph.network.multiInstance.protocol.c2s.MIC2SLoginCommand;
 import xiamomc.morph.network.multiInstance.protocol.s2c.*;
-import xiamomc.morph.network.multiInstance.slave.SlaveInstance;
-import xiamomc.morph.storage.playerdata.PlayerMeta;
+import xyz.nifeather.morph.morph.network.multiInstance.protocol.s2c.*;
+import xyz.nifeather.morph.network.multiInstance.protocol.s2c.*;
+import xyz.nifeather.morph.network.multiInstance.slave.SlaveInstance;
+import xyz.nifeather.morph.storage.playerdata.PlayerMeta;
 import xiamomc.pluginbase.Annotations.Initializer;
 import xiamomc.pluginbase.Annotations.Resolved;
 import xiamomc.pluginbase.Bindables.Bindable;
diff --git a/src/main/java/xiamomc/morph/network/multiInstance/master/NetworkDisguiseManager.java b/src/main/java/xyz/nifeather/morph/network/multiInstance/master/NetworkDisguiseManager.java
similarity index 88%
rename from src/main/java/xiamomc/morph/network/multiInstance/master/NetworkDisguiseManager.java
rename to src/main/java/xyz/nifeather/morph/network/multiInstance/master/NetworkDisguiseManager.java
index 82465ca9..836753fd 100644
--- a/src/main/java/xiamomc/morph/network/multiInstance/master/NetworkDisguiseManager.java
+++ b/src/main/java/xyz/nifeather/morph/network/multiInstance/master/NetworkDisguiseManager.java
@@ -1,11 +1,11 @@
-package xiamomc.morph.network.multiInstance.master;
+package xyz.nifeather.morph.network.multiInstance.master;
 
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
 import org.bukkit.OfflinePlayer;
-import xiamomc.morph.MorphPluginObject;
-import xiamomc.morph.misc.DisguiseMeta;
-import xiamomc.morph.misc.DisguiseTypes;
-import xiamomc.morph.storage.playerdata.PlayerMeta;
+import xyz.nifeather.morph.MorphPluginObject;
+import xyz.nifeather.morph.misc.DisguiseMeta;
+import xyz.nifeather.morph.misc.DisguiseTypes;
+import xyz.nifeather.morph.storage.playerdata.PlayerMeta;
 
 import java.util.List;
 
diff --git a/src/main/java/xiamomc/morph/network/multiInstance/protocol/IClientHandler.java b/src/main/java/xyz/nifeather/morph/network/multiInstance/protocol/IClientHandler.java
similarity index 58%
rename from src/main/java/xiamomc/morph/network/multiInstance/protocol/IClientHandler.java
rename to src/main/java/xyz/nifeather/morph/network/multiInstance/protocol/IClientHandler.java
index de91bb03..a98d21e2 100644
--- a/src/main/java/xiamomc/morph/network/multiInstance/protocol/IClientHandler.java
+++ b/src/main/java/xyz/nifeather/morph/network/multiInstance/protocol/IClientHandler.java
@@ -1,9 +1,9 @@
-package xiamomc.morph.network.multiInstance.protocol;
+package xyz.nifeather.morph.network.multiInstance.protocol;
 
 import org.java_websocket.WebSocket;
-import xiamomc.morph.network.multiInstance.master.InstanceServer;
-import xiamomc.morph.network.multiInstance.protocol.c2s.MIC2SDisguiseMetaCommand;
-import xiamomc.morph.network.multiInstance.protocol.c2s.MIC2SLoginCommand;
+import xyz.nifeather.morph.network.multiInstance.master.InstanceServer;
+import xyz.nifeather.morph.network.multiInstance.protocol.c2s.MIC2SDisguiseMetaCommand;
+import xyz.nifeather.morph.network.multiInstance.protocol.c2s.MIC2SLoginCommand;
 
 public interface IClientHandler
 {
diff --git a/src/main/java/xiamomc/morph/network/multiInstance/protocol/IMasterHandler.java b/src/main/java/xyz/nifeather/morph/network/multiInstance/protocol/IMasterHandler.java
similarity index 52%
rename from src/main/java/xiamomc/morph/network/multiInstance/protocol/IMasterHandler.java
rename to src/main/java/xyz/nifeather/morph/network/multiInstance/protocol/IMasterHandler.java
index f0a62c53..37918f74 100644
--- a/src/main/java/xiamomc/morph/network/multiInstance/protocol/IMasterHandler.java
+++ b/src/main/java/xyz/nifeather/morph/network/multiInstance/protocol/IMasterHandler.java
@@ -1,10 +1,10 @@
-package xiamomc.morph.network.multiInstance.protocol;
+package xyz.nifeather.morph.network.multiInstance.protocol;
 
-import xiamomc.morph.network.multiInstance.protocol.s2c.MIS2CDisconnectCommand;
-import xiamomc.morph.network.multiInstance.protocol.s2c.MIS2CLoginResultCommand;
-import xiamomc.morph.network.multiInstance.protocol.s2c.MIS2CStateCommand;
-import xiamomc.morph.network.multiInstance.protocol.s2c.MIS2CSyncMetaCommand;
-import xiamomc.morph.network.multiInstance.slave.InstanceClient;
+import xyz.nifeather.morph.network.multiInstance.protocol.s2c.MIS2CDisconnectCommand;
+import xyz.nifeather.morph.network.multiInstance.protocol.s2c.MIS2CLoginResultCommand;
+import xyz.nifeather.morph.network.multiInstance.protocol.s2c.MIS2CStateCommand;
+import xyz.nifeather.morph.network.multiInstance.protocol.s2c.MIS2CSyncMetaCommand;
+import xyz.nifeather.morph.network.multiInstance.slave.InstanceClient;
 
 public interface IMasterHandler
 {
diff --git a/src/main/java/xiamomc/morph/network/multiInstance/protocol/Operation.java b/src/main/java/xyz/nifeather/morph/network/multiInstance/protocol/Operation.java
similarity index 53%
rename from src/main/java/xiamomc/morph/network/multiInstance/protocol/Operation.java
rename to src/main/java/xyz/nifeather/morph/network/multiInstance/protocol/Operation.java
index 6c9fbde3..f8e25a7c 100644
--- a/src/main/java/xiamomc/morph/network/multiInstance/protocol/Operation.java
+++ b/src/main/java/xyz/nifeather/morph/network/multiInstance/protocol/Operation.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.network.multiInstance.protocol;
+package xyz.nifeather.morph.network.multiInstance.protocol;
 
 public enum Operation
 {
diff --git a/src/main/java/xiamomc/morph/network/multiInstance/protocol/ProtocolLevel.java b/src/main/java/xyz/nifeather/morph/network/multiInstance/protocol/ProtocolLevel.java
similarity index 93%
rename from src/main/java/xiamomc/morph/network/multiInstance/protocol/ProtocolLevel.java
rename to src/main/java/xyz/nifeather/morph/network/multiInstance/protocol/ProtocolLevel.java
index 5bc3db7c..860c988c 100644
--- a/src/main/java/xiamomc/morph/network/multiInstance/protocol/ProtocolLevel.java
+++ b/src/main/java/xyz/nifeather/morph/network/multiInstance/protocol/ProtocolLevel.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.network.multiInstance.protocol;
+package xyz.nifeather.morph.network.multiInstance.protocol;
 
 public enum ProtocolLevel
 {
diff --git a/src/main/java/xiamomc/morph/network/multiInstance/protocol/SocketDisguiseMeta.java b/src/main/java/xyz/nifeather/morph/network/multiInstance/protocol/SocketDisguiseMeta.java
similarity index 96%
rename from src/main/java/xiamomc/morph/network/multiInstance/protocol/SocketDisguiseMeta.java
rename to src/main/java/xyz/nifeather/morph/network/multiInstance/protocol/SocketDisguiseMeta.java
index 7652e803..bc5860e2 100644
--- a/src/main/java/xiamomc/morph/network/multiInstance/protocol/SocketDisguiseMeta.java
+++ b/src/main/java/xyz/nifeather/morph/network/multiInstance/protocol/SocketDisguiseMeta.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.network.multiInstance.protocol;
+package xyz.nifeather.morph.network.multiInstance.protocol;
 
 import com.google.gson.Gson;
 import com.google.gson.GsonBuilder;
diff --git a/src/main/java/xiamomc/morph/network/multiInstance/protocol/c2s/MIC2SCommand.java b/src/main/java/xyz/nifeather/morph/network/multiInstance/protocol/c2s/MIC2SCommand.java
similarity index 85%
rename from src/main/java/xiamomc/morph/network/multiInstance/protocol/c2s/MIC2SCommand.java
rename to src/main/java/xyz/nifeather/morph/network/multiInstance/protocol/c2s/MIC2SCommand.java
index 5a4ba786..4e8c5ae5 100644
--- a/src/main/java/xiamomc/morph/network/multiInstance/protocol/c2s/MIC2SCommand.java
+++ b/src/main/java/xyz/nifeather/morph/network/multiInstance/protocol/c2s/MIC2SCommand.java
@@ -1,13 +1,13 @@
-package xiamomc.morph.network.multiInstance.protocol.c2s;
+package xyz.nifeather.morph.network.multiInstance.protocol.c2s;
 
 import org.java_websocket.WebSocket;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 import org.slf4j.Logger;
-import xiamomc.morph.MorphPlugin;
+import xyz.nifeather.morph.MorphPlugin;
 import xiamomc.morph.network.BasicClientHandler;
 import xiamomc.morph.network.commands.C2S.AbstractC2SCommand;
-import xiamomc.morph.network.multiInstance.protocol.IClientHandler;
+import xyz.nifeather.morph.network.multiInstance.protocol.IClientHandler;
 
 public abstract class MIC2SCommand<T> extends AbstractC2SCommand<T>
 {
diff --git a/src/main/java/xiamomc/morph/network/multiInstance/protocol/c2s/MIC2SDisguiseMetaCommand.java b/src/main/java/xyz/nifeather/morph/network/multiInstance/protocol/c2s/MIC2SDisguiseMetaCommand.java
similarity index 81%
rename from src/main/java/xiamomc/morph/network/multiInstance/protocol/c2s/MIC2SDisguiseMetaCommand.java
rename to src/main/java/xyz/nifeather/morph/network/multiInstance/protocol/c2s/MIC2SDisguiseMetaCommand.java
index 54c501e3..cd189eed 100644
--- a/src/main/java/xiamomc/morph/network/multiInstance/protocol/c2s/MIC2SDisguiseMetaCommand.java
+++ b/src/main/java/xyz/nifeather/morph/network/multiInstance/protocol/c2s/MIC2SDisguiseMetaCommand.java
@@ -1,11 +1,11 @@
-package xiamomc.morph.network.multiInstance.protocol.c2s;
+package xyz.nifeather.morph.network.multiInstance.protocol.c2s;
 
 import com.google.gson.GsonBuilder;
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.MorphPlugin;
-import xiamomc.morph.network.multiInstance.protocol.IClientHandler;
-import xiamomc.morph.network.multiInstance.protocol.Operation;
-import xiamomc.morph.network.multiInstance.protocol.SocketDisguiseMeta;
+import xyz.nifeather.morph.MorphPlugin;
+import xyz.nifeather.morph.network.multiInstance.protocol.IClientHandler;
+import xyz.nifeather.morph.network.multiInstance.protocol.Operation;
+import xyz.nifeather.morph.network.multiInstance.protocol.SocketDisguiseMeta;
 
 import java.util.List;
 import java.util.UUID;
diff --git a/src/main/java/xiamomc/morph/network/multiInstance/protocol/c2s/MIC2SLoginCommand.java b/src/main/java/xyz/nifeather/morph/network/multiInstance/protocol/c2s/MIC2SLoginCommand.java
similarity index 85%
rename from src/main/java/xiamomc/morph/network/multiInstance/protocol/c2s/MIC2SLoginCommand.java
rename to src/main/java/xyz/nifeather/morph/network/multiInstance/protocol/c2s/MIC2SLoginCommand.java
index c2b5d72a..83fb2e76 100644
--- a/src/main/java/xiamomc/morph/network/multiInstance/protocol/c2s/MIC2SLoginCommand.java
+++ b/src/main/java/xyz/nifeather/morph/network/multiInstance/protocol/c2s/MIC2SLoginCommand.java
@@ -1,10 +1,10 @@
-package xiamomc.morph.network.multiInstance.protocol.c2s;
+package xyz.nifeather.morph.network.multiInstance.protocol.c2s;
 
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.MorphPlugin;
-import xiamomc.morph.network.multiInstance.protocol.IClientHandler;
-import xiamomc.morph.network.multiInstance.protocol.ProtocolLevel;
+import xyz.nifeather.morph.MorphPlugin;
+import xyz.nifeather.morph.network.multiInstance.protocol.IClientHandler;
+import xyz.nifeather.morph.network.multiInstance.protocol.ProtocolLevel;
 
 public class MIC2SLoginCommand extends MIC2SCommand<String>
 {
diff --git a/src/main/java/xiamomc/morph/network/multiInstance/protocol/s2c/MIS2CCommand.java b/src/main/java/xyz/nifeather/morph/network/multiInstance/protocol/s2c/MIS2CCommand.java
similarity index 85%
rename from src/main/java/xiamomc/morph/network/multiInstance/protocol/s2c/MIS2CCommand.java
rename to src/main/java/xyz/nifeather/morph/network/multiInstance/protocol/s2c/MIS2CCommand.java
index 96263df4..619a1474 100644
--- a/src/main/java/xiamomc/morph/network/multiInstance/protocol/s2c/MIS2CCommand.java
+++ b/src/main/java/xyz/nifeather/morph/network/multiInstance/protocol/s2c/MIS2CCommand.java
@@ -1,13 +1,13 @@
-package xiamomc.morph.network.multiInstance.protocol.s2c;
+package xyz.nifeather.morph.network.multiInstance.protocol.s2c;
 
 import org.java_websocket.WebSocket;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 import org.slf4j.Logger;
-import xiamomc.morph.MorphPlugin;
+import xyz.nifeather.morph.MorphPlugin;
 import xiamomc.morph.network.BasicServerHandler;
 import xiamomc.morph.network.commands.S2C.AbstractS2CCommand;
-import xiamomc.morph.network.multiInstance.protocol.IMasterHandler;
+import xyz.nifeather.morph.network.multiInstance.protocol.IMasterHandler;
 
 public abstract class MIS2CCommand<T> extends AbstractS2CCommand<T>
 {
diff --git a/src/main/java/xiamomc/morph/network/multiInstance/protocol/s2c/MIS2CDisconnectCommand.java b/src/main/java/xyz/nifeather/morph/network/multiInstance/protocol/s2c/MIS2CDisconnectCommand.java
similarity index 88%
rename from src/main/java/xiamomc/morph/network/multiInstance/protocol/s2c/MIS2CDisconnectCommand.java
rename to src/main/java/xyz/nifeather/morph/network/multiInstance/protocol/s2c/MIS2CDisconnectCommand.java
index 9e60972e..32e3545a 100644
--- a/src/main/java/xiamomc/morph/network/multiInstance/protocol/s2c/MIS2CDisconnectCommand.java
+++ b/src/main/java/xyz/nifeather/morph/network/multiInstance/protocol/s2c/MIS2CDisconnectCommand.java
@@ -1,7 +1,7 @@
-package xiamomc.morph.network.multiInstance.protocol.s2c;
+package xyz.nifeather.morph.network.multiInstance.protocol.s2c;
 
-import xiamomc.morph.MorphPlugin;
-import xiamomc.morph.network.multiInstance.protocol.IMasterHandler;
+import xyz.nifeather.morph.MorphPlugin;
+import xyz.nifeather.morph.network.multiInstance.protocol.IMasterHandler;
 
 public class MIS2CDisconnectCommand extends MIS2CCommand<String>
 {
diff --git a/src/main/java/xiamomc/morph/network/multiInstance/protocol/s2c/MIS2CLoginResultCommand.java b/src/main/java/xyz/nifeather/morph/network/multiInstance/protocol/s2c/MIS2CLoginResultCommand.java
similarity index 79%
rename from src/main/java/xiamomc/morph/network/multiInstance/protocol/s2c/MIS2CLoginResultCommand.java
rename to src/main/java/xyz/nifeather/morph/network/multiInstance/protocol/s2c/MIS2CLoginResultCommand.java
index 4ce78c2c..cc0fcd11 100644
--- a/src/main/java/xiamomc/morph/network/multiInstance/protocol/s2c/MIS2CLoginResultCommand.java
+++ b/src/main/java/xyz/nifeather/morph/network/multiInstance/protocol/s2c/MIS2CLoginResultCommand.java
@@ -1,6 +1,6 @@
-package xiamomc.morph.network.multiInstance.protocol.s2c;
+package xyz.nifeather.morph.network.multiInstance.protocol.s2c;
 
-import xiamomc.morph.network.multiInstance.protocol.IMasterHandler;
+import xyz.nifeather.morph.network.multiInstance.protocol.IMasterHandler;
 
 public class MIS2CLoginResultCommand extends MIS2CCommand<Boolean>
 {
diff --git a/src/main/java/xiamomc/morph/network/multiInstance/protocol/s2c/MIS2CStateCommand.java b/src/main/java/xyz/nifeather/morph/network/multiInstance/protocol/s2c/MIS2CStateCommand.java
similarity index 85%
rename from src/main/java/xiamomc/morph/network/multiInstance/protocol/s2c/MIS2CStateCommand.java
rename to src/main/java/xyz/nifeather/morph/network/multiInstance/protocol/s2c/MIS2CStateCommand.java
index 02243e9d..5f48b50c 100644
--- a/src/main/java/xiamomc/morph/network/multiInstance/protocol/s2c/MIS2CStateCommand.java
+++ b/src/main/java/xyz/nifeather/morph/network/multiInstance/protocol/s2c/MIS2CStateCommand.java
@@ -1,6 +1,6 @@
-package xiamomc.morph.network.multiInstance.protocol.s2c;
+package xyz.nifeather.morph.network.multiInstance.protocol.s2c;
 
-import xiamomc.morph.network.multiInstance.protocol.IMasterHandler;
+import xyz.nifeather.morph.network.multiInstance.protocol.IMasterHandler;
 
 import java.util.Arrays;
 
diff --git a/src/main/java/xiamomc/morph/network/multiInstance/protocol/s2c/MIS2CSyncMetaCommand.java b/src/main/java/xyz/nifeather/morph/network/multiInstance/protocol/s2c/MIS2CSyncMetaCommand.java
similarity index 78%
rename from src/main/java/xiamomc/morph/network/multiInstance/protocol/s2c/MIS2CSyncMetaCommand.java
rename to src/main/java/xyz/nifeather/morph/network/multiInstance/protocol/s2c/MIS2CSyncMetaCommand.java
index 54494568..f585c02d 100644
--- a/src/main/java/xiamomc/morph/network/multiInstance/protocol/s2c/MIS2CSyncMetaCommand.java
+++ b/src/main/java/xyz/nifeather/morph/network/multiInstance/protocol/s2c/MIS2CSyncMetaCommand.java
@@ -1,10 +1,10 @@
-package xiamomc.morph.network.multiInstance.protocol.s2c;
+package xyz.nifeather.morph.network.multiInstance.protocol.s2c;
 
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.MorphPlugin;
-import xiamomc.morph.network.multiInstance.protocol.IMasterHandler;
-import xiamomc.morph.network.multiInstance.protocol.Operation;
-import xiamomc.morph.network.multiInstance.protocol.SocketDisguiseMeta;
+import xyz.nifeather.morph.MorphPlugin;
+import xyz.nifeather.morph.network.multiInstance.protocol.IMasterHandler;
+import xyz.nifeather.morph.network.multiInstance.protocol.Operation;
+import xyz.nifeather.morph.network.multiInstance.protocol.SocketDisguiseMeta;
 
 import java.util.List;
 import java.util.UUID;
diff --git a/src/main/java/xiamomc/morph/network/multiInstance/protocol/s2c/ProtocolState.java b/src/main/java/xyz/nifeather/morph/network/multiInstance/protocol/s2c/ProtocolState.java
similarity index 84%
rename from src/main/java/xiamomc/morph/network/multiInstance/protocol/s2c/ProtocolState.java
rename to src/main/java/xyz/nifeather/morph/network/multiInstance/protocol/s2c/ProtocolState.java
index 502fa6ae..36b394f4 100644
--- a/src/main/java/xiamomc/morph/network/multiInstance/protocol/s2c/ProtocolState.java
+++ b/src/main/java/xyz/nifeather/morph/network/multiInstance/protocol/s2c/ProtocolState.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.network.multiInstance.protocol.s2c;
+package xyz.nifeather.morph.network.multiInstance.protocol.s2c;
 
 public enum ProtocolState
 {
diff --git a/src/main/java/xiamomc/morph/network/multiInstance/slave/InstanceClient.java b/src/main/java/xyz/nifeather/morph/network/multiInstance/slave/InstanceClient.java
similarity index 94%
rename from src/main/java/xiamomc/morph/network/multiInstance/slave/InstanceClient.java
rename to src/main/java/xyz/nifeather/morph/network/multiInstance/slave/InstanceClient.java
index e537e66f..dcc01629 100644
--- a/src/main/java/xiamomc/morph/network/multiInstance/slave/InstanceClient.java
+++ b/src/main/java/xyz/nifeather/morph/network/multiInstance/slave/InstanceClient.java
@@ -1,9 +1,9 @@
-package xiamomc.morph.network.multiInstance.slave;
+package xyz.nifeather.morph.network.multiInstance.slave;
 
 import org.java_websocket.client.WebSocketClient;
 import org.java_websocket.handshake.ServerHandshake;
 import org.slf4j.Logger;
-import xiamomc.morph.network.multiInstance.protocol.IMasterHandler;
+import xyz.nifeather.morph.network.multiInstance.protocol.IMasterHandler;
 import xiamomc.pluginbase.XiaMoJavaPlugin;
 
 import java.net.ConnectException;
diff --git a/src/main/java/xiamomc/morph/network/multiInstance/slave/SlaveInstance.java b/src/main/java/xyz/nifeather/morph/network/multiInstance/slave/SlaveInstance.java
similarity index 89%
rename from src/main/java/xiamomc/morph/network/multiInstance/slave/SlaveInstance.java
rename to src/main/java/xyz/nifeather/morph/network/multiInstance/slave/SlaveInstance.java
index 3d416262..c9744233 100644
--- a/src/main/java/xiamomc/morph/network/multiInstance/slave/SlaveInstance.java
+++ b/src/main/java/xyz/nifeather/morph/network/multiInstance/slave/SlaveInstance.java
@@ -1,26 +1,28 @@
-package xiamomc.morph.network.multiInstance.slave;
+package xyz.nifeather.morph.network.multiInstance.slave;
 
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
 import org.bukkit.Bukkit;
 import org.jetbrains.annotations.ApiStatus;
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.MorphManager;
-import xiamomc.morph.MorphPluginObject;
-import xiamomc.morph.config.ConfigOption;
-import xiamomc.morph.config.MorphConfigManager;
-import xiamomc.morph.network.ReasonCodes;
+import xyz.nifeather.morph.MorphManager;
+import xyz.nifeather.morph.MorphPluginObject;
+import xyz.nifeather.morph.config.ConfigOption;
+import xyz.nifeather.morph.config.MorphConfigManager;
+import xyz.nifeather.morph.network.ReasonCodes;
 import xiamomc.morph.network.commands.C2S.AbstractC2SCommand;
 import xiamomc.morph.network.commands.CommandRegistries;
-import xiamomc.morph.network.multiInstance.IInstanceService;
-import xiamomc.morph.network.multiInstance.master.MasterInstance;
-import xiamomc.morph.network.multiInstance.protocol.IMasterHandler;
-import xiamomc.morph.network.multiInstance.protocol.Operation;
-import xiamomc.morph.network.multiInstance.protocol.ProtocolLevel;
-import xiamomc.morph.network.multiInstance.protocol.SocketDisguiseMeta;
-import xiamomc.morph.network.multiInstance.protocol.c2s.MIC2SDisguiseMetaCommand;
-import xiamomc.morph.network.multiInstance.protocol.c2s.MIC2SLoginCommand;
+import xyz.nifeather.morph.network.multiInstance.IInstanceService;
+import xyz.nifeather.morph.network.multiInstance.master.MasterInstance;
+import xyz.nifeather.morph.network.multiInstance.protocol.IMasterHandler;
+import xyz.nifeather.morph.network.multiInstance.protocol.Operation;
+import xyz.nifeather.morph.network.multiInstance.protocol.ProtocolLevel;
+import xyz.nifeather.morph.network.multiInstance.protocol.SocketDisguiseMeta;
+import xyz.nifeather.morph.network.multiInstance.protocol.c2s.MIC2SDisguiseMetaCommand;
+import xyz.nifeather.morph.network.multiInstance.protocol.c2s.MIC2SLoginCommand;
 import xiamomc.morph.network.multiInstance.protocol.s2c.*;
-import xiamomc.morph.network.server.MorphClientHandler;
+import xyz.nifeather.morph.morph.network.multiInstance.protocol.s2c.*;
+import xyz.nifeather.morph.network.multiInstance.protocol.s2c.*;
+import xyz.nifeather.morph.network.server.MorphClientHandler;
 import xiamomc.pluginbase.Annotations.Initializer;
 import xiamomc.pluginbase.Annotations.Resolved;
 import xiamomc.pluginbase.Bindables.Bindable;
diff --git a/src/main/java/xiamomc/morph/network/server/MorphClientHandler.java b/src/main/java/xyz/nifeather/morph/network/server/MorphClientHandler.java
similarity index 97%
rename from src/main/java/xiamomc/morph/network/server/MorphClientHandler.java
rename to src/main/java/xyz/nifeather/morph/network/server/MorphClientHandler.java
index 8e52a5c3..2e3a5a37 100644
--- a/src/main/java/xiamomc/morph/network/server/MorphClientHandler.java
+++ b/src/main/java/xyz/nifeather/morph/network/server/MorphClientHandler.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.network.server;
+package xyz.nifeather.morph.network.server;
 
 import com.google.common.io.ByteStreams;
 import io.netty.buffer.Unpooled;
@@ -14,18 +14,18 @@
 import org.bukkit.entity.Player;
 import org.jetbrains.annotations.ApiStatus;
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.MorphManager;
-import xiamomc.morph.MorphPlugin;
-import xiamomc.morph.MorphPluginObject;
-import xiamomc.morph.config.ConfigOption;
-import xiamomc.morph.config.MorphConfigManager;
-import xiamomc.morph.interfaces.IManageRequests;
-import xiamomc.morph.messages.EmoteStrings;
-import xiamomc.morph.messages.MessageUtils;
-import xiamomc.morph.messages.MorphStrings;
-import xiamomc.morph.misc.DisguiseState;
-import xiamomc.morph.misc.NetworkingHelper;
-import xiamomc.morph.misc.permissions.CommonPermissions;
+import xyz.nifeather.morph.MorphManager;
+import xyz.nifeather.morph.MorphPlugin;
+import xyz.nifeather.morph.MorphPluginObject;
+import xyz.nifeather.morph.config.ConfigOption;
+import xyz.nifeather.morph.config.MorphConfigManager;
+import xyz.nifeather.morph.interfaces.IManageRequests;
+import xyz.nifeather.morph.messages.EmoteStrings;
+import xyz.nifeather.morph.messages.MessageUtils;
+import xyz.nifeather.morph.messages.MorphStrings;
+import xyz.nifeather.morph.misc.DisguiseState;
+import xyz.nifeather.morph.misc.NetworkingHelper;
+import xyz.nifeather.morph.misc.permissions.CommonPermissions;
 import xiamomc.morph.network.*;
 import xiamomc.morph.network.commands.C2S.*;
 import xiamomc.morph.network.commands.CommandRegistries;
diff --git a/src/main/java/xiamomc/morph/network/server/ServerSetEquipCommand.java b/src/main/java/xyz/nifeather/morph/network/server/ServerSetEquipCommand.java
similarity index 92%
rename from src/main/java/xiamomc/morph/network/server/ServerSetEquipCommand.java
rename to src/main/java/xyz/nifeather/morph/network/server/ServerSetEquipCommand.java
index 297a03c0..99198289 100644
--- a/src/main/java/xiamomc/morph/network/server/ServerSetEquipCommand.java
+++ b/src/main/java/xyz/nifeather/morph/network/server/ServerSetEquipCommand.java
@@ -1,9 +1,9 @@
-package xiamomc.morph.network.server;
+package xyz.nifeather.morph.network.server;
 
 import org.bukkit.inventory.EquipmentSlot;
 import org.bukkit.inventory.ItemStack;
 import xiamomc.morph.network.commands.S2C.set.S2CSetFakeEquipCommand;
-import xiamomc.morph.utilities.ItemUtils;
+import xyz.nifeather.morph.utilities.ItemUtils;
 
 public class ServerSetEquipCommand extends S2CSetFakeEquipCommand<ItemStack>
 {
diff --git a/src/main/java/xyz/nifeather/morph/providers/animation/AnimationProvider.java b/src/main/java/xyz/nifeather/morph/providers/animation/AnimationProvider.java
new file mode 100644
index 00000000..6e5038c8
--- /dev/null
+++ b/src/main/java/xyz/nifeather/morph/providers/animation/AnimationProvider.java
@@ -0,0 +1,15 @@
+package xyz.nifeather.morph.providers.animation;
+
+import org.jetbrains.annotations.NotNull;
+import xyz.nifeather.morph.MorphPluginObject;
+import xyz.nifeather.morph.providers.animation.bundled.FallbackAnimationSet;
+
+public abstract class AnimationProvider extends MorphPluginObject
+{
+    /**
+     * @param disguiseID
+     * @return The sequence of the given parameters, {@link FallbackAnimationSet} if invalid.
+     */
+    @NotNull
+    public abstract AnimationSet getAnimationSetFor(String disguiseID);
+}
diff --git a/src/main/java/xiamomc/morph/providers/animation/AnimationSet.java b/src/main/java/xyz/nifeather/morph/providers/animation/AnimationSet.java
similarity index 97%
rename from src/main/java/xiamomc/morph/providers/animation/AnimationSet.java
rename to src/main/java/xyz/nifeather/morph/providers/animation/AnimationSet.java
index 12d9d06e..5e257460 100644
--- a/src/main/java/xiamomc/morph/providers/animation/AnimationSet.java
+++ b/src/main/java/xyz/nifeather/morph/providers/animation/AnimationSet.java
@@ -1,9 +1,9 @@
-package xiamomc.morph.providers.animation;
+package xyz.nifeather.morph.providers.animation;
 
 import it.unimi.dsi.fastutil.Pair;
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
 import org.jetbrains.annotations.NotNull;
-import xiamomc.morph.misc.AnimationNames;
+import xyz.nifeather.morph.misc.AnimationNames;
 
 import java.util.List;
 import java.util.Map;
diff --git a/src/main/java/xiamomc/morph/providers/animation/SingleAnimation.java b/src/main/java/xyz/nifeather/morph/providers/animation/SingleAnimation.java
similarity index 84%
rename from src/main/java/xiamomc/morph/providers/animation/SingleAnimation.java
rename to src/main/java/xyz/nifeather/morph/providers/animation/SingleAnimation.java
index 91207a97..474f2519 100644
--- a/src/main/java/xiamomc/morph/providers/animation/SingleAnimation.java
+++ b/src/main/java/xyz/nifeather/morph/providers/animation/SingleAnimation.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.providers.animation;
+package xyz.nifeather.morph.providers.animation;
 
 /**
  *
diff --git a/src/main/java/xiamomc/morph/providers/animation/bundled/AllayAnimationSet.java b/src/main/java/xyz/nifeather/morph/providers/animation/bundled/AllayAnimationSet.java
similarity index 67%
rename from src/main/java/xiamomc/morph/providers/animation/bundled/AllayAnimationSet.java
rename to src/main/java/xyz/nifeather/morph/providers/animation/bundled/AllayAnimationSet.java
index 30440fe9..5537658d 100644
--- a/src/main/java/xiamomc/morph/providers/animation/bundled/AllayAnimationSet.java
+++ b/src/main/java/xyz/nifeather/morph/providers/animation/bundled/AllayAnimationSet.java
@@ -1,8 +1,8 @@
-package xiamomc.morph.providers.animation.bundled;
+package xyz.nifeather.morph.providers.animation.bundled;
 
-import xiamomc.morph.misc.AnimationNames;
-import xiamomc.morph.providers.animation.AnimationSet;
-import xiamomc.morph.providers.animation.SingleAnimation;
+import xyz.nifeather.morph.misc.AnimationNames;
+import xyz.nifeather.morph.providers.animation.AnimationSet;
+import xyz.nifeather.morph.providers.animation.SingleAnimation;
 
 import java.util.List;
 
diff --git a/src/main/java/xiamomc/morph/providers/animation/bundled/ArmadilloAnimationSet.java b/src/main/java/xyz/nifeather/morph/providers/animation/bundled/ArmadilloAnimationSet.java
similarity index 78%
rename from src/main/java/xiamomc/morph/providers/animation/bundled/ArmadilloAnimationSet.java
rename to src/main/java/xyz/nifeather/morph/providers/animation/bundled/ArmadilloAnimationSet.java
index 4654b214..7b7606ef 100644
--- a/src/main/java/xiamomc/morph/providers/animation/bundled/ArmadilloAnimationSet.java
+++ b/src/main/java/xyz/nifeather/morph/providers/animation/bundled/ArmadilloAnimationSet.java
@@ -1,8 +1,8 @@
-package xiamomc.morph.providers.animation.bundled;
+package xyz.nifeather.morph.providers.animation.bundled;
 
-import xiamomc.morph.misc.AnimationNames;
-import xiamomc.morph.providers.animation.AnimationSet;
-import xiamomc.morph.providers.animation.SingleAnimation;
+import xyz.nifeather.morph.misc.AnimationNames;
+import xyz.nifeather.morph.providers.animation.AnimationSet;
+import xyz.nifeather.morph.providers.animation.SingleAnimation;
 
 import java.util.List;
 
diff --git a/src/main/java/xiamomc/morph/providers/animation/bundled/CatAnimationSet.java b/src/main/java/xyz/nifeather/morph/providers/animation/bundled/CatAnimationSet.java
similarity index 72%
rename from src/main/java/xiamomc/morph/providers/animation/bundled/CatAnimationSet.java
rename to src/main/java/xyz/nifeather/morph/providers/animation/bundled/CatAnimationSet.java
index 42cf8017..c220a579 100644
--- a/src/main/java/xiamomc/morph/providers/animation/bundled/CatAnimationSet.java
+++ b/src/main/java/xyz/nifeather/morph/providers/animation/bundled/CatAnimationSet.java
@@ -1,8 +1,8 @@
-package xiamomc.morph.providers.animation.bundled;
+package xyz.nifeather.morph.providers.animation.bundled;
 
-import xiamomc.morph.misc.AnimationNames;
-import xiamomc.morph.providers.animation.AnimationSet;
-import xiamomc.morph.providers.animation.SingleAnimation;
+import xyz.nifeather.morph.misc.AnimationNames;
+import xyz.nifeather.morph.providers.animation.AnimationSet;
+import xyz.nifeather.morph.providers.animation.SingleAnimation;
 
 import java.util.List;
 
diff --git a/src/main/java/xyz/nifeather/morph/providers/animation/bundled/FallbackAnimationSet.java b/src/main/java/xyz/nifeather/morph/providers/animation/bundled/FallbackAnimationSet.java
new file mode 100644
index 00000000..2ae88e0d
--- /dev/null
+++ b/src/main/java/xyz/nifeather/morph/providers/animation/bundled/FallbackAnimationSet.java
@@ -0,0 +1,7 @@
+package xyz.nifeather.morph.providers.animation.bundled;
+
+import xyz.nifeather.morph.providers.animation.AnimationSet;
+
+public class FallbackAnimationSet extends AnimationSet
+{
+}
diff --git a/src/main/java/xiamomc/morph/providers/animation/bundled/FoxAnimationSet.java b/src/main/java/xyz/nifeather/morph/providers/animation/bundled/FoxAnimationSet.java
similarity index 73%
rename from src/main/java/xiamomc/morph/providers/animation/bundled/FoxAnimationSet.java
rename to src/main/java/xyz/nifeather/morph/providers/animation/bundled/FoxAnimationSet.java
index 0cbcc7cf..8897b5b1 100644
--- a/src/main/java/xiamomc/morph/providers/animation/bundled/FoxAnimationSet.java
+++ b/src/main/java/xyz/nifeather/morph/providers/animation/bundled/FoxAnimationSet.java
@@ -1,8 +1,8 @@
-package xiamomc.morph.providers.animation.bundled;
+package xyz.nifeather.morph.providers.animation.bundled;
 
-import xiamomc.morph.misc.AnimationNames;
-import xiamomc.morph.providers.animation.AnimationSet;
-import xiamomc.morph.providers.animation.SingleAnimation;
+import xyz.nifeather.morph.misc.AnimationNames;
+import xyz.nifeather.morph.providers.animation.AnimationSet;
+import xyz.nifeather.morph.providers.animation.SingleAnimation;
 
 import java.util.List;
 
diff --git a/src/main/java/xiamomc/morph/providers/animation/bundled/FrogAnimationSet.java b/src/main/java/xyz/nifeather/morph/providers/animation/bundled/FrogAnimationSet.java
similarity index 54%
rename from src/main/java/xiamomc/morph/providers/animation/bundled/FrogAnimationSet.java
rename to src/main/java/xyz/nifeather/morph/providers/animation/bundled/FrogAnimationSet.java
index c3f715e9..c374ab60 100644
--- a/src/main/java/xiamomc/morph/providers/animation/bundled/FrogAnimationSet.java
+++ b/src/main/java/xyz/nifeather/morph/providers/animation/bundled/FrogAnimationSet.java
@@ -1,8 +1,8 @@
-package xiamomc.morph.providers.animation.bundled;
+package xyz.nifeather.morph.providers.animation.bundled;
 
-import xiamomc.morph.misc.AnimationNames;
-import xiamomc.morph.providers.animation.AnimationSet;
-import xiamomc.morph.providers.animation.SingleAnimation;
+import xyz.nifeather.morph.misc.AnimationNames;
+import xyz.nifeather.morph.providers.animation.AnimationSet;
+import xyz.nifeather.morph.providers.animation.SingleAnimation;
 
 import java.util.List;
 
diff --git a/src/main/java/xiamomc/morph/providers/animation/bundled/PandaAnimationSet.java b/src/main/java/xyz/nifeather/morph/providers/animation/bundled/PandaAnimationSet.java
similarity index 66%
rename from src/main/java/xiamomc/morph/providers/animation/bundled/PandaAnimationSet.java
rename to src/main/java/xyz/nifeather/morph/providers/animation/bundled/PandaAnimationSet.java
index c6998acb..fc16d7f6 100644
--- a/src/main/java/xiamomc/morph/providers/animation/bundled/PandaAnimationSet.java
+++ b/src/main/java/xyz/nifeather/morph/providers/animation/bundled/PandaAnimationSet.java
@@ -1,8 +1,8 @@
-package xiamomc.morph.providers.animation.bundled;
+package xyz.nifeather.morph.providers.animation.bundled;
 
-import xiamomc.morph.misc.AnimationNames;
-import xiamomc.morph.providers.animation.AnimationSet;
-import xiamomc.morph.providers.animation.SingleAnimation;
+import xyz.nifeather.morph.misc.AnimationNames;
+import xyz.nifeather.morph.providers.animation.AnimationSet;
+import xyz.nifeather.morph.providers.animation.SingleAnimation;
 
 import java.util.List;
 
diff --git a/src/main/java/xiamomc/morph/providers/animation/bundled/ParrotAnimationSet.java b/src/main/java/xyz/nifeather/morph/providers/animation/bundled/ParrotAnimationSet.java
similarity index 67%
rename from src/main/java/xiamomc/morph/providers/animation/bundled/ParrotAnimationSet.java
rename to src/main/java/xyz/nifeather/morph/providers/animation/bundled/ParrotAnimationSet.java
index eecd0abd..d33a8f3f 100644
--- a/src/main/java/xiamomc/morph/providers/animation/bundled/ParrotAnimationSet.java
+++ b/src/main/java/xyz/nifeather/morph/providers/animation/bundled/ParrotAnimationSet.java
@@ -1,8 +1,8 @@
-package xiamomc.morph.providers.animation.bundled;
+package xyz.nifeather.morph.providers.animation.bundled;
 
-import xiamomc.morph.misc.AnimationNames;
-import xiamomc.morph.providers.animation.AnimationSet;
-import xiamomc.morph.providers.animation.SingleAnimation;
+import xyz.nifeather.morph.misc.AnimationNames;
+import xyz.nifeather.morph.providers.animation.AnimationSet;
+import xyz.nifeather.morph.providers.animation.SingleAnimation;
 
 import java.util.List;
 
diff --git a/src/main/java/xiamomc/morph/providers/animation/bundled/PiglinAnimationSet.java b/src/main/java/xyz/nifeather/morph/providers/animation/bundled/PiglinAnimationSet.java
similarity index 67%
rename from src/main/java/xiamomc/morph/providers/animation/bundled/PiglinAnimationSet.java
rename to src/main/java/xyz/nifeather/morph/providers/animation/bundled/PiglinAnimationSet.java
index 2d5009f5..b0c74c45 100644
--- a/src/main/java/xiamomc/morph/providers/animation/bundled/PiglinAnimationSet.java
+++ b/src/main/java/xyz/nifeather/morph/providers/animation/bundled/PiglinAnimationSet.java
@@ -1,8 +1,8 @@
-package xiamomc.morph.providers.animation.bundled;
+package xyz.nifeather.morph.providers.animation.bundled;
 
-import xiamomc.morph.misc.AnimationNames;
-import xiamomc.morph.providers.animation.AnimationSet;
-import xiamomc.morph.providers.animation.SingleAnimation;
+import xyz.nifeather.morph.misc.AnimationNames;
+import xyz.nifeather.morph.providers.animation.AnimationSet;
+import xyz.nifeather.morph.providers.animation.SingleAnimation;
 
 import java.util.List;
 
diff --git a/src/main/java/xiamomc/morph/providers/animation/bundled/PlayerAnimationSet.java b/src/main/java/xyz/nifeather/morph/providers/animation/bundled/PlayerAnimationSet.java
similarity index 72%
rename from src/main/java/xiamomc/morph/providers/animation/bundled/PlayerAnimationSet.java
rename to src/main/java/xyz/nifeather/morph/providers/animation/bundled/PlayerAnimationSet.java
index 3c40afbb..b6cf2eb2 100644
--- a/src/main/java/xiamomc/morph/providers/animation/bundled/PlayerAnimationSet.java
+++ b/src/main/java/xyz/nifeather/morph/providers/animation/bundled/PlayerAnimationSet.java
@@ -1,8 +1,8 @@
-package xiamomc.morph.providers.animation.bundled;
+package xyz.nifeather.morph.providers.animation.bundled;
 
-import xiamomc.morph.misc.AnimationNames;
-import xiamomc.morph.providers.animation.AnimationSet;
-import xiamomc.morph.providers.animation.SingleAnimation;
+import xyz.nifeather.morph.misc.AnimationNames;
+import xyz.nifeather.morph.providers.animation.AnimationSet;
+import xyz.nifeather.morph.providers.animation.SingleAnimation;
 
 import java.util.List;
 
diff --git a/src/main/java/xiamomc/morph/providers/animation/bundled/PufferfishAnimationSet.java b/src/main/java/xyz/nifeather/morph/providers/animation/bundled/PufferfishAnimationSet.java
similarity index 67%
rename from src/main/java/xiamomc/morph/providers/animation/bundled/PufferfishAnimationSet.java
rename to src/main/java/xyz/nifeather/morph/providers/animation/bundled/PufferfishAnimationSet.java
index 6bec17f6..74fa9616 100644
--- a/src/main/java/xiamomc/morph/providers/animation/bundled/PufferfishAnimationSet.java
+++ b/src/main/java/xyz/nifeather/morph/providers/animation/bundled/PufferfishAnimationSet.java
@@ -1,8 +1,8 @@
-package xiamomc.morph.providers.animation.bundled;
+package xyz.nifeather.morph.providers.animation.bundled;
 
-import xiamomc.morph.misc.AnimationNames;
-import xiamomc.morph.providers.animation.AnimationSet;
-import xiamomc.morph.providers.animation.SingleAnimation;
+import xyz.nifeather.morph.misc.AnimationNames;
+import xyz.nifeather.morph.providers.animation.AnimationSet;
+import xyz.nifeather.morph.providers.animation.SingleAnimation;
 
 import java.util.List;
 
diff --git a/src/main/java/xiamomc/morph/providers/animation/bundled/ShulkerAnimationSet.java b/src/main/java/xyz/nifeather/morph/providers/animation/bundled/ShulkerAnimationSet.java
similarity index 75%
rename from src/main/java/xiamomc/morph/providers/animation/bundled/ShulkerAnimationSet.java
rename to src/main/java/xyz/nifeather/morph/providers/animation/bundled/ShulkerAnimationSet.java
index c888ab55..7777ff2e 100644
--- a/src/main/java/xiamomc/morph/providers/animation/bundled/ShulkerAnimationSet.java
+++ b/src/main/java/xyz/nifeather/morph/providers/animation/bundled/ShulkerAnimationSet.java
@@ -1,8 +1,8 @@
-package xiamomc.morph.providers.animation.bundled;
+package xyz.nifeather.morph.providers.animation.bundled;
 
-import xiamomc.morph.misc.AnimationNames;
-import xiamomc.morph.providers.animation.AnimationSet;
-import xiamomc.morph.providers.animation.SingleAnimation;
+import xyz.nifeather.morph.misc.AnimationNames;
+import xyz.nifeather.morph.providers.animation.AnimationSet;
+import xyz.nifeather.morph.providers.animation.SingleAnimation;
 
 import java.util.List;
 
diff --git a/src/main/java/xiamomc/morph/providers/animation/bundled/SnifferAnimationSet.java b/src/main/java/xyz/nifeather/morph/providers/animation/bundled/SnifferAnimationSet.java
similarity index 56%
rename from src/main/java/xiamomc/morph/providers/animation/bundled/SnifferAnimationSet.java
rename to src/main/java/xyz/nifeather/morph/providers/animation/bundled/SnifferAnimationSet.java
index 2c43d510..716dee94 100644
--- a/src/main/java/xiamomc/morph/providers/animation/bundled/SnifferAnimationSet.java
+++ b/src/main/java/xyz/nifeather/morph/providers/animation/bundled/SnifferAnimationSet.java
@@ -1,8 +1,8 @@
-package xiamomc.morph.providers.animation.bundled;
+package xyz.nifeather.morph.providers.animation.bundled;
 
-import xiamomc.morph.misc.AnimationNames;
-import xiamomc.morph.providers.animation.AnimationSet;
-import xiamomc.morph.providers.animation.SingleAnimation;
+import xyz.nifeather.morph.misc.AnimationNames;
+import xyz.nifeather.morph.providers.animation.AnimationSet;
+import xyz.nifeather.morph.providers.animation.SingleAnimation;
 
 import java.util.List;
 
diff --git a/src/main/java/xiamomc/morph/providers/animation/bundled/WardenAnimationSet.java b/src/main/java/xyz/nifeather/morph/providers/animation/bundled/WardenAnimationSet.java
similarity index 87%
rename from src/main/java/xiamomc/morph/providers/animation/bundled/WardenAnimationSet.java
rename to src/main/java/xyz/nifeather/morph/providers/animation/bundled/WardenAnimationSet.java
index 20386fcf..ef86f72e 100644
--- a/src/main/java/xiamomc/morph/providers/animation/bundled/WardenAnimationSet.java
+++ b/src/main/java/xyz/nifeather/morph/providers/animation/bundled/WardenAnimationSet.java
@@ -1,10 +1,10 @@
-package xiamomc.morph.providers.animation.bundled;
+package xyz.nifeather.morph.providers.animation.bundled;
 
 import net.minecraft.world.entity.ai.behavior.warden.Sniffing;
 import net.minecraft.world.entity.monster.warden.WardenAi;
-import xiamomc.morph.misc.AnimationNames;
-import xiamomc.morph.providers.animation.AnimationSet;
-import xiamomc.morph.providers.animation.SingleAnimation;
+import xyz.nifeather.morph.misc.AnimationNames;
+import xyz.nifeather.morph.providers.animation.AnimationSet;
+import xyz.nifeather.morph.providers.animation.SingleAnimation;
 
 import java.util.List;
 
diff --git a/src/main/java/xiamomc/morph/providers/animation/bundled/WolfAnimationSet.java b/src/main/java/xyz/nifeather/morph/providers/animation/bundled/WolfAnimationSet.java
similarity index 65%
rename from src/main/java/xiamomc/morph/providers/animation/bundled/WolfAnimationSet.java
rename to src/main/java/xyz/nifeather/morph/providers/animation/bundled/WolfAnimationSet.java
index bf6fab89..9480b4fd 100644
--- a/src/main/java/xiamomc/morph/providers/animation/bundled/WolfAnimationSet.java
+++ b/src/main/java/xyz/nifeather/morph/providers/animation/bundled/WolfAnimationSet.java
@@ -1,8 +1,8 @@
-package xiamomc.morph.providers.animation.bundled;
+package xyz.nifeather.morph.providers.animation.bundled;
 
-import xiamomc.morph.misc.AnimationNames;
-import xiamomc.morph.providers.animation.AnimationSet;
-import xiamomc.morph.providers.animation.SingleAnimation;
+import xyz.nifeather.morph.misc.AnimationNames;
+import xyz.nifeather.morph.providers.animation.AnimationSet;
+import xyz.nifeather.morph.providers.animation.SingleAnimation;
 
 import java.util.List;
 
diff --git a/src/main/java/xiamomc/morph/providers/animation/provider/DefaultAnimationProvider.java b/src/main/java/xyz/nifeather/morph/providers/animation/provider/DefaultAnimationProvider.java
similarity index 73%
rename from src/main/java/xiamomc/morph/providers/animation/provider/DefaultAnimationProvider.java
rename to src/main/java/xyz/nifeather/morph/providers/animation/provider/DefaultAnimationProvider.java
index b6799575..2f4765e5 100644
--- a/src/main/java/xiamomc/morph/providers/animation/provider/DefaultAnimationProvider.java
+++ b/src/main/java/xyz/nifeather/morph/providers/animation/provider/DefaultAnimationProvider.java
@@ -1,9 +1,9 @@
-package xiamomc.morph.providers.animation.provider;
+package xyz.nifeather.morph.providers.animation.provider;
 
 import org.bukkit.entity.EntityType;
-import xiamomc.morph.providers.animation.AnimationProvider;
-import xiamomc.morph.providers.animation.AnimationSet;
-import xiamomc.morph.providers.animation.bundled.FallbackAnimationSet;
+import xyz.nifeather.morph.providers.animation.AnimationProvider;
+import xyz.nifeather.morph.providers.animation.AnimationSet;
+import xyz.nifeather.morph.providers.animation.bundled.FallbackAnimationSet;
 
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
diff --git a/src/main/java/xiamomc/morph/providers/animation/provider/FallbackAnimationProvider.java b/src/main/java/xyz/nifeather/morph/providers/animation/provider/FallbackAnimationProvider.java
similarity index 52%
rename from src/main/java/xiamomc/morph/providers/animation/provider/FallbackAnimationProvider.java
rename to src/main/java/xyz/nifeather/morph/providers/animation/provider/FallbackAnimationProvider.java
index f231c72b..5508358b 100644
--- a/src/main/java/xiamomc/morph/providers/animation/provider/FallbackAnimationProvider.java
+++ b/src/main/java/xyz/nifeather/morph/providers/animation/provider/FallbackAnimationProvider.java
@@ -1,10 +1,9 @@
-package xiamomc.morph.providers.animation.provider;
+package xyz.nifeather.morph.providers.animation.provider;
 
 import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.providers.animation.AnimationProvider;
-import xiamomc.morph.providers.animation.AnimationSet;
-import xiamomc.morph.providers.animation.bundled.FallbackAnimationSet;
+import xyz.nifeather.morph.providers.animation.AnimationProvider;
+import xyz.nifeather.morph.providers.animation.AnimationSet;
+import xyz.nifeather.morph.providers.animation.bundled.FallbackAnimationSet;
 
 public class FallbackAnimationProvider extends AnimationProvider
 {
diff --git a/src/main/java/xiamomc/morph/providers/animation/provider/PlayerAnimationProvider.java b/src/main/java/xyz/nifeather/morph/providers/animation/provider/PlayerAnimationProvider.java
similarity index 53%
rename from src/main/java/xiamomc/morph/providers/animation/provider/PlayerAnimationProvider.java
rename to src/main/java/xyz/nifeather/morph/providers/animation/provider/PlayerAnimationProvider.java
index fe68df2d..70bde37c 100644
--- a/src/main/java/xiamomc/morph/providers/animation/provider/PlayerAnimationProvider.java
+++ b/src/main/java/xyz/nifeather/morph/providers/animation/provider/PlayerAnimationProvider.java
@@ -1,10 +1,9 @@
-package xiamomc.morph.providers.animation.provider;
+package xyz.nifeather.morph.providers.animation.provider;
 
 import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.providers.animation.AnimationProvider;
-import xiamomc.morph.providers.animation.AnimationSet;
-import xiamomc.morph.providers.animation.bundled.PlayerAnimationSet;
+import xyz.nifeather.morph.providers.animation.AnimationProvider;
+import xyz.nifeather.morph.providers.animation.AnimationSet;
+import xyz.nifeather.morph.providers.animation.bundled.PlayerAnimationSet;
 
 public class PlayerAnimationProvider extends AnimationProvider
 {
diff --git a/src/main/java/xiamomc/morph/providers/animation/provider/VanillaAnimationProvider.java b/src/main/java/xyz/nifeather/morph/providers/animation/provider/VanillaAnimationProvider.java
similarity index 86%
rename from src/main/java/xiamomc/morph/providers/animation/provider/VanillaAnimationProvider.java
rename to src/main/java/xyz/nifeather/morph/providers/animation/provider/VanillaAnimationProvider.java
index cce7d5c0..be07b1b0 100644
--- a/src/main/java/xiamomc/morph/providers/animation/provider/VanillaAnimationProvider.java
+++ b/src/main/java/xyz/nifeather/morph/providers/animation/provider/VanillaAnimationProvider.java
@@ -1,10 +1,11 @@
-package xiamomc.morph.providers.animation.provider;
+package xyz.nifeather.morph.providers.animation.provider;
 
 import org.bukkit.entity.EntityType;
 import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.providers.animation.AnimationSet;
+import xyz.nifeather.morph.providers.animation.AnimationSet;
 import xiamomc.morph.providers.animation.bundled.*;
+import xyz.nifeather.morph.morph.providers.animation.bundled.*;
+import xyz.nifeather.morph.providers.animation.bundled.*;
 
 public class VanillaAnimationProvider extends DefaultAnimationProvider
 {
diff --git a/src/main/java/xiamomc/morph/providers/disguise/DefaultDisguiseProvider.java b/src/main/java/xyz/nifeather/morph/providers/disguise/DefaultDisguiseProvider.java
similarity index 91%
rename from src/main/java/xiamomc/morph/providers/disguise/DefaultDisguiseProvider.java
rename to src/main/java/xyz/nifeather/morph/providers/disguise/DefaultDisguiseProvider.java
index 64165029..693cbfb0 100644
--- a/src/main/java/xiamomc/morph/providers/disguise/DefaultDisguiseProvider.java
+++ b/src/main/java/xyz/nifeather/morph/providers/disguise/DefaultDisguiseProvider.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.providers.disguise;
+package xyz.nifeather.morph.providers.disguise;
 
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
 import net.kyori.adventure.text.Component;
@@ -10,17 +10,17 @@
 import org.bukkit.inventory.EquipmentSlot;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.RevealingHandler;
-import xiamomc.morph.abilities.AbilityManager;
-import xiamomc.morph.backends.DisguiseBackend;
-import xiamomc.morph.messages.MessageUtils;
-import xiamomc.morph.messages.MorphStrings;
-import xiamomc.morph.misc.DisguiseState;
+import xyz.nifeather.morph.RevealingHandler;
+import xyz.nifeather.morph.abilities.AbilityManager;
+import xyz.nifeather.morph.backends.DisguiseBackend;
+import xyz.nifeather.morph.messages.MessageUtils;
+import xyz.nifeather.morph.messages.MorphStrings;
+import xyz.nifeather.morph.misc.DisguiseState;
 import xiamomc.morph.network.commands.S2C.AbstractS2CCommand;
-import xiamomc.morph.network.server.MorphClientHandler;
-import xiamomc.morph.network.server.ServerSetEquipCommand;
-import xiamomc.morph.skills.MorphSkillHandler;
-import xiamomc.morph.skills.SkillType;
+import xyz.nifeather.morph.network.server.MorphClientHandler;
+import xyz.nifeather.morph.network.server.ServerSetEquipCommand;
+import xyz.nifeather.morph.skills.MorphSkillHandler;
+import xyz.nifeather.morph.skills.SkillType;
 import xiamomc.pluginbase.Annotations.Resolved;
 import xiamomc.pluginbase.Messages.MessageStore;
 
diff --git a/src/main/java/xiamomc/morph/providers/disguise/DisguiseProvider.java b/src/main/java/xyz/nifeather/morph/providers/disguise/DisguiseProvider.java
similarity index 94%
rename from src/main/java/xiamomc/morph/providers/disguise/DisguiseProvider.java
rename to src/main/java/xyz/nifeather/morph/providers/disguise/DisguiseProvider.java
index febc61dd..a0a1c97c 100644
--- a/src/main/java/xiamomc/morph/providers/disguise/DisguiseProvider.java
+++ b/src/main/java/xyz/nifeather/morph/providers/disguise/DisguiseProvider.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.providers.disguise;
+package xyz.nifeather.morph.providers.disguise;
 
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
 import net.kyori.adventure.text.Component;
@@ -6,20 +6,19 @@
 import org.bukkit.craftbukkit.entity.CraftLivingEntity;
 import org.bukkit.entity.Entity;
 import org.bukkit.entity.Player;
-import org.jetbrains.annotations.Contract;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.MorphManager;
-import xiamomc.morph.MorphPluginObject;
-import xiamomc.morph.backends.DisguiseBackend;
-import xiamomc.morph.backends.DisguiseWrapper;
-import xiamomc.morph.config.ConfigOption;
-import xiamomc.morph.config.MorphConfigManager;
-import xiamomc.morph.misc.DisguiseMeta;
-import xiamomc.morph.misc.DisguiseState;
+import xyz.nifeather.morph.MorphManager;
+import xyz.nifeather.morph.MorphPluginObject;
+import xyz.nifeather.morph.backends.DisguiseBackend;
+import xyz.nifeather.morph.backends.DisguiseWrapper;
+import xyz.nifeather.morph.config.ConfigOption;
+import xyz.nifeather.morph.config.MorphConfigManager;
+import xyz.nifeather.morph.misc.DisguiseMeta;
+import xyz.nifeather.morph.misc.DisguiseState;
 import xiamomc.morph.network.commands.S2C.AbstractS2CCommand;
-import xiamomc.morph.providers.animation.AnimationProvider;
-import xiamomc.morph.utilities.NbtUtils;
+import xyz.nifeather.morph.providers.animation.AnimationProvider;
+import xyz.nifeather.morph.utilities.NbtUtils;
 import xiamomc.pluginbase.Annotations.Initializer;
 import xiamomc.pluginbase.Annotations.Resolved;
 import xiamomc.pluginbase.Bindables.BindableList;
diff --git a/src/main/java/xiamomc/morph/providers/disguise/DisguiseResult.java b/src/main/java/xyz/nifeather/morph/providers/disguise/DisguiseResult.java
similarity index 90%
rename from src/main/java/xiamomc/morph/providers/disguise/DisguiseResult.java
rename to src/main/java/xyz/nifeather/morph/providers/disguise/DisguiseResult.java
index 329e0d53..6482bec2 100644
--- a/src/main/java/xiamomc/morph/providers/disguise/DisguiseResult.java
+++ b/src/main/java/xyz/nifeather/morph/providers/disguise/DisguiseResult.java
@@ -1,7 +1,7 @@
-package xiamomc.morph.providers.disguise;
+package xyz.nifeather.morph.providers.disguise;
 
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.backends.DisguiseWrapper;
+import xyz.nifeather.morph.backends.DisguiseWrapper;
 
 /**
  * @param wrapperInstance Wrapper实例,在失败时为空
diff --git a/src/main/java/xiamomc/morph/providers/disguise/FallbackDisguiseProvider.java b/src/main/java/xyz/nifeather/morph/providers/disguise/FallbackDisguiseProvider.java
similarity index 86%
rename from src/main/java/xiamomc/morph/providers/disguise/FallbackDisguiseProvider.java
rename to src/main/java/xyz/nifeather/morph/providers/disguise/FallbackDisguiseProvider.java
index e608fb26..8d9760b6 100644
--- a/src/main/java/xiamomc/morph/providers/disguise/FallbackDisguiseProvider.java
+++ b/src/main/java/xyz/nifeather/morph/providers/disguise/FallbackDisguiseProvider.java
@@ -1,15 +1,15 @@
-package xiamomc.morph.providers.disguise;
+package xyz.nifeather.morph.providers.disguise;
 
 import net.kyori.adventure.text.Component;
 import org.bukkit.entity.Entity;
 import org.bukkit.entity.Player;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.backends.DisguiseWrapper;
-import xiamomc.morph.misc.DisguiseMeta;
-import xiamomc.morph.misc.DisguiseState;
-import xiamomc.morph.providers.animation.AnimationProvider;
-import xiamomc.morph.providers.animation.provider.FallbackAnimationProvider;
+import xyz.nifeather.morph.backends.DisguiseWrapper;
+import xyz.nifeather.morph.misc.DisguiseMeta;
+import xyz.nifeather.morph.misc.DisguiseState;
+import xyz.nifeather.morph.providers.animation.AnimationProvider;
+import xyz.nifeather.morph.providers.animation.provider.FallbackAnimationProvider;
 
 import java.util.List;
 
diff --git a/src/main/java/xiamomc/morph/providers/disguise/ModelEngineProvider.java b/src/main/java/xyz/nifeather/morph/providers/disguise/ModelEngineProvider.java
similarity index 92%
rename from src/main/java/xiamomc/morph/providers/disguise/ModelEngineProvider.java
rename to src/main/java/xyz/nifeather/morph/providers/disguise/ModelEngineProvider.java
index 863b1404..ae8a257a 100644
--- a/src/main/java/xiamomc/morph/providers/disguise/ModelEngineProvider.java
+++ b/src/main/java/xyz/nifeather/morph/providers/disguise/ModelEngineProvider.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.providers.disguise;
+package xyz.nifeather.morph.providers.disguise;
 
 import com.ticxo.modelengine.api.ModelEngineAPI;
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
@@ -7,16 +7,15 @@
 import org.bukkit.entity.Player;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.backends.DisguiseBackend;
-import xiamomc.morph.backends.DisguiseWrapper;
-import xiamomc.morph.backends.modelengine.MEBackend;
-import xiamomc.morph.misc.DisguiseMeta;
-import xiamomc.morph.misc.DisguiseState;
-import xiamomc.morph.misc.DisguiseTypes;
+import xyz.nifeather.morph.backends.DisguiseBackend;
+import xyz.nifeather.morph.backends.DisguiseWrapper;
+import xyz.nifeather.morph.backends.modelengine.MEBackend;
+import xyz.nifeather.morph.misc.DisguiseMeta;
+import xyz.nifeather.morph.misc.DisguiseState;
+import xyz.nifeather.morph.misc.DisguiseTypes;
 import xiamomc.morph.network.commands.S2C.AbstractS2CCommand;
-import xiamomc.morph.providers.animation.AnimationProvider;
-import xiamomc.morph.providers.animation.provider.FallbackAnimationProvider;
-import xiamomc.morph.providers.animation.provider.VanillaAnimationProvider;
+import xyz.nifeather.morph.providers.animation.AnimationProvider;
+import xyz.nifeather.morph.providers.animation.provider.FallbackAnimationProvider;
 import xiamomc.pluginbase.Exceptions.NullDependencyException;
 
 import java.util.List;
diff --git a/src/main/java/xiamomc/morph/providers/disguise/PlayerDisguiseProvider.java b/src/main/java/xyz/nifeather/morph/providers/disguise/PlayerDisguiseProvider.java
similarity index 91%
rename from src/main/java/xiamomc/morph/providers/disguise/PlayerDisguiseProvider.java
rename to src/main/java/xyz/nifeather/morph/providers/disguise/PlayerDisguiseProvider.java
index a6c9270a..c001d594 100644
--- a/src/main/java/xiamomc/morph/providers/disguise/PlayerDisguiseProvider.java
+++ b/src/main/java/xyz/nifeather/morph/providers/disguise/PlayerDisguiseProvider.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.providers.disguise;
+package xyz.nifeather.morph.providers.disguise;
 
 import com.mojang.authlib.GameProfile;
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
@@ -13,19 +13,19 @@
 import org.bukkit.inventory.meta.SkullMeta;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.backends.DisguiseWrapper;
-import xiamomc.morph.backends.WrapperEvent;
-import xiamomc.morph.messages.MessageUtils;
-import xiamomc.morph.messages.MorphStrings;
-import xiamomc.morph.misc.DisguiseMeta;
-import xiamomc.morph.misc.DisguiseState;
-import xiamomc.morph.misc.DisguiseTypes;
-import xiamomc.morph.misc.MorphGameProfile;
-import xiamomc.morph.misc.skins.PlayerSkinProvider;
+import xyz.nifeather.morph.backends.DisguiseWrapper;
+import xyz.nifeather.morph.backends.WrapperEvent;
+import xyz.nifeather.morph.messages.MessageUtils;
+import xyz.nifeather.morph.messages.MorphStrings;
+import xyz.nifeather.morph.misc.DisguiseMeta;
+import xyz.nifeather.morph.misc.DisguiseState;
+import xyz.nifeather.morph.misc.DisguiseTypes;
+import xyz.nifeather.morph.misc.MorphGameProfile;
+import xyz.nifeather.morph.misc.skins.PlayerSkinProvider;
 import xiamomc.morph.network.commands.S2C.set.S2CSetProfileCommand;
-import xiamomc.morph.network.server.MorphClientHandler;
-import xiamomc.morph.providers.animation.AnimationProvider;
-import xiamomc.morph.providers.animation.provider.PlayerAnimationProvider;
+import xyz.nifeather.morph.network.server.MorphClientHandler;
+import xyz.nifeather.morph.providers.animation.AnimationProvider;
+import xyz.nifeather.morph.providers.animation.provider.PlayerAnimationProvider;
 import xiamomc.pluginbase.Annotations.Resolved;
 
 import java.util.List;
diff --git a/src/main/java/xiamomc/morph/providers/disguise/VanillaDisguiseProvider.java b/src/main/java/xyz/nifeather/morph/providers/disguise/VanillaDisguiseProvider.java
similarity index 94%
rename from src/main/java/xiamomc/morph/providers/disguise/VanillaDisguiseProvider.java
rename to src/main/java/xyz/nifeather/morph/providers/disguise/VanillaDisguiseProvider.java
index c288c31e..972edc61 100644
--- a/src/main/java/xiamomc/morph/providers/disguise/VanillaDisguiseProvider.java
+++ b/src/main/java/xyz/nifeather/morph/providers/disguise/VanillaDisguiseProvider.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.providers.disguise;
+package xyz.nifeather.morph.providers.disguise;
 
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
 import net.kyori.adventure.text.Component;
@@ -13,25 +13,27 @@
 import org.bukkit.inventory.EquipmentSlotGroup;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.backends.DisguiseWrapper;
-import xiamomc.morph.config.ConfigOption;
-import xiamomc.morph.config.MorphConfigManager;
-import xiamomc.morph.messages.MessageUtils;
-import xiamomc.morph.messages.MorphStrings;
-import xiamomc.morph.messages.vanilla.VanillaMessageStore;
-import xiamomc.morph.misc.DisguiseMeta;
-import xiamomc.morph.misc.DisguiseState;
-import xiamomc.morph.misc.DisguiseTypes;
-import xiamomc.morph.misc.NmsRecord;
-import xiamomc.morph.misc.disguiseProperty.DisguiseProperties;
-import xiamomc.morph.misc.disguiseProperty.values.ArmorStandProperties;
-import xiamomc.morph.providers.animation.AnimationProvider;
-import xiamomc.morph.providers.animation.provider.VanillaAnimationProvider;
+import xyz.nifeather.morph.backends.DisguiseWrapper;
+import xyz.nifeather.morph.config.ConfigOption;
+import xyz.nifeather.morph.config.MorphConfigManager;
+import xyz.nifeather.morph.messages.MessageUtils;
+import xyz.nifeather.morph.messages.MorphStrings;
+import xyz.nifeather.morph.messages.vanilla.VanillaMessageStore;
+import xyz.nifeather.morph.misc.DisguiseMeta;
+import xyz.nifeather.morph.misc.DisguiseState;
+import xyz.nifeather.morph.misc.DisguiseTypes;
+import xyz.nifeather.morph.misc.NmsRecord;
+import xyz.nifeather.morph.misc.disguiseProperty.DisguiseProperties;
+import xyz.nifeather.morph.misc.disguiseProperty.values.ArmorStandProperties;
+import xyz.nifeather.morph.providers.animation.AnimationProvider;
+import xyz.nifeather.morph.providers.animation.provider.VanillaAnimationProvider;
 import xiamomc.morph.utilities.*;
 import xiamomc.pluginbase.Annotations.Initializer;
 import xiamomc.pluginbase.Annotations.Resolved;
 import xiamomc.pluginbase.Bindables.Bindable;
 import xiamomc.pluginbase.Exceptions.NullDependencyException;
+import xyz.nifeather.morph.morph.utilities.*;
+import xyz.nifeather.morph.utilities.*;
 
 import java.lang.reflect.Field;
 import java.util.List;
diff --git a/src/main/java/xiamomc/morph/skills/DefaultConfigGenerator.java b/src/main/java/xyz/nifeather/morph/skills/DefaultConfigGenerator.java
similarity index 94%
rename from src/main/java/xiamomc/morph/skills/DefaultConfigGenerator.java
rename to src/main/java/xyz/nifeather/morph/skills/DefaultConfigGenerator.java
index 8f6ddc29..3eed79be 100644
--- a/src/main/java/xiamomc/morph/skills/DefaultConfigGenerator.java
+++ b/src/main/java/xyz/nifeather/morph/skills/DefaultConfigGenerator.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.skills;
+package xyz.nifeather.morph.skills;
 
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
 import net.kyori.adventure.bossbar.BossBar;
@@ -7,18 +7,20 @@
 import org.bukkit.entity.EntityType;
 import org.bukkit.potion.PotionEffectType;
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.MorphManager;
-import xiamomc.morph.abilities.AbilityType;
+import xyz.nifeather.morph.MorphManager;
+import xyz.nifeather.morph.abilities.AbilityType;
 import xiamomc.morph.abilities.options.*;
-import xiamomc.morph.skills.impl.SonicBoomMorphSkill;
-import xiamomc.morph.skills.options.EffectConfiguration;
-import xiamomc.morph.skills.options.ExplosionConfiguration;
-import xiamomc.morph.skills.options.ProjectileConfiguration;
-import xiamomc.morph.skills.options.TeleportConfiguration;
-import xiamomc.morph.storage.skill.SkillAbilityConfiguration;
-import xiamomc.morph.storage.skill.SkillAbilityConfigurationContainer;
-import xiamomc.morph.utilities.DisguiseUtils;
-import xiamomc.morph.utilities.EntityTypeUtils;
+import xyz.nifeather.morph.abilities.options.*;
+import xyz.nifeather.morph.morph.abilities.options.*;
+import xyz.nifeather.morph.skills.impl.SonicBoomMorphSkill;
+import xyz.nifeather.morph.skills.options.EffectConfiguration;
+import xyz.nifeather.morph.skills.options.ExplosionConfiguration;
+import xyz.nifeather.morph.skills.options.ProjectileConfiguration;
+import xyz.nifeather.morph.skills.options.TeleportConfiguration;
+import xyz.nifeather.morph.storage.skill.SkillAbilityConfiguration;
+import xyz.nifeather.morph.storage.skill.SkillAbilityConfigurationContainer;
+import xyz.nifeather.morph.utilities.DisguiseUtils;
+import xyz.nifeather.morph.utilities.EntityTypeUtils;
 
 import java.util.Collection;
 import java.util.List;
diff --git a/src/main/java/xiamomc/morph/skills/IMorphSkill.java b/src/main/java/xyz/nifeather/morph/skills/IMorphSkill.java
similarity index 87%
rename from src/main/java/xiamomc/morph/skills/IMorphSkill.java
rename to src/main/java/xyz/nifeather/morph/skills/IMorphSkill.java
index 776a20dd..ff083784 100644
--- a/src/main/java/xiamomc/morph/skills/IMorphSkill.java
+++ b/src/main/java/xyz/nifeather/morph/skills/IMorphSkill.java
@@ -1,14 +1,14 @@
-package xiamomc.morph.skills;
+package xyz.nifeather.morph.skills;
 
 import org.bukkit.NamespacedKey;
 import org.bukkit.entity.Player;
 import org.jetbrains.annotations.ApiStatus;
 import org.jetbrains.annotations.NotNull;
-import xiamomc.morph.messages.MessageUtils;
-import xiamomc.morph.messages.SkillStrings;
-import xiamomc.morph.misc.DisguiseState;
-import xiamomc.morph.storage.skill.ISkillOption;
-import xiamomc.morph.storage.skill.SkillAbilityConfiguration;
+import xyz.nifeather.morph.messages.MessageUtils;
+import xyz.nifeather.morph.messages.SkillStrings;
+import xyz.nifeather.morph.misc.DisguiseState;
+import xyz.nifeather.morph.storage.skill.ISkillOption;
+import xyz.nifeather.morph.storage.skill.SkillAbilityConfiguration;
 
 public interface IMorphSkill<T extends ISkillOption>
 {
diff --git a/src/main/java/xiamomc/morph/skills/MorphSkill.java b/src/main/java/xyz/nifeather/morph/skills/MorphSkill.java
similarity index 92%
rename from src/main/java/xiamomc/morph/skills/MorphSkill.java
rename to src/main/java/xyz/nifeather/morph/skills/MorphSkill.java
index 980f7fb9..775e7722 100644
--- a/src/main/java/xiamomc/morph/skills/MorphSkill.java
+++ b/src/main/java/xyz/nifeather/morph/skills/MorphSkill.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.skills;
+package xyz.nifeather.morph.skills;
 
 import net.kyori.adventure.key.Key;
 import net.kyori.adventure.sound.Sound;
@@ -11,11 +11,11 @@
 import org.bukkit.entity.*;
 import org.bukkit.event.entity.CreatureSpawnEvent;
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.MorphPluginObject;
-import xiamomc.morph.messages.MessageUtils;
-import xiamomc.morph.messages.SkillStrings;
-import xiamomc.morph.storage.skill.ISkillOption;
-import xiamomc.morph.utilities.DisguiseUtils;
+import xyz.nifeather.morph.MorphPluginObject;
+import xyz.nifeather.morph.messages.MessageUtils;
+import xyz.nifeather.morph.messages.SkillStrings;
+import xyz.nifeather.morph.storage.skill.ISkillOption;
+import xyz.nifeather.morph.utilities.DisguiseUtils;
 
 import java.util.List;
 
diff --git a/src/main/java/xiamomc/morph/skills/MorphSkillHandler.java b/src/main/java/xyz/nifeather/morph/skills/MorphSkillHandler.java
similarity index 93%
rename from src/main/java/xiamomc/morph/skills/MorphSkillHandler.java
rename to src/main/java/xyz/nifeather/morph/skills/MorphSkillHandler.java
index 18dba0fe..10ab7991 100644
--- a/src/main/java/xiamomc/morph/skills/MorphSkillHandler.java
+++ b/src/main/java/xyz/nifeather/morph/skills/MorphSkillHandler.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.skills;
+package xyz.nifeather.morph.skills;
 
 import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
@@ -12,20 +12,22 @@
 import org.jetbrains.annotations.Contract;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.MorphManager;
-import xiamomc.morph.MorphPluginObject;
-import xiamomc.morph.events.api.gameplay.PlayerExecuteSkillEvent;
-import xiamomc.morph.events.api.lifecycle.SkillsFinishedInitializeEvent;
-import xiamomc.morph.messages.CommandStrings;
-import xiamomc.morph.messages.MessageUtils;
-import xiamomc.morph.messages.MorphStrings;
-import xiamomc.morph.messages.SkillStrings;
-import xiamomc.morph.misc.permissions.CommonPermissions;
+import xyz.nifeather.morph.MorphManager;
+import xyz.nifeather.morph.MorphPluginObject;
+import xyz.nifeather.morph.events.api.gameplay.PlayerExecuteSkillEvent;
+import xyz.nifeather.morph.events.api.lifecycle.SkillsFinishedInitializeEvent;
+import xyz.nifeather.morph.messages.CommandStrings;
+import xyz.nifeather.morph.messages.MessageUtils;
+import xyz.nifeather.morph.messages.MorphStrings;
+import xyz.nifeather.morph.messages.SkillStrings;
+import xyz.nifeather.morph.misc.permissions.CommonPermissions;
 import xiamomc.morph.skills.impl.*;
-import xiamomc.morph.storage.skill.ISkillOption;
-import xiamomc.morph.storage.skill.SkillAbilityConfiguration;
-import xiamomc.morph.storage.skill.SkillAbilityConfigurationStore;
-import xiamomc.morph.utilities.PermissionUtils;
+import xyz.nifeather.morph.morph.skills.impl.*;
+import xyz.nifeather.morph.skills.impl.*;
+import xyz.nifeather.morph.storage.skill.ISkillOption;
+import xyz.nifeather.morph.storage.skill.SkillAbilityConfiguration;
+import xyz.nifeather.morph.storage.skill.SkillAbilityConfigurationStore;
+import xyz.nifeather.morph.utilities.PermissionUtils;
 import xiamomc.pluginbase.Annotations.Initializer;
 import xiamomc.pluginbase.Annotations.Resolved;
 
diff --git a/src/main/java/xiamomc/morph/skills/SkillCooldownInfo.java b/src/main/java/xyz/nifeather/morph/skills/SkillCooldownInfo.java
similarity index 96%
rename from src/main/java/xiamomc/morph/skills/SkillCooldownInfo.java
rename to src/main/java/xyz/nifeather/morph/skills/SkillCooldownInfo.java
index a01b48a2..3ba27976 100644
--- a/src/main/java/xiamomc/morph/skills/SkillCooldownInfo.java
+++ b/src/main/java/xyz/nifeather/morph/skills/SkillCooldownInfo.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.skills;
+package xyz.nifeather.morph.skills;
 
 public class SkillCooldownInfo
 {
diff --git a/src/main/java/xiamomc/morph/skills/SkillType.java b/src/main/java/xyz/nifeather/morph/skills/SkillType.java
similarity index 97%
rename from src/main/java/xiamomc/morph/skills/SkillType.java
rename to src/main/java/xyz/nifeather/morph/skills/SkillType.java
index 267b0bf9..ca97c9c9 100644
--- a/src/main/java/xiamomc/morph/skills/SkillType.java
+++ b/src/main/java/xyz/nifeather/morph/skills/SkillType.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.skills;
+package xyz.nifeather.morph.skills;
 
 import org.bukkit.NamespacedKey;
 
diff --git a/src/main/java/xiamomc/morph/skills/impl/ApplyEffectMorphSkill.java b/src/main/java/xyz/nifeather/morph/skills/impl/ApplyEffectMorphSkill.java
similarity index 85%
rename from src/main/java/xiamomc/morph/skills/impl/ApplyEffectMorphSkill.java
rename to src/main/java/xyz/nifeather/morph/skills/impl/ApplyEffectMorphSkill.java
index 98c91b8a..3b4a21e1 100644
--- a/src/main/java/xiamomc/morph/skills/impl/ApplyEffectMorphSkill.java
+++ b/src/main/java/xyz/nifeather/morph/skills/impl/ApplyEffectMorphSkill.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.skills.impl;
+package xyz.nifeather.morph.skills.impl;
 
 import net.kyori.adventure.key.Key;
 import net.kyori.adventure.sound.Sound;
@@ -8,13 +8,13 @@
 import org.bukkit.potion.PotionEffect;
 import org.bukkit.potion.PotionEffectType;
 import org.jetbrains.annotations.NotNull;
-import xiamomc.morph.messages.MessageUtils;
-import xiamomc.morph.messages.SkillStrings;
-import xiamomc.morph.misc.DisguiseState;
-import xiamomc.morph.skills.MorphSkill;
-import xiamomc.morph.skills.SkillType;
-import xiamomc.morph.skills.options.EffectConfiguration;
-import xiamomc.morph.storage.skill.SkillAbilityConfiguration;
+import xyz.nifeather.morph.messages.MessageUtils;
+import xyz.nifeather.morph.messages.SkillStrings;
+import xyz.nifeather.morph.misc.DisguiseState;
+import xyz.nifeather.morph.skills.MorphSkill;
+import xyz.nifeather.morph.skills.SkillType;
+import xyz.nifeather.morph.skills.options.EffectConfiguration;
+import xyz.nifeather.morph.storage.skill.SkillAbilityConfiguration;
 
 public class ApplyEffectMorphSkill extends MorphSkill<EffectConfiguration>
 {
diff --git a/src/main/java/xiamomc/morph/skills/impl/DelayedMorphSkill.java b/src/main/java/xyz/nifeather/morph/skills/impl/DelayedMorphSkill.java
similarity index 89%
rename from src/main/java/xiamomc/morph/skills/impl/DelayedMorphSkill.java
rename to src/main/java/xyz/nifeather/morph/skills/impl/DelayedMorphSkill.java
index 979a6c87..e482c1f9 100644
--- a/src/main/java/xiamomc/morph/skills/impl/DelayedMorphSkill.java
+++ b/src/main/java/xyz/nifeather/morph/skills/impl/DelayedMorphSkill.java
@@ -1,11 +1,11 @@
-package xiamomc.morph.skills.impl;
+package xyz.nifeather.morph.skills.impl;
 
 import org.bukkit.entity.Player;
-import xiamomc.morph.MorphManager;
-import xiamomc.morph.misc.DisguiseState;
-import xiamomc.morph.skills.MorphSkill;
-import xiamomc.morph.storage.skill.ISkillOption;
-import xiamomc.morph.storage.skill.SkillAbilityConfiguration;
+import xyz.nifeather.morph.MorphManager;
+import xyz.nifeather.morph.misc.DisguiseState;
+import xyz.nifeather.morph.skills.MorphSkill;
+import xyz.nifeather.morph.storage.skill.ISkillOption;
+import xyz.nifeather.morph.storage.skill.SkillAbilityConfiguration;
 import xiamomc.pluginbase.Annotations.Resolved;
 
 public abstract class DelayedMorphSkill<T extends ISkillOption> extends MorphSkill<T>
diff --git a/src/main/java/xiamomc/morph/skills/impl/ExplodeMorphSkill.java b/src/main/java/xyz/nifeather/morph/skills/impl/ExplodeMorphSkill.java
similarity index 88%
rename from src/main/java/xiamomc/morph/skills/impl/ExplodeMorphSkill.java
rename to src/main/java/xyz/nifeather/morph/skills/impl/ExplodeMorphSkill.java
index 993ea633..a44d5561 100644
--- a/src/main/java/xiamomc/morph/skills/impl/ExplodeMorphSkill.java
+++ b/src/main/java/xyz/nifeather/morph/skills/impl/ExplodeMorphSkill.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.skills.impl;
+package xyz.nifeather.morph.skills.impl;
 
 import net.kyori.adventure.key.Key;
 import net.kyori.adventure.sound.Sound;
@@ -10,14 +10,14 @@
 import org.bukkit.entity.EntityType;
 import org.bukkit.entity.Player;
 import org.jetbrains.annotations.NotNull;
-import xiamomc.morph.messages.MessageUtils;
-import xiamomc.morph.messages.SkillStrings;
-import xiamomc.morph.misc.DisguiseState;
+import xyz.nifeather.morph.messages.MessageUtils;
+import xyz.nifeather.morph.messages.SkillStrings;
+import xyz.nifeather.morph.misc.DisguiseState;
 import xiamomc.morph.network.commands.S2C.set.S2CSetSNbtCommand;
-import xiamomc.morph.network.server.MorphClientHandler;
-import xiamomc.morph.skills.SkillType;
-import xiamomc.morph.skills.options.ExplosionConfiguration;
-import xiamomc.morph.storage.skill.SkillAbilityConfiguration;
+import xyz.nifeather.morph.network.server.MorphClientHandler;
+import xyz.nifeather.morph.skills.SkillType;
+import xyz.nifeather.morph.skills.options.ExplosionConfiguration;
+import xyz.nifeather.morph.storage.skill.SkillAbilityConfiguration;
 import xiamomc.pluginbase.Annotations.Resolved;
 
 public class ExplodeMorphSkill extends DelayedMorphSkill<ExplosionConfiguration>
diff --git a/src/main/java/xiamomc/morph/skills/impl/InventoryMorphSkill.java b/src/main/java/xyz/nifeather/morph/skills/impl/InventoryMorphSkill.java
similarity index 79%
rename from src/main/java/xiamomc/morph/skills/impl/InventoryMorphSkill.java
rename to src/main/java/xyz/nifeather/morph/skills/impl/InventoryMorphSkill.java
index 254207c7..995967a3 100644
--- a/src/main/java/xiamomc/morph/skills/impl/InventoryMorphSkill.java
+++ b/src/main/java/xyz/nifeather/morph/skills/impl/InventoryMorphSkill.java
@@ -1,18 +1,18 @@
-package xiamomc.morph.skills.impl;
+package xyz.nifeather.morph.skills.impl;
 
 import org.bukkit.NamespacedKey;
 import org.bukkit.entity.Player;
 import org.jetbrains.annotations.NotNull;
-import xiamomc.morph.MorphManager;
-import xiamomc.morph.messages.MessageUtils;
-import xiamomc.morph.messages.SkillStrings;
-import xiamomc.morph.misc.DisguiseState;
+import xyz.nifeather.morph.MorphManager;
+import xyz.nifeather.morph.messages.MessageUtils;
+import xyz.nifeather.morph.messages.SkillStrings;
+import xyz.nifeather.morph.misc.DisguiseState;
 import xiamomc.morph.network.commands.S2C.set.S2CSetDisplayingFakeEquipCommand;
-import xiamomc.morph.network.server.MorphClientHandler;
-import xiamomc.morph.skills.MorphSkill;
-import xiamomc.morph.skills.SkillType;
-import xiamomc.morph.skills.options.NoOpConfiguration;
-import xiamomc.morph.storage.skill.SkillAbilityConfiguration;
+import xyz.nifeather.morph.network.server.MorphClientHandler;
+import xyz.nifeather.morph.skills.MorphSkill;
+import xyz.nifeather.morph.skills.SkillType;
+import xyz.nifeather.morph.skills.options.NoOpConfiguration;
+import xyz.nifeather.morph.storage.skill.SkillAbilityConfiguration;
 import xiamomc.pluginbase.Annotations.Resolved;
 
 public class InventoryMorphSkill extends MorphSkill<NoOpConfiguration>
diff --git a/src/main/java/xiamomc/morph/skills/impl/LaunchProjectileMorphSkill.java b/src/main/java/xyz/nifeather/morph/skills/impl/LaunchProjectileMorphSkill.java
similarity index 88%
rename from src/main/java/xiamomc/morph/skills/impl/LaunchProjectileMorphSkill.java
rename to src/main/java/xyz/nifeather/morph/skills/impl/LaunchProjectileMorphSkill.java
index d2dd6898..b14d7a93 100644
--- a/src/main/java/xiamomc/morph/skills/impl/LaunchProjectileMorphSkill.java
+++ b/src/main/java/xyz/nifeather/morph/skills/impl/LaunchProjectileMorphSkill.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.skills.impl;
+package xyz.nifeather.morph.skills.impl;
 
 import net.kyori.adventure.key.Key;
 import net.kyori.adventure.sound.Sound;
@@ -8,15 +8,15 @@
 import org.bukkit.entity.ShulkerBullet;
 import org.bukkit.entity.WitherSkull;
 import org.jetbrains.annotations.NotNull;
-import xiamomc.morph.messages.MessageUtils;
-import xiamomc.morph.messages.SkillStrings;
-import xiamomc.morph.misc.DisguiseState;
+import xyz.nifeather.morph.messages.MessageUtils;
+import xyz.nifeather.morph.messages.SkillStrings;
+import xyz.nifeather.morph.misc.DisguiseState;
 import xiamomc.morph.network.commands.S2C.set.S2CSetAggressiveCommand;
-import xiamomc.morph.network.server.MorphClientHandler;
-import xiamomc.morph.skills.SkillType;
-import xiamomc.morph.skills.options.ProjectileConfiguration;
-import xiamomc.morph.storage.skill.SkillAbilityConfiguration;
-import xiamomc.morph.utilities.EntityTypeUtils;
+import xyz.nifeather.morph.network.server.MorphClientHandler;
+import xyz.nifeather.morph.skills.SkillType;
+import xyz.nifeather.morph.skills.options.ProjectileConfiguration;
+import xyz.nifeather.morph.storage.skill.SkillAbilityConfiguration;
+import xyz.nifeather.morph.utilities.EntityTypeUtils;
 import xiamomc.pluginbase.Annotations.Resolved;
 
 public class LaunchProjectileMorphSkill extends DelayedMorphSkill<ProjectileConfiguration>
diff --git a/src/main/java/xiamomc/morph/skills/impl/NoneMorphSkill.java b/src/main/java/xyz/nifeather/morph/skills/impl/NoneMorphSkill.java
similarity index 73%
rename from src/main/java/xiamomc/morph/skills/impl/NoneMorphSkill.java
rename to src/main/java/xyz/nifeather/morph/skills/impl/NoneMorphSkill.java
index 00f056a3..0213138f 100644
--- a/src/main/java/xiamomc/morph/skills/impl/NoneMorphSkill.java
+++ b/src/main/java/xyz/nifeather/morph/skills/impl/NoneMorphSkill.java
@@ -1,13 +1,13 @@
-package xiamomc.morph.skills.impl;
+package xyz.nifeather.morph.skills.impl;
 
 import org.bukkit.NamespacedKey;
 import org.bukkit.entity.Player;
 import org.jetbrains.annotations.NotNull;
-import xiamomc.morph.misc.DisguiseState;
-import xiamomc.morph.skills.MorphSkill;
-import xiamomc.morph.skills.SkillType;
-import xiamomc.morph.skills.options.NoOpConfiguration;
-import xiamomc.morph.storage.skill.SkillAbilityConfiguration;
+import xyz.nifeather.morph.misc.DisguiseState;
+import xyz.nifeather.morph.skills.MorphSkill;
+import xyz.nifeather.morph.skills.SkillType;
+import xyz.nifeather.morph.skills.options.NoOpConfiguration;
+import xyz.nifeather.morph.storage.skill.SkillAbilityConfiguration;
 
 public final class NoneMorphSkill extends MorphSkill<NoOpConfiguration>
 {
diff --git a/src/main/java/xiamomc/morph/skills/impl/SonicBoomMorphSkill.java b/src/main/java/xyz/nifeather/morph/skills/impl/SonicBoomMorphSkill.java
similarity index 89%
rename from src/main/java/xiamomc/morph/skills/impl/SonicBoomMorphSkill.java
rename to src/main/java/xyz/nifeather/morph/skills/impl/SonicBoomMorphSkill.java
index f26593f8..295348d5 100644
--- a/src/main/java/xiamomc/morph/skills/impl/SonicBoomMorphSkill.java
+++ b/src/main/java/xyz/nifeather/morph/skills/impl/SonicBoomMorphSkill.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.skills.impl;
+package xyz.nifeather.morph.skills.impl;
 
 import net.kyori.adventure.key.Key;
 import net.kyori.adventure.sound.Sound;
@@ -9,14 +9,14 @@
 import org.bukkit.craftbukkit.entity.CraftLivingEntity;
 import org.bukkit.entity.Player;
 import org.jetbrains.annotations.NotNull;
-import xiamomc.morph.misc.DisguiseState;
-import xiamomc.morph.misc.NmsRecord;
+import xyz.nifeather.morph.misc.DisguiseState;
+import xyz.nifeather.morph.misc.NmsRecord;
 import xiamomc.morph.network.commands.S2C.set.S2CSetAggressiveCommand;
-import xiamomc.morph.network.server.MorphClientHandler;
-import xiamomc.morph.skills.SkillType;
-import xiamomc.morph.skills.options.NoOpConfiguration;
-import xiamomc.morph.storage.skill.SkillAbilityConfiguration;
-import xiamomc.morph.utilities.DamageSourceUtils;
+import xyz.nifeather.morph.network.server.MorphClientHandler;
+import xyz.nifeather.morph.skills.SkillType;
+import xyz.nifeather.morph.skills.options.NoOpConfiguration;
+import xyz.nifeather.morph.storage.skill.SkillAbilityConfiguration;
+import xyz.nifeather.morph.utilities.DamageSourceUtils;
 import xiamomc.pluginbase.Annotations.Resolved;
 
 public class SonicBoomMorphSkill extends DelayedMorphSkill<NoOpConfiguration>
diff --git a/src/main/java/xiamomc/morph/skills/impl/SplashPotionSkill.java b/src/main/java/xyz/nifeather/morph/skills/impl/SplashPotionSkill.java
similarity index 91%
rename from src/main/java/xiamomc/morph/skills/impl/SplashPotionSkill.java
rename to src/main/java/xyz/nifeather/morph/skills/impl/SplashPotionSkill.java
index c714e19c..a0577e44 100644
--- a/src/main/java/xiamomc/morph/skills/impl/SplashPotionSkill.java
+++ b/src/main/java/xyz/nifeather/morph/skills/impl/SplashPotionSkill.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.skills.impl;
+package xyz.nifeather.morph.skills.impl;
 
 import net.minecraft.core.registries.BuiltInRegistries;
 import net.minecraft.resources.ResourceLocation;
@@ -12,12 +12,12 @@
 import org.bukkit.potion.PotionEffect;
 import org.bukkit.potion.PotionEffectType;
 import org.jetbrains.annotations.NotNull;
-import xiamomc.morph.misc.DisguiseState;
-import xiamomc.morph.skills.MorphSkill;
-import xiamomc.morph.skills.SkillType;
-import xiamomc.morph.skills.options.NoOpConfiguration;
-import xiamomc.morph.storage.skill.ISkillOption;
-import xiamomc.morph.storage.skill.SkillAbilityConfiguration;
+import xyz.nifeather.morph.misc.DisguiseState;
+import xyz.nifeather.morph.skills.MorphSkill;
+import xyz.nifeather.morph.skills.SkillType;
+import xyz.nifeather.morph.skills.options.NoOpConfiguration;
+import xyz.nifeather.morph.storage.skill.ISkillOption;
+import xyz.nifeather.morph.storage.skill.SkillAbilityConfiguration;
 
 import java.util.Random;
 import java.util.concurrent.atomic.AtomicInteger;
diff --git a/src/main/java/xiamomc/morph/skills/impl/SummonFangsMorphSkill.java b/src/main/java/xyz/nifeather/morph/skills/impl/SummonFangsMorphSkill.java
similarity index 89%
rename from src/main/java/xiamomc/morph/skills/impl/SummonFangsMorphSkill.java
rename to src/main/java/xyz/nifeather/morph/skills/impl/SummonFangsMorphSkill.java
index 12465d49..2723f243 100644
--- a/src/main/java/xiamomc/morph/skills/impl/SummonFangsMorphSkill.java
+++ b/src/main/java/xyz/nifeather/morph/skills/impl/SummonFangsMorphSkill.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.skills.impl;
+package xyz.nifeather.morph.skills.impl;
 
 import org.bukkit.Difficulty;
 import org.bukkit.FluidCollisionMode;
@@ -12,15 +12,15 @@
 import org.bukkit.event.entity.CreatureSpawnEvent;
 import org.bukkit.util.Vector;
 import org.jetbrains.annotations.NotNull;
-import xiamomc.morph.messages.MessageUtils;
-import xiamomc.morph.messages.SkillStrings;
-import xiamomc.morph.misc.DisguiseState;
-import xiamomc.morph.misc.NmsRecord;
-import xiamomc.morph.misc.mobs.MorphBukkitVexModifier;
-import xiamomc.morph.skills.MorphSkill;
-import xiamomc.morph.skills.SkillType;
-import xiamomc.morph.skills.options.NoOpConfiguration;
-import xiamomc.morph.storage.skill.SkillAbilityConfiguration;
+import xyz.nifeather.morph.messages.MessageUtils;
+import xyz.nifeather.morph.messages.SkillStrings;
+import xyz.nifeather.morph.misc.DisguiseState;
+import xyz.nifeather.morph.misc.NmsRecord;
+import xyz.nifeather.morph.misc.mobs.MorphBukkitVexModifier;
+import xyz.nifeather.morph.skills.MorphSkill;
+import xyz.nifeather.morph.skills.SkillType;
+import xyz.nifeather.morph.skills.options.NoOpConfiguration;
+import xyz.nifeather.morph.storage.skill.SkillAbilityConfiguration;
 
 public class SummonFangsMorphSkill extends MorphSkill<NoOpConfiguration>
 {
diff --git a/src/main/java/xiamomc/morph/skills/impl/TeleportMorphSkill.java b/src/main/java/xyz/nifeather/morph/skills/impl/TeleportMorphSkill.java
similarity index 88%
rename from src/main/java/xiamomc/morph/skills/impl/TeleportMorphSkill.java
rename to src/main/java/xyz/nifeather/morph/skills/impl/TeleportMorphSkill.java
index f7482495..f3e682fe 100644
--- a/src/main/java/xiamomc/morph/skills/impl/TeleportMorphSkill.java
+++ b/src/main/java/xyz/nifeather/morph/skills/impl/TeleportMorphSkill.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.skills.impl;
+package xyz.nifeather.morph.skills.impl;
 
 import net.kyori.adventure.key.Key;
 import net.kyori.adventure.sound.Sound;
@@ -9,13 +9,13 @@
 import org.bukkit.entity.Player;
 import org.bukkit.util.Vector;
 import org.jetbrains.annotations.NotNull;
-import xiamomc.morph.messages.MessageUtils;
-import xiamomc.morph.messages.SkillStrings;
-import xiamomc.morph.misc.DisguiseState;
-import xiamomc.morph.skills.MorphSkill;
-import xiamomc.morph.skills.SkillType;
-import xiamomc.morph.skills.options.TeleportConfiguration;
-import xiamomc.morph.storage.skill.SkillAbilityConfiguration;
+import xyz.nifeather.morph.messages.MessageUtils;
+import xyz.nifeather.morph.messages.SkillStrings;
+import xyz.nifeather.morph.misc.DisguiseState;
+import xyz.nifeather.morph.skills.MorphSkill;
+import xyz.nifeather.morph.skills.SkillType;
+import xyz.nifeather.morph.skills.options.TeleportConfiguration;
+import xyz.nifeather.morph.storage.skill.SkillAbilityConfiguration;
 
 public class TeleportMorphSkill extends MorphSkill<TeleportConfiguration>
 {
diff --git a/src/main/java/xiamomc/morph/skills/options/EffectConfiguration.java b/src/main/java/xyz/nifeather/morph/skills/options/EffectConfiguration.java
similarity index 95%
rename from src/main/java/xiamomc/morph/skills/options/EffectConfiguration.java
rename to src/main/java/xyz/nifeather/morph/skills/options/EffectConfiguration.java
index 28f6bd21..42fdd26d 100644
--- a/src/main/java/xiamomc/morph/skills/options/EffectConfiguration.java
+++ b/src/main/java/xyz/nifeather/morph/skills/options/EffectConfiguration.java
@@ -1,10 +1,10 @@
-package xiamomc.morph.skills.options;
+package xyz.nifeather.morph.skills.options;
 
 import com.google.gson.annotations.Expose;
 import com.google.gson.annotations.SerializedName;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.storage.skill.ISkillOption;
+import xyz.nifeather.morph.storage.skill.ISkillOption;
 
 public class EffectConfiguration implements ISkillOption
 {
diff --git a/src/main/java/xiamomc/morph/skills/options/ExplosionConfiguration.java b/src/main/java/xyz/nifeather/morph/skills/options/ExplosionConfiguration.java
similarity index 92%
rename from src/main/java/xiamomc/morph/skills/options/ExplosionConfiguration.java
rename to src/main/java/xyz/nifeather/morph/skills/options/ExplosionConfiguration.java
index b45038c4..b902437a 100644
--- a/src/main/java/xiamomc/morph/skills/options/ExplosionConfiguration.java
+++ b/src/main/java/xyz/nifeather/morph/skills/options/ExplosionConfiguration.java
@@ -1,8 +1,8 @@
-package xiamomc.morph.skills.options;
+package xyz.nifeather.morph.skills.options;
 
 import com.google.gson.annotations.Expose;
 import com.google.gson.annotations.SerializedName;
-import xiamomc.morph.storage.skill.ISkillOption;
+import xyz.nifeather.morph.storage.skill.ISkillOption;
 
 public class ExplosionConfiguration implements ISkillOption
 {
diff --git a/src/main/java/xiamomc/morph/skills/options/NoOpConfiguration.java b/src/main/java/xyz/nifeather/morph/skills/options/NoOpConfiguration.java
similarity index 86%
rename from src/main/java/xiamomc/morph/skills/options/NoOpConfiguration.java
rename to src/main/java/xyz/nifeather/morph/skills/options/NoOpConfiguration.java
index 15eac399..bc20421e 100644
--- a/src/main/java/xiamomc/morph/skills/options/NoOpConfiguration.java
+++ b/src/main/java/xyz/nifeather/morph/skills/options/NoOpConfiguration.java
@@ -1,7 +1,7 @@
-package xiamomc.morph.skills.options;
+package xyz.nifeather.morph.skills.options;
 
 import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
-import xiamomc.morph.storage.skill.ISkillOption;
+import xyz.nifeather.morph.storage.skill.ISkillOption;
 
 import java.util.Map;
 
diff --git a/src/main/java/xiamomc/morph/skills/options/ProjectileConfiguration.java b/src/main/java/xyz/nifeather/morph/skills/options/ProjectileConfiguration.java
similarity index 96%
rename from src/main/java/xiamomc/morph/skills/options/ProjectileConfiguration.java
rename to src/main/java/xyz/nifeather/morph/skills/options/ProjectileConfiguration.java
index 65625a20..f3ca4e66 100644
--- a/src/main/java/xiamomc/morph/skills/options/ProjectileConfiguration.java
+++ b/src/main/java/xyz/nifeather/morph/skills/options/ProjectileConfiguration.java
@@ -1,9 +1,9 @@
-package xiamomc.morph.skills.options;
+package xyz.nifeather.morph.skills.options;
 
 import com.google.gson.annotations.Expose;
 import com.google.gson.annotations.SerializedName;
 import org.bukkit.entity.EntityType;
-import xiamomc.morph.storage.skill.ISkillOption;
+import xyz.nifeather.morph.storage.skill.ISkillOption;
 
 public class ProjectileConfiguration implements ISkillOption
 {
diff --git a/src/main/java/xiamomc/morph/skills/options/SummonConfiguration.java b/src/main/java/xyz/nifeather/morph/skills/options/SummonConfiguration.java
similarity index 79%
rename from src/main/java/xiamomc/morph/skills/options/SummonConfiguration.java
rename to src/main/java/xyz/nifeather/morph/skills/options/SummonConfiguration.java
index 79a72fe0..54d185a4 100644
--- a/src/main/java/xiamomc/morph/skills/options/SummonConfiguration.java
+++ b/src/main/java/xyz/nifeather/morph/skills/options/SummonConfiguration.java
@@ -1,8 +1,8 @@
-package xiamomc.morph.skills.options;
+package xyz.nifeather.morph.skills.options;
 
 import com.google.gson.annotations.Expose;
 import org.bukkit.entity.EntityType;
-import xiamomc.morph.utilities.EntityTypeUtils;
+import xyz.nifeather.morph.utilities.EntityTypeUtils;
 
 public class SummonConfiguration
 {
diff --git a/src/main/java/xiamomc/morph/skills/options/TeleportConfiguration.java b/src/main/java/xyz/nifeather/morph/skills/options/TeleportConfiguration.java
similarity index 84%
rename from src/main/java/xiamomc/morph/skills/options/TeleportConfiguration.java
rename to src/main/java/xyz/nifeather/morph/skills/options/TeleportConfiguration.java
index f7559ad8..9ac34c60 100644
--- a/src/main/java/xiamomc/morph/skills/options/TeleportConfiguration.java
+++ b/src/main/java/xyz/nifeather/morph/skills/options/TeleportConfiguration.java
@@ -1,8 +1,8 @@
-package xiamomc.morph.skills.options;
+package xyz.nifeather.morph.skills.options;
 
 import com.google.gson.annotations.Expose;
 import com.google.gson.annotations.SerializedName;
-import xiamomc.morph.storage.skill.ISkillOption;
+import xyz.nifeather.morph.storage.skill.ISkillOption;
 
 public class TeleportConfiguration implements ISkillOption
 {
diff --git a/src/main/java/xiamomc/morph/storage/DirectoryStorage.java b/src/main/java/xyz/nifeather/morph/storage/DirectoryStorage.java
similarity index 98%
rename from src/main/java/xiamomc/morph/storage/DirectoryStorage.java
rename to src/main/java/xyz/nifeather/morph/storage/DirectoryStorage.java
index 5a3cb930..7e5e6965 100755
--- a/src/main/java/xiamomc/morph/storage/DirectoryStorage.java
+++ b/src/main/java/xyz/nifeather/morph/storage/DirectoryStorage.java
@@ -1,7 +1,7 @@
-package xiamomc.morph.storage;
+package xyz.nifeather.morph.storage;
 
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.MorphPluginObject;
+import xyz.nifeather.morph.MorphPluginObject;
 
 import java.io.File;
 import java.net.URI;
diff --git a/src/main/java/xiamomc/morph/storage/MorphJsonBasedStorage.java b/src/main/java/xyz/nifeather/morph/storage/MorphJsonBasedStorage.java
similarity index 76%
rename from src/main/java/xiamomc/morph/storage/MorphJsonBasedStorage.java
rename to src/main/java/xyz/nifeather/morph/storage/MorphJsonBasedStorage.java
index dfc83e32..660943de 100644
--- a/src/main/java/xiamomc/morph/storage/MorphJsonBasedStorage.java
+++ b/src/main/java/xyz/nifeather/morph/storage/MorphJsonBasedStorage.java
@@ -1,6 +1,6 @@
-package xiamomc.morph.storage;
+package xyz.nifeather.morph.storage;
 
-import xiamomc.morph.MorphPlugin;
+import xyz.nifeather.morph.MorphPlugin;
 import xiamomc.pluginbase.JsonBasedStorage;
 
 public abstract class MorphJsonBasedStorage<T> extends JsonBasedStorage<T, MorphPlugin>
diff --git a/src/main/java/xiamomc/morph/storage/mirrorlogging/MirrorSingleEntry.java b/src/main/java/xyz/nifeather/morph/storage/mirrorlogging/MirrorSingleEntry.java
similarity index 96%
rename from src/main/java/xiamomc/morph/storage/mirrorlogging/MirrorSingleEntry.java
rename to src/main/java/xyz/nifeather/morph/storage/mirrorlogging/MirrorSingleEntry.java
index f02a6c44..efd1bb25 100644
--- a/src/main/java/xiamomc/morph/storage/mirrorlogging/MirrorSingleEntry.java
+++ b/src/main/java/xyz/nifeather/morph/storage/mirrorlogging/MirrorSingleEntry.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.storage.mirrorlogging;
+package xyz.nifeather.morph.storage.mirrorlogging;
 
 import com.google.gson.annotations.Expose;
 
diff --git a/src/main/java/xiamomc/morph/storage/mirrorlogging/OperationType.java b/src/main/java/xyz/nifeather/morph/storage/mirrorlogging/OperationType.java
similarity index 74%
rename from src/main/java/xiamomc/morph/storage/mirrorlogging/OperationType.java
rename to src/main/java/xyz/nifeather/morph/storage/mirrorlogging/OperationType.java
index fa664700..e8ca03ad 100644
--- a/src/main/java/xiamomc/morph/storage/mirrorlogging/OperationType.java
+++ b/src/main/java/xyz/nifeather/morph/storage/mirrorlogging/OperationType.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.storage.mirrorlogging;
+package xyz.nifeather.morph.storage.mirrorlogging;
 
 public enum OperationType
 {
diff --git a/src/main/java/xyz/nifeather/morph/storage/offlinestore/IOfflineState.java b/src/main/java/xyz/nifeather/morph/storage/offlinestore/IOfflineState.java
new file mode 100644
index 00000000..8341008f
--- /dev/null
+++ b/src/main/java/xyz/nifeather/morph/storage/offlinestore/IOfflineState.java
@@ -0,0 +1,5 @@
+package xyz.nifeather.morph.storage.offlinestore;
+
+public interface IOfflineState
+{
+}
diff --git a/src/main/java/xiamomc/morph/storage/offlinestore/OfflineDisguiseState.java b/src/main/java/xyz/nifeather/morph/storage/offlinestore/OfflineDisguiseState.java
similarity index 96%
rename from src/main/java/xiamomc/morph/storage/offlinestore/OfflineDisguiseState.java
rename to src/main/java/xyz/nifeather/morph/storage/offlinestore/OfflineDisguiseState.java
index 1d1b2e16..150417f3 100644
--- a/src/main/java/xiamomc/morph/storage/offlinestore/OfflineDisguiseState.java
+++ b/src/main/java/xyz/nifeather/morph/storage/offlinestore/OfflineDisguiseState.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.storage.offlinestore;
+package xyz.nifeather.morph.storage.offlinestore;
 
 import com.google.gson.annotations.Expose;
 import org.jetbrains.annotations.Nullable;
diff --git a/src/main/java/xiamomc/morph/storage/offlinestore/OfflineStateContainer.java b/src/main/java/xyz/nifeather/morph/storage/offlinestore/OfflineStateContainer.java
similarity index 83%
rename from src/main/java/xiamomc/morph/storage/offlinestore/OfflineStateContainer.java
rename to src/main/java/xyz/nifeather/morph/storage/offlinestore/OfflineStateContainer.java
index c3242545..2dff07aa 100644
--- a/src/main/java/xiamomc/morph/storage/offlinestore/OfflineStateContainer.java
+++ b/src/main/java/xyz/nifeather/morph/storage/offlinestore/OfflineStateContainer.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.storage.offlinestore;
+package xyz.nifeather.morph.storage.offlinestore;
 
 import com.google.gson.annotations.Expose;
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
diff --git a/src/main/java/xiamomc/morph/storage/offlinestore/OfflineStateStore.java b/src/main/java/xyz/nifeather/morph/storage/offlinestore/OfflineStateStore.java
similarity index 89%
rename from src/main/java/xiamomc/morph/storage/offlinestore/OfflineStateStore.java
rename to src/main/java/xyz/nifeather/morph/storage/offlinestore/OfflineStateStore.java
index e0c247bc..61c28109 100644
--- a/src/main/java/xiamomc/morph/storage/offlinestore/OfflineStateStore.java
+++ b/src/main/java/xyz/nifeather/morph/storage/offlinestore/OfflineStateStore.java
@@ -1,11 +1,11 @@
-package xiamomc.morph.storage.offlinestore;
+package xyz.nifeather.morph.storage.offlinestore;
 
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.interfaces.IManageOfflineStates;
-import xiamomc.morph.misc.DisguiseState;
-import xiamomc.morph.misc.DisguiseStateGenerator;
-import xiamomc.morph.storage.MorphJsonBasedStorage;
+import xyz.nifeather.morph.interfaces.IManageOfflineStates;
+import xyz.nifeather.morph.misc.DisguiseState;
+import xyz.nifeather.morph.misc.DisguiseStateGenerator;
+import xyz.nifeather.morph.storage.MorphJsonBasedStorage;
 
 import java.util.List;
 import java.util.UUID;
diff --git a/src/main/java/xiamomc/morph/storage/playerdata/PlayerDataStore.java b/src/main/java/xyz/nifeather/morph/storage/playerdata/PlayerDataStore.java
similarity index 94%
rename from src/main/java/xiamomc/morph/storage/playerdata/PlayerDataStore.java
rename to src/main/java/xyz/nifeather/morph/storage/playerdata/PlayerDataStore.java
index 65a78341..8bd87cd4 100644
--- a/src/main/java/xiamomc/morph/storage/playerdata/PlayerDataStore.java
+++ b/src/main/java/xyz/nifeather/morph/storage/playerdata/PlayerDataStore.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.storage.playerdata;
+package xyz.nifeather.morph.storage.playerdata;
 
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
 import net.kyori.adventure.text.Component;
@@ -6,14 +6,14 @@
 import org.bukkit.entity.Player;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.MorphManager;
-import xiamomc.morph.interfaces.IManagePlayerData;
-import xiamomc.morph.messages.MessageUtils;
-import xiamomc.morph.messages.MorphStrings;
-import xiamomc.morph.misc.DisguiseMeta;
-import xiamomc.morph.misc.DisguiseState;
-import xiamomc.morph.misc.DisguiseTypes;
-import xiamomc.morph.storage.MorphJsonBasedStorage;
+import xyz.nifeather.morph.MorphManager;
+import xyz.nifeather.morph.interfaces.IManagePlayerData;
+import xyz.nifeather.morph.messages.MessageUtils;
+import xyz.nifeather.morph.messages.MorphStrings;
+import xyz.nifeather.morph.misc.DisguiseMeta;
+import xyz.nifeather.morph.misc.DisguiseState;
+import xyz.nifeather.morph.misc.DisguiseTypes;
+import xyz.nifeather.morph.storage.MorphJsonBasedStorage;
 import xiamomc.pluginbase.Annotations.Resolved;
 
 import java.util.List;
diff --git a/src/main/java/xiamomc/morph/storage/playerdata/PlayerMeta.java b/src/main/java/xyz/nifeather/morph/storage/playerdata/PlayerMeta.java
similarity index 95%
rename from src/main/java/xiamomc/morph/storage/playerdata/PlayerMeta.java
rename to src/main/java/xyz/nifeather/morph/storage/playerdata/PlayerMeta.java
index 83324405..b819d278 100644
--- a/src/main/java/xiamomc/morph/storage/playerdata/PlayerMeta.java
+++ b/src/main/java/xyz/nifeather/morph/storage/playerdata/PlayerMeta.java
@@ -1,10 +1,10 @@
-package xiamomc.morph.storage.playerdata;
+package xyz.nifeather.morph.storage.playerdata;
 
 import com.google.gson.annotations.Expose;
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.misc.DisguiseMeta;
-import xiamomc.morph.utilities.DisguiseUtils;
+import xyz.nifeather.morph.misc.DisguiseMeta;
+import xyz.nifeather.morph.utilities.DisguiseUtils;
 
 import java.util.UUID;
 
diff --git a/src/main/java/xiamomc/morph/storage/playerdata/PlayerMetaContainer.java b/src/main/java/xyz/nifeather/morph/storage/playerdata/PlayerMetaContainer.java
similarity index 88%
rename from src/main/java/xiamomc/morph/storage/playerdata/PlayerMetaContainer.java
rename to src/main/java/xyz/nifeather/morph/storage/playerdata/PlayerMetaContainer.java
index adba29a5..f2c42c08 100644
--- a/src/main/java/xiamomc/morph/storage/playerdata/PlayerMetaContainer.java
+++ b/src/main/java/xyz/nifeather/morph/storage/playerdata/PlayerMetaContainer.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.storage.playerdata;
+package xyz.nifeather.morph.storage.playerdata;
 
 import com.google.gson.annotations.Expose;
 import com.google.gson.annotations.SerializedName;
diff --git a/src/main/java/xiamomc/morph/storage/skill/ISkillOption.java b/src/main/java/xyz/nifeather/morph/storage/skill/ISkillOption.java
similarity index 99%
rename from src/main/java/xiamomc/morph/storage/skill/ISkillOption.java
rename to src/main/java/xyz/nifeather/morph/storage/skill/ISkillOption.java
index c6dbbcf1..dc000b39 100644
--- a/src/main/java/xiamomc/morph/storage/skill/ISkillOption.java
+++ b/src/main/java/xyz/nifeather/morph/storage/skill/ISkillOption.java
@@ -1,10 +1,10 @@
-package xiamomc.morph.storage.skill;
+package xyz.nifeather.morph.storage.skill;
 
 import com.google.gson.annotations.Expose;
 import com.google.gson.annotations.SerializedName;
 import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.MorphPlugin;
+import xyz.nifeather.morph.MorphPlugin;
 
 import java.util.Arrays;
 import java.util.Map;
diff --git a/src/main/java/xiamomc/morph/storage/skill/SkillAbilityConfiguration.java b/src/main/java/xyz/nifeather/morph/storage/skill/SkillAbilityConfiguration.java
similarity index 95%
rename from src/main/java/xiamomc/morph/storage/skill/SkillAbilityConfiguration.java
rename to src/main/java/xyz/nifeather/morph/storage/skill/SkillAbilityConfiguration.java
index 3b602e73..ee01d4a6 100644
--- a/src/main/java/xiamomc/morph/storage/skill/SkillAbilityConfiguration.java
+++ b/src/main/java/xyz/nifeather/morph/storage/skill/SkillAbilityConfiguration.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.storage.skill;
+package xyz.nifeather.morph.storage.skill;
 
 import com.google.gson.annotations.Expose;
 import com.google.gson.annotations.SerializedName;
@@ -8,13 +8,13 @@
 import org.bukkit.entity.EntityType;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.abilities.IMorphAbility;
-import xiamomc.morph.skills.IMorphSkill;
-import xiamomc.morph.skills.SkillType;
-import xiamomc.morph.skills.options.EffectConfiguration;
-import xiamomc.morph.skills.options.ExplosionConfiguration;
-import xiamomc.morph.skills.options.ProjectileConfiguration;
-import xiamomc.morph.skills.options.TeleportConfiguration;
+import xyz.nifeather.morph.abilities.IMorphAbility;
+import xyz.nifeather.morph.skills.IMorphSkill;
+import xyz.nifeather.morph.skills.SkillType;
+import xyz.nifeather.morph.skills.options.EffectConfiguration;
+import xyz.nifeather.morph.skills.options.ExplosionConfiguration;
+import xyz.nifeather.morph.skills.options.ProjectileConfiguration;
+import xyz.nifeather.morph.skills.options.TeleportConfiguration;
 
 import java.util.List;
 import java.util.Map;
diff --git a/src/main/java/xiamomc/morph/storage/skill/SkillAbilityConfigurationContainer.java b/src/main/java/xyz/nifeather/morph/storage/skill/SkillAbilityConfigurationContainer.java
similarity index 87%
rename from src/main/java/xiamomc/morph/storage/skill/SkillAbilityConfigurationContainer.java
rename to src/main/java/xyz/nifeather/morph/storage/skill/SkillAbilityConfigurationContainer.java
index fe5fd047..cdaf33a4 100644
--- a/src/main/java/xiamomc/morph/storage/skill/SkillAbilityConfigurationContainer.java
+++ b/src/main/java/xyz/nifeather/morph/storage/skill/SkillAbilityConfigurationContainer.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.storage.skill;
+package xyz.nifeather.morph.storage.skill;
 
 import com.google.gson.annotations.Expose;
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
diff --git a/src/main/java/xiamomc/morph/storage/skill/SkillAbilityConfigurationStore.java b/src/main/java/xyz/nifeather/morph/storage/skill/SkillAbilityConfigurationStore.java
similarity index 93%
rename from src/main/java/xiamomc/morph/storage/skill/SkillAbilityConfigurationStore.java
rename to src/main/java/xyz/nifeather/morph/storage/skill/SkillAbilityConfigurationStore.java
index d32a6fb9..b5067f5b 100644
--- a/src/main/java/xiamomc/morph/storage/skill/SkillAbilityConfigurationStore.java
+++ b/src/main/java/xyz/nifeather/morph/storage/skill/SkillAbilityConfigurationStore.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.storage.skill;
+package xyz.nifeather.morph.storage.skill;
 
 import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
@@ -7,22 +7,22 @@
 import org.bukkit.entity.EntityType;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.MorphManager;
-import xiamomc.morph.abilities.AbilityManager;
-import xiamomc.morph.abilities.AbilityType;
-import xiamomc.morph.abilities.IMorphAbility;
-import xiamomc.morph.abilities.impl.AttributeModifyingAbility;
-import xiamomc.morph.abilities.impl.onAttack.ExtraKnockbackAbility;
-import xiamomc.morph.abilities.options.AttributeModifyOption;
-import xiamomc.morph.skills.DefaultConfigGenerator;
-import xiamomc.morph.skills.IMorphSkill;
-import xiamomc.morph.skills.MorphSkillHandler;
-import xiamomc.morph.skills.SkillType;
-import xiamomc.morph.skills.impl.LaunchProjectileMorphSkill;
-import xiamomc.morph.skills.impl.SonicBoomMorphSkill;
-import xiamomc.morph.storage.MorphJsonBasedStorage;
-import xiamomc.morph.utilities.DisguiseUtils;
-import xiamomc.morph.utilities.EntityTypeUtils;
+import xyz.nifeather.morph.MorphManager;
+import xyz.nifeather.morph.abilities.AbilityManager;
+import xyz.nifeather.morph.abilities.AbilityType;
+import xyz.nifeather.morph.abilities.IMorphAbility;
+import xyz.nifeather.morph.abilities.impl.AttributeModifyingAbility;
+import xyz.nifeather.morph.abilities.impl.onAttack.ExtraKnockbackAbility;
+import xyz.nifeather.morph.abilities.options.AttributeModifyOption;
+import xyz.nifeather.morph.skills.DefaultConfigGenerator;
+import xyz.nifeather.morph.skills.IMorphSkill;
+import xyz.nifeather.morph.skills.MorphSkillHandler;
+import xyz.nifeather.morph.skills.SkillType;
+import xyz.nifeather.morph.skills.impl.LaunchProjectileMorphSkill;
+import xyz.nifeather.morph.skills.impl.SonicBoomMorphSkill;
+import xyz.nifeather.morph.storage.MorphJsonBasedStorage;
+import xyz.nifeather.morph.utilities.DisguiseUtils;
+import xyz.nifeather.morph.utilities.EntityTypeUtils;
 import xiamomc.pluginbase.Annotations.Resolved;
 
 import java.util.Map;
diff --git a/src/main/java/xiamomc/morph/transforms/BindableTransform.java b/src/main/java/xyz/nifeather/morph/transforms/BindableTransform.java
similarity index 90%
rename from src/main/java/xiamomc/morph/transforms/BindableTransform.java
rename to src/main/java/xyz/nifeather/morph/transforms/BindableTransform.java
index c5a41884..bfa985d9 100644
--- a/src/main/java/xiamomc/morph/transforms/BindableTransform.java
+++ b/src/main/java/xyz/nifeather/morph/transforms/BindableTransform.java
@@ -1,6 +1,6 @@
-package xiamomc.morph.transforms;
+package xyz.nifeather.morph.transforms;
 
-import xiamomc.morph.transforms.easings.Easing;
+import xyz.nifeather.morph.transforms.easings.Easing;
 import xiamomc.pluginbase.Bindables.Bindable;
 
 public class BindableTransform<TValue> extends Transform<TValue>
diff --git a/src/main/java/xiamomc/morph/transforms/DelayTransform.java b/src/main/java/xyz/nifeather/morph/transforms/DelayTransform.java
similarity index 83%
rename from src/main/java/xiamomc/morph/transforms/DelayTransform.java
rename to src/main/java/xyz/nifeather/morph/transforms/DelayTransform.java
index 11e3e464..f23fd6bd 100644
--- a/src/main/java/xiamomc/morph/transforms/DelayTransform.java
+++ b/src/main/java/xyz/nifeather/morph/transforms/DelayTransform.java
@@ -1,6 +1,6 @@
-package xiamomc.morph.transforms;
+package xyz.nifeather.morph.transforms;
 
-import xiamomc.morph.transforms.easings.Easing;
+import xyz.nifeather.morph.transforms.easings.Easing;
 
 public class DelayTransform extends Transform<Long>
 {
diff --git a/src/main/java/xiamomc/morph/transforms/GenericTransform.java b/src/main/java/xyz/nifeather/morph/transforms/GenericTransform.java
similarity index 90%
rename from src/main/java/xiamomc/morph/transforms/GenericTransform.java
rename to src/main/java/xyz/nifeather/morph/transforms/GenericTransform.java
index e59337d1..5fbac519 100644
--- a/src/main/java/xiamomc/morph/transforms/GenericTransform.java
+++ b/src/main/java/xyz/nifeather/morph/transforms/GenericTransform.java
@@ -1,6 +1,6 @@
-package xiamomc.morph.transforms;
+package xyz.nifeather.morph.transforms;
 
-import xiamomc.morph.transforms.easings.Easing;
+import xyz.nifeather.morph.transforms.easings.Easing;
 
 public class GenericTransform<TValue> extends Transform<TValue>
 {
diff --git a/src/main/java/xiamomc/morph/transforms/Recorder.java b/src/main/java/xyz/nifeather/morph/transforms/Recorder.java
similarity index 92%
rename from src/main/java/xiamomc/morph/transforms/Recorder.java
rename to src/main/java/xyz/nifeather/morph/transforms/Recorder.java
index 163aa0b9..bf3da785 100644
--- a/src/main/java/xiamomc/morph/transforms/Recorder.java
+++ b/src/main/java/xyz/nifeather/morph/transforms/Recorder.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.transforms;
+package xyz.nifeather.morph.transforms;
 
 import java.util.function.Consumer;
 
diff --git a/src/main/java/xiamomc/morph/transforms/Transform.java b/src/main/java/xyz/nifeather/morph/transforms/Transform.java
similarity index 93%
rename from src/main/java/xiamomc/morph/transforms/Transform.java
rename to src/main/java/xyz/nifeather/morph/transforms/Transform.java
index 28701960..dccc2051 100644
--- a/src/main/java/xiamomc/morph/transforms/Transform.java
+++ b/src/main/java/xyz/nifeather/morph/transforms/Transform.java
@@ -1,7 +1,7 @@
-package xiamomc.morph.transforms;
+package xyz.nifeather.morph.transforms;
 
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
-import xiamomc.morph.transforms.easings.Easing;
+import xyz.nifeather.morph.transforms.easings.Easing;
 
 import java.util.List;
 
diff --git a/src/main/java/xiamomc/morph/transforms/TransformUtils.java b/src/main/java/xyz/nifeather/morph/transforms/TransformUtils.java
similarity index 96%
rename from src/main/java/xiamomc/morph/transforms/TransformUtils.java
rename to src/main/java/xyz/nifeather/morph/transforms/TransformUtils.java
index 07edd94b..8c107cfc 100644
--- a/src/main/java/xiamomc/morph/transforms/TransformUtils.java
+++ b/src/main/java/xyz/nifeather/morph/transforms/TransformUtils.java
@@ -1,8 +1,8 @@
-package xiamomc.morph.transforms;
+package xyz.nifeather.morph.transforms;
 
 import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap;
 import org.apache.commons.lang3.NotImplementedException;
-import xiamomc.morph.transforms.easings.Easing;
+import xyz.nifeather.morph.transforms.easings.Easing;
 
 import java.lang.reflect.Method;
 import java.util.Arrays;
diff --git a/src/main/java/xiamomc/morph/transforms/Transformer.java b/src/main/java/xyz/nifeather/morph/transforms/Transformer.java
similarity index 94%
rename from src/main/java/xiamomc/morph/transforms/Transformer.java
rename to src/main/java/xyz/nifeather/morph/transforms/Transformer.java
index dabf1ad2..45c002dd 100644
--- a/src/main/java/xiamomc/morph/transforms/Transformer.java
+++ b/src/main/java/xyz/nifeather/morph/transforms/Transformer.java
@@ -1,9 +1,9 @@
-package xiamomc.morph.transforms;
+package xyz.nifeather.morph.transforms;
 
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
-import xiamomc.morph.MorphPlugin;
-import xiamomc.morph.MorphPluginObject;
-import xiamomc.morph.transforms.easings.Easing;
+import xyz.nifeather.morph.MorphPlugin;
+import xyz.nifeather.morph.MorphPluginObject;
+import xyz.nifeather.morph.transforms.easings.Easing;
 import xiamomc.pluginbase.Annotations.Initializer;
 import xiamomc.pluginbase.Bindables.Bindable;
 
diff --git a/src/main/java/xiamomc/morph/transforms/easings/Easing.java b/src/main/java/xyz/nifeather/morph/transforms/easings/Easing.java
similarity index 84%
rename from src/main/java/xiamomc/morph/transforms/easings/Easing.java
rename to src/main/java/xyz/nifeather/morph/transforms/easings/Easing.java
index 42c693cb..07d94cbc 100644
--- a/src/main/java/xiamomc/morph/transforms/easings/Easing.java
+++ b/src/main/java/xyz/nifeather/morph/transforms/easings/Easing.java
@@ -1,6 +1,6 @@
-package xiamomc.morph.transforms.easings;
+package xyz.nifeather.morph.transforms.easings;
 
-import xiamomc.morph.transforms.easings.impl.EasingImpl;
+import xyz.nifeather.morph.transforms.easings.impl.EasingImpl;
 
 /**
  * <a href="https://easings.net">easings.net</a>
diff --git a/src/main/java/xiamomc/morph/transforms/easings/IEasing.java b/src/main/java/xyz/nifeather/morph/transforms/easings/IEasing.java
similarity index 60%
rename from src/main/java/xiamomc/morph/transforms/easings/IEasing.java
rename to src/main/java/xyz/nifeather/morph/transforms/easings/IEasing.java
index bfaff702..a3ff1035 100644
--- a/src/main/java/xiamomc/morph/transforms/easings/IEasing.java
+++ b/src/main/java/xyz/nifeather/morph/transforms/easings/IEasing.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.transforms.easings;
+package xyz.nifeather.morph.transforms.easings;
 
 public interface IEasing
 {
diff --git a/src/main/java/xiamomc/morph/transforms/easings/impl/EasingImpl.java b/src/main/java/xyz/nifeather/morph/transforms/easings/impl/EasingImpl.java
similarity index 96%
rename from src/main/java/xiamomc/morph/transforms/easings/impl/EasingImpl.java
rename to src/main/java/xyz/nifeather/morph/transforms/easings/impl/EasingImpl.java
index 8b2471c6..906ade5d 100644
--- a/src/main/java/xiamomc/morph/transforms/easings/impl/EasingImpl.java
+++ b/src/main/java/xyz/nifeather/morph/transforms/easings/impl/EasingImpl.java
@@ -1,7 +1,7 @@
-package xiamomc.morph.transforms.easings.impl;
+package xyz.nifeather.morph.transforms.easings.impl;
 
-import xiamomc.morph.transforms.easings.Easing;
-import xiamomc.morph.transforms.easings.IEasing;
+import xyz.nifeather.morph.transforms.easings.Easing;
+import xyz.nifeather.morph.transforms.easings.IEasing;
 
 public class EasingImpl implements IEasing
 {
diff --git a/src/main/java/xiamomc/morph/updates/Platforms.java b/src/main/java/xyz/nifeather/morph/updates/Platforms.java
similarity index 93%
rename from src/main/java/xiamomc/morph/updates/Platforms.java
rename to src/main/java/xyz/nifeather/morph/updates/Platforms.java
index d6acf4b5..715fb27a 100644
--- a/src/main/java/xiamomc/morph/updates/Platforms.java
+++ b/src/main/java/xyz/nifeather/morph/updates/Platforms.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.updates;
+package xyz.nifeather.morph.updates;
 
 import java.util.Arrays;
 
diff --git a/src/main/java/xiamomc/morph/updates/SingleUpdateInfoMeta.java b/src/main/java/xyz/nifeather/morph/updates/SingleUpdateInfoMeta.java
similarity index 96%
rename from src/main/java/xiamomc/morph/updates/SingleUpdateInfoMeta.java
rename to src/main/java/xyz/nifeather/morph/updates/SingleUpdateInfoMeta.java
index 5e38c305..c72d1fc8 100644
--- a/src/main/java/xiamomc/morph/updates/SingleUpdateInfoMeta.java
+++ b/src/main/java/xyz/nifeather/morph/updates/SingleUpdateInfoMeta.java
@@ -1,7 +1,7 @@
-package xiamomc.morph.updates;
+package xyz.nifeather.morph.updates;
 
 import com.google.gson.annotations.SerializedName;
-import xiamomc.morph.MorphPlugin;
+import xyz.nifeather.morph.MorphPlugin;
 
 import java.lang.reflect.Field;
 import java.util.List;
diff --git a/src/main/java/xiamomc/morph/updates/UpdateHandler.java b/src/main/java/xyz/nifeather/morph/updates/UpdateHandler.java
similarity index 96%
rename from src/main/java/xiamomc/morph/updates/UpdateHandler.java
rename to src/main/java/xyz/nifeather/morph/updates/UpdateHandler.java
index 5db2b728..14986a14 100644
--- a/src/main/java/xiamomc/morph/updates/UpdateHandler.java
+++ b/src/main/java/xyz/nifeather/morph/updates/UpdateHandler.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.updates;
+package xyz.nifeather.morph.updates;
 
 import com.google.gson.GsonBuilder;
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
@@ -7,13 +7,13 @@
 import org.bukkit.command.ConsoleCommandSender;
 import org.bukkit.craftbukkit.command.ServerCommandSender;
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.MorphPlugin;
-import xiamomc.morph.MorphPluginObject;
-import xiamomc.morph.config.ConfigOption;
-import xiamomc.morph.config.MorphConfigManager;
-import xiamomc.morph.messages.MessageUtils;
-import xiamomc.morph.messages.UpdateStrings;
-import xiamomc.morph.misc.permissions.CommonPermissions;
+import xyz.nifeather.morph.MorphPlugin;
+import xyz.nifeather.morph.MorphPluginObject;
+import xyz.nifeather.morph.config.ConfigOption;
+import xyz.nifeather.morph.config.MorphConfigManager;
+import xyz.nifeather.morph.messages.MessageUtils;
+import xyz.nifeather.morph.messages.UpdateStrings;
+import xyz.nifeather.morph.misc.permissions.CommonPermissions;
 import xiamomc.pluginbase.Annotations.Initializer;
 import xiamomc.pluginbase.Annotations.Resolved;
 import xiamomc.pluginbase.Bindables.Bindable;
diff --git a/src/main/java/xiamomc/morph/updates/VersionHandling.java b/src/main/java/xyz/nifeather/morph/updates/VersionHandling.java
similarity index 98%
rename from src/main/java/xiamomc/morph/updates/VersionHandling.java
rename to src/main/java/xyz/nifeather/morph/updates/VersionHandling.java
index 003f6297..8de10184 100644
--- a/src/main/java/xiamomc/morph/updates/VersionHandling.java
+++ b/src/main/java/xyz/nifeather/morph/updates/VersionHandling.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.updates;
+package xyz.nifeather.morph.updates;
 
 import org.jetbrains.annotations.NotNull;
 
diff --git a/src/main/java/xiamomc/morph/utilities/BindableUtils.java b/src/main/java/xyz/nifeather/morph/utilities/BindableUtils.java
similarity index 92%
rename from src/main/java/xiamomc/morph/utilities/BindableUtils.java
rename to src/main/java/xyz/nifeather/morph/utilities/BindableUtils.java
index 8e8412e7..0246fc0c 100644
--- a/src/main/java/xiamomc/morph/utilities/BindableUtils.java
+++ b/src/main/java/xyz/nifeather/morph/utilities/BindableUtils.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.utilities;
+package xyz.nifeather.morph.utilities;
 
 import xiamomc.pluginbase.Bindables.BindableList;
 
diff --git a/src/main/java/xiamomc/morph/utilities/CollisionUtils.java b/src/main/java/xyz/nifeather/morph/utilities/CollisionUtils.java
similarity index 95%
rename from src/main/java/xiamomc/morph/utilities/CollisionUtils.java
rename to src/main/java/xyz/nifeather/morph/utilities/CollisionUtils.java
index b8ab6ad6..848b9620 100644
--- a/src/main/java/xiamomc/morph/utilities/CollisionUtils.java
+++ b/src/main/java/xyz/nifeather/morph/utilities/CollisionUtils.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.utilities;
+package xyz.nifeather.morph.utilities;
 
 import net.minecraft.world.phys.AABB;
 import net.minecraft.world.phys.shapes.BooleanOp;
diff --git a/src/main/java/xiamomc/morph/utilities/DamageSourceUtils.java b/src/main/java/xyz/nifeather/morph/utilities/DamageSourceUtils.java
similarity index 98%
rename from src/main/java/xiamomc/morph/utilities/DamageSourceUtils.java
rename to src/main/java/xyz/nifeather/morph/utilities/DamageSourceUtils.java
index 969785d9..e89de996 100644
--- a/src/main/java/xiamomc/morph/utilities/DamageSourceUtils.java
+++ b/src/main/java/xyz/nifeather/morph/utilities/DamageSourceUtils.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.utilities;
+package xyz.nifeather.morph.utilities;
 
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
 import net.minecraft.core.Holder;
diff --git a/src/main/java/xiamomc/morph/utilities/DisguiseUtils.java b/src/main/java/xyz/nifeather/morph/utilities/DisguiseUtils.java
similarity index 94%
rename from src/main/java/xiamomc/morph/utilities/DisguiseUtils.java
rename to src/main/java/xyz/nifeather/morph/utilities/DisguiseUtils.java
index 640a2116..be10aa6a 100644
--- a/src/main/java/xiamomc/morph/utilities/DisguiseUtils.java
+++ b/src/main/java/xyz/nifeather/morph/utilities/DisguiseUtils.java
@@ -1,11 +1,11 @@
-package xiamomc.morph.utilities;
+package xyz.nifeather.morph.utilities;
 
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
 import org.bukkit.Material;
 import org.bukkit.entity.Player;
 import org.bukkit.inventory.ItemStack;
-import xiamomc.morph.misc.DisguiseMeta;
-import xiamomc.morph.misc.NmsRecord;
+import xyz.nifeather.morph.misc.DisguiseMeta;
+import xyz.nifeather.morph.misc.NmsRecord;
 
 import java.util.Arrays;
 import java.util.List;
diff --git a/src/main/java/xiamomc/morph/utilities/EntityTypeUtils.java b/src/main/java/xyz/nifeather/morph/utilities/EntityTypeUtils.java
similarity index 99%
rename from src/main/java/xiamomc/morph/utilities/EntityTypeUtils.java
rename to src/main/java/xyz/nifeather/morph/utilities/EntityTypeUtils.java
index 25b021b4..546c0f19 100644
--- a/src/main/java/xiamomc/morph/utilities/EntityTypeUtils.java
+++ b/src/main/java/xyz/nifeather/morph/utilities/EntityTypeUtils.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.utilities;
+package xyz.nifeather.morph.utilities;
 
 import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap;
 import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
@@ -18,8 +18,8 @@
 import org.bukkit.entity.EntityType;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.MorphPlugin;
-import xiamomc.morph.misc.DisguiseTypes;
+import xyz.nifeather.morph.MorphPlugin;
+import xyz.nifeather.morph.misc.DisguiseTypes;
 
 import java.util.Arrays;
 import java.util.Map;
diff --git a/src/main/java/xiamomc/morph/utilities/ItemUtils.java b/src/main/java/xyz/nifeather/morph/utilities/ItemUtils.java
similarity index 97%
rename from src/main/java/xiamomc/morph/utilities/ItemUtils.java
rename to src/main/java/xyz/nifeather/morph/utilities/ItemUtils.java
index cc8688e1..546d615a 100644
--- a/src/main/java/xiamomc/morph/utilities/ItemUtils.java
+++ b/src/main/java/xyz/nifeather/morph/utilities/ItemUtils.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.utilities;
+package xyz.nifeather.morph.utilities;
 
 import com.google.gson.Gson;
 import com.google.gson.GsonBuilder;
@@ -11,8 +11,7 @@
 import org.bukkit.craftbukkit.inventory.CraftItemStack;
 import org.bukkit.inventory.ItemStack;
 import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.MorphPlugin;
+import xyz.nifeather.morph.MorphPlugin;
 
 public class ItemUtils
 {
diff --git a/src/main/java/xiamomc/morph/utilities/MapMetaUtils.java b/src/main/java/xyz/nifeather/morph/utilities/MapMetaUtils.java
similarity index 98%
rename from src/main/java/xiamomc/morph/utilities/MapMetaUtils.java
rename to src/main/java/xyz/nifeather/morph/utilities/MapMetaUtils.java
index 45955cee..5067963e 100644
--- a/src/main/java/xiamomc/morph/utilities/MapMetaUtils.java
+++ b/src/main/java/xyz/nifeather/morph/utilities/MapMetaUtils.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.utilities;
+package xyz.nifeather.morph.utilities;
 
 import org.bukkit.inventory.EntityEquipment;
 import org.bukkit.inventory.ItemStack;
diff --git a/src/main/java/xiamomc/morph/utilities/MathUtils.java b/src/main/java/xyz/nifeather/morph/utilities/MathUtils.java
similarity index 95%
rename from src/main/java/xiamomc/morph/utilities/MathUtils.java
rename to src/main/java/xyz/nifeather/morph/utilities/MathUtils.java
index 0e19eb65..59a84a33 100644
--- a/src/main/java/xiamomc/morph/utilities/MathUtils.java
+++ b/src/main/java/xyz/nifeather/morph/utilities/MathUtils.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.utilities;
+package xyz.nifeather.morph.utilities;
 
 import org.bukkit.util.Vector;
 
diff --git a/src/main/java/xiamomc/morph/utilities/NbtUtils.java b/src/main/java/xyz/nifeather/morph/utilities/NbtUtils.java
similarity index 98%
rename from src/main/java/xiamomc/morph/utilities/NbtUtils.java
rename to src/main/java/xyz/nifeather/morph/utilities/NbtUtils.java
index 29493f7f..8269860b 100644
--- a/src/main/java/xiamomc/morph/utilities/NbtUtils.java
+++ b/src/main/java/xyz/nifeather/morph/utilities/NbtUtils.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.utilities;
+package xyz.nifeather.morph.utilities;
 
 import com.mojang.authlib.GameProfile;
 import com.mojang.authlib.properties.Property;
@@ -11,8 +11,8 @@
 import org.jetbrains.annotations.Contract;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.MorphPlugin;
-import xiamomc.morph.misc.MorphGameProfile;
+import xyz.nifeather.morph.MorphPlugin;
+import xyz.nifeather.morph.misc.MorphGameProfile;
 
 import java.util.List;
 import java.util.UUID;
diff --git a/src/main/java/xiamomc/morph/utilities/NmsUtils.java b/src/main/java/xyz/nifeather/morph/utilities/NmsUtils.java
similarity index 98%
rename from src/main/java/xiamomc/morph/utilities/NmsUtils.java
rename to src/main/java/xyz/nifeather/morph/utilities/NmsUtils.java
index 1f7a5ce9..f9d8482b 100644
--- a/src/main/java/xiamomc/morph/utilities/NmsUtils.java
+++ b/src/main/java/xyz/nifeather/morph/utilities/NmsUtils.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.utilities;
+package xyz.nifeather.morph.utilities;
 
 import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap;
 import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
@@ -17,7 +17,7 @@
 import org.jetbrains.annotations.Unmodifiable;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import xiamomc.morph.MorphPlugin;
+import xyz.nifeather.morph.MorphPlugin;
 
 import java.lang.reflect.Modifier;
 import java.util.List;
diff --git a/src/main/java/xiamomc/morph/utilities/PermissionUtils.java b/src/main/java/xyz/nifeather/morph/utilities/PermissionUtils.java
similarity index 88%
rename from src/main/java/xiamomc/morph/utilities/PermissionUtils.java
rename to src/main/java/xyz/nifeather/morph/utilities/PermissionUtils.java
index 659e9434..98d5b67d 100644
--- a/src/main/java/xiamomc/morph/utilities/PermissionUtils.java
+++ b/src/main/java/xyz/nifeather/morph/utilities/PermissionUtils.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.utilities;
+package xyz.nifeather.morph.utilities;
 
 import org.bukkit.entity.Player;
 
diff --git a/src/main/java/xiamomc/morph/utilities/PluginAssetUtils.java b/src/main/java/xyz/nifeather/morph/utilities/PluginAssetUtils.java
similarity index 94%
rename from src/main/java/xiamomc/morph/utilities/PluginAssetUtils.java
rename to src/main/java/xyz/nifeather/morph/utilities/PluginAssetUtils.java
index 52235fd4..39a03157 100644
--- a/src/main/java/xiamomc/morph/utilities/PluginAssetUtils.java
+++ b/src/main/java/xyz/nifeather/morph/utilities/PluginAssetUtils.java
@@ -1,8 +1,8 @@
-package xiamomc.morph.utilities;
+package xyz.nifeather.morph.utilities;
 
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
-import xiamomc.morph.MorphPlugin;
+import xyz.nifeather.morph.MorphPlugin;
 
 import java.nio.charset.StandardCharsets;
 
diff --git a/src/main/java/xiamomc/morph/utilities/ReflectionUtils.java b/src/main/java/xyz/nifeather/morph/utilities/ReflectionUtils.java
similarity index 99%
rename from src/main/java/xiamomc/morph/utilities/ReflectionUtils.java
rename to src/main/java/xyz/nifeather/morph/utilities/ReflectionUtils.java
index 852860b9..8f43ec9b 100644
--- a/src/main/java/xiamomc/morph/utilities/ReflectionUtils.java
+++ b/src/main/java/xyz/nifeather/morph/utilities/ReflectionUtils.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.utilities;
+package xyz.nifeather.morph.utilities;
 
 import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
diff --git a/src/main/java/xiamomc/morph/utilities/SoundUtils.java b/src/main/java/xyz/nifeather/morph/utilities/SoundUtils.java
similarity index 96%
rename from src/main/java/xiamomc/morph/utilities/SoundUtils.java
rename to src/main/java/xyz/nifeather/morph/utilities/SoundUtils.java
index d8b22ed4..fed7d514 100644
--- a/src/main/java/xiamomc/morph/utilities/SoundUtils.java
+++ b/src/main/java/xyz/nifeather/morph/utilities/SoundUtils.java
@@ -1,4 +1,4 @@
-package xiamomc.morph.utilities;
+package xyz.nifeather.morph.utilities;
 
 import net.kyori.adventure.key.Key;
 import net.kyori.adventure.sound.Sound;

From d337f3bc766830e3b4468623898f411181506c57 Mon Sep 17 00:00:00 2001
From: MATRIX-feather <midnightcarnival@outlook.com>
Date: Wed, 9 Oct 2024 22:40:23 +0800
Subject: [PATCH 03/28] =?UTF-8?q?misc:=20=E6=9B=B4=E6=96=B0issues=E9=93=BE?=
 =?UTF-8?q?=E6=8E=A5=E3=80=81=E4=BF=AE=E5=A4=8D=E6=9E=84=E5=BB=BA=E3=80=81?=
 =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=9D=83=E9=99=90=E3=80=81=E4=BC=98=E5=8C=96?=
 =?UTF-8?q?import?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 build.gradle.kts                              |  6 +++++
 .../xyz/nifeather/morph/MorphManager.java     |  5 +---
 .../java/xyz/nifeather/morph/MorphPlugin.java |  1 -
 .../morph/abilities/AbilityManager.java       |  3 ---
 .../morph/backends/DisguiseBackend.java       |  2 +-
 .../morph/backends/fallback/NilBackend.java   |  8 +++----
 .../morph/backends/modelengine/MEBackend.java |  2 +-
 .../morph/backends/server/ServerBackend.java  |  2 +-
 .../server/ServerDisguiseWrapper.java         |  2 +-
 .../server/renderer/ServerRenderer.java       |  4 ++--
 .../renderer/network/PacketFactory.java       |  4 +++-
 .../renderer/network/ProtocolHandler.java     |  4 +---
 .../renderer/network/TestPacketListener.java  |  2 +-
 .../datawatcher/watchers/SingleWatcher.java   |  6 ++---
 .../watchers/types/FrogWatcher.java           |  2 +-
 .../types/InventoryLivingWatcher.java         |  2 +-
 .../watchers/types/PlayerWatcher.java         |  2 +-
 .../watchers/types/WardenWatcher.java         |  2 +-
 .../watchers/types/WolfWatcher.java           |  2 +-
 .../listeners/AnimationPacketListener.java    |  2 +-
 .../listeners/EquipmentPacketListener.java    |  2 +-
 .../network/listeners/MetaPacketListener.java |  2 +-
 .../listeners/PlayerLookPacketListener.java   |  2 +-
 .../network/listeners/ProtocolListener.java   |  6 ++---
 .../network/listeners/SoundListener.java      |  2 +-
 .../network/listeners/SpawnPacketHandler.java |  4 ++--
 .../renderer/network/queue/PacketQueue.java   |  2 +-
 .../network/registries/RenderRegistry.java    |  4 ++--
 .../network/registries/ValueIndex.java        |  3 ---
 .../network/registries/WatcherIndex.java      |  1 -
 .../morph/commands/AnimationCommand.java      |  6 ++---
 .../morph/commands/MorphCommand.java          |  6 ++---
 .../morph/commands/MorphPlayerCommand.java    |  6 ++---
 .../morph/commands/MorphPluginCommand.java    |  5 ++--
 .../morph/commands/RequestCommand.java        |  4 ++--
 .../morph/commands/UnMorphCommand.java        |  6 ++---
 .../subcommands/MorphSubCommandHandler.java   |  2 +-
 .../subcommands/SubCommandGenerator.java      |  2 +-
 .../subcommands/plugin/BackendSubCommand.java |  6 ++---
 .../plugin/CheckUpdateSubCommand.java         |  6 ++---
 .../plugin/DisguiseManageSubCommand.java      |  7 +++---
 .../subcommands/plugin/HelpSubCommand.java    | 10 ++++----
 .../subcommands/plugin/LookupSubCommand.java  |  6 ++---
 .../plugin/MakeSkillItemSubCommand.java       |  4 ++--
 .../subcommands/plugin/OptionSubCommand.java  |  9 ++++---
 .../plugin/QueryAllSubCommand.java            |  9 +++----
 .../subcommands/plugin/QuerySubCommand.java   |  9 +++----
 .../subcommands/plugin/ReloadSubCommand.java  | 12 ++++++----
 .../plugin/SkinCacheSubCommand.java           | 10 ++++----
 .../subcommands/plugin/StatSubCommand.java    |  9 +++----
 .../plugin/ToggleSelfSubCommand.java          |  6 ++---
 .../management/ForceMorphSubCommand.java      |  9 +++----
 .../management/ForceUnmorphSubCommand.java    |  9 +++----
 .../management/GrantDisguiseSubCommand.java   | 10 ++++----
 .../management/RevokeDisguiseSubCommand.java  |  9 +++----
 .../plugin/skincache/cmdTree/TreeCommand.java |  2 +-
 .../subcommands/request/AcceptSubCommand.java |  6 ++---
 .../subcommands/request/DenySubCommand.java   |  6 ++---
 .../subcommands/request/SendSubCommand.java   |  6 ++---
 .../nifeather/morph/config/ConfigOption.java  |  2 +-
 .../morph/config/MorphConfigManager.java      |  6 ++---
 .../morph/events/CommonEventProcessor.java    | 15 ++++++------
 .../events/DisguiseAnimationProcessor.java    |  2 +-
 .../morph/events/EntityProcessor.java         |  4 ++--
 .../morph/events/ForcedDisguiseProcessor.java |  6 ++---
 .../events/InteractionMirrorProcessor.java    |  8 +++----
 .../nifeather/morph/events/PlayerTracker.java |  2 +-
 .../morph/events/RevealingEventProcessor.java |  6 ++---
 .../morph/misc/AnimationSequence.java         |  2 +-
 .../xyz/nifeather/morph/misc/CapeURL.java     |  2 +-
 .../nifeather/morph/misc/DisguiseState.java   | 14 +++++------
 .../morph/misc/DisguiseStateGenerator.java    |  2 +-
 .../morph/misc/MorphChatRenderer.java         |  4 ++--
 .../morph/misc/NetworkingHelper.java          | 10 ++++----
 .../morph/misc/PlayerOperationSimulator.java  |  4 ++--
 .../disguiseProperty/DisguiseProperties.java  |  2 --
 .../misc/gui/AnimSelectScreenWrapper.java     |  2 +-
 .../misc/gui/DisguiseSelectScreenWrapper.java |  2 +-
 .../morph/misc/gui/ScreenWrapper.java         |  4 ++--
 .../PlaceholderIntegration.java               |  2 +-
 .../builtin/AvaliableDisguisesProvider.java   |  2 +-
 .../builtin/StateNameProvider.java            |  2 +-
 .../misc/integrations/tab/TabAdapter.java     |  2 +-
 .../misc/permissions/CommonPermissions.java   | 10 ++++++++
 .../morph/misc/recipe/RecipeManager.java      |  4 ++--
 .../misc/recipe/RecipeYamlConfigManager.java  |  2 +-
 .../recipe/StandaloneYamlConfigManager.java   |  6 +++--
 .../multiInstance/MultiInstanceService.java   |  6 ++---
 .../multiInstance/master/InstanceServer.java  |  2 +-
 .../multiInstance/master/MasterInstance.java  | 10 ++++----
 .../protocol/c2s/MIC2SCommand.java            |  2 +-
 .../protocol/s2c/MIS2CCommand.java            |  2 +-
 .../multiInstance/slave/InstanceClient.java   |  2 +-
 .../multiInstance/slave/SlaveInstance.java    | 14 +++++------
 .../network/server/MorphClientHandler.java    | 24 +++++++++----------
 .../provider/VanillaAnimationProvider.java    |  2 --
 .../disguise/VanillaDisguiseProvider.java     |  2 --
 .../morph/skills/DefaultConfigGenerator.java  |  2 --
 .../morph/skills/MorphSkillHandler.java       |  6 ++---
 .../morph/skills/impl/DelayedMorphSkill.java  |  2 +-
 .../morph/skills/impl/ExplodeMorphSkill.java  |  4 ++--
 .../skills/impl/InventoryMorphSkill.java      |  4 ++--
 .../impl/LaunchProjectileMorphSkill.java      |  4 ++--
 .../skills/impl/SonicBoomMorphSkill.java      |  4 ++--
 .../morph/storage/MorphJsonBasedStorage.java  |  2 +-
 .../storage/playerdata/PlayerDataStore.java   |  2 +-
 .../skill/SkillAbilityConfigurationStore.java |  2 +-
 .../morph/updates/UpdateHandler.java          | 12 +++++-----
 108 files changed, 264 insertions(+), 263 deletions(-)

diff --git a/build.gradle.kts b/build.gradle.kts
index ad89e15a..b75c721d 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -155,7 +155,13 @@ bukkit {
 
     val opPermsStrList = listOf(
             permissionRoot + "disguise_revealing",
+
             permissionRoot + "manage",
+            permissionRoot + "manage.grant",
+            permissionRoot + "manage.revoke",
+            permissionRoot + "manage.unmorph",
+            permissionRoot + "manage.morph",
+
             permissionRoot + "query",
             permissionRoot + "queryall",
             permissionRoot + "reload",
diff --git a/src/main/java/xyz/nifeather/morph/MorphManager.java b/src/main/java/xyz/nifeather/morph/MorphManager.java
index 78244dd5..4017d398 100644
--- a/src/main/java/xyz/nifeather/morph/MorphManager.java
+++ b/src/main/java/xyz/nifeather/morph/MorphManager.java
@@ -24,11 +24,9 @@
 import xyz.nifeather.morph.backends.server.ServerBackend;
 import xyz.nifeather.morph.events.api.gameplay.*;
 import xyz.nifeather.morph.misc.*;
-import xyz.nifeather.morph.morph.events.api.gameplay.*;
 import xyz.nifeather.morph.misc.playerList.PlayerListHandler;
 import xyz.nifeather.morph.config.ConfigOption;
 import xyz.nifeather.morph.config.MorphConfigManager;
-import xiamomc.morph.events.api.gameplay.*;
 import xyz.nifeather.morph.events.api.lifecycle.ManagerFinishedInitializeEvent;
 import xyz.nifeather.morph.interfaces.IManagePlayerData;
 import xyz.nifeather.morph.messages.CommandStrings;
@@ -36,7 +34,6 @@
 import xyz.nifeather.morph.messages.MessageUtils;
 import xyz.nifeather.morph.messages.MorphStrings;
 import xyz.nifeather.morph.messages.vanilla.VanillaMessageStore;
-import xiamomc.morph.misc.*;
 import xyz.nifeather.morph.misc.disguiseProperty.DisguiseProperties;
 import xyz.nifeather.morph.misc.disguiseProperty.SingleProperty;
 import xyz.nifeather.morph.misc.permissions.CommonPermissions;
@@ -213,7 +210,7 @@ private void tryBackends()
         {
             logger.error("Unable to initialize ServerBackend as our disguise backend: " + t.getMessage());
             logger.error("Using NilBackend, displaying disguises at the server side will not be supported this run.");
-            logger.error("Please consider reporting this issue to our GitHub: https://github.com/XiaMoZhiShi/MorphPlugin/issues");
+            logger.error("Please consider reporting this issue to our GitHub: https://github.com/MATRIX-feather/FeatherMorph/issues");
 
             t.printStackTrace();
         }
diff --git a/src/main/java/xyz/nifeather/morph/MorphPlugin.java b/src/main/java/xyz/nifeather/morph/MorphPlugin.java
index 91dac299..3c70b091 100644
--- a/src/main/java/xyz/nifeather/morph/MorphPlugin.java
+++ b/src/main/java/xyz/nifeather/morph/MorphPlugin.java
@@ -11,7 +11,6 @@
 import xyz.nifeather.morph.abilities.AbilityManager;
 import xyz.nifeather.morph.commands.MorphCommandManager;
 import xyz.nifeather.morph.config.MorphConfigManager;
-import xiamomc.morph.events.*;
 import xyz.nifeather.morph.events.*;
 import xyz.nifeather.morph.interfaces.IManagePlayerData;
 import xyz.nifeather.morph.interfaces.IManageRequests;
diff --git a/src/main/java/xyz/nifeather/morph/abilities/AbilityManager.java b/src/main/java/xyz/nifeather/morph/abilities/AbilityManager.java
index 5baa1a4d..e3010973 100644
--- a/src/main/java/xyz/nifeather/morph/abilities/AbilityManager.java
+++ b/src/main/java/xyz/nifeather/morph/abilities/AbilityManager.java
@@ -9,13 +9,10 @@
 import org.jetbrains.annotations.Nullable;
 import xyz.nifeather.morph.MorphManager;
 import xyz.nifeather.morph.MorphPluginObject;
-import xiamomc.morph.abilities.impl.*;
 import xyz.nifeather.morph.abilities.impl.*;
 import xyz.nifeather.morph.abilities.impl.potion.*;
 import xyz.nifeather.morph.abilities.impl.onAttack.ExtraKnockbackAbility;
 import xyz.nifeather.morph.abilities.impl.onAttack.PotionOnAttackAbility;
-import xiamomc.morph.abilities.impl.potion.*;
-import xyz.nifeather.morph.morph.abilities.impl.potion.*;
 import xyz.nifeather.morph.events.api.lifecycle.AbilitiesFinishedInitializeEvent;
 import xyz.nifeather.morph.storage.skill.SkillAbilityConfiguration;
 import xyz.nifeather.morph.storage.skill.SkillAbilityConfigurationStore;
diff --git a/src/main/java/xyz/nifeather/morph/backends/DisguiseBackend.java b/src/main/java/xyz/nifeather/morph/backends/DisguiseBackend.java
index d4613670..c9e50da0 100644
--- a/src/main/java/xyz/nifeather/morph/backends/DisguiseBackend.java
+++ b/src/main/java/xyz/nifeather/morph/backends/DisguiseBackend.java
@@ -6,8 +6,8 @@
 import org.jetbrains.annotations.ApiStatus;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
-import xyz.nifeather.morph.MorphPluginObject;
 import xiamomc.pluginbase.Messages.FormattableMessage;
+import xyz.nifeather.morph.MorphPluginObject;
 
 import java.util.Collection;
 
diff --git a/src/main/java/xyz/nifeather/morph/backends/fallback/NilBackend.java b/src/main/java/xyz/nifeather/morph/backends/fallback/NilBackend.java
index 8704d5e5..bbfd7238 100644
--- a/src/main/java/xyz/nifeather/morph/backends/fallback/NilBackend.java
+++ b/src/main/java/xyz/nifeather/morph/backends/fallback/NilBackend.java
@@ -8,16 +8,16 @@
 import org.bukkit.entity.Player;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
+import xiamomc.morph.network.commands.S2C.clientrender.S2CRenderMapAddCommand;
+import xiamomc.morph.network.commands.S2C.clientrender.S2CRenderMapRemoveCommand;
+import xiamomc.pluginbase.Annotations.Resolved;
+import xiamomc.pluginbase.Messages.FormattableMessage;
 import xyz.nifeather.morph.backends.DisguiseBackend;
 import xyz.nifeather.morph.backends.DisguiseWrapper;
 import xyz.nifeather.morph.backends.WrapperAttribute;
 import xyz.nifeather.morph.messages.BackendStrings;
 import xyz.nifeather.morph.misc.NetworkingHelper;
-import xiamomc.morph.network.commands.S2C.clientrender.S2CRenderMapAddCommand;
-import xiamomc.morph.network.commands.S2C.clientrender.S2CRenderMapRemoveCommand;
 import xyz.nifeather.morph.network.server.MorphClientHandler;
-import xiamomc.pluginbase.Annotations.Resolved;
-import xiamomc.pluginbase.Messages.FormattableMessage;
 
 import java.util.Collection;
 import java.util.Map;
diff --git a/src/main/java/xyz/nifeather/morph/backends/modelengine/MEBackend.java b/src/main/java/xyz/nifeather/morph/backends/modelengine/MEBackend.java
index ced2aa87..abfb5098 100644
--- a/src/main/java/xyz/nifeather/morph/backends/modelengine/MEBackend.java
+++ b/src/main/java/xyz/nifeather/morph/backends/modelengine/MEBackend.java
@@ -8,12 +8,12 @@
 import org.bukkit.entity.Player;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
+import xiamomc.pluginbase.Messages.FormattableMessage;
 import xyz.nifeather.morph.backends.DisguiseBackend;
 import xyz.nifeather.morph.backends.DisguiseWrapper;
 import xyz.nifeather.morph.backends.modelengine.vanish.IVanishSource;
 import xyz.nifeather.morph.backends.modelengine.vanish.ProtocolLibVanishSource;
 import xyz.nifeather.morph.backends.modelengine.vanish.VanillaVanishSource;
-import xiamomc.pluginbase.Messages.FormattableMessage;
 
 import java.util.Collection;
 import java.util.Map;
diff --git a/src/main/java/xyz/nifeather/morph/backends/server/ServerBackend.java b/src/main/java/xyz/nifeather/morph/backends/server/ServerBackend.java
index 482c58df..379354a4 100644
--- a/src/main/java/xyz/nifeather/morph/backends/server/ServerBackend.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/ServerBackend.java
@@ -6,6 +6,7 @@
 import org.bukkit.entity.EntityType;
 import org.bukkit.entity.Player;
 import org.jetbrains.annotations.NotNull;
+import xiamomc.pluginbase.Messages.FormattableMessage;
 import xyz.nifeather.morph.backends.DisguiseBackend;
 import xyz.nifeather.morph.backends.DisguiseWrapper;
 import xyz.nifeather.morph.backends.WrapperEvent;
@@ -14,7 +15,6 @@
 import xyz.nifeather.morph.messages.BackendStrings;
 import xyz.nifeather.morph.misc.playerList.PlayerListHandler;
 import xyz.nifeather.morph.utilities.NbtUtils;
-import xiamomc.pluginbase.Messages.FormattableMessage;
 
 import javax.annotation.Nullable;
 import java.util.Arrays;
diff --git a/src/main/java/xyz/nifeather/morph/backends/server/ServerDisguiseWrapper.java b/src/main/java/xyz/nifeather/morph/backends/server/ServerDisguiseWrapper.java
index cf1b9ca5..6f8a0901 100644
--- a/src/main/java/xyz/nifeather/morph/backends/server/ServerDisguiseWrapper.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/ServerDisguiseWrapper.java
@@ -24,8 +24,8 @@
 import xyz.nifeather.morph.backends.server.renderer.utilties.WatcherUtils;
 import xyz.nifeather.morph.misc.DisguiseEquipment;
 import xyz.nifeather.morph.misc.DisguiseState;
-import xyz.nifeather.morph.misc.playerList.PlayerListHandler;
 import xyz.nifeather.morph.misc.disguiseProperty.SingleProperty;
+import xyz.nifeather.morph.misc.playerList.PlayerListHandler;
 import xyz.nifeather.morph.utilities.NbtUtils;
 
 import java.util.Map;
diff --git a/src/main/java/xyz/nifeather/morph/backends/server/renderer/ServerRenderer.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/ServerRenderer.java
index 222d527f..f22c2c59 100644
--- a/src/main/java/xyz/nifeather/morph/backends/server/renderer/ServerRenderer.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/ServerRenderer.java
@@ -8,6 +8,8 @@
 import org.bukkit.event.Listener;
 import org.bukkit.event.player.PlayerInteractEvent;
 import org.jetbrains.annotations.Nullable;
+import xiamomc.pluginbase.Annotations.Initializer;
+import xiamomc.pluginbase.Bindables.Bindable;
 import xyz.nifeather.morph.MorphPluginObject;
 import xyz.nifeather.morph.backends.server.renderer.network.PacketFactory;
 import xyz.nifeather.morph.backends.server.renderer.network.ProtocolHandler;
@@ -18,8 +20,6 @@
 import xyz.nifeather.morph.backends.server.renderer.network.registries.RenderRegistry;
 import xyz.nifeather.morph.config.ConfigOption;
 import xyz.nifeather.morph.config.MorphConfigManager;
-import xiamomc.pluginbase.Annotations.Initializer;
-import xiamomc.pluginbase.Bindables.Bindable;
 
 import java.util.List;
 
diff --git a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/PacketFactory.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/PacketFactory.java
index cdeee67e..5e3f645b 100644
--- a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/PacketFactory.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/PacketFactory.java
@@ -26,7 +26,9 @@
 import xyz.nifeather.morph.utilities.EntityTypeUtils;
 import xyz.nifeather.morph.utilities.NmsUtils;
 
-import java.util.*;
+import java.util.EnumSet;
+import java.util.List;
+import java.util.UUID;
 import java.util.concurrent.TimeUnit;
 
 public class PacketFactory extends MorphPluginObject
diff --git a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/ProtocolHandler.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/ProtocolHandler.java
index 28ca7998..74e3f22a 100644
--- a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/ProtocolHandler.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/ProtocolHandler.java
@@ -2,11 +2,9 @@
 
 import com.comphenix.protocol.ProtocolLibrary;
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
-import xyz.nifeather.morph.MorphPluginObject;
-import xiamomc.morph.backends.server.renderer.network.listeners.*;
 import xiamomc.pluginbase.Annotations.Initializer;
+import xyz.nifeather.morph.MorphPluginObject;
 import xyz.nifeather.morph.backends.server.renderer.network.listeners.*;
-import xyz.nifeather.morph.morph.backends.server.renderer.network.listeners.*;
 
 import java.util.List;
 
diff --git a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/TestPacketListener.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/TestPacketListener.java
index 0a8b7eab..6264337a 100644
--- a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/TestPacketListener.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/TestPacketListener.java
@@ -7,9 +7,9 @@
 import com.comphenix.protocol.injector.GamePhase;
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
 import org.bukkit.plugin.Plugin;
+import xiamomc.pluginbase.Annotations.Initializer;
 import xyz.nifeather.morph.MorphPlugin;
 import xyz.nifeather.morph.MorphPluginObject;
-import xiamomc.pluginbase.Annotations.Initializer;
 
 public class TestPacketListener extends MorphPluginObject implements PacketListener
 {
diff --git a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/SingleWatcher.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/SingleWatcher.java
index 16cc07e9..d1b0c3b9 100644
--- a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/SingleWatcher.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/SingleWatcher.java
@@ -10,6 +10,9 @@
 import org.bukkit.entity.Player;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
+import xiamomc.pluginbase.Annotations.Initializer;
+import xiamomc.pluginbase.Annotations.Resolved;
+import xiamomc.pluginbase.Exceptions.NullDependencyException;
 import xyz.nifeather.morph.MorphPluginObject;
 import xyz.nifeather.morph.backends.server.renderer.network.PacketFactory;
 import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values.AbstractValues;
@@ -18,9 +21,6 @@
 import xyz.nifeather.morph.backends.server.renderer.network.registries.RenderRegistry;
 import xyz.nifeather.morph.backends.server.renderer.utilties.WatcherUtils;
 import xyz.nifeather.morph.misc.disguiseProperty.SingleProperty;
-import xiamomc.pluginbase.Annotations.Initializer;
-import xiamomc.pluginbase.Annotations.Resolved;
-import xiamomc.pluginbase.Exceptions.NullDependencyException;
 
 import java.util.*;
 import java.util.concurrent.ConcurrentHashMap;
diff --git a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/FrogWatcher.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/FrogWatcher.java
index 13509873..0880d70d 100644
--- a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/FrogWatcher.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/FrogWatcher.java
@@ -15,6 +15,7 @@
 import org.bukkit.entity.EntityType;
 import org.bukkit.entity.Frog;
 import org.bukkit.entity.Player;
+import xiamomc.pluginbase.Exceptions.NullDependencyException;
 import xyz.nifeather.morph.backends.server.renderer.network.registries.CustomEntries;
 import xyz.nifeather.morph.backends.server.renderer.network.registries.RegistryKey;
 import xyz.nifeather.morph.backends.server.renderer.network.registries.ValueIndex;
@@ -22,7 +23,6 @@
 import xyz.nifeather.morph.misc.disguiseProperty.DisguiseProperties;
 import xyz.nifeather.morph.misc.disguiseProperty.SingleProperty;
 import xyz.nifeather.morph.misc.disguiseProperty.values.FrogProperties;
-import xiamomc.pluginbase.Exceptions.NullDependencyException;
 
 public class FrogWatcher extends LivingEntityWatcher
 {
diff --git a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/InventoryLivingWatcher.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/InventoryLivingWatcher.java
index e63edecd..a5357fc3 100644
--- a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/InventoryLivingWatcher.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/InventoryLivingWatcher.java
@@ -2,10 +2,10 @@
 
 import org.bukkit.entity.EntityType;
 import org.bukkit.entity.Player;
+import xiamomc.pluginbase.Annotations.Resolved;
 import xyz.nifeather.morph.backends.server.renderer.network.PacketFactory;
 import xyz.nifeather.morph.backends.server.renderer.network.registries.CustomEntries;
 import xyz.nifeather.morph.backends.server.renderer.network.registries.RegistryKey;
-import xiamomc.pluginbase.Annotations.Resolved;
 
 public class InventoryLivingWatcher extends LivingEntityWatcher
 {
diff --git a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/PlayerWatcher.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/PlayerWatcher.java
index d0b23f6b..9343d68a 100644
--- a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/PlayerWatcher.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/PlayerWatcher.java
@@ -11,8 +11,8 @@
 import xyz.nifeather.morph.backends.server.renderer.network.registries.CustomEntries;
 import xyz.nifeather.morph.backends.server.renderer.network.registries.RegistryKey;
 import xyz.nifeather.morph.backends.server.renderer.network.registries.ValueIndex;
-import xyz.nifeather.morph.misc.NmsRecord;
 import xyz.nifeather.morph.misc.AnimationNames;
+import xyz.nifeather.morph.misc.NmsRecord;
 
 public class PlayerWatcher extends InventoryLivingWatcher
 {
diff --git a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/WardenWatcher.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/WardenWatcher.java
index 09205398..71dfc7be 100755
--- a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/WardenWatcher.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/WardenWatcher.java
@@ -14,8 +14,8 @@
 import xyz.nifeather.morph.backends.server.renderer.network.registries.CustomEntries;
 import xyz.nifeather.morph.backends.server.renderer.network.registries.RegistryKey;
 import xyz.nifeather.morph.backends.server.renderer.network.registries.ValueIndex;
-import xyz.nifeather.morph.misc.NmsRecord;
 import xyz.nifeather.morph.misc.AnimationNames;
+import xyz.nifeather.morph.misc.NmsRecord;
 
 public class WardenWatcher extends EHasAttackAnimationWatcher
 {
diff --git a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/WolfWatcher.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/WolfWatcher.java
index c02825c6..5f43531e 100644
--- a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/WolfWatcher.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/WolfWatcher.java
@@ -12,6 +12,7 @@
 import org.bukkit.entity.EntityType;
 import org.bukkit.entity.Player;
 import org.bukkit.entity.Wolf;
+import xiamomc.pluginbase.Exceptions.NullDependencyException;
 import xyz.nifeather.morph.backends.server.renderer.network.registries.CustomEntries;
 import xyz.nifeather.morph.backends.server.renderer.network.registries.RegistryKey;
 import xyz.nifeather.morph.backends.server.renderer.network.registries.ValueIndex;
@@ -19,7 +20,6 @@
 import xyz.nifeather.morph.misc.disguiseProperty.DisguiseProperties;
 import xyz.nifeather.morph.misc.disguiseProperty.SingleProperty;
 import xyz.nifeather.morph.misc.disguiseProperty.values.WolfProperties;
-import xiamomc.pluginbase.Exceptions.NullDependencyException;
 
 public class WolfWatcher extends TameableAnimalWatcher
 {
diff --git a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/listeners/AnimationPacketListener.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/listeners/AnimationPacketListener.java
index 3d7a4825..4b3b1c45 100644
--- a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/listeners/AnimationPacketListener.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/listeners/AnimationPacketListener.java
@@ -6,8 +6,8 @@
 import com.comphenix.protocol.injector.GamePhase;
 import net.minecraft.network.protocol.game.ClientboundAnimatePacket;
 import org.bukkit.entity.Player;
-import xyz.nifeather.morph.backends.server.renderer.network.registries.RenderRegistry;
 import xiamomc.pluginbase.Annotations.Resolved;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.RenderRegistry;
 
 public class AnimationPacketListener extends ProtocolListener
 {
diff --git a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/listeners/EquipmentPacketListener.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/listeners/EquipmentPacketListener.java
index b4d2d773..87b709f4 100644
--- a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/listeners/EquipmentPacketListener.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/listeners/EquipmentPacketListener.java
@@ -7,9 +7,9 @@
 import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
 import net.minecraft.network.protocol.game.ClientboundSetEquipmentPacket;
 import org.bukkit.entity.Player;
+import xiamomc.pluginbase.Annotations.Resolved;
 import xyz.nifeather.morph.backends.server.renderer.network.registries.CustomEntries;
 import xyz.nifeather.morph.backends.server.renderer.network.registries.RenderRegistry;
-import xiamomc.pluginbase.Annotations.Resolved;
 
 import java.util.Map;
 
diff --git a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/listeners/MetaPacketListener.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/listeners/MetaPacketListener.java
index 88571b66..4edd4251 100644
--- a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/listeners/MetaPacketListener.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/listeners/MetaPacketListener.java
@@ -7,9 +7,9 @@
 import net.minecraft.network.protocol.game.ClientboundSetEntityDataPacket;
 import org.bukkit.entity.EntityType;
 import org.bukkit.entity.Player;
+import xiamomc.pluginbase.Annotations.Resolved;
 import xyz.nifeather.morph.backends.server.renderer.network.registries.RenderRegistry;
 import xyz.nifeather.morph.backends.server.renderer.network.registries.ValueIndex;
-import xiamomc.pluginbase.Annotations.Resolved;
 
 public class MetaPacketListener extends ProtocolListener
 {
diff --git a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/listeners/PlayerLookPacketListener.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/listeners/PlayerLookPacketListener.java
index 80be25ad..8d50c176 100644
--- a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/listeners/PlayerLookPacketListener.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/listeners/PlayerLookPacketListener.java
@@ -10,9 +10,9 @@
 import net.minecraft.network.protocol.game.ClientboundTeleportEntityPacket;
 import org.bukkit.entity.EntityType;
 import org.bukkit.entity.Player;
+import xiamomc.pluginbase.Annotations.Resolved;
 import xyz.nifeather.morph.backends.server.renderer.network.registries.RenderRegistry;
 import xyz.nifeather.morph.utilities.NmsUtils;
-import xiamomc.pluginbase.Annotations.Resolved;
 
 public class PlayerLookPacketListener extends ProtocolListener
 {
diff --git a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/listeners/ProtocolListener.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/listeners/ProtocolListener.java
index 00c3a163..ef47f396 100644
--- a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/listeners/ProtocolListener.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/listeners/ProtocolListener.java
@@ -8,15 +8,15 @@
 import net.minecraft.world.entity.player.Player;
 import org.bukkit.Bukkit;
 import org.jetbrains.annotations.Nullable;
+import xiamomc.pluginbase.Annotations.Initializer;
+import xiamomc.pluginbase.Annotations.Resolved;
+import xiamomc.pluginbase.Bindables.Bindable;
 import xyz.nifeather.morph.MorphPlugin;
 import xyz.nifeather.morph.MorphPluginObject;
 import xyz.nifeather.morph.backends.server.renderer.network.PacketFactory;
 import xyz.nifeather.morph.config.ConfigOption;
 import xyz.nifeather.morph.config.MorphConfigManager;
 import xyz.nifeather.morph.utilities.NmsUtils;
-import xiamomc.pluginbase.Annotations.Initializer;
-import xiamomc.pluginbase.Annotations.Resolved;
-import xiamomc.pluginbase.Bindables.Bindable;
 
 public abstract class ProtocolListener extends MorphPluginObject implements PacketListener
 {
diff --git a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/listeners/SoundListener.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/listeners/SoundListener.java
index f1fa6fad..630f3190 100644
--- a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/listeners/SoundListener.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/listeners/SoundListener.java
@@ -11,9 +11,9 @@
 import net.minecraft.sounds.SoundEvent;
 import org.bukkit.entity.EntityType;
 import org.jetbrains.annotations.Nullable;
+import xiamomc.pluginbase.Annotations.Resolved;
 import xyz.nifeather.morph.backends.server.renderer.network.registries.RenderRegistry;
 import xyz.nifeather.morph.utilities.EntityTypeUtils;
-import xiamomc.pluginbase.Annotations.Resolved;
 
 import java.util.concurrent.atomic.AtomicReference;
 
diff --git a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/listeners/SpawnPacketHandler.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/listeners/SpawnPacketHandler.java
index 81e618de..dd662601 100644
--- a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/listeners/SpawnPacketHandler.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/listeners/SpawnPacketHandler.java
@@ -16,6 +16,8 @@
 import org.bukkit.entity.Player;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
+import xiamomc.pluginbase.Annotations.Resolved;
+import xiamomc.pluginbase.Exceptions.NullDependencyException;
 import xyz.nifeather.morph.backends.server.renderer.network.DisplayParameters;
 import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers.SingleWatcher;
 import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers.types.PlayerWatcher;
@@ -24,8 +26,6 @@
 import xyz.nifeather.morph.backends.server.renderer.utilties.WatcherUtils;
 import xyz.nifeather.morph.misc.NmsRecord;
 import xyz.nifeather.morph.misc.skins.PlayerSkinProvider;
-import xiamomc.pluginbase.Annotations.Resolved;
-import xiamomc.pluginbase.Exceptions.NullDependencyException;
 
 import java.util.List;
 import java.util.UUID;
diff --git a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/queue/PacketQueue.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/queue/PacketQueue.java
index 3bb4a292..7535c37e 100644
--- a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/queue/PacketQueue.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/queue/PacketQueue.java
@@ -5,8 +5,8 @@
 import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
 import org.bukkit.entity.Player;
-import xyz.nifeather.morph.MorphPluginObject;
 import xiamomc.pluginbase.Annotations.Initializer;
+import xyz.nifeather.morph.MorphPluginObject;
 
 import java.util.List;
 import java.util.Map;
diff --git a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/registries/RenderRegistry.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/registries/RenderRegistry.java
index a1e2d10d..906bd892 100644
--- a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/registries/RenderRegistry.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/registries/RenderRegistry.java
@@ -7,12 +7,12 @@
 import org.bukkit.entity.Player;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
+import xiamomc.pluginbase.Annotations.Resolved;
+import xiamomc.pluginbase.Bindables.Bindable;
 import xyz.nifeather.morph.MorphPluginObject;
 import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers.SingleWatcher;
 import xyz.nifeather.morph.config.ConfigOption;
 import xyz.nifeather.morph.config.MorphConfigManager;
-import xiamomc.pluginbase.Annotations.Resolved;
-import xiamomc.pluginbase.Bindables.Bindable;
 
 import java.util.List;
 import java.util.Map;
diff --git a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/registries/ValueIndex.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/registries/ValueIndex.java
index 26f52900..ee8b9b42 100644
--- a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/registries/ValueIndex.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/registries/ValueIndex.java
@@ -1,10 +1,7 @@
 package xyz.nifeather.morph.backends.server.renderer.network.registries;
 
-import xiamomc.morph.backends.server.renderer.network.datawatcher.values.*;
-import xiamomc.morph.backends.server.renderer.network.datawatcher.values.basetypes.*;
 import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values.*;
 import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values.basetypes.*;
-import xyz.nifeather.morph.morph.backends.server.renderer.network.datawatcher.values.basetypes.*;
 
 public class ValueIndex
 {
diff --git a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/registries/WatcherIndex.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/registries/WatcherIndex.java
index a78f254e..c9d2ec9d 100644
--- a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/registries/WatcherIndex.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/registries/WatcherIndex.java
@@ -4,7 +4,6 @@
 import org.bukkit.entity.EntityType;
 import org.bukkit.entity.Player;
 import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers.SingleWatcher;
-import xiamomc.morph.backends.server.renderer.network.datawatcher.watchers.types.*;
 import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers.types.*;
 import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers.types.horses.AbstractHorseWatcher;
 import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers.types.horses.HorseWatcher;
diff --git a/src/main/java/xyz/nifeather/morph/commands/AnimationCommand.java b/src/main/java/xyz/nifeather/morph/commands/AnimationCommand.java
index b2093d45..6c4a27b1 100644
--- a/src/main/java/xyz/nifeather/morph/commands/AnimationCommand.java
+++ b/src/main/java/xyz/nifeather/morph/commands/AnimationCommand.java
@@ -4,6 +4,9 @@
 import org.bukkit.command.CommandSender;
 import org.bukkit.entity.Player;
 import org.jetbrains.annotations.NotNull;
+import xiamomc.pluginbase.Annotations.Resolved;
+import xiamomc.pluginbase.Command.IPluginCommand;
+import xiamomc.pluginbase.Messages.FormattableMessage;
 import xyz.nifeather.morph.MorphManager;
 import xyz.nifeather.morph.MorphPluginObject;
 import xyz.nifeather.morph.messages.CommandStrings;
@@ -11,9 +14,6 @@
 import xyz.nifeather.morph.messages.HelpStrings;
 import xyz.nifeather.morph.messages.MessageUtils;
 import xyz.nifeather.morph.misc.gui.AnimSelectScreenWrapper;
-import xiamomc.pluginbase.Annotations.Resolved;
-import xiamomc.pluginbase.Command.IPluginCommand;
-import xiamomc.pluginbase.Messages.FormattableMessage;
 
 import java.util.List;
 
diff --git a/src/main/java/xyz/nifeather/morph/commands/MorphCommand.java b/src/main/java/xyz/nifeather/morph/commands/MorphCommand.java
index a0a39924..4208a1a6 100644
--- a/src/main/java/xyz/nifeather/morph/commands/MorphCommand.java
+++ b/src/main/java/xyz/nifeather/morph/commands/MorphCommand.java
@@ -5,15 +5,15 @@
 import org.bukkit.command.CommandSender;
 import org.bukkit.entity.Player;
 import org.jetbrains.annotations.NotNull;
+import xiamomc.pluginbase.Annotations.Resolved;
+import xiamomc.pluginbase.Command.IPluginCommand;
+import xiamomc.pluginbase.Messages.FormattableMessage;
 import xyz.nifeather.morph.MorphManager;
 import xyz.nifeather.morph.MorphPluginObject;
 import xyz.nifeather.morph.messages.HelpStrings;
 import xyz.nifeather.morph.messages.MessageUtils;
 import xyz.nifeather.morph.messages.MorphStrings;
 import xyz.nifeather.morph.misc.gui.DisguiseSelectScreenWrapper;
-import xiamomc.pluginbase.Annotations.Resolved;
-import xiamomc.pluginbase.Command.IPluginCommand;
-import xiamomc.pluginbase.Messages.FormattableMessage;
 
 import java.util.List;
 
diff --git a/src/main/java/xyz/nifeather/morph/commands/MorphPlayerCommand.java b/src/main/java/xyz/nifeather/morph/commands/MorphPlayerCommand.java
index 639e4328..3e9cf93f 100644
--- a/src/main/java/xyz/nifeather/morph/commands/MorphPlayerCommand.java
+++ b/src/main/java/xyz/nifeather/morph/commands/MorphPlayerCommand.java
@@ -5,14 +5,14 @@
 import org.bukkit.command.CommandSender;
 import org.bukkit.entity.Player;
 import org.jetbrains.annotations.NotNull;
+import xiamomc.pluginbase.Annotations.Resolved;
+import xiamomc.pluginbase.Command.IPluginCommand;
+import xiamomc.pluginbase.Messages.FormattableMessage;
 import xyz.nifeather.morph.MorphManager;
 import xyz.nifeather.morph.MorphPluginObject;
 import xyz.nifeather.morph.messages.HelpStrings;
 import xyz.nifeather.morph.misc.DisguiseMeta;
 import xyz.nifeather.morph.misc.DisguiseTypes;
-import xiamomc.pluginbase.Annotations.Resolved;
-import xiamomc.pluginbase.Command.IPluginCommand;
-import xiamomc.pluginbase.Messages.FormattableMessage;
 
 import java.util.List;
 
diff --git a/src/main/java/xyz/nifeather/morph/commands/MorphPluginCommand.java b/src/main/java/xyz/nifeather/morph/commands/MorphPluginCommand.java
index b341e45b..0be6926a 100644
--- a/src/main/java/xyz/nifeather/morph/commands/MorphPluginCommand.java
+++ b/src/main/java/xyz/nifeather/morph/commands/MorphPluginCommand.java
@@ -1,12 +1,11 @@
 package xyz.nifeather.morph.commands;
 
 import it.unimi.dsi.fastutil.objects.ObjectList;
+import xiamomc.pluginbase.Command.ISubCommand;
+import xiamomc.pluginbase.Messages.FormattableMessage;
 import xyz.nifeather.morph.commands.subcommands.MorphSubCommandHandler;
-import xiamomc.morph.commands.subcommands.plugin.*;
 import xyz.nifeather.morph.commands.subcommands.plugin.*;
 import xyz.nifeather.morph.messages.HelpStrings;
-import xiamomc.pluginbase.Command.ISubCommand;
-import xiamomc.pluginbase.Messages.FormattableMessage;
 
 import java.util.List;
 
diff --git a/src/main/java/xyz/nifeather/morph/commands/RequestCommand.java b/src/main/java/xyz/nifeather/morph/commands/RequestCommand.java
index ca95eec0..49b17e7d 100644
--- a/src/main/java/xyz/nifeather/morph/commands/RequestCommand.java
+++ b/src/main/java/xyz/nifeather/morph/commands/RequestCommand.java
@@ -1,13 +1,13 @@
 package xyz.nifeather.morph.commands;
 
 import it.unimi.dsi.fastutil.objects.ObjectList;
+import xiamomc.pluginbase.Command.ISubCommand;
+import xiamomc.pluginbase.Messages.FormattableMessage;
 import xyz.nifeather.morph.commands.subcommands.MorphSubCommandHandler;
 import xyz.nifeather.morph.commands.subcommands.request.AcceptSubCommand;
 import xyz.nifeather.morph.commands.subcommands.request.DenySubCommand;
 import xyz.nifeather.morph.commands.subcommands.request.SendSubCommand;
 import xyz.nifeather.morph.messages.HelpStrings;
-import xiamomc.pluginbase.Command.ISubCommand;
-import xiamomc.pluginbase.Messages.FormattableMessage;
 
 import java.util.List;
 
diff --git a/src/main/java/xyz/nifeather/morph/commands/UnMorphCommand.java b/src/main/java/xyz/nifeather/morph/commands/UnMorphCommand.java
index 8a8e6c81..894245c4 100644
--- a/src/main/java/xyz/nifeather/morph/commands/UnMorphCommand.java
+++ b/src/main/java/xyz/nifeather/morph/commands/UnMorphCommand.java
@@ -4,13 +4,13 @@
 import org.bukkit.command.CommandSender;
 import org.bukkit.entity.Player;
 import org.jetbrains.annotations.NotNull;
+import xiamomc.pluginbase.Annotations.Resolved;
+import xiamomc.pluginbase.Command.IPluginCommand;
+import xiamomc.pluginbase.Messages.FormattableMessage;
 import xyz.nifeather.morph.MorphManager;
 import xyz.nifeather.morph.MorphPluginObject;
 import xyz.nifeather.morph.messages.HelpStrings;
 import xyz.nifeather.morph.misc.permissions.CommonPermissions;
-import xiamomc.pluginbase.Annotations.Resolved;
-import xiamomc.pluginbase.Command.IPluginCommand;
-import xiamomc.pluginbase.Messages.FormattableMessage;
 
 public class UnMorphCommand extends MorphPluginObject implements IPluginCommand
 {
diff --git a/src/main/java/xyz/nifeather/morph/commands/subcommands/MorphSubCommandHandler.java b/src/main/java/xyz/nifeather/morph/commands/subcommands/MorphSubCommandHandler.java
index a39735d7..36aa539e 100644
--- a/src/main/java/xyz/nifeather/morph/commands/subcommands/MorphSubCommandHandler.java
+++ b/src/main/java/xyz/nifeather/morph/commands/subcommands/MorphSubCommandHandler.java
@@ -3,10 +3,10 @@
 import org.bukkit.command.Command;
 import org.bukkit.command.CommandSender;
 import org.jetbrains.annotations.NotNull;
+import xiamomc.pluginbase.Command.SubCommandHandler;
 import xyz.nifeather.morph.MorphPlugin;
 import xyz.nifeather.morph.messages.CommonStrings;
 import xyz.nifeather.morph.messages.MessageUtils;
-import xiamomc.pluginbase.Command.SubCommandHandler;
 
 public abstract class MorphSubCommandHandler extends SubCommandHandler<MorphPlugin>
 {
diff --git a/src/main/java/xyz/nifeather/morph/commands/subcommands/SubCommandGenerator.java b/src/main/java/xyz/nifeather/morph/commands/subcommands/SubCommandGenerator.java
index f1db2c1f..bc62c4f4 100644
--- a/src/main/java/xyz/nifeather/morph/commands/subcommands/SubCommandGenerator.java
+++ b/src/main/java/xyz/nifeather/morph/commands/subcommands/SubCommandGenerator.java
@@ -3,9 +3,9 @@
 import org.bukkit.command.CommandSender;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
-import xyz.nifeather.morph.MorphPluginObject;
 import xiamomc.pluginbase.Command.ISubCommand;
 import xiamomc.pluginbase.Messages.FormattableMessage;
+import xyz.nifeather.morph.MorphPluginObject;
 
 import java.util.function.BiFunction;
 
diff --git a/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/BackendSubCommand.java b/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/BackendSubCommand.java
index c7b85d18..091f39dc 100644
--- a/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/BackendSubCommand.java
+++ b/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/BackendSubCommand.java
@@ -3,6 +3,9 @@
 import org.bukkit.command.CommandSender;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
+import xiamomc.pluginbase.Annotations.Resolved;
+import xiamomc.pluginbase.Command.ISubCommand;
+import xiamomc.pluginbase.Messages.FormattableMessage;
 import xyz.nifeather.morph.MorphManager;
 import xyz.nifeather.morph.MorphPlugin;
 import xyz.nifeather.morph.MorphPluginObject;
@@ -11,9 +14,6 @@
 import xyz.nifeather.morph.messages.CommandStrings;
 import xyz.nifeather.morph.messages.MessageUtils;
 import xyz.nifeather.morph.misc.permissions.CommonPermissions;
-import xiamomc.pluginbase.Annotations.Resolved;
-import xiamomc.pluginbase.Command.ISubCommand;
-import xiamomc.pluginbase.Messages.FormattableMessage;
 
 import java.util.List;
 
diff --git a/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/CheckUpdateSubCommand.java b/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/CheckUpdateSubCommand.java
index 39067373..62f788d4 100644
--- a/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/CheckUpdateSubCommand.java
+++ b/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/CheckUpdateSubCommand.java
@@ -4,14 +4,14 @@
 import org.bukkit.command.CommandSender;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
+import xiamomc.pluginbase.Annotations.Resolved;
+import xiamomc.pluginbase.Command.ISubCommand;
+import xiamomc.pluginbase.Messages.FormattableMessage;
 import xyz.nifeather.morph.MorphPluginObject;
 import xyz.nifeather.morph.messages.MessageUtils;
 import xyz.nifeather.morph.messages.UpdateStrings;
 import xyz.nifeather.morph.misc.permissions.CommonPermissions;
 import xyz.nifeather.morph.updates.UpdateHandler;
-import xiamomc.pluginbase.Annotations.Resolved;
-import xiamomc.pluginbase.Command.ISubCommand;
-import xiamomc.pluginbase.Messages.FormattableMessage;
 
 public class CheckUpdateSubCommand extends MorphPluginObject implements ISubCommand
 {
diff --git a/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/DisguiseManageSubCommand.java b/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/DisguiseManageSubCommand.java
index 3bd77ea3..e4f7e6d4 100644
--- a/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/DisguiseManageSubCommand.java
+++ b/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/DisguiseManageSubCommand.java
@@ -3,14 +3,15 @@
 import it.unimi.dsi.fastutil.objects.ObjectList;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
+import xiamomc.pluginbase.Command.ISubCommand;
+import xiamomc.pluginbase.Messages.FormattableMessage;
 import xyz.nifeather.morph.MorphPluginObject;
 import xyz.nifeather.morph.commands.subcommands.plugin.management.ForceMorphSubCommand;
 import xyz.nifeather.morph.commands.subcommands.plugin.management.ForceUnmorphSubCommand;
 import xyz.nifeather.morph.commands.subcommands.plugin.management.GrantDisguiseSubCommand;
 import xyz.nifeather.morph.commands.subcommands.plugin.management.RevokeDisguiseSubCommand;
 import xyz.nifeather.morph.messages.HelpStrings;
-import xiamomc.pluginbase.Command.ISubCommand;
-import xiamomc.pluginbase.Messages.FormattableMessage;
+import xyz.nifeather.morph.misc.permissions.CommonPermissions;
 
 import java.util.List;
 
@@ -26,7 +27,7 @@ public class DisguiseManageSubCommand extends MorphPluginObject implements ISubC
     @Override
     public @Nullable String getPermissionRequirement()
     {
-        return "xiamomc.morph.manage";
+        return CommonPermissions.MANAGE_DISGUISES;
     }
 
     @Override
diff --git a/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/HelpSubCommand.java b/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/HelpSubCommand.java
index 09224af7..d14d4022 100644
--- a/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/HelpSubCommand.java
+++ b/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/HelpSubCommand.java
@@ -9,17 +9,17 @@
 import org.bukkit.command.CommandSender;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
+import xiamomc.pluginbase.Annotations.Initializer;
+import xiamomc.pluginbase.Annotations.Resolved;
+import xiamomc.pluginbase.Command.ISubCommand;
+import xiamomc.pluginbase.Command.SubCommandHandler;
+import xiamomc.pluginbase.Messages.FormattableMessage;
 import xyz.nifeather.morph.MorphPluginObject;
 import xyz.nifeather.morph.commands.MorphCommandManager;
 import xyz.nifeather.morph.commands.subcommands.plugin.helpsections.Entry;
 import xyz.nifeather.morph.commands.subcommands.plugin.helpsections.Section;
 import xyz.nifeather.morph.messages.HelpStrings;
 import xyz.nifeather.morph.messages.MessageUtils;
-import xiamomc.pluginbase.Annotations.Initializer;
-import xiamomc.pluginbase.Annotations.Resolved;
-import xiamomc.pluginbase.Command.ISubCommand;
-import xiamomc.pluginbase.Command.SubCommandHandler;
-import xiamomc.pluginbase.Messages.FormattableMessage;
 
 import java.util.List;
 
diff --git a/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/LookupSubCommand.java b/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/LookupSubCommand.java
index 240cb12f..63c352bf 100644
--- a/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/LookupSubCommand.java
+++ b/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/LookupSubCommand.java
@@ -4,14 +4,14 @@
 import org.bukkit.command.CommandSender;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
+import xiamomc.pluginbase.Annotations.Resolved;
+import xiamomc.pluginbase.Command.ISubCommand;
+import xiamomc.pluginbase.Messages.FormattableMessage;
 import xyz.nifeather.morph.MorphManager;
 import xyz.nifeather.morph.MorphPluginObject;
 import xyz.nifeather.morph.messages.CommandStrings;
 import xyz.nifeather.morph.messages.MessageUtils;
 import xyz.nifeather.morph.misc.permissions.CommonPermissions;
-import xiamomc.pluginbase.Annotations.Resolved;
-import xiamomc.pluginbase.Command.ISubCommand;
-import xiamomc.pluginbase.Messages.FormattableMessage;
 
 import java.util.List;
 
diff --git a/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/MakeSkillItemSubCommand.java b/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/MakeSkillItemSubCommand.java
index bb71bab4..054f83b9 100644
--- a/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/MakeSkillItemSubCommand.java
+++ b/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/MakeSkillItemSubCommand.java
@@ -4,13 +4,13 @@
 import org.bukkit.entity.Player;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
+import xiamomc.pluginbase.Command.ISubCommand;
+import xiamomc.pluginbase.Messages.FormattableMessage;
 import xyz.nifeather.morph.MorphPluginObject;
 import xyz.nifeather.morph.messages.CommandStrings;
 import xyz.nifeather.morph.messages.MessageUtils;
 import xyz.nifeather.morph.misc.permissions.CommonPermissions;
 import xyz.nifeather.morph.utilities.ItemUtils;
-import xiamomc.pluginbase.Command.ISubCommand;
-import xiamomc.pluginbase.Messages.FormattableMessage;
 
 import java.util.List;
 
diff --git a/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/OptionSubCommand.java b/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/OptionSubCommand.java
index bc6c1c90..2575b28e 100644
--- a/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/OptionSubCommand.java
+++ b/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/OptionSubCommand.java
@@ -3,19 +3,18 @@
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
+import xiamomc.pluginbase.Annotations.Resolved;
+import xiamomc.pluginbase.Command.ISubCommand;
+import xiamomc.pluginbase.Exceptions.NullDependencyException;
+import xiamomc.pluginbase.Messages.FormattableMessage;
 import xyz.nifeather.morph.MorphPluginObject;
 import xyz.nifeather.morph.commands.subcommands.SubCommandGenerator;
 import xyz.nifeather.morph.config.ConfigOption;
 import xyz.nifeather.morph.config.MorphConfigManager;
 import xyz.nifeather.morph.events.InteractionMirrorProcessor;
-import xiamomc.morph.messages.*;
 import xyz.nifeather.morph.messages.*;
 import xyz.nifeather.morph.misc.permissions.CommonPermissions;
 import xyz.nifeather.morph.utilities.BindableUtils;
-import xiamomc.pluginbase.Annotations.Resolved;
-import xiamomc.pluginbase.Command.ISubCommand;
-import xiamomc.pluginbase.Exceptions.NullDependencyException;
-import xiamomc.pluginbase.Messages.FormattableMessage;
 
 import java.util.List;
 import java.util.function.Function;
diff --git a/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/QueryAllSubCommand.java b/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/QueryAllSubCommand.java
index 8a9215ed..1a1c6fe9 100644
--- a/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/QueryAllSubCommand.java
+++ b/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/QueryAllSubCommand.java
@@ -2,14 +2,15 @@
 
 import org.bukkit.command.CommandSender;
 import org.jetbrains.annotations.NotNull;
+import xiamomc.pluginbase.Annotations.Resolved;
+import xiamomc.pluginbase.Command.ISubCommand;
+import xiamomc.pluginbase.Messages.FormattableMessage;
 import xyz.nifeather.morph.MorphManager;
 import xyz.nifeather.morph.MorphPluginObject;
 import xyz.nifeather.morph.messages.CommandStrings;
 import xyz.nifeather.morph.messages.HelpStrings;
 import xyz.nifeather.morph.messages.MessageUtils;
-import xiamomc.pluginbase.Annotations.Resolved;
-import xiamomc.pluginbase.Command.ISubCommand;
-import xiamomc.pluginbase.Messages.FormattableMessage;
+import xyz.nifeather.morph.misc.permissions.CommonPermissions;
 
 public class QueryAllSubCommand extends MorphPluginObject implements ISubCommand
 {
@@ -28,7 +29,7 @@ public FormattableMessage getHelpMessage()
     @Override
     public String getPermissionRequirement()
     {
-        return "xiamomc.morph.query";
+        return CommonPermissions.QUERY_STATES;
     }
 
     @Resolved
diff --git a/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/QuerySubCommand.java b/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/QuerySubCommand.java
index b7dfebf6..8e92cf32 100644
--- a/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/QuerySubCommand.java
+++ b/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/QuerySubCommand.java
@@ -5,14 +5,15 @@
 import org.bukkit.command.CommandSender;
 import org.bukkit.entity.Player;
 import org.jetbrains.annotations.NotNull;
+import xiamomc.pluginbase.Annotations.Resolved;
+import xiamomc.pluginbase.Command.ISubCommand;
+import xiamomc.pluginbase.Messages.FormattableMessage;
 import xyz.nifeather.morph.MorphManager;
 import xyz.nifeather.morph.MorphPluginObject;
 import xyz.nifeather.morph.messages.CommandStrings;
 import xyz.nifeather.morph.messages.HelpStrings;
 import xyz.nifeather.morph.messages.MessageUtils;
-import xiamomc.pluginbase.Annotations.Resolved;
-import xiamomc.pluginbase.Command.ISubCommand;
-import xiamomc.pluginbase.Messages.FormattableMessage;
+import xyz.nifeather.morph.misc.permissions.CommonPermissions;
 
 import java.util.List;
 
@@ -33,7 +34,7 @@ public FormattableMessage getHelpMessage()
     @Override
     public String getPermissionRequirement()
     {
-        return "xiamomc.morph.query";
+        return CommonPermissions.QUERY_STATES;
     }
 
     @Override
diff --git a/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/ReloadSubCommand.java b/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/ReloadSubCommand.java
index 0852c5c1..2370ce7b 100644
--- a/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/ReloadSubCommand.java
+++ b/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/ReloadSubCommand.java
@@ -3,6 +3,10 @@
 import it.unimi.dsi.fastutil.objects.ObjectImmutableList;
 import org.bukkit.command.CommandSender;
 import org.jetbrains.annotations.NotNull;
+import xiamomc.pluginbase.Annotations.Resolved;
+import xiamomc.pluginbase.Command.ISubCommand;
+import xiamomc.pluginbase.Messages.FormattableMessage;
+import xiamomc.pluginbase.Messages.MessageStore;
 import xyz.nifeather.morph.MorphManager;
 import xyz.nifeather.morph.MorphPluginObject;
 import xyz.nifeather.morph.config.MorphConfigManager;
@@ -12,21 +16,19 @@
 import xyz.nifeather.morph.messages.MessageUtils;
 import xyz.nifeather.morph.messages.MorphMessageStore;
 import xyz.nifeather.morph.messages.vanilla.VanillaMessageStore;
+import xyz.nifeather.morph.misc.permissions.CommonPermissions;
 import xyz.nifeather.morph.misc.recipe.RecipeManager;
 import xyz.nifeather.morph.misc.skins.PlayerSkinProvider;
 import xyz.nifeather.morph.network.multiInstance.MultiInstanceService;
 import xyz.nifeather.morph.network.server.MorphClientHandler;
 import xyz.nifeather.morph.storage.skill.SkillAbilityConfigurationStore;
-import xiamomc.pluginbase.Annotations.Resolved;
-import xiamomc.pluginbase.Command.ISubCommand;
-import xiamomc.pluginbase.Messages.FormattableMessage;
-import xiamomc.pluginbase.Messages.MessageStore;
 
 import java.util.List;
 
 public class ReloadSubCommand extends MorphPluginObject implements ISubCommand
 {
     @Override
+    @NotNull
     public String getCommandName()
     {
         return "reload";
@@ -36,7 +38,7 @@ public String getCommandName()
     @NotNull
     public String getPermissionRequirement()
     {
-        return "xiamomc.morph.reload";
+        return CommonPermissions.DO_RELOAD;
     }
 
     @Override
diff --git a/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/SkinCacheSubCommand.java b/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/SkinCacheSubCommand.java
index d89fcd56..720ac9a6 100644
--- a/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/SkinCacheSubCommand.java
+++ b/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/SkinCacheSubCommand.java
@@ -9,6 +9,11 @@
 import org.bukkit.entity.Player;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
+import xiamomc.pluginbase.Annotations.Initializer;
+import xiamomc.pluginbase.Annotations.Resolved;
+import xiamomc.pluginbase.Bindables.Bindable;
+import xiamomc.pluginbase.Command.ISubCommand;
+import xiamomc.pluginbase.Messages.FormattableMessage;
 import xyz.nifeather.morph.MorphManager;
 import xyz.nifeather.morph.MorphPluginObject;
 import xyz.nifeather.morph.commands.subcommands.plugin.skincache.cmdTree.CommandBuilder;
@@ -23,11 +28,6 @@
 import xyz.nifeather.morph.misc.MorphParameters;
 import xyz.nifeather.morph.misc.permissions.CommonPermissions;
 import xyz.nifeather.morph.misc.skins.PlayerSkinProvider;
-import xiamomc.pluginbase.Annotations.Initializer;
-import xiamomc.pluginbase.Annotations.Resolved;
-import xiamomc.pluginbase.Bindables.Bindable;
-import xiamomc.pluginbase.Command.ISubCommand;
-import xiamomc.pluginbase.Messages.FormattableMessage;
 
 import java.util.List;
 
diff --git a/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/StatSubCommand.java b/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/StatSubCommand.java
index 779a7798..869a55f4 100644
--- a/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/StatSubCommand.java
+++ b/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/StatSubCommand.java
@@ -3,17 +3,18 @@
 import org.bukkit.Bukkit;
 import org.bukkit.command.CommandSender;
 import org.jetbrains.annotations.NotNull;
+import xiamomc.pluginbase.Annotations.Resolved;
+import xiamomc.pluginbase.Command.ISubCommand;
+import xiamomc.pluginbase.Messages.FormattableMessage;
 import xyz.nifeather.morph.MorphManager;
 import xyz.nifeather.morph.MorphPluginObject;
 import xyz.nifeather.morph.abilities.AbilityManager;
 import xyz.nifeather.morph.messages.HelpStrings;
 import xyz.nifeather.morph.messages.MessageUtils;
 import xyz.nifeather.morph.messages.StatStrings;
+import xyz.nifeather.morph.misc.permissions.CommonPermissions;
 import xyz.nifeather.morph.network.server.MorphClientHandler;
 import xyz.nifeather.morph.skills.MorphSkillHandler;
-import xiamomc.pluginbase.Annotations.Resolved;
-import xiamomc.pluginbase.Command.ISubCommand;
-import xiamomc.pluginbase.Messages.FormattableMessage;
 
 public class StatSubCommand extends MorphPluginObject implements ISubCommand
 {
@@ -125,6 +126,6 @@ private FormattableMessage getFormattable(String str)
     @Override
     public String getPermissionRequirement()
     {
-        return "xiamomc.morph.stat";
+        return CommonPermissions.CHECK_STAT;
     }
 }
diff --git a/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/ToggleSelfSubCommand.java b/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/ToggleSelfSubCommand.java
index 256356ba..55a6aa22 100644
--- a/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/ToggleSelfSubCommand.java
+++ b/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/ToggleSelfSubCommand.java
@@ -3,13 +3,13 @@
 import org.bukkit.command.CommandSender;
 import org.bukkit.entity.Player;
 import org.jetbrains.annotations.NotNull;
+import xiamomc.pluginbase.Annotations.Resolved;
+import xiamomc.pluginbase.Command.ISubCommand;
+import xiamomc.pluginbase.Messages.FormattableMessage;
 import xyz.nifeather.morph.MorphManager;
 import xyz.nifeather.morph.MorphPluginObject;
 import xyz.nifeather.morph.interfaces.IManagePlayerData;
 import xyz.nifeather.morph.messages.HelpStrings;
-import xiamomc.pluginbase.Annotations.Resolved;
-import xiamomc.pluginbase.Command.ISubCommand;
-import xiamomc.pluginbase.Messages.FormattableMessage;
 
 public class ToggleSelfSubCommand extends MorphPluginObject implements ISubCommand
 {
diff --git a/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/management/ForceMorphSubCommand.java b/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/management/ForceMorphSubCommand.java
index 14849512..e93c17a4 100644
--- a/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/management/ForceMorphSubCommand.java
+++ b/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/management/ForceMorphSubCommand.java
@@ -5,15 +5,16 @@
 import org.bukkit.command.CommandSender;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
+import xiamomc.pluginbase.Annotations.Resolved;
+import xiamomc.pluginbase.Command.ISubCommand;
+import xiamomc.pluginbase.Messages.FormattableMessage;
 import xyz.nifeather.morph.MorphManager;
 import xyz.nifeather.morph.MorphPluginObject;
 import xyz.nifeather.morph.messages.CommonStrings;
 import xyz.nifeather.morph.messages.HelpStrings;
 import xyz.nifeather.morph.messages.MessageUtils;
 import xyz.nifeather.morph.misc.MorphParameters;
-import xiamomc.pluginbase.Annotations.Resolved;
-import xiamomc.pluginbase.Command.ISubCommand;
-import xiamomc.pluginbase.Messages.FormattableMessage;
+import xyz.nifeather.morph.misc.permissions.CommonPermissions;
 
 import java.util.List;
 
@@ -28,7 +29,7 @@ public class ForceMorphSubCommand extends MorphPluginObject implements ISubComma
     @Override
     public @Nullable String getPermissionRequirement()
     {
-        return "xiamomc.morph.manage.morph";
+        return CommonPermissions.MANAGE_MORPH_DISGUISE;
     }
 
     @Resolved
diff --git a/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/management/ForceUnmorphSubCommand.java b/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/management/ForceUnmorphSubCommand.java
index 797eebc3..cdbb9fc8 100644
--- a/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/management/ForceUnmorphSubCommand.java
+++ b/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/management/ForceUnmorphSubCommand.java
@@ -5,15 +5,16 @@
 import org.bukkit.command.CommandSender;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
+import xiamomc.pluginbase.Annotations.Resolved;
+import xiamomc.pluginbase.Command.ISubCommand;
+import xiamomc.pluginbase.Messages.FormattableMessage;
 import xyz.nifeather.morph.MorphManager;
 import xyz.nifeather.morph.MorphPluginObject;
 import xyz.nifeather.morph.messages.CommandStrings;
 import xyz.nifeather.morph.messages.CommonStrings;
 import xyz.nifeather.morph.messages.HelpStrings;
 import xyz.nifeather.morph.messages.MessageUtils;
-import xiamomc.pluginbase.Annotations.Resolved;
-import xiamomc.pluginbase.Command.ISubCommand;
-import xiamomc.pluginbase.Messages.FormattableMessage;
+import xyz.nifeather.morph.misc.permissions.CommonPermissions;
 
 import java.util.List;
 import java.util.Objects;
@@ -29,7 +30,7 @@ public class ForceUnmorphSubCommand extends MorphPluginObject implements ISubCom
     @Override
     public @Nullable String getPermissionRequirement()
     {
-        return "xiamomc.morph.manage.unmorph";
+        return CommonPermissions.MANAGE_UNMORPH_DISGUISE;
     }
 
     @Resolved
diff --git a/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/management/GrantDisguiseSubCommand.java b/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/management/GrantDisguiseSubCommand.java
index 0c848bb0..3b9abf90 100644
--- a/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/management/GrantDisguiseSubCommand.java
+++ b/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/management/GrantDisguiseSubCommand.java
@@ -7,14 +7,14 @@
 import org.bukkit.entity.Player;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
+import xiamomc.pluginbase.Annotations.Resolved;
+import xiamomc.pluginbase.Command.ISubCommand;
+import xiamomc.pluginbase.Messages.FormattableMessage;
 import xyz.nifeather.morph.MorphManager;
 import xyz.nifeather.morph.MorphPluginObject;
-import xiamomc.morph.messages.*;
 import xyz.nifeather.morph.messages.*;
 import xyz.nifeather.morph.misc.DisguiseTypes;
-import xiamomc.pluginbase.Annotations.Resolved;
-import xiamomc.pluginbase.Command.ISubCommand;
-import xiamomc.pluginbase.Messages.FormattableMessage;
+import xyz.nifeather.morph.misc.permissions.CommonPermissions;
 
 import java.util.List;
 
@@ -35,7 +35,7 @@ public FormattableMessage getHelpMessage()
     @Override
     public @Nullable String getPermissionRequirement()
     {
-        return "xiamomc.morph.manage.grant";
+        return CommonPermissions.MANAGE_GRANT_DISGUISE;
     }
 
     @Override
diff --git a/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/management/RevokeDisguiseSubCommand.java b/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/management/RevokeDisguiseSubCommand.java
index 5352b063..9aad5c6f 100644
--- a/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/management/RevokeDisguiseSubCommand.java
+++ b/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/management/RevokeDisguiseSubCommand.java
@@ -6,15 +6,16 @@
 import org.bukkit.command.CommandSender;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
+import xiamomc.pluginbase.Annotations.Resolved;
+import xiamomc.pluginbase.Command.ISubCommand;
+import xiamomc.pluginbase.Messages.FormattableMessage;
 import xyz.nifeather.morph.MorphManager;
 import xyz.nifeather.morph.MorphPluginObject;
 import xyz.nifeather.morph.messages.CommandStrings;
 import xyz.nifeather.morph.messages.CommonStrings;
 import xyz.nifeather.morph.messages.HelpStrings;
 import xyz.nifeather.morph.messages.MessageUtils;
-import xiamomc.pluginbase.Annotations.Resolved;
-import xiamomc.pluginbase.Command.ISubCommand;
-import xiamomc.pluginbase.Messages.FormattableMessage;
+import xyz.nifeather.morph.misc.permissions.CommonPermissions;
 
 import java.util.List;
 
@@ -35,7 +36,7 @@ public FormattableMessage getHelpMessage()
     @Override
     public @Nullable String getPermissionRequirement()
     {
-        return "xiamomc.morph.manage.revoke";
+        return CommonPermissions.MANAGE_REVOKE_DISGUISE;
     }
 
     @Override
diff --git a/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/skincache/cmdTree/TreeCommand.java b/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/skincache/cmdTree/TreeCommand.java
index c342f258..f06e51fe 100644
--- a/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/skincache/cmdTree/TreeCommand.java
+++ b/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/skincache/cmdTree/TreeCommand.java
@@ -5,9 +5,9 @@
 import org.bukkit.command.CommandSender;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
-import xyz.nifeather.morph.MorphPlugin;
 import xiamomc.pluginbase.Command.ISubCommand;
 import xiamomc.pluginbase.Messages.FormattableMessage;
+import xyz.nifeather.morph.MorphPlugin;
 
 import java.util.Arrays;
 import java.util.List;
diff --git a/src/main/java/xyz/nifeather/morph/commands/subcommands/request/AcceptSubCommand.java b/src/main/java/xyz/nifeather/morph/commands/subcommands/request/AcceptSubCommand.java
index d412a3db..9a217f51 100644
--- a/src/main/java/xyz/nifeather/morph/commands/subcommands/request/AcceptSubCommand.java
+++ b/src/main/java/xyz/nifeather/morph/commands/subcommands/request/AcceptSubCommand.java
@@ -5,14 +5,14 @@
 import org.bukkit.command.CommandSender;
 import org.bukkit.entity.Player;
 import org.jetbrains.annotations.NotNull;
+import xiamomc.pluginbase.Annotations.Resolved;
+import xiamomc.pluginbase.Command.ISubCommand;
+import xiamomc.pluginbase.Messages.FormattableMessage;
 import xyz.nifeather.morph.MorphPluginObject;
 import xyz.nifeather.morph.interfaces.IManageRequests;
 import xyz.nifeather.morph.messages.CommonStrings;
 import xyz.nifeather.morph.messages.HelpStrings;
 import xyz.nifeather.morph.messages.MessageUtils;
-import xiamomc.pluginbase.Annotations.Resolved;
-import xiamomc.pluginbase.Command.ISubCommand;
-import xiamomc.pluginbase.Messages.FormattableMessage;
 
 import java.util.List;
 
diff --git a/src/main/java/xyz/nifeather/morph/commands/subcommands/request/DenySubCommand.java b/src/main/java/xyz/nifeather/morph/commands/subcommands/request/DenySubCommand.java
index 47d5f73f..718c0f92 100644
--- a/src/main/java/xyz/nifeather/morph/commands/subcommands/request/DenySubCommand.java
+++ b/src/main/java/xyz/nifeather/morph/commands/subcommands/request/DenySubCommand.java
@@ -5,14 +5,14 @@
 import org.bukkit.command.CommandSender;
 import org.bukkit.entity.Player;
 import org.jetbrains.annotations.NotNull;
+import xiamomc.pluginbase.Annotations.Resolved;
+import xiamomc.pluginbase.Command.ISubCommand;
+import xiamomc.pluginbase.Messages.FormattableMessage;
 import xyz.nifeather.morph.MorphPluginObject;
 import xyz.nifeather.morph.interfaces.IManageRequests;
 import xyz.nifeather.morph.messages.CommonStrings;
 import xyz.nifeather.morph.messages.HelpStrings;
 import xyz.nifeather.morph.messages.MessageUtils;
-import xiamomc.pluginbase.Annotations.Resolved;
-import xiamomc.pluginbase.Command.ISubCommand;
-import xiamomc.pluginbase.Messages.FormattableMessage;
 
 import java.util.List;
 
diff --git a/src/main/java/xyz/nifeather/morph/commands/subcommands/request/SendSubCommand.java b/src/main/java/xyz/nifeather/morph/commands/subcommands/request/SendSubCommand.java
index 3df8c0f9..f6c95a05 100644
--- a/src/main/java/xyz/nifeather/morph/commands/subcommands/request/SendSubCommand.java
+++ b/src/main/java/xyz/nifeather/morph/commands/subcommands/request/SendSubCommand.java
@@ -5,6 +5,9 @@
 import org.bukkit.command.CommandSender;
 import org.bukkit.entity.Player;
 import org.jetbrains.annotations.NotNull;
+import xiamomc.pluginbase.Annotations.Resolved;
+import xiamomc.pluginbase.Command.ISubCommand;
+import xiamomc.pluginbase.Messages.FormattableMessage;
 import xyz.nifeather.morph.MorphManager;
 import xyz.nifeather.morph.MorphPluginObject;
 import xyz.nifeather.morph.interfaces.IManageRequests;
@@ -12,9 +15,6 @@
 import xyz.nifeather.morph.messages.HelpStrings;
 import xyz.nifeather.morph.messages.MessageUtils;
 import xyz.nifeather.morph.messages.RequestStrings;
-import xiamomc.pluginbase.Annotations.Resolved;
-import xiamomc.pluginbase.Command.ISubCommand;
-import xiamomc.pluginbase.Messages.FormattableMessage;
 
 import java.util.List;
 
diff --git a/src/main/java/xyz/nifeather/morph/config/ConfigOption.java b/src/main/java/xyz/nifeather/morph/config/ConfigOption.java
index f87379a9..8c486fa1 100644
--- a/src/main/java/xyz/nifeather/morph/config/ConfigOption.java
+++ b/src/main/java/xyz/nifeather/morph/config/ConfigOption.java
@@ -1,10 +1,10 @@
 package xyz.nifeather.morph.config;
 
 import org.apache.commons.lang3.RandomStringUtils;
+import xiamomc.pluginbase.Configuration.ConfigNode;
 import xyz.nifeather.morph.MorphManager;
 import xyz.nifeather.morph.events.InteractionMirrorProcessor;
 import xyz.nifeather.morph.utilities.NbtUtils;
-import xiamomc.pluginbase.Configuration.ConfigNode;
 
 import java.util.ArrayList;
 
diff --git a/src/main/java/xyz/nifeather/morph/config/MorphConfigManager.java b/src/main/java/xyz/nifeather/morph/config/MorphConfigManager.java
index 4e8e1a6e..fc93ef8a 100644
--- a/src/main/java/xyz/nifeather/morph/config/MorphConfigManager.java
+++ b/src/main/java/xyz/nifeather/morph/config/MorphConfigManager.java
@@ -7,15 +7,15 @@
 import org.jetbrains.annotations.Nullable;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import xyz.nifeather.morph.MorphPlugin;
-import xyz.nifeather.morph.messages.CommonStrings;
-import xyz.nifeather.morph.messages.MessageUtils;
 import xiamomc.pluginbase.Bindables.Bindable;
 import xiamomc.pluginbase.Bindables.BindableList;
 import xiamomc.pluginbase.Configuration.ConfigNode;
 import xiamomc.pluginbase.Configuration.PluginConfigManager;
 import xiamomc.pluginbase.Managers.DependencyManager;
 import xiamomc.pluginbase.Messages.MessageStore;
+import xyz.nifeather.morph.MorphPlugin;
+import xyz.nifeather.morph.messages.CommonStrings;
+import xyz.nifeather.morph.messages.MessageUtils;
 
 import java.util.*;
 
diff --git a/src/main/java/xyz/nifeather/morph/events/CommonEventProcessor.java b/src/main/java/xyz/nifeather/morph/events/CommonEventProcessor.java
index c9390084..ae71d1e1 100644
--- a/src/main/java/xyz/nifeather/morph/events/CommonEventProcessor.java
+++ b/src/main/java/xyz/nifeather/morph/events/CommonEventProcessor.java
@@ -15,7 +15,13 @@
 import org.bukkit.event.block.BlockBreakEvent;
 import org.bukkit.event.entity.*;
 import org.bukkit.event.player.*;
-import org.bukkit.inventory.*;
+import org.bukkit.inventory.EquipmentSlot;
+import org.bukkit.inventory.InventoryHolder;
+import xiamomc.morph.network.commands.S2C.S2CSwapCommand;
+import xiamomc.morph.network.commands.S2C.map.S2CMapRemoveCommand;
+import xiamomc.pluginbase.Annotations.Initializer;
+import xiamomc.pluginbase.Annotations.Resolved;
+import xiamomc.pluginbase.Bindables.Bindable;
 import xyz.nifeather.morph.MorphManager;
 import xyz.nifeather.morph.MorphPluginObject;
 import xyz.nifeather.morph.RevealingHandler;
@@ -31,18 +37,13 @@
 import xyz.nifeather.morph.misc.OfflineDisguiseResult;
 import xyz.nifeather.morph.misc.gui.AnimSelectScreenWrapper;
 import xyz.nifeather.morph.misc.gui.DisguiseSelectScreenWrapper;
-import xyz.nifeather.morph.misc.playerList.PlayerListHandler;
 import xyz.nifeather.morph.misc.permissions.CommonPermissions;
-import xiamomc.morph.network.commands.S2C.S2CSwapCommand;
-import xiamomc.morph.network.commands.S2C.map.S2CMapRemoveCommand;
+import xyz.nifeather.morph.misc.playerList.PlayerListHandler;
 import xyz.nifeather.morph.network.server.MorphClientHandler;
 import xyz.nifeather.morph.network.server.ServerSetEquipCommand;
 import xyz.nifeather.morph.skills.MorphSkillHandler;
 import xyz.nifeather.morph.utilities.EntityTypeUtils;
 import xyz.nifeather.morph.utilities.ItemUtils;
-import xiamomc.pluginbase.Annotations.Initializer;
-import xiamomc.pluginbase.Annotations.Resolved;
-import xiamomc.pluginbase.Bindables.Bindable;
 
 import java.util.List;
 import java.util.Random;
diff --git a/src/main/java/xyz/nifeather/morph/events/DisguiseAnimationProcessor.java b/src/main/java/xyz/nifeather/morph/events/DisguiseAnimationProcessor.java
index 67a784ef..05977456 100644
--- a/src/main/java/xyz/nifeather/morph/events/DisguiseAnimationProcessor.java
+++ b/src/main/java/xyz/nifeather/morph/events/DisguiseAnimationProcessor.java
@@ -4,9 +4,9 @@
 import org.bukkit.event.Listener;
 import org.bukkit.event.entity.EntityDamageByEntityEvent;
 import org.bukkit.event.player.PlayerInteractEvent;
+import xiamomc.pluginbase.Annotations.Resolved;
 import xyz.nifeather.morph.MorphManager;
 import xyz.nifeather.morph.MorphPluginObject;
-import xiamomc.pluginbase.Annotations.Resolved;
 
 public class DisguiseAnimationProcessor extends MorphPluginObject implements Listener
 {
diff --git a/src/main/java/xyz/nifeather/morph/events/EntityProcessor.java b/src/main/java/xyz/nifeather/morph/events/EntityProcessor.java
index 376b1343..e9dd8758 100644
--- a/src/main/java/xyz/nifeather/morph/events/EntityProcessor.java
+++ b/src/main/java/xyz/nifeather/morph/events/EntityProcessor.java
@@ -24,6 +24,8 @@
 import org.bukkit.event.EventHandler;
 import org.bukkit.event.Listener;
 import org.bukkit.event.entity.EntityTargetEvent;
+import xiamomc.pluginbase.Annotations.Resolved;
+import xiamomc.pluginbase.Bindables.Bindable;
 import xyz.nifeather.morph.MorphManager;
 import xyz.nifeather.morph.MorphPluginObject;
 import xyz.nifeather.morph.config.ConfigOption;
@@ -34,8 +36,6 @@
 import xyz.nifeather.morph.misc.permissions.CommonPermissions;
 import xyz.nifeather.morph.utilities.EntityTypeUtils;
 import xyz.nifeather.morph.utilities.ReflectionUtils;
-import xiamomc.pluginbase.Annotations.Resolved;
-import xiamomc.pluginbase.Bindables.Bindable;
 
 import java.util.function.Predicate;
 
diff --git a/src/main/java/xyz/nifeather/morph/events/ForcedDisguiseProcessor.java b/src/main/java/xyz/nifeather/morph/events/ForcedDisguiseProcessor.java
index a4f45456..02e97d39 100644
--- a/src/main/java/xyz/nifeather/morph/events/ForcedDisguiseProcessor.java
+++ b/src/main/java/xyz/nifeather/morph/events/ForcedDisguiseProcessor.java
@@ -5,6 +5,9 @@
 import org.bukkit.event.EventHandler;
 import org.bukkit.event.Listener;
 import org.bukkit.event.player.PlayerJoinEvent;
+import xiamomc.pluginbase.Annotations.Initializer;
+import xiamomc.pluginbase.Annotations.Resolved;
+import xiamomc.pluginbase.Bindables.Bindable;
 import xyz.nifeather.morph.MorphManager;
 import xyz.nifeather.morph.MorphPluginObject;
 import xyz.nifeather.morph.config.ConfigOption;
@@ -12,9 +15,6 @@
 import xyz.nifeather.morph.events.api.gameplay.PlayerMorphEarlyEvent;
 import xyz.nifeather.morph.events.api.gameplay.PlayerUnMorphEarlyEvent;
 import xyz.nifeather.morph.misc.MorphParameters;
-import xiamomc.pluginbase.Annotations.Initializer;
-import xiamomc.pluginbase.Annotations.Resolved;
-import xiamomc.pluginbase.Bindables.Bindable;
 
 public class ForcedDisguiseProcessor extends MorphPluginObject implements Listener
 {
diff --git a/src/main/java/xyz/nifeather/morph/events/InteractionMirrorProcessor.java b/src/main/java/xyz/nifeather/morph/events/InteractionMirrorProcessor.java
index d8237a08..92737503 100644
--- a/src/main/java/xyz/nifeather/morph/events/InteractionMirrorProcessor.java
+++ b/src/main/java/xyz/nifeather/morph/events/InteractionMirrorProcessor.java
@@ -17,6 +17,10 @@
 import org.jetbrains.annotations.Contract;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
+import xiamomc.morph.network.commands.S2C.set.S2CSetSneakingCommand;
+import xiamomc.pluginbase.Annotations.Initializer;
+import xiamomc.pluginbase.Annotations.Resolved;
+import xiamomc.pluginbase.Bindables.Bindable;
 import xyz.nifeather.morph.MorphManager;
 import xyz.nifeather.morph.MorphPluginObject;
 import xyz.nifeather.morph.config.ConfigOption;
@@ -29,16 +33,12 @@
 import xyz.nifeather.morph.misc.NmsRecord;
 import xyz.nifeather.morph.misc.PlayerOperationSimulator;
 import xyz.nifeather.morph.misc.permissions.CommonPermissions;
-import xiamomc.morph.network.commands.S2C.set.S2CSetSneakingCommand;
 import xyz.nifeather.morph.network.server.MorphClientHandler;
 import xyz.nifeather.morph.storage.DirectoryStorage;
 import xyz.nifeather.morph.storage.mirrorlogging.MirrorSingleEntry;
 import xyz.nifeather.morph.storage.mirrorlogging.OperationType;
 import xyz.nifeather.morph.utilities.DisguiseUtils;
 import xyz.nifeather.morph.utilities.ItemUtils;
-import xiamomc.pluginbase.Annotations.Initializer;
-import xiamomc.pluginbase.Annotations.Resolved;
-import xiamomc.pluginbase.Bindables.Bindable;
 
 import java.io.File;
 import java.io.FileOutputStream;
diff --git a/src/main/java/xyz/nifeather/morph/events/PlayerTracker.java b/src/main/java/xyz/nifeather/morph/events/PlayerTracker.java
index 6cfd0759..030b39ba 100644
--- a/src/main/java/xyz/nifeather/morph/events/PlayerTracker.java
+++ b/src/main/java/xyz/nifeather/morph/events/PlayerTracker.java
@@ -15,8 +15,8 @@
 import org.bukkit.event.player.*;
 import org.bukkit.inventory.EquipmentSlot;
 import org.jetbrains.annotations.Nullable;
-import xyz.nifeather.morph.MorphPluginObject;
 import xiamomc.pluginbase.Annotations.Initializer;
+import xyz.nifeather.morph.MorphPluginObject;
 
 import java.util.List;
 import java.util.Map;
diff --git a/src/main/java/xyz/nifeather/morph/events/RevealingEventProcessor.java b/src/main/java/xyz/nifeather/morph/events/RevealingEventProcessor.java
index 69ff4bf8..d0795fdf 100644
--- a/src/main/java/xyz/nifeather/morph/events/RevealingEventProcessor.java
+++ b/src/main/java/xyz/nifeather/morph/events/RevealingEventProcessor.java
@@ -12,6 +12,9 @@
 import org.bukkit.event.player.PlayerInteractEntityEvent;
 import org.bukkit.event.player.PlayerInteractEvent;
 import org.bukkit.event.player.PlayerJoinEvent;
+import xiamomc.pluginbase.Annotations.Initializer;
+import xiamomc.pluginbase.Annotations.Resolved;
+import xiamomc.pluginbase.Bindables.Bindable;
 import xyz.nifeather.morph.MorphPluginObject;
 import xyz.nifeather.morph.RevealingHandler;
 import xyz.nifeather.morph.config.ConfigOption;
@@ -20,9 +23,6 @@
 import xyz.nifeather.morph.events.api.gameplay.PlayerUnMorphEvent;
 import xyz.nifeather.morph.misc.DisguiseTypes;
 import xyz.nifeather.morph.misc.NmsRecord;
-import xiamomc.pluginbase.Annotations.Initializer;
-import xiamomc.pluginbase.Annotations.Resolved;
-import xiamomc.pluginbase.Bindables.Bindable;
 
 public class RevealingEventProcessor extends MorphPluginObject implements Listener
 {
diff --git a/src/main/java/xyz/nifeather/morph/misc/AnimationSequence.java b/src/main/java/xyz/nifeather/morph/misc/AnimationSequence.java
index f72992aa..173f60fb 100644
--- a/src/main/java/xyz/nifeather/morph/misc/AnimationSequence.java
+++ b/src/main/java/xyz/nifeather/morph/misc/AnimationSequence.java
@@ -5,8 +5,8 @@
 import org.jetbrains.annotations.Nullable;
 import oshi.util.tuples.Pair;
 import xyz.nifeather.morph.MorphPluginObject;
-import xyz.nifeather.morph.providers.animation.SingleAnimation;
 import xyz.nifeather.morph.providers.animation.AnimationSet;
+import xyz.nifeather.morph.providers.animation.SingleAnimation;
 
 import java.util.Collections;
 import java.util.List;
diff --git a/src/main/java/xyz/nifeather/morph/misc/CapeURL.java b/src/main/java/xyz/nifeather/morph/misc/CapeURL.java
index e5749ac9..a20b59e2 100644
--- a/src/main/java/xyz/nifeather/morph/misc/CapeURL.java
+++ b/src/main/java/xyz/nifeather/morph/misc/CapeURL.java
@@ -1,8 +1,8 @@
 package xyz.nifeather.morph.misc;
 
+import xiamomc.pluginbase.Messages.FormattableMessage;
 import xyz.nifeather.morph.MorphPlugin;
 import xyz.nifeather.morph.messages.CapeStrings;
-import xiamomc.pluginbase.Messages.FormattableMessage;
 
 public class CapeURL
 {
diff --git a/src/main/java/xyz/nifeather/morph/misc/DisguiseState.java b/src/main/java/xyz/nifeather/morph/misc/DisguiseState.java
index c037b609..f9781731 100644
--- a/src/main/java/xyz/nifeather/morph/misc/DisguiseState.java
+++ b/src/main/java/xyz/nifeather/morph/misc/DisguiseState.java
@@ -13,6 +13,12 @@
 import org.jetbrains.annotations.ApiStatus;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
+import xiamomc.morph.network.PlayerOptions;
+import xiamomc.morph.network.commands.S2C.S2CAnimationCommand;
+import xiamomc.morph.network.commands.S2C.set.S2CSetAnimationDisplayNameCommand;
+import xiamomc.morph.network.commands.S2C.set.S2CSetSkillCooldownCommand;
+import xiamomc.pluginbase.Annotations.Resolved;
+import xiamomc.pluginbase.Exceptions.NullDependencyException;
 import xyz.nifeather.morph.MorphManager;
 import xyz.nifeather.morph.MorphPluginObject;
 import xyz.nifeather.morph.abilities.AbilityUpdater;
@@ -20,14 +26,10 @@
 import xyz.nifeather.morph.messages.CommandStrings;
 import xyz.nifeather.morph.messages.EmoteStrings;
 import xyz.nifeather.morph.messages.MessageUtils;
-import xyz.nifeather.morph.providers.animation.SingleAnimation;
 import xyz.nifeather.morph.misc.disguiseProperty.PropertyHandler;
 import xyz.nifeather.morph.misc.permissions.CommonPermissions;
-import xiamomc.morph.network.PlayerOptions;
-import xiamomc.morph.network.commands.S2C.S2CAnimationCommand;
-import xiamomc.morph.network.commands.S2C.set.S2CSetAnimationDisplayNameCommand;
-import xiamomc.morph.network.commands.S2C.set.S2CSetSkillCooldownCommand;
 import xyz.nifeather.morph.network.server.MorphClientHandler;
+import xyz.nifeather.morph.providers.animation.SingleAnimation;
 import xyz.nifeather.morph.providers.disguise.DisguiseProvider;
 import xyz.nifeather.morph.skills.IMorphSkill;
 import xyz.nifeather.morph.skills.MorphSkillHandler;
@@ -38,8 +40,6 @@
 import xyz.nifeather.morph.utilities.ItemUtils;
 import xyz.nifeather.morph.utilities.NbtUtils;
 import xyz.nifeather.morph.utilities.PermissionUtils;
-import xiamomc.pluginbase.Annotations.Resolved;
-import xiamomc.pluginbase.Exceptions.NullDependencyException;
 
 import java.util.*;
 import java.util.concurrent.atomic.AtomicBoolean;
diff --git a/src/main/java/xyz/nifeather/morph/misc/DisguiseStateGenerator.java b/src/main/java/xyz/nifeather/morph/misc/DisguiseStateGenerator.java
index 325177bc..7fa64361 100644
--- a/src/main/java/xyz/nifeather/morph/misc/DisguiseStateGenerator.java
+++ b/src/main/java/xyz/nifeather/morph/misc/DisguiseStateGenerator.java
@@ -3,10 +3,10 @@
 import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer;
 import org.bukkit.Bukkit;
 import org.bukkit.entity.Player;
+import xiamomc.morph.network.PlayerOptions;
 import xyz.nifeather.morph.MorphManager;
 import xyz.nifeather.morph.MorphPlugin;
 import xyz.nifeather.morph.backends.DisguiseBackend;
-import xiamomc.morph.network.PlayerOptions;
 import xyz.nifeather.morph.skills.MorphSkillHandler;
 import xyz.nifeather.morph.skills.SkillType;
 import xyz.nifeather.morph.storage.offlinestore.OfflineDisguiseState;
diff --git a/src/main/java/xyz/nifeather/morph/misc/MorphChatRenderer.java b/src/main/java/xyz/nifeather/morph/misc/MorphChatRenderer.java
index f33b1b90..f1593d3c 100644
--- a/src/main/java/xyz/nifeather/morph/misc/MorphChatRenderer.java
+++ b/src/main/java/xyz/nifeather/morph/misc/MorphChatRenderer.java
@@ -6,6 +6,8 @@
 import org.bukkit.entity.Player;
 import org.bukkit.permissions.Permissible;
 import org.jetbrains.annotations.NotNull;
+import xiamomc.pluginbase.Annotations.Resolved;
+import xiamomc.pluginbase.Messages.FormattableMessage;
 import xyz.nifeather.morph.MorphManager;
 import xyz.nifeather.morph.MorphPlugin;
 import xyz.nifeather.morph.MorphPluginObject;
@@ -13,8 +15,6 @@
 import xyz.nifeather.morph.config.MorphConfigManager;
 import xyz.nifeather.morph.messages.MessageUtils;
 import xyz.nifeather.morph.misc.permissions.CommonPermissions;
-import xiamomc.pluginbase.Annotations.Resolved;
-import xiamomc.pluginbase.Messages.FormattableMessage;
 
 public class MorphChatRenderer extends MorphPluginObject implements ChatRenderer
 {
diff --git a/src/main/java/xyz/nifeather/morph/misc/NetworkingHelper.java b/src/main/java/xyz/nifeather/morph/misc/NetworkingHelper.java
index f5a594fe..a1bf4268 100644
--- a/src/main/java/xyz/nifeather/morph/misc/NetworkingHelper.java
+++ b/src/main/java/xyz/nifeather/morph/misc/NetworkingHelper.java
@@ -5,19 +5,19 @@
 import org.bukkit.Bukkit;
 import org.bukkit.entity.Entity;
 import org.bukkit.inventory.EntityEquipment;
-import xyz.nifeather.morph.MorphPluginObject;
-import xyz.nifeather.morph.backends.DisguiseWrapper;
-import xyz.nifeather.morph.backends.WrapperAttribute;
-import xyz.nifeather.morph.misc.permissions.CommonPermissions;
 import xiamomc.morph.network.commands.S2C.AbstractS2CCommand;
 import xiamomc.morph.network.commands.S2C.clientrender.S2CRenderMapAddCommand;
 import xiamomc.morph.network.commands.S2C.clientrender.S2CRenderMapMetaCommand;
 import xiamomc.morph.network.commands.S2C.clientrender.S2CRenderMeta;
 import xiamomc.morph.network.commands.S2C.map.S2CPartialMapCommand;
+import xiamomc.pluginbase.Annotations.Resolved;
+import xyz.nifeather.morph.MorphPluginObject;
+import xyz.nifeather.morph.backends.DisguiseWrapper;
+import xyz.nifeather.morph.backends.WrapperAttribute;
+import xyz.nifeather.morph.misc.permissions.CommonPermissions;
 import xyz.nifeather.morph.network.server.MorphClientHandler;
 import xyz.nifeather.morph.utilities.MapMetaUtils;
 import xyz.nifeather.morph.utilities.NbtUtils;
-import xiamomc.pluginbase.Annotations.Resolved;
 
 import java.util.HashMap;
 
diff --git a/src/main/java/xyz/nifeather/morph/misc/PlayerOperationSimulator.java b/src/main/java/xyz/nifeather/morph/misc/PlayerOperationSimulator.java
index 7fa6bffb..29efa032 100644
--- a/src/main/java/xyz/nifeather/morph/misc/PlayerOperationSimulator.java
+++ b/src/main/java/xyz/nifeather/morph/misc/PlayerOperationSimulator.java
@@ -26,11 +26,11 @@
 import org.bukkit.plugin.PluginManager;
 import org.bukkit.util.RayTraceResult;
 import org.bukkit.util.Vector;
+import xiamomc.pluginbase.Annotations.Initializer;
+import xiamomc.pluginbase.Bindables.Bindable;
 import xyz.nifeather.morph.MorphPluginObject;
 import xyz.nifeather.morph.config.ConfigOption;
 import xyz.nifeather.morph.config.MorphConfigManager;
-import xiamomc.pluginbase.Annotations.Initializer;
-import xiamomc.pluginbase.Bindables.Bindable;
 
 import java.util.Map;
 import java.util.Objects;
diff --git a/src/main/java/xyz/nifeather/morph/misc/disguiseProperty/DisguiseProperties.java b/src/main/java/xyz/nifeather/morph/misc/disguiseProperty/DisguiseProperties.java
index 3937681d..6aaf728e 100644
--- a/src/main/java/xyz/nifeather/morph/misc/disguiseProperty/DisguiseProperties.java
+++ b/src/main/java/xyz/nifeather/morph/misc/disguiseProperty/DisguiseProperties.java
@@ -4,10 +4,8 @@
 import org.jetbrains.annotations.NotNull;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import xiamomc.morph.misc.disguiseProperty.values.*;
 import xiamomc.pluginbase.Exceptions.NullDependencyException;
 import xyz.nifeather.morph.misc.disguiseProperty.values.*;
-import xyz.nifeather.morph.morph.misc.disguiseProperty.values.*;
 
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
diff --git a/src/main/java/xyz/nifeather/morph/misc/gui/AnimSelectScreenWrapper.java b/src/main/java/xyz/nifeather/morph/misc/gui/AnimSelectScreenWrapper.java
index ae544a70..588e7146 100644
--- a/src/main/java/xyz/nifeather/morph/misc/gui/AnimSelectScreenWrapper.java
+++ b/src/main/java/xyz/nifeather/morph/misc/gui/AnimSelectScreenWrapper.java
@@ -9,11 +9,11 @@
 import org.bukkit.inventory.ItemRarity;
 import org.bukkit.inventory.ItemStack;
 import org.bukkit.inventory.meta.BlockDataMeta;
+import xiamomc.pluginbase.Bindables.BindableList;
 import xyz.nifeather.morph.messages.EmoteStrings;
 import xyz.nifeather.morph.messages.GuiStrings;
 import xyz.nifeather.morph.messages.MorphStrings;
 import xyz.nifeather.morph.misc.DisguiseState;
-import xiamomc.pluginbase.Bindables.BindableList;
 
 import java.util.List;
 
diff --git a/src/main/java/xyz/nifeather/morph/misc/gui/DisguiseSelectScreenWrapper.java b/src/main/java/xyz/nifeather/morph/misc/gui/DisguiseSelectScreenWrapper.java
index 90b53775..0b347233 100644
--- a/src/main/java/xyz/nifeather/morph/misc/gui/DisguiseSelectScreenWrapper.java
+++ b/src/main/java/xyz/nifeather/morph/misc/gui/DisguiseSelectScreenWrapper.java
@@ -9,6 +9,7 @@
 import org.bukkit.entity.Player;
 import org.bukkit.inventory.ItemStack;
 import org.jetbrains.annotations.Nullable;
+import xiamomc.pluginbase.Annotations.Resolved;
 import xyz.nifeather.morph.MorphManager;
 import xyz.nifeather.morph.config.ConfigOption;
 import xyz.nifeather.morph.config.MorphConfigManager;
@@ -16,7 +17,6 @@
 import xyz.nifeather.morph.messages.MorphStrings;
 import xyz.nifeather.morph.misc.DisguiseMeta;
 import xyz.nifeather.morph.misc.DisguiseState;
-import xiamomc.pluginbase.Annotations.Resolved;
 
 import java.util.List;
 
diff --git a/src/main/java/xyz/nifeather/morph/misc/gui/ScreenWrapper.java b/src/main/java/xyz/nifeather/morph/misc/gui/ScreenWrapper.java
index ba666036..26f3d3f6 100644
--- a/src/main/java/xyz/nifeather/morph/misc/gui/ScreenWrapper.java
+++ b/src/main/java/xyz/nifeather/morph/misc/gui/ScreenWrapper.java
@@ -4,10 +4,10 @@
 import net.kyori.adventure.key.Key;
 import net.kyori.adventure.sound.Sound;
 import org.bukkit.entity.Player;
-import xyz.nifeather.morph.MorphPluginObject;
-import xyz.nifeather.morph.messages.MessageUtils;
 import xiamomc.pluginbase.Bindables.Bindable;
 import xiamomc.pluginbase.ScheduleInfo;
+import xyz.nifeather.morph.MorphPluginObject;
+import xyz.nifeather.morph.messages.MessageUtils;
 
 public class ScreenWrapper extends MorphPluginObject
 {
diff --git a/src/main/java/xyz/nifeather/morph/misc/integrations/placeholderapi/PlaceholderIntegration.java b/src/main/java/xyz/nifeather/morph/misc/integrations/placeholderapi/PlaceholderIntegration.java
index 9c0e1357..a8347843 100644
--- a/src/main/java/xyz/nifeather/morph/misc/integrations/placeholderapi/PlaceholderIntegration.java
+++ b/src/main/java/xyz/nifeather/morph/misc/integrations/placeholderapi/PlaceholderIntegration.java
@@ -5,9 +5,9 @@
 import org.bukkit.entity.Player;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
+import xiamomc.pluginbase.Managers.DependencyManager;
 import xyz.nifeather.morph.misc.integrations.placeholderapi.builtin.AvaliableDisguisesProvider;
 import xyz.nifeather.morph.misc.integrations.placeholderapi.builtin.StateNameProvider;
-import xiamomc.pluginbase.Managers.DependencyManager;
 
 import java.util.List;
 
diff --git a/src/main/java/xyz/nifeather/morph/misc/integrations/placeholderapi/builtin/AvaliableDisguisesProvider.java b/src/main/java/xyz/nifeather/morph/misc/integrations/placeholderapi/builtin/AvaliableDisguisesProvider.java
index 14e07c4a..20f361f0 100644
--- a/src/main/java/xyz/nifeather/morph/misc/integrations/placeholderapi/builtin/AvaliableDisguisesProvider.java
+++ b/src/main/java/xyz/nifeather/morph/misc/integrations/placeholderapi/builtin/AvaliableDisguisesProvider.java
@@ -4,12 +4,12 @@
 import org.bukkit.entity.Player;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
+import xiamomc.pluginbase.Annotations.Resolved;
 import xyz.nifeather.morph.MorphPluginObject;
 import xyz.nifeather.morph.interfaces.IManagePlayerData;
 import xyz.nifeather.morph.messages.MessageUtils;
 import xyz.nifeather.morph.misc.integrations.placeholderapi.IPlaceholderProvider;
 import xyz.nifeather.morph.misc.integrations.placeholderapi.MatchMode;
-import xiamomc.pluginbase.Annotations.Resolved;
 
 public class AvaliableDisguisesProvider extends MorphPluginObject implements IPlaceholderProvider
 {
diff --git a/src/main/java/xyz/nifeather/morph/misc/integrations/placeholderapi/builtin/StateNameProvider.java b/src/main/java/xyz/nifeather/morph/misc/integrations/placeholderapi/builtin/StateNameProvider.java
index 27119a2d..bd8f264f 100644
--- a/src/main/java/xyz/nifeather/morph/misc/integrations/placeholderapi/builtin/StateNameProvider.java
+++ b/src/main/java/xyz/nifeather/morph/misc/integrations/placeholderapi/builtin/StateNameProvider.java
@@ -4,11 +4,11 @@
 import org.bukkit.entity.Player;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
+import xiamomc.pluginbase.Annotations.Resolved;
 import xyz.nifeather.morph.MorphManager;
 import xyz.nifeather.morph.MorphPluginObject;
 import xyz.nifeather.morph.misc.integrations.placeholderapi.IPlaceholderProvider;
 import xyz.nifeather.morph.misc.integrations.placeholderapi.MatchMode;
-import xiamomc.pluginbase.Annotations.Resolved;
 
 public class StateNameProvider extends MorphPluginObject implements IPlaceholderProvider
 {
diff --git a/src/main/java/xyz/nifeather/morph/misc/integrations/tab/TabAdapter.java b/src/main/java/xyz/nifeather/morph/misc/integrations/tab/TabAdapter.java
index a3a25441..9bc437fb 100644
--- a/src/main/java/xyz/nifeather/morph/misc/integrations/tab/TabAdapter.java
+++ b/src/main/java/xyz/nifeather/morph/misc/integrations/tab/TabAdapter.java
@@ -5,12 +5,12 @@
 import org.bukkit.entity.Player;
 import org.bukkit.event.EventHandler;
 import org.bukkit.event.Listener;
+import xiamomc.pluginbase.Annotations.Initializer;
 import xyz.nifeather.morph.MorphPluginObject;
 import xyz.nifeather.morph.events.api.gameplay.PlayerDisguisedFromOfflineStateEvent;
 import xyz.nifeather.morph.events.api.gameplay.PlayerJoinedWithDisguiseEvent;
 import xyz.nifeather.morph.events.api.gameplay.PlayerMorphEvent;
 import xyz.nifeather.morph.events.api.gameplay.PlayerUnMorphEvent;
-import xiamomc.pluginbase.Annotations.Initializer;
 
 public class TabAdapter extends MorphPluginObject implements Listener
 {
diff --git a/src/main/java/xyz/nifeather/morph/misc/permissions/CommonPermissions.java b/src/main/java/xyz/nifeather/morph/misc/permissions/CommonPermissions.java
index 8cf0c0db..94eb12d0 100644
--- a/src/main/java/xyz/nifeather/morph/misc/permissions/CommonPermissions.java
+++ b/src/main/java/xyz/nifeather/morph/misc/permissions/CommonPermissions.java
@@ -36,6 +36,16 @@ public class CommonPermissions
 
     public final static String SET_OPTIONS = PERM_ROOT + "toggle";
 
+    public final static String QUERY_STATES = PERM_ROOT + "query";
+    public final static String CHECK_STAT = PERM_ROOT + "stat";
+    public final static String DO_RELOAD = PERM_ROOT + "reload";
+
+    public final static String MANAGE_DISGUISES = PERM_ROOT + "manage";
+    public final static String MANAGE_GRANT_DISGUISE = MANAGE_DISGUISES + ".grant";
+    public final static String MANAGE_REVOKE_DISGUISE = MANAGE_DISGUISES + ".revoke";
+    public final static String MANAGE_UNMORPH_DISGUISE = MANAGE_DISGUISES + ".unmorph";
+    public final static String MANAGE_MORPH_DISGUISE = MANAGE_DISGUISES + ".morph";
+
     public final static String CAN_FLY = PERM_ROOT + "can_fly";
     public final static String ALWAYS_CAN_FLY = PERM_ROOT + "can_fly.always";
 
diff --git a/src/main/java/xyz/nifeather/morph/misc/recipe/RecipeManager.java b/src/main/java/xyz/nifeather/morph/misc/recipe/RecipeManager.java
index a11a7572..dd2290d7 100644
--- a/src/main/java/xyz/nifeather/morph/misc/recipe/RecipeManager.java
+++ b/src/main/java/xyz/nifeather/morph/misc/recipe/RecipeManager.java
@@ -10,12 +10,12 @@
 import org.bukkit.inventory.*;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
+import xiamomc.pluginbase.Annotations.Initializer;
 import xyz.nifeather.morph.MorphPluginObject;
 import xyz.nifeather.morph.config.MorphConfigManager;
 import xyz.nifeather.morph.utilities.ItemUtils;
-import xiamomc.pluginbase.Annotations.Initializer;
 
-import java.io.*;
+import java.io.File;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
diff --git a/src/main/java/xyz/nifeather/morph/misc/recipe/RecipeYamlConfigManager.java b/src/main/java/xyz/nifeather/morph/misc/recipe/RecipeYamlConfigManager.java
index 31015d99..7f88b1db 100644
--- a/src/main/java/xyz/nifeather/morph/misc/recipe/RecipeYamlConfigManager.java
+++ b/src/main/java/xyz/nifeather/morph/misc/recipe/RecipeYamlConfigManager.java
@@ -3,8 +3,8 @@
 import com.google.common.base.Charsets;
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
 import org.jetbrains.annotations.Nullable;
-import xyz.nifeather.morph.utilities.PluginAssetUtils;
 import xiamomc.pluginbase.Configuration.ConfigOption;
+import xyz.nifeather.morph.utilities.PluginAssetUtils;
 
 import java.io.File;
 import java.io.FileOutputStream;
diff --git a/src/main/java/xyz/nifeather/morph/misc/recipe/StandaloneYamlConfigManager.java b/src/main/java/xyz/nifeather/morph/misc/recipe/StandaloneYamlConfigManager.java
index 33f6737b..07f3e973 100644
--- a/src/main/java/xyz/nifeather/morph/misc/recipe/StandaloneYamlConfigManager.java
+++ b/src/main/java/xyz/nifeather/morph/misc/recipe/StandaloneYamlConfigManager.java
@@ -4,12 +4,14 @@
 import org.bukkit.configuration.file.YamlConfiguration;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
-import xyz.nifeather.morph.MorphPluginObject;
 import xiamomc.pluginbase.Configuration.ConfigNode;
 import xiamomc.pluginbase.Configuration.ConfigOption;
+import xyz.nifeather.morph.MorphPluginObject;
 
 import java.io.File;
-import java.util.*;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
 
 public abstract class StandaloneYamlConfigManager extends MorphPluginObject
 {
diff --git a/src/main/java/xyz/nifeather/morph/network/multiInstance/MultiInstanceService.java b/src/main/java/xyz/nifeather/morph/network/multiInstance/MultiInstanceService.java
index 742c20df..4e577297 100644
--- a/src/main/java/xyz/nifeather/morph/network/multiInstance/MultiInstanceService.java
+++ b/src/main/java/xyz/nifeather/morph/network/multiInstance/MultiInstanceService.java
@@ -1,6 +1,9 @@
 package xyz.nifeather.morph.network.multiInstance;
 
 import org.jetbrains.annotations.Nullable;
+import xiamomc.pluginbase.Annotations.Initializer;
+import xiamomc.pluginbase.Annotations.Resolved;
+import xiamomc.pluginbase.Bindables.Bindable;
 import xyz.nifeather.morph.MorphManager;
 import xyz.nifeather.morph.MorphPluginObject;
 import xyz.nifeather.morph.config.ConfigOption;
@@ -11,9 +14,6 @@
 import xyz.nifeather.morph.network.multiInstance.protocol.c2s.MIC2SDisguiseMetaCommand;
 import xyz.nifeather.morph.network.multiInstance.protocol.s2c.MIS2CSyncMetaCommand;
 import xyz.nifeather.morph.network.multiInstance.slave.SlaveInstance;
-import xiamomc.pluginbase.Annotations.Initializer;
-import xiamomc.pluginbase.Annotations.Resolved;
-import xiamomc.pluginbase.Bindables.Bindable;
 
 import java.util.Arrays;
 import java.util.UUID;
diff --git a/src/main/java/xyz/nifeather/morph/network/multiInstance/master/InstanceServer.java b/src/main/java/xyz/nifeather/morph/network/multiInstance/master/InstanceServer.java
index 773b1c9a..820e0a07 100644
--- a/src/main/java/xyz/nifeather/morph/network/multiInstance/master/InstanceServer.java
+++ b/src/main/java/xyz/nifeather/morph/network/multiInstance/master/InstanceServer.java
@@ -5,8 +5,8 @@
 import org.java_websocket.handshake.ClientHandshake;
 import org.java_websocket.server.WebSocketServer;
 import org.slf4j.Logger;
-import xyz.nifeather.morph.network.multiInstance.protocol.IClientHandler;
 import xiamomc.pluginbase.XiaMoJavaPlugin;
+import xyz.nifeather.morph.network.multiInstance.protocol.IClientHandler;
 
 import java.net.InetSocketAddress;
 import java.util.List;
diff --git a/src/main/java/xyz/nifeather/morph/network/multiInstance/master/MasterInstance.java b/src/main/java/xyz/nifeather/morph/network/multiInstance/master/MasterInstance.java
index c1171b4a..6020851a 100644
--- a/src/main/java/xyz/nifeather/morph/network/multiInstance/master/MasterInstance.java
+++ b/src/main/java/xyz/nifeather/morph/network/multiInstance/master/MasterInstance.java
@@ -7,11 +7,14 @@
 import org.jetbrains.annotations.ApiStatus;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
+import xiamomc.morph.network.commands.CommandRegistries;
+import xiamomc.pluginbase.Annotations.Initializer;
+import xiamomc.pluginbase.Annotations.Resolved;
+import xiamomc.pluginbase.Bindables.Bindable;
 import xyz.nifeather.morph.MorphPluginObject;
 import xyz.nifeather.morph.config.ConfigOption;
 import xyz.nifeather.morph.config.MorphConfigManager;
 import xyz.nifeather.morph.network.ReasonCodes;
-import xiamomc.morph.network.commands.CommandRegistries;
 import xyz.nifeather.morph.network.multiInstance.IInstanceService;
 import xyz.nifeather.morph.network.multiInstance.protocol.IClientHandler;
 import xyz.nifeather.morph.network.multiInstance.protocol.Operation;
@@ -19,14 +22,9 @@
 import xyz.nifeather.morph.network.multiInstance.protocol.c2s.MIC2SCommand;
 import xyz.nifeather.morph.network.multiInstance.protocol.c2s.MIC2SDisguiseMetaCommand;
 import xyz.nifeather.morph.network.multiInstance.protocol.c2s.MIC2SLoginCommand;
-import xiamomc.morph.network.multiInstance.protocol.s2c.*;
-import xyz.nifeather.morph.morph.network.multiInstance.protocol.s2c.*;
 import xyz.nifeather.morph.network.multiInstance.protocol.s2c.*;
 import xyz.nifeather.morph.network.multiInstance.slave.SlaveInstance;
 import xyz.nifeather.morph.storage.playerdata.PlayerMeta;
-import xiamomc.pluginbase.Annotations.Initializer;
-import xiamomc.pluginbase.Annotations.Resolved;
-import xiamomc.pluginbase.Bindables.Bindable;
 
 import java.lang.ref.WeakReference;
 import java.net.ConnectException;
diff --git a/src/main/java/xyz/nifeather/morph/network/multiInstance/protocol/c2s/MIC2SCommand.java b/src/main/java/xyz/nifeather/morph/network/multiInstance/protocol/c2s/MIC2SCommand.java
index 4e8c5ae5..11b79a3f 100644
--- a/src/main/java/xyz/nifeather/morph/network/multiInstance/protocol/c2s/MIC2SCommand.java
+++ b/src/main/java/xyz/nifeather/morph/network/multiInstance/protocol/c2s/MIC2SCommand.java
@@ -4,9 +4,9 @@
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 import org.slf4j.Logger;
-import xyz.nifeather.morph.MorphPlugin;
 import xiamomc.morph.network.BasicClientHandler;
 import xiamomc.morph.network.commands.C2S.AbstractC2SCommand;
+import xyz.nifeather.morph.MorphPlugin;
 import xyz.nifeather.morph.network.multiInstance.protocol.IClientHandler;
 
 public abstract class MIC2SCommand<T> extends AbstractC2SCommand<T>
diff --git a/src/main/java/xyz/nifeather/morph/network/multiInstance/protocol/s2c/MIS2CCommand.java b/src/main/java/xyz/nifeather/morph/network/multiInstance/protocol/s2c/MIS2CCommand.java
index 619a1474..f615fba2 100644
--- a/src/main/java/xyz/nifeather/morph/network/multiInstance/protocol/s2c/MIS2CCommand.java
+++ b/src/main/java/xyz/nifeather/morph/network/multiInstance/protocol/s2c/MIS2CCommand.java
@@ -4,9 +4,9 @@
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 import org.slf4j.Logger;
-import xyz.nifeather.morph.MorphPlugin;
 import xiamomc.morph.network.BasicServerHandler;
 import xiamomc.morph.network.commands.S2C.AbstractS2CCommand;
+import xyz.nifeather.morph.MorphPlugin;
 import xyz.nifeather.morph.network.multiInstance.protocol.IMasterHandler;
 
 public abstract class MIS2CCommand<T> extends AbstractS2CCommand<T>
diff --git a/src/main/java/xyz/nifeather/morph/network/multiInstance/slave/InstanceClient.java b/src/main/java/xyz/nifeather/morph/network/multiInstance/slave/InstanceClient.java
index dcc01629..5f473527 100644
--- a/src/main/java/xyz/nifeather/morph/network/multiInstance/slave/InstanceClient.java
+++ b/src/main/java/xyz/nifeather/morph/network/multiInstance/slave/InstanceClient.java
@@ -3,8 +3,8 @@
 import org.java_websocket.client.WebSocketClient;
 import org.java_websocket.handshake.ServerHandshake;
 import org.slf4j.Logger;
-import xyz.nifeather.morph.network.multiInstance.protocol.IMasterHandler;
 import xiamomc.pluginbase.XiaMoJavaPlugin;
+import xyz.nifeather.morph.network.multiInstance.protocol.IMasterHandler;
 
 import java.net.ConnectException;
 import java.net.URI;
diff --git a/src/main/java/xyz/nifeather/morph/network/multiInstance/slave/SlaveInstance.java b/src/main/java/xyz/nifeather/morph/network/multiInstance/slave/SlaveInstance.java
index c9744233..a3c886c6 100644
--- a/src/main/java/xyz/nifeather/morph/network/multiInstance/slave/SlaveInstance.java
+++ b/src/main/java/xyz/nifeather/morph/network/multiInstance/slave/SlaveInstance.java
@@ -4,13 +4,17 @@
 import org.bukkit.Bukkit;
 import org.jetbrains.annotations.ApiStatus;
 import org.jetbrains.annotations.Nullable;
+import xiamomc.morph.network.commands.C2S.AbstractC2SCommand;
+import xiamomc.morph.network.commands.CommandRegistries;
+import xiamomc.pluginbase.Annotations.Initializer;
+import xiamomc.pluginbase.Annotations.Resolved;
+import xiamomc.pluginbase.Bindables.Bindable;
+import xiamomc.pluginbase.Exceptions.NullDependencyException;
 import xyz.nifeather.morph.MorphManager;
 import xyz.nifeather.morph.MorphPluginObject;
 import xyz.nifeather.morph.config.ConfigOption;
 import xyz.nifeather.morph.config.MorphConfigManager;
 import xyz.nifeather.morph.network.ReasonCodes;
-import xiamomc.morph.network.commands.C2S.AbstractC2SCommand;
-import xiamomc.morph.network.commands.CommandRegistries;
 import xyz.nifeather.morph.network.multiInstance.IInstanceService;
 import xyz.nifeather.morph.network.multiInstance.master.MasterInstance;
 import xyz.nifeather.morph.network.multiInstance.protocol.IMasterHandler;
@@ -19,14 +23,8 @@
 import xyz.nifeather.morph.network.multiInstance.protocol.SocketDisguiseMeta;
 import xyz.nifeather.morph.network.multiInstance.protocol.c2s.MIC2SDisguiseMetaCommand;
 import xyz.nifeather.morph.network.multiInstance.protocol.c2s.MIC2SLoginCommand;
-import xiamomc.morph.network.multiInstance.protocol.s2c.*;
-import xyz.nifeather.morph.morph.network.multiInstance.protocol.s2c.*;
 import xyz.nifeather.morph.network.multiInstance.protocol.s2c.*;
 import xyz.nifeather.morph.network.server.MorphClientHandler;
-import xiamomc.pluginbase.Annotations.Initializer;
-import xiamomc.pluginbase.Annotations.Resolved;
-import xiamomc.pluginbase.Bindables.Bindable;
-import xiamomc.pluginbase.Exceptions.NullDependencyException;
 
 import java.net.URI;
 import java.util.List;
diff --git a/src/main/java/xyz/nifeather/morph/network/server/MorphClientHandler.java b/src/main/java/xyz/nifeather/morph/network/server/MorphClientHandler.java
index 2e3a5a37..aaca413f 100644
--- a/src/main/java/xyz/nifeather/morph/network/server/MorphClientHandler.java
+++ b/src/main/java/xyz/nifeather/morph/network/server/MorphClientHandler.java
@@ -14,18 +14,6 @@
 import org.bukkit.entity.Player;
 import org.jetbrains.annotations.ApiStatus;
 import org.jetbrains.annotations.Nullable;
-import xyz.nifeather.morph.MorphManager;
-import xyz.nifeather.morph.MorphPlugin;
-import xyz.nifeather.morph.MorphPluginObject;
-import xyz.nifeather.morph.config.ConfigOption;
-import xyz.nifeather.morph.config.MorphConfigManager;
-import xyz.nifeather.morph.interfaces.IManageRequests;
-import xyz.nifeather.morph.messages.EmoteStrings;
-import xyz.nifeather.morph.messages.MessageUtils;
-import xyz.nifeather.morph.messages.MorphStrings;
-import xyz.nifeather.morph.misc.DisguiseState;
-import xyz.nifeather.morph.misc.NetworkingHelper;
-import xyz.nifeather.morph.misc.permissions.CommonPermissions;
 import xiamomc.morph.network.*;
 import xiamomc.morph.network.commands.C2S.*;
 import xiamomc.morph.network.commands.CommandRegistries;
@@ -40,6 +28,18 @@
 import xiamomc.pluginbase.Annotations.Initializer;
 import xiamomc.pluginbase.Annotations.Resolved;
 import xiamomc.pluginbase.Bindables.Bindable;
+import xyz.nifeather.morph.MorphManager;
+import xyz.nifeather.morph.MorphPlugin;
+import xyz.nifeather.morph.MorphPluginObject;
+import xyz.nifeather.morph.config.ConfigOption;
+import xyz.nifeather.morph.config.MorphConfigManager;
+import xyz.nifeather.morph.interfaces.IManageRequests;
+import xyz.nifeather.morph.messages.EmoteStrings;
+import xyz.nifeather.morph.messages.MessageUtils;
+import xyz.nifeather.morph.messages.MorphStrings;
+import xyz.nifeather.morph.misc.DisguiseState;
+import xyz.nifeather.morph.misc.NetworkingHelper;
+import xyz.nifeather.morph.misc.permissions.CommonPermissions;
 
 import java.nio.charset.StandardCharsets;
 import java.util.Collection;
diff --git a/src/main/java/xyz/nifeather/morph/providers/animation/provider/VanillaAnimationProvider.java b/src/main/java/xyz/nifeather/morph/providers/animation/provider/VanillaAnimationProvider.java
index be07b1b0..10c5964c 100644
--- a/src/main/java/xyz/nifeather/morph/providers/animation/provider/VanillaAnimationProvider.java
+++ b/src/main/java/xyz/nifeather/morph/providers/animation/provider/VanillaAnimationProvider.java
@@ -3,8 +3,6 @@
 import org.bukkit.entity.EntityType;
 import org.jetbrains.annotations.NotNull;
 import xyz.nifeather.morph.providers.animation.AnimationSet;
-import xiamomc.morph.providers.animation.bundled.*;
-import xyz.nifeather.morph.morph.providers.animation.bundled.*;
 import xyz.nifeather.morph.providers.animation.bundled.*;
 
 public class VanillaAnimationProvider extends DefaultAnimationProvider
diff --git a/src/main/java/xyz/nifeather/morph/providers/disguise/VanillaDisguiseProvider.java b/src/main/java/xyz/nifeather/morph/providers/disguise/VanillaDisguiseProvider.java
index 972edc61..f1e87cb9 100644
--- a/src/main/java/xyz/nifeather/morph/providers/disguise/VanillaDisguiseProvider.java
+++ b/src/main/java/xyz/nifeather/morph/providers/disguise/VanillaDisguiseProvider.java
@@ -27,12 +27,10 @@
 import xyz.nifeather.morph.misc.disguiseProperty.values.ArmorStandProperties;
 import xyz.nifeather.morph.providers.animation.AnimationProvider;
 import xyz.nifeather.morph.providers.animation.provider.VanillaAnimationProvider;
-import xiamomc.morph.utilities.*;
 import xiamomc.pluginbase.Annotations.Initializer;
 import xiamomc.pluginbase.Annotations.Resolved;
 import xiamomc.pluginbase.Bindables.Bindable;
 import xiamomc.pluginbase.Exceptions.NullDependencyException;
-import xyz.nifeather.morph.morph.utilities.*;
 import xyz.nifeather.morph.utilities.*;
 
 import java.lang.reflect.Field;
diff --git a/src/main/java/xyz/nifeather/morph/skills/DefaultConfigGenerator.java b/src/main/java/xyz/nifeather/morph/skills/DefaultConfigGenerator.java
index 3eed79be..c401e35e 100644
--- a/src/main/java/xyz/nifeather/morph/skills/DefaultConfigGenerator.java
+++ b/src/main/java/xyz/nifeather/morph/skills/DefaultConfigGenerator.java
@@ -9,9 +9,7 @@
 import org.jetbrains.annotations.Nullable;
 import xyz.nifeather.morph.MorphManager;
 import xyz.nifeather.morph.abilities.AbilityType;
-import xiamomc.morph.abilities.options.*;
 import xyz.nifeather.morph.abilities.options.*;
-import xyz.nifeather.morph.morph.abilities.options.*;
 import xyz.nifeather.morph.skills.impl.SonicBoomMorphSkill;
 import xyz.nifeather.morph.skills.options.EffectConfiguration;
 import xyz.nifeather.morph.skills.options.ExplosionConfiguration;
diff --git a/src/main/java/xyz/nifeather/morph/skills/MorphSkillHandler.java b/src/main/java/xyz/nifeather/morph/skills/MorphSkillHandler.java
index 10ab7991..a0bc980b 100644
--- a/src/main/java/xyz/nifeather/morph/skills/MorphSkillHandler.java
+++ b/src/main/java/xyz/nifeather/morph/skills/MorphSkillHandler.java
@@ -12,6 +12,8 @@
 import org.jetbrains.annotations.Contract;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
+import xiamomc.pluginbase.Annotations.Initializer;
+import xiamomc.pluginbase.Annotations.Resolved;
 import xyz.nifeather.morph.MorphManager;
 import xyz.nifeather.morph.MorphPluginObject;
 import xyz.nifeather.morph.events.api.gameplay.PlayerExecuteSkillEvent;
@@ -21,15 +23,11 @@
 import xyz.nifeather.morph.messages.MorphStrings;
 import xyz.nifeather.morph.messages.SkillStrings;
 import xyz.nifeather.morph.misc.permissions.CommonPermissions;
-import xiamomc.morph.skills.impl.*;
-import xyz.nifeather.morph.morph.skills.impl.*;
 import xyz.nifeather.morph.skills.impl.*;
 import xyz.nifeather.morph.storage.skill.ISkillOption;
 import xyz.nifeather.morph.storage.skill.SkillAbilityConfiguration;
 import xyz.nifeather.morph.storage.skill.SkillAbilityConfigurationStore;
 import xyz.nifeather.morph.utilities.PermissionUtils;
-import xiamomc.pluginbase.Annotations.Initializer;
-import xiamomc.pluginbase.Annotations.Resolved;
 
 import java.util.List;
 import java.util.Map;
diff --git a/src/main/java/xyz/nifeather/morph/skills/impl/DelayedMorphSkill.java b/src/main/java/xyz/nifeather/morph/skills/impl/DelayedMorphSkill.java
index e482c1f9..ebdc975c 100644
--- a/src/main/java/xyz/nifeather/morph/skills/impl/DelayedMorphSkill.java
+++ b/src/main/java/xyz/nifeather/morph/skills/impl/DelayedMorphSkill.java
@@ -1,12 +1,12 @@
 package xyz.nifeather.morph.skills.impl;
 
 import org.bukkit.entity.Player;
+import xiamomc.pluginbase.Annotations.Resolved;
 import xyz.nifeather.morph.MorphManager;
 import xyz.nifeather.morph.misc.DisguiseState;
 import xyz.nifeather.morph.skills.MorphSkill;
 import xyz.nifeather.morph.storage.skill.ISkillOption;
 import xyz.nifeather.morph.storage.skill.SkillAbilityConfiguration;
-import xiamomc.pluginbase.Annotations.Resolved;
 
 public abstract class DelayedMorphSkill<T extends ISkillOption> extends MorphSkill<T>
 {
diff --git a/src/main/java/xyz/nifeather/morph/skills/impl/ExplodeMorphSkill.java b/src/main/java/xyz/nifeather/morph/skills/impl/ExplodeMorphSkill.java
index a44d5561..8ebf9f5d 100644
--- a/src/main/java/xyz/nifeather/morph/skills/impl/ExplodeMorphSkill.java
+++ b/src/main/java/xyz/nifeather/morph/skills/impl/ExplodeMorphSkill.java
@@ -10,15 +10,15 @@
 import org.bukkit.entity.EntityType;
 import org.bukkit.entity.Player;
 import org.jetbrains.annotations.NotNull;
+import xiamomc.morph.network.commands.S2C.set.S2CSetSNbtCommand;
+import xiamomc.pluginbase.Annotations.Resolved;
 import xyz.nifeather.morph.messages.MessageUtils;
 import xyz.nifeather.morph.messages.SkillStrings;
 import xyz.nifeather.morph.misc.DisguiseState;
-import xiamomc.morph.network.commands.S2C.set.S2CSetSNbtCommand;
 import xyz.nifeather.morph.network.server.MorphClientHandler;
 import xyz.nifeather.morph.skills.SkillType;
 import xyz.nifeather.morph.skills.options.ExplosionConfiguration;
 import xyz.nifeather.morph.storage.skill.SkillAbilityConfiguration;
-import xiamomc.pluginbase.Annotations.Resolved;
 
 public class ExplodeMorphSkill extends DelayedMorphSkill<ExplosionConfiguration>
 {
diff --git a/src/main/java/xyz/nifeather/morph/skills/impl/InventoryMorphSkill.java b/src/main/java/xyz/nifeather/morph/skills/impl/InventoryMorphSkill.java
index 995967a3..f350762a 100644
--- a/src/main/java/xyz/nifeather/morph/skills/impl/InventoryMorphSkill.java
+++ b/src/main/java/xyz/nifeather/morph/skills/impl/InventoryMorphSkill.java
@@ -3,17 +3,17 @@
 import org.bukkit.NamespacedKey;
 import org.bukkit.entity.Player;
 import org.jetbrains.annotations.NotNull;
+import xiamomc.morph.network.commands.S2C.set.S2CSetDisplayingFakeEquipCommand;
+import xiamomc.pluginbase.Annotations.Resolved;
 import xyz.nifeather.morph.MorphManager;
 import xyz.nifeather.morph.messages.MessageUtils;
 import xyz.nifeather.morph.messages.SkillStrings;
 import xyz.nifeather.morph.misc.DisguiseState;
-import xiamomc.morph.network.commands.S2C.set.S2CSetDisplayingFakeEquipCommand;
 import xyz.nifeather.morph.network.server.MorphClientHandler;
 import xyz.nifeather.morph.skills.MorphSkill;
 import xyz.nifeather.morph.skills.SkillType;
 import xyz.nifeather.morph.skills.options.NoOpConfiguration;
 import xyz.nifeather.morph.storage.skill.SkillAbilityConfiguration;
-import xiamomc.pluginbase.Annotations.Resolved;
 
 public class InventoryMorphSkill extends MorphSkill<NoOpConfiguration>
 {
diff --git a/src/main/java/xyz/nifeather/morph/skills/impl/LaunchProjectileMorphSkill.java b/src/main/java/xyz/nifeather/morph/skills/impl/LaunchProjectileMorphSkill.java
index b14d7a93..20a7e302 100644
--- a/src/main/java/xyz/nifeather/morph/skills/impl/LaunchProjectileMorphSkill.java
+++ b/src/main/java/xyz/nifeather/morph/skills/impl/LaunchProjectileMorphSkill.java
@@ -8,16 +8,16 @@
 import org.bukkit.entity.ShulkerBullet;
 import org.bukkit.entity.WitherSkull;
 import org.jetbrains.annotations.NotNull;
+import xiamomc.morph.network.commands.S2C.set.S2CSetAggressiveCommand;
+import xiamomc.pluginbase.Annotations.Resolved;
 import xyz.nifeather.morph.messages.MessageUtils;
 import xyz.nifeather.morph.messages.SkillStrings;
 import xyz.nifeather.morph.misc.DisguiseState;
-import xiamomc.morph.network.commands.S2C.set.S2CSetAggressiveCommand;
 import xyz.nifeather.morph.network.server.MorphClientHandler;
 import xyz.nifeather.morph.skills.SkillType;
 import xyz.nifeather.morph.skills.options.ProjectileConfiguration;
 import xyz.nifeather.morph.storage.skill.SkillAbilityConfiguration;
 import xyz.nifeather.morph.utilities.EntityTypeUtils;
-import xiamomc.pluginbase.Annotations.Resolved;
 
 public class LaunchProjectileMorphSkill extends DelayedMorphSkill<ProjectileConfiguration>
 {
diff --git a/src/main/java/xyz/nifeather/morph/skills/impl/SonicBoomMorphSkill.java b/src/main/java/xyz/nifeather/morph/skills/impl/SonicBoomMorphSkill.java
index 295348d5..f14827c2 100644
--- a/src/main/java/xyz/nifeather/morph/skills/impl/SonicBoomMorphSkill.java
+++ b/src/main/java/xyz/nifeather/morph/skills/impl/SonicBoomMorphSkill.java
@@ -9,15 +9,15 @@
 import org.bukkit.craftbukkit.entity.CraftLivingEntity;
 import org.bukkit.entity.Player;
 import org.jetbrains.annotations.NotNull;
+import xiamomc.morph.network.commands.S2C.set.S2CSetAggressiveCommand;
+import xiamomc.pluginbase.Annotations.Resolved;
 import xyz.nifeather.morph.misc.DisguiseState;
 import xyz.nifeather.morph.misc.NmsRecord;
-import xiamomc.morph.network.commands.S2C.set.S2CSetAggressiveCommand;
 import xyz.nifeather.morph.network.server.MorphClientHandler;
 import xyz.nifeather.morph.skills.SkillType;
 import xyz.nifeather.morph.skills.options.NoOpConfiguration;
 import xyz.nifeather.morph.storage.skill.SkillAbilityConfiguration;
 import xyz.nifeather.morph.utilities.DamageSourceUtils;
-import xiamomc.pluginbase.Annotations.Resolved;
 
 public class SonicBoomMorphSkill extends DelayedMorphSkill<NoOpConfiguration>
 {
diff --git a/src/main/java/xyz/nifeather/morph/storage/MorphJsonBasedStorage.java b/src/main/java/xyz/nifeather/morph/storage/MorphJsonBasedStorage.java
index 660943de..60edaea0 100644
--- a/src/main/java/xyz/nifeather/morph/storage/MorphJsonBasedStorage.java
+++ b/src/main/java/xyz/nifeather/morph/storage/MorphJsonBasedStorage.java
@@ -1,7 +1,7 @@
 package xyz.nifeather.morph.storage;
 
-import xyz.nifeather.morph.MorphPlugin;
 import xiamomc.pluginbase.JsonBasedStorage;
+import xyz.nifeather.morph.MorphPlugin;
 
 public abstract class MorphJsonBasedStorage<T> extends JsonBasedStorage<T, MorphPlugin>
 {
diff --git a/src/main/java/xyz/nifeather/morph/storage/playerdata/PlayerDataStore.java b/src/main/java/xyz/nifeather/morph/storage/playerdata/PlayerDataStore.java
index 8bd87cd4..a390d0c5 100644
--- a/src/main/java/xyz/nifeather/morph/storage/playerdata/PlayerDataStore.java
+++ b/src/main/java/xyz/nifeather/morph/storage/playerdata/PlayerDataStore.java
@@ -6,6 +6,7 @@
 import org.bukkit.entity.Player;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
+import xiamomc.pluginbase.Annotations.Resolved;
 import xyz.nifeather.morph.MorphManager;
 import xyz.nifeather.morph.interfaces.IManagePlayerData;
 import xyz.nifeather.morph.messages.MessageUtils;
@@ -14,7 +15,6 @@
 import xyz.nifeather.morph.misc.DisguiseState;
 import xyz.nifeather.morph.misc.DisguiseTypes;
 import xyz.nifeather.morph.storage.MorphJsonBasedStorage;
-import xiamomc.pluginbase.Annotations.Resolved;
 
 import java.util.List;
 import java.util.Objects;
diff --git a/src/main/java/xyz/nifeather/morph/storage/skill/SkillAbilityConfigurationStore.java b/src/main/java/xyz/nifeather/morph/storage/skill/SkillAbilityConfigurationStore.java
index b5067f5b..50161f03 100644
--- a/src/main/java/xyz/nifeather/morph/storage/skill/SkillAbilityConfigurationStore.java
+++ b/src/main/java/xyz/nifeather/morph/storage/skill/SkillAbilityConfigurationStore.java
@@ -7,6 +7,7 @@
 import org.bukkit.entity.EntityType;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
+import xiamomc.pluginbase.Annotations.Resolved;
 import xyz.nifeather.morph.MorphManager;
 import xyz.nifeather.morph.abilities.AbilityManager;
 import xyz.nifeather.morph.abilities.AbilityType;
@@ -23,7 +24,6 @@
 import xyz.nifeather.morph.storage.MorphJsonBasedStorage;
 import xyz.nifeather.morph.utilities.DisguiseUtils;
 import xyz.nifeather.morph.utilities.EntityTypeUtils;
-import xiamomc.pluginbase.Annotations.Resolved;
 
 import java.util.Map;
 import java.util.concurrent.atomic.AtomicBoolean;
diff --git a/src/main/java/xyz/nifeather/morph/updates/UpdateHandler.java b/src/main/java/xyz/nifeather/morph/updates/UpdateHandler.java
index 14986a14..c0ea6d5e 100644
--- a/src/main/java/xyz/nifeather/morph/updates/UpdateHandler.java
+++ b/src/main/java/xyz/nifeather/morph/updates/UpdateHandler.java
@@ -7,6 +7,12 @@
 import org.bukkit.command.ConsoleCommandSender;
 import org.bukkit.craftbukkit.command.ServerCommandSender;
 import org.jetbrains.annotations.Nullable;
+import xiamomc.pluginbase.Annotations.Initializer;
+import xiamomc.pluginbase.Annotations.Resolved;
+import xiamomc.pluginbase.Bindables.Bindable;
+import xiamomc.pluginbase.Exceptions.NullDependencyException;
+import xiamomc.pluginbase.Messages.FormattableMessage;
+import xiamomc.pluginbase.ScheduleInfo;
 import xyz.nifeather.morph.MorphPlugin;
 import xyz.nifeather.morph.MorphPluginObject;
 import xyz.nifeather.morph.config.ConfigOption;
@@ -14,12 +20,6 @@
 import xyz.nifeather.morph.messages.MessageUtils;
 import xyz.nifeather.morph.messages.UpdateStrings;
 import xyz.nifeather.morph.misc.permissions.CommonPermissions;
-import xiamomc.pluginbase.Annotations.Initializer;
-import xiamomc.pluginbase.Annotations.Resolved;
-import xiamomc.pluginbase.Bindables.Bindable;
-import xiamomc.pluginbase.Exceptions.NullDependencyException;
-import xiamomc.pluginbase.Messages.FormattableMessage;
-import xiamomc.pluginbase.ScheduleInfo;
 
 import java.net.URL;
 import java.net.http.HttpClient;

From cd48b6bd57cc8212ce9c4208420ccbb181097bc2 Mon Sep 17 00:00:00 2001
From: MATRIX-feather <midnightcarnival@outlook.com>
Date: Wed, 9 Oct 2024 23:22:25 +0800
Subject: [PATCH 04/28] misc: XiaMoZhiShi -> NiFeather

---
 build.gradle.kts | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/build.gradle.kts b/build.gradle.kts
index b75c721d..afd56fd7 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -26,6 +26,7 @@ repositories {
         url = uri("https://jitpack.io")
         content {
             includeGroup("com.github.XiaMoZhiShi")
+            includeGroup("com.github.NiFeather")
         }
     }
 
@@ -93,7 +94,7 @@ dependencies {
         project.property("protocols_local_version")
         else project.property("protocols_version");
 
-    implementation("com.github.XiaMoZhiShi:feathermorph-protocols:${protocolVersion}")
+    implementation("com.github.NiFeather:feathermorph-protocols:${protocolVersion}")
     implementation("com.github.XiaMoZhiShi:PluginBase:${project.property("pluginbase_version")}")
     {
         exclude("com.google.code.gson", "gson")

From 330a888b093b56c70ea5e4363e2521c947839e84 Mon Sep 17 00:00:00 2001
From: MATRIX-feather <midnightcarnival@outlook.com>
Date: Wed, 9 Oct 2024 23:35:40 +0800
Subject: [PATCH 05/28] oof

---
 build.gradle.kts | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/build.gradle.kts b/build.gradle.kts
index afd56fd7..00b7702e 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -101,14 +101,14 @@ dependencies {
     }
 }
 
-group = "xiamomc.morph"
+group = "xyz.nifeather.morph"
 version = "${project.property("project_version")}"
 description = "A morph plugin that aims to provide many features out-of-the-box"
 java.sourceCompatibility = JavaVersion.VERSION_21
 
 bukkit {
     load = BukkitPluginDescription.PluginLoadOrder.POSTWORLD
-    main = "xiamomc.morph.MorphPlugin"
+    main = "xyz.nifeather.morph.MorphPlugin"
     apiVersion = "1.19"
     authors = listOf("MATRIX-feather")
     depend = listOf()
@@ -206,10 +206,10 @@ tasks.build {
 tasks.shadowJar {
     minimize()
     archiveFileName = "FeatherMorph-${project.property("project_version")}+${project.property("mc_version")}-final.jar"
-    relocate("xiamomc.pluginbase", "xiamomc.morph.shaded.pluginbase")
-    relocate("org.bstats", "xiamomc.morph.shaded.bstats")
-    relocate("de.tr7zw.changeme.nbtapi", "xiamomc.morph.shaded.nbtapi")
-    relocate("de.themoep.inventorygui", "xiamomc.morph.shaded.inventorygui")
+    relocate("xiamomc.pluginbase", "xyz.nifeather.morph.shaded.pluginbase")
+    relocate("org.bstats", "xyz.nifeather.morph.shaded.bstats")
+    relocate("de.tr7zw.changeme.nbtapi", "xyz.nifeather.morph.shaded.nbtapi")
+    relocate("de.themoep.inventorygui", "xyz.nifeather.morph.shaded.inventorygui")
 }
 
 tasks.withType<JavaCompile>() {

From cfd635a144307068ef23f3d1b5ed22ec2ef06e08 Mon Sep 17 00:00:00 2001
From: MATRIX-feather <midnightcarnival@outlook.com>
Date: Thu, 10 Oct 2024 13:02:23 +0800
Subject: [PATCH 06/28] =?UTF-8?q?misc:=20=E4=B8=80=E4=BA=9B=E8=B0=83?=
 =?UTF-8?q?=E6=95=B4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../java/xyz/nifeather/morph/MorphManager.java |  6 ++----
 .../network/registries/WatcherIndex.java       | 10 +++++-----
 .../morph/misc/skins/PlayerSkinProvider.java   | 18 ++++++++++--------
 3 files changed, 17 insertions(+), 17 deletions(-)

diff --git a/src/main/java/xyz/nifeather/morph/MorphManager.java b/src/main/java/xyz/nifeather/morph/MorphManager.java
index 4017d398..2c8b89a2 100644
--- a/src/main/java/xyz/nifeather/morph/MorphManager.java
+++ b/src/main/java/xyz/nifeather/morph/MorphManager.java
@@ -1,9 +1,7 @@
 package xyz.nifeather.morph;
 
 import ca.spottedleaf.moonrise.common.util.TickThread;
-import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap;
-import it.unimi.dsi.fastutil.objects.ObjectArrayList;
-import it.unimi.dsi.fastutil.objects.ObjectList;
+import it.unimi.dsi.fastutil.objects.*;
 import net.kyori.adventure.text.Component;
 import org.bukkit.*;
 import org.bukkit.command.CommandSender;
@@ -71,7 +69,7 @@
 
 public class MorphManager extends MorphPluginObject implements IManagePlayerData
 {
-    private final List<DisguiseState> activeDisguises = Collections.synchronizedList(new ObjectArrayList<>());
+    private final List<DisguiseState> activeDisguises = ObjectLists.synchronize(new ObjectArrayList<>());
 
     private final PlayerDataStore data = new PlayerDataStore();
 
diff --git a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/registries/WatcherIndex.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/registries/WatcherIndex.java
index c9d2ec9d..21537357 100644
--- a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/registries/WatcherIndex.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/registries/WatcherIndex.java
@@ -21,16 +21,16 @@ public class WatcherIndex
 {
     public static WatcherIndex getInstance()
     {
-        if (instance == null) instance = new WatcherIndex();
-        return instance;
+        return WatcherInstanceLazyHolder.instance;
     }
 
-    private static WatcherIndex instance;
+    private static class WatcherInstanceLazyHolder
+    {
+        public static final WatcherIndex instance = new WatcherIndex();
+    }
 
     public WatcherIndex()
     {
-        instance = this;
-
         setTypeWatcher(EntityType.PLAYER, PlayerWatcher::new);
         setTypeWatcher(EntityType.ALLAY, AllayWatcher::new);
         setTypeWatcher(EntityType.ARMOR_STAND, ArmorStandWatcher::new);
diff --git a/src/main/java/xyz/nifeather/morph/misc/skins/PlayerSkinProvider.java b/src/main/java/xyz/nifeather/morph/misc/skins/PlayerSkinProvider.java
index 132251ea..03addc64 100644
--- a/src/main/java/xyz/nifeather/morph/misc/skins/PlayerSkinProvider.java
+++ b/src/main/java/xyz/nifeather/morph/misc/skins/PlayerSkinProvider.java
@@ -24,17 +24,19 @@
 
 public class PlayerSkinProvider extends MorphPluginObject
 {
-    private static PlayerSkinProvider instance;
-
     public static PlayerSkinProvider getInstance()
     {
-        if (instance == null)
-        {
-            instance = new PlayerSkinProvider();
-            instance.skinCache.initializeStorage();
-        }
+        return PlayerSkinProviderLazyHolder.instance;
+    }
 
-        return instance;
+    private static class PlayerSkinProviderLazyHolder
+    {
+        public static final PlayerSkinProvider instance = new PlayerSkinProvider();
+    }
+
+    public PlayerSkinProvider()
+    {
+        this.skinCache.initializeStorage();
     }
 
     private final SkinCache skinCache = new SkinCache();

From 73770771345f4223aa492943cfcf3cf11c5ae61b Mon Sep 17 00:00:00 2001
From: MATRIX-feather <midnightcarnival@outlook.com>
Date: Thu, 10 Oct 2024 13:54:17 +0800
Subject: [PATCH 07/28] =?UTF-8?q?misc:=20RegistryKey=20->=20CustomEntry=20?=
 =?UTF-8?q?misc:=20=E7=A7=BB=E9=99=A4=E4=B8=8D=E5=86=8D=E9=9C=80=E8=A6=81?=
 =?UTF-8?q?=E7=9A=84=E4=B8=9C=E8=A5=BF?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../datawatcher/values/AxolotlValues.java     |  2 +-
 .../datawatcher/values/CreeperValues.java     |  2 +-
 .../network/datawatcher/values/FoxValues.java |  2 +-
 .../datawatcher/values/FrogValues.java        |  3 +-
 .../datawatcher/values/LlamaValues.java       |  2 +-
 .../datawatcher/values/MooshroomValues.java   |  2 +-
 .../datawatcher/values/ParrotValues.java      |  2 +-
 .../datawatcher/values/SingleValue.java       | 21 ------------
 .../datawatcher/values/WolfValues.java        | 34 +------------------
 .../datawatcher/watchers/SingleWatcher.java   | 30 ++++++++--------
 .../watchers/types/AllayWatcher.java          |  8 ++---
 .../watchers/types/ArmadilloWatcher.java      |  8 ++---
 .../watchers/types/CatWatcher.java            |  8 ++---
 .../types/EHasAttackAnimationWatcher.java     |  8 ++---
 .../watchers/types/EntityWatcher.java         |  8 ++---
 .../watchers/types/FoxWatcher.java            |  8 ++---
 .../watchers/types/FrogWatcher.java           |  8 ++---
 .../types/InventoryLivingWatcher.java         |  8 ++---
 .../watchers/types/PandaWatcher.java          |  8 ++---
 .../watchers/types/PiglinWatcher.java         |  8 ++---
 .../watchers/types/PlayerWatcher.java         | 10 +++---
 .../watchers/types/PufferfishWatcher.java     |  8 ++---
 .../watchers/types/ShulkerWatcher.java        |  8 ++---
 .../watchers/types/SnifferWatcher.java        |  8 ++---
 .../watchers/types/WardenWatcher.java         | 10 +++---
 .../watchers/types/WolfWatcher.java           |  8 ++---
 .../network/registries/CustomEntries.java     | 26 +++++++-------
 .../{RegistryKey.java => CustomEntry.java}    | 12 +++----
 28 files changed, 108 insertions(+), 162 deletions(-)
 rename src/main/java/xyz/nifeather/morph/backends/server/renderer/network/registries/{RegistryKey.java => CustomEntry.java} (68%)

diff --git a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/AxolotlValues.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/AxolotlValues.java
index fb75c0e2..3c1f076d 100644
--- a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/AxolotlValues.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/AxolotlValues.java
@@ -4,7 +4,7 @@
 
 public class AxolotlValues extends AnimalValues
 {
-    public final SingleValue<Integer> COLOR = createSingle("axolotl_color", 0).withRandom(0, 1, 2, 3, 4);
+    public final SingleValue<Integer> COLOR = createSingle("axolotl_color", 0);
     public final SingleValue<Boolean> PLAYING_DEAD = createSingle("axolotl_playing_dead", false);
     public final SingleValue<Boolean> SPAWNED_FROM_BUCKET = createSingle("axolotl_spawned_from_bucket", false);
 
diff --git a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/CreeperValues.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/CreeperValues.java
index 6355e134..6d984536 100644
--- a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/CreeperValues.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/CreeperValues.java
@@ -3,7 +3,7 @@
 public class CreeperValues extends MonsterValues
 {
     public final SingleValue<Integer> STATE = createSingle("creeper_state", 0);
-    public final SingleValue<Boolean> IS_CHARGED_CREEPER = createSingle("creeper_is_charged", false).withRandom(false, false, false, false, true);
+    public final SingleValue<Boolean> IS_CHARGED_CREEPER = createSingle("creeper_is_charged", false);
     public final SingleValue<Boolean> IGNITED = createSingle("creeper_ignited", false);
 
     public CreeperValues()
diff --git a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/FoxValues.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/FoxValues.java
index e63ca2d3..40200b5d 100644
--- a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/FoxValues.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/FoxValues.java
@@ -6,7 +6,7 @@
 
 public class FoxValues extends AnimalValues
 {
-    public final SingleValue<Integer> FOX_VARIANT = createSingle("fox_variant", 0).withRandom(0, 1);
+    public final SingleValue<Integer> FOX_VARIANT = createSingle("fox_variant", 0);
     public final SingleValue<Byte> FLAGS = createSingle("fox_flags", (byte)0);
     public final SingleValue<UUID> TRUSTED_ID_0 = createSingle("fox_trusted_0", UUID.randomUUID());
     public final SingleValue<UUID> TRUSTED_ID_1 = createSingle("fox_trusted_1", UUID.randomUUID());
diff --git a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/FrogValues.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/FrogValues.java
index 584c4ad3..6bb1307c 100644
--- a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/FrogValues.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/FrogValues.java
@@ -11,8 +11,7 @@
 
 public class FrogValues extends AnimalValues
 {
-    public final SingleValue<Holder<FrogVariant>> FROG_VARIANT = createSingle("frog_variant", getFrogVariant(FrogVariant.TEMPERATE))
-            .withRandom(getFrogVariant(FrogVariant.TEMPERATE), getFrogVariant(FrogVariant.COLD), getFrogVariant(FrogVariant.WARM));
+    public final SingleValue<Holder<FrogVariant>> FROG_VARIANT = createSingle("frog_variant", getFrogVariant(FrogVariant.TEMPERATE));
 
     private Holder<FrogVariant> getFrogVariant(ResourceKey<FrogVariant> key)
     {
diff --git a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/LlamaValues.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/LlamaValues.java
index ea4e2804..ba71aa86 100644
--- a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/LlamaValues.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/LlamaValues.java
@@ -5,7 +5,7 @@
 public class LlamaValues extends ChestedHorseValues
 {
     public final SingleValue<Integer> SLOTS = createSingle("llama_slots", 2);
-    public final SingleValue<Integer> VARIANT = createSingle("llama_variant", 1).withRandom(0, 1, 2, 3);
+    public final SingleValue<Integer> VARIANT = createSingle("llama_variant", 1);
 
     public LlamaValues()
     {
diff --git a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/MooshroomValues.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/MooshroomValues.java
index 8ce30051..d3e536e2 100644
--- a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/MooshroomValues.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/MooshroomValues.java
@@ -4,7 +4,7 @@
 
 public class MooshroomValues extends AnimalValues
 {
-    public final SingleValue<String> VARIANT = createSingle("mooshroom_variant", RED).withRandom(RED, RED, RED, BROWN);
+    public final SingleValue<String> VARIANT = createSingle("mooshroom_variant", RED);
     public static final String RED = "red";
     public static final String BROWN = "brown";
 
diff --git a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/ParrotValues.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/ParrotValues.java
index 620e362c..d664c948 100644
--- a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/ParrotValues.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/ParrotValues.java
@@ -4,7 +4,7 @@
 
 public class ParrotValues extends TameableAnimalValues
 {
-    public final SingleValue<Integer> PARROT_VARIANT = createSingle("parrot_variant", 0).withRandom(0, 1, 2, 3, 4);
+    public final SingleValue<Integer> PARROT_VARIANT = createSingle("parrot_variant", 0);
 
     public ParrotValues()
     {
diff --git a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/SingleValue.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/SingleValue.java
index 2f0acc5f..bd7f1955 100644
--- a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/SingleValue.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/SingleValue.java
@@ -61,26 +61,6 @@ public SingleValue(String name, Class<T> type, int index, @NotNull T defaultValu
         this.defaultValue = defaultValue;
     }
 
-    private final List<T> randomValues = new ObjectArrayList<>();
-
-    public List<T> getRandomValues()
-    {
-        return new ObjectArrayList<>(randomValues);
-    }
-
-    public SingleValue<T> withRandom(List<T> values)
-    {
-        var newInstance = new SingleValue<>(this.name, this.type, this.index, this.defaultValue);
-        newInstance.randomValues.addAll(values);
-
-        return newInstance;
-    }
-
-    public SingleValue<T> withRandom(T... randomValues)
-    {
-        return withRandom(Arrays.stream(randomValues).toList());
-    }
-
     @Override
     public boolean equals(Object obj)
     {
@@ -98,7 +78,6 @@ public boolean equalsStrict(Object obj)
         return this.index == other.index
                 && this.type.equals(other.type)
                 && this.name.equals(other.name)
-                && this.randomValues.equals(other.randomValues)
                 && this.defaultValue.equals(other.defaultValue);
     }
 
diff --git a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/WolfValues.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/WolfValues.java
index 984edae0..4cf97b71 100644
--- a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/WolfValues.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/values/WolfValues.java
@@ -17,39 +17,7 @@ public class WolfValues extends TameableAnimalValues
     public final SingleValue<Boolean> BEGGING = createSingle("wolf_begging", false);
     public final SingleValue<Integer> COLLAR_COLOR = createSingle("wolf_collar_color", 14);
     public final SingleValue<Integer> ANGER_TIME = createSingle("wolf_anger_time", 0);
-    public final SingleValue<Holder<WolfVariant>> WOLF_VARIANT = createSingle("wolf_variant", getWolfVariant(WolfVariants.PALE)).withRandom(allVariants());
-
-    @Nullable
-    private Holder<WolfVariant>[] allVariants;
-
-    private Holder<WolfVariant>[] allVariants()
-    {
-        if (this.allVariants != null)
-            return allVariants;
-
-        this.allVariants = toVariantHolders(
-            WolfVariants.PALE,
-            WolfVariants.SPOTTED,
-            WolfVariants.SNOWY,
-            WolfVariants.BLACK,
-            WolfVariants.ASHEN,
-            WolfVariants.RUSTY,
-            WolfVariants.WOODS,
-            WolfVariants.CHESTNUT,
-            WolfVariants.STRIPED);
-
-        return this.allVariants;
-    }
-
-    public static Holder<WolfVariant>[] toVariantHolders(ResourceKey<WolfVariant>... resKeys)
-    {
-        var list = new ObjectArrayList<Holder<WolfVariant>>();
-
-        for (ResourceKey<WolfVariant> resKey : resKeys)
-            list.add(getWolfVariant(resKey));
-
-        return list.toArray(new Holder[]{});
-    }
+    public final SingleValue<Holder<WolfVariant>> WOLF_VARIANT = createSingle("wolf_variant", getWolfVariant(WolfVariants.PALE));
 
     public static Holder<WolfVariant> getWolfVariant(ResourceKey<WolfVariant> resKey)
     {
diff --git a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/SingleWatcher.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/SingleWatcher.java
index d1b0c3b9..ededdeb4 100644
--- a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/SingleWatcher.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/SingleWatcher.java
@@ -17,7 +17,7 @@
 import xyz.nifeather.morph.backends.server.renderer.network.PacketFactory;
 import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values.AbstractValues;
 import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values.SingleValue;
-import xyz.nifeather.morph.backends.server.renderer.network.registries.RegistryKey;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.CustomEntry;
 import xyz.nifeather.morph.backends.server.renderer.network.registries.RenderRegistry;
 import xyz.nifeather.morph.backends.server.renderer.utilties.WatcherUtils;
 import xyz.nifeather.morph.misc.disguiseProperty.SingleProperty;
@@ -128,52 +128,52 @@ protected <X> void onPropertyWrite(SingleProperty<X> property, X value)
 
     protected final Map<String, Object> customRegistry = Collections.synchronizedMap(new Object2ObjectOpenHashMap<>());
 
-    public <X> void writeEntry(RegistryKey<X> key, X value)
+    public <X> void writeEntry(CustomEntry<X> entry, X value)
     {
-        customRegistry.put(key.name, value);
+        customRegistry.put(entry.name, value);
 
         if (doingInitialization)
             return;
 
-        var prev = readEntryOrDefault(key, null);
-        onEntryWrite(key, prev, value);
+        var prev = readEntryOrDefault(entry, null);
+        onEntryWrite(entry, prev, value);
     }
 
-    protected <X> void onEntryWrite(RegistryKey<X> key, @Nullable X oldVal, @Nullable X newVal)
+    protected <X> void onEntryWrite(CustomEntry<X> entry, @Nullable X oldVal, @Nullable X newVal)
     {
     }
 
     @NotNull
-    public <X> X readEntryOrThrow(RegistryKey<X> key)
+    public <X> X readEntryOrThrow(CustomEntry<X> entry)
     {
-        var val = this.readEntry(key);
+        var val = this.readEntry(entry);
         if (val == null)
-            throw new NullDependencyException("Custom Key '%s' not found in '%s'".formatted(key, this.getClass().getSimpleName()));
+            throw new NullDependencyException("Custom entry '%s' not found in '%s'".formatted(entry, this.getClass().getSimpleName()));
 
         return val;
     }
 
-    public <X> X readEntryOrDefault(RegistryKey<X> key, X defaultValue)
+    public <X> X readEntryOrDefault(CustomEntry<X> entry, X defaultValue)
     {
-        var val = readEntry(key);
+        var val = readEntry(entry);
 
         return val == null ? defaultValue : val;
     }
 
     @Nullable
-    public <X> X readEntry(RegistryKey<X> key)
+    public <X> X readEntry(CustomEntry<X> entry)
     {
-        var val = customRegistry.getOrDefault(key.name, null);
+        var val = customRegistry.getOrDefault(entry.name, null);
 
         if (val == null) return null;
 
-        if (key.type.isInstance(val))
+        if (entry.type.isInstance(val))
         {
             return (X)val;
         }
         else
         {
-            logger.warn("Find incompatible value '%s' for key '%s'!".formatted(val, key));
+            logger.warn("Find incompatible value '%s' for custom entry '%s'!".formatted(val, entry));
 
             return null;
         }
diff --git a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/AllayWatcher.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/AllayWatcher.java
index 4f9eb623..9faecb10 100644
--- a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/AllayWatcher.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/AllayWatcher.java
@@ -3,7 +3,7 @@
 import org.bukkit.entity.EntityType;
 import org.bukkit.entity.Player;
 import xyz.nifeather.morph.backends.server.renderer.network.registries.CustomEntries;
-import xyz.nifeather.morph.backends.server.renderer.network.registries.RegistryKey;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.CustomEntry;
 import xyz.nifeather.morph.backends.server.renderer.network.registries.ValueIndex;
 import xyz.nifeather.morph.misc.AnimationNames;
 
@@ -18,11 +18,11 @@ protected void initRegistry()
     }
 
     @Override
-    protected <X> void onEntryWrite(RegistryKey<X> key, X oldVal, X newVal)
+    protected <X> void onEntryWrite(CustomEntry<X> entry, X oldVal, X newVal)
     {
-        super.onEntryWrite(key, oldVal, newVal);
+        super.onEntryWrite(entry, oldVal, newVal);
 
-        if (key.equals(CustomEntries.ANIMATION))
+        if (entry.equals(CustomEntries.ANIMATION))
         {
             var id = newVal.toString();
 
diff --git a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/ArmadilloWatcher.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/ArmadilloWatcher.java
index 39c72499..913b0c2e 100644
--- a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/ArmadilloWatcher.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/ArmadilloWatcher.java
@@ -5,7 +5,7 @@
 import org.bukkit.entity.EntityType;
 import org.bukkit.entity.Player;
 import xyz.nifeather.morph.backends.server.renderer.network.registries.CustomEntries;
-import xyz.nifeather.morph.backends.server.renderer.network.registries.RegistryKey;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.CustomEntry;
 import xyz.nifeather.morph.backends.server.renderer.network.registries.ValueIndex;
 import xyz.nifeather.morph.misc.AnimationNames;
 
@@ -25,11 +25,11 @@ protected void initRegistry()
     }
 
     @Override
-    protected <X> void onEntryWrite(RegistryKey<X> key, X oldVal, X newVal)
+    protected <X> void onEntryWrite(CustomEntry<X> entry, X oldVal, X newVal)
     {
-        super.onEntryWrite(key, oldVal, newVal);
+        super.onEntryWrite(entry, oldVal, newVal);
 
-        if (key.equals(CustomEntries.ANIMATION))
+        if (entry.equals(CustomEntries.ANIMATION))
         {
             var animId = newVal.toString();
             var player = getBindingPlayer();
diff --git a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/CatWatcher.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/CatWatcher.java
index 420cd4d0..7f6c9689 100644
--- a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/CatWatcher.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/CatWatcher.java
@@ -15,7 +15,7 @@
 import org.bukkit.entity.EntityType;
 import org.bukkit.entity.Player;
 import xyz.nifeather.morph.backends.server.renderer.network.registries.CustomEntries;
-import xyz.nifeather.morph.backends.server.renderer.network.registries.RegistryKey;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.CustomEntry;
 import xyz.nifeather.morph.backends.server.renderer.network.registries.ValueIndex;
 import xyz.nifeather.morph.misc.AnimationNames;
 import xyz.nifeather.morph.misc.disguiseProperty.DisguiseProperties;
@@ -88,11 +88,11 @@ protected <X> void onPropertyWrite(SingleProperty<X> property, X value)
     }
 
     @Override
-    protected <X> void onEntryWrite(RegistryKey<X> key, X oldVal, X newVal)
+    protected <X> void onEntryWrite(CustomEntry<X> entry, X oldVal, X newVal)
     {
-        super.onEntryWrite(key, oldVal, newVal);
+        super.onEntryWrite(entry, oldVal, newVal);
 
-        if (key.equals(CustomEntries.ANIMATION))
+        if (entry.equals(CustomEntries.ANIMATION))
         {
             var animId = newVal.toString();
 
diff --git a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/EHasAttackAnimationWatcher.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/EHasAttackAnimationWatcher.java
index 0566c147..5051b334 100644
--- a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/EHasAttackAnimationWatcher.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/EHasAttackAnimationWatcher.java
@@ -6,7 +6,7 @@
 import org.bukkit.entity.EntityType;
 import org.bukkit.entity.Player;
 import xyz.nifeather.morph.backends.server.renderer.network.registries.CustomEntries;
-import xyz.nifeather.morph.backends.server.renderer.network.registries.RegistryKey;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.CustomEntry;
 
 public class EHasAttackAnimationWatcher extends LivingEntityWatcher
 {
@@ -16,11 +16,11 @@ public EHasAttackAnimationWatcher(Player bindingPlayer, EntityType entityType)
     }
 
     @Override
-    protected <X> void onEntryWrite(RegistryKey<X> key, X oldVal, X newVal)
+    protected <X> void onEntryWrite(CustomEntry<X> entry, X oldVal, X newVal)
     {
-        super.onEntryWrite(key, oldVal, newVal);
+        super.onEntryWrite(entry, oldVal, newVal);
 
-        if (key.equals(CustomEntries.ATTACK_ANIMATION) && Boolean.TRUE.equals(newVal))
+        if (entry.equals(CustomEntries.ATTACK_ANIMATION) && Boolean.TRUE.equals(newVal))
         {
             var entity = ((CraftPlayer)getBindingPlayer()).getHandle();
             sendPacketToAffectedPlayers(PacketContainer.fromPacket(new ClientboundEntityEventPacket(entity, (byte)4)));
diff --git a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/EntityWatcher.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/EntityWatcher.java
index f730d32d..fc312f64 100644
--- a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/EntityWatcher.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/EntityWatcher.java
@@ -7,7 +7,7 @@
 import org.bukkit.entity.Player;
 import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.watchers.SingleWatcher;
 import xyz.nifeather.morph.backends.server.renderer.network.registries.CustomEntries;
-import xyz.nifeather.morph.backends.server.renderer.network.registries.RegistryKey;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.CustomEntry;
 import xyz.nifeather.morph.backends.server.renderer.network.registries.ValueIndex;
 import xyz.nifeather.morph.misc.NmsRecord;
 
@@ -72,11 +72,11 @@ protected void doSync()
     }
 
     @Override
-    protected <X> void onEntryWrite(RegistryKey<X> key, X oldVal, X newVal)
+    protected <X> void onEntryWrite(CustomEntry<X> entry, X oldVal, X newVal)
     {
-        super.onEntryWrite(key, oldVal, newVal);
+        super.onEntryWrite(entry, oldVal, newVal);
 
-        if (key.equals(CustomEntries.DISGUISE_NAME))
+        if (entry.equals(CustomEntries.DISGUISE_NAME))
         {
             var str = newVal.toString();
             var component = str.isEmpty() ? null : Component.literal(str);
diff --git a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/FoxWatcher.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/FoxWatcher.java
index 4ea93c67..4f1123c8 100644
--- a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/FoxWatcher.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/FoxWatcher.java
@@ -5,7 +5,7 @@
 import org.bukkit.entity.Fox;
 import org.bukkit.entity.Player;
 import xyz.nifeather.morph.backends.server.renderer.network.registries.CustomEntries;
-import xyz.nifeather.morph.backends.server.renderer.network.registries.RegistryKey;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.CustomEntry;
 import xyz.nifeather.morph.backends.server.renderer.network.registries.ValueIndex;
 import xyz.nifeather.morph.misc.AnimationNames;
 import xyz.nifeather.morph.misc.disguiseProperty.DisguiseProperties;
@@ -43,11 +43,11 @@ protected <X> void onPropertyWrite(SingleProperty<X> property, X value)
     }
 
     @Override
-    protected <X> void onEntryWrite(RegistryKey<X> key, X oldVal, X newVal)
+    protected <X> void onEntryWrite(CustomEntry<X> entry, X oldVal, X newVal)
     {
-        super.onEntryWrite(key, oldVal, newVal);
+        super.onEntryWrite(entry, oldVal, newVal);
 
-        if (key.equals(CustomEntries.ANIMATION))
+        if (entry.equals(CustomEntries.ANIMATION))
         {
             var animId = newVal.toString();
 
diff --git a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/FrogWatcher.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/FrogWatcher.java
index 0880d70d..54414494 100644
--- a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/FrogWatcher.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/FrogWatcher.java
@@ -17,7 +17,7 @@
 import org.bukkit.entity.Player;
 import xiamomc.pluginbase.Exceptions.NullDependencyException;
 import xyz.nifeather.morph.backends.server.renderer.network.registries.CustomEntries;
-import xyz.nifeather.morph.backends.server.renderer.network.registries.RegistryKey;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.CustomEntry;
 import xyz.nifeather.morph.backends.server.renderer.network.registries.ValueIndex;
 import xyz.nifeather.morph.misc.AnimationNames;
 import xyz.nifeather.morph.misc.disguiseProperty.DisguiseProperties;
@@ -117,11 +117,11 @@ protected <X> void onPropertyWrite(SingleProperty<X> property, X value)
     }
 
     @Override
-    protected <X> void onEntryWrite(RegistryKey<X> key, X oldVal, X newVal)
+    protected <X> void onEntryWrite(CustomEntry<X> entry, X oldVal, X newVal)
     {
-        super.onEntryWrite(key, oldVal, newVal);
+        super.onEntryWrite(entry, oldVal, newVal);
 
-        if (key.equals(CustomEntries.ANIMATION))
+        if (entry.equals(CustomEntries.ANIMATION))
         {
             var animId = newVal.toString();
             var player = getBindingPlayer();
diff --git a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/InventoryLivingWatcher.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/InventoryLivingWatcher.java
index a5357fc3..d4e91519 100644
--- a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/InventoryLivingWatcher.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/InventoryLivingWatcher.java
@@ -5,7 +5,7 @@
 import xiamomc.pluginbase.Annotations.Resolved;
 import xyz.nifeather.morph.backends.server.renderer.network.PacketFactory;
 import xyz.nifeather.morph.backends.server.renderer.network.registries.CustomEntries;
-import xyz.nifeather.morph.backends.server.renderer.network.registries.RegistryKey;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.CustomEntry;
 
 public class InventoryLivingWatcher extends LivingEntityWatcher
 {
@@ -18,11 +18,11 @@ public InventoryLivingWatcher(Player bindingPlayer, EntityType entityType)
     private PacketFactory packetFactory;
 
     @Override
-    protected <X> void onEntryWrite(RegistryKey<X> key, X oldVal, X newVal)
+    protected <X> void onEntryWrite(CustomEntry<X> entry, X oldVal, X newVal)
     {
-        super.onEntryWrite(key, oldVal, newVal);
+        super.onEntryWrite(entry, oldVal, newVal);
 
-        if (key.equals(CustomEntries.DISPLAY_FAKE_EQUIPMENT) || key.equals(CustomEntries.EQUIPMENT))
+        if (entry.equals(CustomEntries.DISPLAY_FAKE_EQUIPMENT) || entry.equals(CustomEntries.EQUIPMENT))
             sendPacketToAffectedPlayers(packetFactory.getEquipmentPacket(getBindingPlayer(), this));
     }
 }
diff --git a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/PandaWatcher.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/PandaWatcher.java
index a0165e1f..1888ff99 100644
--- a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/PandaWatcher.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/PandaWatcher.java
@@ -5,7 +5,7 @@
 import org.bukkit.entity.Panda;
 import org.bukkit.entity.Player;
 import xyz.nifeather.morph.backends.server.renderer.network.registries.CustomEntries;
-import xyz.nifeather.morph.backends.server.renderer.network.registries.RegistryKey;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.CustomEntry;
 import xyz.nifeather.morph.backends.server.renderer.network.registries.ValueIndex;
 import xyz.nifeather.morph.misc.AnimationNames;
 import xyz.nifeather.morph.misc.disguiseProperty.DisguiseProperties;
@@ -60,11 +60,11 @@ protected <X> void onPropertyWrite(SingleProperty<X> property, X value)
     }
 
     @Override
-    protected <X> void onEntryWrite(RegistryKey<X> key, X oldVal, X newVal)
+    protected <X> void onEntryWrite(CustomEntry<X> entry, X oldVal, X newVal)
     {
-        super.onEntryWrite(key, oldVal, newVal);
+        super.onEntryWrite(entry, oldVal, newVal);
 
-        if (key.equals(CustomEntries.ANIMATION))
+        if (entry.equals(CustomEntries.ANIMATION))
         {
             var animId = newVal.toString();
 
diff --git a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/PiglinWatcher.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/PiglinWatcher.java
index 449be033..04f9fc3e 100644
--- a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/PiglinWatcher.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/PiglinWatcher.java
@@ -5,7 +5,7 @@
 import org.bukkit.entity.EntityType;
 import org.bukkit.entity.Player;
 import xyz.nifeather.morph.backends.server.renderer.network.registries.CustomEntries;
-import xyz.nifeather.morph.backends.server.renderer.network.registries.RegistryKey;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.CustomEntry;
 import xyz.nifeather.morph.backends.server.renderer.network.registries.ValueIndex;
 import xyz.nifeather.morph.misc.AnimationNames;
 
@@ -25,11 +25,11 @@ protected void initRegistry()
     }
 
     @Override
-    protected <X> void onEntryWrite(RegistryKey<X> key, X oldVal, X newVal)
+    protected <X> void onEntryWrite(CustomEntry<X> entry, X oldVal, X newVal)
     {
-        super.onEntryWrite(key, oldVal, newVal);
+        super.onEntryWrite(entry, oldVal, newVal);
 
-        if (key.equals(CustomEntries.ANIMATION))
+        if (entry.equals(CustomEntries.ANIMATION))
         {
             var animId = newVal.toString();
             var player = getBindingPlayer();
diff --git a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/PlayerWatcher.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/PlayerWatcher.java
index 9343d68a..0ecc96e3 100644
--- a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/PlayerWatcher.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/PlayerWatcher.java
@@ -9,7 +9,7 @@
 import org.bukkit.entity.Player;
 import xyz.nifeather.morph.backends.server.renderer.network.DisplayParameters;
 import xyz.nifeather.morph.backends.server.renderer.network.registries.CustomEntries;
-import xyz.nifeather.morph.backends.server.renderer.network.registries.RegistryKey;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.CustomEntry;
 import xyz.nifeather.morph.backends.server.renderer.network.registries.ValueIndex;
 import xyz.nifeather.morph.misc.AnimationNames;
 import xyz.nifeather.morph.misc.NmsRecord;
@@ -40,11 +40,11 @@ protected void doSync()
     }
 
     @Override
-    protected <X> void onEntryWrite(RegistryKey<X> key, X oldVal, X newVal)
+    protected <X> void onEntryWrite(CustomEntry<X> entry, X oldVal, X newVal)
     {
-        super.onEntryWrite(key, oldVal, newVal);
+        super.onEntryWrite(entry, oldVal, newVal);
 
-        if (key.equals(CustomEntries.PROFILE) && isPlayerOnline() && !isSilent())
+        if (entry.equals(CustomEntries.PROFILE) && isPlayerOnline() && !isSilent())
         {
             var player = getBindingPlayer();
             var affected = getAffectedPlayers(player);
@@ -66,7 +66,7 @@ protected <X> void onEntryWrite(RegistryKey<X> key, X oldVal, X newVal)
             }
         }
 
-        if (key.equals(CustomEntries.ANIMATION))
+        if (entry.equals(CustomEntries.ANIMATION))
         {
             var animId = newVal + "";
 
diff --git a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/PufferfishWatcher.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/PufferfishWatcher.java
index 374a2856..ced99de7 100644
--- a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/PufferfishWatcher.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/PufferfishWatcher.java
@@ -6,7 +6,7 @@
 import org.bukkit.entity.Player;
 import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values.PufferfishValues;
 import xyz.nifeather.morph.backends.server.renderer.network.registries.CustomEntries;
-import xyz.nifeather.morph.backends.server.renderer.network.registries.RegistryKey;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.CustomEntry;
 import xyz.nifeather.morph.backends.server.renderer.network.registries.ValueIndex;
 import xyz.nifeather.morph.misc.AnimationNames;
 
@@ -26,11 +26,11 @@ protected void initRegistry()
     }
 
     @Override
-    protected <X> void onEntryWrite(RegistryKey<X> key, X oldVal, X newVal)
+    protected <X> void onEntryWrite(CustomEntry<X> entry, X oldVal, X newVal)
     {
-        super.onEntryWrite(key, oldVal, newVal);
+        super.onEntryWrite(entry, oldVal, newVal);
 
-        if (key.equals(CustomEntries.ANIMATION))
+        if (entry.equals(CustomEntries.ANIMATION))
         {
             var animId = newVal.toString();
             var world = getBindingPlayer().getWorld();
diff --git a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/ShulkerWatcher.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/ShulkerWatcher.java
index 54eca71a..e0823b3c 100644
--- a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/ShulkerWatcher.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/ShulkerWatcher.java
@@ -5,7 +5,7 @@
 import org.bukkit.entity.EntityType;
 import org.bukkit.entity.Player;
 import xyz.nifeather.morph.backends.server.renderer.network.registries.CustomEntries;
-import xyz.nifeather.morph.backends.server.renderer.network.registries.RegistryKey;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.CustomEntry;
 import xyz.nifeather.morph.backends.server.renderer.network.registries.ValueIndex;
 import xyz.nifeather.morph.misc.AnimationNames;
 
@@ -25,11 +25,11 @@ protected void initRegistry()
     }
 
     @Override
-    protected <X> void onEntryWrite(RegistryKey<X> key, X oldVal, X newVal)
+    protected <X> void onEntryWrite(CustomEntry<X> entry, X oldVal, X newVal)
     {
-        super.onEntryWrite(key, oldVal, newVal);
+        super.onEntryWrite(entry, oldVal, newVal);
 
-        if (key.equals(CustomEntries.ANIMATION))
+        if (entry.equals(CustomEntries.ANIMATION))
         {
             var animId = newVal.toString();
 
diff --git a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/SnifferWatcher.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/SnifferWatcher.java
index 352d963e..a82f5feb 100644
--- a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/SnifferWatcher.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/SnifferWatcher.java
@@ -6,7 +6,7 @@
 import org.bukkit.entity.EntityType;
 import org.bukkit.entity.Player;
 import xyz.nifeather.morph.backends.server.renderer.network.registries.CustomEntries;
-import xyz.nifeather.morph.backends.server.renderer.network.registries.RegistryKey;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.CustomEntry;
 import xyz.nifeather.morph.backends.server.renderer.network.registries.ValueIndex;
 import xyz.nifeather.morph.misc.AnimationNames;
 
@@ -26,11 +26,11 @@ protected void initRegistry()
     }
 
     @Override
-    protected <X> void onEntryWrite(RegistryKey<X> key, X oldVal, X newVal)
+    protected <X> void onEntryWrite(CustomEntry<X> entry, X oldVal, X newVal)
     {
-        super.onEntryWrite(key, oldVal, newVal);
+        super.onEntryWrite(entry, oldVal, newVal);
 
-        if (key.equals(CustomEntries.ANIMATION))
+        if (entry.equals(CustomEntries.ANIMATION))
         {
             var bindingPlayer = getBindingPlayer();
             var world = bindingPlayer.getWorld();
diff --git a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/WardenWatcher.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/WardenWatcher.java
index 71dfc7be..b9cbfb77 100755
--- a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/WardenWatcher.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/WardenWatcher.java
@@ -12,7 +12,7 @@
 import org.bukkit.entity.Player;
 import xyz.nifeather.morph.backends.server.renderer.network.DisplayParameters;
 import xyz.nifeather.morph.backends.server.renderer.network.registries.CustomEntries;
-import xyz.nifeather.morph.backends.server.renderer.network.registries.RegistryKey;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.CustomEntry;
 import xyz.nifeather.morph.backends.server.renderer.network.registries.ValueIndex;
 import xyz.nifeather.morph.misc.AnimationNames;
 import xyz.nifeather.morph.misc.NmsRecord;
@@ -25,19 +25,19 @@ public WardenWatcher(Player bindingPlayer)
     }
 
     @Override
-    protected <X> void onEntryWrite(RegistryKey<X> key, X oldVal, X newVal)
+    protected <X> void onEntryWrite(CustomEntry<X> entry, X oldVal, X newVal)
     {
-        super.onEntryWrite(key, oldVal, newVal);
+        super.onEntryWrite(entry, oldVal, newVal);
 
         var bindingPlayer = getBindingPlayer();
 
-        if (key.equals(CustomEntries.WARDEN_CHARGING_ATTACK) && Boolean.TRUE.equals(newVal))
+        if (entry.equals(CustomEntries.WARDEN_CHARGING_ATTACK) && Boolean.TRUE.equals(newVal))
         {
             var entity = ((CraftPlayer)bindingPlayer).getHandle();
             sendPacketToAffectedPlayers(PacketContainer.fromPacket(new ClientboundEntityEventPacket(entity, (byte)62)));
         }
 
-        if (key.equals(CustomEntries.ANIMATION))
+        if (entry.equals(CustomEntries.ANIMATION))
         {
             var id = newVal.toString();
             var world = bindingPlayer.getWorld();
diff --git a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/WolfWatcher.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/WolfWatcher.java
index 5f43531e..a295f14d 100644
--- a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/WolfWatcher.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/WolfWatcher.java
@@ -14,7 +14,7 @@
 import org.bukkit.entity.Wolf;
 import xiamomc.pluginbase.Exceptions.NullDependencyException;
 import xyz.nifeather.morph.backends.server.renderer.network.registries.CustomEntries;
-import xyz.nifeather.morph.backends.server.renderer.network.registries.RegistryKey;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.CustomEntry;
 import xyz.nifeather.morph.backends.server.renderer.network.registries.ValueIndex;
 import xyz.nifeather.morph.misc.AnimationNames;
 import xyz.nifeather.morph.misc.disguiseProperty.DisguiseProperties;
@@ -66,11 +66,11 @@ protected <X> void onPropertyWrite(SingleProperty<X> property, X value)
     }
 
     @Override
-    protected <X> void onEntryWrite(RegistryKey<X> key, X oldVal, X newVal)
+    protected <X> void onEntryWrite(CustomEntry<X> entry, X oldVal, X newVal)
     {
-        super.onEntryWrite(key, oldVal, newVal);
+        super.onEntryWrite(entry, oldVal, newVal);
 
-        if (key.equals(CustomEntries.ANIMATION))
+        if (entry.equals(CustomEntries.ANIMATION))
         {
             var animId = newVal.toString();
 
diff --git a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/registries/CustomEntries.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/registries/CustomEntries.java
index ecf4df7b..724de838 100644
--- a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/registries/CustomEntries.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/registries/CustomEntries.java
@@ -11,35 +11,35 @@ public class CustomEntries
     /**
      * This should always present for player disguise!
      */
-    public static final RegistryKey<GameProfile> PROFILE = RegistryKey.of("profile", new GameProfile(UUID.randomUUID(), "sample")).doRequireNonNull();
+    public static final CustomEntry<GameProfile> PROFILE = CustomEntry.of("profile", new GameProfile(UUID.randomUUID(), "sample")).doRequireNonNull();
 
     /**
      * Should profile listed in the tab list?
      * <b></b>
      * Also, 'TRUE' means the profile listing is also handled by external sources
      */
-    public static final RegistryKey<Boolean> PROFILE_LISTED = RegistryKey.of("profile_listed", false);
+    public static final CustomEntry<Boolean> PROFILE_LISTED = CustomEntry.of("profile_listed", false);
 
-    public static final RegistryKey<String> DISGUISE_NAME = RegistryKey.of("disguise_name", "").doRequireNonNull();
+    public static final CustomEntry<String> DISGUISE_NAME = CustomEntry.of("disguise_name", "").doRequireNonNull();
 
-    public static final RegistryKey<DisguiseEquipment> EQUIPMENT = RegistryKey.of("equip", new DisguiseEquipment());
-    public static final RegistryKey<Boolean> DISPLAY_FAKE_EQUIPMENT = RegistryKey.of("display_fake_equip", false);
+    public static final CustomEntry<DisguiseEquipment> EQUIPMENT = CustomEntry.of("equip", new DisguiseEquipment());
+    public static final CustomEntry<Boolean> DISPLAY_FAKE_EQUIPMENT = CustomEntry.of("display_fake_equip", false);
 
     /**
      * @deprecated UUID for player disguise now is {@link CustomEntries#SPAWN_ID}
      */
     @Deprecated(since = "1.2.6", forRemoval = true)
-    public static final RegistryKey<UUID> TABLIST_UUID = RegistryKey.of("tablist_uuid", Util.NIL_UUID);
+    public static final CustomEntry<UUID> TABLIST_UUID = CustomEntry.of("tablist_uuid", Util.NIL_UUID);
 
-    public static final RegistryKey<Boolean> WARDEN_CHARGING_ATTACK = RegistryKey.of("warden_charging_attack", false);
-    public static final RegistryKey<Boolean> ATTACK_ANIMATION = RegistryKey.of("attack_animation", false);
+    public static final CustomEntry<Boolean> WARDEN_CHARGING_ATTACK = CustomEntry.of("warden_charging_attack", false);
+    public static final CustomEntry<Boolean> ATTACK_ANIMATION = CustomEntry.of("attack_animation", false);
 
-    public static final RegistryKey<Integer> SLIME_SIZE_REAL = RegistryKey.of("slime_size_real", 0);
+    public static final CustomEntry<Integer> SLIME_SIZE_REAL = CustomEntry.of("slime_size_real", 0);
 
-    public static final RegistryKey<String> ANIMATION = RegistryKey.of("animation", "morph:unknown");
+    public static final CustomEntry<String> ANIMATION = CustomEntry.of("animation", "morph:unknown");
 
-    public static final RegistryKey<UUID> SPAWN_UUID = RegistryKey.of("spawn_uuid", Util.NIL_UUID);
-    public static final RegistryKey<Integer> SPAWN_ID = RegistryKey.of("spawn_id", -1);
+    public static final CustomEntry<UUID> SPAWN_UUID = CustomEntry.of("spawn_uuid", Util.NIL_UUID);
+    public static final CustomEntry<Integer> SPAWN_ID = CustomEntry.of("spawn_id", -1);
 
-    public static final RegistryKey<Boolean> VANISHED = RegistryKey.of("vanished", false);
+    public static final CustomEntry<Boolean> VANISHED = CustomEntry.of("vanished", false);
 }
diff --git a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/registries/RegistryKey.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/registries/CustomEntry.java
similarity index 68%
rename from src/main/java/xyz/nifeather/morph/backends/server/renderer/network/registries/RegistryKey.java
rename to src/main/java/xyz/nifeather/morph/backends/server/renderer/network/registries/CustomEntry.java
index 52c241a8..a3dd7487 100644
--- a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/registries/RegistryKey.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/registries/CustomEntry.java
@@ -1,6 +1,6 @@
 package xyz.nifeather.morph.backends.server.renderer.network.registries;
 
-public class RegistryKey<T>
+public class CustomEntry<T>
 {
     public final Class<T> type;
     public final String name;
@@ -12,21 +12,21 @@ public boolean requireNonNull()
         return requireNonNull;
     }
 
-    public RegistryKey<T> doRequireNonNull()
+    public CustomEntry<T> doRequireNonNull()
     {
         this.requireNonNull = true;
         return this;
     }
 
-    public RegistryKey(String name, Class<T> type)
+    public CustomEntry(String name, Class<T> type)
     {
         this.name = name;
         this.type = type;
     }
 
-    public static <X> RegistryKey<X> of(String name, X val)
+    public static <X> CustomEntry<X> of(String name, X val)
     {
-        return new RegistryKey<>(name, (Class<X>)val.getClass());
+        return new CustomEntry<>(name, (Class<X>)val.getClass());
     }
 
     @Override
@@ -39,7 +39,7 @@ public String toString()
     public boolean equals(Object obj)
     {
         if (this == obj) return true;
-        if (!(obj instanceof RegistryKey<?> other)) return false;
+        if (!(obj instanceof CustomEntry<?> other)) return false;
 
         return other.name.equals(this.name);
     }

From f1b341a11f626e8a99f0f158894d69dcd746dec9 Mon Sep 17 00:00:00 2001
From: MATRIX-feather <midnightcarnival@outlook.com>
Date: Thu, 10 Oct 2024 14:03:19 +0800
Subject: [PATCH 08/28] creeper

---
 .../watchers/types/CreeperWatcher.java          | 17 +++++++++++++++++
 .../disguiseProperty/DisguiseProperties.java    |  1 +
 .../values/CreeperProperties.java               | 13 +++++++++++++
 3 files changed, 31 insertions(+)
 create mode 100644 src/main/java/xyz/nifeather/morph/misc/disguiseProperty/values/CreeperProperties.java

diff --git a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/CreeperWatcher.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/CreeperWatcher.java
index 1684f46a..9a8e445c 100644
--- a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/CreeperWatcher.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/CreeperWatcher.java
@@ -4,6 +4,9 @@
 import org.bukkit.entity.EntityType;
 import org.bukkit.entity.Player;
 import xyz.nifeather.morph.backends.server.renderer.network.registries.ValueIndex;
+import xyz.nifeather.morph.misc.disguiseProperty.DisguiseProperties;
+import xyz.nifeather.morph.misc.disguiseProperty.SingleProperty;
+import xyz.nifeather.morph.misc.disguiseProperty.values.CreeperProperties;
 
 public class CreeperWatcher extends LivingEntityWatcher
 {
@@ -20,6 +23,20 @@ protected void initRegistry()
         register(ValueIndex.CREEPER);
     }
 
+    @Override
+    protected <X> void onPropertyWrite(SingleProperty<X> property, X value)
+    {
+        var properties = DisguiseProperties.INSTANCE.getOrThrow(CreeperProperties.class);
+
+        if (property.equals(properties.CHARGED))
+        {
+            var isCharged = Boolean.TRUE.equals(value);
+            this.writePersistent(ValueIndex.CREEPER.IS_CHARGED_CREEPER, isCharged);
+        }
+
+        super.onPropertyWrite(property, value);
+    }
+
     @Override
     public void mergeFromCompound(CompoundTag nbt)
     {
diff --git a/src/main/java/xyz/nifeather/morph/misc/disguiseProperty/DisguiseProperties.java b/src/main/java/xyz/nifeather/morph/misc/disguiseProperty/DisguiseProperties.java
index 6aaf728e..555280fe 100644
--- a/src/main/java/xyz/nifeather/morph/misc/disguiseProperty/DisguiseProperties.java
+++ b/src/main/java/xyz/nifeather/morph/misc/disguiseProperty/DisguiseProperties.java
@@ -34,6 +34,7 @@ public DisguiseProperties()
         register(EntityType.VILLAGER, new VillagerProperties());
         register(EntityType.ZOMBIE_VILLAGER, new VillagerProperties());
         register(EntityType.ARMOR_STAND, new ArmorStandProperties());
+        register(EntityType.CREEPER, new CreeperProperties());
     }
 
     public void register(EntityType type, AbstractProperties properties)
diff --git a/src/main/java/xyz/nifeather/morph/misc/disguiseProperty/values/CreeperProperties.java b/src/main/java/xyz/nifeather/morph/misc/disguiseProperty/values/CreeperProperties.java
new file mode 100644
index 00000000..f8a9bc8e
--- /dev/null
+++ b/src/main/java/xyz/nifeather/morph/misc/disguiseProperty/values/CreeperProperties.java
@@ -0,0 +1,13 @@
+package xyz.nifeather.morph.misc.disguiseProperty.values;
+
+import xyz.nifeather.morph.misc.disguiseProperty.SingleProperty;
+
+public class CreeperProperties extends AbstractProperties
+{
+    public final SingleProperty<Boolean> CHARGED = getSingle("charged", false).withRandom(false, false, false, true);
+
+    public CreeperProperties()
+    {
+        registerSingle(CHARGED);
+    }
+}

From 87b6f209b0840717144a602de580dbb5e6687665 Mon Sep 17 00:00:00 2001
From: MATRIX-feather <midnightcarnival@outlook.com>
Date: Thu, 10 Oct 2024 16:51:20 +0800
Subject: [PATCH 09/28] =?UTF-8?q?misc:=20=E4=BD=BF=E5=8A=A8=E4=BD=9C?=
 =?UTF-8?q?=E9=80=89=E6=8B=A9=E7=95=8C=E9=9D=A2=E7=9A=84=E7=89=A9=E5=93=81?=
 =?UTF-8?q?=E6=94=AF=E6=8C=81Minimessage=EF=BC=8C=E5=B9=B6=E8=A1=A5?=
 =?UTF-8?q?=E9=BD=90=E7=95=8C=E9=9D=A2=E4=B8=AD=E7=9A=84=E7=A9=BA=E4=BD=8D?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../morph/messages/EmoteStrings.java          |  7 ++-
 .../morph/messages/MessageUtils.java          |  9 +++
 .../nifeather/morph/misc/DisguiseState.java   |  2 +-
 .../misc/gui/AnimSelectScreenWrapper.java     | 60 +++++++++++++++----
 .../morph/misc/gui/ScreenWrapper.java         |  3 +
 .../providers/animation/AnimationSet.java     |  2 +-
 .../assets/feathermorph/lang/en_us.json       |  1 +
 .../assets/feathermorph/lang/zh_cn.json       |  1 +
 8 files changed, 69 insertions(+), 16 deletions(-)

diff --git a/src/main/java/xyz/nifeather/morph/messages/EmoteStrings.java b/src/main/java/xyz/nifeather/morph/messages/EmoteStrings.java
index e654ce07..f0795583 100644
--- a/src/main/java/xyz/nifeather/morph/messages/EmoteStrings.java
+++ b/src/main/java/xyz/nifeather/morph/messages/EmoteStrings.java
@@ -1,5 +1,6 @@
 package xyz.nifeather.morph.messages;
 
+import org.jetbrains.annotations.NotNull;
 import xyz.nifeather.morph.MorphPlugin;
 import xiamomc.pluginbase.Messages.FormattableMessage;
 
@@ -12,6 +13,10 @@ public static FormattableMessage notAvailable()
     {
         return getFormattable(getKey("not_available"), "当前不能使用动作");
     }
+    public static FormattableMessage none()
+    {
+        return getFormattable(getKey("none"), "<gray>[Fallback] 无");
+    }
 
     private static final Map<String, FormattableMessage> map = new ConcurrentHashMap<>();
 
@@ -28,7 +33,7 @@ public static FormattableMessage Unknown()
         return getFormattable("unknown", "animation:unknown");
     }
 
-    public static FormattableMessage get(String animationId)
+    public static FormattableMessage get(@NotNull String animationId)
     {
         var value = map.getOrDefault(animationId, Unknown());
 
diff --git a/src/main/java/xyz/nifeather/morph/messages/MessageUtils.java b/src/main/java/xyz/nifeather/morph/messages/MessageUtils.java
index 3419f2bf..f40a9ce4 100644
--- a/src/main/java/xyz/nifeather/morph/messages/MessageUtils.java
+++ b/src/main/java/xyz/nifeather/morph/messages/MessageUtils.java
@@ -1,6 +1,7 @@
 package xyz.nifeather.morph.messages;
 
 import net.kyori.adventure.text.Component;
+import net.kyori.adventure.text.minimessage.MiniMessage;
 import org.bukkit.command.CommandSender;
 import org.bukkit.entity.Player;
 import org.jetbrains.annotations.NotNull;
@@ -129,4 +130,12 @@ public static String getLocale(CommandSender sender)
         else
             return getServerLocale();
     }
+
+    public static String asParsedMiniMessageString(String locale, FormattableMessage formattable)
+    {
+        if (formattable.getLocale() == null)
+            formattable.withLocale(locale);
+
+        return MiniMessage.miniMessage().serialize(formattable.toComponent());
+    }
 }
diff --git a/src/main/java/xyz/nifeather/morph/misc/DisguiseState.java b/src/main/java/xyz/nifeather/morph/misc/DisguiseState.java
index f9781731..87796ab0 100644
--- a/src/main/java/xyz/nifeather/morph/misc/DisguiseState.java
+++ b/src/main/java/xyz/nifeather/morph/misc/DisguiseState.java
@@ -227,7 +227,7 @@ public boolean canScheduleSequence()
     /**
      * @return Whether success.
      */
-    public boolean tryScheduleSequence(String sequenceIdentifier,
+    public boolean tryScheduleSequence(@NotNull String sequenceIdentifier,
                                        List<SingleAnimation> sequence,
                                        boolean persistent)
     {
diff --git a/src/main/java/xyz/nifeather/morph/misc/gui/AnimSelectScreenWrapper.java b/src/main/java/xyz/nifeather/morph/misc/gui/AnimSelectScreenWrapper.java
index 588e7146..b6ba1c4b 100644
--- a/src/main/java/xyz/nifeather/morph/misc/gui/AnimSelectScreenWrapper.java
+++ b/src/main/java/xyz/nifeather/morph/misc/gui/AnimSelectScreenWrapper.java
@@ -3,22 +3,39 @@
 import de.themoep.inventorygui.DynamicGuiElement;
 import de.themoep.inventorygui.InventoryGui;
 import de.themoep.inventorygui.StaticGuiElement;
+import io.papermc.paper.adventure.providers.MiniMessageProviderImpl;
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
+import net.kyori.adventure.text.Component;
+import net.kyori.adventure.text.minimessage.MiniMessage;
+import net.kyori.adventure.text.serializer.ansi.ANSIComponentSerializer;
+import net.kyori.adventure.text.serializer.json.JSONComponentSerializer;
 import org.bukkit.Material;
 import org.bukkit.block.data.Levelled;
 import org.bukkit.inventory.ItemRarity;
 import org.bukkit.inventory.ItemStack;
 import org.bukkit.inventory.meta.BlockDataMeta;
+import org.jetbrains.annotations.Nullable;
 import xiamomc.pluginbase.Bindables.BindableList;
 import xyz.nifeather.morph.messages.EmoteStrings;
 import xyz.nifeather.morph.messages.GuiStrings;
+import xyz.nifeather.morph.messages.MessageUtils;
 import xyz.nifeather.morph.messages.MorphStrings;
 import xyz.nifeather.morph.misc.DisguiseState;
 
 import java.util.List;
+import java.util.function.Consumer;
 
 public class AnimSelectScreenWrapper extends ScreenWrapper
 {
+    /*
+    // 如果要启用这个,记得手动设置 capacity
+    private final BindableList<String> pattern = new BindableList<>(
+            List.of(
+                    " " + getCurrentIndexChar(0) + " ",
+                    getCurrentIndexChar(3) + "E" + getCurrentIndexChar(1),
+                    " " + getCurrentIndexChar(2) + " "
+    ));*/
+
     private final BindableList<String> pattern = new BindableList<>(List.of(
             "XXXXE"
     ));
@@ -98,22 +115,32 @@ private InventoryGui preparePage()
             capacity += lineCapacity;
         }
 
-        return new InventoryGui(plugin, GuiStrings.selectAnimation().toString(playerLocale), rows.toArray(new String[]{}));
+        var gui = new InventoryGui(plugin,
+                GuiStrings.selectAnimation().toString(playerLocale),
+                rows.toArray(new String[]{}));
+
+        gui.setItemNameSetter((meta, string) -> meta.itemName(defaultMiniMessage.deserialize(string)));
+
+        return gui;
     }
 
     private void initElements(InventoryGui gui)
     {
-        var actionItemBase = IconLookup.instance().lookup(state.getDisguiseIdentifier()); //new ItemStack(Material.LIGHT);
+        var defaultIcon = IconLookup.instance().lookup(state.getDisguiseIdentifier()); //new ItemStack(Material.LIGHT);
 
         if (IconLookup.instance().lookup(state.getDisguiseIdentifier()).getType() == Material.PLAYER_HEAD)
             this.isDynamic.set(true);
 
-        for (int i = 0; i < Math.min(capacity, availableSequences.size()); i++)
+        for (int i = 0; i < capacity; i++)
         {
+            @Nullable
+            var sequenceId = i >= availableSequences.size() ? null : availableSequences.get(i);
+
             var guiChar = this.getCurrentIndexChar(i);
-            var itemClone = actionItemBase.clone();
+            var icon = sequenceId == null ? new ItemStack(Material.GRAY_STAINED_GLASS_PANE) : defaultIcon.clone();
             int finalIndex = i;
-            itemClone.editMeta(meta ->
+
+            icon.editMeta(meta ->
             {
                 meta.setRarity(ItemRarity.COMMON);
 
@@ -126,12 +153,18 @@ private void initElements(InventoryGui gui)
                 }
             });
 
-            var sequenceId = availableSequences.get(i);
+            // String(Raw) -> Component(Parsed) -> String(Parsed MiniMessage format) -> Component(Parsed again)
+            // So terrible, couldn't we just use Component instead String to set the item name?
+            Component sequenceDisplayNameComponent = sequenceId == null
+                    ? EmoteStrings.none().toComponent(playerLocale)
+                    : EmoteStrings.get(sequenceId).toComponent(playerLocale);
 
-            var sequenceDisplayName = EmoteStrings.get(sequenceId).withLocale(playerLocale).toString();
+            String sequenceDisplayName = defaultMiniMessage.serialize(sequenceDisplayNameComponent);
 
-            var element = new StaticGuiElement(guiChar, itemClone, 1 + i, click ->
+            var element = new StaticGuiElement(guiChar, icon, 1 + i, click ->
             {
+                if (sequenceId == null) return true;
+
                 var animationSet = state.getProvider()
                         .getAnimationProvider()
                         .getAnimationSetFor(state.getDisguiseIdentifier());
@@ -141,9 +174,10 @@ private void initElements(InventoryGui gui)
                 getBindingPlayer().playSound(clickSound);
                 state.tryScheduleSequence(sequenceId, sequencePair.left(), sequencePair.right());
                 guiInstance.close();
+
                 return true;
             },
-            "§r" + sequenceDisplayName);
+            "<italic:false>" + sequenceDisplayName);
 
             gui.addElement(element);
         }
@@ -152,9 +186,9 @@ private void initElements(InventoryGui gui)
                 new ItemStack(Material.PINK_STAINED_GLASS_PANE),
                 1,
                 click -> true,
-                "§r"));
+                "<italic:false>"));
 
-        var closeElementItem = new ItemStack(Material.BARRIER);
+        var closeElementItem = new ItemStack(Material.MAGENTA_GLAZED_TERRACOTTA);
         closeElementItem.editMeta(meta -> meta.setRarity(ItemRarity.COMMON));
 
         gui.addElement(new StaticGuiElement('E',
@@ -166,13 +200,13 @@ private void initElements(InventoryGui gui)
                     guiInstance.close();
                     return true;
                 },
-                "§r" + GuiStrings.close().toString(playerLocale)));
+                "<italic:false>" + GuiStrings.close().toString(playerLocale)));
 
         var disguiseElement = new StaticGuiElement('D',
                 IconLookup.instance().lookup(state.getDisguiseIdentifier()),
                 1,
                 click -> true,
-                "§r" + MorphStrings.disguisingAsString().resolve("what", state.getPlayerDisplay())
+                "<italic:false>" + MorphStrings.disguisingAsString().resolve("what", state.getPlayerDisplay())
                         .toString(playerLocale));
 
         if (isDynamic.get())
diff --git a/src/main/java/xyz/nifeather/morph/misc/gui/ScreenWrapper.java b/src/main/java/xyz/nifeather/morph/misc/gui/ScreenWrapper.java
index 26f3d3f6..48f5fa19 100644
--- a/src/main/java/xyz/nifeather/morph/misc/gui/ScreenWrapper.java
+++ b/src/main/java/xyz/nifeather/morph/misc/gui/ScreenWrapper.java
@@ -3,6 +3,7 @@
 import de.themoep.inventorygui.InventoryGui;
 import net.kyori.adventure.key.Key;
 import net.kyori.adventure.sound.Sound;
+import net.kyori.adventure.text.minimessage.MiniMessage;
 import org.bukkit.entity.Player;
 import xiamomc.pluginbase.Bindables.Bindable;
 import xiamomc.pluginbase.ScheduleInfo;
@@ -20,6 +21,8 @@ public class ScreenWrapper extends MorphPluginObject
     public static final Sound clickSound = Sound.sound().type(Key.key("ui.button.click")).volume(0.45f).build();
     public static final Sound openSound = Sound.sound().type(Key.key("entity.experience_orb.pickup")).volume(0.55f).build();
 
+    protected static final MiniMessage defaultMiniMessage = MiniMessage.miniMessage();
+
     protected Player getBindingPlayer()
     {
         return bindingPlayer;
diff --git a/src/main/java/xyz/nifeather/morph/providers/animation/AnimationSet.java b/src/main/java/xyz/nifeather/morph/providers/animation/AnimationSet.java
index 5e257460..6d0dbfdd 100644
--- a/src/main/java/xyz/nifeather/morph/providers/animation/AnimationSet.java
+++ b/src/main/java/xyz/nifeather/morph/providers/animation/AnimationSet.java
@@ -67,7 +67,7 @@ protected void register(String sequenceID, List<SingleAnimation> sequence, boole
      * @return A pair, left is the sequence, right is whether the sequence is persistent
      */
     @NotNull
-    public Pair<List<SingleAnimation>, Boolean> sequenceOf(String animationId)
+    public Pair<List<SingleAnimation>, Boolean> sequenceOf(@NotNull String animationId)
     {
         return animationMap.getOrDefault(animationId, Pair.of(List.of(), false));
     }
diff --git a/src/main/resources/assets/feathermorph/lang/en_us.json b/src/main/resources/assets/feathermorph/lang/en_us.json
index 03b4b86b..dc9cfa21 100644
--- a/src/main/resources/assets/feathermorph/lang/en_us.json
+++ b/src/main/resources/assets/feathermorph/lang/en_us.json
@@ -222,6 +222,7 @@
   "emote.morphclient.crawl": "Crawl",
   "emote.morphclient.digdown": "Dig Down",
   "emote.morphclient.appear": "Appear",
+  "emote.morphclient.none": "<gray>None</gray>",
   "emote.morphclient.not_available": "Can't play action while the skill is still in cooldown",
   "emote.morphclient.unknown": "Unknown",
   "chestui.next_page": "Next page",
diff --git a/src/main/resources/assets/feathermorph/lang/zh_cn.json b/src/main/resources/assets/feathermorph/lang/zh_cn.json
index 0f0f8d6a..29f5df98 100644
--- a/src/main/resources/assets/feathermorph/lang/zh_cn.json
+++ b/src/main/resources/assets/feathermorph/lang/zh_cn.json
@@ -222,6 +222,7 @@
   "emote.morphclient.crawl": "趴下",
   "emote.morphclient.digdown": "掘地",
   "emote.morphclient.appear": "出现",
+  "emote.morphclient.none": "<gray>无</gray>",
   "emote.morphclient.not_available": "技能冷却时不能播放动作",
   "emote.morphclient.unknown": "未知",
   "chestui.next_page": "下一页",

From 9db780bd79469184b4b77657fc0affc83fd87c0d Mon Sep 17 00:00:00 2001
From: MATRIX-feather <midnightcarnival@outlook.com>
Date: Fri, 11 Oct 2024 21:41:28 +0800
Subject: [PATCH 10/28] =?UTF-8?q?enhance:=20=E6=94=B9=E8=BF=9B=E6=8A=80?=
 =?UTF-8?q?=E8=83=BD=E5=AD=98=E5=82=A8=20=20=20=20=20-=20=E5=B0=86?=
 =?UTF-8?q?=E9=85=8D=E7=BD=AE=E6=A0=B9=E6=8D=AE=E4=BC=AA=E8=A3=85ID?=
 =?UTF-8?q?=E5=88=86=E4=B8=BA=E4=B8=8D=E5=90=8C=E7=9A=84=E5=B0=8F=E6=96=87?=
 =?UTF-8?q?=E4=BB=B6=E5=AD=98=E5=82=A8=EF=BC=8C=E5=B0=B1=E5=83=8F=E5=9F=BA?=
 =?UTF-8?q?=E5=B2=A9=E7=89=88=E7=9A=84=E8=A1=8C=E4=B8=BA=E5=8C=85=E9=82=A3?=
 =?UTF-8?q?=E6=A0=B7?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../xyz/nifeather/morph/MorphManager.java     |   4 +-
 .../java/xyz/nifeather/morph/MorphPlugin.java |   4 +-
 .../morph/abilities/AbilityManager.java       | 112 +++--
 .../morph/abilities/AbilityUpdater.java       |  28 +-
 .../morph/abilities/IMorphAbility.java        |  30 +-
 .../morph/abilities/MorphAbility.java         |  26 +-
 .../morph/abilities/impl/FlyAbility.java      |  10 +-
 .../subcommands/plugin/ReloadSubCommand.java  |  10 +-
 .../disguise/DefaultDisguiseProvider.java     |   6 +-
 .../morph/skills/DefaultConfigGenerator.java  |  33 +-
 .../morph/skills/MorphSkillHandler.java       |  64 +--
 .../impl/LaunchProjectileMorphSkill.java      |   2 +-
 .../morph/skills/impl/NoneMorphSkill.java     |   2 +-
 .../storage/DirectoryJsonBasedStorage.java    | 158 +++++++
 .../morph/storage/DirectoryStorage.java       |  41 +-
 .../storage/skill/IAbilityConfigLookup.java   |  11 +
 .../skill/SkillAbilityConfiguration.java      |  65 +--
 .../skill/SkillAbilityConfigurationStore.java | 395 ------------------
 .../skill/SkillsConfigurationStoreNew.java    | 176 ++++++++
 19 files changed, 546 insertions(+), 631 deletions(-)
 create mode 100644 src/main/java/xyz/nifeather/morph/storage/DirectoryJsonBasedStorage.java
 create mode 100644 src/main/java/xyz/nifeather/morph/storage/skill/IAbilityConfigLookup.java
 delete mode 100644 src/main/java/xyz/nifeather/morph/storage/skill/SkillAbilityConfigurationStore.java
 create mode 100644 src/main/java/xyz/nifeather/morph/storage/skill/SkillsConfigurationStoreNew.java

diff --git a/src/main/java/xyz/nifeather/morph/MorphManager.java b/src/main/java/xyz/nifeather/morph/MorphManager.java
index 2c8b89a2..54aaa3c8 100644
--- a/src/main/java/xyz/nifeather/morph/MorphManager.java
+++ b/src/main/java/xyz/nifeather/morph/MorphManager.java
@@ -15,6 +15,8 @@
 import org.jetbrains.annotations.ApiStatus;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
+import xyz.nifeather.morph.abilities.AbilityManager;
+import xyz.nifeather.morph.abilities.MorphAbility;
 import xyz.nifeather.morph.backends.DisguiseBackend;
 import xyz.nifeather.morph.backends.DisguiseWrapper;
 import xyz.nifeather.morph.backends.WrapperAttribute;
@@ -884,7 +886,7 @@ private DisguiseBuildResult buildDisguise(MorphParameters parameters, DisguiseMe
     }
 
     @Resolved
-    private VanillaMessageStore vanillaMessageStore;
+    private AbilityManager abilityManager;
 
     private void postBuildDisguise(DisguiseBuildResult result,
                                    MorphParameters parameters,
diff --git a/src/main/java/xyz/nifeather/morph/MorphPlugin.java b/src/main/java/xyz/nifeather/morph/MorphPlugin.java
index 3c70b091..3677f7cf 100644
--- a/src/main/java/xyz/nifeather/morph/MorphPlugin.java
+++ b/src/main/java/xyz/nifeather/morph/MorphPlugin.java
@@ -29,7 +29,7 @@
 import xyz.nifeather.morph.network.multiInstance.MultiInstanceService;
 import xyz.nifeather.morph.network.server.MorphClientHandler;
 import xyz.nifeather.morph.skills.MorphSkillHandler;
-import xyz.nifeather.morph.storage.skill.SkillAbilityConfigurationStore;
+import xyz.nifeather.morph.storage.skill.SkillsConfigurationStoreNew;
 import xyz.nifeather.morph.transforms.Transformer;
 import xyz.nifeather.morph.updates.UpdateHandler;
 import xiamomc.pluginbase.Command.CommandHelper;
@@ -219,7 +219,7 @@ public void onEnable()
 
         dependencyManager.cache(cmdHelper = new MorphCommandManager());
 
-        dependencyManager.cache(new SkillAbilityConfigurationStore());
+        dependencyManager.cache(new SkillsConfigurationStoreNew());
 
         dependencyManager.cache(new MessageUtils());
 
diff --git a/src/main/java/xyz/nifeather/morph/abilities/AbilityManager.java b/src/main/java/xyz/nifeather/morph/abilities/AbilityManager.java
index e3010973..4c677698 100644
--- a/src/main/java/xyz/nifeather/morph/abilities/AbilityManager.java
+++ b/src/main/java/xyz/nifeather/morph/abilities/AbilityManager.java
@@ -14,13 +14,14 @@
 import xyz.nifeather.morph.abilities.impl.onAttack.ExtraKnockbackAbility;
 import xyz.nifeather.morph.abilities.impl.onAttack.PotionOnAttackAbility;
 import xyz.nifeather.morph.events.api.lifecycle.AbilitiesFinishedInitializeEvent;
-import xyz.nifeather.morph.storage.skill.SkillAbilityConfiguration;
-import xyz.nifeather.morph.storage.skill.SkillAbilityConfigurationStore;
+import xyz.nifeather.morph.storage.skill.ISkillOption;
 import xiamomc.pluginbase.Annotations.Initializer;
 import xiamomc.pluginbase.Annotations.Resolved;
+import xyz.nifeather.morph.storage.skill.SkillsConfigurationStoreNew;
 
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.atomic.AtomicBoolean;
 
 public class AbilityManager extends MorphPluginObject
@@ -28,9 +29,7 @@ public class AbilityManager extends MorphPluginObject
     private final List<IMorphAbility<?>> registedAbilities = new ObjectArrayList<>();
 
     @Resolved
-    private SkillAbilityConfigurationStore store;
-
-    private boolean initalizeDone;
+    private SkillsConfigurationStoreNew store;
 
     /**
      * 注册一个被动技能
@@ -50,32 +49,6 @@ public boolean registerAbility(IMorphAbility<?> ability)
 
         registedAbilities.add(ability);
 
-        //SkillConfigurationStore只会在重载时给已经注册的被动添加设置
-        //所有在重载/初始化完成后加入的技能都需要我们手动查询
-        if (initalizeDone)
-        {
-            //添加设置
-            store.getConfiguredSkills().forEach((configuration, skill) ->
-            {
-                if (!ability.setOptionGeneric(configuration.getIdentifier(), configuration.getAbilityOptions(ability)))
-                {
-                    logger.warn("Unable to initialize skill configuration for " + configuration.getIdentifier() + " -> " + ability.getIdentifier());
-                }
-            });
-
-            //添加到map中所有符合条件的技能配置里
-            var id = ability.getIdentifier().asString();
-            var matchingConfigs = configToAbilitiesMap.entrySet()
-                    .stream().filter(e -> e.getKey().getAbilitiyIdentifiers().contains(id)).toList();
-
-            matchingConfigs.forEach(c ->
-            {
-                var list = configToAbilitiesMap.get(c.getKey());
-
-                if (!list.contains(ability)) list.add(ability);
-            });
-        }
-
         Bukkit.getPluginManager().registerEvents(ability, plugin);
         return true;
     }
@@ -140,52 +113,84 @@ private void load()
                 new SpiderAbility()
         ));
 
-        initalizeDone = true;
-
         Bukkit.getPluginManager().callEvent(new AbilitiesFinishedInitializeEvent(this));
     }
 
+    @NotNull
+    public Map<NamespacedKey, ISkillOption> getOptionsFor(String disguiseIdentifier)
+    {
+        var configuration = store.get(disguiseIdentifier);
+        if (configuration == null) return new Object2ObjectOpenHashMap<>();
+
+        Map<NamespacedKey, ISkillOption> optionMap = new ConcurrentHashMap<>();
+        configuration.getAbilitiyIdentifiers().forEach(a ->
+        {
+            var idKey = NamespacedKey.fromString(a);
+
+            if (idKey == null)
+            {
+                logger.warn("Invalid ability ID: %s".formatted(a));
+                return;
+            }
+
+            var abilityInstance = this.getAbility(idKey);
+            if (abilityInstance == null) return;
+
+            optionMap.put(idKey, configuration.getAbilityOptions(abilityInstance));
+        });
+
+        return optionMap;
+    }
+
     @Nullable
-    public IMorphAbility<?> getAbility(@Nullable NamespacedKey key)
+    public IMorphAbility<?> getAbility(@Nullable NamespacedKey abilityIdentifier)
     {
-        if (key == null) return null;
+        if (abilityIdentifier == null) return null;
 
         var val = registedAbilities.stream()
-                .filter(a -> a.getIdentifier().equals(key)).findFirst().orElse(null);
+                .filter(a -> a.getIdentifier().equals(abilityIdentifier)).findFirst().orElse(null);
 
         if (val == null)
-            logger.warn("Unknown ability: " + key.asString());
+            logger.warn("Unknown ability: " + abilityIdentifier.asString());
 
         return val;
     }
 
-    private final Map<SkillAbilityConfiguration, List<IMorphAbility<?>>> configToAbilitiesMap = new Object2ObjectOpenHashMap<>();
-
     /**
      * 为某个伪装ID获取被动技能
      *
-     * @param id 伪装ID
+     * @param disguiseIdentifier 伪装ID
      * @return 被动技能列表
      */
     @NotNull
-    public List<IMorphAbility<?>> getAbilitiesFor(String id)
+    public List<IMorphAbility<?>> getAbilitiesFor(String disguiseIdentifier)
     {
-        return this.getAbilitiesFor(id, false);
+        return this.getAbilitiesFor(disguiseIdentifier, false);
     }
 
+    /**
+     * @param disguiseIdentifier 目标伪装
+     * @param noFallback 是否要搜索命名空间的默认配置
+     */
     @NotNull
-    public List<IMorphAbility<?>> getAbilitiesFor(String id, boolean noFallback)
+    public List<IMorphAbility<?>> getAbilitiesFor(String disguiseIdentifier, boolean noFallback)
     {
-        var entry = configToAbilitiesMap.entrySet().stream()
-                .filter(s -> s.getKey().getIdentifier().equals(id)).findFirst().orElse(null);
+        var configuration = store.get(disguiseIdentifier);
 
-        if (entry != null)
+        if (configuration != null)
         {
-            return entry.getValue();
+            List<IMorphAbility<?>> abilities = new ObjectArrayList<>();
+            configuration.getAbilitiyIdentifiers().forEach(id ->
+            {
+                var instance = this.getAbility(NamespacedKey.fromString(id));
+                if (instance != null) abilities.add(instance);
+            });
+
+            return abilities;
         }
         else if (!noFallback)
         {
-            var idSpilt = id.split(":", 2);
+            var idSpilt = disguiseIdentifier.split(":", 2);
             if (idSpilt.length < 1) return List.of();
 
             var idNew = idSpilt[0] + ":" + MorphManager.disguiseFallbackName;
@@ -195,15 +200,4 @@ else if (!noFallback)
 
         return List.of();
     }
-
-    public void setAbilities(SkillAbilityConfiguration configuration, List<IMorphAbility<?>> abilities)
-    {
-        configToAbilitiesMap.put(configuration, abilities);
-    }
-
-    public void clearAbilities()
-    {
-        configToAbilitiesMap.clear();
-        registedAbilities.forEach(IMorphAbility::clearOptions);
-    }
 }
diff --git a/src/main/java/xyz/nifeather/morph/abilities/AbilityUpdater.java b/src/main/java/xyz/nifeather/morph/abilities/AbilityUpdater.java
index c6a3dc9f..b03c34c6 100644
--- a/src/main/java/xyz/nifeather/morph/abilities/AbilityUpdater.java
+++ b/src/main/java/xyz/nifeather/morph/abilities/AbilityUpdater.java
@@ -13,15 +13,18 @@
 import xyz.nifeather.morph.config.MorphConfigManager;
 import xyz.nifeather.morph.misc.DisguiseState;
 import xyz.nifeather.morph.misc.permissions.CommonPermissions;
+import xyz.nifeather.morph.storage.skill.IAbilityConfigLookup;
 import xyz.nifeather.morph.utilities.PermissionUtils;
 import xiamomc.pluginbase.Annotations.Initializer;
 import xiamomc.pluginbase.Bindables.Bindable;
 
 import java.util.Arrays;
 import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
 import java.util.stream.Collectors;
 
-public class AbilityUpdater extends MorphPluginObject
+public class AbilityUpdater extends MorphPluginObject implements IAbilityConfigLookup
 {
     @NotNull
     private final DisguiseState parentState;
@@ -255,4 +258,27 @@ public static boolean hasPermissionFor(IMorphAbility<?> ability, DisguiseState s
         var singleAbilityPerm = CommonPermissions.abilityPermissionOf(ability.getIdentifier().asString(), state.getDisguiseIdentifier());
         return PermissionUtils.hasPermission(state.getPlayer(), singleAbilityPerm, true);
     }
+
+    //region IAbilityConfigLookup
+
+    private final Map<String, Object> abilityConfigMap = new ConcurrentHashMap<>();
+
+    @Override
+    @Nullable
+    public <X> X lookupAbilityConfig(String identifier, Class<X> expectedClass)
+    {
+        var val = abilityConfigMap.getOrDefault(identifier, null);
+        if (val == null) return null;
+
+        if (expectedClass.isInstance(val)) return (X) val;
+        else return null;
+    }
+
+    @Override
+    public void setAbilityConfig(String identifier, Object config)
+    {
+        abilityConfigMap.put(identifier, config);
+    }
+
+    //endregion IAbilityConfigLookup
 }
diff --git a/src/main/java/xyz/nifeather/morph/abilities/IMorphAbility.java b/src/main/java/xyz/nifeather/morph/abilities/IMorphAbility.java
index 6a824ec9..4e9817a7 100644
--- a/src/main/java/xyz/nifeather/morph/abilities/IMorphAbility.java
+++ b/src/main/java/xyz/nifeather/morph/abilities/IMorphAbility.java
@@ -6,7 +6,6 @@
 import org.jetbrains.annotations.ApiStatus;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
-import org.slf4j.LoggerFactory;
 import xyz.nifeather.morph.misc.DisguiseState;
 import xyz.nifeather.morph.storage.skill.ISkillOption;
 
@@ -81,36 +80,27 @@ public default boolean handle(Player player, DisguiseState state)
      *
      * @return 操作是否成功
      */
-    public boolean setOption(@NotNull String disguiseIdentifier, @Nullable T option);
+    public default boolean setOption(@NotNull String disguiseIdentifier, @Nullable T option)
+    {
+        return false;
+    }
 
     /**
      * @apiNote 内部轮子
      * @return option是否可以cast为目标option,为null则返回true并略过,反之返回setOption的结果
      */
+    @Deprecated(forRemoval = true)
     @ApiStatus.Internal
     public default boolean setOptionGeneric(String disguiseIdentifier, ISkillOption option)
     {
-        T castedOption;
-
-        if (option == null)
-            return true;
-
-        try
-        {
-            castedOption = (T) option;
-        }
-        catch (ClassCastException e)
-        {
-            LoggerFactory.getLogger("morph").error("添加设置时出现问题: " + e.getMessage());
-            e.printStackTrace();
-            return false;
-        }
-
-        return setOption(disguiseIdentifier, castedOption);
+        return false;
     }
 
     /**
      * 清除此被动的所有设置
      */
-    public void clearOptions();
+    @Deprecated(forRemoval = true)
+    public default void clearOptions()
+    {
+    }
 }
diff --git a/src/main/java/xyz/nifeather/morph/abilities/MorphAbility.java b/src/main/java/xyz/nifeather/morph/abilities/MorphAbility.java
index e5ab6aa8..76ae913d 100644
--- a/src/main/java/xyz/nifeather/morph/abilities/MorphAbility.java
+++ b/src/main/java/xyz/nifeather/morph/abilities/MorphAbility.java
@@ -1,6 +1,5 @@
 package xyz.nifeather.morph.abilities;
 
-import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
 import org.bukkit.entity.Player;
 import org.jetbrains.annotations.NotNull;
@@ -104,11 +103,7 @@ public T getDefaultOption()
     @Nullable
     protected T getOptionFor(DisguiseState state)
     {
-        return getOr(
-                () -> optionMap.get(state.getDisguiseIdentifier()),
-                Objects::nonNull,
-                () -> optionMap.get(state.skillLookupIdentifier())
-        );
+        return state.getAbilityUpdater().lookupAbilityConfig(this.getIdentifier().asString(), (Class<T>)getDefaultOption().getClass());
     }
 
     public interface Returner<R>
@@ -133,23 +128,4 @@ protected <R> R getOr(Returner<R> value, Predicate<R> p, Returner<R> fallbackVal
         else
             return fallbackValue.apply();
     }
-
-    protected final Map<String, T> optionMap = new Object2ObjectOpenHashMap<>();
-
-    @Override
-    public boolean setOption(@NotNull String disguiseIdentifier, @Nullable T option)
-    {
-        if (option == null)
-            return false;
-
-        optionMap.put(disguiseIdentifier, option);
-
-        return true;
-    }
-
-    @Override
-    public void clearOptions()
-    {
-        optionMap.clear();
-    }
 }
diff --git a/src/main/java/xyz/nifeather/morph/abilities/impl/FlyAbility.java b/src/main/java/xyz/nifeather/morph/abilities/impl/FlyAbility.java
index 180b0f6b..178ed73e 100644
--- a/src/main/java/xyz/nifeather/morph/abilities/impl/FlyAbility.java
+++ b/src/main/java/xyz/nifeather/morph/abilities/impl/FlyAbility.java
@@ -92,7 +92,7 @@ public boolean handle(Player player, DisguiseState state)
         if (gameMode == GameType.CREATIVE || gameMode == GameType.SPECTATOR)
             return super.handle(player, state);
 
-        var option = optionMap.get(state.skillLookupIdentifier());
+        var option = this.getOptionFor(state);
 
         var worldName = player.getWorld().getName();
         var allowFlightConditions = player.getFoodLevel() > option.getMinimumHunger()
@@ -184,11 +184,11 @@ public boolean revokeFromPlayer(Player player, DisguiseState state)
         return new FlyOption();
     }
 
-    public float getTargetFlySpeed(String identifier)
+    public float getTargetFlySpeed(DisguiseState state)
     {
-        if (identifier == null) return Float.NaN;
+        if (state == null) return Float.NaN;
 
-        var value = optionMap.getOrDefault(identifier, null);
+        var value = this.getOptionFor(state);
 
         if (value != null)
             return value.getFlyingSpeed();
@@ -204,7 +204,7 @@ public boolean updateFlyingState(DisguiseState state)
 
         if (player.getGameMode() != GameMode.SPECTATOR)
         {
-            float speed = getTargetFlySpeed(state.skillLookupIdentifier());
+            float speed = getTargetFlySpeed(state);
 
             speed = Float.isNaN(speed) ? 0.1f : MathUtils.clamp(-1f, 1f, speed);
 
diff --git a/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/ReloadSubCommand.java b/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/ReloadSubCommand.java
index 2370ce7b..43b051e7 100644
--- a/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/ReloadSubCommand.java
+++ b/src/main/java/xyz/nifeather/morph/commands/subcommands/plugin/ReloadSubCommand.java
@@ -20,8 +20,7 @@
 import xyz.nifeather.morph.misc.recipe.RecipeManager;
 import xyz.nifeather.morph.misc.skins.PlayerSkinProvider;
 import xyz.nifeather.morph.network.multiInstance.MultiInstanceService;
-import xyz.nifeather.morph.network.server.MorphClientHandler;
-import xyz.nifeather.morph.storage.skill.SkillAbilityConfigurationStore;
+import xyz.nifeather.morph.storage.skill.SkillsConfigurationStoreNew;
 
 import java.util.List;
 
@@ -60,7 +59,7 @@ public FormattableMessage getHelpMessage()
     private VanillaMessageStore vanillaMessageStore;
 
     @Resolved
-    private SkillAbilityConfigurationStore skills;
+    private SkillsConfigurationStoreNew skills;
 
     @Resolved
     private MultiInstanceService multiInstanceService;
@@ -79,9 +78,6 @@ public List<String> onTabComplete(List<String> args, CommandSender source)
             return null;
     }
 
-    @Resolved
-    private MorphClientHandler clientHandler;
-
     @Override
     public boolean onCommand(@NotNull CommandSender sender, @NotNull String[] args)
     {
@@ -103,7 +99,7 @@ public boolean onCommand(@NotNull CommandSender sender, @NotNull String[] args)
             if (reloadsData)
             {
                 config.reload();
-                skills.reloadConfiguration();
+                skills.clearCache();
                 morphManager.reloadConfiguration();
 
                 PlayerSkinProvider.getInstance().reload();
diff --git a/src/main/java/xyz/nifeather/morph/providers/disguise/DefaultDisguiseProvider.java b/src/main/java/xyz/nifeather/morph/providers/disguise/DefaultDisguiseProvider.java
index 693cbfb0..135868bb 100644
--- a/src/main/java/xyz/nifeather/morph/providers/disguise/DefaultDisguiseProvider.java
+++ b/src/main/java/xyz/nifeather/morph/providers/disguise/DefaultDisguiseProvider.java
@@ -198,6 +198,10 @@ public void postConstructDisguise(DisguiseState state, @Nullable Entity targetEn
         //被动技能
         var abilities = abilityHandler.getAbilitiesFor(state.skillLookupIdentifier());
         state.getAbilityUpdater().setAbilities(abilities);
-        state.setSkill(skillHandler.getSkill(state.skillLookupIdentifier()));
+
+        var abilityOptions = abilityHandler.getOptionsFor(state.skillLookupIdentifier());
+        abilityOptions.forEach((id, config) -> state.getAbilityUpdater().setAbilityConfig(id.asString(), config));
+
+        state.setSkill(skillHandler.lookupDisguiseSkill(state.skillLookupIdentifier()));
     }
 }
diff --git a/src/main/java/xyz/nifeather/morph/skills/DefaultConfigGenerator.java b/src/main/java/xyz/nifeather/morph/skills/DefaultConfigGenerator.java
index c401e35e..e04ad4a8 100644
--- a/src/main/java/xyz/nifeather/morph/skills/DefaultConfigGenerator.java
+++ b/src/main/java/xyz/nifeather/morph/skills/DefaultConfigGenerator.java
@@ -1,5 +1,6 @@
 package xyz.nifeather.morph.skills;
 
+import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
 import net.kyori.adventure.bossbar.BossBar;
 import org.bukkit.NamespacedKey;
@@ -22,6 +23,7 @@
 
 import java.util.Collection;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
 public class DefaultConfigGenerator
@@ -31,21 +33,18 @@ public static DefaultConfigGenerator createInstance()
         return new DefaultConfigGenerator();
     }
 
-    private List<SkillAbilityConfiguration> configurations = new ObjectArrayList<>();
+    private Map<String, SkillAbilityConfiguration> configurations = new Object2ObjectOpenHashMap<>();
 
     private SkillAbilityConfiguration getConfiguration(String mobId)
     {
-        var cfg = configurations.stream()
-                .filter(c -> c.getIdentifier().equalsIgnoreCase(mobId))
-                .findFirst().orElse(null);
+        var cfg = configurations.getOrDefault(mobId, null);
 
         if (cfg != null) return cfg;
 
         var newConfig = new SkillAbilityConfiguration();
-        newConfig.setIdentifier(mobId)
-                .setSkillIdentifier(SkillType.NONE);
+        newConfig.setSkillIdentifier(SkillType.NONE);
 
-        configurations.add(newConfig);
+        configurations.put(mobId, newConfig);
 
         return newConfig;
     }
@@ -55,28 +54,12 @@ private SkillAbilityConfiguration getConfiguration(EntityType entityType)
         return getConfiguration(entityType.key().asString());
     }
 
-    @Nullable
-    private SkillAbilityConfigurationContainer cachedContainer;
-
-    public SkillAbilityConfigurationContainer generateConfiguration()
+    public Map<String, SkillAbilityConfiguration> generateConfiguration()
     {
-        if (cachedContainer != null) return cachedContainer;
-
-        var container = new SkillAbilityConfigurationContainer();
-
         this.generateSkills();
         this.generateAbilities();
 
-        container.configurations.addAll(this.configurations);
-
-        cachedContainer = container;
-
-        return container;
-    }
-
-    public void setConfigurationList(List<SkillAbilityConfiguration> newConfigurations)
-    {
-        this.configurations = newConfigurations;
+        return this.configurations;
     }
 
     public void generateSkills()
diff --git a/src/main/java/xyz/nifeather/morph/skills/MorphSkillHandler.java b/src/main/java/xyz/nifeather/morph/skills/MorphSkillHandler.java
index a0bc980b..b701dff5 100644
--- a/src/main/java/xyz/nifeather/morph/skills/MorphSkillHandler.java
+++ b/src/main/java/xyz/nifeather/morph/skills/MorphSkillHandler.java
@@ -1,8 +1,10 @@
 package xyz.nifeather.morph.skills;
 
+import it.unimi.dsi.fastutil.Pair;
 import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
 import it.unimi.dsi.fastutil.objects.ObjectList;
+import it.unimi.dsi.fastutil.objects.ObjectObjectImmutablePair;
 import net.kyori.adventure.key.Key;
 import net.kyori.adventure.sound.Sound;
 import org.bukkit.Bukkit;
@@ -26,12 +28,13 @@
 import xyz.nifeather.morph.skills.impl.*;
 import xyz.nifeather.morph.storage.skill.ISkillOption;
 import xyz.nifeather.morph.storage.skill.SkillAbilityConfiguration;
-import xyz.nifeather.morph.storage.skill.SkillAbilityConfigurationStore;
+import xyz.nifeather.morph.storage.skill.SkillsConfigurationStoreNew;
 import xyz.nifeather.morph.utilities.PermissionUtils;
 
 import java.util.List;
 import java.util.Map;
 import java.util.UUID;
+import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.atomic.AtomicBoolean;
 
 public class MorphSkillHandler extends MorphPluginObject
@@ -39,7 +42,7 @@ public class MorphSkillHandler extends MorphPluginObject
     /**
      * 已注册的技能
      */
-    private final List<IMorphSkill<?>> skills = new ObjectArrayList<>();
+    private final Map<String, IMorphSkill<?>> skills = new ConcurrentHashMap<>();
 
     /**
      * 获取已注册的技能
@@ -48,7 +51,7 @@ public class MorphSkillHandler extends MorphPluginObject
      */
     public List<IMorphSkill<?>> getRegistedSkills()
     {
-        return skills;
+        return skills.values().stream().toList();
     }
 
     /**
@@ -65,7 +68,7 @@ public List<IMorphSkill<?>> getRegistedSkills()
     private MorphManager manager;
 
     @Resolved
-    private SkillAbilityConfigurationStore store;
+    private SkillsConfigurationStoreNew store;
 
     @Initializer
     private void load()
@@ -114,7 +117,7 @@ public boolean registerSkill(IMorphSkill<?> skill)
     {
         //logger.info("Registering skill: " + skill.getIdentifier().asString());
 
-        if (skills.contains(skill))
+        if (skills.containsKey(skill.getIdentifier().asString()))
         {
             logger.error("Can't register skill: Another skill instance has already registered as " + skill.getIdentifier().asString() + " !");
             return false;
@@ -126,7 +129,7 @@ public boolean registerSkill(IMorphSkill<?> skill)
             return false;
         }
 
-        skills.add(skill);
+        skills.put(skill.getIdentifier().asString(), skill);
 
         return true;
     }
@@ -142,32 +145,45 @@ private void update()
 
     /**
      * 获取某个ID对应的技能和技能配置
-     * @param identifier ID
+     * @param identifier 伪装ID
      * @return 对应的技能和技能配置,如果没找到则是null
      */
     @Nullable
-    private Map.Entry<SkillAbilityConfiguration, IMorphSkill<?>> getSkillEntry(String identifier)
+    private Pair<SkillAbilityConfiguration, IMorphSkill<?>> getSkillEntry(String identifier)
     {
         if (identifier == null) return null;
 
-        return store.getConfiguredSkills().entrySet().stream()
-                .filter(d -> identifier.equals(d.getKey().getIdentifier())).findFirst().orElse(null);
+        var configuration = store.get(identifier);
+        if (configuration == null) return null;
+
+        var skillID = configuration.getSkillIdentifier();
+        var skillInstance = this.getSkill(skillID.asString());
+
+        return new ObjectObjectImmutablePair<>(configuration, skillInstance);
+    }
+
+    @NotNull
+    public IMorphSkill<?> lookupDisguiseSkill(String disguiseIdentifier)
+    {
+        var configuration = store.get(disguiseIdentifier);
+        if (configuration == null) return NoneMorphSkill.instance;
+
+        return this.getSkill(configuration.getSkillIdentifier().asString());
     }
 
     /**
      * 获取和identifier匹配的技能
      *
-     * @param identifier 技能ID
+     * @param skillIdentifier 技能ID
      * @return {@link IMorphSkill}
      * @apiNote 如果未找到则返回 {@link NoneMorphSkill#instance}
      */
     @NotNull
-    public IMorphSkill<?> getSkill(String identifier)
+    public IMorphSkill<?> getSkill(String skillIdentifier)
     {
-        var entry = getSkillEntry(identifier);
+        var skillInstance = this.skills.getOrDefault(skillIdentifier, NoneMorphSkill.instance);
 
-        if (entry != null) return entry.getValue();
-        else return NoneMorphSkill.instance;
+        return skillInstance;
     }
 
     public void executeDisguiseSkill(Player player)
@@ -203,7 +219,7 @@ public void executeDisguiseSkill(Player player, boolean bypassPermission)
 
         if (player.getGameMode() == GameMode.SPECTATOR
             || skillEntry == null
-            || skillEntry.getKey().getSkillIdentifier().equals(SkillType.NONE))
+            || skillEntry.key().getSkillIdentifier().equals(SkillType.NONE))
         {
             player.sendMessage(MessageUtils.prefixes(player, SkillStrings.skillNotAvaliableString()));
 
@@ -218,7 +234,7 @@ public void executeDisguiseSkill(Player player, boolean bypassPermission)
 
         //logger.info("Permission is " + CommonPermissions.skillPermissionOf(skillEntry.getKey().getSkillIdentifier().asString(), state.getDisguiseIdentifier()));
 
-        var singleSkillPerm = CommonPermissions.skillPermissionOf(skillEntry.getKey().getSkillIdentifier().asString(), state.getDisguiseIdentifier());
+        var singleSkillPerm = CommonPermissions.skillPermissionOf(skillEntry.key().getSkillIdentifier().asString(), state.getDisguiseIdentifier());
         var hasSkillPerm = PermissionUtils.hasPermission(player, singleSkillPerm, true);
 
         if (!bypassPermission && !hasSkillPerm)
@@ -253,8 +269,8 @@ public void executeDisguiseSkill(Player player, boolean bypassPermission)
             return;
         }
 
-        var skill = skillEntry.getValue();
-        var config = skillEntry.getKey();
+        var skill = skillEntry.right();
+        var config = skillEntry.left();
 
         ISkillOption option;
 
@@ -265,7 +281,7 @@ public void executeDisguiseSkill(Player player, boolean bypassPermission)
         catch (Throwable t)
         {
             if (t instanceof ClassCastException)
-                logger.error(config.getIdentifier() + " -> " + skill.getIdentifier() + " has an invalid setting, please check your skill configurations.");
+                logger.error(state.getDisguiseIdentifier() + " -> " + skill.getIdentifier() + " has an invalid setting, please check your skill configurations.");
             else
                 logger.error("Error occurred while parsing skill configuration");
 
@@ -365,8 +381,8 @@ public boolean hasSkill(String id)
     {
         var entry = getSkillEntry(id);
         return entry != null
-                && !SkillType.UNKNOWN.equals(entry.getKey().getSkillIdentifier())
-                && !SkillType.NONE.equals(entry.getKey().getSkillIdentifier());
+                && !SkillType.UNKNOWN.equals(entry.left().getSkillIdentifier())
+                && !SkillType.NONE.equals(entry.left().getSkillIdentifier());
     }
 
     /**
@@ -379,9 +395,9 @@ public boolean hasSpeficSkill(String id, NamespacedKey skillKey)
     {
         var entry = getSkillEntry(id);
 
-        if (entry == null || SkillType.UNKNOWN.equals(entry.getKey().getSkillIdentifier())) return false;
+        if (entry == null || SkillType.UNKNOWN.equals(entry.left().getSkillIdentifier())) return false;
 
-        return entry.getValue().getIdentifier().equals(skillKey);
+        return entry.right().getIdentifier().equals(skillKey);
     }
 
     /**
diff --git a/src/main/java/xyz/nifeather/morph/skills/impl/LaunchProjectileMorphSkill.java b/src/main/java/xyz/nifeather/morph/skills/impl/LaunchProjectileMorphSkill.java
index 20a7e302..bda3e63b 100644
--- a/src/main/java/xyz/nifeather/morph/skills/impl/LaunchProjectileMorphSkill.java
+++ b/src/main/java/xyz/nifeather/morph/skills/impl/LaunchProjectileMorphSkill.java
@@ -43,7 +43,7 @@ protected ExecuteResult preExecute(Player player, DisguiseState state, SkillAbil
 
         if (type == null)
         {
-            printErrorMessage(player, "Invalid projective entity for configuration " + configuration.getIdentifier());
+            printErrorMessage(player, "Invalid projective entity for " + state.getDisguiseIdentifier());
             return ExecuteResult.fail(10);
         }
 
diff --git a/src/main/java/xyz/nifeather/morph/skills/impl/NoneMorphSkill.java b/src/main/java/xyz/nifeather/morph/skills/impl/NoneMorphSkill.java
index 0213138f..6f76b140 100644
--- a/src/main/java/xyz/nifeather/morph/skills/impl/NoneMorphSkill.java
+++ b/src/main/java/xyz/nifeather/morph/skills/impl/NoneMorphSkill.java
@@ -16,7 +16,7 @@ public final class NoneMorphSkill extends MorphSkill<NoOpConfiguration>
     @Override
     public int executeSkill(Player player, DisguiseState state, SkillAbilityConfiguration configuration, NoOpConfiguration option)
     {
-        logger.warn(configuration.getIdentifier() + "没有技能,但却被调用了executeSkill");
+        logger.warn(state.getDisguiseIdentifier() + "没有技能,但却被调用了executeSkill");
         Thread.dumpStack();
 
         return Integer.MAX_VALUE;
diff --git a/src/main/java/xyz/nifeather/morph/storage/DirectoryJsonBasedStorage.java b/src/main/java/xyz/nifeather/morph/storage/DirectoryJsonBasedStorage.java
new file mode 100644
index 00000000..edbae589
--- /dev/null
+++ b/src/main/java/xyz/nifeather/morph/storage/DirectoryJsonBasedStorage.java
@@ -0,0 +1,158 @@
+package xyz.nifeather.morph.storage;
+
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import org.apache.commons.io.FileUtils;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+import xyz.nifeather.morph.MorphPluginObject;
+
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.FileSystem;
+import java.nio.file.FileSystems;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.atomic.AtomicInteger;
+
+public abstract class DirectoryJsonBasedStorage<T> extends MorphPluginObject
+{
+    protected final DirectoryStorage directoryStorage;
+
+    protected abstract T getDefault();
+
+    protected Gson createGson()
+    {
+        return new GsonBuilder()
+                .excludeFieldsWithoutExposeAnnotation()
+                .setPrettyPrinting()
+                .disableHtmlEscaping()
+                .create();
+    }
+
+    protected final Gson gson;
+
+    protected DirectoryJsonBasedStorage(String dirBaseName)
+    {
+        this.directoryStorage = new DirectoryStorage(dirBaseName);
+
+        this.gson = createGson();
+
+        if (this.directoryStorage.initializeFailed())
+            logger.warn("Failed initializing directory storage, please see errors above.");
+    }
+
+    private final Map<String, Object> instancesMap = new ConcurrentHashMap<>();
+
+    public void clearCache()
+    {
+        this.instancesMap.clear();
+    }
+
+    private final AtomicInteger packageVersion = new AtomicInteger(-3);
+
+    public void setPackageVersion(int version)
+    {
+        if (version == -3)
+            throw new IllegalArgumentException("Cannot set package version to -3");
+
+        var file = directoryStorage.getFile("package_version.txt", true);
+        this.packageVersion.set(version);
+
+        if (file == null)
+        {
+            logger.warn("Can't write package version to file, it will not be saved across sessions.");
+            return;
+        }
+
+        try
+        {
+            FileUtils.writeStringToFile(file, "" + version, StandardCharsets.UTF_8);
+        }
+        catch (Throwable t)
+        {
+            logger.warn("Can't write package version to file, it will not be saved across sessions: " + t.getMessage());
+        }
+    }
+
+    public int getPackageVersion()
+    {
+        if (packageVersion.get() != -3)
+            return packageVersion.get();
+
+        var file = directoryStorage.getFile("package_version.txt", false);
+        if (file == null) return -1;
+
+        try
+        {
+            String content = FileUtils.readFileToString(file, StandardCharsets.UTF_8);
+
+            int version = Integer.parseInt(content);
+            packageVersion.set(version);
+            return version;
+        }
+        catch (Throwable t)
+        {
+            logger.error("Can't get package version: " + t.getMessage());
+            t.printStackTrace();
+
+            return -1;
+        }
+    }
+
+    /**
+     * Gets the path to the key
+     * @apiNote You may need to manually add the file extension after calling this
+     * @return NULL if the given identifier is illegal, for example, contains multiple ":"
+     */
+    @Nullable
+    public String getPath(String key)
+    {
+        return key.replace(":", "/")
+                .replace("@", "$")
+                .replaceAll("[^a-zA-Z0-9\\-]]", "_");
+    }
+
+    /**
+     * @param key The file name
+     * @return NULL if the file does not exist or cannot be read, or there's an error during convert
+     */
+    @Nullable
+    public T get(String key)
+    {
+        key = getPath(key);
+
+        var cached = instancesMap.getOrDefault(key, null);
+        if (cached != null) return cached == getDefault() ? null : (T) cached;
+
+        var file = directoryStorage.getFile(key + ".json", false);
+        if (file == null) return null;
+
+        if (!file.canRead())
+        {
+            logger.warn("The file '%s' cannnot be read.".formatted(file.getPath()));
+            return null;
+        }
+
+        Object obj;
+
+        try (InputStreamReader fileStream = new InputStreamReader(new FileInputStream(file)))
+        {
+            obj = gson.fromJson(fileStream, getDefault().getClass());
+        }
+        catch (Throwable t)
+        {
+            logger.warn("Can't convert from JSON: " + t.getMessage());
+            return null;
+        }
+
+        if (obj == null)
+            obj = getDefault();
+
+        this.instancesMap.put(key, obj);
+        return obj == getDefault() ? null : (T) obj;
+    }
+}
diff --git a/src/main/java/xyz/nifeather/morph/storage/DirectoryStorage.java b/src/main/java/xyz/nifeather/morph/storage/DirectoryStorage.java
index 7e5e6965..3f02777b 100755
--- a/src/main/java/xyz/nifeather/morph/storage/DirectoryStorage.java
+++ b/src/main/java/xyz/nifeather/morph/storage/DirectoryStorage.java
@@ -4,6 +4,7 @@
 import xyz.nifeather.morph.MorphPluginObject;
 
 import java.io.File;
+import java.io.IOException;
 import java.net.URI;
 import java.nio.file.Path;
 
@@ -106,19 +107,34 @@ public File getDirectory(String relativePath, boolean createIfNotExist)
         return file;
     }
 
+    /**
+     * @return NULL if the file does not exist.
+     */
     @Nullable
     public File getFile(String fileName, boolean createIfNotExist)
     {
         var file = new File(this.getAbsoulteURI(absoluteDirectoryPath.getPath() + separator + fileName));
 
         if (!file.toPath().toUri().getPath().startsWith(absoluteDirectoryPath.getPath()))
-            throw new RuntimeException("Trying to access a file that does not belongs to this plugin: %s".formatted(file.toURI()));
+        {
+            logger.error("Trying to access a file that does not belongs to this plugin: %s".formatted(file.toURI()));
+            return null;
+        }
 
-        if (!file.exists() && createIfNotExist)
+        if (!file.exists())
         {
+            if (!createIfNotExist) return null;
+
             try
             {
-                var success = file.createNewFile();
+                boolean success = true;
+
+                var parent = file.getParentFile();
+                if (!parent.exists())
+                    success = parent.mkdirs();
+
+                success = success && file.createNewFile();
+
                 if (!success)
                 {
                     logger.warn("Unable to create file: Unknown error");
@@ -136,4 +152,23 @@ public File getFile(String fileName, boolean createIfNotExist)
 
         return file;
     }
+
+    /**
+     * @return 操作是否成功
+     */
+    private boolean ensureParentAlwaysPresent(File baseFile, boolean isDirectory)
+    {
+        var parent = baseFile.getParentFile();
+        if (!parent.exists()) ensureParentAlwaysPresent(parent, true);
+
+        try
+        {
+            return baseFile.createNewFile();
+        }
+        catch (IOException e)
+        {
+            logger.warn("Can't create file: " + e.getMessage());
+            return false;
+        }
+    }
 }
diff --git a/src/main/java/xyz/nifeather/morph/storage/skill/IAbilityConfigLookup.java b/src/main/java/xyz/nifeather/morph/storage/skill/IAbilityConfigLookup.java
new file mode 100644
index 00000000..b34fc07d
--- /dev/null
+++ b/src/main/java/xyz/nifeather/morph/storage/skill/IAbilityConfigLookup.java
@@ -0,0 +1,11 @@
+package xyz.nifeather.morph.storage.skill;
+
+import org.jetbrains.annotations.Nullable;
+
+public interface IAbilityConfigLookup
+{
+    @Nullable
+    public <X> X lookupAbilityConfig(String identifier, Class<X> expectedClass);
+
+    public void setAbilityConfig(String identifier, Object config);
+}
diff --git a/src/main/java/xyz/nifeather/morph/storage/skill/SkillAbilityConfiguration.java b/src/main/java/xyz/nifeather/morph/storage/skill/SkillAbilityConfiguration.java
index ee01d4a6..20f716da 100644
--- a/src/main/java/xyz/nifeather/morph/storage/skill/SkillAbilityConfiguration.java
+++ b/src/main/java/xyz/nifeather/morph/storage/skill/SkillAbilityConfiguration.java
@@ -28,69 +28,19 @@ public SkillAbilityConfiguration()
     /**
      * 创建一个技能配置
      *
-     * @param mobId 生物ID
      * @param cd CD时间
      * @param skillIdentifier 技能ID
      */
-    public SkillAbilityConfiguration(String mobId, int cd, NamespacedKey skillIdentifier)
+    public SkillAbilityConfiguration(int cd, NamespacedKey skillIdentifier)
     {
-        this.identifier = mobId;
         this.cooldown = cd;
         setSkillIdentifier(skillIdentifier);
     }
 
-    /**
-     * 创建一个技能配置
-     *
-     * @param type 生物类型
-     * @param cd CD时间
-     * @param skillIdentifier 技能ID
-     */
-    public SkillAbilityConfiguration(EntityType type, int cd, NamespacedKey skillIdentifier)
-    {
-        this(type.getKey(), cd, skillIdentifier);
-    }
-
-    /**
-     * 创建一个技能配置
-     *
-     * @param key 生物ID
-     * @param cd CD时间
-     * @param skillIdentifier 技能ID
-     */
-    public SkillAbilityConfiguration(NamespacedKey key, int cd, NamespacedKey skillIdentifier)
-    {
-        this.cooldown = cd;
-        setSkillIdentifier(skillIdentifier);
-        setIdentifier(key);
-    }
-
-    @Expose
+    @Nullable
+    @Expose(serialize = false)
     @SerializedName("mobId")
-    private String identifier;
-
-    /**
-     * 获取和配置对应的伪装ID
-     *
-     * @return 伪装ID
-     */
-    @NotNull
-    public String getIdentifier()
-    {
-        return identifier;
-    }
-
-    public void setIdentifier(NamespacedKey key)
-    {
-        this.identifier = key.asString();
-    }
-
-    public SkillAbilityConfiguration setIdentifier(String id)
-    {
-        this.identifier = id;
-
-        return this;
-    }
+    public String legacy_MobID;
 
     //region 主动技能
 
@@ -303,13 +253,6 @@ public SkillAbilityConfiguration setOption(String identifier, ISkillOption optio
 
     //endregion 技能设置
 
-    @Override
-    public String toString()
-    {
-        return "Skill configuration for disguise " + this.identifier;
-    }
-
-
     @Expose(serialize = false)
     @SerializedName("projective")
     private ProjectileConfiguration projectileConfiguration;
diff --git a/src/main/java/xyz/nifeather/morph/storage/skill/SkillAbilityConfigurationStore.java b/src/main/java/xyz/nifeather/morph/storage/skill/SkillAbilityConfigurationStore.java
deleted file mode 100644
index 50161f03..00000000
--- a/src/main/java/xyz/nifeather/morph/storage/skill/SkillAbilityConfigurationStore.java
+++ /dev/null
@@ -1,395 +0,0 @@
-package xyz.nifeather.morph.storage.skill;
-
-import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
-import it.unimi.dsi.fastutil.objects.ObjectArrayList;
-import org.bukkit.NamespacedKey;
-import org.bukkit.attribute.Attribute;
-import org.bukkit.entity.EntityType;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-import xiamomc.pluginbase.Annotations.Resolved;
-import xyz.nifeather.morph.MorphManager;
-import xyz.nifeather.morph.abilities.AbilityManager;
-import xyz.nifeather.morph.abilities.AbilityType;
-import xyz.nifeather.morph.abilities.IMorphAbility;
-import xyz.nifeather.morph.abilities.impl.AttributeModifyingAbility;
-import xyz.nifeather.morph.abilities.impl.onAttack.ExtraKnockbackAbility;
-import xyz.nifeather.morph.abilities.options.AttributeModifyOption;
-import xyz.nifeather.morph.skills.DefaultConfigGenerator;
-import xyz.nifeather.morph.skills.IMorphSkill;
-import xyz.nifeather.morph.skills.MorphSkillHandler;
-import xyz.nifeather.morph.skills.SkillType;
-import xyz.nifeather.morph.skills.impl.LaunchProjectileMorphSkill;
-import xyz.nifeather.morph.skills.impl.SonicBoomMorphSkill;
-import xyz.nifeather.morph.storage.MorphJsonBasedStorage;
-import xyz.nifeather.morph.utilities.DisguiseUtils;
-import xyz.nifeather.morph.utilities.EntityTypeUtils;
-
-import java.util.Map;
-import java.util.concurrent.atomic.AtomicBoolean;
-
-/**
- * 技能配置存储,有关技能执行、注册技能请查看{@link MorphSkillHandler} 和 {@link AbilityManager}
- */
-public class SkillAbilityConfigurationStore extends MorphJsonBasedStorage<SkillAbilityConfigurationContainer>
-{
-    /**
-     * 配置 -> 技能
-     */
-    private final Map<SkillAbilityConfiguration, IMorphSkill<?>> configToSkillMap = new Object2ObjectOpenHashMap<>();
-
-    /**
-     * 获取已配置的技能
-     *
-     * @return 配置 -> 技能表
-     */
-    public Map<SkillAbilityConfiguration, IMorphSkill<?>> getConfiguredSkills()
-    {
-        return configToSkillMap;
-    }
-
-    @Override
-    protected @NotNull String getFileName()
-    {
-        return "skills.json";
-    }
-
-    @Override
-    protected @NotNull SkillAbilityConfigurationContainer createDefault()
-    {
-        return DefaultConfigGenerator.createInstance().generateConfiguration();
-    }
-
-    @Override
-    protected @NotNull String getDisplayName()
-    {
-        return "技能存储";
-    }
-
-    private final int targetVersion = 27;
-
-    @Resolved
-    private MorphSkillHandler skillHandler;
-
-    @Resolved
-    private AbilityManager abilityHandler;
-
-    @Override
-    public boolean reloadConfiguration()
-    {
-        var val = super.reloadConfiguration();
-
-        var success = new AtomicBoolean(val);
-
-        if (!success.get())
-            logger.warn("We met some problem reloading, some configurations may not be added.");
-
-        if (!val) return false;
-
-        try
-        {
-            configToSkillMap.clear();
-            abilityHandler.clearAbilities();
-
-            storingObject.configurations.forEach(c ->
-            {
-                if (!registerConfiguration(c)) success.set(false);
-
-                var abilities = new ObjectArrayList<IMorphAbility<?>>();
-
-                c.getAbilitiyIdentifiers().forEach(i ->
-                {
-                    if (i.isEmpty()) return;
-
-                    var key = NamespacedKey.fromString(i);
-
-                    if (key == null)
-                        logger.error("Invalid skill identifier: " + i);
-
-                    var ability = abilityHandler.getAbility(key);
-
-                    if (ability == null) return;
-
-                    abilities.add(ability);
-
-                    if (!ability.setOptionGeneric(c.getIdentifier(), c.getAbilityOptions(ability)))
-                    {
-                        logger.warn("Unable to add skill configuration" + c.getIdentifier() + " -> " + ability.getIdentifier());
-                        success.set(false);
-                    }
-                });
-
-                abilityHandler.setAbilities(c, abilities);
-            });
-
-            if (storingObject.version < targetVersion)
-                success.set(migrate(storingObject) || success.get());
-
-            saveConfiguration();
-        }
-        catch (Throwable t)
-        {
-            logger.error("Error occurred while processing skill configurations:" + t.getMessage());
-            t.printStackTrace();
-
-            configToSkillMap.clear();
-            return false;
-        }
-
-        return true;
-    }
-
-    /**
-     * 注册一个技能配置
-     * @param configuration 要注册的配置
-     * @return 操作是否成功
-     */
-    public boolean registerConfiguration(SkillAbilityConfiguration configuration)
-    {
-        if (configToSkillMap.containsKey(configuration))
-            return true;
-
-        if (configToSkillMap.keySet().stream().anyMatch(c -> c.getIdentifier().equals(configuration.getIdentifier())))
-        {
-            logger.error("Another configuration instance already registered as " + configuration.getIdentifier() + "!");
-            return false;
-        }
-
-        var type = configuration.getSkillIdentifier();
-
-        if (type.equals(SkillType.UNKNOWN))
-        {
-            logger.error(configuration + " has an invalid skill identifier");
-            return false;
-        }
-
-        var skillOptional = skillHandler.getRegistedSkills().stream()
-                .filter(s -> s.getIdentifier().equals(type)).findFirst();
-
-        if (skillOptional.isEmpty())
-        {
-            logger.error("Unable to find any skill that matches the identifier: " + type.asString());
-            return false;
-        }
-
-        configToSkillMap.put(configuration, skillOptional.get());
-
-        return true;
-    }
-
-    private boolean migrate(SkillAbilityConfigurationContainer config)
-    {
-        logger.info("Updating skill configurations...");
-
-        try
-        {
-            var version = config.version;
-
-            //1: fake_inventory改名fake_equip
-            if (version < 1)
-            {
-                var oldFakeInvKey = new NamespacedKey("morph", "fake_inventory");
-                config.configurations.forEach(c ->
-                {
-                    if (c.getSkillIdentifier().equals(oldFakeInvKey))
-                        c.setSkillIdentifier(SkillType.INVENTORY);
-                });
-            }
-
-            //5: 技能设置迁移到settings中
-            if (version < 5)
-            {
-                config.configurations.forEach(c ->
-                {
-                    var effect = c.getEffectConfiguration();
-                    var projective = c.getProjectiveConfiguration();
-                    var explosion = c.getExplosionConfiguration();
-                    var teleport = c.getTeleportConfiguration();
-
-                    c.setOption(SkillType.TELEPORT.asString(), teleport);
-                    c.setOption(SkillType.APPLY_EFFECT.asString(), effect);
-                    c.setOption(SkillType.LAUNCH_PROJECTILE.asString(), projective);
-                    c.setOption(SkillType.EXPLODE.asString(), explosion);
-                });
-            }
-
-            //9: 实现Warden的音爆技能
-            if (version < 9)
-            {
-                var targetConfig = getConfigFor(EntityType.WARDEN, config);
-
-                if (targetConfig != null && targetConfig.getSkillIdentifier().equals(SkillType.NONE))
-                {
-                    targetConfig.setSkillIdentifier(SkillType.SONIC_BOOM);
-                    targetConfig.setCooldown(SonicBoomMorphSkill.defaultCooldown);
-                }
-            }
-
-            //11: 调整fallback机制
-            if (version < 11)
-            {
-                config.configurations.stream()
-                        .filter(s -> s.getIdentifier().equals(EntityType.PLAYER.getKey().asString()))
-                        .findFirst().ifPresent(targetConfig -> targetConfig.setIdentifier("player:" + MorphManager.disguiseFallbackName));
-
-            }
-
-            //马匹被动改成更改属性
-            if (version < 13)
-            {
-                var targetConfig= getConfigFor(EntityType.HORSE, config);
-
-                if (targetConfig != null)
-                {
-                    var targetIdentifier = AbilityType.HAS_SPEED_BOOST.asString();
-                    targetConfig.getAbilitiyIdentifiers().removeIf(s -> s.equals(targetIdentifier));
-                }
-            }
-
-            //恶魂的技能合并到弹射物中
-            if (version < 14)
-            {
-                var ghastConfig = getConfigFor(EntityType.GHAST, config);
-
-                if (ghastConfig != null)
-                {
-                    //noinspection removal
-                    ghastConfig.moveOption(SkillType.GHAST, SkillType.LAUNCH_PROJECTILE);
-                    ghastConfig.setSkillIdentifier(SkillType.LAUNCH_PROJECTILE);
-
-                    var option = ghastConfig.getSkillOptions(new LaunchProjectileMorphSkill());
-                    if (option != null)
-                    {
-                        option.put("delay", DisguiseUtils.GHAST_EXECUTE_DELAY);
-                        option.put("warning_sound_name", "entity.ghast.warn");
-                    }
-                }
-            }
-
-            //一些拥有飞行被动的伪装同时也拥有免疫摔落伤害的被动
-            if (version < 19)
-            {
-                for (EntityType entityType : EntityTypeUtils.noFallDamage1())
-                {
-                    config.configurations.stream().filter(s -> s != null && s.getIdentifier().equals(entityType.getKey().asString()))
-                            .findFirst().ifPresent(cfg -> cfg.getAbilitiyIdentifiers().removeIf(s -> s.equals(AbilityType.NO_FALL_DAMAGE.asString())));
-                }
-            }
-
-            //实现了女巫的抛掷技能
-            if (version < 21)
-            {
-                var option = getConfigFor(EntityType.WITCH, config);
-
-                if (option != null)
-                {
-                    if (option.getSkillIdentifier().equals(SkillType.NONE))
-                    {
-                        option.setSkillIdentifier(SkillType.WITCH);
-                        option.setCooldown(80);
-                    }
-                }
-            }
-
-            //铁傀儡和监守者的攻击伤害和速度
-            if (version < 25)
-            {
-                var wardenConfig = getConfigFor(EntityType.WARDEN, config);
-
-                if (wardenConfig != null)
-                {
-                    var option = (AttributeModifyOption) wardenConfig.getAbilityOptions(abilityHandler.getAbility(AbilityType.ATTRIBUTE));
-
-                    if (option != null)
-                    {
-                        option.with(Attribute.GENERIC_ATTACK_DAMAGE, AttributeModifyOption.OperationType.add, 30)
-                                .with(Attribute.GENERIC_ATTACK_SPEED, AttributeModifyOption.OperationType.multiply_base, -0.6d);
-
-                        wardenConfig.setOption(AbilityType.ATTRIBUTE.asString(), option);
-                    }
-                }
-
-                var ironConfig = getConfigFor(EntityType.IRON_GOLEM, config);
-                if (ironConfig != null)
-                {
-                    var option = ironConfig.getAbilityOptions(new AttributeModifyingAbility());
-
-                    if (option != null)
-                    {
-                        option.with(Attribute.GENERIC_ATTACK_DAMAGE, AttributeModifyOption.OperationType.add, 15)
-                                .with(Attribute.GENERIC_ATTACK_SPEED, AttributeModifyOption.OperationType.multiply_base, -0.6d);
-
-                        ironConfig.setOption(AbilityType.ATTRIBUTE.asString(), option);
-                    }
-                }
-
-                //var ds = this.createGson().toJson(storingObject);
-                //logger.info(ds);
-            }
-
-            // 马匹踏上1格高的方块
-            if (version < 26)
-            {
-                var horseConfig = getConfigFor(EntityType.HORSE, config);
-                if (horseConfig != null)
-                {
-                    var option = horseConfig.getAbilityOptions(new AttributeModifyingAbility());
-                    if (option != null)
-                    {
-                        option.with(Attribute.GENERIC_STEP_HEIGHT, AttributeModifyOption.OperationType.add, 0.4d);
-
-                        horseConfig.setOption(AbilityType.ATTRIBUTE.asString(), option);
-                    }
-                }
-            }
-
-            if (version < 27)
-            {
-                var ironConfig = getConfigFor(EntityType.IRON_GOLEM, config);
-                if (ironConfig != null)
-                {
-                    var option = ironConfig.getAbilityOptions(new ExtraKnockbackAbility());
-                    if (option != null)
-                    {
-                        if (option.yMotion == 0.4d)
-                            option.yMotion = 0.8d;
-
-                        ironConfig.setOption(AbilityType.EXTRA_KNOCKBACK.asString(), option);
-                    }
-                }
-            }
-
-            //更新默认设置
-            var generator = DefaultConfigGenerator.createInstance();
-            generator.setConfigurationList(config.configurations);
-            generator.generateSkills();
-            generator.generateAbilities();
-
-            config.version = targetVersion;
-
-            logger.info("Done! Reloading skill configurations...");
-            this.addSchedule(this::reloadConfiguration);
-            return true;
-        }
-        catch (Throwable t)
-        {
-            logger.error("Error occurred while updating skill configuration: " + t.getMessage());
-            t.printStackTrace();
-            return false;
-        }
-    }
-
-    @Nullable
-    private SkillAbilityConfiguration getConfigFor(String id, SkillAbilityConfigurationContainer config)
-    {
-        return config.configurations.stream()
-                .filter(s -> s != null && s.getIdentifier().equals(id))
-                .findFirst().orElse(null);
-    }
-
-    @Nullable
-    private SkillAbilityConfiguration getConfigFor(EntityType type, SkillAbilityConfigurationContainer config)
-    {
-        return getConfigFor(type.getKey().asString(), config);
-    }
-}
diff --git a/src/main/java/xyz/nifeather/morph/storage/skill/SkillsConfigurationStoreNew.java b/src/main/java/xyz/nifeather/morph/storage/skill/SkillsConfigurationStoreNew.java
new file mode 100644
index 00000000..a7000e5c
--- /dev/null
+++ b/src/main/java/xyz/nifeather/morph/storage/skill/SkillsConfigurationStoreNew.java
@@ -0,0 +1,176 @@
+package xyz.nifeather.morph.storage.skill;
+
+import org.apache.commons.io.FileUtils;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+import xiamomc.pluginbase.Annotations.Initializer;
+import xyz.nifeather.morph.skills.DefaultConfigGenerator;
+import xyz.nifeather.morph.storage.DirectoryJsonBasedStorage;
+import xyz.nifeather.morph.storage.MorphJsonBasedStorage;
+
+import java.io.File;
+import java.net.URI;
+import java.nio.charset.StandardCharsets;
+
+public class SkillsConfigurationStoreNew extends DirectoryJsonBasedStorage<SkillAbilityConfiguration>
+{
+    public SkillsConfigurationStoreNew()
+    {
+        super("skills");
+    }
+
+    @Initializer
+    private void load()
+    {
+        var packageVersion = this.getPackageVersion();
+
+        if (packageVersion < TARGET_PACKAGE_VERSION)
+            update(packageVersion);
+    }
+
+    private static final int TARGET_PACKAGE_VERSION = PackageVersions.INITIAL;
+
+    private void update(int currentVersion)
+    {
+        if (currentVersion < PackageVersions.INITIAL)
+        {
+            URI dataFolderUri = this.plugin.getDataFolder().toURI();
+            var legacySkillFile = new File(URI.create(dataFolderUri + "/" + "skills.json"));
+
+            if (legacySkillFile.exists())
+                migrateFromLegacyStorage();
+            else
+                saveDefaultGeneratedConfigurations();
+        }
+
+        setPackageVersion(TARGET_PACKAGE_VERSION);
+    }
+
+    private void migrateFromLegacyStorage()
+    {
+        try
+        {
+            logger.info("Migrating from legacy skill configuration...");
+            var storage = new LegacyReadonlyConfigurationStorage();
+            var file = storage.file();
+
+            if (!file.exists())
+            {
+                logger.info("Legacy skill configuration doesn't exist, ignoring...");
+                return;
+            }
+
+            storage.initializeStorage();
+
+            var storing = storage.getStoring();
+            if (storing == null)
+            {
+                logger.warn("Can't migrate from legacy skill configuration: Null storing object, is everything all right?");
+                return;
+            }
+
+            storing.configurations.forEach(this::save);
+
+            var success = file.renameTo(new File(file.getParent(), "skills.old.json"));
+
+            if (!success)
+                logger.info("Can't rename 'skills.json' to 'skills.old.json', but it's not a big deal, I guess...");
+
+            logger.info("Done migrating legacy skill configuration!");
+        }
+        catch (Throwable t)
+        {
+            logger.warn("Can't migrate from legacy skill configuration: " + t.getMessage());
+            t.printStackTrace();
+        }
+    }
+
+    private void saveDefaultGeneratedConfigurations()
+    {
+        logger.info("Saving default generated skill configurations...");
+
+        var generatedConfiguration = DefaultConfigGenerator.createInstance().generateConfiguration();
+        generatedConfiguration.forEach((id, config) ->
+        {
+            config.legacy_MobID = id;
+            this.save(config);
+        });
+
+        logger.info("Done saving default generated skill configurations!");
+    }
+
+    public void save(SkillAbilityConfiguration configuration)
+    {
+        var identifier = configuration.legacy_MobID;
+
+        if (identifier == null)
+        {
+            logger.warn("Found a configuration from legacy store that doesn't have a mobId! Ignoring...");
+            return;
+        }
+
+        var path = this.getPath(identifier) + ".json";
+
+        var file = this.directoryStorage.getFile(path, true);
+        if (file == null)
+        {
+            logger.warn("Cannot save disguise configuration for " + identifier);
+            return;
+        }
+
+        String json = gson.toJson(configuration);
+        try
+        {
+            FileUtils.writeStringToFile(file, json, StandardCharsets.UTF_8);
+        }
+        catch (Throwable t)
+        {
+            logger.error("Can't write content to file: " + t.getMessage());
+        }
+    }
+
+    private static final SkillAbilityConfiguration defaultConfig = new SkillAbilityConfiguration();
+
+    @Override
+    protected SkillAbilityConfiguration getDefault()
+    {
+        return defaultConfig;
+    }
+
+    private static class LegacyReadonlyConfigurationStorage extends MorphJsonBasedStorage<SkillAbilityConfigurationContainer>
+    {
+        @Override
+        protected @NotNull String getFileName()
+        {
+            return "skills.json";
+        }
+
+        public File file()
+        {
+            return this.configurationFile;
+        }
+
+        @Nullable
+        public SkillAbilityConfigurationContainer getStoring()
+        {
+            return this.storingObject;
+        }
+
+        @Override
+        protected @NotNull SkillAbilityConfigurationContainer createDefault()
+        {
+            return new SkillAbilityConfigurationContainer();
+        }
+
+        @Override
+        protected @NotNull String getDisplayName()
+        {
+            return "Legacy skill configuration store";
+        }
+    }
+
+    public static class PackageVersions
+    {
+        public static final int INITIAL = 1;
+    }
+}

From ae37845a5dc583b7f9eac9ab358bbd204f211ae8 Mon Sep 17 00:00:00 2001
From: MATRIX-feather <midnightcarnival@outlook.com>
Date: Fri, 11 Oct 2024 22:03:55 +0800
Subject: [PATCH 11/28] fix: file being used before legacy storage init

---
 .../xyz/nifeather/morph/storage/DirectoryStorage.java    | 4 +++-
 .../morph/storage/skill/SkillsConfigurationStoreNew.java | 9 ++-------
 2 files changed, 5 insertions(+), 8 deletions(-)

diff --git a/src/main/java/xyz/nifeather/morph/storage/DirectoryStorage.java b/src/main/java/xyz/nifeather/morph/storage/DirectoryStorage.java
index 3f02777b..968c597f 100755
--- a/src/main/java/xyz/nifeather/morph/storage/DirectoryStorage.java
+++ b/src/main/java/xyz/nifeather/morph/storage/DirectoryStorage.java
@@ -19,7 +19,7 @@ public boolean initializeFailed()
         return initializeFailed;
     }
 
-    private boolean initializeFailed;
+    private boolean initializeFailed = false;
 
     private URI getAbsoulteURI(String path)
     {
@@ -53,6 +53,8 @@ public DirectoryStorage(String directoryBaseName)
                 this.initializeFailed = true;
             }
         }
+
+        this.initializeFailed = false;
     }
 
     public File[] getFiles(String pattern)
diff --git a/src/main/java/xyz/nifeather/morph/storage/skill/SkillsConfigurationStoreNew.java b/src/main/java/xyz/nifeather/morph/storage/skill/SkillsConfigurationStoreNew.java
index a7000e5c..fdc76bc1 100644
--- a/src/main/java/xyz/nifeather/morph/storage/skill/SkillsConfigurationStoreNew.java
+++ b/src/main/java/xyz/nifeather/morph/storage/skill/SkillsConfigurationStoreNew.java
@@ -52,16 +52,11 @@ private void migrateFromLegacyStorage()
         {
             logger.info("Migrating from legacy skill configuration...");
             var storage = new LegacyReadonlyConfigurationStorage();
-            var file = storage.file();
-
-            if (!file.exists())
-            {
-                logger.info("Legacy skill configuration doesn't exist, ignoring...");
-                return;
-            }
 
             storage.initializeStorage();
 
+            var file = storage.file();
+
             var storing = storage.getStoring();
             if (storing == null)
             {

From cb25bd201c23a4f7638da80bb5a7ac2bfd0c8d92 Mon Sep 17 00:00:00 2001
From: MATRIX-feather <midnightcarnival@outlook.com>
Date: Fri, 11 Oct 2024 22:33:53 +0800
Subject: [PATCH 12/28] =?UTF-8?q?misc:=20=E4=B8=80=E4=BA=9B=E6=94=B9?=
 =?UTF-8?q?=E8=BF=9B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../morph/storage/skill/SkillsConfigurationStoreNew.java       | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/src/main/java/xyz/nifeather/morph/storage/skill/SkillsConfigurationStoreNew.java b/src/main/java/xyz/nifeather/morph/storage/skill/SkillsConfigurationStoreNew.java
index fdc76bc1..2aa60573 100644
--- a/src/main/java/xyz/nifeather/morph/storage/skill/SkillsConfigurationStoreNew.java
+++ b/src/main/java/xyz/nifeather/morph/storage/skill/SkillsConfigurationStoreNew.java
@@ -34,8 +34,7 @@ private void update(int currentVersion)
     {
         if (currentVersion < PackageVersions.INITIAL)
         {
-            URI dataFolderUri = this.plugin.getDataFolder().toURI();
-            var legacySkillFile = new File(URI.create(dataFolderUri + "/" + "skills.json"));
+            var legacySkillFile = new File(this.plugin.getDataFolder(), "skills.json");
 
             if (legacySkillFile.exists())
                 migrateFromLegacyStorage();

From 4e7ab2f3ca7574da5976c70d2b1469eea38e87e0 Mon Sep 17 00:00:00 2001
From: MATRIX-feather <midnightcarnival@outlook.com>
Date: Fri, 11 Oct 2024 23:49:21 +0800
Subject: [PATCH 13/28] enhance: Same for playerdata

---
 .../xyz/nifeather/morph/MorphManager.java     |  26 +-
 .../nifeather/morph/misc/DisguiseMeta.java    |   4 +-
 .../storage/DirectoryJsonBasedStorage.java    |   5 +-
 ...aStore.java => LegacyPlayerDataStore.java} |  40 +--
 .../playerdata/PlayerDataStoreNew.java        | 287 ++++++++++++++++++
 5 files changed, 320 insertions(+), 42 deletions(-)
 rename src/main/java/xyz/nifeather/morph/storage/playerdata/{PlayerDataStore.java => LegacyPlayerDataStore.java} (82%)
 create mode 100644 src/main/java/xyz/nifeather/morph/storage/playerdata/PlayerDataStoreNew.java

diff --git a/src/main/java/xyz/nifeather/morph/MorphManager.java b/src/main/java/xyz/nifeather/morph/MorphManager.java
index 54aaa3c8..8d884db0 100644
--- a/src/main/java/xyz/nifeather/morph/MorphManager.java
+++ b/src/main/java/xyz/nifeather/morph/MorphManager.java
@@ -55,7 +55,7 @@
 import xyz.nifeather.morph.skills.SkillType;
 import xyz.nifeather.morph.storage.offlinestore.OfflineDisguiseState;
 import xyz.nifeather.morph.storage.offlinestore.OfflineStateStore;
-import xyz.nifeather.morph.storage.playerdata.PlayerDataStore;
+import xyz.nifeather.morph.storage.playerdata.PlayerDataStoreNew;
 import xyz.nifeather.morph.storage.playerdata.PlayerMeta;
 import xyz.nifeather.morph.utilities.DisguiseUtils;
 import xyz.nifeather.morph.utilities.PermissionUtils;
@@ -73,7 +73,7 @@ public class MorphManager extends MorphPluginObject implements IManagePlayerData
 {
     private final List<DisguiseState> activeDisguises = ObjectLists.synchronize(new ObjectArrayList<>());
 
-    private final PlayerDataStore data = new PlayerDataStore();
+    private final PlayerDataStoreNew data = new PlayerDataStoreNew();
 
     private final OfflineStateStore offlineStorage = new OfflineStateStore();
 
@@ -1566,6 +1566,15 @@ public boolean grantMorphToPlayer(Player player, String disguiseIdentifier)
             multiInstanceService.notifyDisguiseMetaChange(player.getUniqueId(), Operation.ADD_IF_ABSENT, disguiseIdentifier);
 
             var config = data.getPlayerMeta(player);
+            var locale = MessageUtils.getLocale(player);
+
+            var meta = data.getDisguiseMeta(disguiseIdentifier);
+            assert meta != null; // 这里不会出现meta是null的情况,除非抽了
+
+            var message = MessageUtils.prefixes(player, MorphStrings.morphUnlockedString()
+                    .withLocale(locale)
+                    .resolve("what", meta.asComponent(locale)));
+            player.sendMessage(message);
 
             if (clientHandler.clientConnected(player))
             {
@@ -1594,6 +1603,19 @@ public boolean revokeMorphFromPlayer(Player player, String disguiseIdentifier)
         {
             clientHandler.sendDiff(null, List.of(disguiseIdentifier), player);
             multiInstanceService.notifyDisguiseMetaChange(player.getUniqueId(), Operation.REMOVE, disguiseIdentifier);
+
+            var locale = MessageUtils.getLocale(player);
+            var meta = data.getDisguiseMeta(disguiseIdentifier);
+            assert meta != null; // 和上面一样
+
+            var message = MorphStrings.morphLockedString()
+                    .resolve("what", meta.asComponent(locale))
+                    .toComponent(locale);
+            player.sendMessage(message);
+
+            var disguiseState = this.getDisguiseStateFor(player);
+            if (disguiseState != null && disguiseState.getDisguiseIdentifier().equalsIgnoreCase(disguiseIdentifier))
+                this.unMorph(player, true);
         }
 
         return success;
diff --git a/src/main/java/xyz/nifeather/morph/misc/DisguiseMeta.java b/src/main/java/xyz/nifeather/morph/misc/DisguiseMeta.java
index 640c392f..9bb29101 100644
--- a/src/main/java/xyz/nifeather/morph/misc/DisguiseMeta.java
+++ b/src/main/java/xyz/nifeather/morph/misc/DisguiseMeta.java
@@ -109,9 +109,7 @@ public boolean equals(EntityType type)
 
     public boolean equals(String rawString)
     {
-        if (!this.isValid()) return false;
-
-        return this.disguiseType != DisguiseTypes.UNKNOWN && this.rawIdentifier.equals(rawString);
+        return this.rawIdentifier.equals(rawString);
     }
 
     /**
diff --git a/src/main/java/xyz/nifeather/morph/storage/DirectoryJsonBasedStorage.java b/src/main/java/xyz/nifeather/morph/storage/DirectoryJsonBasedStorage.java
index edbae589..b8c53bbc 100644
--- a/src/main/java/xyz/nifeather/morph/storage/DirectoryJsonBasedStorage.java
+++ b/src/main/java/xyz/nifeather/morph/storage/DirectoryJsonBasedStorage.java
@@ -7,10 +7,7 @@
 import org.jetbrains.annotations.Nullable;
 import xyz.nifeather.morph.MorphPluginObject;
 
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStreamReader;
+import java.io.*;
 import java.nio.charset.StandardCharsets;
 import java.nio.file.FileSystem;
 import java.nio.file.FileSystems;
diff --git a/src/main/java/xyz/nifeather/morph/storage/playerdata/PlayerDataStore.java b/src/main/java/xyz/nifeather/morph/storage/playerdata/LegacyPlayerDataStore.java
similarity index 82%
rename from src/main/java/xyz/nifeather/morph/storage/playerdata/PlayerDataStore.java
rename to src/main/java/xyz/nifeather/morph/storage/playerdata/LegacyPlayerDataStore.java
index a390d0c5..8a91b830 100644
--- a/src/main/java/xyz/nifeather/morph/storage/playerdata/PlayerDataStore.java
+++ b/src/main/java/xyz/nifeather/morph/storage/playerdata/LegacyPlayerDataStore.java
@@ -1,7 +1,6 @@
 package xyz.nifeather.morph.storage.playerdata;
 
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
-import net.kyori.adventure.text.Component;
 import org.bukkit.OfflinePlayer;
 import org.bukkit.entity.Player;
 import org.jetbrains.annotations.NotNull;
@@ -9,22 +8,23 @@
 import xiamomc.pluginbase.Annotations.Resolved;
 import xyz.nifeather.morph.MorphManager;
 import xyz.nifeather.morph.interfaces.IManagePlayerData;
-import xyz.nifeather.morph.messages.MessageUtils;
-import xyz.nifeather.morph.messages.MorphStrings;
 import xyz.nifeather.morph.misc.DisguiseMeta;
-import xyz.nifeather.morph.misc.DisguiseState;
 import xyz.nifeather.morph.misc.DisguiseTypes;
 import xyz.nifeather.morph.storage.MorphJsonBasedStorage;
 
+import java.io.File;
 import java.util.List;
 import java.util.Objects;
 
-public class PlayerDataStore extends MorphJsonBasedStorage<PlayerMetaContainer> implements IManagePlayerData
+@Deprecated(forRemoval = true)
+public class LegacyPlayerDataStore extends MorphJsonBasedStorage<PlayerMetaContainer> implements IManagePlayerData
 {
     private final List<DisguiseMeta> cachedMetas = new ObjectArrayList<>();
 
-    @Resolved
-    private MorphManager morphs;
+    public File file()
+    {
+        return this.configurationFile;
+    }
 
     @Override
     protected @NotNull String getFileName()
@@ -191,14 +191,6 @@ public boolean grantMorphToPlayer(Player player, String disguiseIdentifier)
         }
         else return false;
 
-        var locale = MessageUtils.getLocale(player);
-
-        sendMorphAcquiredNotification(player, morphs.getDisguiseStateFor(player),
-                MorphStrings.morphUnlockedString()
-                        .withLocale(locale)
-                        .resolve("what", meta.asComponent(locale))
-                        .toComponent(locale));
-
         return true;
     }
 
@@ -213,16 +205,6 @@ public boolean revokeMorphFromPlayer(Player player, String disguiseIdentifier)
         getPlayerMeta(player).removeDisguise(meta);
         saveConfiguration();
 
-        var state = morphs.getDisguiseStateFor(player);
-        if (state != null && meta.getKey().equals(state.getDisguiseIdentifier()))
-            morphs.unMorph(player, true);
-
-        var locale = MessageUtils.getLocale(player);
-        sendMorphAcquiredNotification(player, morphs.getDisguiseStateFor(player),
-                MorphStrings.morphLockedString()
-                        .resolve("what", meta.asComponent(locale))
-                        .toComponent(locale));
-
         return true;
     }
 
@@ -246,14 +228,6 @@ public ObjectArrayList<DisguiseMeta> getAvaliableDisguisesFor(Player player)
 
     //endregion Implementation of IManagePlayerData
 
-    private void sendMorphAcquiredNotification(Player player, @Nullable DisguiseState state, Component text)
-    {
-        if (state == null)
-            player.sendActionBar(text);
-        else
-            player.sendMessage(MessageUtils.prefixes(player, text));
-    }
-
     public synchronized List<PlayerMeta> getAll()
     {
         return new ObjectArrayList<>(storingObject.playerMetas);
diff --git a/src/main/java/xyz/nifeather/morph/storage/playerdata/PlayerDataStoreNew.java b/src/main/java/xyz/nifeather/morph/storage/playerdata/PlayerDataStoreNew.java
new file mode 100644
index 00000000..f72a6412
--- /dev/null
+++ b/src/main/java/xyz/nifeather/morph/storage/playerdata/PlayerDataStoreNew.java
@@ -0,0 +1,287 @@
+package xyz.nifeather.morph.storage.playerdata;
+
+import it.unimi.dsi.fastutil.objects.ObjectArrayList;
+import org.apache.commons.io.FileUtils;
+import org.bukkit.OfflinePlayer;
+import org.bukkit.entity.Player;
+import org.jetbrains.annotations.Nullable;
+import xiamomc.pluginbase.Annotations.Initializer;
+import xyz.nifeather.morph.interfaces.IManagePlayerData;
+import xyz.nifeather.morph.misc.DisguiseMeta;
+import xyz.nifeather.morph.misc.DisguiseTypes;
+import xyz.nifeather.morph.storage.DirectoryJsonBasedStorage;
+import xyz.nifeather.morph.storage.skill.SkillsConfigurationStoreNew;
+
+import java.io.File;
+import java.nio.charset.StandardCharsets;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+import java.util.concurrent.ConcurrentHashMap;
+
+public class PlayerDataStoreNew extends DirectoryJsonBasedStorage<PlayerMeta> implements IManagePlayerData
+{
+    private static final PlayerMeta defaultMeta = new PlayerMeta();
+
+    public PlayerDataStoreNew()
+    {
+        super("playerdata");
+    }
+
+    @Initializer
+    private void load()
+    {
+        var packageVersion = this.getPackageVersion();
+
+        if (packageVersion < TARGET_PACKAGE_VERSION)
+            update(packageVersion);
+    }
+
+    private static final int TARGET_PACKAGE_VERSION = SkillsConfigurationStoreNew.PackageVersions.INITIAL;
+
+    private void update(int currentVersion)
+    {
+        if (currentVersion < PackageVersions.INITIAL)
+        {
+            var legacyDataFile = new File(this.plugin.getDataFolder(), "data.json");
+
+            if (legacyDataFile.exists())
+                migrateFromLegacyStorage();
+        }
+
+        setPackageVersion(TARGET_PACKAGE_VERSION);
+    }
+
+    @SuppressWarnings("removal")
+    private void migrateFromLegacyStorage()
+    {
+        logger.info("Migrating player data...");
+
+        var legacyStorage = new LegacyPlayerDataStore();
+        legacyStorage.initializeStorage();
+
+        legacyStorage.getAll().forEach(this::save);
+
+        var file = legacyStorage.file();
+        var success = file.renameTo(new File(file.getParent(), "data.old.json"));
+
+        if (!success)
+            logger.info("Can't rename 'data.json' to 'data.old.json', but it's not a big deal, I guess...");
+
+
+        logger.info("Done migrating player data!");
+    }
+
+    public void save(PlayerMeta playerMeta)
+    {
+        var uuid = playerMeta.uniqueId;
+
+        if (uuid == null)
+        {
+            logger.warn("Found a PlayerMeta that doesn't have an UUID! Ignoring...");
+            return;
+        }
+
+        var path = this.getPath(playerMeta.uniqueId.toString()) + ".json";
+
+        var file = this.directoryStorage.getFile(path, true);
+        if (file == null)
+        {
+            logger.warn("Cannot save disguise configuration for " + uuid);
+            return;
+        }
+
+        String json = gson.toJson(playerMeta);
+        try
+        {
+            FileUtils.writeStringToFile(file, json, StandardCharsets.UTF_8);
+        }
+        catch (Throwable t)
+        {
+            logger.error("Can't write content to file: " + t.getMessage());
+        }
+    }
+
+    @Override
+    protected PlayerMeta getDefault()
+    {
+        return defaultMeta;
+    }
+
+    //region IManagePlayerData
+
+    private final Map<String, DisguiseMeta> cachedMetas = new ConcurrentHashMap<>();
+
+    /**
+     * 获取包含某一玩家的玩家名的伪装信息
+     *
+     * @param rawString 原始ID
+     * @return 伪装信息
+     * @apiNote 如果原始ID不是有效ID,则会返回null
+     */
+    @Override
+    public @Nullable DisguiseMeta getDisguiseMeta(String rawString)
+    {
+        var cached = cachedMetas.getOrDefault(rawString, null);
+        if (cached != null) return cached;
+
+        var type = DisguiseTypes.fromId(rawString);
+
+        var meta = new DisguiseMeta(rawString, type);
+        cachedMetas.put(rawString, meta);
+
+        return meta;
+    }
+
+    /**
+     * 获取某一玩家所有可用的伪装
+     *
+     * @param player 目标玩家
+     * @return 目标玩家拥有的伪装
+     */
+    @Override
+    public ObjectArrayList<DisguiseMeta> getAvaliableDisguisesFor(Player player)
+    {
+        return getPlayerMeta(player).getUnlockedDisguises();
+    }
+
+    /**
+     * 将伪装授予某一玩家
+     *
+     * @param player             要授予的玩家
+     * @param disguiseIdentifier 伪装ID
+     * @return 添加是否成功(伪装是否可用或玩家是否已经拥有目标伪装)
+     */
+    @Override
+    public boolean grantMorphToPlayer(Player player, String disguiseIdentifier)
+    {
+        var playerMeta = this.getPlayerMeta(player);
+        var disguiseMeta = this.getDisguiseMeta(disguiseIdentifier);
+
+        if (disguiseMeta == null) return false;
+
+        if (playerMeta.getUnlockedDisguiseIdentifiers()
+                .stream()
+                .anyMatch(str -> str.equalsIgnoreCase(disguiseIdentifier)))
+        {
+            return false;
+        }
+
+        playerMeta.addDisguise(disguiseMeta);
+        save(playerMeta);
+
+        return true;
+    }
+
+    /**
+     * 从某一玩家剥离伪装
+     *
+     * @param player             要授予的玩家
+     * @param disguiseIdentifier 伪装ID
+     * @return 添加是否成功(伪装是否可用或玩家是否已经拥有目标伪装)
+     */
+    @Override
+    public boolean revokeMorphFromPlayer(Player player, String disguiseIdentifier)
+    {
+        var playerMeta = getPlayerMeta(player);
+        var match = playerMeta.getUnlockedDisguises()
+                .stream()
+                .filter(meta -> meta.equals(disguiseIdentifier))
+                .findFirst()
+                .orElse(null);
+
+        if (match == null) return false;
+
+        playerMeta.removeDisguise(match);
+
+        return true;
+    }
+
+    private final Map<UUID, PlayerMeta> trackedPlayerMetaMap = new ConcurrentHashMap<>();
+
+    /**
+     * 获取玩家的伪装配置
+     *
+     * @param player 目标玩家
+     * @return 伪装信息
+     */
+    @Override
+    public PlayerMeta getPlayerMeta(OfflinePlayer player)
+    {
+        var uuid = player.getUniqueId();
+
+        var tracked = trackedPlayerMetaMap.getOrDefault(uuid, null);
+        if (tracked != null) return tracked;
+
+        var storedMeta = this.get(uuid.toString());
+        if (storedMeta != null)
+        {
+            trackedPlayerMetaMap.put(uuid, storedMeta);
+            return storedMeta;
+        }
+
+        var metaInstance = new PlayerMeta();
+        metaInstance.uniqueId = player.getUniqueId();
+        metaInstance.playerName = player.getName();
+
+        trackedPlayerMetaMap.put(uuid, metaInstance);
+
+        return metaInstance;
+    }
+
+    @Override
+    public boolean reloadConfiguration()
+    {
+        trackedPlayerMetaMap.clear();
+        return true;
+    }
+
+    @Override
+    public boolean saveConfiguration()
+    {
+        this.trackedPlayerMetaMap.forEach((uuid, meta) -> this.save(meta));
+
+        return true;
+    }
+
+    //endregion IManagePlayerData
+
+    public List<PlayerMeta> getAll()
+    {
+        loadAll();
+
+        return this.trackedPlayerMetaMap.values().stream().toList();
+    }
+
+    public void loadAll()
+    {
+        var files = this.directoryStorage.getFiles();
+        for (File file : files)
+        {
+            if (file.isDirectory()) return;
+
+            var fileName = file.getName();
+            UUID uuid = null;
+
+            try
+            {
+                uuid = UUID.fromString(fileName);
+            }
+            catch (Throwable ignored)
+            {
+            }
+
+            if (uuid == null || this.trackedPlayerMetaMap.containsKey(uuid)) return;
+
+            var meta = this.get(fileName);
+            if (meta == null) return;
+
+            this.trackedPlayerMetaMap.put(uuid, meta);
+        }
+    }
+
+    public static class PackageVersions
+    {
+        public static final int INITIAL = 1;
+    }
+}

From 8099aad2bdc931677e9a18ff24791d3f20f32ea7 Mon Sep 17 00:00:00 2001
From: MATRIX-feather <midnightcarnival@outlook.com>
Date: Fri, 11 Oct 2024 23:52:34 +0800
Subject: [PATCH 14/28] misc: xxx.old.json -> xxx.json.old

---
 .../morph/storage/playerdata/PlayerDataStoreNew.java          | 4 ++--
 .../morph/storage/skill/SkillsConfigurationStoreNew.java      | 4 ++--
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/src/main/java/xyz/nifeather/morph/storage/playerdata/PlayerDataStoreNew.java b/src/main/java/xyz/nifeather/morph/storage/playerdata/PlayerDataStoreNew.java
index f72a6412..2358411c 100644
--- a/src/main/java/xyz/nifeather/morph/storage/playerdata/PlayerDataStoreNew.java
+++ b/src/main/java/xyz/nifeather/morph/storage/playerdata/PlayerDataStoreNew.java
@@ -63,10 +63,10 @@ private void migrateFromLegacyStorage()
         legacyStorage.getAll().forEach(this::save);
 
         var file = legacyStorage.file();
-        var success = file.renameTo(new File(file.getParent(), "data.old.json"));
+        var success = file.renameTo(new File(file.getParent(), "data.json.old"));
 
         if (!success)
-            logger.info("Can't rename 'data.json' to 'data.old.json', but it's not a big deal, I guess...");
+            logger.info("Can't rename 'data.json' to 'data.json.old', but it's not a big deal, I guess...");
 
 
         logger.info("Done migrating player data!");
diff --git a/src/main/java/xyz/nifeather/morph/storage/skill/SkillsConfigurationStoreNew.java b/src/main/java/xyz/nifeather/morph/storage/skill/SkillsConfigurationStoreNew.java
index 2aa60573..2a850ba8 100644
--- a/src/main/java/xyz/nifeather/morph/storage/skill/SkillsConfigurationStoreNew.java
+++ b/src/main/java/xyz/nifeather/morph/storage/skill/SkillsConfigurationStoreNew.java
@@ -65,10 +65,10 @@ private void migrateFromLegacyStorage()
 
             storing.configurations.forEach(this::save);
 
-            var success = file.renameTo(new File(file.getParent(), "skills.old.json"));
+            var success = file.renameTo(new File(file.getParent(), "skills.json.old"));
 
             if (!success)
-                logger.info("Can't rename 'skills.json' to 'skills.old.json', but it's not a big deal, I guess...");
+                logger.info("Can't rename 'skills.json' to 'skills.json.old', but it's not a big deal, I guess...");
 
             logger.info("Done migrating legacy skill configuration!");
         }

From ecec99deb797c816c19cc93b0c239112e398fbc8 Mon Sep 17 00:00:00 2001
From: MATRIX-feather <midnightcarnival@outlook.com>
Date: Sat, 12 Oct 2024 00:20:46 +0800
Subject: [PATCH 15/28] =?UTF-8?q?fix:=20PlayerDataStoreNew=E6=B2=A1?=
 =?UTF-8?q?=E6=9C=89=E6=AD=A3=E7=A1=AE=E5=88=9D=E5=A7=8B=E5=8C=96PlayerMet?=
 =?UTF-8?q?a?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../storage/DirectoryJsonBasedStorage.java    |  9 ++++-
 .../playerdata/PlayerDataStoreNew.java        | 37 +++++++++++++++++--
 2 files changed, 40 insertions(+), 6 deletions(-)

diff --git a/src/main/java/xyz/nifeather/morph/storage/DirectoryJsonBasedStorage.java b/src/main/java/xyz/nifeather/morph/storage/DirectoryJsonBasedStorage.java
index b8c53bbc..7142aa50 100644
--- a/src/main/java/xyz/nifeather/morph/storage/DirectoryJsonBasedStorage.java
+++ b/src/main/java/xyz/nifeather/morph/storage/DirectoryJsonBasedStorage.java
@@ -42,7 +42,12 @@ protected DirectoryJsonBasedStorage(String dirBaseName)
             logger.warn("Failed initializing directory storage, please see errors above.");
     }
 
-    private final Map<String, Object> instancesMap = new ConcurrentHashMap<>();
+    private final Map<String, T> instancesMap = new ConcurrentHashMap<>();
+
+    protected Map<String, T> instanceMap()
+    {
+        return this.instancesMap;
+    }
 
     public void clearCache()
     {
@@ -149,7 +154,7 @@ public T get(String key)
         if (obj == null)
             obj = getDefault();
 
-        this.instancesMap.put(key, obj);
+        this.instancesMap.put(key, (T) obj);
         return obj == getDefault() ? null : (T) obj;
     }
 }
diff --git a/src/main/java/xyz/nifeather/morph/storage/playerdata/PlayerDataStoreNew.java b/src/main/java/xyz/nifeather/morph/storage/playerdata/PlayerDataStoreNew.java
index 2358411c..a7684803 100644
--- a/src/main/java/xyz/nifeather/morph/storage/playerdata/PlayerDataStoreNew.java
+++ b/src/main/java/xyz/nifeather/morph/storage/playerdata/PlayerDataStoreNew.java
@@ -26,11 +26,7 @@ public class PlayerDataStoreNew extends DirectoryJsonBasedStorage<PlayerMeta> im
     public PlayerDataStoreNew()
     {
         super("playerdata");
-    }
 
-    @Initializer
-    private void load()
-    {
         var packageVersion = this.getPackageVersion();
 
         if (packageVersion < TARGET_PACKAGE_VERSION)
@@ -216,7 +212,9 @@ public PlayerMeta getPlayerMeta(OfflinePlayer player)
         var storedMeta = this.get(uuid.toString());
         if (storedMeta != null)
         {
+            initializePlayerMeta(storedMeta);
             trackedPlayerMetaMap.put(uuid, storedMeta);
+
             return storedMeta;
         }
 
@@ -229,10 +227,39 @@ public PlayerMeta getPlayerMeta(OfflinePlayer player)
         return metaInstance;
     }
 
+    private void initializePlayerMeta(PlayerMeta c)
+    {
+        //要设置给c.unlockedDisguises的列表
+        var list = new ObjectArrayList<DisguiseMeta>();
+
+        //原始列表
+        var unlockedDisguiseIdentifiers = c.getUnlockedDisguiseIdentifiers();
+
+        //先对原始列表排序
+        unlockedDisguiseIdentifiers.sort(null);
+
+        //然后逐个添加
+        unlockedDisguiseIdentifiers.forEach(disguiseId ->
+        {
+            var type = DisguiseTypes.fromId(disguiseId);
+
+            if (type != null)
+                list.add(new DisguiseMeta(disguiseId, DisguiseTypes.fromId(disguiseId)));
+            else
+                logger.warn("Unknown disguise identifier data '%s' owned by '%s'".formatted(disguiseId, c.uniqueId));
+        });
+
+        //设置可用的伪装列表并对其加锁
+        c.setUnlockedDisguises(list);
+        c.lockDisguiseList();
+    }
+
     @Override
     public boolean reloadConfiguration()
     {
+        clearCache();
         trackedPlayerMetaMap.clear();
+
         return true;
     }
 
@@ -276,6 +303,8 @@ public void loadAll()
             var meta = this.get(fileName);
             if (meta == null) return;
 
+            initializePlayerMeta(meta);
+
             this.trackedPlayerMetaMap.put(uuid, meta);
         }
     }

From cd3879251c90fabbda0af676ffddacfceb3a7230 Mon Sep 17 00:00:00 2001
From: MATRIX-feather <midnightcarnival@outlook.com>
Date: Sat, 12 Oct 2024 00:32:59 +0800
Subject: [PATCH 16/28] =?UTF-8?q?misc:=20=E7=A1=AE=E4=BF=9D=E8=B0=83?=
 =?UTF-8?q?=E7=94=A8MorphManager#listAllPlayerMeta()=E6=97=B6=E6=89=80?=
 =?UTF-8?q?=E6=9C=89PlayerMeta=E9=83=BD=E4=BC=9A=E8=A2=AB=E5=8A=A0?=
 =?UTF-8?q?=E8=BD=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../xyz/nifeather/morph/MorphManager.java     |  1 +
 .../playerdata/PlayerDataStoreNew.java        | 30 +++++++++++++++----
 2 files changed, 26 insertions(+), 5 deletions(-)

diff --git a/src/main/java/xyz/nifeather/morph/MorphManager.java b/src/main/java/xyz/nifeather/morph/MorphManager.java
index 8d884db0..a301ea48 100644
--- a/src/main/java/xyz/nifeather/morph/MorphManager.java
+++ b/src/main/java/xyz/nifeather/morph/MorphManager.java
@@ -1686,6 +1686,7 @@ public boolean saveConfiguration()
     @ApiStatus.Internal
     public List<PlayerMeta> listAllPlayerMeta()
     {
+        data.shouldLoadAllData(true);
         return data.getAll();
     }
 }
\ No newline at end of file
diff --git a/src/main/java/xyz/nifeather/morph/storage/playerdata/PlayerDataStoreNew.java b/src/main/java/xyz/nifeather/morph/storage/playerdata/PlayerDataStoreNew.java
index a7684803..6c410a72 100644
--- a/src/main/java/xyz/nifeather/morph/storage/playerdata/PlayerDataStoreNew.java
+++ b/src/main/java/xyz/nifeather/morph/storage/playerdata/PlayerDataStoreNew.java
@@ -18,6 +18,7 @@
 import java.util.Map;
 import java.util.UUID;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.atomic.AtomicBoolean;
 
 public class PlayerDataStoreNew extends DirectoryJsonBasedStorage<PlayerMeta> implements IManagePlayerData
 {
@@ -260,6 +261,9 @@ public boolean reloadConfiguration()
         clearCache();
         trackedPlayerMetaMap.clear();
 
+        if (noLazyLoad.get())
+            loadAll();
+
         return true;
     }
 
@@ -273,21 +277,34 @@ public boolean saveConfiguration()
 
     //endregion IManagePlayerData
 
-    public List<PlayerMeta> getAll()
+    private final AtomicBoolean noLazyLoad = new AtomicBoolean(false);
+
+    public void shouldLoadAllData(boolean val)
     {
-        loadAll();
+        noLazyLoad.set(val);
+
+        if (val)
+            loadAll();
+    }
 
+    public List<PlayerMeta> getAll()
+    {
         return this.trackedPlayerMetaMap.values().stream().toList();
     }
 
     public void loadAll()
     {
+        logger.info("Force loading all player data...");
         var files = this.directoryStorage.getFiles();
+
+        int count = 0;
         for (File file : files)
         {
-            if (file.isDirectory()) return;
+            if (file.isDirectory()) continue;
 
             var fileName = file.getName();
+            fileName = fileName.substring(0, fileName.lastIndexOf("."));
+
             UUID uuid = null;
 
             try
@@ -298,15 +315,18 @@ public void loadAll()
             {
             }
 
-            if (uuid == null || this.trackedPlayerMetaMap.containsKey(uuid)) return;
+            if (uuid == null || this.trackedPlayerMetaMap.containsKey(uuid)) continue;
 
             var meta = this.get(fileName);
-            if (meta == null) return;
+            if (meta == null) continue;
 
             initializePlayerMeta(meta);
 
             this.trackedPlayerMetaMap.put(uuid, meta);
+            count++;
         }
+
+        logger.info("Loaded %s player data".formatted(count));
     }
 
     public static class PackageVersions

From 2e664ed14de45f9a04c52d3d7ecb65aafb304769 Mon Sep 17 00:00:00 2001
From: MATRIX-feather <midnightcarnival@outlook.com>
Date: Sat, 12 Oct 2024 00:57:16 +0800
Subject: [PATCH 17/28] =?UTF-8?q?enhance:=20=E4=BD=BFSkillHandler=E4=BD=BF?=
 =?UTF-8?q?=E7=94=A8DisguiseState=E4=B8=AD=E7=9A=84=E6=8A=80=E8=83=BD?=
 =?UTF-8?q?=E5=92=8C=E6=8A=80=E8=83=BD=E9=85=8D=E7=BD=AE?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../nifeather/morph/misc/DisguiseState.java   | 30 ++++++++++-----
 .../disguise/DefaultDisguiseProvider.java     |  8 +++-
 .../morph/skills/MorphSkillHandler.java       | 37 ++++++-------------
 3 files changed, 40 insertions(+), 35 deletions(-)

diff --git a/src/main/java/xyz/nifeather/morph/misc/DisguiseState.java b/src/main/java/xyz/nifeather/morph/misc/DisguiseState.java
index 87796ab0..af7b561b 100644
--- a/src/main/java/xyz/nifeather/morph/misc/DisguiseState.java
+++ b/src/main/java/xyz/nifeather/morph/misc/DisguiseState.java
@@ -31,12 +31,10 @@
 import xyz.nifeather.morph.network.server.MorphClientHandler;
 import xyz.nifeather.morph.providers.animation.SingleAnimation;
 import xyz.nifeather.morph.providers.disguise.DisguiseProvider;
-import xyz.nifeather.morph.skills.IMorphSkill;
-import xyz.nifeather.morph.skills.MorphSkillHandler;
-import xyz.nifeather.morph.skills.SkillCooldownInfo;
-import xyz.nifeather.morph.skills.SkillType;
+import xyz.nifeather.morph.skills.*;
 import xyz.nifeather.morph.skills.impl.NoneMorphSkill;
 import xyz.nifeather.morph.storage.playerdata.PlayerMeta;
+import xyz.nifeather.morph.storage.skill.SkillAbilityConfiguration;
 import xyz.nifeather.morph.utilities.ItemUtils;
 import xyz.nifeather.morph.utilities.NbtUtils;
 import xyz.nifeather.morph.utilities.PermissionUtils;
@@ -556,22 +554,36 @@ public void skillLookupIdentifier(@NotNull String newSkillID)
         this.skillLookupIdentifier = newSkillID;
     }
 
+    @Nullable
+    private SkillAbilityConfiguration skillAbilityConfiguration;
+
+    public void setSkillAbilityConfiguration(@Nullable SkillAbilityConfiguration newInstance)
+    {
+        this.skillAbilityConfiguration = newInstance;
+    }
+
+    @Nullable
+    public SkillAbilityConfiguration getSkillAbilityConfiguration()
+    {
+        return skillAbilityConfiguration;
+    }
+
     @NotNull
     private IMorphSkill<?> skill = NoneMorphSkill.instance;
 
     /**
      * 设置此伪装的技能
-     * @param s 目标技能
+     * @param newSkill 目标技能
      * @apiNote 如果目标技能是null,则会fallback到 {@link NoneMorphSkill#instance}
      */
-    public void setSkill(@Nullable IMorphSkill<?> s)
+    public void setSkill(@Nullable IMorphSkill<?> newSkill)
     {
-        if (s == null) s = NoneMorphSkill.instance;
+        if (newSkill == null) newSkill = NoneMorphSkill.instance;
 
         this.skill.onDeEquip(this);
 
-        s.onInitialEquip(this);
-        this.skill = s;
+        newSkill.onInitialEquip(this);
+        this.skill = newSkill;
     }
 
     /**
diff --git a/src/main/java/xyz/nifeather/morph/providers/disguise/DefaultDisguiseProvider.java b/src/main/java/xyz/nifeather/morph/providers/disguise/DefaultDisguiseProvider.java
index 135868bb..cd2c537f 100644
--- a/src/main/java/xyz/nifeather/morph/providers/disguise/DefaultDisguiseProvider.java
+++ b/src/main/java/xyz/nifeather/morph/providers/disguise/DefaultDisguiseProvider.java
@@ -23,6 +23,7 @@
 import xyz.nifeather.morph.skills.SkillType;
 import xiamomc.pluginbase.Annotations.Resolved;
 import xiamomc.pluginbase.Messages.MessageStore;
+import xyz.nifeather.morph.storage.skill.ISkillOption;
 
 import java.util.List;
 
@@ -202,6 +203,11 @@ public void postConstructDisguise(DisguiseState state, @Nullable Entity targetEn
         var abilityOptions = abilityHandler.getOptionsFor(state.skillLookupIdentifier());
         abilityOptions.forEach((id, config) -> state.getAbilityUpdater().setAbilityConfig(id.asString(), config));
 
-        state.setSkill(skillHandler.lookupDisguiseSkill(state.skillLookupIdentifier()));
+        var skillEntry = skillHandler.getSkillEntry(state.skillLookupIdentifier());
+        if (skillEntry != null)
+        {
+            state.setSkillAbilityConfiguration(skillEntry.key());
+            state.setSkill(skillEntry.value());
+        }
     }
 }
diff --git a/src/main/java/xyz/nifeather/morph/skills/MorphSkillHandler.java b/src/main/java/xyz/nifeather/morph/skills/MorphSkillHandler.java
index b701dff5..badf7e72 100644
--- a/src/main/java/xyz/nifeather/morph/skills/MorphSkillHandler.java
+++ b/src/main/java/xyz/nifeather/morph/skills/MorphSkillHandler.java
@@ -25,6 +25,7 @@
 import xyz.nifeather.morph.messages.MorphStrings;
 import xyz.nifeather.morph.messages.SkillStrings;
 import xyz.nifeather.morph.misc.permissions.CommonPermissions;
+import xyz.nifeather.morph.providers.disguise.DefaultDisguiseProvider;
 import xyz.nifeather.morph.skills.impl.*;
 import xyz.nifeather.morph.storage.skill.ISkillOption;
 import xyz.nifeather.morph.storage.skill.SkillAbilityConfiguration;
@@ -149,7 +150,7 @@ private void update()
      * @return 对应的技能和技能配置,如果没找到则是null
      */
     @Nullable
-    private Pair<SkillAbilityConfiguration, IMorphSkill<?>> getSkillEntry(String identifier)
+    public Pair<SkillAbilityConfiguration, IMorphSkill<?>> getSkillEntry(String identifier)
     {
         if (identifier == null) return null;
 
@@ -215,11 +216,9 @@ public void executeDisguiseSkill(Player player, boolean bypassPermission)
             return;
         }
 
-        var skillEntry= getSkillEntry(state.skillLookupIdentifier());
+        var skill = state.getSkill();
 
-        if (player.getGameMode() == GameMode.SPECTATOR
-            || skillEntry == null
-            || skillEntry.key().getSkillIdentifier().equals(SkillType.NONE))
+        if (player.getGameMode() == GameMode.SPECTATOR || skill == NoneMorphSkill.instance)
         {
             player.sendMessage(MessageUtils.prefixes(player, SkillStrings.skillNotAvaliableString()));
 
@@ -230,11 +229,9 @@ public void executeDisguiseSkill(Player player, boolean bypassPermission)
         }
 
         var cdInfo = getCooldownInfo(player.getUniqueId(), state.skillLookupIdentifier());
-        assert cdInfo != null;
-
         //logger.info("Permission is " + CommonPermissions.skillPermissionOf(skillEntry.getKey().getSkillIdentifier().asString(), state.getDisguiseIdentifier()));
 
-        var singleSkillPerm = CommonPermissions.skillPermissionOf(skillEntry.key().getSkillIdentifier().asString(), state.getDisguiseIdentifier());
+        var singleSkillPerm = CommonPermissions.skillPermissionOf(skill.getIdentifier().asString(), state.getDisguiseIdentifier());
         var hasSkillPerm = PermissionUtils.hasPermission(player, singleSkillPerm, true);
 
         if (!bypassPermission && !hasSkillPerm)
@@ -269,28 +266,18 @@ public void executeDisguiseSkill(Player player, boolean bypassPermission)
             return;
         }
 
-        var skill = skillEntry.right();
-        var config = skillEntry.left();
-
-        ISkillOption option;
-
-        try
-        {
-            option = skill.getOptionInstance().fromMap(config.getSkillOptions(skill));
-        }
-        catch (Throwable t)
+        SkillAbilityConfiguration config = state.getSkillAbilityConfiguration();
+        if (config == null)
         {
-            if (t instanceof ClassCastException)
-                logger.error(state.getDisguiseIdentifier() + " -> " + skill.getIdentifier() + " has an invalid setting, please check your skill configurations.");
-            else
-                logger.error("Error occurred while parsing skill configuration");
-
-            t.printStackTrace();
-
+            logger.warn("Disguise have a skill but don't have a skill configuration?!");
             player.sendMessage(MessageUtils.prefixes(player, SkillStrings.exceptionOccurredString()));
+            state.setSkillCooldown(20, true);
+
             return;
         }
 
+        var option = skill.getOptionInstance().fromMap(config.getSkillOptions(skill));
+
         var cd = skill.executeSkillGeneric(player, state, config, option);
         cdInfo.setLastInvoke(plugin.getCurrentTick());
 

From b2299d1da2a06dbc2834762383dac64f7609e27c Mon Sep 17 00:00:00 2001
From: MATRIX-feather <midnightcarnival@outlook.com>
Date: Sat, 12 Oct 2024 01:00:25 +0800
Subject: [PATCH 18/28] =?UTF-8?q?misc:=20=E4=B8=80=E4=BA=9B=E8=B0=83?=
 =?UTF-8?q?=E6=95=B4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../nifeather/morph/misc/DisguiseState.java   | 22 +++++++++++--------
 .../disguise/DefaultDisguiseProvider.java     |  5 +----
 2 files changed, 14 insertions(+), 13 deletions(-)

diff --git a/src/main/java/xyz/nifeather/morph/misc/DisguiseState.java b/src/main/java/xyz/nifeather/morph/misc/DisguiseState.java
index af7b561b..e502e2aa 100644
--- a/src/main/java/xyz/nifeather/morph/misc/DisguiseState.java
+++ b/src/main/java/xyz/nifeather/morph/misc/DisguiseState.java
@@ -34,6 +34,7 @@
 import xyz.nifeather.morph.skills.*;
 import xyz.nifeather.morph.skills.impl.NoneMorphSkill;
 import xyz.nifeather.morph.storage.playerdata.PlayerMeta;
+import xyz.nifeather.morph.storage.skill.ISkillOption;
 import xyz.nifeather.morph.storage.skill.SkillAbilityConfiguration;
 import xyz.nifeather.morph.utilities.ItemUtils;
 import xyz.nifeather.morph.utilities.NbtUtils;
@@ -557,11 +558,6 @@ public void skillLookupIdentifier(@NotNull String newSkillID)
     @Nullable
     private SkillAbilityConfiguration skillAbilityConfiguration;
 
-    public void setSkillAbilityConfiguration(@Nullable SkillAbilityConfiguration newInstance)
-    {
-        this.skillAbilityConfiguration = newInstance;
-    }
-
     @Nullable
     public SkillAbilityConfiguration getSkillAbilityConfiguration()
     {
@@ -574,14 +570,22 @@ public SkillAbilityConfiguration getSkillAbilityConfiguration()
     /**
      * 设置此伪装的技能
      * @param newSkill 目标技能
-     * @apiNote 如果目标技能是null,则会fallback到 {@link NoneMorphSkill#instance}
+     * @param config 与技能对应的配置
+     * @apiNote 如果目标技能是null,则会fallback到 {@link NoneMorphSkill#instance},并一并清除技能配置
      */
-    public void setSkill(@Nullable IMorphSkill<?> newSkill)
+    public <X extends ISkillOption> void setSkill(@Nullable IMorphSkill<X> newSkill,
+                                                  SkillAbilityConfiguration config)
     {
-        if (newSkill == null) newSkill = NoneMorphSkill.instance;
+        if (newSkill == null)
+        {
+            this.skill = NoneMorphSkill.instance;
+            this.skillAbilityConfiguration = null;
+            return;
+        }
 
         this.skill.onDeEquip(this);
 
+        this.skillAbilityConfiguration = config;
         newSkill.onInitialEquip(this);
         this.skill = newSkill;
     }
@@ -907,7 +911,7 @@ public void reset(boolean unDisguise)
             this.provider.unMorph(getPlayer(), this);
 
         this.abilityUpdater.setAbilities(List.of());
-        this.setSkill(null);
+        this.setSkill(null, null);
     }
 
     public void reset()
diff --git a/src/main/java/xyz/nifeather/morph/providers/disguise/DefaultDisguiseProvider.java b/src/main/java/xyz/nifeather/morph/providers/disguise/DefaultDisguiseProvider.java
index cd2c537f..5b27ee43 100644
--- a/src/main/java/xyz/nifeather/morph/providers/disguise/DefaultDisguiseProvider.java
+++ b/src/main/java/xyz/nifeather/morph/providers/disguise/DefaultDisguiseProvider.java
@@ -205,9 +205,6 @@ public void postConstructDisguise(DisguiseState state, @Nullable Entity targetEn
 
         var skillEntry = skillHandler.getSkillEntry(state.skillLookupIdentifier());
         if (skillEntry != null)
-        {
-            state.setSkillAbilityConfiguration(skillEntry.key());
-            state.setSkill(skillEntry.value());
-        }
+            state.setSkill(skillEntry.value(), skillEntry.key());
     }
 }

From 784ae292ed6f39c8fee596ff9906dec56f82294e Mon Sep 17 00:00:00 2001
From: MATRIX-feather <midnightcarnival@outlook.com>
Date: Sat, 12 Oct 2024 13:35:15 +0800
Subject: [PATCH 19/28] =?UTF-8?q?misc:=20=E4=B8=8D=E8=A6=81=E5=BA=8F?=
 =?UTF-8?q?=E5=88=97=E5=8C=96PlayerMeta=E7=9A=84uuid=20=20=20=20=20-=20?=
 =?UTF-8?q?=E8=BD=AC=E8=80=8C=E5=9C=A8=E8=8E=B7=E5=8F=96=E6=97=B6=E4=B8=BA?=
 =?UTF-8?q?=E4=BB=96=E4=BB=AC=E8=B5=8B=E5=80=BC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../storage/playerdata/PlayerDataStoreNew.java   | 16 +++++++++-------
 .../morph/storage/playerdata/PlayerMeta.java     |  2 +-
 2 files changed, 10 insertions(+), 8 deletions(-)

diff --git a/src/main/java/xyz/nifeather/morph/storage/playerdata/PlayerDataStoreNew.java b/src/main/java/xyz/nifeather/morph/storage/playerdata/PlayerDataStoreNew.java
index 6c410a72..5336aee6 100644
--- a/src/main/java/xyz/nifeather/morph/storage/playerdata/PlayerDataStoreNew.java
+++ b/src/main/java/xyz/nifeather/morph/storage/playerdata/PlayerDataStoreNew.java
@@ -213,7 +213,7 @@ public PlayerMeta getPlayerMeta(OfflinePlayer player)
         var storedMeta = this.get(uuid.toString());
         if (storedMeta != null)
         {
-            initializePlayerMeta(storedMeta);
+            initializePlayerMeta(storedMeta, uuid);
             trackedPlayerMetaMap.put(uuid, storedMeta);
 
             return storedMeta;
@@ -228,13 +228,15 @@ public PlayerMeta getPlayerMeta(OfflinePlayer player)
         return metaInstance;
     }
 
-    private void initializePlayerMeta(PlayerMeta c)
+    private void initializePlayerMeta(PlayerMeta meta, UUID matchingUUID)
     {
+        meta.uniqueId = matchingUUID;
+
         //要设置给c.unlockedDisguises的列表
         var list = new ObjectArrayList<DisguiseMeta>();
 
         //原始列表
-        var unlockedDisguiseIdentifiers = c.getUnlockedDisguiseIdentifiers();
+        var unlockedDisguiseIdentifiers = meta.getUnlockedDisguiseIdentifiers();
 
         //先对原始列表排序
         unlockedDisguiseIdentifiers.sort(null);
@@ -247,12 +249,12 @@ private void initializePlayerMeta(PlayerMeta c)
             if (type != null)
                 list.add(new DisguiseMeta(disguiseId, DisguiseTypes.fromId(disguiseId)));
             else
-                logger.warn("Unknown disguise identifier data '%s' owned by '%s'".formatted(disguiseId, c.uniqueId));
+                logger.warn("Unknown disguise identifier data '%s' owned by '%s'".formatted(disguiseId, matchingUUID));
         });
 
         //设置可用的伪装列表并对其加锁
-        c.setUnlockedDisguises(list);
-        c.lockDisguiseList();
+        meta.setUnlockedDisguises(list);
+        meta.lockDisguiseList();
     }
 
     @Override
@@ -320,7 +322,7 @@ public void loadAll()
             var meta = this.get(fileName);
             if (meta == null) continue;
 
-            initializePlayerMeta(meta);
+            initializePlayerMeta(meta, uuid);
 
             this.trackedPlayerMetaMap.put(uuid, meta);
             count++;
diff --git a/src/main/java/xyz/nifeather/morph/storage/playerdata/PlayerMeta.java b/src/main/java/xyz/nifeather/morph/storage/playerdata/PlayerMeta.java
index b819d278..d7d09563 100644
--- a/src/main/java/xyz/nifeather/morph/storage/playerdata/PlayerMeta.java
+++ b/src/main/java/xyz/nifeather/morph/storage/playerdata/PlayerMeta.java
@@ -13,7 +13,7 @@ public class PlayerMeta
     /**
      * 玩家的UUID
      */
-    @Expose
+    @Expose(serialize = false)
     public UUID uniqueId;
 
     /**

From 6e5a880675016cb36c145c1332f0ac28fe8ab0a2 Mon Sep 17 00:00:00 2001
From: MATRIX-feather <midnightcarnival@outlook.com>
Date: Sat, 12 Oct 2024 14:28:39 +0800
Subject: [PATCH 20/28] misc: '@' is allowed for both ext4 and ntfs

---
 .../xyz/nifeather/morph/storage/DirectoryJsonBasedStorage.java   | 1 -
 1 file changed, 1 deletion(-)

diff --git a/src/main/java/xyz/nifeather/morph/storage/DirectoryJsonBasedStorage.java b/src/main/java/xyz/nifeather/morph/storage/DirectoryJsonBasedStorage.java
index 7142aa50..4813e0e7 100644
--- a/src/main/java/xyz/nifeather/morph/storage/DirectoryJsonBasedStorage.java
+++ b/src/main/java/xyz/nifeather/morph/storage/DirectoryJsonBasedStorage.java
@@ -114,7 +114,6 @@ public int getPackageVersion()
     public String getPath(String key)
     {
         return key.replace(":", "/")
-                .replace("@", "$")
                 .replaceAll("[^a-zA-Z0-9\\-]]", "_");
     }
 

From 92f280d4ff8cbc95c4b6ad92ad5330bcbd907e8f Mon Sep 17 00:00:00 2001
From: MATRIX-feather <midnightcarnival@outlook.com>
Date: Sun, 13 Oct 2024 14:11:41 +0800
Subject: [PATCH 21/28] =?UTF-8?q?fix:=20=E7=9B=94=E7=94=B2=E6=9E=B6?=
 =?UTF-8?q?=E4=BC=AA=E8=A3=85=E4=B8=8D=E4=BC=9A=E9=81=B5=E4=BB=8E=E6=BA=90?=
 =?UTF-8?q?=E5=AE=9E=E4=BD=93=E7=9A=84Pose=E7=AD=89=E5=B1=9E=E6=80=A7=20mi?=
 =?UTF-8?q?sc:=20=E5=88=B7=E6=96=B0Watcher=E6=97=B6=E4=B8=8D=E8=A6=81?=
 =?UTF-8?q?=E4=BB=8E=E4=BB=96=E4=BB=AC=E9=82=A3=E9=87=8C=E5=90=88=E5=B9=B6?=
 =?UTF-8?q?NBT=EF=BC=8C=E5=9B=A0=E4=B8=BA=E6=AD=A4=E8=A1=8C=E4=B8=BA?=
 =?UTF-8?q?=E5=B7=B2=E7=BB=8F=E4=B8=8D=E5=86=8D=E9=9C=80=E8=A6=81=E4=BA=86?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../xyz/nifeather/morph/MorphManager.java     |  2 -
 .../server/ServerDisguiseWrapper.java         | 56 ++++++++-----------
 .../datawatcher/watchers/SingleWatcher.java   |  1 +
 .../watchers/types/ArmorStandWatcher.java     | 56 ++++++++++++++-----
 .../network/registries/CustomEntries.java     |  4 ++
 .../providers/disguise/DisguiseProvider.java  |  4 +-
 6 files changed, 71 insertions(+), 52 deletions(-)

diff --git a/src/main/java/xyz/nifeather/morph/MorphManager.java b/src/main/java/xyz/nifeather/morph/MorphManager.java
index a301ea48..d5f6a863 100644
--- a/src/main/java/xyz/nifeather/morph/MorphManager.java
+++ b/src/main/java/xyz/nifeather/morph/MorphManager.java
@@ -16,7 +16,6 @@
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 import xyz.nifeather.morph.abilities.AbilityManager;
-import xyz.nifeather.morph.abilities.MorphAbility;
 import xyz.nifeather.morph.backends.DisguiseBackend;
 import xyz.nifeather.morph.backends.DisguiseWrapper;
 import xyz.nifeather.morph.backends.WrapperAttribute;
@@ -33,7 +32,6 @@
 import xyz.nifeather.morph.messages.HintStrings;
 import xyz.nifeather.morph.messages.MessageUtils;
 import xyz.nifeather.morph.messages.MorphStrings;
-import xyz.nifeather.morph.messages.vanilla.VanillaMessageStore;
 import xyz.nifeather.morph.misc.disguiseProperty.DisguiseProperties;
 import xyz.nifeather.morph.misc.disguiseProperty.SingleProperty;
 import xyz.nifeather.morph.misc.permissions.CommonPermissions;
diff --git a/src/main/java/xyz/nifeather/morph/backends/server/ServerDisguiseWrapper.java b/src/main/java/xyz/nifeather/morph/backends/server/ServerDisguiseWrapper.java
index 6f8a0901..83eb60fb 100644
--- a/src/main/java/xyz/nifeather/morph/backends/server/ServerDisguiseWrapper.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/ServerDisguiseWrapper.java
@@ -303,14 +303,36 @@ public void setRenderParameters(@NotNull Player newBinding, @NotNull SingleWatch
         if (this.bindingWatcher != null)
             this.bindingWatcher.dispose();
 
+        refreshRegistry(newBinding, bindingWatcher);
+
         this.bindingWatcher = bindingWatcher;
 
         this.disguiseProperties.forEach((property, value) ->
         {
             bindingWatcher.writeProperty((SingleProperty<Object>) property, value);
         });
+    }
+
+    private void refreshRegistry(@NotNull Player bindingPlayer, @NotNull SingleWatcher bindingWatcher)
+    {
+        //和watcher同步我们的NBT
+        bindingWatcher.mergeFromCompound(getCompound(false));
+
+        if (getEntityType() == EntityType.PLAYER)
+        {
+            var profileOptional = readOrDefault(WrapperAttribute.profile);
+            profileOptional.ifPresent(p -> bindingWatcher.writeEntry(CustomEntries.PROFILE, p));
+        }
 
-        refreshRegistry();
+        //todo: 激活刷新时也刷新到玩家
+        if (bindingWatcher instanceof InventoryLivingWatcher)
+        {
+            bindingWatcher.writeEntry(CustomEntries.DISPLAY_FAKE_EQUIPMENT, readOrDefault(WrapperAttribute.displayFakeEquip));
+            bindingWatcher.writeEntry(CustomEntries.EQUIPMENT, this.equipment);
+        }
+
+        if (bindingWatcher.getEntityType() == EntityType.GHAST)
+            bindingWatcher.writePersistent(ValueIndex.GHAST.CHARGING, aggressive);
     }
 
     @Override
@@ -339,36 +361,4 @@ public void onPlayerJoin(Player newInstance)
 
         super.onPlayerJoin(newInstance);
     }
-
-    private void refreshRegistry()
-    {
-        if (bindingPlayer == null)
-            return;
-
-        if (bindingWatcher == null)
-        {
-            logger.warn("Have a bindingPlayer but no bindingWatcher?!");
-            Thread.dumpStack();
-            return;
-        }
-
-        //和watcher同步我们的NBT
-        bindingWatcher.mergeFromCompound(getCompound());
-
-        if (getEntityType() == EntityType.PLAYER)
-        {
-            var profileOptional = readOrDefault(WrapperAttribute.profile);
-            profileOptional.ifPresent(p -> bindingWatcher.writeEntry(CustomEntries.PROFILE, p));
-        }
-
-        //todo: 激活刷新时也刷新到玩家
-        if (bindingWatcher instanceof InventoryLivingWatcher)
-        {
-            bindingWatcher.writeEntry(CustomEntries.DISPLAY_FAKE_EQUIPMENT, readOrDefault(WrapperAttribute.displayFakeEquip));
-            bindingWatcher.writeEntry(CustomEntries.EQUIPMENT, this.equipment);
-        }
-
-        if (bindingWatcher.getEntityType() == EntityType.GHAST)
-            bindingWatcher.writePersistent(ValueIndex.GHAST.CHARGING, aggressive);
-    }
 }
diff --git a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/SingleWatcher.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/SingleWatcher.java
index ededdeb4..c2868f78 100644
--- a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/SingleWatcher.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/SingleWatcher.java
@@ -351,6 +351,7 @@ protected <X> void onTrackerWrite(SingleValue<X> single, @Nullable X oldVal, @Nu
     {
     }
 
+    @NotNull
     public <X> X read(SingleValue<X> singleValue)
     {
         return this.readOr(singleValue, singleValue.defaultValue());
diff --git a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/ArmorStandWatcher.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/ArmorStandWatcher.java
index 87c4a432..731649f9 100644
--- a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/ArmorStandWatcher.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/ArmorStandWatcher.java
@@ -5,10 +5,13 @@
 import net.minecraft.nbt.ListTag;
 import org.bukkit.entity.EntityType;
 import org.bukkit.entity.Player;
+import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values.SingleValue;
+import xyz.nifeather.morph.backends.server.renderer.network.registries.CustomEntries;
 import xyz.nifeather.morph.backends.server.renderer.network.registries.ValueIndex;
 import xyz.nifeather.morph.misc.disguiseProperty.DisguiseProperties;
 import xyz.nifeather.morph.misc.disguiseProperty.SingleProperty;
 import xyz.nifeather.morph.misc.disguiseProperty.values.ArmorStandProperties;
+import xyz.nifeather.morph.utilities.NbtUtils;
 
 public class ArmorStandWatcher extends InventoryLivingWatcher
 {
@@ -43,26 +46,23 @@ public byte getArmorStandFlags(boolean small, boolean showArms, boolean noBasePl
 
     private boolean isSmall()
     {
-        return (read(ValueIndex.ARMOR_STAND.DATA_FLAGS) & 0x01) == 0x01;
+        return this.readEntryOrDefault(CustomEntries.ARMOR_STAND_SMALL, false);
     }
 
     private boolean noBasePlate()
     {
-        return (read(ValueIndex.ARMOR_STAND.DATA_FLAGS) & 0x08) == 0x08;
+        return this.readEntryOrDefault(CustomEntries.ARMOR_STAND_NO_BASE_PLATE, false);
     }
 
     private boolean showArms()
     {
-        return (read(ValueIndex.ARMOR_STAND.DATA_FLAGS) & 0x04) == 0x04;
+        return this.readEntryOrDefault(CustomEntries.ARMOR_STAND_SHOW_ARMS, false);
     }
 
     private Rotations getVec3(ListTag listTag, Rotations defaultValue)
     {
         if (listTag.isEmpty())
-        {
-            logger.warn("Empty listTag! Using defaultValue...");
             listTag = defaultValue.save();
-        }
 
         return new Rotations(listTag);
     }
@@ -75,6 +75,7 @@ protected <X> void onPropertyWrite(SingleProperty<X> property, X value)
         if (property.equals(properties.SHOW_ARMS))
         {
             var val = (Boolean) value;
+            this.writeEntry(CustomEntries.ARMOR_STAND_SHOW_ARMS, val);
             this.writePersistent(ValueIndex.ARMOR_STAND.DATA_FLAGS, getArmorStandFlags(this.isSmall(), val, this.noBasePlate()));
         }
 
@@ -90,13 +91,22 @@ public void mergeFromCompound(CompoundTag nbt)
         boolean showArms = showArms();
 
         if (nbt.contains("Small"))
+        {
             small = nbt.getBoolean("Small");
+            this.writeEntry(CustomEntries.ARMOR_STAND_SMALL, small);
+        }
 
         if (nbt.contains("NoBasePlate"))
+        {
             noBasePlate = nbt.getBoolean("NoBasePlate");
+            this.writeEntry(CustomEntries.ARMOR_STAND_NO_BASE_PLATE, noBasePlate);
+        }
 
         if (nbt.contains("ShowArms"))
+        {
             showArms = nbt.getBoolean("ShowArms");
+            this.writeEntry(CustomEntries.ARMOR_STAND_SHOW_ARMS, showArms);
+        }
 
         //Tag "Invisible" is not supported as it's synced with the player
 
@@ -155,18 +165,34 @@ public void writeToCompound(CompoundTag nbt)
     {
         super.writeToCompound(nbt);
 
-        nbt.putBoolean("Small", this.isSmall());
-        nbt.putBoolean("NoBasePlate", this.noBasePlate());
-        nbt.putBoolean("ShowArms", this.showArms());
+        var small = this.readEntry(CustomEntries.ARMOR_STAND_SMALL);
+        if (small != null)
+            nbt.putBoolean("Small", small);
+
+        var noBasePlate = this.readEntry(CustomEntries.ARMOR_STAND_NO_BASE_PLATE);
+        if (noBasePlate != null)
+            nbt.putBoolean("NoBasePlate", noBasePlate);
+
+        var showArms = this.readEntry(CustomEntries.ARMOR_STAND_SHOW_ARMS);
+        if (showArms != null)
+            nbt.putBoolean("ShowArms", showArms);
 
         var poseCompound = new CompoundTag();
-        poseCompound.put("Head", read(ValueIndex.ARMOR_STAND.HEAD_ROTATION).save());
-        poseCompound.put("Body", read(ValueIndex.ARMOR_STAND.BODY_ROTATION).save());
-        poseCompound.put("LeftArm", read(ValueIndex.ARMOR_STAND.LEFT_ARM_ROTATION).save());
-        poseCompound.put("RightArm", read(ValueIndex.ARMOR_STAND.RIGHT_ARM_ROTATION).save());
-        poseCompound.put("LeftLeg", read(ValueIndex.ARMOR_STAND.LEFT_LEG_ROTATION).save());
-        poseCompound.put("RightLeg", read(ValueIndex.ARMOR_STAND.RIGHT_LEG_ROTATION).save());
+        saveCompoundIfSet(poseCompound, "Head", ValueIndex.ARMOR_STAND.HEAD_ROTATION);
+        saveCompoundIfSet(poseCompound, "Body", ValueIndex.ARMOR_STAND.BODY_ROTATION);
+        saveCompoundIfSet(poseCompound, "LeftArm", ValueIndex.ARMOR_STAND.LEFT_ARM_ROTATION);
+        saveCompoundIfSet(poseCompound, "RightArm", ValueIndex.ARMOR_STAND.RIGHT_ARM_ROTATION);
+        saveCompoundIfSet(poseCompound, "LeftLeg", ValueIndex.ARMOR_STAND.LEFT_LEG_ROTATION);
+        saveCompoundIfSet(poseCompound, "RightLeg", ValueIndex.ARMOR_STAND.RIGHT_LEG_ROTATION);
 
         nbt.put("Pose", poseCompound);
     }
+
+    private void saveCompoundIfSet(CompoundTag compoundTag, String name, SingleValue<Rotations> sv)
+    {
+        var value = readOr(sv, null);
+        if (value == null) return;
+
+        compoundTag.put(name, value.save());
+    }
 }
diff --git a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/registries/CustomEntries.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/registries/CustomEntries.java
index 724de838..b0d007a7 100644
--- a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/registries/CustomEntries.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/registries/CustomEntries.java
@@ -42,4 +42,8 @@ public class CustomEntries
     public static final CustomEntry<Integer> SPAWN_ID = CustomEntry.of("spawn_id", -1);
 
     public static final CustomEntry<Boolean> VANISHED = CustomEntry.of("vanished", false);
+
+    public static final CustomEntry<Boolean> ARMOR_STAND_SMALL = CustomEntry.of("armorstand_is_small", false);
+    public static final CustomEntry<Boolean> ARMOR_STAND_NO_BASE_PLATE = CustomEntry.of("armorstand_no_baseplate", false);
+    public static final CustomEntry<Boolean> ARMOR_STAND_SHOW_ARMS = CustomEntry.of("armorstand_show_arms", false);
 }
diff --git a/src/main/java/xyz/nifeather/morph/providers/disguise/DisguiseProvider.java b/src/main/java/xyz/nifeather/morph/providers/disguise/DisguiseProvider.java
index a0a1c97c..f7ec76ff 100644
--- a/src/main/java/xyz/nifeather/morph/providers/disguise/DisguiseProvider.java
+++ b/src/main/java/xyz/nifeather/morph/providers/disguise/DisguiseProvider.java
@@ -221,10 +221,10 @@ protected DisguiseResult constructFromEntity(DisguiseMeta info, @Nullable Entity
         var backend = getPreferredBackend();
 
         DisguiseWrapper<?> ourDisguise;
-        DisguiseWrapper<?> theirDisguise = backend.getWrapper(target);
         DisguiseState theirState = morphs.getDisguiseStateFor(target);
+        DisguiseWrapper<?> theirDisguise = theirState != null ? theirState.getDisguiseWrapper() : null;
 
-        if (theirState != null && theirDisguise != null)
+        if (theirState != null)
         {
             var key = theirState.getDisguiseIdentifier();
 

From 8ed5f587c9bf50a4f5eac5caaa33e853a39093f1 Mon Sep 17 00:00:00 2001
From: MATRIX-feather <midnightcarnival@outlook.com>
Date: Sun, 13 Oct 2024 14:34:09 +0800
Subject: [PATCH 22/28] misc: Revert ArmorStandWatcher, add resetRegistries
 method to SingleWatcher

---
 .../datawatcher/watchers/SingleWatcher.java   | 17 ++++++
 .../watchers/types/ArmorStandWatcher.java     | 58 +++++--------------
 2 files changed, 33 insertions(+), 42 deletions(-)

diff --git a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/SingleWatcher.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/SingleWatcher.java
index c2868f78..b609e142 100644
--- a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/SingleWatcher.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/SingleWatcher.java
@@ -181,6 +181,23 @@ public <X> X readEntry(CustomEntry<X> entry)
 
     //endregion Custom Registry
 
+    public void resetRegistries()
+    {
+        Map<Integer, Object> registryCopy = new Object2ObjectOpenHashMap<>(registry);
+
+        registryCopy.forEach((id, val) ->
+        {
+            var sv = this.knownValues.getOrDefault(id, null);
+            if (sv != null)
+                this.writePersistent((SingleValue<Object>) sv, sv.defaultValue());
+
+            this.registry.remove(id);
+        });
+
+        Map<String, Object> crCopy = new Object2ObjectOpenHashMap<>(customRegistry);
+        crCopy.clear();
+    }
+
     //region Value Registry
 
     protected final Map<Integer, Object> registry = new ConcurrentHashMap<>();
diff --git a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/ArmorStandWatcher.java b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/ArmorStandWatcher.java
index 731649f9..78a2a6bb 100644
--- a/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/ArmorStandWatcher.java
+++ b/src/main/java/xyz/nifeather/morph/backends/server/renderer/network/datawatcher/watchers/types/ArmorStandWatcher.java
@@ -5,13 +5,10 @@
 import net.minecraft.nbt.ListTag;
 import org.bukkit.entity.EntityType;
 import org.bukkit.entity.Player;
-import xyz.nifeather.morph.backends.server.renderer.network.datawatcher.values.SingleValue;
-import xyz.nifeather.morph.backends.server.renderer.network.registries.CustomEntries;
 import xyz.nifeather.morph.backends.server.renderer.network.registries.ValueIndex;
 import xyz.nifeather.morph.misc.disguiseProperty.DisguiseProperties;
 import xyz.nifeather.morph.misc.disguiseProperty.SingleProperty;
 import xyz.nifeather.morph.misc.disguiseProperty.values.ArmorStandProperties;
-import xyz.nifeather.morph.utilities.NbtUtils;
 
 public class ArmorStandWatcher extends InventoryLivingWatcher
 {
@@ -46,23 +43,26 @@ public byte getArmorStandFlags(boolean small, boolean showArms, boolean noBasePl
 
     private boolean isSmall()
     {
-        return this.readEntryOrDefault(CustomEntries.ARMOR_STAND_SMALL, false);
+        return (read(ValueIndex.ARMOR_STAND.DATA_FLAGS) & 0x01) == 0x01;
     }
 
     private boolean noBasePlate()
     {
-        return this.readEntryOrDefault(CustomEntries.ARMOR_STAND_NO_BASE_PLATE, false);
+        return (read(ValueIndex.ARMOR_STAND.DATA_FLAGS) & 0x08) == 0x08;
     }
 
     private boolean showArms()
     {
-        return this.readEntryOrDefault(CustomEntries.ARMOR_STAND_SHOW_ARMS, false);
+        return (read(ValueIndex.ARMOR_STAND.DATA_FLAGS) & 0x04) == 0x04;
     }
 
     private Rotations getVec3(ListTag listTag, Rotations defaultValue)
     {
         if (listTag.isEmpty())
+        {
+            logger.warn("Empty listTag! Using defaultValue...");
             listTag = defaultValue.save();
+        }
 
         return new Rotations(listTag);
     }
@@ -75,7 +75,6 @@ protected <X> void onPropertyWrite(SingleProperty<X> property, X value)
         if (property.equals(properties.SHOW_ARMS))
         {
             var val = (Boolean) value;
-            this.writeEntry(CustomEntries.ARMOR_STAND_SHOW_ARMS, val);
             this.writePersistent(ValueIndex.ARMOR_STAND.DATA_FLAGS, getArmorStandFlags(this.isSmall(), val, this.noBasePlate()));
         }
 
@@ -91,22 +90,13 @@ public void mergeFromCompound(CompoundTag nbt)
         boolean showArms = showArms();
 
         if (nbt.contains("Small"))
-        {
             small = nbt.getBoolean("Small");
-            this.writeEntry(CustomEntries.ARMOR_STAND_SMALL, small);
-        }
 
         if (nbt.contains("NoBasePlate"))
-        {
             noBasePlate = nbt.getBoolean("NoBasePlate");
-            this.writeEntry(CustomEntries.ARMOR_STAND_NO_BASE_PLATE, noBasePlate);
-        }
 
         if (nbt.contains("ShowArms"))
-        {
             showArms = nbt.getBoolean("ShowArms");
-            this.writeEntry(CustomEntries.ARMOR_STAND_SHOW_ARMS, showArms);
-        }
 
         //Tag "Invisible" is not supported as it's synced with the player
 
@@ -165,34 +155,18 @@ public void writeToCompound(CompoundTag nbt)
     {
         super.writeToCompound(nbt);
 
-        var small = this.readEntry(CustomEntries.ARMOR_STAND_SMALL);
-        if (small != null)
-            nbt.putBoolean("Small", small);
-
-        var noBasePlate = this.readEntry(CustomEntries.ARMOR_STAND_NO_BASE_PLATE);
-        if (noBasePlate != null)
-            nbt.putBoolean("NoBasePlate", noBasePlate);
-
-        var showArms = this.readEntry(CustomEntries.ARMOR_STAND_SHOW_ARMS);
-        if (showArms != null)
-            nbt.putBoolean("ShowArms", showArms);
+        nbt.putBoolean("Small", this.isSmall());
+        nbt.putBoolean("NoBasePlate", this.noBasePlate());
+        nbt.putBoolean("ShowArms", this.showArms());
 
         var poseCompound = new CompoundTag();
-        saveCompoundIfSet(poseCompound, "Head", ValueIndex.ARMOR_STAND.HEAD_ROTATION);
-        saveCompoundIfSet(poseCompound, "Body", ValueIndex.ARMOR_STAND.BODY_ROTATION);
-        saveCompoundIfSet(poseCompound, "LeftArm", ValueIndex.ARMOR_STAND.LEFT_ARM_ROTATION);
-        saveCompoundIfSet(poseCompound, "RightArm", ValueIndex.ARMOR_STAND.RIGHT_ARM_ROTATION);
-        saveCompoundIfSet(poseCompound, "LeftLeg", ValueIndex.ARMOR_STAND.LEFT_LEG_ROTATION);
-        saveCompoundIfSet(poseCompound, "RightLeg", ValueIndex.ARMOR_STAND.RIGHT_LEG_ROTATION);
+        poseCompound.put("Head", read(ValueIndex.ARMOR_STAND.HEAD_ROTATION).save());
+        poseCompound.put("Body", read(ValueIndex.ARMOR_STAND.BODY_ROTATION).save());
+        poseCompound.put("LeftArm", read(ValueIndex.ARMOR_STAND.LEFT_ARM_ROTATION).save());
+        poseCompound.put("RightArm", read(ValueIndex.ARMOR_STAND.RIGHT_ARM_ROTATION).save());
+        poseCompound.put("LeftLeg", read(ValueIndex.ARMOR_STAND.LEFT_LEG_ROTATION).save());
+        poseCompound.put("RightLeg", read(ValueIndex.ARMOR_STAND.RIGHT_LEG_ROTATION).save());
 
         nbt.put("Pose", poseCompound);
     }
-
-    private void saveCompoundIfSet(CompoundTag compoundTag, String name, SingleValue<Rotations> sv)
-    {
-        var value = readOr(sv, null);
-        if (value == null) return;
-
-        compoundTag.put(name, value.save());
-    }
-}
+}
\ No newline at end of file

From 26e398e812a738c5cff918c5ace771b71fa8d2bc Mon Sep 17 00:00:00 2001
From: MATRIX-feather <midnightcarnival@outlook.com>
Date: Mon, 14 Oct 2024 16:43:29 +0800
Subject: [PATCH 23/28] enhance: Profile request batching

---
 .../java/xyz/nifeather/morph/MorphPlugin.java |   3 +
 .../morph/misc/skins/PlayerSkinProvider.java  | 123 ++++++++++++++++--
 .../misc/skins/ProfileLookupExecutor.java     |  50 +++++++
 3 files changed, 162 insertions(+), 14 deletions(-)
 create mode 100644 src/main/java/xyz/nifeather/morph/misc/skins/ProfileLookupExecutor.java

diff --git a/src/main/java/xyz/nifeather/morph/MorphPlugin.java b/src/main/java/xyz/nifeather/morph/MorphPlugin.java
index 3677f7cf..4c294348 100644
--- a/src/main/java/xyz/nifeather/morph/MorphPlugin.java
+++ b/src/main/java/xyz/nifeather/morph/MorphPlugin.java
@@ -26,6 +26,7 @@
 import xyz.nifeather.morph.misc.integrations.placeholderapi.PlaceholderIntegration;
 import xyz.nifeather.morph.misc.integrations.residence.ResidenceEventProcessor;
 import xyz.nifeather.morph.misc.integrations.tab.TabAdapter;
+import xyz.nifeather.morph.misc.skins.PlayerSkinProvider;
 import xyz.nifeather.morph.network.multiInstance.MultiInstanceService;
 import xyz.nifeather.morph.network.server.MorphClientHandler;
 import xyz.nifeather.morph.skills.MorphSkillHandler;
@@ -295,6 +296,8 @@ public void onDisable()
             if (instanceService != null)
                 instanceService.onDisable();
 
+            PlayerSkinProvider.getInstance().shutdown();
+
             var messenger = this.getServer().getMessenger();
 
             messenger.unregisterOutgoingPluginChannel(this);
diff --git a/src/main/java/xyz/nifeather/morph/misc/skins/PlayerSkinProvider.java b/src/main/java/xyz/nifeather/morph/misc/skins/PlayerSkinProvider.java
index 03addc64..da3cdfb9 100644
--- a/src/main/java/xyz/nifeather/morph/misc/skins/PlayerSkinProvider.java
+++ b/src/main/java/xyz/nifeather/morph/misc/skins/PlayerSkinProvider.java
@@ -6,11 +6,15 @@
 import com.mojang.authlib.ProfileLookupCallback;
 import com.mojang.authlib.exceptions.AuthenticationUnavailableException;
 import com.mojang.authlib.yggdrasil.ProfileNotFoundException;
+import it.unimi.dsi.fastutil.objects.ObjectArrayList;
+import it.unimi.dsi.fastutil.objects.ObjectLists;
 import net.minecraft.Util;
 import net.minecraft.server.MinecraftServer;
 import org.bukkit.Bukkit;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
+import xiamomc.pluginbase.Annotations.Initializer;
+import xyz.nifeather.morph.MorphManager;
 import xyz.nifeather.morph.MorphPluginObject;
 import xyz.nifeather.morph.misc.MorphGameProfile;
 import xyz.nifeather.morph.misc.NmsRecord;
@@ -20,7 +24,8 @@
 import java.util.Optional;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.atomic.AtomicReference;
+import java.util.concurrent.TimeUnit;
+import java.util.function.BiConsumer;
 
 public class PlayerSkinProvider extends MorphPluginObject
 {
@@ -39,30 +44,114 @@ public PlayerSkinProvider()
         this.skinCache.initializeStorage();
     }
 
+    @Initializer
+    private void load()
+    {
+        Bukkit.getAsyncScheduler().runAtFixedRate(plugin,
+                task -> this.batchPlayerInfo(),
+                1000, 1000,
+                TimeUnit.MILLISECONDS);
+    }
+
     private final SkinCache skinCache = new SkinCache();
 
+    // region Info Request Batching
+
+    private final List<String> namesToLookup = new ObjectArrayList<>();
+    private final Map<String, Optional<GameProfile>> batchResults = new ConcurrentHashMap<>();
+
+    // name <-> lock
+    private final Map<String, Object> nameLockMap = new ConcurrentHashMap<>();
+
     private CompletableFuture<Optional<GameProfile>> fetchPlayerInfoAsync(String name)
     {
-        var executor = Util.PROFILE_EXECUTOR;
+        var executor = ProfileLookupExecutor.executor();
 
-        return CompletableFuture.supplyAsync(() -> this.fetchPlayerInfo(name), executor);
+        return CompletableFuture.supplyAsync(() -> this.schedulePlayerInfo(name), executor);
     }
 
+    private Optional<GameProfile> schedulePlayerInfo(String name)
+    {
+        synchronized (namesToLookup)
+        {
+            this.namesToLookup.add(name);
+        }
+
+        var lock = new Object();
+        nameLockMap.put(name.toUpperCase(), lock);
+
+        try
+        {
+            synchronized (lock)
+            {
+                lock.wait();
+            }
+
+            if (!this.batchResults.containsKey(name))
+                return Optional.empty();
+            else
+                return this.batchResults.remove(name);
+        }
+        catch (InterruptedException e)
+        {
+            logger.info("Skin lookup request for '%s' canceled by external source".formatted(name));
+            return Optional.empty();
+        }
+    }
+
+    private static final Object batchLock = new Object();
+
     /**
-     * 根据给定的名称搜索对应的Profile(不包含皮肤)
-     * @apiNote 此方法返回的GameProfile不包含皮肤,若要获取于此对应的皮肤,请使用 {@link PlayerSkinProvider#fetchSkin(GameProfile)}
-     * @param name
-     * @return
+     * 批量处理玩家信息请求
      */
-    private Optional<GameProfile> fetchPlayerInfo(String name)
+    public void batchPlayerInfo()
     {
-        var profileRef = new AtomicReference<GameProfile>(null);
+        synchronized (batchLock)
+        {
+            startBatchPlayerInfo();
+        }
+    }
+
+    private void startBatchPlayerInfo()
+    {
+        if (namesToLookup.isEmpty()) return;
+
+        List<String> list;
+        synchronized (namesToLookup)
+        {
+            list = namesToLookup.stream().map(String::toUpperCase).toList();
+            namesToLookup.clear();
+        }
+
+        List<String> remainingNames = new ObjectArrayList<>(list);
+
+        BiConsumer<String, @Nullable GameProfile> onRequestFinish = (n, profile) ->
+        {
+            var nameUpper = n.toUpperCase();
+
+            Optional<GameProfile> optional = profile == null ? Optional.empty() : Optional.of(profile);
+            this.batchResults.put(n, optional);
+
+            remainingNames.remove(nameUpper);
+
+            var lock = nameLockMap.remove(nameUpper);
+            if (lock == null)
+            {
+                //logger.warn(nameUpper + ": Don't have a lock?!");
+                return;
+            }
+
+            synchronized (lock)
+            {
+                lock.notifyAll();
+            }
+        };
 
         var lookupCallback = new ProfileLookupCallback()
         {
             public void onProfileLookupSucceeded(GameProfile gameprofile)
             {
-                profileRef.set(gameprofile);
+                onRequestFinish.accept(gameprofile.getName(), gameprofile);
             }
 
             public void onProfileLookupFailed(String profileName, Exception exception)
@@ -79,16 +168,17 @@ else if (exception instanceof AuthenticationUnavailableException)
                 {
                     logger.info("Failed to lookup '%s': '%s'".formatted(profileName, exception.getMessage()));
                 }
+
+                onRequestFinish.accept(profileName, null);
             }
         };
 
         GameProfileRepository profileRepo = MinecraftServer.getServer().getProfileRepository();
-        profileRepo.findProfilesByNames(new String[]{name}, lookupCallback);
-
-        var profile = profileRef.get();
-        return profile == null ? Optional.empty() : Optional.of(profile);
+        profileRepo.findProfilesByNames(remainingNames.toArray(new String[0]), lookupCallback);
     }
 
+    // endregion Info Request Batching
+
     @Nullable
     public GameProfile getCachedProfile(String name)
     {
@@ -224,5 +314,10 @@ public void invalidate(String name)
         skin.expiresAt = 0;
     }
 
+    public void shutdown()
+    {
+        ProfileLookupExecutor.executor().shutdownNow();
+    }
+
     //endregion
 }
diff --git a/src/main/java/xyz/nifeather/morph/misc/skins/ProfileLookupExecutor.java b/src/main/java/xyz/nifeather/morph/misc/skins/ProfileLookupExecutor.java
new file mode 100644
index 00000000..36a9ca02
--- /dev/null
+++ b/src/main/java/xyz/nifeather/morph/misc/skins/ProfileLookupExecutor.java
@@ -0,0 +1,50 @@
+package xyz.nifeather.morph.misc.skins;
+
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+import xyz.nifeather.morph.MorphPlugin;
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.atomic.AtomicInteger;
+
+public class ProfileLookupExecutor
+{
+    @NotNull
+    public static ExecutorService executor()
+    {
+        var executor = EXECUTOR;
+        if (executor == null || executor.isShutdown())
+            EXECUTOR = executor = createExecutor();
+
+        return executor;
+    }
+
+    private static ExecutorService createExecutor()
+    {
+        return Executors.newFixedThreadPool(5, new ThreadFactory()
+        {
+            private final AtomicInteger threadCount = new AtomicInteger(0);
+
+            @Override
+            public Thread newThread(@NotNull Runnable runnable)
+            {
+                Thread thread = new Thread(runnable);
+                thread.setName("FeatherMorph Profile Executor #" + this.threadCount.getAndIncrement());
+
+                thread.setUncaughtExceptionHandler((Thread t, Throwable error) ->
+                {
+                    MorphPlugin.getInstance()
+                            .getSLF4JLogger()
+                            .error("Error occurred in thread " + t.getName(), error);
+                });
+
+                return thread;
+            }
+        });
+    }
+
+    @Nullable
+    private static volatile ExecutorService EXECUTOR;
+}

From d5d03dc4cf01240341626077f35acd71c35d4fe4 Mon Sep 17 00:00:00 2001
From: MATRIX-feather <midnightcarnival@outlook.com>
Date: Mon, 14 Oct 2024 18:59:24 +0800
Subject: [PATCH 24/28] =?UTF-8?q?misc:=20=E5=BB=B6=E9=95=BF=E6=89=B9?=
 =?UTF-8?q?=E5=A4=84=E7=90=86=E9=97=B4=E9=9A=94=E6=97=B6=E9=97=B4=EF=BC=8C?=
 =?UTF-8?q?=E8=B0=83=E6=95=B4=E6=9F=A5=E8=AF=A2Profile=E7=94=A8=E7=9A=84?=
 =?UTF-8?q?=E7=BA=BF=E7=A8=8B=E6=95=B0=E9=87=8F?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../morph/misc/skins/PlayerSkinProvider.java     |  2 +-
 .../morph/misc/skins/ProfileLookupExecutor.java  | 16 +++++++++++-----
 2 files changed, 12 insertions(+), 6 deletions(-)

diff --git a/src/main/java/xyz/nifeather/morph/misc/skins/PlayerSkinProvider.java b/src/main/java/xyz/nifeather/morph/misc/skins/PlayerSkinProvider.java
index da3cdfb9..96a4f688 100644
--- a/src/main/java/xyz/nifeather/morph/misc/skins/PlayerSkinProvider.java
+++ b/src/main/java/xyz/nifeather/morph/misc/skins/PlayerSkinProvider.java
@@ -49,7 +49,7 @@ private void load()
     {
         Bukkit.getAsyncScheduler().runAtFixedRate(plugin,
                 task -> this.batchPlayerInfo(),
-                1000, 1000,
+                1500, 1500,
                 TimeUnit.MILLISECONDS);
     }
 
diff --git a/src/main/java/xyz/nifeather/morph/misc/skins/ProfileLookupExecutor.java b/src/main/java/xyz/nifeather/morph/misc/skins/ProfileLookupExecutor.java
index 36a9ca02..cc2e775e 100644
--- a/src/main/java/xyz/nifeather/morph/misc/skins/ProfileLookupExecutor.java
+++ b/src/main/java/xyz/nifeather/morph/misc/skins/ProfileLookupExecutor.java
@@ -4,9 +4,7 @@
 import org.jetbrains.annotations.Nullable;
 import xyz.nifeather.morph.MorphPlugin;
 
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.*;
 import java.util.concurrent.atomic.AtomicInteger;
 
 public class ProfileLookupExecutor
@@ -16,14 +14,21 @@ public static ExecutorService executor()
     {
         var executor = EXECUTOR;
         if (executor == null || executor.isShutdown())
+        {
             EXECUTOR = executor = createExecutor();
+        }
 
         return executor;
     }
 
+    private static int getThreadCount()
+    {
+        return Math.max(4, Runtime.getRuntime().availableProcessors() / 2);
+    }
+
     private static ExecutorService createExecutor()
     {
-        return Executors.newFixedThreadPool(5, new ThreadFactory()
+        return Executors.newFixedThreadPool(getThreadCount(), new ThreadFactory()
         {
             private final AtomicInteger threadCount = new AtomicInteger(0);
 
@@ -31,7 +36,8 @@ private static ExecutorService createExecutor()
             public Thread newThread(@NotNull Runnable runnable)
             {
                 Thread thread = new Thread(runnable);
-                thread.setName("FeatherMorph Profile Executor #" + this.threadCount.getAndIncrement());
+                var threadId = this.threadCount.getAndIncrement();
+                thread.setName("FeatherMorph Profile Executor #" + threadId);
 
                 thread.setUncaughtExceptionHandler((Thread t, Throwable error) ->
                 {

From 4c02da6693f71b134e5e1172dd5941baf6370672 Mon Sep 17 00:00:00 2001
From: MATRIX-feather <midnightcarnival@outlook.com>
Date: Mon, 14 Oct 2024 20:17:28 +0800
Subject: [PATCH 25/28] =?UTF-8?q?misc:=20=E4=BD=BF=E7=94=A8ThreadPoolExecu?=
 =?UTF-8?q?tor=E6=A0=B9=E6=8D=AE=E6=83=85=E5=86=B5=E5=8A=A8=E6=80=81?=
 =?UTF-8?q?=E8=B0=83=E6=95=B4=E6=9F=A5=E8=AF=A2=E7=BA=BF=E7=A8=8B=E6=95=B0?=
 =?UTF-8?q?=E9=87=8F=20=20=20=20=20-=20=E5=B9=B6=E5=9C=A8=E9=97=B2?=
 =?UTF-8?q?=E7=BD=AE10=E5=88=86=E9=92=9F=E5=90=8E=E8=87=AA=E5=8A=A8?=
 =?UTF-8?q?=E7=BB=93=E6=9D=9F=E7=BA=BF=E7=A8=8B=20=20=20=20=20-=20?=
 =?UTF-8?q?=E5=90=8C=E6=97=B6=E9=99=90=E5=88=B6=E6=9F=A5=E8=AF=A2=E7=BA=BF?=
 =?UTF-8?q?=E7=A8=8B=E6=9C=80=E5=A4=9A=E4=B8=8D=E8=B6=85=E8=BF=8716?=
 =?UTF-8?q?=E4=B8=AA?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../misc/skins/ProfileLookupExecutor.java     | 49 +++++++++++--------
 1 file changed, 28 insertions(+), 21 deletions(-)

diff --git a/src/main/java/xyz/nifeather/morph/misc/skins/ProfileLookupExecutor.java b/src/main/java/xyz/nifeather/morph/misc/skins/ProfileLookupExecutor.java
index cc2e775e..eb490d79 100644
--- a/src/main/java/xyz/nifeather/morph/misc/skins/ProfileLookupExecutor.java
+++ b/src/main/java/xyz/nifeather/morph/misc/skins/ProfileLookupExecutor.java
@@ -16,39 +16,46 @@ public static ExecutorService executor()
         if (executor == null || executor.isShutdown())
         {
             EXECUTOR = executor = createExecutor();
+
+            MorphPlugin.getInstance()
+                    .getSLF4JLogger()
+                    .info("Creating new executor with maximum " + getMaximumThreadCount() + " thread(s) for profile lookup.");
         }
 
         return executor;
     }
 
-    private static int getThreadCount()
+    private static int getMaximumThreadCount()
     {
-        return Math.max(4, Runtime.getRuntime().availableProcessors() / 2);
+        return Math.min(16, Math.max(4, Runtime.getRuntime().availableProcessors() / 2));
     }
 
     private static ExecutorService createExecutor()
     {
-        return Executors.newFixedThreadPool(getThreadCount(), new ThreadFactory()
-        {
-            private final AtomicInteger threadCount = new AtomicInteger(0);
-
-            @Override
-            public Thread newThread(@NotNull Runnable runnable)
-            {
-                Thread thread = new Thread(runnable);
-                var threadId = this.threadCount.getAndIncrement();
-                thread.setName("FeatherMorph Profile Executor #" + threadId);
-
-                thread.setUncaughtExceptionHandler((Thread t, Throwable error) ->
+        return new ThreadPoolExecutor(1, getMaximumThreadCount(),
+                10, TimeUnit.MINUTES,
+                new SynchronousQueue<>(),
+                new ThreadFactory()
                 {
-                    MorphPlugin.getInstance()
-                            .getSLF4JLogger()
-                            .error("Error occurred in thread " + t.getName(), error);
+                    private final AtomicInteger threadCount = new AtomicInteger(0);
+
+                    @Override
+                    public Thread newThread(@NotNull Runnable runnable)
+                    {
+                        Thread thread = new Thread(runnable);
+                        var threadId = this.threadCount.getAndIncrement();
+                        thread.setName("FeatherMorph Profile Executor #" + threadId);
+
+                        thread.setUncaughtExceptionHandler((Thread t, Throwable error) ->
+                        {
+                            MorphPlugin.getInstance()
+                                    .getSLF4JLogger()
+                                    .error("Error occurred in thread " + t.getName(), error);
+                        });
+
+                        return thread;
+                    }
                 });
-
-                return thread;
-            }
-        });
     }
 
     @Nullable

From 74f085078292567973604ef637ba215d0e651ecb Mon Sep 17 00:00:00 2001
From: MATRIX-feather <midnightcarnival@outlook.com>
Date: Mon, 14 Oct 2024 20:21:24 +0800
Subject: [PATCH 26/28] [ci skip] typo

---
 .../xyz/nifeather/morph/misc/skins/ProfileLookupExecutor.java   | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/main/java/xyz/nifeather/morph/misc/skins/ProfileLookupExecutor.java b/src/main/java/xyz/nifeather/morph/misc/skins/ProfileLookupExecutor.java
index eb490d79..eee6cdbe 100644
--- a/src/main/java/xyz/nifeather/morph/misc/skins/ProfileLookupExecutor.java
+++ b/src/main/java/xyz/nifeather/morph/misc/skins/ProfileLookupExecutor.java
@@ -19,7 +19,7 @@ public static ExecutorService executor()
 
             MorphPlugin.getInstance()
                     .getSLF4JLogger()
-                    .info("Creating new executor with maximum " + getMaximumThreadCount() + " thread(s) for profile lookup.");
+                    .info("Creating new executor with a maximum of " + getMaximumThreadCount() + " thread(s) for profile lookup.");
         }
 
         return executor;

From 4a6c859d54408e849ee087e3f304abefc4962f40 Mon Sep 17 00:00:00 2001
From: MATRIX-feather <midnightcarnival@outlook.com>
Date: Mon, 14 Oct 2024 21:35:24 +0800
Subject: [PATCH 27/28] =?UTF-8?q?Revert=20"misc:=20=E4=BD=BF=E7=94=A8Threa?=
 =?UTF-8?q?dPoolExecutor=E6=A0=B9=E6=8D=AE=E6=83=85=E5=86=B5=E5=8A=A8?=
 =?UTF-8?q?=E6=80=81=E8=B0=83=E6=95=B4=E6=9F=A5=E8=AF=A2=E7=BA=BF=E7=A8=8B?=
 =?UTF-8?q?=E6=95=B0=E9=87=8F"?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

This reverts commit 4c02da6693f71b134e5e1172dd5941baf6370672.
---
 .../misc/skins/ProfileLookupExecutor.java     | 47 +++++++++----------
 1 file changed, 22 insertions(+), 25 deletions(-)

diff --git a/src/main/java/xyz/nifeather/morph/misc/skins/ProfileLookupExecutor.java b/src/main/java/xyz/nifeather/morph/misc/skins/ProfileLookupExecutor.java
index eee6cdbe..03cea4ae 100644
--- a/src/main/java/xyz/nifeather/morph/misc/skins/ProfileLookupExecutor.java
+++ b/src/main/java/xyz/nifeather/morph/misc/skins/ProfileLookupExecutor.java
@@ -19,43 +19,40 @@ public static ExecutorService executor()
 
             MorphPlugin.getInstance()
                     .getSLF4JLogger()
-                    .info("Creating new executor with a maximum of " + getMaximumThreadCount() + " thread(s) for profile lookup.");
+                    .info("Creating new executor with a maximum of " + getThreadCount() + " thread(s) for profile lookup.");
         }
 
         return executor;
     }
 
-    private static int getMaximumThreadCount()
+    private static int getThreadCount()
     {
-        return Math.min(16, Math.max(4, Runtime.getRuntime().availableProcessors() / 2));
+        return Math.max(4, Runtime.getRuntime().availableProcessors() / 2);
     }
 
     private static ExecutorService createExecutor()
     {
-        return new ThreadPoolExecutor(1, getMaximumThreadCount(),
-                10, TimeUnit.MINUTES,
-                new SynchronousQueue<>(),
-                new ThreadFactory()
+        return Executors.newFixedThreadPool(getThreadCount(), new ThreadFactory()
+        {
+            private final AtomicInteger threadCount = new AtomicInteger(0);
+
+            @Override
+            public Thread newThread(@NotNull Runnable runnable)
+            {
+                Thread thread = new Thread(runnable);
+                var threadId = this.threadCount.getAndIncrement();
+                thread.setName("FeatherMorph Profile Executor #" + threadId);
+
+                thread.setUncaughtExceptionHandler((Thread t, Throwable error) ->
                 {
-                    private final AtomicInteger threadCount = new AtomicInteger(0);
-
-                    @Override
-                    public Thread newThread(@NotNull Runnable runnable)
-                    {
-                        Thread thread = new Thread(runnable);
-                        var threadId = this.threadCount.getAndIncrement();
-                        thread.setName("FeatherMorph Profile Executor #" + threadId);
-
-                        thread.setUncaughtExceptionHandler((Thread t, Throwable error) ->
-                        {
-                            MorphPlugin.getInstance()
-                                    .getSLF4JLogger()
-                                    .error("Error occurred in thread " + t.getName(), error);
-                        });
-
-                        return thread;
-                    }
+                    MorphPlugin.getInstance()
+                            .getSLF4JLogger()
+                            .error("Error occurred in thread " + t.getName(), error);
                 });
+
+                return thread;
+            }
+        });
     }
 
     @Nullable

From f2d77f20d8145e5e4428066b41f09c0a8adce6f4 Mon Sep 17 00:00:00 2001
From: MATRIX-feather <midnightcarnival@outlook.com>
Date: Mon, 14 Oct 2024 21:38:16 +0800
Subject: [PATCH 28/28] =?UTF-8?q?misc:=20=E9=87=8D=E6=96=B0=E9=99=90?=
 =?UTF-8?q?=E5=88=B6=E7=94=A8=E4=BA=8E=E6=9F=A5=E8=AF=A2=E7=9A=84=E7=BA=BF?=
 =?UTF-8?q?=E7=A8=8B=E6=95=B0=E4=B8=8D=E8=B6=85=E8=BF=8716=E4=B8=AA?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../nifeather/morph/misc/skins/ProfileLookupExecutor.java | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/src/main/java/xyz/nifeather/morph/misc/skins/ProfileLookupExecutor.java b/src/main/java/xyz/nifeather/morph/misc/skins/ProfileLookupExecutor.java
index 03cea4ae..1298151b 100644
--- a/src/main/java/xyz/nifeather/morph/misc/skins/ProfileLookupExecutor.java
+++ b/src/main/java/xyz/nifeather/morph/misc/skins/ProfileLookupExecutor.java
@@ -19,20 +19,20 @@ public static ExecutorService executor()
 
             MorphPlugin.getInstance()
                     .getSLF4JLogger()
-                    .info("Creating new executor with a maximum of " + getThreadCount() + " thread(s) for profile lookup.");
+                    .info("Creating new executor with a maximum of " + getMaximumThreadCount() + " thread(s) for profile lookup.");
         }
 
         return executor;
     }
 
-    private static int getThreadCount()
+    private static int getMaximumThreadCount()
     {
-        return Math.max(4, Runtime.getRuntime().availableProcessors() / 2);
+        return Math.min(16, Math.max(4, Runtime.getRuntime().availableProcessors() / 2));
     }
 
     private static ExecutorService createExecutor()
     {
-        return Executors.newFixedThreadPool(getThreadCount(), new ThreadFactory()
+        return Executors.newFixedThreadPool(getMaximumThreadCount(), new ThreadFactory()
         {
             private final AtomicInteger threadCount = new AtomicInteger(0);