MFF

    Minecraft Forge France
    • Récent
    • Mots-clés
    • Populaire
    • Utilisateurs
    • Groupes
    • Forge Events
      • Automatique
      • Foncé
      • Clair
    • S'inscrire
    • Se connecter

    Utiliser les capabilities

    Planifier Épinglé Verrouillé Déplacé Autres
    1.8.9
    24 Messages 9 Publieurs 9.7k Vues 1 Watching
    Charger plus de messages
    • Du plus ancien au plus récent
    • Du plus récent au plus ancien
    • Les plus votés
    Répondre
    • Répondre à l'aide d'un nouveau sujet
    Se connecter pour répondre
    Ce sujet a été supprimé. Seuls les utilisateurs avec les droits d'administration peuvent le voir.
    • robin4002R Hors-ligne
      robin4002 Moddeurs confirmés Rédacteurs Administrateurs
      dernière édition par

      Il y a un problème avec le tutoriel alors, car le storage ne doit pas rester vide.
      Dans le storage appelle les fonctions deserializeNBT et serializeNBT comme ceci :

             @Override
             public NBTBase writeNBT(Capability <mobkillcapability>capability, MobKillCapability instance, EnumFacing side)
             {
                 return instance.serializeNBT;
             }
      
             @Override
             public void readNBT(Capability <mobkillcapability>capability, MobKillCapability instance, EnumFacing side, NBTBase nbt)
             {
                    instance.deserializeNBT((NBTTagCompound)nbt);
             }
      ```</mobkillcapability></mobkillcapability>
      1 réponse Dernière réponse Répondre Citer 0
      • F Hors-ligne
        Frinn
        dernière édition par

        @‘robin4002’:

        Il y a un problème avec le tutoriel alors, car le storage ne doit pas rester vide.
        Dans le storage appelle les fonctions deserializeNBT et serializeNBT comme ceci :

               @Override
               public NBTBase writeNBT(Capability <mobkillcapability>capability, MobKillCapability instance, EnumFacing side)
               {
                   return instance.serializeNBT;
               }
        
               @Override
               public void readNBT(Capability <mobkillcapability>capability, MobKillCapability instance, EnumFacing side, NBTBase nbt)
               {
                      instance.deserializeNBT((NBTTagCompound)nbt);
               }
        ```</mobkillcapability></mobkillcapability>
        

        Ça m’avais paru bizarre aussi mais comme c’est indiqué que le storage sert que pour les entités autres que celles de Minecraft (ce qui est faut du coup) je me suis pas posé plus de questions que ça.
        En tout cas merci bien pour le coup de main ça marche nickel maintenant.

        1 réponse Dernière réponse Répondre Citer 0
        • F Hors-ligne
          Frinn
          dernière édition par

          @‘robin4002’:

          Il y a un problème avec le tutoriel alors, car le storage ne doit pas rester vide.
          Dans le storage appelle les fonctions deserializeNBT et serializeNBT comme ceci :

                 @Override
                 public NBTBase writeNBT(Capability <mobkillcapability>capability, MobKillCapability instance, EnumFacing side)
                 {
                     return instance.serializeNBT;
                 }
          
                 @Override
                 public void readNBT(Capability <mobkillcapability>capability, MobKillCapability instance, EnumFacing side, NBTBase nbt)
                 {
                        instance.deserializeNBT((NBTTagCompound)nbt);
                 }
          ```</mobkillcapability></mobkillcapability>
          

          Ça m’avais paru bizarre sur le coup mais comme il est indiqué que storage sert pour les entités qui ne sont pas de minecraft j’ai pas fais plus gaffe que ça.

          Du coup j’ai bien appelé les méthodes serialize et deserialize dans le storage comme indiqué ci-dessus cependant ça ne résout pas le problème et après 2-3 tests je me rends compte que les fonctions writeNBT et readNBT ne s’exécutent jamais. Je n’ai pas vu dans le code d’endroit ou ces fonctions sont appelées à part dans le register :

          
          public static void register()
              {
                  CapabilityManager.INSTANCE.register(MobKillCapability.class, new MobKillCapability.Storage(), new MobKillCapability.Factory());
              }
          
          

          D’ailleurs la fonction Factory est elle aussi quasiment vide (elle retourne null) j’ai regardé dans la doc de forge mais pas très bien compris à quoi elle sert et je suis pas sur que ce soit lié à mon problème.

          Autre point que je viens de remarquer la variable mobkill qui est un int stockée dans la capabilitie (et qui se reset à chaque reboot du jeu) se reset en fait à la valeur indiquée dans les lignes ci-dessous :

          
          public MobKillCapability(EntityPlayer player)
              {
                  this.mobkill = 0;
                  this.player = player;
              }
          
          

          j’ai essayé de remplacer le 0 par la valeur stockée dans les nbt (en passant par la capabilitie) mais cela fait crash le jeu. J’imagine qu’en faisant ça le code essaye de récupérer la valeur de la capabilitie avant la création de celle ci. Je suis donc plutôt à court d’idées concernant mon problème surtout si y manque des lignes dans le tuto x)

          1 réponse Dernière réponse Répondre Citer 0
          • robin4002R Hors-ligne
            robin4002 Moddeurs confirmés Rédacteurs Administrateurs
            dernière édition par

            La fonction register est appelé quelque part ?
            Elle devrait l’être dans la classe init de ta classe principale.

            1 réponse Dernière réponse Répondre Citer 0
            • F Hors-ligne
              Frinn
              dernière édition par

              @‘robin4002’:

              La fonction register est appelé quelque part ?
              Elle devrait l’être dans la classe init de ta classe principale.

              Oui elle est bien appelée dans le Init et d’ailleurs la capability se crée bien et se save bien dans le NBT mais c’est comme si à la connection la valeur stockée dans le NBT n’était pas lue et du coup remplacée par la valeur par défault.

              De ce que je vois c’est surement du à la fonction deserializeNBT qui n’est jamais appelée.

              Voila toute la classe de la capabilitie, peut être y verras tu plus clair avec ça :

              :::

              
              package fr.frinn.coliseum.capability;
              
              import java.util.concurrent.Callable;
              
              import fr.frinn.coliseum.common.Coliseum;
              import fr.frinn.coliseum.network.PacketCapability;
              import net.minecraft.entity.player.EntityPlayer;
              import net.minecraft.entity.player.EntityPlayerMP;
              import net.minecraft.nbt.NBTBase;
              import net.minecraft.nbt.NBTTagCompound;
              import net.minecraft.util.EnumFacing;
              import net.minecraftforge.common.capabilities.Capability;
              import net.minecraftforge.common.capabilities.CapabilityManager;
              import net.minecraftforge.common.capabilities.ICapabilityProvider;
              import net.minecraftforge.common.capabilities.ICapabilitySerializable;
              
              public class MobKillCapability implements ICapabilityProvider, ICapabilitySerializable <nbttagcompound>{
              
                  @Override
                  public NBTTagCompound serializeNBT() {
                      NBTTagCompound compound = new NBTTagCompound();
                      compound.setInteger("Mob Kill", this.getMobKill());
                      return compound;
                  }
              
                  @Override
                  public void deserializeNBT(NBTTagCompound compound) {
                      this.setMobKill(compound.getInteger("Mob Kill"));
                  }
              
                  @Override
                  public boolean hasCapability(Capability capability, EnumFacing facing) {
                      return Coliseum.MOB_KILL_CAP != null && capability == Coliseum.MOB_KILL_CAP;
                  }
              
                  @Override
                  public <t>T getCapability(Capability <t>capability, EnumFacing facing) {
                      return Coliseum.MOB_KILL_CAP != null && capability == Coliseum.MOB_KILL_CAP ? (T)this : null;
                  }
              
                  public int mobkill;
              
                  public void setMobKill(int mobkill)
                  {
                      this.mobkill = mobkill;
                  }
              
                  public int getMobKill()
                  {
                      return this.mobkill;
                  }
              
                  public static class Storage implements Capability.IStorage <mobkillcapability>{
              
                      @Override
                      public NBTBase writeNBT(Capability <mobkillcapability>capability, MobKillCapability instance, EnumFacing side)
                      {
                          System.out.println("write");
                          return instance.serializeNBT();
                      }
              
                      @Override
                      public void readNBT(Capability <mobkillcapability>capability, MobKillCapability instance, EnumFacing side, NBTBase nbt)
                      {
                          System.out.println("read");
                          instance.deserializeNBT((NBTTagCompound)nbt);
                      }
              
                  }
              
                  public static class Factory implements Callable <mobkillcapability>{
                      @Override
                      public MobKillCapability call() throws Exception
                      {
                          return null;
                      }
                  }
              
                  private EntityPlayer player;
              
                  public static void register()
                  {
                      CapabilityManager.INSTANCE.register(MobKillCapability.class, new MobKillCapability.Storage(), new MobKillCapability.Factory());
                  }
              
                  public MobKillCapability(EntityPlayer player)
                  {
                      this.mobkill = 0;
                      this.player = player;
                  }
              
                  public void sync()
                  {
                      PacketCapability packet = new PacketCapability(this.getMobKill());
              
                      EntityPlayerMP playerMP = (EntityPlayerMP) player;
              
                      Coliseum.network.sendTo(packet, playerMP);
                  }
              }
              
              

              :::

              Coliseum est le nom de ma classe principale et MOB_KILL_CAP c’est ce qui est défini dans le @CapabilityInject</mobkillcapability></mobkillcapability></mobkillcapability></mobkillcapability></t></t></nbttagcompound>

              1 réponse Dernière réponse Répondre Citer 0
              • robin4002R Hors-ligne
                robin4002 Moddeurs confirmés Rédacteurs Administrateurs
                dernière édition par

                Comme ça je ne vois pas de problème.
                Sinon envoies un zip de ton dossier src, je vais faire des tests de mon côté dans la soirée.

                1 réponse Dernière réponse Répondre Citer 0
                • F Hors-ligne
                  Frinn
                  dernière édition par

                  @‘robin4002’:

                  Comme ça je ne vois pas de problème.
                  Sinon envoies un zip de ton dossier src, je vais faire des tests de mon côté dans la soirée.

                  Ce serait super sympas de ta part. Voila mon dossier src, ça va surement te paraitre très bordélique mais bon c’est mon 1er mod 😉

                  J’ai pas mis les ressources je pense pas que ce soit nécessaire et ça prends beaucoup de place pour rien.

                  P.S. Le gros fatras en commentaire dans le event handler ça vient du fait que avant j’utilisais les NBT du playerdata pour stocker mes variables mais j’avais pas encore compris que ça marchait pas en live. A terme le but est d’utiliser les capability pour stocker le nombre de mobs tués pour quelques types de mobs. Pour pas me faire chier à devoir tuer des mobs à chaque test j’augmente la capability avec un onItemRightClick sur l’item Invit.

                  1 réponse Dernière réponse Répondre Citer 0
                  • robin4002R Hors-ligne
                    robin4002 Moddeurs confirmés Rédacteurs Administrateurs
                    dernière édition par

                    J’ai fais quelques tests mais rien de concluant.
                    J’ai ne comprends pas du tout pourquoi la valeur est perdu en cas de relance-ment du jeu et pas en cas de déconnexion / reconnexion.

                    Essaies de refaire en suivant ce tutoriel (en anglais) : https://www.planetminecraft.com/blog/forge-tutorial-capability-system/

                    1 réponse Dernière réponse Répondre Citer 0
                    • AymericRedA Hors-ligne
                      AymericRed
                      dernière édition par

                      Question, quand tu as ce problème, c’est en restant dans ton environnement de dev ?

                      Si je vous ai aidé, n'oubliez pas d’être heureux, j'aiderai encore +

                      AymericRed, moddeur expérimenté qui aide sur ce forum et qui peut accepter de faire un mod Forge rémunéré de temps en temps.

                      Mes tutos : Table de craft, plugin NEI, plugin JEI, modifier l'overlay
                      Je suis un membre apprécié et joueur, j'ai déjà obtenu 6 points de réputation.

                      1 réponse Dernière réponse Répondre Citer 0
                      • F Hors-ligne
                        Frinn
                        dernière édition par

                        @‘AymericRed’:

                        Question, quand tu as ce problème, c’est en restant dans ton environnement de dev ?

                        Ouaip tout à fait j’ai test avec client en solo et client connecté sur serveur mais c’était en restant avec le minecraft lancé par eclipse.

                        La je suis en train de suivre le tuto que m’a conseillé Robin, je verrais bien si ça marche mieux.

                        EDIT : En effet maintenant ça marche correctement 😃

                        Le tuto sur planet minecraft présente les choses assez différemment du coup je saurais pas dire ce qui allait pas ici (peut être qu’il est juste plus récent).

                        La seule chose que j’ai pu remarquer et qui ait un rapport avec mon problème c’est que avec ce tuto la variable était stockée dans un “sous-dossier” du “dossier” ForgeCaps dans le playerdata (dont le nom changeait tout le temps d’ailleurs) alors que avec le tuto de planet minecraft elle est stockée directement dans le ForgeCaps.

                        En tout cas merci beaucoup pour votre aide je vais pouvoir continuer mon mod maintenant 😃 ça faisait plusieurs jours que je bloccais sur ce problème.

                        1 réponse Dernière réponse Répondre Citer 0
                        • AymericRedA AymericRed a fait référence à ce sujet sur
                        • robin4002R robin4002 a fait référence à ce sujet sur
                        • robin4002R robin4002 a fait référence à ce sujet sur
                        • robin4002R robin4002 a fait référence à ce sujet sur
                        • 1
                        • 2
                        • 2 / 2
                        • Premier message
                          Dernier message
                        Design by Woryk
                        ContactMentions Légales

                        MINECRAFT FORGE FRANCE © 2024

                        Powered by NodeBB