4 votes

Quelqu'un pourrait-il donner une explication détaillée de la modification du fichier /data de Minecraft 1.14 ?

Ok, j'ai cherché partout sur internet une explication de la modification des données depuis que j'ai entendu Sethbling en parler passivement dans une de ses vidéos. La seule chose que j'ai pu trouver à ce sujet est le wiki et le journal de mise à jour de la version 1.14. J'ai donc vérifié ces documents, et ils ne l'expliquent pas du tout. Je peux obtenir /data modify block 123 20 123 ... et je ne vais pas plus loin.

Le wiki Minecraft ne définit pas du tout clairement ce qu'est (la chose destinée à aller chercher les coords), ni ne précise ce que chaque opération fait à quoi. Les opérations comprennent (sans explication, et à l'exclusion de set (qu'il explique)) : append, insert, merge, et prepend. Ensuite, il y a from|value comme option suivante, qui n'est pas expliquée non plus. Ensuite, il n'y a que block/entity et coords/id. Je connais donc le format (en grande partie), mais je n'ai pas la moindre idée de ce que cela signifie. Et rien de ce que j'ai vu sur internet ne mentionne la commande, à l'exception du wiki Minecraft lui-même.

Veuillez expliquer si vous savez ce qu'est la modification des données. Merci de votre compréhension.

11voto

Fabian Röling Points 19325

Cette réponse ne se contente pas de décrire /data modify mais aussi les chemins NBT, les chemins NBT ramifiés et NBT in JSON, parce que ces fonctionnalités sont toutes liées et que pour comprendre pleinement l'une d'entre elles, il faut au moins connaître un peu les autres.


Le premier grand avantage de /data modify est que vous pouvez modifier le NBT sans l'écraser complètement. Par exemple, je l'ai utilisé dans cette réponse pour modifier seulement un numéro spécifique d'un échange d'un villageois (ou en fait tous les échanges, car la version 1.14 ajoute également la possibilité de faire des choses avec plusieurs chemins NBT à la fois) :

/data modify entity <selector> Offers.Recipes[].maxUses set value 1000000

Cette commande modifie seulement el maxUses de la profession, à la différence de /data merge ce qui vous oblige à rédiger l'ensemble de l'opération à l'identique.

Le deuxième grand avantage est que vous pouvez copier des composés NBT entiers d'un endroit à l'autre. Dans les cette réponse l'une des étapes consiste à copier les données de l'article d'un coffre à l'autre :

/data modify block 0 0 0 Items append from block 12 34 56 Items[{Slot:4b}]

Cette commande copie les données NBT de l'emplacement 4 d'un coffre aux coordonnées 12 34 56 vers l'emplacement 4 d'un coffre aux coordonnées 0 0 0, y compris le décompte, toutes les étiquettes d'articles, etc.

Le troisième grand avantage est que vous pouvez effectuer des manipulations de base sur les chaînes de caractères, par exemple vous pouvez copier des chaînes d'un endroit à l'autre dans NBT. Un exemple se trouve à la fin de cette réponse.


Voici une définition plus formelle :

/data modify block <pos>

Cela modifie le NBT d'un bloc aux coordonnées <pos> Par exemple 0 0 0 .

/data modify entity <target>

Ceci modifie le NBT d'une entité sélectionnée avec <target> Par exemple @e[type=item,sort=nearest,limit=1] . Ce sélecteur n'autorise qu'une seule entité pour des raisons que j'ignore. Il ne suffit pas que le sélecteur corresponde à une seule entité, vous devez utiliser explicitement @p , @r , @s o limit=1 . Vous pouvez toujours l'utiliser pour des entités multiples avec execute as <selector> run data modify entity @s .

/data modify (block <pos>|entity <target>) <path>

Le présent <path> est un chemin NBT comme Offers.Recipes[0].maxUses ce qui fait que la commande n'opère que sur ce chemin, sans affecter ce qui se trouve au-dessus, comme par exemple Offers.Recipes[1].rewardExp . La syntaxe n'est pas non plus bien expliquée dans le wiki, voici donc un résumé rapide. Passez à la ligne de séparation suivante si vous savez déjà tout sur les chemins NBT, même dans la version 1.14.


/data get block 0 0 0 sans chemin d'accès pour chatter toutes les données NBT de l'entité bloc d'un conteneur aux coordonnées 0 0 0, par exemple :

{x:0,y:0,z:0,id:"minecraft:chest",Items:[{Slot:0b,id:"minecraft:stone",Count:1b}]}

data get block 0 0 0 Items imprime uniquement le composé NBT Items s'il existe (je ne vais pas énumérer ici toutes les erreurs possibles) :

[{Slot:0b,id:"minecraft:stone",Count:1b}]

La valeur de retour (utilisée principalement dans /execute store result ) est la longueur du composé ou de la liste. Par exemple, dans le cas présent, elle serait de 1, car il n'y a qu'une seule pile d'objets dans le coffre. Cette commande renvoie 3 et imprime le premier élément de la liste d'objets à chatter (les listes étant indexées par 0, elles comptent "0, 1, 2, 3, ") : /data get block 0 0 0 Items[0]

{Slot:0b,id:"minecraft:stone",Count:1b}

Vous pouvez aller plus loin avec les périodes : /data get block 0 0 0 Items[0].Count :

1b

En théorie, vous pouvez également placer deux indices de liste à la suite, comme suit foo.bar[0][0].lalala pour obtenir le lalala dans le premier élément du premier élément de la balise bar dans la liste des foo mais, pour autant que je sache, aucune entité Vanilla ou entité de bloc n'utilise de listes directement dans les listes.

Et maintenant, les bits fantaisistes de 1.14 :

Vous pouvez maintenant utiliser NBT dans JSON, comme ceci :

/tellraw @s {"nbt":"Inventory","entity":"@s"}

Cela vous indique votre propre inventaire.

Vous pouvez également obtenir une liste JSON de tous les emplacements individuels :

/tellraw @s {"nbt":"Inventory[]","entity":"@s"}

Jusqu'à présent, c'est assez inutile, car c'est juste un formatage différent, mais il y a des exemples utiles (l'un d'eux est ma réponse de villageois) et vous pouvez également filtrer, comme ceci :

/tellraw @s {"nbt":"Inventory[{id:\"minecraft:stone\"}]","entity":"@s"}

Cette opération permet d'imprimer une liste de tous les emplacements qui contiennent des pierres.


Retour à /data modify :

/data modify (block <pos>|entity <target>) <path> set

Le cas le plus simple, similaire à /data merge sauf qu'il n'agit que sur le chemin spécifié.

/data modify (block <pos>|entity <target>) <path> merge

Très similaire à set sauf qu'il ne supprime pas les éléments que vous n'avez pas spécifiés. Exemple :

/data modify block <pos> Items[0] merge value {tag:{display:{Name:"{\"text\":\"Test\"}"}}}

Le premier élément du conteneur situé à ces coordonnées est renommé " Test "sans affecter son type, son nombre ou sa position dans le conteneur. set essaierait de remplacer entièrement le premier élément par un autre qui n'a qu'un tag ce qui ne fonctionne pas et la supprime. Je suis sûr qu'il y a de bonnes utilisations pour set également.

/data modify (block <pos>|entity <target>) <path> append

Il s'agit d'ajouter un élément à une liste existante. Par exemple, vous pouvez donner à un villageois un métier supplémentaire. Plus précisément, cet élément est ajouté à la fin de la liste, ce qui est important pour les métiers des villageois, la disposition des passagers, les motifs des bannières, les lignes de lore, les pages de livres et bien d'autres choses encore.

/data modify (block <pos>|entity <target>) <path> prepend

Idem append mais elle s'ajoute au début de la liste.

/data modify (block <pos>|entity <target>) <path> insert <index>

Cette fonction insère un élément supplémentaire dans une liste à l'index spécifié. Tous les éléments qui avaient cet indice ou un indice supérieur auparavant seront décalés pour avoir un indice supérieur de 1. Ainsi, par exemple insert 2 value 42 modifierait une liste comme " 0,1,2,3,4,5 " à " 0,1,42,2,3,4,5 "car vous avez ajouté 42 en position 2 (à nouveau indexée à 0) et a déplacé tout le reste vers la droite.

/data modify (block <pos>|entity <target>) <path> (set|merge|append|prepend|insert <index>) value <value>

Vous pouvez ici spécifier des NBT exacts, par exemple pour définir le maxUses du premier commerce d'un villageois à 1000, vous utiliserez cette commande :

/data modify entity @e[type=villager,sort=nearest,limit=1] Offers.Recipes[0].maxUses set value 1000

Ou pour écraser l'ensemble du premier commerce, procédez comme suit :

/data modify entity @e[type=villager,sort=nearest,limit=1] Offers.Recipes[0] set value {buy:{id:"stone",Count:1},sell:{id:"diamond_block",Count:64},maxUses:1000}

Et maintenant, le deuxième grand avantage, la copie de NBT :

/data modify (block <pos1>|entity <target>) <path> (set|merge|append|prepend|insert <index>) from (block <pos2>|entity <target>) <path>

Cette opération permet de copier l'élément NBT sélectionné à l'autre endroit. Exemple :

/data modify block <pos1> Items set from block <pos2> Items

Cela fait d'un conteneur une copie d'un autre. Autre exemple, cette commande copie le nom personnalisé du villageois le plus proche vers la vache la plus proche :

/data modify entity @e[type=cow,sort=nearest,limit=1] CustomName set from entity @e[type=villager,sort=nearest,limit=1] CustomName

Cette manipulation de base des chaînes de caractères était auparavant impossible, car on ne pouvait rien faire d'autre avec les chaînes de caractères que de les définir ou d'en vérifier les valeurs exactes. Désormais, vous pouvez également comparer deux chaînes de caractères, en copiant d'abord l'une d'entre elles quelque part, puis en essayant de copier l'autre sur la même cible. Si la chaîne success de la seconde commande est 1, alors la seconde commande a écrit quelque chose de différent à la cible que la première, donc les deux chaînes ne sont pas les mêmes.


Merci aux développeurs Minecraft Slicedlime sur YouTube et Boq sur Discord qui ont clarifié la différence entre /data modify … set y /data modify … merge ! L'utilisateur du wiki Minecraft Liachmodded a créé une première ébauche d'une nouvelle mise en page pour le wiki. /data basée sur cette réponse, afin que vous puissiez la voir dans une vue arborescente : https://Minecraft.gamepedia.com/User:Liachmodded/TreeCommandWIP

P.S. : Saviez-vous que les indices de listes négatives fonctionnent désormais ? /data get entity @s Inventory[-1] imprime l'objet du dernier emplacement rempli de votre inventaire dans le chat et /data modify entity @e[type=villager,sort=nearest,limit=1] Offers.Recipes insert -3 value {buy:{id:"stone",Count:1},sell:{id:"diamond_block",Count:64},maxUses:1000} ajoute un métier de villageois supplémentaire avant les deux derniers métiers existants.

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