Sauvegarde NBTTagList Player Capabilities



  • Bonjour / bonsoir !

    Je travaille à l'heure actuelle sur les capabilities, seulement je me heurte à un problème lors du chargement de mon mon une fois les capabilities sauvegardées

    Je quitte mon monde et je reviens dedans, et là les tags ont disparus.

    Je cherche à enregistrer une liste de sortillèges, ce sont des strings donc je passe par une NBTTagList.
    Seulement je pense que le problème surviens lors de la lecture des NBT dans la class Storage des capabilities, que je vous partages ci-dessous:

    public class SpellsStorage implements IStorage <ispells>{
        @Override
        public NBTBase writeNBT(Capability <ispells>capability, ISpells instance, EnumFacing side) {
            final NBTTagCompound comp = new NBTTagCompound();
    
            final NBTTagList tagList = new NBTTagList();
            for (int i = 0; i < instance.getSpell().size(); i++) {
                if (instance.getSpell().get(i) != null) {
                    final String s = instance.getSpell().get(i);
                    if (s != null) {
                        final NBTTagCompound tag = new NBTTagCompound();
                        tag.setString("Spells" + i, s);
                        tagList.appendTag(tag);
                    }
                }
            }
            comp.setTag("Spells", tagList);
            return comp.getTag("Spells");
        }
    
        @Override
        public void readNBT(Capability <ispells>capability, ISpells instance, EnumFacing side, NBTBase nbt) {
            final NBTTagCompound comp = new NBTTagCompound();
    
            final NBTTagList tagList = comp.getTagList("Spells", Constants.NBT.TAG_COMPOUND);
            for (int i = 0; i < tagList.tagCount(); i++) {
                final NBTTagCompound tag = tagList.getCompoundTagAt(i);
                final String s = tag.getString("Spells" + i);
                instance.getSpell().add(i, s);
            }
        }
    
    }
    

    Je ne sais pas vraiment d'où viens le problème car je maîtrise encore mal les NBTs.

    Merci aux personnes qui m'aideront à résoudre ce problème par avance !</ispells></ispells></ispells>



  • final NBTTagCompound comp = new NBTTagCompound();
    
    final NBTTagList tagList = comp.getTagList("Spells", Constants.NBT.TAG_COMPOUND);
    

    Dans ta fonction read, tu utilises l'objet comp qui ne contient aucune donnée comme tu viens de le créer, tu aurais du utiliser celui "nbt" fourni par la fonction.



  • Ouais mais c’est pas compatible Compount et Tag si ?


  • Administrateurs

    final NBTTagList tagList = ((NBTTagCompound)nbt).getTagList("Spells", Constants.NBT.TAG_COMPOUND);
    Comme ça ?



  • Non malheureusement:

    java.lang.ClassCastException: net.minecraft.nbt.NBTTagList cannot be cast to net.minecraft.nbt.NBTTagCompound
    
    


  • Le problème c'est que dans writeNBT, tu retourne comp.getTag("Spells"); ce qui correspond à un NBTTagList alors que dans readNBT, tu fait comme si tu avais un NBTTaCompound. Il faut donc que tu mette "return comp;" à la place de "return comp.getTag("Spells");" (et faire ce que Robin à dit).


  • Administrateurs

    Vu l'exception NBTBase est une taglist et non un NBTTagCompound.
    Donc il faut faire comme ça :
    final NBTTagList tagList = ((NBTTagList )nbt).getTagList("Spells", Constants.NBT.TAG_COMPOUND);



  • The method getTagList(String, int) is undefined for the type NBTTagList
    

    Je comprends pas, je vous donne mes sources actuelles:

    public class SpellsStorage implements IStorage <ispells>{
    @Override
    public NBTBase writeNBT(Capability <ispells>capability, ISpells instance, EnumFacing side) {
    final NBTTagCompound comp = new NBTTagCompound();
    
    final NBTTagList tagList = new NBTTagList();
    for (int i = 0; i < instance.getSpell().size(); i++) {
    if (instance.getSpell().get(i) != null) {
    final String s = instance.getSpell().get(i);
    if (s != null) {
    final NBTTagCompound tag = new NBTTagCompound();
    tag.setString("Spells" + i, s);
    tagList.appendTag(tag);
    }
    }
    }
    comp.setTag("Spells", tagList);
    return comp;
    }
    
    @Override
    public void readNBT(Capability <ispells>capability, ISpells instance, EnumFacing side, NBTBase nbt) {
    
    final NBTTagList tagList = ((NBTTagList) nbt).getTagList("Spells", Constants.NBT.TAG_COMPOUND);
    for (int i = 0; i < tagList.tagCount(); i++) {
    final NBTTagCompound tag = tagList.getCompoundTagAt(i);
    final String s = tag.getString("Spells" + i);
    instance.getSpell().add(i, s);
    }
    }
    
    }
    ```</ispells></ispells></ispells>

  • Administrateurs

    Donc il n'est visiblement pas possible de mettre une tab list dans une tag list.

    Il faudrait faire un tag supplémentaire.



  • Mais c'est quand même bizarre l'inventaire est géré dans une liste pour les slots non ?

    Sinon, il faudrait que je passe par une boucle pour lire la liste des spells et les ajouter en tant que tags indépendant les uns des autres ? Oo


  • Administrateurs

    Pourtant sur nhg on a ça :

    @Override public void readNBT(Capability <inhgcapability>capability, INHGCapability instance, EnumFacing side, NBTBase nbt)
    {
    NBTTagCompound tag = ((NBTTagCompound)nbt);
    instance.setKitId(tag.getInteger("KitId"));
    ….
    

    Et le cast ne plante pas.
    Je ne comprend pas pourquoi ça ne passe pas chez toi.</inhgcapability>



  • La liste n'a pas l'air de pouvoir être cast on dirait

    net.minecraft.nbt.NBTTagList cannot be cast to net.minecraft.nbt.NBTTagCompound
    


  • Ce n'est pas la liste qu'il faut cast à NBTTagCompound, mais le truc "nbt" de type NBTBase.



  • Hein ? Tu fais comment ?



  • Bah ça :

    @Override
    public void readNBT(Capability <ispells>capability, ISpells instance, EnumFacing side, NBTBase nbt) {
    final NBTTagCompound comp = (NBTTagCompound) nbt; //ICI
    
    final NBTTagList tagList = comp.getTagList("Spells", Constants.NBT.TAG_COMPOUND);
    for (int i = 0; i < tagList.tagCount(); i++) {
    final NBTTagCompound tag = tagList.getCompoundTagAt(i);
    final String s = tag.getString("Spells" + i);
    instance.getSpell().add(i, s);
    }
    }
    

    Logiquement c'est ça.</ispells>



  • Même crash à la ligne que tu m'a proposé

    net.minecraft.nbt.NBTTagList cannot be cast to net.minecraft.nbt.NBTTagCompound
    

  • Administrateurs

    System.out.println(nbt); affiche quoi dans la console ?
    Ou alors tu peux mettre un point d'arrêt et regarder en débug ce que contient nbt ?



  • Je pense que l'ancien Tag enregistré était un NBTTagList donc il faut mettre un if instanceof NBTTaCompound.



  • [19:12:52] [Server thread/INFO] [STDOUT]: [fr.caminelot.common.capability.SpellsStorage:readNBT:37]: []
    

  • Administrateurs

    Hum ça semble être vide.
    Il y a un soucis 😕

    Mais je ne vois pas d'où ça peut venir :s