Modification d'item dans l'inventaire


Categorie : Datapacks

Poster le : 2020-04-07 15:50:29 par

Hardel

Dans ce guide nous verrons comment interagir avec l'inventaire, pour pouvoir modifier les NBT des items.
Nous verrons plusieurs méthodes, comme la méthode shulker, ou encore la méthode advancements.
Une commande dédiée à la modification des items dans l'inventaire ne devrait plus tarder a sortir, (/modifyitems).


Method phi - Shulker:

Cette méthode consiste a mettre l'item à modifier dans une shulker, de modifier la shulker puis de remettre l'item dans l'inventaire avec une LootTable.

Pour cela, une petite préparation est nécessaire, créer d'abord un datapack, suivez ce guide pour apprendre les bases du dapacking : Les bases du datapacking.

Rendez-vous dans le dossier "minecraft" pour modifier les données du jeu, puis rendez-vous dans le dossier "loot_tables" puis à l’intérieur crée le dossier "blocks" , ensuite pour finaliser cela, créer un fichier que vous nommeraient : "shulker_box.json", ce fichier va modifier, l'item obtenue quand ce bloc sera détruit.

Et en voici le contenue, copier le contenue :

{
    "type": "minecraft:block",
    "pools": [
        {
            "rolls": 1,
            "entries": [
                {
                    "type": "minecraft:alternatives",
                    "children": [
                        {
                            "type": "minecraft:dynamic",
                            "name": "minecraft:contents",
                            "conditions": [
                                {
                                    "condition": "minecraft:match_tool",
                                    "predicate": {
                                        "item": "minecraft:air",
                                        "nbt": "{drop_contents:1b}"
                                    }
                                }
                            ]
                        },
                        {
                            "type": "minecraft:item",
                            "name": "minecraft:shulker_box",
                            "functions": [
                                {
                                    "function": "minecraft:copy_name",
                                    "source": "block_entity"
                                },
                                {
                                    "function": "minecraft:copy_nbt",
                                    "source": "block_entity",
                                    "ops": [
                                        {
                                            "source": "Lock",
                                            "target": "BlockEntityTag.Lock",
                                            "op": "replace"
                                        },
                                        {
                                            "source": "LootTable",
                                            "target": "BlockEntityTag.LootTable",
                                            "op": "replace"
                                        },
                                        {
                                            "source": "LootTableSeed",
                                            "target": "BlockEntityTag.LootTableSeed",
                                            "op": "replace"
                                        }
                                    ]
                                },
                                {
                                    "function": "minecraft:set_contents",
                                    "entries": [
                                        {
                                            "type": "minecraft:dynamic",
                                            "name": "minecraft:contents"
                                        }
                                    ]
                                }
                            ]
                        }
                    ]
                }
            ]
        }
    ]
}

Ce fichier est assez complexe a résumer, mais retenait deux choses :

  • La shulker va garder son ancien comportement, ce qui ne va pas changer la survie.
  • Le casser avec un "minecraft:air{drop_contents:1b}", permet de donner les items se trouvant à l’intérieur de la shulker.

Notre préparation est maintenant finie, passons aux commandes :
Il est conseillé de faire cela dans une functions, toutes les commandes se feront dans le même tick.

  • La première commande va être de placer une shulker.
  • La deuxième commande va être, de transférer les items de l'inventaire, et les mettres dans la shulker.
  • Ensuite libre à vous de modifier la shulker sans limite.
  • Après, on effectuera une commande, qui va transférer les items se trouvant dans la shulker pour les mettre dans l'inventaire du joueur.
  • La dernière commande va être de supprimer la shulker.

Avec les commandes cela va donner se genre de chose :

# On pose la shulker
setblock ~ 0 ~ minecraft:shulker_box
# On trasnfére les items dans la shulker.
data modify block ~ 0 ~ Items[] set from entity @s SelectedItem
# On modifie l'item se trouvant dans la shulker.
data modify block ~ 0 ~ Items[].tag.CustomEnchantments.AccuracyShot set value 1
# On va remettre les items dans l'inventaire.
loot replace entity @s weapon 1 mine ~ 0 ~ minecraft:air{drop_contents:1b}
# On remplace le bloc qu'on a casser.
clone ~1 0 ~ ~1 0 ~ ~ 0 ~ replace

Cet enchaînement de commande, permet simplement de rajouter un NBT à l'item que j'avais en main.
Pour replacer l'item, dans l'inventaire une utilisera la commande /loot, en minant la shulker avec un "minecraft:air{drop_contents:1b}".

Cette méthode possède cependant pas mal de limite, pour une utilisation a chaque ticks, ou sur chaque joueurs.


La méthode - LootTables de modifcation :

Cette technique est assez différente de la précédente, puisque elle n'utilise aucune commande minecraft, hormis celle qui modifieras les données.

Cette techniques est beaucoup plus avancée que la précédente je déconseille au nouveaux de l’utiliser, vous allez perdre plus de temps qu'autre choses.

Le concept de cette méthode, c'est de faire une LootTables par modification, avec cette technique, il y'a moins de limitation techniques est c'est, je pense la plus optimisé, voici un fichier "loot_talbes d'exemple" :

{
    "pools": [
        {
            "rolls": 1,
            "entries": [
                {
                    "type": "minecraft:item",
                    "name": "minecraft:carrot_on_a_stick",
                    "functions": [
                        {
                            "function": "minecraft:copy_nbt",
                            "source": "killer_player",
                            "ops": [
                                {
                                    "source": "SelectedItem.tag",
                                    "target": "{}",
                                    "op": "merge"
                                }
                            ]
                        },
                        {
                            "function": "minecraft:copy_nbt",
                            "source": "this",
                            "ops": [
                                {
                                    "source": "Items",
                                    "target": "MagicItems",
                                    "op": "replace"
                                }
                            ]
                        }
                    ],
                    "conditions": [
                        {
                            "condition": "minecraft:entity_properties",
                            "entity": "killer_player",
                            "predicate": {
                                "equipment": {
                                    "mainhand": {
                                        "item": "minecraft:carrot_on_a_stick"
                                    }
                                }
                            }
                        }
                    ]
                }
            ]
        }
    ]
}

Comme vous pouvais le voir cette techniques possède a défaut majeur, il faut indiquer l'item en haut.
Ce qui bloque un peu, cette méthode, 

Pour faire simple ce fichier, fait partie de mon datapack "Magical Universe", il permet de sauvegarder tout le GUI, de ma baguette magique, et de le transformer en NBT qui seront stocker dans cette même baguette.
"This" étant le donkey, et "killer_player" étant le joueurs.

En premier lieu, je copie les NBT "Selected.tag" du joueurs, et je les met sur l'item de la LootTable.
Ensuite je copie les items du "donkey", qui est en clair mon GUI, et je les met sur un Custom NBT de Loottable, que je nomme MagicItems.

Je met une condition a cette LootTable, elle ne doit se lancer, que si l'item que j'ai en main est une 'minecraft:carrot_on_a_stick", pour éviter les bugs.

Pour lancer ce fichie, il suffit de faire une seul commande :
On utilise la commande loot, sur le SelecteItem, et on fait comme si on avait tuer le donkey.

loot replace entity @s weapon.mainhand 1 kill @e[tag=MagicGui,limit=1,sort=nearest,distance=..1]
  • Le gros point fort de cette technique et de faire, plein de modification d'inventaire, en une seul commandes, de plus cela ne nécessite pas de poser de bloc, puis dans détruire.
  • L'autre avantage, c'est que les "LootTables" font beaucoup moins "laguer" que les commandes.
  • Un autre avantages est qu'on peut l'utiliser plus facilement, chaque "ticks" sur chaque joueurs.
  • Un autre point avantageux, est de transférer facilement des données venant de deux entité en même temps, dans l'exemple au dessus, je les faits avec le joueurs et le donkey.
  • Cependant on doit indiquer l'item, en débuts de fichier.
  • Un autre mauvais, point c'est que cela nécessite, un fichier par modification.
  • Pour finir il faut avoir quelque connaissance dans les LootTables pour pouvoir faire cela.
  • J'ai oublier de préciser mais bien sûr que la functions "set_nbt", pour placer des NBT, fonctionne avec cette technique.

Méthode 1.14 - /data modify

En 1.14 seulement !, il était possible de modifier les inventaire des joueurs avec un bug.

On pouvait avec les commandes, "/data modify entity" et "/execute store entity" modifier les inventaire des joueurs directement, sans LootTables, ni de shulker.

Cette technique avec aucun point négatifs, a par créer des dysfonctionnent dans le code Java, mais en temps que joueurs, et datapackeur, nous on voyait aucun défaut dans cette méthode, a l'exception d'une choses.

L'item a modifier devais avoir un NBT au préalable, il n'était pas possible de modifier un items vierge, la plus grande partie du temps, était de faire la technique de la shulker pour mettre un nbt puis de modifier l'item avec les /data modify.

Hormis cela cette techniques n'a aucun défauts, elle était :

  • Utilisables, chaque ticks sur chaque joueurs.
  • Elle avait une syntax extrêmement simpliste.
  • On pouvais utiliser les scale du /execute store, et donc aussi, la possibilité de run n'importe quel commande, pour prendre, la valeur d'un scoreboard par exemple ou d'un storage.
  • Optimisé , elle n'engendrais pas de lag.
  • Cependant, il fallait un nbt au préalalble.
  • Et, nous ne pouvions pas modifier, le count ou l'id le i'item.

La syntaxe ressembler a cela :
Comme vous pouviez le voir les syntaxe était ultra simpliste, et cela fonctionner !

data modify entity @s Inventory[].tag.CustomNBT set value 1 
data modify entity @s Inventory[].tag.CustomNBT set from storage mon_storage MyNbt.foo[0].bar 
execute store result entity @s SelectedItem.tag.MagicItems float 2.0 run scoreboard players get @s MonSocre

Ces pour cela qu'on attend la commande "/modifyitems" qui ne devrait plus tarder, annoncer en 1.13, mais qui a du être surement refaite depuis le temps, qui va permettre tout ce que vien de vous montrer sans les deux mauvais points, en attendant nous devons utiliser sois les "Shulkers" ou soit les "LootTables".

Espace commentaire :
Auteurs

(Utilisateurs) Celforce a commenté :

Why don't you use the command /replaceitem instead?

Auteurs

(Auteur) Celforce a répondu :

The command /replaceitem, allows you to define an item in the inventory. This command does not allow you to modify the inventory. You cannot add/edit/delete a NBT, change the id or the count dynmatically.

Afficher les 1 réponse.
Auteurs

(Utilisateurs) theskyblockman a commenté :

first