### Scoreboard Plugin Configuration Example Source: https://context7.com/nifeather/feathermorph/llms.txt Example of using FeatherMorph placeholders within a scoreboard plugin configuration. ```yaml lines: - "Disguise: %feathermorph_state_name%" - "Is Creeper: %feathermorph_state_id_is?minecraft:creeper%" - "Disguises owned: %feathermorph_avaliable_count%" ``` -------------------------------- ### Disguise Skill Configuration Example Source: https://github.com/nifeather/feathermorph/wiki/Skills-and-abilities This is an example of how a single disguise's skill is configured within the skills.json file. To disable a specific skill, change its 'skillId' to 'morph:none'. To disable abilities, remove the 'abilities' array. ```jsonc { "mobId": "minecraft:trader_llama", // The target disguise "skillCooldown": 25, "skillId": "morph:launch_projective", "abilities": [ ... ], "settings": { "morph:...: { ... } } } ``` -------------------------------- ### FeatherMorph API Initialization Source: https://context7.com/nifeather/feathermorph/llms.txt Example of how to access the FeatherMorph API asynchronously in a Java plugin. It's recommended to use `getApiFuture()` to ensure the API is ready before use. ```java import xyz.nifeather.morph.api.FeatherMorphAPI; public class MyPlugin extends JavaPlugin { @Override public void onEnable() { // Preferred: react when API is ready FeatherMorphAPI.getApiFuture().thenAccept(api -> { getLogger().info("FeatherMorph API v" + api.getMeta().VERSION + " loaded."); var morphManager = api.directAccess().morphManager(); // ... register listeners, etc. }); // Also listen for plugin panic (fatal error) FeatherMorphAPI.listenForPluginPanic(() -> getLogger().severe("FeatherMorph encountered a fatal error!") ); } } ``` -------------------------------- ### FeatherMorph Localization File Example Source: https://context7.com/nifeather/feathermorph/llms.txt Customize in-game messages by creating or overriding JSON files in the plugin's messages/ directory. Use the /fm reload message command to apply changes without restarting the server. ```json // messages/en_us.json (example override — keep only keys you want to change) { "morph.disguise_success": "You are now disguised as %s!", "morph.undisguise_success": "You are no longer disguised." } ``` -------------------------------- ### Blaze Projectile Skill Configuration Source: https://context7.com/nifeather/feathermorph/llms.txt Configure a projectile skill for the Blaze disguise. This example shows how to set cooldown, skill ID, passive abilities, and projectile settings including sound. ```jsonc // skills/minecraft/blaze.json — projectile with sound { "skillCooldown": 10, "skillId": "morph:launch_projective", "abilities": [ "morph:fire_resistance", "morph:takes_damage_from_water" ], "settings": { "morph:launch_projective": { "name": "minecraft:fireball", "speed_mulitplier": 1.0, "max_target_distance": 0.0, "sound_name": "entity.blaze.shoot", "sound_distance": 16.0 }, "morph:takes_damage_from_water": { "damage": 1.0 } } } ``` -------------------------------- ### Enderman Teleport Skill Configuration Source: https://context7.com/nifeather/feathermorph/llms.txt Configure a teleport skill for the Enderman disguise. This example shows cooldown, skill ID, passive abilities, and teleportation settings like maximum distance. ```jsonc // skills/minecraft/enderman.json — teleport skill { "skillCooldown": 40, "skillId": "morph:teleport", "abilities": [ "morph:takes_damage_from_water", "morph:night_vision" ], "settings": { "morph:teleport": { "max_distance": 32.0 } } } ``` -------------------------------- ### Warden Bossbar and Attribute Modifiers Skill Configuration Source: https://context7.com/nifeather/feathermorph/llms.txt Configure a 'none' skill for the Warden disguise, which includes passive abilities like 'warden_less_aware', 'attribute_modify', and 'bossbar'. This example demonstrates bossbar settings and attribute modifications. ```jsonc // skills/minecraft/warden.json — bossbar + attribute modifiers { "skillCooldown": 94, "skillId": "morph:none", "abilities": [ "morph:warden_less_aware", "morph:attribute_modify", "morph:bossbar" ], "settings": { "morph:bossbar": { "name": "Warden", "distance": 80.0, "color": "purple", "style": "progress", "flags": ["darken_screen", "create_world_flag"] }, "morph:attribute_modify": [ { "name": "minecraft:generic.movement_speed", "type": "multiply_base", "value": -0.3 }, { "name": "minecraft:generic.knockback_resistance", "type": "add_value", "value": 1.0 } ] } } ``` -------------------------------- ### Admin: Plugin Options Source: https://context7.com/nifeather/feathermorph/llms.txt View or toggle plugin-wide options. ```minecraft_command /fm option ``` -------------------------------- ### Accessing the Feathermorph API Source: https://context7.com/nifeather/feathermorph/llms.txt Demonstrates how to asynchronously access the Feathermorph API upon plugin initialization and how to handle potential plugin panics. ```APIDOC ## Accessing the API The API is initialized asynchronously. Use `FeatherMorphAPI.getApiFuture()` to register a callback that runs once the plugin is ready. ```java import xyz.nifeather.morph.api.FeatherMorphAPI; public class MyPlugin extends JavaPlugin { @Override public void onEnable() { // Preferred: react when API is ready FeatherMorphAPI.getApiFuture().thenAccept(api -> { getLogger().info("FeatherMorph API v" + api.getMeta().VERSION + " loaded."); var morphManager = api.directAccess().morphManager(); // ... register listeners, etc. }); // Also listen for plugin panic (fatal error) FeatherMorphAPI.listenForPluginPanic(() -> getLogger().severe("FeatherMorph encountered a fatal error!") ); } } ``` ``` -------------------------------- ### Admin: Backend Information Source: https://context7.com/nifeather/feathermorph/llms.txt Prints runtime statistics, including the active disguise backend (server or client), useful for diagnosing renderer issues. ```minecraft_command /fm stat ``` -------------------------------- ### Build FeatherMorph Plugin Source: https://context7.com/nifeather/feathermorph/llms.txt Build the plugin from source using Gradle. The output jar includes shaded dependencies. ```bash git clone https://github.com/NiFeather/FeatherMorph cd FeatherMorph ./gradlew build --no-daemon ``` -------------------------------- ### Build FeatherMorph Plugin Source: https://github.com/nifeather/feathermorph/blob/26.1/main/README.md Use this bash script to clone the FeatherMorph repository and build the plugin using Gradle. The final plugin JAR will be located in the build/libs directory. ```bash #!/usr/bin/env bash git clone https://github.com/NiFeather/FeatherMorph cd FeatherMorph ./gradlew build --no-daemon ``` -------------------------------- ### Play Disguise Animation Source: https://context7.com/nifeather/feathermorph/llms.txt Opens the animation selection GUI. Requires a compatible client mod for the player to see their own animations. ```minecraft_command /play-action ``` -------------------------------- ### Skill Configuration JSON Format Source: https://github.com/nifeather/feathermorph/wiki/SkillConfiguration Defines the general structure for skill configuration files. 'skillCooldown' ranges from 0 to 32767. 'skillId' is the unique identifier for the skill. 'abilities' lists the IDs of the associated talents, and 'settings' holds configurations for talents and all skills. ```json { "skillCooldown": 1234, "skillId": "...", "abilities": [ // ... ], "settings": { // ... } } ``` -------------------------------- ### UtilitiesAlpha - Utility Helpers Source: https://context7.com/nifeather/feathermorph/llms.txt Provides convenience methods for common plugin-to-plugin queries. Obtain an instance via `FeatherMorphAPI.utilitiesAlpha()`. ```APIDOC ## UtilitiesAlpha ### Description Convenience methods for common plugin-to-plugin queries. ### Method Signature `UtilitiesAlpha utils = api.utilitiesAlpha();` ### Methods - **isPlayerDisguising(Player player)** - Description: Checks if a player is currently disguised. - Parameters: - `player` (Player) - The player to check. - Returns: `boolean` - True if the player is disguised, false otherwise. - **lookupDisguiseUUIDFromPlayer(Player player)** - Description: Gets the virtual entity UUID used by the server renderer for this player. - Parameters: - `player` (Player) - The player whose disguise UUID to look up. - Returns: `UUID` - The virtual entity UUID, or null if not disguising or not on ServerBackend. - **lookupPlayerFromDisguiseUUID(UUID entityUUID)** - Description: Finds which player "owns" a given virtual entity UUID. - Parameters: - `entityUUID` (UUID) - The virtual entity UUID to look up. - Returns: `Player` - The player who owns the disguise, or null if not found. - **isServerBackend()** - Description: Checks if the current renderer backend is the server backend. - Returns: `boolean` - True if using ServerBackend, false otherwise. - **getPreferredPluginChannels()** - Description: Gets the preferred plugin message channels. - Returns: `String[]` - An array of preferred plugin channel names. - **getAllPluginChannels()** - Description: Gets all available plugin message channels. - Returns: `String[]` - An array of all plugin channel names. ``` -------------------------------- ### Global Skill and Ability Disabling Source: https://context7.com/nifeather/feathermorph/llms.txt Globally disable all skills and abilities by overwriting the main configuration file. This requires setting 'configurations' to an empty array and specifying the version. ```jsonc // Disable ALL skills and abilities globally // Overwrite skills.json (legacy) or any namespace file with: { "configurations": [], "version": 32768 } ``` -------------------------------- ### Accessing FeatherMorph Core Components Source: https://context7.com/nifeather/feathermorph/llms.txt Demonstrates how to obtain direct references to FeatherMorph's internal managers like MorphManager, SkillHandler, and AbilityManager using `FeatherMorphDirectAccess`. ```java FeatherMorphAPI.getApiFuture().thenAccept(api -> { var access = api.directAccess(); // MorphManager: morph/unmorph, player data, disguise providers var morphManager = access.morphManager(); // SkillManager: skill definitions and execution var skillHandler = access.skillHandler(); // AbilityManager: passive ability registry var abilityManager = access.abilityManager(); // IManageRequests: exchange request handling var requestManager = access.requestManager(); // Generic dependency lookup (throws NullDependencyException if missing) var someComponent = access.getGlobalDependency(SomeComponent.class); // Nullable variant var maybeComponent = access.getGlobalDependency(SomeComponent.class, false); }); ``` -------------------------------- ### Morph with Properties Source: https://context7.com/nifeather/feathermorph/llms.txt Apply specific properties to a disguise using Minecraft's component syntax. Properties are appended in square brackets. ```minecraft_command /morph minecraft:armor_stand [armor_stand/show_arms=true, armor_stand/small=true] ``` ```minecraft_command /morph minecraft:creeper [creeper/charged=true, entity/custom_name="BOOM", entity/custom_name_visible=true] ``` -------------------------------- ### Admin: Skin Cache Management Source: https://context7.com/nifeather/feathermorph/llms.txt Manage the cached player skins used for player disguises. ```minecraft_command /fm skin_cache ``` -------------------------------- ### Localization / Language Files Source: https://context7.com/nifeather/feathermorph/llms.txt Messages are managed in JSON files within the plugin's data folder. Use `/fm reload message` to apply changes. ```APIDOC ## Localization / Language Files Messages are stored in JSON format within the `messages/` directory of the plugin data folder, similar to Minecraft's lang files. ### Applying Changes After editing the message files, use the command `/fm reload message` to apply the changes without restarting the server. ### File Structure - `messages/en_us.json`: Example override file. Only include keys you wish to change. ```json { "morph.disguise_success": "You are now disguised as %s!", "morph.undisguise_success": "You are no longer disguised." } ``` ### Creating Translations To create a translation for an unsupported locale, copy `en_us.json` and translate the values. Contributions via pull request are welcome. ``` -------------------------------- ### PlaceholderAPI Integration - Provider Check (Player) Source: https://context7.com/nifeather/feathermorph/llms.txt Use this PlaceholderAPI placeholder to check if the player's current disguise is from the 'player' provider. Returns 'true' or 'false'. ```plaintext %feathermorph_state_provider_is?player% ``` -------------------------------- ### Admin: Create Disguise Tool Source: https://context7.com/nifeather/feathermorph/llms.txt Converts the item in the player's main hand into a Disguise Tool without requiring the crafting recipe. ```minecraft_command # Hold any item, then run: /fm make_disguise_tool ``` -------------------------------- ### PlaceholderAPI Integration - Provider Check (Minecraft) Source: https://context7.com/nifeather/feathermorph/llms.txt Use this PlaceholderAPI placeholder to check if the player's current disguise is from the 'minecraft' provider. Returns 'true' or 'false'. ```plaintext # Check if the player is disguised as a mob vs. a player # Returns "true" / "false" %feathermorph_state_provider_is?minecraft% ``` -------------------------------- ### Configure Disguise Tool Item Lore (YAML) Source: https://github.com/nifeather/feathermorph/wiki/Getting-Started-Gameplay Add lore to the disguise tool item to provide players with usage hints. Supports MiniMessage formatting for rich text. ```yaml # ... # The lore for the item # # Example: # result_item_lore: # - Lore1 # - Supports MiniMessage! result_item_lore: - "<#666666>While sneaking:" - " ~> Open disguise selection / Quick disguise" - " ~> Undisguise" - "" - "<#666666>While disguising:" - " ~> Activate skill" - " ~> Open disguise action selection" # ... ``` -------------------------------- ### Morph with Disguise Properties Source: https://context7.com/nifeather/feathermorph/llms.txt Use the /morph command with property suffixes to customize entity disguises. Values with spaces require double quotes. This allows for detailed per-entity configurations. ```minecraft-commands # Tropical fish with specific colors /morph minecraft:tropical_fish [tropical_fish/body_color=blue, tropical_fish/pattern_color=white, tropical_fish/pattern=kob] ``` ```minecraft-commands # Villager — desert type, farmer, level 3 /morph minecraft:villager [villager/type=desert, villager/profession=farmer, villager/level=3] ``` ```minecraft-commands # Fox — snow variant /morph minecraft:fox [fox/variant=snow] ``` ```minecraft-commands # Armor stand — pose the arms and legs /morph minecraft:armor_stand [armor_stand/show_arms=true, armor_stand/left_arm_rotation="[45, 0, 0]", armor_stand/right_arm_rotation="[-45, 0, 0]"] ``` ```minecraft-commands # Player disguise — left-handed /morph player:Notch [player/main_hand=left] ``` ```minecraft-commands # Ender Dragon in phase 5 /morph minecraft:ender_dragon [ender_dragon/dragon_phase=5] ``` -------------------------------- ### FeatherMorph API Utilities Source: https://context7.com/nifeather/feathermorph/llms.txt Obtain utility helpers via FeatherMorphAPI.utilitiesAlpha() to perform common plugin-to-plugin queries like checking player disguises, looking up disguise UUIDs, and checking renderer backends. Requires an active API instance. ```java FeatherMorphAPI.getApiFuture().thenAccept(api -> { var utils = api.utilitiesAlpha(); // Check if a player is currently disguised Player player = Bukkit.getPlayer("Steve"); boolean disguising = utils.isPlayerDisguising(player); // Get the virtual entity UUID used by the server renderer for this player // Returns null if not disguising or if not on ServerBackend UUID disguiseUUID = utils.lookupDisguiseUUIDFromPlayer(player); // Find which player "owns" a given virtual entity UUID Player owner = utils.lookupPlayerFromDisguiseUUID(someEntityUUID); // Check renderer backend boolean serverBackend = utils.isServerBackend(); // Get plugin message channels (for custom packet integrations) String[] preferred = utils.getPreferredPluginChannels(); String[] all = utils.getAllPluginChannels(); }); ``` -------------------------------- ### Admin: Query All Disguised Players Source: https://context7.com/nifeather/feathermorph/llms.txt Lists all players who are currently disguised. ```minecraft_command /fm queryall ``` -------------------------------- ### Dolphin Area Effect Skill Configuration Source: https://context7.com/nifeather/feathermorph/llms.txt Configure an area effect skill for the Dolphin disguise. This includes cooldown, skill ID, passive abilities, and settings for applying a potion effect. ```jsonc // skills/minecraft/dolphin.json — area effect skill { "skillCooldown": 180, "skillId": "morph:apply_effect", "abilities": [ "morph:breathe_under_water", "morph:dries_out" ], "settings": { "morph:apply_effect": { "name": "minecraft:dolphins_grace", "multiplier": 0, "duration": 200, "apply_distance": 9.0, "acquires_water": false, "show_guardian": false, "sound": "", "sound_distance": 0 } } } ``` -------------------------------- ### FeatherMorphDirectAccess - Core Component Access Source: https://context7.com/nifeather/feathermorph/llms.txt Shows how to obtain direct references to Feathermorph's internal managers like MorphManager, SkillHandler, and AbilityManager using `FeatherMorphAPI.directAccess()`. ```APIDOC ## `FeatherMorphDirectAccess` — Core Component Access Provides direct references to internal managers. Obtained via `FeatherMorphAPI.directAccess()`. ```java FeatherMorphAPI.getApiFuture().thenAccept(api -> { var access = api.directAccess(); // MorphManager: morph/unmorph, player data, disguise providers var morphManager = access.morphManager(); // SkillManager: skill definitions and execution var skillHandler = access.skillHandler(); // AbilityManager: passive ability registry var abilityManager = access.abilityManager(); // IManageRequests: exchange request handling var requestManager = access.requestManager(); // Generic dependency lookup (throws NullDependencyException if missing) var someComponent = access.getGlobalDependency(SomeComponent.class); // Nullable variant var maybeComponent = access.getGlobalDependency(SomeComponent.class, false); }); ``` ``` -------------------------------- ### Morph into Armor Stand with Properties Source: https://github.com/nifeather/feathermorph/wiki/Disguise-Property Use the /morph command with Disguise Property to specify attributes like showing arms and being small. Values with spaces or special characters can be wrapped in double quotes. ```minecraft-commands /morph minecraft:armor_stand [armor_stand/show_arms=true, armor_stand/small=true] ``` -------------------------------- ### PlaceholderAPI Integration - State Name Source: https://context7.com/nifeather/feathermorph/llms.txt Use this PlaceholderAPI placeholder to retrieve the localized display name of the player's current disguise. It returns the name or 'not_disguised' if the player is not disguised. ```plaintext # Current disguise display name (localized), or "not_disguised" %feathermorph_state_name% ``` -------------------------------- ### Registering FeatherMorph Bukkit Event Listeners Source: https://context7.com/nifeather/feathermorph/llms.txt Implement the Listener interface and register your event handler class with the Bukkit PluginManager in your plugin's onEnable method. This allows you to react to various FeatherMorph gameplay events. ```java import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import xyz.nifeather.morph.api.events.gameplay.*; public class MorphListener implements Listener { // Fired when a player morphs or switches disguise @EventHandler public void onMorph(PlayerMorphEvent event) { Player player = event.getPlayer(); DisguiseState state = event.getState(); getLogger().info(player.getName() + " morphed into " + state.getDisguiseIdentifier()); } // Fired when a player fully undisguises (NOT on disguise switch) @EventHandler public void onUnmorph(PlayerUnMorphEvent event) { getLogger().info(event.getPlayer().getName() + " undisguised."); } // Fired when a player switches from one disguise to another @EventHandler public void onSwitch(PlayerSwitchMorphEvent event) { getLogger().info(event.getPlayer().getName() + " switched disguise."); } // Cancellable — prevent skill activation @EventHandler public void onSkill(PlayerExecuteSkillEvent event) { if (someCondition) { event.setCancelled(true); } } // Fired when a player morphs but morph was loaded from offline state @EventHandler public void onOfflineLoad(PlayerDisguisedFromOfflineStateEvent event) { } // Fired when a player joins and still has a saved disguise @EventHandler public void onJoinWithDisguise(PlayerJoinedWithDisguiseEvent event) { } // Early events (cancellable, fired before state is applied) @EventHandler public void onMorphEarly(PlayerMorphEarlyEvent event) { event.setCancelled(true); // Prevent morph } @EventHandler public void onUnmorphEarly(PlayerUnMorphEarlyEvent event) { event.setCancelled(true); // Prevent unmorph } // Magic Bottle events @EventHandler public void onCollect(PlayerCollectMagicBottleEvent event) { } @EventHandler public void onConsume(PlayerConsumeMagicBottleEvent event) { } } ``` ```java public class MyPlugin extends JavaPlugin { @Override public void onEnable() { Bukkit.getPluginManager().registerEvents(new MorphListener(), this); } } ``` -------------------------------- ### Admin: Reload Plugin Configuration Source: https://context7.com/nifeather/feathermorph/llms.txt Reloads plugin data, messages, or overwrites message files. Reloading everything will unmorph all online players. ```minecraft_command /fm reload ``` ```minecraft_command /fm reload data ``` ```minecraft_command /fm reload message ``` ```minecraft_command /fm reload update_message ``` -------------------------------- ### Disable All Skills and Abilities Configuration Source: https://github.com/nifeather/feathermorph/wiki/Skills-and-abilities To disable all skills and abilities for all disguises, replace the content of the skills.json file with this configuration. This will prevent any skills or abilities from activating. ```json { "configurations": [], "version": 32768 } ``` -------------------------------- ### Creeper Custom Explosion Skill Configuration Source: https://context7.com/nifeather/feathermorph/llms.txt Configure a custom explosion skill for the Creeper disguise. This includes cooldown, skill ID, and specific explosion settings like strength and fire-setting. ```jsonc // skills/minecraft/creeper.json — custom explosion skill { "skillCooldown": 80, "skillId": "morph:explode", "abilities": [ "morph:burns_under_sun" ], "settings": { "morph:explode": { "strength": 2.5, "sets_fire": true, "kills_self": false } } } ``` -------------------------------- ### Configure Disguise Tool Lore Source: https://context7.com/nifeather/feathermorph/llms.txt Customize the lore displayed on the Disguise Tool item. This configuration is done in the recipes.yml file. ```yaml # Example recipes.yml lore configuration result_item_lore: - "<#666666>While sneaking:" - " ~> Open disguise selection / Quick disguise" - " ~> Undisguise" - "" - "<#666666>While disguising:" - " ~> Activate skill" - " ~> Open disguise action selection" ``` -------------------------------- ### Admin: Query Player Disguise State Source: https://context7.com/nifeather/feathermorph/llms.txt Queries the current disguise state of a specific player. ```minecraft_command /fm query Steve ``` -------------------------------- ### Feathermorph Permission Nodes Source: https://context7.com/nifeather/feathermorph/llms.txt Lists various permission nodes for controlling FeatherMorph features, categorized by gameplay, per-entity morph, admin, and special abilities. ```yaml feathermorph.morph # Allow disguising feathermorph.unmorph # Allow undisguising feathermorph.acquire_morph # Unlock disguises via gameplay feathermorph.headmorph # Disguise via holding a skull (Sneak+RMB) feathermorph.skill # Activate skills feathermorph.chatoverride # Use ChatOverride ability feathermorph.mirror # Use InteractionMirror feathermorph.request.send # Send exchange requests feathermorph.request.accept # Accept exchange requests feathermorph.request.deny # Deny exchange requests feathermorph.can_fly # Use the fly ability feathermorph.magic_bottle.use # Use the Magic Bottle feature feathermorph.disguise_properties.use # Use disguise properties in /morph ``` ```yaml # Morph into a specific mob feathermorph.morph.as.minecraft.sheep feathermorph.morph.as.minecraft.warden # Morph into a specific player feathermorph.morph.as.player.Notch ``` ```yaml feathermorph.manage # /fm manage feathermorph.manage.grant # Grant disguises feathermorph.manage.revoke # Revoke disguises feathermorph.manage.morph # Force-morph a player feathermorph.manage.unmorph # Force-unmorph a player feathermorph.query # /fm query feathermorph.queryall # /fm queryall feathermorph.reload # /fm reload feathermorph.stat # /fm stat feathermorph.toggle # /fm option feathermorph.lookup # Check a player's disguise list feathermorph.skin_cache # /fm skin_cache feathermorph.make_disguise_tool # /fm make_disguise_tool feathermorph.custom_skin # Customize skin for player/Mannequin disguise feathermorph.disguise_revealing # See real player names through disguises (client mod) feathermorph.admin # Receive admin warnings ``` ```yaml feathermorph.mirror.immune # Immune to InteractionMirror feathermorph.mirror.mannequin # Mirror operations to nearby mannequins feathermorph.magic_bottle.exclude # Cannot be collected by Magic Bottle feathermorph.can_fly.always # Fly regardless of morph conditions feathermorph.can_fly.in. # Fly in a specific world ``` -------------------------------- ### Shorthand Player Disguise Command Source: https://context7.com/nifeather/feathermorph/llms.txt A convenience alias for disguising as a player, equivalent to `/morph player:`. ```minecraft_command /morphplayer Notch ``` -------------------------------- ### PlaceholderAPI Integration - State ID Source: https://context7.com/nifeather/feathermorph/llms.txt Use this PlaceholderAPI placeholder to retrieve the current disguise ID of the player. It returns the ID (e.g., 'minecraft:armor_stand') or 'not_disguised' if the player is not disguised. ```plaintext # Current disguise ID (e.g., "minecraft:armor_stand"), or "not_disguised" %feathermorph_state_id% ``` -------------------------------- ### Bukkit Events Source: https://context7.com/nifeather/feathermorph/llms.txt FeatherMorph fires Bukkit events on the server event bus. Register listeners in the standard Paper way. ```APIDOC ## Bukkit Events FeatherMorph fires various Bukkit events. Listeners can be registered using the standard Bukkit/Paper event registration mechanism. ### Event List - **PlayerMorphEvent** - Description: Fired when a player morphs or switches disguise. - Cancellable: No - Parameters: - `player` (Player) - The player who morphed. - `state` (DisguiseState) - The new disguise state. - **PlayerUnMorphEvent** - Description: Fired when a player fully undisguises (not on disguise switch). - Cancellable: No - Parameters: - `player` (Player) - The player who undisguised. - **PlayerSwitchMorphEvent** - Description: Fired when a player switches from one disguise to another. - Cancellable: No - Parameters: - `player` (Player) - The player who switched disguise. - **PlayerExecuteSkillEvent** - Description: Fired when a player attempts to execute a skill. - Cancellable: Yes - Parameters: - `player` (Player) - The player executing the skill. - `skillIdentifier` (String) - The identifier of the skill being executed. - **PlayerDisguisedFromOfflineStateEvent** - Description: Fired when a player morphs, and the morph was loaded from an offline state. - Cancellable: No - Parameters: - `player` (Player) - The player who was disguised. - **PlayerJoinedWithDisguiseEvent** - Description: Fired when a player joins the server and still has a saved disguise. - Cancellable: No - Parameters: - `player` (Player) - The player who joined with a disguise. - **PlayerMorphEarlyEvent** - Description: An early event fired before the morph state is applied. Can be cancelled to prevent morphing. - Cancellable: Yes - Parameters: - `player` (Player) - The player attempting to morph. - **PlayerUnMorphEarlyEvent** - Description: An early event fired before the unmorph state is applied. Can be cancelled to prevent unmorphing. - Cancellable: Yes - Parameters: - `player` (Player) - The player attempting to unmorph. - **PlayerCollectMagicBottleEvent** - Description: Fired when a player collects a magic bottle. - Cancellable: No - Parameters: - `player` (Player) - The player who collected the bottle. - **PlayerConsumeMagicBottleEvent** - Description: Fired when a player consumes a magic bottle. - Cancellable: No - Parameters: - `player` (Player) - The player who consumed the bottle. ``` -------------------------------- ### Unmorph Command Source: https://context7.com/nifeather/feathermorph/llms.txt Removes the player's current disguise and restores their default appearance. ```minecraft_command /unmorph ``` -------------------------------- ### Morph as a Mob Source: https://context7.com/nifeather/feathermorph/llms.txt Disguise as a vanilla mob using its namespaced ID. Ensure the mob is unlocked. ```minecraft_command /morph minecraft:enderman ``` -------------------------------- ### Request Disguise Exchange Source: https://context7.com/nifeather/feathermorph/llms.txt Manage disguise exchange requests with other players. Acceptance unlocks each other's disguise. ```minecraft_command /request send Steve ``` ```minecraft_command /request accept Steve ``` ```minecraft_command /request deny Steve ``` -------------------------------- ### Admin: Force Unmorph Source: https://context7.com/nifeather/feathermorph/llms.txt Forces a target player to remove their current disguise. The target player must be online. ```minecraft_command /fm manage unmorph Steve ``` -------------------------------- ### Admin: Force Morph Source: https://context7.com/nifeather/feathermorph/llms.txt Forces a target player to morph into a specified disguise. The target player must be online. ```minecraft_command /fm manage morph Steve minecraft:elder_guardian ``` -------------------------------- ### Morph as Another Player Source: https://context7.com/nifeather/feathermorph/llms.txt Disguise as another player by specifying 'player:' followed by their username. The target player does not need to be online. ```minecraft_command /morph player:Notch ``` -------------------------------- ### Admin: Grant Disguise Source: https://context7.com/nifeather/feathermorph/llms.txt Grants a specific disguise to a target player. The target player must be online. ```minecraft_command /fm manage grant Steve minecraft:warden ``` -------------------------------- ### Toggle Towny Flight Source: https://context7.com/nifeather/feathermorph/llms.txt Requires Towny integration. Toggles whether morph-granted flight is permitted within a player's town. ```minecraft_command /toggle-town-morph-flight ``` -------------------------------- ### Entity Tag - Preventing Disguise Unlocking Source: https://context7.com/nifeather/feathermorph/llms.txt Entities tagged with `feathermorph_nogrant` will not grant their disguise to the killing player. ```APIDOC ## Entity Tag - Preventing Disguise Unlocking Entities tagged with `feathermorph_nogrant` will not grant their disguise to the player who kills them. ### Usage - **Via Minecraft Command:** ``` /tag @e[type=minecraft:zombie,name="Boss Zombie"] add feathermorph_nogrant ``` - **Via Summon (NBT Tags array):** ``` /summon minecraft:warden ~ ~ ~ {Tags:["feathermorph_nogrant"]} ``` ``` -------------------------------- ### Admin: Revoke Disguise Source: https://context7.com/nifeather/feathermorph/llms.txt Revokes a specific disguise from a target player. The target player must be online. ```minecraft_command /fm manage revoke Steve minecraft:warden ``` -------------------------------- ### Preventing Disguise Unlocking with Entity Tags Source: https://context7.com/nifeather/feathermorph/llms.txt Use the 'feathermorph_nogrant' tag on entities to prevent players from unlocking their disguise upon killing them. This is useful for specific mobs like boss arenas or event creatures. ```minecraft # Via Minecraft command /tag @e[type=minecraft:zombie,name="Boss Zombie"] add feathermorph_nogrant ``` ```minecraft # Via summon (NBT Tags array) /summon minecraft:warden ~ ~ ~ {Tags:["feathermorph_nogrant"]} ``` === COMPLETE CONTENT === This response contains all available snippets from this library. No additional content exists. Do not make further requests.