2 votes

Minecraft : extraire des données du stockage avec un sélecteur

J'ai essayé de mettre en place un mécanisme de réglage du spawn pour chaque joueur et je suis actuellement bloqué sur le stockage d'une position et de l'UUID du joueur de manière à ce qu'il soit facilement interrogeable et donc téléportable.

C'est ce que j'ai essayé jusqu'à présent :

/data modify entity 6f88f8eb-cfa3-44bf-a621-52b3e7d753e7 Pos set from storage game:player Spawn{target:'[{"selector":"@p"}]'}.location

Ce bloc de sélection est ce qui ne fonctionne pas. J'ai besoin d'un moyen de faire fonctionner un sélecteur dans la partie recherche de nbt. Si c'est impossible, il faut trouver quelque chose qui gère la même fonctionnalité. L'utilisation d'un stockage de données temporaires serait également acceptable si elle peut être intégrée dans la requête basée sur la cible :)

Storage game:player has the following contents: 
{
    Spawn:[
        {
            location: [-39.89557466099629d, 66.0d, 42.25176377238329d], 
            target: [I; -1155610777, -758824872, -1437747869, 728530035]
        }
    ]
}

1voto

jklw10 Points 311

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

AlleGamers.com

AlleGamers est une communauté de gamers qui cherche à élargir la connaissance des jeux vidéo.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X