Docs / Modelos

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

yaml plugins/Animorph/models/mi_modelo.yml
display_name: Mi Modelo
texture: mi_modelo.png
animation: mi_modelo.animation.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%'

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
  overlay:
    type: texture
    texture: overlay.png
    show_first_person: true
    default_enabled: false
    hide_bones: []

Referencia de campos

Nivel superior

CampoTipoDescripción
display_namestringNombre visible del modelo.
texturestringTextura en textures/. Si se omite, usa el skin del jugador.
animationstringArchivo .animation.json en animations/.

properties

CampoTipoDescripción
is_layerbooleanSi es true, el modelo funciona como layer (no reemplaza al jugador).
animation_controllerslistaControladores de animación activos para el modelo. Ver Animaciones.
fp_animation_controllerslistaControladores 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).

Primera persona

Configura qué se renderiza en la vista de primera persona. Va bajo properties.first_person.

CampoTipoDescripción
show_equipmentbooleanMuestra la armadura en primera persona.
model.showbooleanMuestra el cuerpo completo del modelo (torso, piernas...).
model.offset.x/y/znumberDesplazamiento del modelo respecto a la cámara.
custom_arms.showbooleanUsa los brazos del modelo en lugar de los vanilla.
custom_arms.custom_render_itemsbooleanRenderiza ítems a través de las manos del modelo.
custom_arms.both_handsbooleanRenderiza ambas manos (derecha e izquierda).
yaml
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
Consejo
Estas propiedades definen los valores por defecto del modelo. Desde el servidor puedes sobrescribirlas por jugador en tiempo real usando 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í:

json Ejemplo de cubo en .geo.json
{
  "origin": [0, 24, 0],
  "size": [16, 9, 0.1],
  "text_display": {
    "content": "{name}",
    "color": "#ffffff",
    "background_color": "#000000",
    "background": true,
    "alignment": "CENTER",
    "padding": 10
  }
}
CampoTipoDescripción
contentstringTexto a mostrar. Puede ser texto fijo, un placeholder ({nombre}) o un placeholder de PlaceholderAPI (%player_health%).
colorstringColor del texto. Soporta #RRGGBB, #AARRGGBB, rgb(r,g,b), rgba(r,g,b,a).
background_colorstringColor de fondo del texto. Mismos formatos que color.
backgroundbooleanSi se muestra el fondo del texto.
alignmentstringAlineación: LEFT, CENTER, RIGHT.
paddingintPorcentaje 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:

yaml
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:

bash
/animorph text Steve {name} "NuevoTexto"
/animorph text @a {level} 99
Consejo
El intervalo de actualización de PlaceholderAPI se controla con placeholder-check-interval en config.yml (en ticks).
Nota
El tamaño y posición del cubo de texto se toman directamente del cubo en Blockbench. El texto se adapta al área del cubo automáticamente.

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).

Nota
El hueso 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.

plaintext Ejemplo en Blockbench
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.

yaml
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
Nota
Los archivos de armadura son geometrías GeckoLib independientes, no modelos registrados. Pueden estar en cualquier subcarpeta dentro de models/.

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.
yaml Definir layers en el modelo
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

CampoTipoAplica aDescripción
typestringambosmodel o texture. Obligatorio.
modelstringmodelID del modelo registrado con is_layer: true.
texturestringtextureRuta de la textura PNG relativa a textures/.
show_first_personbooleanambosSi se renderiza el layer en primera persona. Por defecto false.
default_enabledbooleanambosSi el layer está activo por defecto al aplicar el modelo. Por defecto false.
hide_boneslistaambosLista de huesos del modelo base que se ocultan cuando este layer está activo.
texture_layerslistamodelIDs de layers de tipo texture que se aplican sobre este model layer (como overlays del layer).
Consejo
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:

plaintext
textures/
├── blade_axe_layer.png
└── blade_axe_layer.png.mcmeta
json 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:

yaml plugins/Animorph/models/pompompurin.yml
display_name: Pompompurin
texture: pompompurin.png
animation: player.animation.json
properties:
  is_layer: true

Activar y desactivar layers

bash
# 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í encontrás cómo instalarlo, las funcionalidades disponibles y cómo usar la sincronización en vivo.

Ver Plugin de Blockbench →