Un filtre est une question à laquelle on répond par oui ou par non, que le jeu se pose sur une créature. « L'attaquant est-il un joueur ? » « Fait-il jour ? » « Cette créature est-elle dans l'eau ? » Si la réponse est oui, le filtre passe et ce qu'il protège peut se produire.
Les filtres apparaissent partout dans les fichiers d'une créature : dans les événements, dans des composants comme les capteurs de dégâts et le ciblage, et dans les règles d'apparition. Apprends-les une fois et tu pourras t'en servir partout.
Les fichiers
Les filtres n'ont pas de fichier à eux. Ils se trouvent à l'intérieur d'autres fichiers, sous des clés nommées filters (ou biome_filter dans les règles d'apparition).
BP/
entities/
ruby_golem.json <- in events and many components
spawn_rules/
ruby_golem.json <- minecraft:biome_filterUn seul test
Le plus petit filtre est un seul test :
{ "test": "is_family", "subject": "other", "operator": "==", "value": "player" }Lis-le comme une phrase : « La famille de l'entité other est-elle égale à player ? »
| Champ | Ce qu'il signifie | Si tu l'omets |
|---|---|---|
test | Quelle question poser. Voir les tableaux plus bas. | Obligatoire |
subject | Sur qui porte la question | self |
operator | Comment comparer avec value | equals |
value | À quoi comparer | Pour les tests oui/non : true |
domain | Un détail en plus pour quelques tests, comme un emplacement d'équipement ou un nom de propriété | Dépend du test |
Grâce aux valeurs par défaut, les filtres courts sont fréquents :
{ "test": "is_daytime" }
{ "test": "in_water", "value": false }
{ "test": "has_tag", "value": "wiki:tamed" }Le premier demande « fait-il jour ? ». Le deuxième demande « cette créature n'est-elle pas dans l'eau ? ».
Sujets : qui est testé
| Sujet | De qui il s'agit |
|---|---|
self | La créature à qui appartient le filtre |
other | L'autre entité d'une interaction : celle qui est ciblée, touchée ou avec qui on interagit |
player | Le joueur impliqué dans l'interaction |
target | La cible actuelle de la créature |
damager | Celui qui a causé les dégâts, dans un capteur de dégâts |
parent | Le parent de la créature |
block | Le bloc concerné, pour les tests de bloc comme is_block |
Les sujets qui ont du sens dépendent de l'endroit où se trouve le filtre. Dans un capteur de dégâts, other et damager désignent l'attaquant. Dans un comportement de ciblage, other est la créature envisagée comme cible.
Opérateurs : comment comparer
| Opérateur | Signifie |
|---|---|
==, =, equals | Égal à (par défaut) |
!=, <>, not | Différent de |
< | Inférieur à |
<= | Inférieur ou égal à |
> | Supérieur à |
>= | Supérieur ou égal à |
Les opérateurs supérieur/inférieur n'ont de sens que pour les tests de nombres comme actor_health ou distance_to_nearest_player.
Combiner des tests
Rassemble plusieurs tests dans un groupe :
| Groupe | Passe quand |
|---|---|
all_of | Tous les tests à l'intérieur passent (ET) |
any_of | Au moins un test à l'intérieur passe (OU) |
none_of | Aucun test à l'intérieur ne passe (NON) |
Les groupes peuvent contenir d'autres groupes, donc tu peux construire n'importe quelle règle. Celle-ci passe pour un joueur qui ne s'accroupit pas, la nuit ou pendant un orage :
"filters": {
"all_of": [
{ "test": "is_family", "subject": "other", "value": "player" },
{ "test": "is_sneaking", "subject": "other", "value": false },
{
"any_of": [
{ "test": "is_daytime", "value": false },
{ "test": "weather_at_position", "value": "thunderstorm" }
]
}
]
}Une liste nue veut dire all_of
Si tu écris une simple liste de tests sans nom de groupe, chaque test doit passer, exactement comme all_of. Les règles d'apparition vanilla font souvent ça.
Où on utilise les filtres
Capteur de dégâts : réagir à qui t'a frappé
"minecraft:damage_sensor": {
"triggers": [
{
"on_damage": {
"filters": { "test": "is_family", "subject": "other", "value": "player" },
"event": "wiki:become_angry"
}
}
]
}Seuls les joueurs mettent le golem en colère. Les dégâts des créatures, des chutes ou du feu ne font rien de spécial. Voir minecraft:damage_sensor.
Ciblage : qui attaquer
"minecraft:behavior.nearest_attackable_target": {
"priority": 2,
"entity_types": [
{
"filters": {
"all_of": [
{ "test": "is_family", "subject": "other", "value": "monster" },
{ "test": "is_family", "subject": "other", "operator": "not", "value": "creeper" }
]
},
"max_dist": 16
}
]
}Le golem chasse les monstres, mais laisse les creepers tranquilles. Voir behavior.nearest_attackable_target.
Capteur d'environnement : réagir au monde
"minecraft:environment_sensor": {
"triggers": [
{
"filters": { "test": "in_water" },
"event": "wiki:start_rusting"
}
]
}Le capteur d'environnement vérifie ses filtres en permanence et déclenche l'événement tant qu'ils passent.
Événements et règles d'apparition
Dans les événements, filters décide si une entrée s'exécute (voir Événements d'entité). Dans les règles d'apparition, minecraft:biome_filter utilise les mêmes tests pour choisir les biomes (voir Règles d'apparition).
Les tests les plus utiles
Il existe plus d'une centaine de tests. Voici ceux dont tu te serviras le plus souvent, rangés selon ce qu'ils vérifient.
Qui est-ce ?
| Test | Valeur | Passe quand le sujet... |
|---|---|---|
is_family | Nom de famille, comme "player" | a cette famille dans minecraft:type_family |
has_component | ID de composant, comme "minecraft:is_baby" | a ce composant en ce moment |
has_tag | Nom du tag | a ce tag venant de /tag |
is_baby | true / false | est un bébé |
is_tamed | true / false | est apprivoisé |
is_owner | true / false | est le propriétaire de la créature à qui appartient le filtre |
has_nametag | true / false | a un nom personnalisé |
is_variant | Nombre | a ce nombre dans minecraft:variant |
is_mark_variant | Nombre | a ce nombre dans minecraft:mark_variant |
is_color | Nom de couleur, comme "red" | a cette couleur |
Santé et état
| Test | Valeur | Passe quand le sujet... |
|---|---|---|
actor_health | Nombre | a une santé comparée à la valeur (utilise <, >, etc.) |
is_missing_health | true / false | n'a pas toute sa santé |
has_mob_effect | ID d'effet, comme "poison" | a cet effet. Voir Effets vanilla. |
on_fire | true / false | est en feu |
on_ground | true / false | est posé sur le sol |
is_sneaking | true / false | est accroupi |
is_sprinting | true / false | sprinte |
is_moving | true / false | est en mouvement |
is_riding | true / false | chevauche une autre entité |
rider_count | Nombre | a ce nombre de cavaliers |
has_target | true / false | a quelque chose à attaquer |
has_damage | Type de dégâts, comme "fall" ou "fire" | subit ce type de dégâts (capteurs de dégâts) |
Objets
| Test | Valeur | Passe quand le sujet... |
|---|---|---|
has_equipment | ID d'objet | a cet objet dans l'emplacement indiqué par domain, comme "hand", "head" ou "any" |
has_equipment_tag | Tag d'objet | a un objet avec ce tag dans l'emplacement domain |
has_ranged_weapon | true / false | tient un arc ou une arbalète |
Où il se trouve
| Test | Valeur | Passe quand le sujet... |
|---|---|---|
in_water | true / false | est dans l'eau |
is_underwater | true / false | est complètement sous l'eau |
in_water_or_rain | true / false | est dans l'eau ou sous la pluie |
in_lava | true / false | est dans la lave |
is_underground | true / false | a des blocs au-dessus de lui |
in_nether / in_overworld | true / false | est dans cette dimension |
has_biome_tag | Tag de biome, comme "desert" | est dans un biome avec ce tag. Voir Biomes vanilla. |
is_biome | Type de biome, comme "ocean" ou "jungle" | est dans ce grand type de biome |
is_altitude | Nombre | est à une hauteur comparée à la valeur |
is_block | ID de bloc | (avec "subject": "block") le bloc concerné est ce bloc |
is_in_village | true / false | est dans un village |
has_biome_tag ou is_biome ?
Préfère has_biome_tag. Les tags sont plus précis, et les biomes personnalisés d'autres add-ons peuvent porter les mêmes tags.
Distance
| Test | Valeur | Passe quand... |
|---|---|---|
distance_to_nearest_player | Nombre de blocs | le joueur le plus proche est à cette distance (utilise < ou >) |
target_distance | Nombre de blocs | la cible de la créature est à cette distance |
owner_distance | Nombre de blocs | le propriétaire de la créature est à cette distance |
home_distance | Nombre de blocs | le foyer de la créature est à cette distance |
Heure, météo et monde
| Test | Valeur | Passe quand... |
|---|---|---|
is_daytime | true / false | il fait jour |
hourly_clock_time | Nombre de 0 à 24000 | l'heure du jour comparée à la valeur |
moon_phase | Nombre de 0 à 7 | la lune est dans cette phase |
weather_at_position | Météo, comme "thunderstorm" | la météo là où se tient le sujet correspond |
is_difficulty | "peaceful", "easy", "normal" ou "hard" | le jeu est dans cette difficulté |
is_game_rule | true / false | la règle de jeu indiquée dans domain est activée |
random_chance | Nombre | un tirage au hasard réussit : une valeur de 10 passe environ 1 fois sur 10 |
Propriétés d'entité
Ces tests lisent les propriétés déclarées dans la description de la créature. Le nom de la propriété va dans domain :
| Test | Valeur |
|---|---|
bool_property | true / false |
int_property | Nombre entier |
float_property | Nombre décimal |
enum_property | Un des mots de values |
has_property | Le nom de la propriété (dans value, sans domain) |
{ "test": "enum_property", "domain": "wiki:mood", "value": "angry" }Quand quelque chose ne va pas
| Ce que tu vois | Cause la plus probable |
|---|---|
| Le filtre ne passe jamais | Mauvais subject. Dans un capteur de dégâts ou un ciblage, tu veux en général other, pas self. |
| Le filtre passe alors qu'il ne devrait pas | Il manque "value": false à un test oui/non là où tu voulais dire « non », ou une clé est mal écrite (comme allof). Regarde le journal de contenu (Content Log). |
| Un test de famille échoue | La famille n'est pas dans la liste minecraft:type_family de la cible |
| Un test de propriété échoue | Le nom de propriété dans domain ne correspond pas à celui de description.properties |
| Un test de nombre se comporte bizarrement | L'opérateur manque, donc il cherche une égalité exacte |
Plus d'aide dans Dépannage.