La création d'un tableau de taille dynamique dans NBT est assez simple : il suffit d'utiliser une fonction récursive pour boucler sur un score (qui détermine la longueur) et d'utiliser /data modify [...] append
à chaque fois. Voici un exemple :
Configuration :
/scoreboard objectives add array dummy
/scoreboard players set $value array 1
/scoreboard players set $length array 10
/scoreboard players set $const2 array 2
/data merge storage fabian:array {array:[]}
J'utilise une multiplication par 2 à chaque itération pour montrer que vous pouvez effectuer des calculs arbitraires avec les valeurs.
Fonction "fabian:fill_array
" :
execute store result storage fabian:array value int 1 run scoreboard players get $value array
data modify storage fabian:array array append from storage fabian:array value
scoreboard players operation $value array *= $const2 array
scoreboard players remove $length array 1
execute if score $length array matches 0.. run function fabian:fill_array
Explication :
La première commande copie la valeur du tableau de bord du joueur factice "$value
" dans l'étiquette NBT "value
" dans le stockage.
La deuxième commande appose l'étiquette actuelle "value
" sur le tableau. Il n'y a pas de moyen d'ajouter directement une valeur de tableau de bord à un tableau NBT.
Le reste de la fonction effectue simplement un calcul arbitraire sur "$value
", décrémente "$length
" et boucle jusqu'au début tant que "$length
" n'a pas encore atteint 0.
Notez que cette fonction effectuera tout de même son calcul une fois et l'ajoutera au tableau, même si "$length
" est déjà à 0 ou moins. Vous devriez en tenir compte dans le système que vous utilisez.
Passons maintenant à la partie plus compliquée : la lecture à partir d'un index arbitraire. Il existe deux principales façons de le faire.
La méthode fastidieuse : Avoir une grande fonction avec chaque possibilité qui pourrait se produire dans votre configuration :
execute if score $index array matches 0 run data get storage fabian:array array[0]
execute if score $index array matches 1 run data get storage fabian:array array[1]
execute if score $index array matches 2 run data get storage fabian:array array[2]
execute if score $index array matches 3 run data get storage fabian:array array[3]
…
Bien sûr, cela serait inapplicable pour des tableaux très longs.
La méthode de copie + suppression : Quelque chose de similaire a été suggéré ici (archive), mais ma méthode ne nécessite pas d'écrire l'index dans le tableau NBT, donc vous pouvez l'utiliser sur des données déjà existantes (créées par exemple par le jeu ou par un autre datapack).
Tout d'abord, copiez le tableau entier quelque part ailleurs :
/data modify storage fabian:array copie set from storage fabian:array array
Ensuite, retirez la première entrée du tableau autant de fois que vous le souhaitez (indiqué par exemple par un tableau de bord) :
/data remove storage fabian:array copie[0]
Une fois votre boucle terminée, lisez simplement la valeur de la première entrée qui reste :
/data get storage fabian:array copie[0]
Vous pouvez aussi faire ceci à l'envers, par exemple si vous voulez lire la nième dernière entrée dans un tableau, exécutez /data remove […] copie[-1]
n-1
fois et ensuite /data get […] copie[-1]
.
Cela peut également être utilisé pour la recherche. Augmentez un tableau de bord d'index chaque fois que vous supprimez la première entrée et comparez la valeur à un tableau de bord de cette manière :
/execute store result storage fabian:array temp int 1 run scoreboard players get […]
/execute store success score $changed array run data modify storage fabian:array copie[0] set from storage fabian:array temp
Le joueur fictif "$changed
" aura maintenant un 1 dans le tableau de bord array
si la valeur actuelle du tableau est différente de celle que vous comparez et 0 si elle est la même (donc vous avez trouvé la valeur que vous recherchiez).
Le tableau de bord augmenté indique ensuite l'index. Alternativement, vous pouvez obtenir la longueur du tableau restant comme ceci :
/execute store result score $length array if data storage fabian:array array[]
Et ensuite vous pouvez soustraire cela de la longueur d'origine.
0 votes
Donc vous voulez définir la longueur d'un tableau en fonction d'une valeur du tableau de bord ? Mais avec quoi rempliriez-vous ce tableau ? Il est probablement plus facile que la longueur soit automatiquement définie lors de la définition des valeurs.
0 votes
Non seulement avoir la longueur définie par un tableau des scores, mais aussi lire à partir d'une position variable dans le tableau, définie dans un tableau des scores
0 votes
Lorsque j'ai lu cette question pour la première fois, j'ai pensé "pourquoi auriez-vous même besoin de cela?", mais maintenant j'ai référencé ma réponse à celle-ci dans au moins trois endroits différents, dans des contextes complètement différents.