1. Wiki
  2. /Entidades
  3. /El archivo de entidad

El archivo de entidad

Cómo se construye el archivo de entidad de un paquete de comportamiento de Bedrock: la descripción, los componentes, los grupos de componentes y los eventos, con un ejemplo completo del gólem de rubí.

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.

Paquete de comportamiento
BP/
  entities/
    ruby_golem.json
  spawn_rules/
    ruby_golem.json

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

ParteQué contiene
descriptionEl ID de la criatura y unos cuantos interruptores: si puede tener huevo generador, si /summon puede crearla, qué propiedades guarda
componentsLo que la criatura tiene siempre: vida, movimiento, caja de colisión, comportamientos básicos
component_groupsPaquetes de componentes con nombre que luego activas y desactivas, como "cría" o "enfadado"
eventsAcciones con nombre que activan y desactivan esos paquetes

Este es el esqueleto vacío:

BP/entities/ruby_golem.json
{
  "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

BP/entities/ruby_golem.json (description)
"description": {
  "identifier": "wiki:ruby_golem",
  "is_spawnable": true,
  "is_summonable": true
}
CampoQué hace
identifierEl 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_spawnabletrue le da a la criatura un huevo generador y permite que las reglas de aparición la coloquen en el mundo.
is_summonabletrue permite que el comando /summon la cree.
runtime_identifierOpcional. 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.
propertiesOpcional. 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').

BP/entities/ruby_golem.json (description)
"properties": {
  "wiki:mood": {
    "type": "enum",
    "values": ["calm", "angry"],
    "default": "calm",
    "client_sync": true
  },
  "wiki:rubies_eaten": {
    "type": "int",
    "range": [0, 5],
    "default": 0
  }
}
TipoGuardaCampo extra
booltrue o falseninguno
intUn número enterorange: el valor mínimo y máximo permitido
floatUn número decimalrange: el valor mínimo y máximo permitido
enumUna palabra de una listavalues: la lista de palabras permitidas
  • default es 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_sync enví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.

BP/entities/ruby_golem.json (components)
"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.

BP/entities/ruby_golem.json (component_groups)
"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:

  1. 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.
  2. 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.
  3. 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.

BP/entities/ruby_golem.json (events)
"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.

BP/entities/ruby_golem.json
{
  "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:

  1. Aparece el gólem. El juego lanza minecraft:entity_spawned por sí solo, y randomize da una probabilidad de 1 entre 5 de añadir wiki:baby.
  2. Un jugador lo golpea. El sensor de daño comprueba el filtro (¿el atacante es un jugador?) y lanza wiki:become_angry.
  3. 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_target ya ha convertido al jugador en su objetivo.
  4. El temporizador del grupo de enfado cuenta 20 segundos y luego lanza wiki:calm_down, que vuelve a quitar el grupo.

Consejos

  • Deja en components solo lo que nunca cambia. Si un componente está a la vez en components y 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:angry y wiki:baby son 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 vesCausa 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 generadoris_spawnable es false, o el paquete de recursos no tiene spawn_egg
Un evento no hace nadaEl nombre del grupo en add no coincide con ningún nombre de component_groups
Un error de propiedad en el registroLa propiedad no está declarada en description.properties, o el valor se sale de range o de values
La criatura nunca vuelve a su estado anteriorNada lanza el evento que quita el grupo

Tienes más ayuda en Solución de problemas. Lo siguiente: Eventos de entidad.

We use cookies to improve your experience and analyse site traffic. Learn more