Chaque créature d'un add-on a un fichier de comportement. Il décide de la santé de la créature, de sa façon de se déplacer, de ce qu'elle attaque et de la façon dont elle évolue avec le temps. Cette page décortique ce fichier morceau par morceau, avec un golem de rubis comme exemple.
Si tu n'as jamais créé de créature, commence par Ta première créature personnalisée. Cette page va plus loin dans l'organisation du fichier.
Les fichiers
Le fichier de comportement se trouve dans le dossier entities du pack de comportements. Tu choisis le nom du fichier, mais lui donner le nom de la créature, c'est plus clair.
BP/
entities/
ruby_golem.json
spawn_rules/
ruby_golem.jsonL'apparence de la créature est définie dans un second fichier, dans le pack de ressources. Voir Le fichier d'entité client.
Les quatre parties
Dans minecraft:entity, il y a jusqu'à quatre blocs. Seul description est obligatoire, mais presque toutes les créatures utilisent les quatre.
| Partie | Ce qu'elle contient |
|---|---|
description | L'identifiant de la créature et quelques interrupteurs : peut-elle avoir un œuf d'apparition, /summon peut-il la créer, quelles propriétés elle stocke |
components | Ce que la créature a toujours : santé, déplacement, boîte de collision, comportements de base |
component_groups | Des lots de composants nommés que tu actives et désactives plus tard, comme "bébé" ou "en colère" |
events | Des actions nommées qui activent et désactivent ces lots |
Voici le squelette vide :
{
"format_version": "1.26.50",
"minecraft:entity": {
"description": {},
"components": {},
"component_groups": {},
"events": {}
}
}format_version indique au jeu quelle version des règles suit ton fichier. Utilise une version récente, comme celle des entités vanilla.
Partie 1 : description
"description": {
"identifier": "wiki:ruby_golem",
"is_spawnable": true,
"is_summonable": true
}| Champ | Ce qu'il fait |
|---|---|
identifier | L'identifiant de la créature, sous la forme namespace:name. Il doit correspondre exactement à celui du fichier du pack de ressources. N'utilise jamais l'espace de noms minecraft pour tes propres créatures. |
is_spawnable | true donne un œuf d'apparition à la créature et permet aux règles d'apparition de la placer dans le monde. |
is_summonable | true permet à la commande /summon de la créer. |
runtime_identifier | Facultatif. Emprunte un comportement caché, codé en dur, à une créature vanilla, par exemple minecraft:snowball. La plupart des créatures n'en ont pas besoin. |
properties | Facultatif. Des valeurs que la créature retient, expliquées plus bas. |
Beaucoup de créatures vanilla ont aussi une ligne spawn_category, comme "creature" ou "monster". Ta créature fonctionne sans.
Les propriétés : des valeurs que la créature retient
Les propriétés sont de petites données stockées sur chaque créature. Tu peux les modifier depuis des événements, les tester avec des filtres, et les lire en Molang avec 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
}
}| Type | Contient | Champ supplémentaire |
|---|---|---|
bool | true ou false | aucun |
int | Un nombre entier | range : la valeur autorisée la plus basse et la plus haute |
float | Un nombre décimal | range : la valeur autorisée la plus basse et la plus haute |
enum | Un mot choisi dans une liste | values : la liste des mots autorisés |
defaultest la valeur de départ. Ça peut aussi être une expression Molang, ce que les abeilles vanilla utilisent pour calculer leur état de départ.client_syncenvoie la valeur au pack de ressources, pour que les animations et les contrôleurs de rendu puissent l'utiliser. Active-le seulement quand l'apparence en dépend.
Propriétés ou groupes de composants ?
Utilise un groupe de composants quand la créature doit agir différemment. Utilise une propriété quand tu as juste besoin de retenir quelque chose, ou quand le modèle ou la texture doit changer en fonction.
Partie 2 : components
Les components sont toujours actifs, dès l'apparition de la créature. Mets-y ce qui ne change jamais : sa famille, sa boîte de collision, sa physique et sa façon de marcher.
"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 }
}Chaque clé est un composant, et son objet contient les réglages de ce composant. Un objet vide {} veut dire "utilise les valeurs par défaut". Il y a des centaines de composants au choix : parcours-les tous dans Composants d'entité.
Partie 3 : component groups
Un groupe de composants est un lot de composants nommé qui reste désactivé jusqu'à ce qu'un événement l'ajoute. C'est comme ça qu'une même créature peut être un bébé puis un adulte, ou calme puis en colère.
"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 }
}
}Quelques règles bonnes à savoir :
- Tu choisis les noms des groupes. Ajouter ton espace de noms (
wiki:angry) évite les conflits et les rend faciles à repérer. - Une créature ne peut avoir qu'un seul exemplaire de chaque composant. Quand un groupe contenant
minecraft:movementest ajouté, sa vitesse remplace celle que la créature avait avant. - Ajouter un groupe déjà actif redémarre ses composants. Un
minecraft:timer, par exemple, recommence à compter à partir de zéro.
Partie 4 : events
Les événements sont les interrupteurs. Chaque événement a un nom et une liste d'actions, le plus souvent add et remove pour les groupes de composants.
"events": {
"wiki:grow_up": {
"remove": { "component_groups": ["wiki:baby"] }
},
"wiki:become_angry": {
"add": { "component_groups": ["wiki:angry"] },
"set_property": { "wiki:mood": "angry" }
}
}Quelque chose doit déclencher un événement. Dans le groupe bébé ci-dessus, minecraft:ageable déclenche wiki:grow_up quand le temps est écoulé. D'autres composants, comme minecraft:damage_sensor, minecraft:timer et minecraft:environment_sensor, déclenchent aussi des événements. Les commandes aussi : /event entity @e[type=wiki:ruby_golem] wiki:become_angry.
Les événements peuvent faire bien plus : choisir au hasard, exécuter des étapes dans l'ordre et vérifier des conditions. Tout ça se trouve sur la page suivante, Événements d'entité.
Le golem de rubis complet
Voici tout assemblé. La plupart du temps, le golem apparaît adulte, parfois bébé. Il se met en colère quand un joueur le frappe, et se calme au bout de 20 secondes.
{
"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" }
}
}
}
}Comment ça se déroule :
- Le golem apparaît. Le jeu déclenche tout seul
minecraft:entity_spawned, et lerandomizedonne 1 chance sur 5 d'ajouterwiki:baby. - Un joueur le frappe. Le capteur de dégâts vérifie le filtre (l'attaquant est-il un joueur ?) et déclenche
wiki:become_angry. - Cet événement ajoute le groupe en colère : le golem a maintenant une attaque, un comportement de corps à corps et une vitesse plus élevée.
hurt_by_targeta déjà fait du joueur sa cible. - Le minuteur du groupe en colère compte 20 secondes, puis déclenche
wiki:calm_down, qui retire à nouveau le groupe.
Conseils
- Garde
componentspour ce qui ne change jamais. Si un composant est à la fois danscomponentset dans un groupe, il devient difficile de savoir lequel est actif. Mets ce qui change uniquement dans des groupes. - Un rôle par groupe. De petits groupes comme
wiki:angryetwiki:babyse combinent plus facilement qu'un énorme groupe par état. - Inspire-toi du vanilla. Les fichiers de la vache, du loup et de l'abeille dans Entités vanilla montrent plein d'exemples concrets.
Quand quelque chose ne va pas
| Ce que tu vois | Cause la plus probable |
|---|---|
La créature n'existe pas (/summon échoue) | Une erreur JSON, ou une faute de frappe dans l'identifiant. Vérifie le Content Log. |
| Pas d'œuf d'apparition | is_spawnable vaut false, ou le pack de ressources n'a pas de spawn_egg |
| Un événement ne fait rien | Le nom du groupe dans add ne correspond à aucun nom de component_groups |
| Une erreur de propriété dans le journal | La propriété n'est pas déclarée dans description.properties, ou la valeur sort de range ou de values |
| La créature ne revient jamais à son état normal | Rien ne déclenche l'événement qui retire le groupe |
Tu trouveras plus d'aide dans Dépannage. Ensuite : Événements d'entité.