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.
    • DiabolicaTrixD Hors-ligne
      DiabolicaTrix Correcteurs Moddeurs confirmés
      dernière édition par

      Ah, oui, je vais mettre la balise 1.8.9. Pour la déprécation, regarde sur le wiki de forge http://mcforge.readthedocs.org/en/latest/datastorage/extendedentityproperties/

      1 réponse Dernière réponse Répondre Citer 0
      • 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
                                            • 1
                                            • 2
                                            • 1 / 2
                                            • Premier message
                                              Dernier message
                                            Design by Woryk
                                            ContactMentions Légales

                                            MINECRAFT FORGE FRANCE © 2024

                                            Powered by NodeBB