Cet article fait partie d’une série servant à enseigner l’art du développement sur Minecraft. Vous pourrez retrouver l’introduction et le sommaire en cliquant ici.
Lors de l’article sur le execute, nous avions annoncé avoir volontairement omis une partie de la commande, le execute store, nous allons donc en parler ici !
Comme vous vous en doutez sûrement, il y a un lien assez fort avec la commande /data, et c’est en partie là que la commande révèle son potentiel, car nous pouvons par le execute, passer la valeur chiffrée d’un tag NBT à un score et inversement !
Execute store
Observons tout d’abord la syntaxe:
Si vous vous souvenez de ce que l’on a vu dans les premiers chapitres, une commande peut retourner deux valeurs: une valeur résultat, et une valeur de succès. La commande execute store permet donc de récupérer l’une des deux valeurs de la commande exécutée, puis de stocker le résultat dans un support donc ici:
- block
- entity
- storage
- score
Il existe un cinquième support que l’on ne verra pas ici, la bossbar. Le fonctionnement reste globalement le même, mais en lien avec la commande /bossbar.
Les trois premiers vont donc enregistrer la valeur dans une structure NBT, et le dernier, dans un score.
Comme vous pouvez le constater, l’argument “<path>” est suivi d’un type, celui-ci permet de spécifier le type de stockage de la valeur dans un nœud de la structure. Si le nœud est de type int, alors vous devez mettre l’argument « int », tout simplement.
Je vous propose d’essayer cet exemple:
/execute store result score @s Test run data get entity @s
Et comme vous pourrez le constater, votre nombre de point de vie arrondis se retrouve dans un scoreboard ;)
Bien entendu, en spécifiant un scale à la commande data get, vous pouvez obtenir un nombre plus précis dans le scoreboard !
Voici un autre exemple:
/execute store result score @s Test run time query daytime
Dans votre scoreboard, vous obtiendrez ainsi le nombre de ticks écoulés depuis le début de la journée !
Maintenant, si vous définissez votre score à 42, et que vous faites cette commande en pointant un coffre juste en dessous de vous:
/execute store result block ~ ~-1 ~ Items[{Slot:0b}].Count float 1 run scoreboard players get @s Test
Le nombre d’item dans le coffre passera à 42 !
Comme vous pouvez le voir, la commande execute store est vraiment utile, mais nous n’avons appliquer cette commande que sur des nœuds dont la valeur est un nombre. Une question que l’on pourrait se poser dans ce cas est, qu’est-ce que cela fait si l’on tente de mettre une chaîne de caractères, ou encore un tableau dans un scoreboard ?
Reprenons notre coffre du dessus, et essayons cela de suite !
/execute store result score @s Test run data get block 164 4 -207 Items[0].id
18 ? Mais à quoi cela peut-il correspondre ? Et bah c’est très simple, lorsque l’on applique cela sur un String, on obtiendra le nombre de caractères composant ce dernier ! Et il y a bien 18 caractères dans “minecraft:redstone” ;)
Et il en est de même pour un tableau, ou pour un compound, ainsi faire cela:
/execute store result score @s Test run data get block 164 4 -207 Items
et
/execute store result score @s Test run data get block 164 4 -207 Items[0]
Vous retournera “1” pour la première commande car il n’y a qu’un seul slot occupé dans le coffre, et “3” pour la seconde, car il n’y a que 3 nœuds fils du premier élément du tableau (Count, id et Slot).
Voici quelques autres cas d’utilisation vraiment utile:
/execute store success score @s Test run data get block 164 4 -207 Items[0].Count
Retournera 0 si le nœud n’existe pas (vu que l’on vient de voir que tout type de nœud renverra quelque chose), 1 sinon.
/execute store success score @s Test run data get block 164 4 -207 Items[0]
Retournera 0 si le tableau ne contient pas d’élément 0, 1 sinon.
/execute store result score @s Test if entity @e[type=slime]
Retournera le nombre de slime présent sur la map (et dans des chunks chargés). Cet exemple est intéressant car il exploite le fait que le execute if retourne une valeur, qui se trouve être ici le nombre d’entités trouvés par le sélecteur.
NBT comme moyen de stockage
Vous êtes maintenant capable de entièrement modifier une entité, voire d’utiliser un score pour faire varier une propriété de cette dernière mais je vous propose que l’on aille encore plus loin. En effet, ceci est bien pratique pour faire des entités customs, mais une autre grosse utilité de ces commandes, c’est de pouvoir se servir de l’entité pour stocker nos propres données dans nos propres tag NBT ! Fini le stockage sur scoreboard, fini le fait de ne pouvoir stocker que des nombres, je vous propose maintenant de faire vos propres structures !
Peut-être avez-vous déjà, par erreur ou non, essayé d’ajouter ou modifier un tag non valide sur une entité ? Si oui, vous avez sans doute pu constater l’absence de ce tag lors de l’affichage des NBT. C’est normal, Minecraft supprime tous les nœuds qui n’existent pas sur l’entité. Néanmoins, il reste tout de même un endroit que Minecraft nous laisse à disposition, le nœud « tag » des items.
Dans ce nœud, où se trouvent notamment le tag “display” (contenant “Name” et “lore”), il est possible d’ajouter des nœuds sans que Minecraft les supprime, et c’est donc ici que nous allons travailler.
Alors un item peut paraître assez contraignant, il faut gérer le fait qu’il dispawn au bout de 5 minutes, sans oublier le fait qu’il soit visible. Mais comme nous l’avons vu lors de ces quelques parties sur les NBT, les entités sont entièrement représenté en jeu par les NBT, c’est aussi le cas pour un item, ce qui signifie que l’item se trouvant dans un slot aura la même structure qu’un item posé au sol ! On peut donc travailler avec des armor stands ayant des items dans leurs slots ou encore des coffres.
Je vous propose de créer une entité qui nous servira de stockage:
/summon ~ ~ ~ armor_stand {Tags:[“Foo”],NoGravity:1b,ArmorItems:[{id:”minecraft:slime_ball”,Count:1b,tag:{}},{},{},{}]}
Elle a donc une slime ball sur le slot correspondant à ses pieds, ayant un tag “tag” vide.
Maintenant, essayons d’ajouter un tag dans ce noeud:
/data modify entity @e[tag=Foo,limit=1] ArmorItems[0].tag.MonTag set value 1
Puis affichons le contenu de “tag”:
/data get entity @e[tag=Foo,limit=1] ArmorItems[0].tag
Comme vous pouvez le voir, le tag est bien resté !
De cette façon, nous pouvons avoir nos propres données persistantes, et même stocker des tableaux, ou encore des chaînes de caractères, ce qui est impossible avec les scoreboards !
Nous concluons ici notre dernier chapitre concernant les NBT, et vous voilà donc incollable sur le sujet ;)
J’espère que cette partie vous aura permis de comprendre la puissance que ces quelques commandes peuvent avoir !
Superbe guide pour les NBT merci, hâte de voir la suite !