3 votes

Est-il possible d'indexer du texte JSON brut, ou d'indexer plusieurs données de chemin NBT dans une ligne ? (Scanner des chevaux dans Minecraft)

Les deux questions (autour du même principe) :

Est-il possible d'indexer la commande JSON brute nouvellement introduite dans la version 1.14 de NBT et Entity (par ex. /tellraw @s {"nbt":"Attributes[0].Base","entity":"@e[type=horse,sort=nearest]"} ) de sorte que lorsqu'il renvoie les résultats pour plusieurs entités, vous pouvez formater les résultats ?

Si ce qui précède n'est pas possible, est-il au moins possible de combler le fossé entre le retour de toutes les données d'une entité ( Attributes[].Base ) et seulement une partie des données de l'entité ( Attributes[0].Base ) ? c'est-à-dire Attributes[0,2,7].Base - cela ne fonctionne pas, mais existe-t-il quelque chose de similaire ?


Détails :

Comme beaucoup de vieux mods d'attributs de chevaux n'ont pas été mis à jour dans la version 1.14, j'ai décidé d'essayer de créer une version en jeu par le biais de commandes. Heureusement, la 1.14 a ajouté une fonctionnalité vraiment cool qui vous permet de scanner efficacement les données NBT d'un tas d'entités locales avec la commande /tellraw et du texte JSON brut (merci à Fabian Röling pour avoir fourni les détails aquí y aquí ).

Un exemple de la façon dont vous pouvez utiliser cette commande pour analyser des chevaux est l'utilisation de cette commande :

/tellraw @s {"nbt":"Attributes[0].Base","entity":"@e[type=horse,sort=nearest]"}

Ce qui renvoie une liste des statistiques de santé de tous les chevaux individuels, du plus proche au plus éloigné :

19.0d, 23.0d, 20.0d, 22.0d, 20.0d, 20.0d, 19.0d, 22.0d, 22.0d, 21.0d, 23.0d, 27.0d, 21.0d, 17.0d, 17.0d, 19.0d

C'est très bien, mais il y a deux autres statistiques qui nous intéressent pour les chevaux, la vitesse et la hauteur de saut. Nous pouvons ajouter la vitesse à cette ligne ainsi qu'un texte de saveur avec la commande :

/tellraw @s [{"nbt":"Attributes[0].Base","entity":"@e[type=horse,sort=nearest]"}, " Health ",{"nbt":"Attributes[2].Base 100","entity":"@e[type=horse,sort=nearest]"}, " Speed "]

Mais les résultats ne sont pas brillants :

19.0d, 23.0d, 20.0d, 22.0d, 20.0d, 20.0d, 19.0d, 22.0d, 22.0d, 21.0d, 23.0d, 27.0d, 21.0d, 17.0d, 17.0d, 19.0d Health 0.27321843060292755d, 0.21480220332502717d, 0.17749702015266722d, 0.28170043791890875d, 0.24102104888670942d, 0.20762532646388024d, 0.1808260524268614d, 0.2572008833733531d, 0.19745627778622357d, 0.19073958560813306d, 0.21073516590775235d, 0.21222213167329812d, 0.16440016044525307d, 0.2815179975462115d, 0.19912091795196668d, 0.1991595317469814d Speed 

Il énumère la santé de tous les chevaux, suivie de la vitesse de tous les chevaux. C'est logique, mais l'idéal serait que le résultat nous donne la santé et la vitesse du premier cheval, puis la santé et la vitesse du deuxième, et ainsi de suite, pour faciliter la comparaison des chevaux.

Il est à noter que les deux listes renvoient les chevaux dans le même ordre ; le cheval avec 19,0 points de santé est aussi celui avec 0,273218 de vitesse. Donc, si vous étiez capable d'indexer et de formater les tableaux (ou les listes, ou vraiment les chaînes), vous pourriez facilement rassembler les données correctes. Cependant, il semble que les commandes NBT et Entity renvoient leurs données de sortie sous forme de chaîne, et je n'ai pas réussi à trouver comment les formater (et encore moins à transformer ces doubles en ints).

Existe-t-il un moyen d'indexer et de formater la sortie des commandes NBT et Entity comme un tableau ?


La deuxième partie de cette question est un dérivé de la première. Idéalement, il serait préférable de pouvoir formater la sortie, car nous pourrions alors la rendre jolie et exactement comme nous le souhaitons. Cependant, il existe une autre façon de récupérer les données NBT qui conserve les données individuelles des chevaux. Vous pouvez simplement utiliser la fonction Attributes[0].Base mais sans mettre un numéro dans l'index : Attributes[].Base . Le problème est que cela renvoie toutes les données de la base NBT concernant un cheval, ce qui entraîne un désordre. Nous ne sommes vraiment intéressés que par la santé (0), la vitesse (2) et la hauteur de saut (7) du cheval. J'ai essayé de faire Attributes[0,2,7].Base mais cela n'a évidemment pas fonctionné, mais cela m'a fait envisager d'autres méthodes. J'ai vu qu'il y avait un moyen de mettre des composés NBT spécifiques dans l'index, mais je n'ai pas trouvé de bonne documentation ou d'exemples à ce sujet.

Existe-t-il un moyen de référencer plusieurs attributs dans un seul index d'attributs, par exemple comme suit Attributes[0,2,7].Base mais ça marche ?


Edit : Goal

J'ai ajouté ceci car je me suis dit que je devais inclure ce qu'est mon objectif idéal. Voici comment je voudrais que le texte soit dans le meilleur des cas :

19 Health 273 Speed 62 Jump
23 Health 214 Speed 73 Jump
20 Health 177 Speed 53 Jump
....

C'est à cela que j'essaie de faire ressembler le texte, chaque ligne étant un cheval différent. C'est le sujet de la première question et ce que je veux dire quand je parle de formatage. La deuxième question part du principe que ce qui précède n'est pas possible, et tente de trouver un compromis.

Autre remarque, je fais cela avec des fichiers de fonctions, et non des blocs de commandes, bien que j'imagine que cela ne devrait pas avoir d'importance.

2voto

Fabian Röling Points 19325

Je suppose que toute cette question se résume à "comment imprimer les étiquettes NBT A et B de plusieurs entités comme {A1,B1},{A2,B2},{A3,B3} au lieu de A1,A2,A3,B1,B2,B3 ". La meilleure façon que je connaisse de faire cela est de copier les données ailleurs d'une manière qui les regroupe déjà. Auparavant, vous aviez besoin d'un élément fictif, parce qu'ils autorisent n'importe quelle donnée dans leurs fichiers de type tag tag. Mais depuis la version 1.15, il existe une fonction appelée "stockage" qui est conçue spécifiquement pour stocker les NBT personnalisés. Vous pouvez donc y créer un tableau de composés.

Contrairement à l'ancienne réponse avec des items factices, cette méthode ne nécessite aucune préparation.

Vous devez itérer sur les chevaux et créer de nouvelles entrées dans le tableau, puis les remplir (c'est également ici que vous pouvez appliquer un tri, par exemple par distance). Pour chaque cheval, faites ceci (jusqu'à ce que vous n'ayez plus de chevaux étiquetés, vous pouvez par exemple le faire dans une fonction récursive) :

/execute if entity @e[type=horse,tag=!copied] run data modify storage horses HorseAttributes append value {Health:0d,Speed:0d,Jump:0d}
/execute as @e[type=horse,tag=!copied,sort=nearest,limit=1] store result storage horses HorseAttributes[-1].Health double 0.0000005 run data get entity @s Attributes[{Name:"generic.maxHealth"}].Base 2000000
/execute as @e[type=horse,tag=!copied,sort=nearest,limit=1] store result storage horses HorseAttributes[-1].Speed double 0.0000005 run data get entity @s Attributes[{Name:"generic.movementSpeed"}].Base 2000000
/execute as @e[type=horse,tag=!copied,sort=nearest,limit=1] store result storage horses HorseAttributes[-1].Jump double 0.000000001 run data get entity @s Attributes[{Name:"horse.jumpStrength"}].Base 1000000000
/tag @e[type=horse,tag=!copied,sort=nearest,limit=1] add copied

La raison pour laquelle il faut d'abord augmenter puis diminuer l'échelle des valeurs lors de la copie est que, pour une raison quelconque, elles ne sont traitées que comme des entiers. Mais si vous les multipliez d'abord par une valeur élevée et les divisez ensuite par le même nombre, vous obtenez plus de précision ( jumpStrength par exemple, s'arrondit à 0 presque à chaque fois). Les nombres sont choisis pour donner le plus de précision possible sans jamais déborder (les différents attributs ont des valeurs maximales différentes, c'est pourquoi ils diffèrent).
L'index du tableau -1 cible le dernier composé de la liste, celui qui vient d'être créé.

Maintenant, enfin, la sortie :

/tellraw @s {"storage":"horses","nbt":"HorseAttributes"}

La sortie peut par exemple ressembler à ceci :

[{Speed:0.2102355d,Health:21.0d,Jump:0.682921423d},{Speed:0.28055749999999996d,Health:24.0d,Jump:0.819681399d},{Speed:0.2159845d,Health:20.0d,Jump:0.653335773d},{Speed:0.2855935d,Health:25.0d,Jump:0.681110673d},{Speed:0.1827385d,Health:17.0d,Jump:0.750580213d}]

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