Configuración de modelos
Cada modelo requiere un archivo .yml en plugins/Animorph/models/.
El .geo.json se detecta automáticamente por nombre de archivo.
Estructura YAML completa
display_name: Mi Modelo
texture: mi_modelo.png
animation: mi_modelo.animation.json
model:
default: mi_modelo.geo.json
slim: mi_modelo_slim.geo.json
properties:
is_layer: false
animation_controllers:
idle:
transition_time: 0
simple_pose:
transition_time: 0
emote:
transition_time: 0
arm_right:
transition_time: 0
arm_left:
transition_time: 0
arms:
transition_time: 0
fp_animation_controllers:
fp_arm_right:
transition_time: 0
fp_arm_left:
transition_time: 0
fp_arms:
transition_time: 0
first_person:
show_equipment: true
model:
show: true
offset:
x: 0
y: 0
z: 0
custom_arms:
show: true
custom_render_items: true
both_hands: true
texts:
'{health}': '%player_health%'
'{name}': '%player_display_name%'
render_type: entity_cutout_no_cull
hide_nametag: false
equipment:
head: player_equipment/player_head.geo.json
chest: player_equipment/player_chest.geo.json
legs: player_equipment/player_legs.geo.json
feet: player_equipment/player_feet.geo.json
cape: player_equipment/player_cape.geo.json
elytra: player_equipment/player_elytra.geo.json
layers:
mi_accesorio:
type: model
model: accesorio_model
show_first_person: true
default_enabled: false
hide_bones:
- head
texture_layers:
- overlay
color: "#FFFFFFFF"
sync_exclusions: []
overlay:
type: texture
texture: overlay.png
show_first_person: true
default_enabled: false
hide_bones: []
color: "#FFFFFFFF"
sync_exclusions: []
hitboxes:
standing: hitboxes/mi_modelo_standing.json
crouching: hitboxes/mi_modelo_crouching.json
sleeping: hitboxes/mi_modelo_sleeping.json
fall_flying: hitboxes/mi_modelo_elytra.json
swimming: hitboxes/mi_modelo_swimming.json
spin_attack: hitboxes/mi_modelo_trident.json
dying: hitboxes/mi_modelo_dying.json Referencia de campos
Nivel superior
| Campo | Tipo | Descripción |
|---|---|---|
display_name | string | Nombre visible del modelo. Déjalo vacío (display_name: "") para no mostrar ningún nombre. |
texture | string | Textura en textures/. Si se omite, usa el skin del jugador. |
animation | string | Archivo .animation.json en animations/. |
properties
| Campo | Tipo | Descripción |
|---|---|---|
is_layer | boolean | Si es true, el modelo funciona como layer (no reemplaza al jugador). |
animation_controllers | lista | Controladores de animación activos para el modelo. Ver Animaciones. |
fp_animation_controllers | lista | Controladores de animación para los brazos en primera persona. Si se omite, usa los controladores por defecto (fp_arm_right, fp_arm_left, fp_arms). |
render_type | string | RenderType de Minecraft para el modelo. Por defecto entity_cutout_no_cull. Otros valores: entity_translucent, entity_solid. |
hide_nametag | boolean | Si es true, oculta el nametag del jugador mientras el modelo está activo. Por defecto false. |
Paths del modelo
Por defecto Animorph detecta el .geo.json por nombre de archivo. Puedes especificar rutas explícitas con el bloque model::
model:
default: ruta/al/modelo.geo.json
slim: ruta/al/modelo_slim.geo.json Si no se define slim, los jugadores con skin tipo Alex usan el mismo modelo que Steve.
Hitboxes por pose
Cada modelo puede tener su propio hitbox para cada pose del jugador. Se define en el YAML del modelo bajo hitboxes:. Cada valor es una ruta relativa a models/ que apunta a un JSON con la geometría del hitbox.
hitboxes:
standing: hitboxes/mi_modelo_standing.json
crouching: hitboxes/mi_modelo_crouching.json
sleeping: hitboxes/mi_modelo_sleeping.json
fall_flying: hitboxes/mi_modelo_elytra.json
swimming: hitboxes/mi_modelo_swimming.json
spin_attack: hitboxes/mi_modelo_trident.json
dying: hitboxes/mi_modelo_dying.json | Pose | Descripción |
|---|---|
standing | Jugador de pie (estado por defecto). |
crouching | Agachado (Shift). |
sleeping | Durmiendo en cama. |
fall_flying | Volando con elytra. |
swimming | Nadando. |
spin_attack | Ataque de tridente. |
dying | Muriendo. |
Primera persona
Configura qué se renderiza en la vista de primera persona. Va bajo properties.first_person.
| Campo | Tipo | Descripción |
|---|---|---|
show_equipment | boolean | Muestra la armadura en primera persona. |
model.show | boolean | Muestra el cuerpo completo del modelo (torso, piernas...). |
model.offset.x/y/z | number | Desplazamiento del modelo respecto a la cámara. |
custom_arms.show | boolean | Usa los brazos del modelo en lugar de los vanilla. |
custom_arms.custom_render_items | boolean | Renderiza ítems a través de las manos del modelo. |
custom_arms.both_hands | boolean | Renderiza ambas manos (derecha e izquierda). |
properties:
first_person:
show_equipment: true
model:
show: true
offset:
x: 0
y: 0
z: 0
custom_arms:
show: true
custom_render_items: true
both_hands: true api.updateFirstPersonProperty(player, property).
Ver la sección de API para más detalles.
Cubos de texto
Animorph permite colocar texto en cualquier parte del modelo usando cubos de texto.
Cualquier cubo en Blockbench puede convertirse en un cubo de texto agregando la propiedad text_display
en su definición JSON (o usando el Plugin de Blockbench).
Propiedades del cubo de texto
Dentro del .geo.json, un cubo de texto se define así:
{
"origin": [0, 24, 0],
"size": [16, 9, 0.1],
"text_display": {
"content": "{name}",
"color": "#ffffff",
"background_color": "#000000",
"background": true,
"alignment": "CENTER",
"padding": 10
}
} | Campo | Tipo | Descripción |
|---|---|---|
content | string | Texto a mostrar. Puede ser texto fijo, un placeholder ({nombre}) o un placeholder de PlaceholderAPI (%player_health%). |
color | string | Color del texto. Soporta #RRGGBB, #AARRGGBB, rgb(r,g,b), rgba(r,g,b,a). |
background_color | string | Color de fondo del texto. Mismos formatos que color. |
background | boolean | Si se muestra el fondo del texto. |
alignment | string | Alineación: LEFT, CENTER, RIGHT. |
padding | int | Porcentaje de padding (0–100). |
Placeholders dinámicos
Los cubos de texto pueden usar placeholders que se actualizan en tiempo real.
Se registran en el YAML del modelo bajo properties.texts:
properties:
texts:
'{health}': '%player_health%'
'{name}': '%player_display_name%'
'{level}': '%player_level%'
La clave (entre llaves) es el ID del placeholder que coincide con content en el cubo.
El valor es el texto inicial: puede ser texto fijo o un placeholder de PlaceholderAPI (%...%).
Para actualizar el texto desde el servidor:
/animorph text Steve {name} "NuevoTexto"
/animorph text @a {level} 99 placeholder-check-interval en config.yml (en ticks).
Hueso de cámara
Animorph soporta un hueso de cámara que permite animar la perspectiva del jugador. Esto es útil para crear efectos cinematográficos en emotes o animaciones.
Configuración
Agrega un hueso llamado camera en el modelo desde Blockbench.
El nombre debe ser exactamente camera (sin importar mayúsculas/minúsculas).
camera no se renderiza visualmente: es un hueso de control.
Solo su posición y rotación afectan la cámara del jugador.
Comportamiento
- La posición del hueso desplaza la cámara respecto al jugador (en unidades GeckoLib: 1 px = 1/16 bloque).
- La rotación del hueso rota la cámara (pitch, yaw, roll en radianes).
- Los cambios se interpolan suavemente para evitar movimientos bruscos.
- Funciona en cualquier perspectiva (primera y tercera persona).
Uso con emotes
Al animar el hueso camera en un archivo .animation.json,
la cámara del jugador seguirá la animación mientras el emote esté activo.
Cuando el emote termina, la cámara vuelve a su posición normal.
Modelo .geo.json
└── root
├── body
│ ├── head
│ └── ...
└── camera ← hueso de cámara (no se renderiza) Equipamiento
Cada clave del bloque equipment apunta a un .geo.json relativo a models/. Se renderiza cuando el jugador equipa esa pieza de armadura.
equipment:
head: player_equipment/player_head.geo.json
chest: player_equipment/player_chest.geo.json
legs: player_equipment/player_legs.geo.json
feet: player_equipment/player_feet.geo.json
cape: player_equipment/player_cape.geo.json
elytra: player_equipment/player_elytra.geo.json models/.
Equipamiento por ítem
Con equipment.items puedes asignar un modelo diferente según el ítem específico que equipe el jugador,
en lugar de solo por slot. Estos tienen prioridad sobre los modelos de slot genéricos.
equipment:
# Modelos por slot — aplican a cualquier ítem en ese slot
head: player_equipment/player_head.geo.json
chest: player_equipment/player_chest.geo.json
legs: player_equipment/player_legs.geo.json
feet: player_equipment/player_feet.geo.json
# Modelos por ítem específico — tienen prioridad sobre los de slot
items:
minecraft:netherite_helmet:
head: player_equipment/netherite_head.geo.json
minecraft:diamond_chestplate:
chest: player_equipment/diamond_chest.geo.json
my_mod:custom_armor_piece:
head: player_equipment/custom_head.geo.json
chest: player_equipment/custom_chest.geo.json namespace:item_id).
Puedes declarar múltiples slots por ítem: solo los slots declarados reemplazan al modelo genérico;
los no declarados siguen usando el modelo de slot (o ninguno si tampoco está definido).
Layers
Los layers se superponen sobre el modelo base sin reemplazarlo. Hay dos tipos:
- texture — aplica una imagen PNG sobre la geometría del modelo base. Soporta texturas animadas con
.mcmeta. - model — renderiza otro modelo completo (que tenga
is_layer: true) encima.
layers:
pompompurin:
type: model
model: pompompurin # ID del modelo con is_layer: true
show_first_person: true
default_enabled: false
hide_bones:
- head
- body
texture_layers:
- test_layer # IDs de texture layers que se aplican sobre este model layer
test_layer:
type: texture
texture: player_layer.png # ruta relativa a textures/
show_first_person: true
default_enabled: false
hide_bones:
- right_arm
- left_arm Referencia de campos de layer
| Campo | Tipo | Aplica a | Descripción |
|---|---|---|---|
type | string | ambos | model o texture. Obligatorio. |
model | string | model | ID del modelo registrado con is_layer: true. |
texture | string | texture | Ruta de la textura PNG relativa a textures/. |
show_first_person | boolean | ambos | Si se renderiza el layer en primera persona. Por defecto false. |
default_enabled | boolean | ambos | Si el layer está activo por defecto al aplicar el modelo. Por defecto false. |
hide_bones | lista | ambos | Lista de huesos del modelo base que se ocultan cuando este layer está activo. |
texture_layers | lista | model | IDs de layers de tipo texture que se aplican sobre este model layer (como overlays del layer). |
color | string | ambos | Tinte ARGB en formato hex (#RRGGBB o #AARRGGBB). Por defecto #FFFFFFFF (sin tinte). Se puede sobreescribir por jugador en runtime con applyLayerColor(). |
sync_exclusions | lista | ambos | IDs de layers cuyo estado no se sincroniza cuando este layer cambia. |
hide_bones es útil para reemplazar partes del modelo base con el layer.
Por ejemplo, un layer de casco puede ocultar el hueso head del modelo base
para que no se superponga.
Texturas animadas en layers
Los layers de tipo texture soportan texturas animadas usando archivos .mcmeta,
igual que las texturas de Minecraft. Coloca el archivo .mcmeta junto a la textura:
textures/
├── blade_axe_layer.png
└── blade_axe_layer.png.mcmeta {
"animation": {
"frametime": 2
}
} Modelo de layer (is_layer: true)
Para usar un modelo como layer, regístralo con is_layer: true:
display_name: Pompompurin
texture: pompompurin.png
animation: player.animation.json
properties:
is_layer: true Activar y desactivar layers
# Activar el layer "pompompurin" del modelo "player" para Steve
/animorph layer Steve player pompompurin true
# Desactivar el layer
/animorph layer Steve player pompompurin false Plugin de Blockbench
La documentación del plugin de Blockbench se movió a su propia sección. Ahí encuentras cómo instalarlo, las funcionalidades disponibles y cómo usar la sincronización en vivo.