Animaciones y Emotes
Animorph usa un sistema de controladores de animación por layers. Cada emote tiene su propio YAML en animations/.
Configuración de emotes
Cada emote es un archivo .yml en animations/.
El nombre del archivo (sin extensión) es el namespace del emote.
Cada animación dentro del archivo se registra como namespace:nombre_animacion.
Ejemplo simple
animation: greet.animation.json Si greet.animation.json contiene una animación llamada "wave", el emote se invoca con /animorph emote greet:wave @a.
Ejemplo con propiedades
animation: dance.animation.json
properties:
freeze: true
stop:
on_death: true
on_hurt: false
controller_exceptions:
- arm_right
- arm_left
layer_emotes:
pompompurin: dance Referencia de campos
| Campo | Tipo | Descripción |
|---|---|---|
animation | string | Archivo .animation.json en animations/. Obligatorio. |
properties.freeze | boolean | Congela el movimiento del jugador durante el emote. |
properties.stop.on_death | boolean | Detiene el emote al morir. |
properties.stop.on_hurt | boolean | Detiene el emote al recibir daño. |
properties.controller_exceptions | lista | Controladores que NO se desactivan durante el emote (ej: brazos). |
properties.layer_emotes | map | Emotes que se reproducen automáticamente en layers junto con el emote principal. Clave: ID de layer, valor: ID de emote. |
Emotes por layer
Además de emotes a nivel de modelo, Animorph soporta emotes por layer. Esto permite reproducir animaciones independientes en cada layer del modelo.
Desde el servidor (API o comandos), puedes reproducir emotes en layers específicos:
// Reproducir emote solo en un layer
api.playEmote(player, "dance:spin", Set.of("pompompurin"));
// Detener emote en layers específicos
api.clearEmote(player, Set.of("pompompurin"));
O definir emotes de layer automáticos en el YAML con layer_emotes,
para que al reproducir el emote principal, los layers indicados reproduzcan su propio emote simultáneamente.
/animorph reload.
Controladores de animación
Los controladores se evalúan en orden de prioridad. El primero que tenga una animación activa gana para ese ciclo de renderizado.
| ID | Cuándo actúa |
|---|---|
emote | Cuando hay un emote activo (máxima prioridad). |
extended_pose | Poses avanzadas: idle/walk/sprint/jump/fall/climb/backwards y más. |
simple_pose | Poses básicas: idle, caminar, agacharse, nadar, volar, dormir, montar. |
mount_pose | Poses al montar entidades: horse, boat (con giros) y generic. |
turn_overlay | Overlay que se activa al girar el cuerpo (normal y giro rápido). |
idle | Animación base siempre activa (breathing, idle, etc.). |
arm_right / arm_left | Pose de cada brazo según el ítem en mano. |
arms / fp_arms | Ambos brazos a la vez (hold, swing, por ítem). |
fp_emote | Emotes en primera persona. |
fp_arm_right / fp_arm_left | Brazos en primera persona. |
*.animation.json | Animation controllers custom (máquina de estados con Molang). Se referencian por nombre de archivo completo. |
Regístralos en el YAML del modelo:
properties:
animation_controllers:
idle:
transition_time: 0
simple_pose:
transition_time: 0
extended_pose:
transition_time: 5 # blend entre animaciones (en ticks)
animation_transitions:
standing.jump: 0 # override: sin blend al saltar
standing.fall: 2 # override: blend rápido al caer
emote:
transition_time: 2
mount_pose:
transition_time: 0
turn_overlay:
transition_time: 0
arm_right:
transition_time: 0
arm_left:
transition_time: 0 animation_transitions permite sobrescribir el transition_time
para animaciones específicas. La clave es el nombre de la animación sin
el prefijo del controlador (ej. standing.jump, no extended_pose.standing.jump).
Nombres de animación por controlador
Cada controlador busca animaciones con nombres exactos en tu .animation.json.
Si la animación no existe, el controlador simplemente no la reproduce.
idle
Controla la orientación de la cabeza del modelo. Siempre está activo si el modelo lo tiene registrado.
| Nombre en Blockbench | Cuándo se usa |
|---|---|
idle | Siempre activo. Maneja la rotación de la cabeza según la vista del jugador. |
simple_pose
| Nombre | Estado |
|---|---|
pose.standing | De pie, sin moverse. |
pose.idle | Idle genérico. |
pose.crouching | Agachado (Shift). |
pose.swimming | Nadando. |
pose.flying | Volando (creativo). |
pose.fall_flying | Planeando con elytra. |
pose.sleeping | Durmiendo. |
pose.sitting | Montando un vehículo. |
pose.spin_attack | Ataque giratorio con tridente. |
pose.dying | Muriendo. |
extended_pose
Variantes más detalladas de cada estado:
| Nombre | Estado |
|---|---|
extended_pose.standing.idle | De pie, sin moverse. |
extended_pose.standing.walk | Caminando. |
extended_pose.standing.sprint | Corriendo. |
extended_pose.standing.backwards | Caminando hacia atrás. |
extended_pose.standing.jump | Saltando (idle, walk o sprint según el movimiento). |
extended_pose.standing.jump.idle | Salto sin moverse horizontalmente. |
extended_pose.standing.jump.walk | Salto caminando. |
extended_pose.standing.jump.sprint | Salto corriendo. |
extended_pose.standing.jump.backwards | Salto hacia atrás. |
extended_pose.standing.fall | Cayendo. |
extended_pose.standing.step_up | Subiendo un bloque. |
extended_pose.on_edge.idle | De pie en el borde de un bloque. |
extended_pose.on_fence.idle | Parado sobre una valla, quieto. |
extended_pose.on_fence.walk | Caminando sobre una valla. |
extended_pose.crouching.idle | Agachado, quieto. |
extended_pose.crouching.walk | Caminando agachado. |
extended_pose.crouching.backwards | Caminando agachado hacia atrás. |
extended_pose.flying.idle | Volando, quieto. |
extended_pose.flying.walk | Volando y moviéndose. |
extended_pose.flying.sprint | Volando a máxima velocidad. |
extended_pose.climbing.up | Trepando hacia arriba. |
extended_pose.climbing.down | Bajando por una escalera. |
extended_pose.climbing.idle | Agarrado a la escalera, quieto. |
extended_pose.climbing.crouching.up | Trepando agachado. |
extended_pose.climbing.crouching.idle | Agarrado agachado, quieto. |
extended_pose.climbing.backwards | Bajando de espaldas. |
extended_pose.in_water.idle | En agua/lava, quieto. |
extended_pose.in_water.walk | Moviéndose en agua/lava. |
extended_pose.in_water.up | Nadando hacia arriba. |
extended_pose.in_water.down | Hundiéndose (shift en agua). |
extended_pose.in_water.backwards | Nadando hacia atrás. |
extended_pose.swimming.idle | En pose de natación, quieto. |
extended_pose.swimming.walk | Nadando despacio. |
extended_pose.swimming.sprint | Nadando rápido (sprint). |
extended_pose.fall_flying | Planeando con elytra. |
extended_pose.sleeping | Durmiendo. |
extended_pose.sitting | Montando (genérico). |
extended_pose.spin_attack | Ataque giratorio. |
extended_pose.dying | Muriendo. |
mount_pose
Animaciones específicas según el tipo de montura:
| Nombre | Estado |
|---|---|
mount_pose.generic.idle | Montando cualquier entidad, quieto. |
mount_pose.generic.walk | Montando cualquier entidad, moviéndose. |
mount_pose.horse.idle | Montando un caballo (u otra entidad viva), quieto. |
mount_pose.horse.walk | Montando un caballo, moviéndose. |
mount_pose.boat.idle | En barco, quieto. |
mount_pose.boat.walk | En barco, moviéndose. |
mount_pose.boat.turn_left | Girando a la izquierda en barco. |
mount_pose.boat.turn_right | Girando a la derecha en barco. |
turn_overlay
Overlay que se activa al girar el cuerpo del jugador:
| Nombre | Cuándo |
|---|---|
turn_overlay.left | Girando a la izquierda (>8° por tick). |
turn_overlay.right | Girando a la derecha. |
turn_overlay.fast_left | Giro rápido a la izquierda (>35° por tick). Fallback a left si no existe. |
turn_overlay.fast_right | Giro rápido a la derecha. Fallback a right si no existe. |
Si tu modelo tiene una animación con el sufijo
.hold.<item_id>,
esta toma prioridad sobre la animación genérica del mismo estado.Por ejemplo, si existe
extended_pose.standing.idle.hold.minecraft:diamond_sword,
se usará esa en lugar de extended_pose.standing.idle cuando el jugador sostenga una espada de diamante.Lo mismo aplica para
simple_pose: pose.standing.hold.minecraft:bow
sobreescribe pose.standing.
arm_right / arm_left
Poses del brazo según la acción. En primera persona se usa el prefijo fp..
| 3a persona | 1a persona | Acción |
|---|---|---|
arm_right.hold | fp.arm_right.hold | Sosteniendo un objeto. |
arm_right.empty | fp.arm_right.empty | Mano vacía. |
arm_right.swing | fp.arm_right.swing | Atacando. |
arm_right.eat | fp.arm_right.eat | Comiendo. |
arm_right.drink | fp.arm_right.drink | Bebiendo. |
arm_right.block | fp.arm_right.block | Bloqueando con escudo. |
arm_right.bow | fp.arm_right.bow | Tensando arco. |
arm_right.crossbow | fp.arm_right.crossbow | Cargando ballesta. |
arm_right.trident | fp.arm_right.trident | Lanzando tridente. |
arm_right.spyglass | fp.arm_right.spyglass | Usando catalejo. |
Para el brazo izquierdo, sustituye arm_right por arm_left.
Animaciones por ítem específico
Podés definir una animación de hold para un ítem concreto de Minecraft. Si existe, toma prioridad sobre la animación genérica de hold:
arm_right.hold.<item_id>
arm_right.hold.minecraft:diamond_sword
arm_right.hold.minecraft:bow Si el controlador
arms tiene definida la animación arms.hold.<item_id>
para el ítem que el jugador sostiene, los controladores individuales arm_right y arm_left
se detienen y ceden el control a arms.Lo mismo aplica para el swing: si
arms tiene arms.swing o
arms.hold.<item_id>.swing, el swing individual de arm_right / arm_left
no se ejecuta.
arms / fp_arms
Ambos brazos a la vez. Se usan principalmente en primera persona (fp.arms.*).
| 3a persona | 1a persona | Acción |
|---|---|---|
arms.none | fp.arms.none | Sin acción. |
arms.swing | fp.arms.swing | Atacando (todos los ítems). |
arms.hold.<item_id> | fp.arms.hold.<item_id> | Sosteniendo un ítem específico. |
arms.hold.<item_id>.swing | fp.arms.hold.<item_id>.swing | Swing con un ítem específico. |
arms.eat | fp.arms.eat | Comiendo. |
arms.drink | fp.arms.drink | Bebiendo. |
arms.block | fp.arms.block | Bloqueando. |
arms.bow | fp.arms.bow | Tensando arco. |
arms.crossbow | fp.arms.crossbow | Cargando ballesta. |
arms.trident | fp.arms.trident | Lanzando tridente. |
arms.spyglass | fp.arms.spyglass | Catalejo. |
minecraft:diamond_sword, minecraft:bow, minecraft:shield.
Usá el namespace completo, incluyendo minecraft: o el mod correspondiente.
emote
No usa nombres fijos. Reproduce la animación declarada en el .animation.json
que referencia el YAML del emote.
Animation Controllers custom
Los animation controllers custom son máquinas de estados exportadas desde Blockbench que usan condiciones Molang para determinar qué animación reproducir.
Uso
- En Blockbench, crea un Animation Controller en la pestaña de animaciones.
- Exporta como JSON y colócalo en
animations/(la misma carpeta de animaciones). - Añádelo a
animation_controllersen el modelo con una clave libre y el campofileapuntando al archivo.
properties:
animation_controllers:
idle:
transition_time: 0
simple_pose:
transition_time: 0
mi_controlador:
file: mi_controlador.animation_controller.json Coloca el archivo en:
plugins/Animorph/animations/mi_controlador.animation_controller.json file. El transition_time
se define dentro del propio controlador.
Estructura del JSON
{
"format_version": "1.10.0",
"animation_controllers": {
"controller.animation.mi_controlador": {
"initial_state": "idle",
"states": {
"idle": {
"animations": ["idle"],
"transitions": [
{ "walking": "query.limb_swing_amount > 0.1" }
]
},
"walking": {
"animations": ["pose.standing"],
"transitions": [
{ "idle": "query.limb_swing_amount < 0.1" }
]
}
}
}
}
} Queries Molang
Queries personalizadas disponibles en condiciones de transición y propiedades de animación:
| Query | Tipo | Descripción |
|---|---|---|
query.limb_swing | float | Ciclo de balanceo de extremidades (0 .. 2π). |
query.limb_swing_amount | float | Intensidad del balanceo: 0 = parado, 1 = corriendo. |
query.ground_speed | float | Velocidad horizontal normalizada. |
query.pitch | float | Inclinación de la cabeza (-1..1). |
query.yaw | float | Rotación horizontal de la vista. |
query.body_yaw | float | Rotación del cuerpo respecto a la vista. |
query.left_hand_swing | float | Swing del brazo izquierdo al atacar (0..1). |
query.right_hand_swing | float | Swing del brazo derecho al atacar (0..1). |
query.is_flying | bool | El jugador está en modo vuelo. |
query.can_fly | bool | El jugador tiene permiso de vuelo. |
query.death_time | float | Ticks desde la muerte (0 si vivo). |
query.use_action | enum | Acción del ítem: BOW, TRIDENT, SPYGLASS, EAT... |
query.use_time | float | Ticks usando el ítem activo. |
query.use_time_left | float | Ticks restantes de uso. |
Ejemplos de uso
// Transición cuando el jugador vuela y se mueve
"query.is_flying && query.limb_swing_amount > 0.05"
// Peso de animación de arco ponderado por carga
"query.use_action == 'BOW' ? math.min(query.use_time / 20.0, 1.0) : 0.0"
// Detectar que el jugador acaba de morir
"query.death_time > 0" Conversión desde EmoteCraft
Si tienes animaciones en formato EmoteCraft:
- Asegúrate de que EmoteCraft está instalado y la animación registrada.
- Ejecuta:
/animorph emote-parser <id_emote> - El archivo convertido se guarda en
plugins/Animorph/animations/parser/. - Crea un YAML referenciando el archivo y recarga con
/animorph reload.