Pour résoudre ce problème, j'ai copié la liste des spawns dans un nouvel emplacement. Puis j'ai itéré à travers eux en copiant l'élément à l'emplacement 0 de la liste à un endroit temporaire nommé Current
puis le supprimer de la liste afin que l'itération suivante puisse obtenir un nouvel élément.
# list_find.mcfunction --
# Set current to null to check if list is empty in the next step
data modify storage tools:iteration Current set value {}
# Set current to first item in list and check if it was successfull. if not loop wil exit if it hits iteration_continue.
execute store success storage tools:iteration IterationSuccess int 1 run data modify storage tools:iteration Current set from storage tools:iteration List[0]
# Remove currently processed item from list.
data remove storage tools:iteration List[0]
# Lists should always come as [Indexer, Item] pair lists
data modify storage tools:compare A set from storage tools:iteration Current.Indexer
function tools:compare
# If list item is what we're searching for. run exit loop procedures.
execute if data storage tools:compare Success run function tools:iteration_exit
#if not continue iteration (until list is empty)
execute unless data storage tools:compare Success run function tools:iteration_continue
#iteration_exit.mcfunction --
data modify storage tools:iteration Result set from storage tools:iteration Current.Item
#tellraw @a [{"text":"iteration result: "},{"storage":"tools:iteration","nbt":"Result"}]
#iteration_continue.mcfunction --
#if list isn't empty run iterate again
execute if data storage tools:iteration IterationSuccess run function tools:list_find
#tellraw @a [{"text":"iter success: "},{"storage":"tools:iteration","nbt":"IterationSuccess"}]
Maintenant, je compare simplement l'indexeur Current.Indexer et l'UUID du joueur en écrivant sur current avec /data modify
. Cependant, comme nous aurons besoin des valeurs actuelles plus tard, nous devons enregistrer Current.Indexer
dans un stockage temporaire.
S'ils sont différents, /data modify
retourne 1. Si ce sont les mêmes, /data modify
renvoie 0. Puis, inversez le résultat avec un tableau d'affichage pour une facilité d'utilisation ultérieure.
#compare.mcfunction --
#used by a vscode plugin for auto completion
#define storage tools:compare
# tellraw @a [{"text":"Compared: "},{"storage":"tools:compare","nbt":"A"},{"text":" and "},{"storage":"tools:compare","nbt":"B"}]
# If an overwrite happens, a 1 will be stored in Global(fake player)'s CTemp score. If values are the same, a 0 will be stored.
execute store success score CompFail Tools run data modify storage tools:compare A set from storage tools:compare B
# Reverse and set to storage tools:compare success
execute if score CompFail Tools matches 0 run data modify storage tools:compare Success set value 1
execute if score CompFail Tools matches 1 run data modify storage tools:compare Success set value 0
#tellraw @a [{"text":"A == B: "},{"storage":"tools:compare","nbt":"Success"}]
Si la comparaison retourne vrai, nous pouvons sortir de la boucle et utiliser la fonction Current.Indexer
pour téléporter un stand d'armure étiqueté à l'emplacement. aka nous données modifier le stand d'armure Pos à Current.Item. et puis tp joueur -> stand d'armure étiqueté
#spawn.mcfunction --
#prepare to find from spawns and get spawning player's coordinate.
data modify storage tools:compare B set from storage player:spawning ID
data modify storage tools:iteration List set from storage player:spawns List
function tools:list_find
data modify entity @e[tag=TPTarget,limit=1,sort=nearest] Pos set from storage tools:iteration Result