Minecraft: pull data from storage with a selector
Solution 1:
The way I solved this is, I copied the list of spawns to a new location. Then I iterated through them by copying the item in location 0 of the list to a temporary spot named Current
, then removing it from the list so that the next iteration can get a new item.
# 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"}]
Now, I just compare the Current.Indexer and the player UUID by writing over current with /data modify
. However, because we need the current values later, we must store Current.Indexer
in a temporary storage.
If they're different, /data modify
returns 1. If they're the same, /data modify
returns 0. Then, reverse the result with a scoreboard for later ease of use.
#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"}]
If the comparison returns true, we can exit the loop and use the Current.Indexer
to teleport a tagged armor stand to the location. aka we data modify the armor stand Pos to Current.Item. and then tp player -> tagged armor stand
#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