Cada criatura de un complemento tiene un archivo de comportamiento. Decide cuánta vida tiene la criatura, cómo se mueve, a qué ataca y cómo cambia con el tiempo. Esta página desmonta ese archivo pieza a pieza, usando como ejemplo un gólem de rubí.
Si nunca has hecho una criatura, empieza por Tu primera criatura personalizada. Esta página profundiza en cómo está organizado el archivo.
Los archivos
El archivo de comportamiento va en la carpeta entities del paquete de comportamiento. El nombre del archivo lo eliges tú, pero ponerle el nombre de la criatura ayuda a tenerlo todo ordenado.
BP/
entities/
ruby_golem.json
spawn_rules/
ruby_golem.jsonEl aspecto de la criatura se define en un segundo archivo, dentro del paquete de recursos. Mira El archivo de entidad de cliente.
Las cuatro partes
Dentro de minecraft:entity hay hasta cuatro bloques. Solo description es obligatorio, pero casi todas las criaturas usan los cuatro.
| Parte | Qué contiene |
|---|---|
description | El ID de la criatura y unos cuantos interruptores: si puede tener huevo generador, si /summon puede crearla, qué propiedades guarda |
components | Lo que la criatura tiene siempre: vida, movimiento, caja de colisión, comportamientos básicos |
component_groups | Paquetes de componentes con nombre que luego activas y desactivas, como "cría" o "enfadado" |
events | Acciones con nombre que activan y desactivan esos paquetes |
Este es el esqueleto vacío:
{
"format_version": "1.26.50",
"minecraft:entity": {
"description": {},
"components": {},
"component_groups": {},
"events": {}
}
}format_version le dice al juego qué versión de las reglas sigue tu archivo. Usa una versión reciente, como la que usan las entidades del juego base.
Parte 1: description
"description": {
"identifier": "wiki:ruby_golem",
"is_spawnable": true,
"is_summonable": true
}| Campo | Qué hace |
|---|---|
identifier | El ID de la criatura, con la forma namespace:name. Tiene que coincidir exactamente con el del archivo del paquete de recursos. No uses nunca el espacio de nombres minecraft para tus propias criaturas. |
is_spawnable | true le da a la criatura un huevo generador y permite que las reglas de aparición la coloquen en el mundo. |
is_summonable | true permite que el comando /summon la cree. |
runtime_identifier | Opcional. Toma prestado comportamiento oculto y fijo en el código de una criatura del juego base, por ejemplo minecraft:snowball. La mayoría de las criaturas no lo necesitan. |
properties | Opcional. Valores que la criatura recuerda, explicados más abajo. |
Muchas criaturas del juego base también tienen una línea spawn_category, como "creature" o "monster". Tu criatura funciona sin ella.
Propiedades: valores que la criatura recuerda
Las propiedades son pequeños datos que se guardan en cada criatura. Puedes cambiarlas desde eventos, comprobarlas con filtros y leerlas en Molang con q.property('wiki:mood').
"properties": {
"wiki:mood": {
"type": "enum",
"values": ["calm", "angry"],
"default": "calm",
"client_sync": true
},
"wiki:rubies_eaten": {
"type": "int",
"range": [0, 5],
"default": 0
}
}| Tipo | Guarda | Campo extra |
|---|---|---|
bool | true o false | ninguno |
int | Un número entero | range: el valor mínimo y máximo permitido |
float | Un número decimal | range: el valor mínimo y máximo permitido |
enum | Una palabra de una lista | values: la lista de palabras permitidas |
defaultes el valor inicial. También puede ser una expresión de Molang, que es lo que usan las abejas del juego base para calcular su estado inicial.client_syncenvía el valor al paquete de recursos para que las animaciones y los controladores de renderizado puedan usarlo. Actívalo solo cuando el aspecto dependa de él.
¿Propiedades o grupos de componentes?
Usa un grupo de componentes cuando la criatura deba comportarse de otra forma. Usa una propiedad cuando solo necesites recordar algo, o cuando el modelo o la textura tengan que cambiar según su valor.
Parte 2: components
Los components están siempre activos, desde el momento en que aparece la criatura. Pon aquí lo que nunca cambia: su familia, su caja de colisión, sus físicas y su forma de caminar.
"components": {
"minecraft:type_family": { "family": ["ruby_golem", "golem", "mob"] },
"minecraft:health": { "value": 40, "max": 40 },
"minecraft:collision_box": { "width": 1.2, "height": 2.4 },
"minecraft:physics": {},
"minecraft:movement": { "value": 0.25 },
"minecraft:movement.basic": {},
"minecraft:navigation.walk": { "avoid_water": true },
"minecraft:jump.static": {},
"minecraft:behavior.random_stroll": { "priority": 6, "speed_multiplier": 0.8 },
"minecraft:behavior.look_at_player": { "priority": 7, "look_distance": 8 }
}Cada clave es un componente, y su objeto contiene los ajustes de ese componente. Un objeto vacío {} significa "usa los valores por defecto". Hay cientos de componentes entre los que elegir: explóralos todos en Componentes de entidad.
Parte 3: component groups
Un grupo de componentes es un paquete de componentes con nombre que se queda desactivado hasta que un evento lo añade. Así es como una misma criatura puede ser cría y luego adulta, o estar tranquila y luego enfadada.
"component_groups": {
"wiki:baby": {
"minecraft:is_baby": {},
"minecraft:scale": { "value": 0.5 },
"minecraft:ageable": {
"duration": 1200,
"grow_up": { "event": "wiki:grow_up", "target": "self" }
}
},
"wiki:angry": {
"minecraft:attack": { "damage": 6 },
"minecraft:behavior.melee_attack": { "priority": 3 },
"minecraft:movement": { "value": 0.32 }
}
}Algunas reglas que conviene saber:
- Los nombres de los grupos los eliges tú. Añadir tu espacio de nombres (
wiki:angry) evita choques y hace que sean fáciles de reconocer. - Una criatura solo puede tener una copia de cada componente. Cuando se añade un grupo con
minecraft:movement, se usa su velocidad en lugar de la que tenía antes la criatura. - Añadir un grupo que ya está activo reinicia sus componentes. Un
minecraft:timer, por ejemplo, vuelve a contar desde cero.
Parte 4: events
Los eventos son los interruptores. Cada evento tiene un nombre y una lista de cosas que hacer, casi siempre add y remove para grupos de componentes.
"events": {
"wiki:grow_up": {
"remove": { "component_groups": ["wiki:baby"] }
},
"wiki:become_angry": {
"add": { "component_groups": ["wiki:angry"] },
"set_property": { "wiki:mood": "angry" }
}
}Algo tiene que lanzar el evento. En el grupo de cría de arriba, minecraft:ageable lanza wiki:grow_up cuando se acaba el tiempo. Otros componentes, como minecraft:damage_sensor, minecraft:timer y minecraft:environment_sensor, también lanzan eventos. Y los comandos también pueden: /event entity @e[type=wiki:ruby_golem] wiki:become_angry.
Los eventos pueden hacer mucho más: elegir al azar, ejecutar pasos en orden y comprobar condiciones. Todo eso está en la siguiente página, Eventos de entidad.
El gólem de rubí completo
Aquí está todo junto. La mayoría de las veces el gólem aparece como adulto, y a veces como cría. Se enfada cuando un jugador lo golpea y se calma pasados 20 segundos.
{
"format_version": "1.26.50",
"minecraft:entity": {
"description": {
"identifier": "wiki:ruby_golem",
"is_spawnable": true,
"is_summonable": true,
"properties": {
"wiki:mood": {
"type": "enum",
"values": ["calm", "angry"],
"default": "calm",
"client_sync": true
}
}
},
"components": {
"minecraft:type_family": { "family": ["ruby_golem", "golem", "mob"] },
"minecraft:health": { "value": 40, "max": 40 },
"minecraft:collision_box": { "width": 1.2, "height": 2.4 },
"minecraft:physics": {},
"minecraft:movement": { "value": 0.25 },
"minecraft:movement.basic": {},
"minecraft:navigation.walk": { "avoid_water": true },
"minecraft:jump.static": {},
"minecraft:behavior.hurt_by_target": { "priority": 2 },
"minecraft:behavior.random_stroll": { "priority": 6, "speed_multiplier": 0.8 },
"minecraft:behavior.look_at_player": { "priority": 7, "look_distance": 8 },
"minecraft:damage_sensor": {
"triggers": [
{
"on_damage": {
"filters": { "test": "is_family", "subject": "other", "value": "player" },
"event": "wiki:become_angry"
}
}
]
}
},
"component_groups": {
"wiki:baby": {
"minecraft:is_baby": {},
"minecraft:scale": { "value": 0.5 },
"minecraft:ageable": {
"duration": 1200,
"grow_up": { "event": "wiki:grow_up", "target": "self" }
}
},
"wiki:angry": {
"minecraft:attack": { "damage": 6 },
"minecraft:behavior.melee_attack": { "priority": 3 },
"minecraft:movement": { "value": 0.32 },
"minecraft:timer": {
"time": 20,
"looping": false,
"time_down_event": { "event": "wiki:calm_down" }
}
}
},
"events": {
"minecraft:entity_spawned": {
"randomize": [
{ "weight": 80 },
{ "weight": 20, "add": { "component_groups": ["wiki:baby"] } }
]
},
"wiki:grow_up": {
"remove": { "component_groups": ["wiki:baby"] }
},
"wiki:become_angry": {
"add": { "component_groups": ["wiki:angry"] },
"set_property": { "wiki:mood": "angry" }
},
"wiki:calm_down": {
"remove": { "component_groups": ["wiki:angry"] },
"set_property": { "wiki:mood": "calm" }
}
}
}
}Cómo funciona:
- Aparece el gólem. El juego lanza
minecraft:entity_spawnedpor sí solo, yrandomizeda una probabilidad de 1 entre 5 de añadirwiki:baby. - Un jugador lo golpea. El sensor de daño comprueba el filtro (¿el atacante es un jugador?) y lanza
wiki:become_angry. - Ese evento añade el grupo de enfado: ahora el gólem tiene un ataque, un comportamiento de combate cuerpo a cuerpo y más velocidad.
hurt_by_targetya ha convertido al jugador en su objetivo. - El temporizador del grupo de enfado cuenta 20 segundos y luego lanza
wiki:calm_down, que vuelve a quitar el grupo.
Consejos
- Deja en
componentssolo lo que nunca cambia. Si un componente está a la vez encomponentsy en un grupo, cuesta saber cuál está activo. Pon lo que cambia solo en grupos. - Una tarea por grupo. Los grupos pequeños como
wiki:angryywiki:babyson más fáciles de combinar que un grupo enorme por cada estado. - Copia del juego base. Los archivos de la vaca, el lobo y la abeja en Entidades del juego base muestran muchos patrones reales.
Cuando algo falla
| Lo que ves | Causa más probable |
|---|---|
La criatura no existe (/summon falla) | Un error de JSON, o el identificador está mal escrito. Revisa el registro de contenido. |
| No hay huevo generador | is_spawnable es false, o el paquete de recursos no tiene spawn_egg |
| Un evento no hace nada | El nombre del grupo en add no coincide con ningún nombre de component_groups |
| Un error de propiedad en el registro | La propiedad no está declarada en description.properties, o el valor se sale de range o de values |
| La criatura nunca vuelve a su estado anterior | Nada lanza el evento que quita el grupo |
Tienes más ayuda en Solución de problemas. Lo siguiente: Eventos de entidad.