• S'inscrire
    • Se connecter
    • Recherche
    • Récent
    • Mots-clés
    • Populaire
    • Utilisateurs
    • Groupes

    Résolu [1.7.x]Modifier la vie du joueur

    1.7.x
    4
    14
    4463
    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.
    • D
      Dezta dernière édition par

      Bonsoir à tous ! Je sollicite votre aide car malgré quelques recherches, je n’ai rien trouvé de très concret sur mon problème.
      Je cherche à faire varié la vie du joueur en fonction d’une variable de mon Extended Entity Properties et je ne vois absolument pas comment m’y prendre sans modifier les classes vanilla. J’ai pourtant vu quelques mods comme ça, mais je suppose qu’ils utilisent une sorte de coremod pour modifier les classes des joueurs ?
      Si oui, vous connaissez des api qui permettent de faire ça ?
      Et aux passages, il va falloir modifier également la bar de vie, et je voulais savoir : Peut-on juste annulé l’évènement de son render comme la barre d’xp ou c’est plus compliqué ?

      Merci d’avance en tous cas !

      1 réponse Dernière réponse Répondre Citer 0
      • Ama
        Ama dernière édition par

        Pour le render de la barre de vie

        @ForgeSubscribe
        @SideOnly(Side.CLIENT)
        public void renderGameOverlay(RenderGameOverlayEvent.Pre event)
        {
        if(event.type == ElementType.HEALTH)
        {
        event.setCanceled(true);
        }
        }
        

        c.f Robin

        Si je t'ai filé un coup de main n'oublie pas le + / -
        Par contre évite les demandes d'aides en MP, tu sera sympa'

        La JavaDoc c'est comme le PQ, ça sert à ce démerder tous seul. -Victor Hugo- 2017

        Une superbe API pour animer vos super modèles CraftStudio dans Minecraft !

        1 réponse Dernière réponse Répondre Citer 1
        • D
          Dezta dernière édition par

          Ok, pas de soucis pour la barre de vie, ça confirme ce que je pensais.
          Quelqu’un aurait une idée pour le reste ?
          EDIT: Au passage, je crois que c’est plutot @SubscribeEvent plutot que @ForgeSubscribe ^^.

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

            Tu as la fonction setHealth(float) qui te permet de modifier la vie d’une EntityLivingBase.
            Je ne sais pas si ça répond a ton problème, tu peux nous en dire plus sur ton Extended Entity Property ?

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

            1 réponse Dernière réponse Répondre Citer 1
            • D
              Dezta dernière édition par

              Oui, j’ai continué mes recherches et je suis tombé sur la même fonction, j’étais justement en train de me demandé comment l’employer et si je pourrais l’utilisé sur le joueur.

              Pour mon extended entity, bah c’est un truc sans aucune prétention, presque le même que le tuto de Gugu ^^(C’est pour dire, y a encore ces petits commentaires dedans ; D) .

              J’ai juste créer une variable et je voudrais que quand on la monte, la vie maximal du joueur monte également.
              Je peux vous filé le code mais c’est encore très … embryonnaire on va dire, je fais surtout sur papier pour le moment.

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

                Tu peux peut-être faire

                
                @SubscribeEvent
                public void onPlayerTick(PlayerTickEvent e) {
                if(e.phase == TickEvent.Phase.START) {
                if(!e.player.getFoodStats().needFood() && e.player.getHealth() < laVieMaxDuJoueur) {
                e.player.setHealth(e.player.getHealth()+0.1F);
                }
                }
                }
                
                

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

                1 réponse Dernière réponse Répondre Citer 1
                • D
                  Dezta dernière édition par

                  Merci beaucoup, mais j’ai fait quelques tests a partir de la fonction que tu ma passé, la vie du joueur est effectivement régénéré mais, dans tout les cas on ne peut pas dépasser 20 points : Il doit y avoir un plafond défini pour Player.

                  Mais peut être que toutes les EntityLiving en on un. Ça va être compliquer du coup pour faire ce que je veux si c’est le cas…

                  EDIT : je viens de tombé sur ça : http://minecraft.gamepedia.com/Attribute
                  Je vais essayer de faire quelques choses avec, ça a l’air intéressant.

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

                    Effectivement, tu risques de devoir utiliser l’instrospection pour surcharger la fonction public final float getMaxHealth() de EntityLivingBase.

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

                    1 réponse Dernière réponse Répondre Citer 0
                    • D
                      Dezta dernière édition par

                      Rebonjour !
                      Je me suis renseigné sur l’introspection et franchement je me voit mal utilisé ce truc avec mon niveau actuel en java.
                      Mais j’ai trouvé une solution : j’ai contacté le type qui a fait le mod dont je parlais plus haut et il m’a confirmé avoir utilisé un custom modifier pour affecter la vie du joueurs. J’ai cherché partout des tuto la dessus, je n’en ai trouvé nul parts.
                      Du coup, j’ai jeté un coup d’œil a son code source, j’ai trouvé la méthode qui m’intéresse mais tous est offuscated c’est pas pratique, et malgré le fait que se soit en 1.6.4, je n’arrive pas l’avoir avec BON. La voici :

                      
                      protected void c(ye par1ItemStack, abw par2World, uf par3EntityPlayer) {
                      double valueToSet = 2.0D;
                      try {
                      valueToSet = par3EntityPlayer.a(tp.a).a(par3EntityPlayer.getPersistentID()).d() + 2.0D;
                      }
                      catch (Exception e) {
                      }
                      ot moreHealth = new ot(par3EntityPlayer.getPersistentID(), "Heart Crystal Health Boost", valueToSet, 0);
                      
                      os attributeinstance = par3EntityPlayer.a(tp.a);
                      attributeinstance.b(moreHealth);
                      attributeinstance.a(moreHealth);
                      }
                      
                      

                      En gros, cette classe était la méthode “OnItemRightClic” d’un item. Lorsqu’on l’active, elle compte la valeur du modifier du joueur, le supprime , puis en ajoute un nouveau de valeur égal au précédent + 2.0D et enfin l’enregistre.
                      J’ai reussie a comprendre que tp correspond à SharedMonsterAttributes, os à IAttributeInstance, et ot a AttributeModifier, mais je n’arrive pas a voir quel méthode sont appelés. Quelqu’un aurait-il une idée du nom des fonctions qui sont masqués ?

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

                        MD: uf/a ()V net/minecraft/entity/player/EntityPlayer/func_70088_a ()V
                        func_70088_a,entityInit,2,
                        Donc par3EntityPlayer.a = player.entityInit(

                        FD: tp/a net/minecraft/entity/SharedMonsterAttributes/field_111267_a
                        field_111267_a,maxHealth,2,
                        Donc tp.a = SharedMonsterAttributes.maxHealth
                        etc …

                        Je te laisse chercher, il te faut juste un setup de forge en 1.6.4 avec forge gradle, puis va dans le dossier forge-1.6.4\build\unpacked\conf
                        Ici, tu as le fichier packaged.srg, dedans il y a toutes les correspondances des noms a , b, c, d, etc … vers field_xxx, fonc_xxx et le nom des classes.
                        Ensuite dans forge-1.6.4\build\unpacked\mappings tu as les fichiers fields.csv et methods.csv, dans le premier tu as les correspondances de field_xxx vers le nom correcte et dans le second la même chose pour les méthodes.

                        (En passant, c’est pas bien de décompiler un mod sans l’accord de l’auteur …).

                        1 réponse Dernière réponse Répondre Citer 1
                        • D
                          Dezta dernière édition par

                          Oaui, je sais, mais j’ai vraiment pas eu d’autres solutions, ça fait 3 jours que je cherche partout ces 50 caractères de code …
                          En plus j’ai même pas tout decompilé, juste une pitite méthode. Je pence qu’il m’en voudra pas :x
                          Sinon merci beaucoup, je savais qu’il y avait surment une sorte de “tableau de correspondance” dans les files de graddle, mais pour la 1.6.4 j’étais encore sous MCP et j’ai pas trouvé .:P

                          Je vous dirais si ça marche !


                          Encore un petit problème, mais on commence a en voir le boue !
                          Dans le code source, nous avions :

                          os attributeinstance = par3EntityPlayer.a(tp.a);
                          
                          

                          Ce qui, après relecture donne :

                          IAttributeInstance attributeinstance = par3EntityPlayer.entityInit(SharedMonsterAttributes.maxHealth);
                          

                          Problème : J’ai une erreur sur entityInit, qui est protected et ne prend pas de paramètre :

                          protected void entityInit()
                          {
                          super.entityInit();
                          this.dataWatcher.addObject(16, Byte.valueOf((byte)0));
                          this.dataWatcher.addObject(17, Float.valueOf(0.0F));
                          this.dataWatcher.addObject(18, Integer.valueOf(0));
                          }
                          
                          

                          Donc ou j’ai du faire une erreurs en relisant le tableau et c’est une autre fonction qui va a la place, ou bien j’ai … autre chose ?

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

                            En effet ça peut pas être ça, il chercher la fonction qui accepte un attribue en argument. Elle est surement dans une classe mère.

                            1 réponse Dernière réponse Répondre Citer 1
                            • D
                              Dezta dernière édition par

                              Je repost pour vous dire que j’ai fini par trouvé, voilà le code que j’utilise finalement:

                              
                              AttributeModifier moreHealth = new AttributeModifier(par3EntityPlayer.getPersistentID(), "Minefus Caracteristique Health Boost", valueToSet, 0);// On déclare un AttributeModifier pour par3EntityPlayer, on lui donne un ID, un nom, une valeur et le type d'opération qui va être effectuer.
                              
                              IAttributeInstance attributeinstance = par3EntityPlayer.getEntityAttribute(SharedMonsterAttributes.maxHealth); // Nouvelle instance de AttributeInstance, qui pointe sur l'Attribute "MaxHealth" joueur.
                              
                              attributeinstance.removeModifier(moreHealth); // On supprime les éventuelles AttributeModifier du même nom de l'AttributeInstance .
                              attributeinstance.applyModifier(moreHealth);// On applique finalement l'AttributeModifier sur l'AttributeInstance
                              
                              

                              Voilà ! Avec ce code, plusieurs mod qui affecte la vie du joueur peuvent fonctionné sans conflis, j’ai testé, c’est génial.
                              Merci beaucoup a tout ceux qui m’ont aider pour y arrivé, c’était vraiment une prise de tête, vous devriez faire un tutoriel sur les Attribute & Modifier, c’est super utile !
                              Vous pouvez mettre en “Résolu”.

                              1 réponse Dernière réponse Répondre Citer 0
                              • Ama
                                Ama dernière édition par

                                Désolé du UP, mais ces bouts de code tu les mets où exactement ?

                                Si je t'ai filé un coup de main n'oublie pas le + / -
                                Par contre évite les demandes d'aides en MP, tu sera sympa'

                                La JavaDoc c'est comme le PQ, ça sert à ce démerder tous seul. -Victor Hugo- 2017

                                Une superbe API pour animer vos super modèles CraftStudio dans Minecraft !

                                1 réponse Dernière réponse Répondre Citer 0
                                • 1 / 1
                                • Premier message
                                  Dernier message
                                Design by Woryk
                                Contact / Mentions Légales

                                MINECRAFT FORGE FRANCE © 2018

                                Powered by NodeBB