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.
    • moscaphone421M Hors-ligne
      moscaphone421
      dernière édition par

      Ah bah bravo le message de SCAREX est constructif je suis d’accord avec lui #devin !

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

        Il y a un petit problème de sécurité : si tu modifies ton argent côté client et que tu envoies le paquet, le serveur va modifier la variable de son côté. Le paquet ne doit jamais être envoyé au serveur ! Les données doivent rester stocker côté serveur.

        Site web contenant mes scripts : http://SCAREXgaming.github.io

        Pas de demandes de support par MP ni par skype SVP.
        Je n'accepte sur skype que l…

        1 réponse Dernière réponse Répondre Citer 0
        • RedRelayR Hors-ligne
          RedRelay Moddeurs confirmés
          dernière édition par

          Je trouve qu’il y a beaucoup de superflu.
          La synchronisation par exemple n’est pas un élément essentiel au système de Capabilities.
          Il y a certains cas on n’a pas besoin de synchronisation client/serveur.
          Pourtant on commence direct par la création de packet.
          Pour moi le tutoriel doit être réorganisé et la synchronisation devrait être en bonus.

          Je ne comprend pas non plus pourquoi avoir associé le provider avec les data dans une seule et même classe.

          –------------------------------------------------------------------------------------
          Si tu trouves mon intervention pertinente, n'hésite pas a m…

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

            Il y a autre chose, j’ai suivi le tutoriel, bon sur quelque chose de bien plus complexe mais au final c’est la même chose, j’ai une Capability et je doit dialoguer entre le serveur et le client. Et j’ai l’intuition qu’il devrait y avoir un event en plus : EntityJoinedWolrd. Quand un joueur se connecte, il n’a pas les donnés qui viennent du serveur, du coup, le joueur côté client se retrouve avec 0 en monnaie alors que côté serveur il a l’argent qu’il avait la dernière fois qu’il s’est connecté. C’est plutôt gênant quand tu veux afficher la valeur dans une GUI parce qu’on a seulement accès au joueur côté Client dans ce cas précis.

            1 réponse Dernière réponse Répondre Citer 0
            • DiabolicaTrixD Hors-ligne
              DiabolicaTrix Correcteurs Moddeurs confirmés
              dernière édition par

              Comme RedRelay l’a dit, la synchronisation ne fait pas partie du système de capabilities, l’exemple que j’ai fait est un exemple random que je n’ai pas testé, sauf en solo. Le but était de montrer comment le nouveau système fonctionne, le reste est différent pour chacun.

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

                Il existe des events qui peuvent de permettre de régler le problème (http://www.minecraftforgefrance.fr/forge-events.php) déclenchés sur serveur ou client (selon l’event) qui peuvent te permettre d’envoyer un packet pour sync le tout.

                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
                • MrCupCakeMonsterM Hors-ligne
                  MrCupCakeMonster
                  dernière édition par

                  Salut, je suis en 1.11.2 et je ne trouve pas de méthode register(); dans ma classe de capabilities. Est-ce-que cela a changé depuis ?

                  Mes tutos :

                  >! Un item mangeable
                  [url=http://www.minecraftforgefranc…

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

                    Bonjour bonjour,

                    Ce tuto est-il encore d’actualité (en 1.12.2) ?

                    Je pose cette question car je l’ai suivi à la lettre, à priori eclipse ne repère pas d’erreurs et j’ai bien la capabilitie que je peux modifier (ajouter et retirer de l’argent).

                    Cependant il se trouve que l’argent se remet à 0 lorsque je relance le jeu. Cela se passe uniquement quand le jeu est relancé et non pas quand quand je quitte ma map et que j’y retourne juste après (sans avoir fermé le jeu). Pour y voir plus clair j’ai essayé de me connecter sur un serveur et il semple que la “money” se remet à 0 uniquement quand le serveur à été reboot ET que je m’y reco.

                    Comme ce tuto date d’il y a plusieurs version majeures de minecraft j’imagine que forge à du changer depuis et peut être impacter le contenu de ce tuto.

                    Pour ce qui est de mes classes, ce sont exactement les même que dans ce tuto mais je peux les fournir si besoin (peut-être que j’ai loupé quelque chose même si j’en doute car j’ai relu et revérifié tout plusieurs fois pour être sur).

                    Merci d’avance pour votre aide.

                    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

                      Salut,
                      Il doit avoir un problème au niveau de ton storage. Vérifies que les fonctions serialise et deserialise sont bien appelés et fonctionnent comme prévu.
                      Les capabilités n’ont pas beaucoup changé depuis leur introduction.
                      En revanche comme ce tutoriel n’est pas très détaillés, il faudrait en effet un nouveau tutoriel.

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

                        @‘robin4002’:

                        Salut,
                        Il doit avoir un problème au niveau de ton storage. Vérifies que les fonctions serialise et deserialise sont bien appelés et fonctionnent comme prévu.
                        Les capabilités n’ont pas beaucoup changé depuis leur introduction.
                        En revanche comme ce tutoriel n’est pas très détaillés, il faudrait en effet un nouveau tutoriel.

                        Alors je viens de vérifier et effectivement la fonction deserialize n’est jamais appelé (alors que la fonction serialise est bien appelée à la connection et à la déconnection).

                        Pourtant ma fonction deserialize est identique à celle du tuto (exepté le nom des variables car je ne compte pas de l’argent mais des kills de mobs) :

                        @Override
                        public void deserializeNBT(NBTTagCompound compound) {
                              this.setMobKill(compound.getInteger("Mob Kill"));
                        }
                        

                        Concernant ma classe storage ben la aussi c’est la même que dans le tuto (quasiment vide) :

                        public static class Storage implements Capability.IStorage <mobkillcapability>{
                        
                                @Override
                                public NBTBase writeNBT(Capability <mobkillcapability>capability, MobKillCapability instance, EnumFacing side)
                                {
                                    return null;
                                }
                        
                                @Override
                                public void readNBT(Capability <mobkillcapability>capability, MobKillCapability instance, EnumFacing side, NBTBase nbt)
                                {
                        
                                }
                        
                            }
                        
                        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

                          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