J'essaie de faire une imprimante avec des moutons. J'ai un double coffre pour l'entrée de l'imprimante et les moutons correspondent aux emplacements dans le coffre. Il y a 54 moutons correspondant aux 54 emplacements. Quelle commande puis-je exécuter pour que la couleur de la laine dans un emplacement spécifique d'un coffre soit de la même couleur que le mouton correspondant ? Et comment puis-je la copier 54 fois afin de pouvoir le faire pour chaque emplacement/mouton ?
Réponse
Trop de publicités?Le problème qui se pose est le suivant : Comment puis-je boucler sur les éléments d'un tableau NBT ? Heureusement, j'ai déjà une réponse à cette question : Tableau NBT dimensionné dynamiquement
La "méthode fastidieuse" nécessiterait dans votre cas 864 (54×16) commandes, comme ceci :
/execute if entity @e[type=sheep,limit=1,nbt={Color:0b},scores={slot=0}] run data modify block ~ ~ ~ Items[{Slot:0b}].id set value "white_wool"
/execute if entity @e[type=sheep,limit=1,nbt={Color:0b},scores={slot=0}] run data modify block ~ ~ ~ Items[{Slot:0b}].id set value "orange_wool"
…
/execute if entity @e[type=sheep,limit=1,nbt={Color:0b},scores={slot=1}] run data modify block ~ ~ ~ Items[{Slot:1b}].id set value "white_wool"
…
C'est très ennuyeux. C'est probablement un peu mieux pour les performances que ce que je suis sur le point de suggérer, mais ce n'est pas bien généralisable pour d'autres cas et ce n'est pas aussi intelligent. ;)
Je suppose ici que tous les emplacements sont remplis, donc que l'index et le numéro de l'emplacement sont identiques. Si ce n'est pas le cas, vous devrez utiliser quelque chose comme la méthode de "recherche" de mon post lié. Je vais également supposer que tous les moutons ont leur numéro d'emplacement souhaité enregistré dans un tableau de bord appelé " slot
". Vous devrez les cibler correctement d'une manière ou d'une autre, un tableau d'affichage est une bonne idée pour cela.
Tout d'abord, copiez l'ensemble du coffre Items
quelque part ailleurs :
/data modify storage fabian:sheep items set from block ~ ~-1 ~ Items
Et initialiser un tableau d'affichage à 0 :
/scoreboard objectives add slot dummy
/scoreboard players set $current slot 0
Maintenant vous avez besoin d'une boucle, je suggérerais une fonction avec des appels récursifs pour cela. Je vais appeler la mienne fabian:copy_sheep
. Voici la fonction complète :
data modify storage fabian:sheep curr_item set from storage fabian:sheep items[0].id
execute as @e[type=sheep] if score @s slot = $current slot if data storage fabian:sheep {curr_item:"minecraft:white_wool"} run data merge entity @s {Color:0}
execute as @e[type=sheep] if score @s slot = $current slot if data storage fabian:sheep {curr_item:"minecraft:orange_wool"} run data merge entity @s {Color:1}
execute as @e[type=sheep] if score @s slot = $current slot if data storage fabian:sheep {curr_item:"minecraft:magenta_wool"} run data merge entity @s {Color:2}
execute as @e[type=sheep] if score @s slot = $current slot if data storage fabian:sheep {curr_item:"minecraft:light_blue_wool"} run data merge entity @s {Color:3}
execute as @e[type=sheep] if score @s slot = $current slot if data storage fabian:sheep {curr_item:"minecraft:yellow_wool"} run data merge entity @s {Color:4}
execute as @e[type=sheep] if score @s slot = $current slot if data storage fabian:sheep {curr_item:"minecraft:lime_wool"} run data merge entity @s {Color:5}
execute as @e[type=sheep] if score @s slot = $current slot if data storage fabian:sheep {curr_item:"minecraft:pink_wool"} run data merge entity @s {Color:6}
execute as @e[type=sheep] if score @s slot = $current slot if data storage fabian:sheep {curr_item:"minecraft:gray_wool"} run data merge entity @s {Color:7}
execute as @e[type=sheep] if score @s slot = $current slot if data storage fabian:sheep {curr_item:"minecraft:light_gray_wool"} run data merge entity @s {Color:8}
execute as @e[type=sheep] if score @s slot = $current slot if data storage fabian:sheep {curr_item:"minecraft:cyan_wool"} run data merge entity @s {Color:9}
execute as @e[type=sheep] if score @s slot = $current slot if data storage fabian:sheep {curr_item:"minecraft:purple_wool"} run data merge entity @s {Color:10}
execute as @e[type=sheep] if score @s slot = $current slot if data storage fabian:sheep {curr_item:"minecraft:blue_wool"} run data merge entity @s {Color:11}
execute as @e[type=sheep] if score @s slot = $current slot if data storage fabian:sheep {curr_item:"minecraft:brown_wool"} run data merge entity @s {Color:12}
execute as @e[type=sheep] if score @s slot = $current slot if data storage fabian:sheep {curr_item:"minecraft:green_wool"} run data merge entity @s {Color:13}
execute as @e[type=sheep] if score @s slot = $current slot if data storage fabian:sheep {curr_item:"minecraft:red_wool"} run data merge entity @s {Color:14}
execute as @e[type=sheep] if score @s slot = $current slot if data storage fabian:sheep {curr_item:"minecraft:black_wool"} run data merge entity @s {Color:15}
scoreboard players add $current slot 1
data remove storage fabian:sheep items[0]
execute if data storage fabian:sheep items[0] run function fabian:copy_sheep
Explication :
En raison d'un surveillance dans la syntaxe du chemin NBT items[0]{id:"minecraft:white_wool"}
ne fonctionne pas. Vous devez donc d'abord copier cette balise ailleurs, dans ce cas-ci fabian:sheep curr_item
.
Ensuite, vous vérifiez que chaque mouton a la même valeur dans le tableau d'affichage ". slot
" comme le faux joueur " $current
". Vous ne pouvez pas utiliser @e[scores={…}]
ici, parce que vous avez besoin d'un numéro dynamique. Lorsque le mouton correspond, il vérifie si l'ID de l'élément actuel est "white_wool"
et si oui, il définit son Color
pour 0
(qui est blanc). Ensuite, cela se répète pour "orange_wool"
y Color:1
et ainsi de suite. Cela signifie concrètement : Colorez les moutons en fonction de l'article de laine actuel.
Le reste de la fonction augmente le compteur de slot actuel, supprime la première entrée de la liste d'éléments copiés et continue la boucle s'il reste une entrée. La raison pour laquelle cette fonction est nécessaire est que vous ne pouvez pas accéder dynamiquement à un index de tableau basé sur une valeur du tableau d'affichage, vous devez donc déplacer l'élément vers l'avant autant de fois que vous le souhaitez et ensuite lire à partir de l'index fixe 0.
Notez que vous devez refaire la configuration avant de répéter ce processus (sauf pour la création du tableau d'affichage).
Je l'ai essayé ici avec un seul coffre, mais cela fonctionne de la même manière avec n'importe quel inventaire :
2 votes
Cela devrait être assez simple avec la méthode de la force brute, mais cela nécessite 864 (54*16) commandes. J'ai quelques vagues idées pour réduire ce nombre, mais elles sont compliquées et je ne peux pas jouer à Minecraft pour l'instant (je le ferai dans environ 3 semaines). L'une de ces idées consiste à accès aux tableaux de variables . Vous pouvez peut-être déjà en faire quelque chose. La conversion laine->mouton pourrait ne pas être possible avec moins de 16 commandes, parce que les moutons stockent toujours leur couleur sous forme de nombre, alors que la laine la stocke sous forme de mot (état de bloc).