Compatibility
Minecraft: Java Edition
Platforms
Supported environments
Tags
Creators
Details
Emote for Fabric
Emote is a Minecraft Fabric emote player for BD Engine humanoid exports. It plays emotes from datapacks on the server, and modded clients can replace the datapack skin with the player's current skin.

Quick Start
Included Example Datapacks
The repository already includes ready-to-test example datapacks in docs/example:
emote.cry.zipemote.hello.zipemote.no.zipemote.yes.zip
To test them as-is:
- Put the mod jar into the server
modsfolder. - Copy the four zip files above into the world
datapacksfolder. - Replace
config/emote/pack.jsonwith this:
{
"permissions": {
"": [
{
"datapack_identifier": "cry",
"name": "cry",
"command_name": "cry",
"description": "cry",
"default_animation_name": "default",
"options": "loop"
},
{
"datapack_identifier": "hello",
"name": "hello",
"command_name": "hello",
"description": "hello",
"default_animation_name": "default",
"options": "loop"
},
{
"datapack_identifier": "no",
"name": "no",
"command_name": "no",
"description": "no",
"default_animation_name": "default",
"options": "loop"
},
{
"datapack_identifier": "yes",
"name": "yes",
"command_name": "yes",
"description": "yes",
"default_animation_name": "default",
"options": "loop"
}
]
}
}
- Start the server or run
/emote reload. - Try:
/emote play hello
/emote play hello default_loop
/emote play yes
/emote menu
The example datapacks already contain play_anim_loop.mcfunction, so options: "loop" immediately adds loop entries such as default_loop.
Key Features
- Server-side emote playback from datapacks
- Automatic datapack discovery and reload support
/emotecommand- Optional player skin replacement on modded clients
- Optional MineSkin upload/cache support for baked player skin textures
pack.jsonmetadata-based loop entry generation for datapacks withplay_anim_loop.mcfunction- Support for BD Engine humanoid exports that use
emote:*skin markers
Install
Server
- Put the mod jar into the server
modsfolder. - Put the emote datapack zip or folder into the world
datapacksfolder. - Register the datapack namespace and metadata in
config/emote/pack.json. - Start the server or run
/emote reload. - Use
/emote.
Client
Client installation is optional.
- With the client mod installed, the emote model can use the player's current skin.
- Without the client mod, the skin defined in the datapack is used instead.
- The example datapacks include the developer skin, so their default appearance may look unusual without client skin replacement.
Datapacks
Emotes are loaded from datapacks whose namespaces are listed in config/emote/pack.json.
A datapack is treated as an emote when its data/<namespace> folder matches a configured datapack_identifier.
Prepare Your Own Datapack
BD Engine export zips can be prepared with prepare_emote_datapack.py.
The script adds the emote:* markers used for player skin support and writes an emote.name.zip file.
python docs\prepare_emote_datapack.py [--defaults] [--swap-left-right] path\to\project.zip
Animation Requirements
- A normal animation entry requires
data/<namespace>/function/a/<animation>/play_anim.mcfunction. - A loop entry additionally requires
data/<namespace>/function/a/<animation>/play_anim_loop.mcfunction. - The included example datapacks all provide both
play_anim.mcfunctionandplay_anim_loop.mcfunctionfordefault.
Config
The mod uses two config files:
config/emote/config.jsonconfig/emote/pack.json
config.json
menu_page_size: number of emotes shown per menu pageplayer_skin_port: port used by the built-in skin texture endpoint,0for automatic selectionmineskin_api_key: optional MineSkin API key for uploading baked player skin textures and using MineSkin-hosted URLsemote_permission: default permission required to use emotes
pack.json
pack.json maps permission strings to emote pack entries.
{
"permissions": {
"": [
{
"datapack_identifier": "hello",
"name": "hello",
"command_name": "hello",
"description": "hello",
"default_animation_name": "default",
"options": "loop"
}
],
"emote.pack.vip": [
{
"datapack_identifier": "wave_pack",
"name": "wave",
"command_name": "wave",
"description": "wave",
"default_animation_name": "default",
"options": ""
}
]
}
}
permissionsmaps a permission string to a list of emote packsdatapack_identifieris the datapack namespace, which means the folder name underdata/<namespace>- An empty permission key
""means the pack has no extra pack-specific permission - The same
datapack_identifiercannot appear in more than one permission group command_name,name,description,default_animation_name, andoptionsare defined here instead of being read from the datapack itself
options
options is a space-separated string.
loop: adds extra*_loopanimation entries when the datapack hasplay_anim_loop.mcfunctionvisible_player: keeps the real player visible instead of forcing invisibility during playback
Example:
"""loop""visible_player loop"
License
This project is licensed under the Apache License 2.0.

