MFF

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

    [1.7.x]Modifier la vie du joueur

    Planifier Épinglé Verrouillé Déplacé Résolu 1.7.x
    14 Messages 4 Publieurs 4.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.
    • D Hors-ligne
      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
      • RedRelayR Hors-ligne
        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 Hors-ligne
          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
          • RedRelayR Hors-ligne
            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 Hors-ligne
              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
              • robin4002R Hors-ligne
                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 Hors-ligne
                  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
                  • robin4002R Hors-ligne
                    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 Hors-ligne
                      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
                      • AmaA Hors-ligne
                        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
                        ContactMentions Légales

                        MINECRAFT FORGE FRANCE © 2024

                        Powered by NodeBB