9 votes

Comment puis-je détecter si un joueur a un objet spécifique avec une valeur de données spécifique dans son inventaire ?

Supposons que je veuille suivre un groupe de joueurs pour voir lequel d'entre eux (s'il y en a) a un type de bloc spécifique dans son inventaire qui a une valeur de données spécifique ; par exemple Red Wool ( minecraft:wool avec une valeur de données de 14). Je sais déjà comment détecter si un joueur a tous de laine dans leur inventaire :
/testfor @a {Inventory:[{id:"minecraft:wool"}]} .
Toutefois, cela ne permet pas de faire la distinction entre les différentes couleurs. Il trouvera n'importe qui avec de la laine de n'importe quelle couleur, alors que je ne veux trouver que des joueurs avec de la laine rouge.

J'ai essayé de modifier la balise data pour qu'elle contienne également une valeur de données, comme par exemple
/testfor @a {Inventory:[{id:"minecraft:wool",data:14}]}
mais il en résulte des étiquettes NBT non appariées et le message d'erreur suivant <Player> did not match the required data structure . Il est évident que c'est parce que data (ou Data , damage , dataID ) n'est pas le nom de la balise NBT, ou que la structure est erronée.

Je sais que je peux le faire en utilisant la fonction /clear mais c'est un peu lourd lorsque l'on travaille avec une fréquence de 20 Hz. /fill l'horloge. Comment puis-je filtrer des valeurs de données spécifiques lorsque j'utilise la fonction /testfor o /scoreboard players des commandes ?

9voto

Monroecheeseman Points 825

Cette réponse a été rédigée avant la sortie de la version 1.13 et de l'application "L'aplatissement qui l'accompagne. Une réponse actualisée peut être trouvée aquí .


Vous êtes en fait assez proche, et certainement sur la bonne voie. Au lieu de {Inventory:[{id:<block ID>,data:<data value>}]} , utiliser {Inventory:[{id:<block ID>,Damage:<data value>s}]} . Les s après la valeur des données est important car il est stocké comme un court et non comme un int. (Soit dit en passant, s'il était stocké sous forme d'octet, vous ajouteriez un b à la place.)

3voto

Monroecheeseman Points 825

La solution la plus simple consiste à mettre à jour la version 1.13, qui a implémenté la fonction "L'aplatissement . Pour chaque bloc ayant plusieurs variations basées sur la valeur des données, un nouveau bloc a été introduit pour chaque variation avec son propre identifiant (nom) de bloc. Les blocs de couleur sont particulièrement concernés, mais un certain nombre d'autres types de blocs (les blocs de bois, par exemple) le sont également. Il ne vous reste plus qu'à

/tag @a[nbt={Inventory:[{id:red_wool}]}] add CarryingRed

En outre, la version 1.13 a introduit l'idée de étiquettes pour les groupes de blocs ou d'éléments (ou de fonctions) liés entre eux. Si vous souhaitez étiqueter quelqu'un (au sens de l'ancien terme scoreboard tag comme ci-dessus), il suffit de sélectionner la balise wool dans le sélecteur :

/tag @a[nbt={Inventory:[{id:#wool}]}] add CarryingWool

Notez que les #wool qui correspondra à n'importe quel article répertorié dans l'étiquette "laine", qui comprend par défaut toutes les couleurs de laine.

1voto

Radu Cugut Points 131

Vous pouvez détecter un poste sans l'effacer à l'aide de /clear mando.
Syntaxe pour /clear La commande est la suivante :

/clear [player] [item] [data] [maxCount] [dataTag]

Si vous définissez maxCount a 0 La commande n'aboutira que si le joueur possède l'objet spécifié.

0voto

Xefer Points 21
/scoreboard players set @a <objective> <score> {Inventory:[{id:block ID,Damage:Data Value s}]}

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