• Register
    • Login
    • Search
    • Recent
    • Tags
    • Popular
    • Users
    • Groups

    Créer un mob qui attaque les autres entités que le joueur ! (AI)

    Les entités
    1.7.2
    8
    20
    9724
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • elias54
      elias54 Administrateurs last edited by robin4002

      Créer un mob qui attaque les autres entités que le joueur :

      Dans ce tutoriel nous allons apprendre à créer un mob qui en attaque d’autres ! (Et non pas seulement le joueur !)

      Pour commencer il vous faut la base de votre mob (rendez-vous ici).

      Une fois ceci fait, ajoutez la méthode suivante dans votre class :

      public void updateEntityActionState()
      {
           super.updateEntityActionState();
      }
      

      Comme vous vous en douterez, ce n’est pas fini !
      Pour que le mob sache ce qu’il doit faire, il lui faut des indications, donc une LISTE !

      List list = worldObj.getEntitiesWithinAABB(EntityCreature.class, AxisAlignedBB.getAABBPool().getAABB(posX, posY, posZ, posX + 1, posY + 1, posZ + 1).expand(16D, 4D, 16D));
      

      Lexique :
      List list : On déclare une liste.
      worldObj.getEntitiesWithinAABB(EntityCreature.class, AxisAlignedBB.getAABBPool().getAABB(posX, posY, posZ, posX + 1, posY + 1, posZ + 1).expand(16D, 4D, 16D)); : On initialise notre List !
      EntityCreature.class : À REMPLACER ! (Sauf si vous voulez que votre mob attaque toutes les créatures du jeu.)
      AxisAlignedBB.getAABBPool().getAABB(posX, posY, posZ, posX + 1, posY + 1, posZ + 1).expand(16D, 4D, 16D) : Permet de détecter la boîte de collision de l’ennemi du mob et surtout, à quel distance il peut le détecter !

      Une fois notre liste faite, OU PRESQUE ! Nous allons ajouter une boucle for :

      for(int i = 0; i<list.size(); i++){
      
      }
      

      Explication du contenu de la boucle for :
      En premier nous avons la déclaration d’un Integer qui nous sera vital, il vous suffit de regarder la suite de la boucle for pour savoir pourquoi !

      Et ENFIN, dans cette boucle for, c’est là que tout va se jouer !
      Dans votre boucle for, ajoutez cette ligne qui sera très importante, puisqu’elle va se référencer au List !

      Entity entity = (Entity)list.get(i);
      

      (/!\NE PAS CHANGER “Entity” PAR UNE AUTRE CLASS(Mais vous pouvez changer le .class !!!) /!\)
      Ensuite, nous allons faire (ce qu’on appel) un “List Empty Check”.
      Dans votre boucle for :

      if(!list.isEmpty())
      {
      }
      

      Et maintenant la visse finale, le setTarget !
      (À mettre dans votre “List Empty Check”)

      this.setTarget(entity);
      

      Et voilou ! Normalement, votre méthode devrait ressembler à ça :

      public void updateEntityActionState()
      {
          List list = worldObj.getEntitiesWithinAABB(EntityCreature.class, AxisAlignedBB.getAABBPool().getAABB(posX, posY, posZ, posX + 1, posY + 1, posZ + 1).expand(16D, 4D, 16D));
          for(int i = 0; i< list.size(); i++)
          {
              Entity entity = (Entity)list.get(i);
              if(!list.isEmpty())
              {
                  if(!(entity instanceof EntityPlayer))
                  {
                  this.setTarget(entity);
                  }
              }
          }
          super.updateEntityActionState();
      }
      

      De même pour ce tutoriel, je ne peux pas vous donner un exemple en screen car il n’y a pas de changement physique sur le mob. 😞

      Quoi qu’il en soit, j’espère que ce tutoriel vous aura plu, n’hésitez pas à mettre un petit + à ma réputation si c’est le cas ! 😄

      Mon site | GitHub

      1 Reply Last reply Reply Quote 1
      • Gugu
        Gugu last edited by

        LA SYNTAXEEEEEEEEEEEEEEEEEE

        "If you have a comprehensive explanation for everything then it decreases uncertainty and anxiety and reduces your cognitive load. And if you can use that simplifying algorithm to put yourself on the side of moral virtue then you’re constantly a good person with a minimum of effort."
        ― Jordan B. Peterson

        1 Reply Last reply Reply Quote 0
        • Deleted
          Deleted last edited by

          Très bon tutoriel mais y’a plusieurs choses que je ne comprend pas :

          1. J’ai compris la liste mais si il y a EntityCreature à côté avec telle coordonnées alors qu’est ce qu’on fait ? On l’attaque? C’est dit où dans le tutoriel ? Excusez-moi si y à quelque chose qui m’a échappé …

          2. A quoi sert la boucle et surtout le “list.size” et surtout après à quoi sert d’incrémenter la variable i

          3)Et après la dernière condition si c’est le joueur qui est la Entity alors l’entity concernée le suit? “this.setTarget(entity);”, c’est ça? Elle ne l’attaque pas ?

          1 Reply Last reply Reply Quote 0
          • elias54
            elias54 Administrateurs last edited by

            1)Concernant EntityCreature, c’est les entités extends à cette classe que ton mob va attaquer (entitymob est descendante de cette classe)

            2)Ensuite, list.size = la taille de la liste, le contenu de la liste des entités à attaquer

            3)La boucle for est faite pour déclarer Entity

            Mon site | GitHub

            1 Reply Last reply Reply Quote 0
            • Überfap
              Überfap last edited by

              Très utile, par contre il y a vraiment un truc que je ne comprends pas: pourquoi fait on la “List Empty Check” dans la boucle for ???

              Si je t'ai aidé, n'hésites pas à mettre un point de réputation positif !
              Si tu m'as aidé, je n'hésiterais pas à t'en donner à mon tour !

              1 Reply Last reply Reply Quote 0
              • elias54
                elias54 Administrateurs last edited by

                La condition est nécessaire pour vérifier si la list n’est pas vide. Si on met pas cette condition -> Crash…

                Mon site | GitHub

                1 Reply Last reply Reply Quote 0
                • Überfap
                  Überfap last edited by

                  Oui ça j’avais compris, mais pourquoi dans la boucle for et pas avant ? (Désolé si c’est une question débile ^^)

                  Si je t'ai aidé, n'hésites pas à mettre un point de réputation positif !
                  Si tu m'as aidé, je n'hésiterais pas à t'en donner à mon tour !

                  1 Reply Last reply Reply Quote 0
                  • elias54
                    elias54 Administrateurs last edited by

                    Quand je savais pas d’où venait le crash, j’ai du faire des tests.

                    Mon site | GitHub

                    1 Reply Last reply Reply Quote 0
                    • zery59
                      zery59 last edited by

                      Bonsoir, j’ai un petit problème avec mon mob :
                      J’ai bien suivi le tuto, et le problème, c’est que mon mob n’attaque pas les mobs souhaités, mais en plus, il prend des dégâts alors qu’aucun mob ne l’attaque. Voici mon code :

                      La liste :

                          public void updateEntityActionState()
                      
                          {
                              super.updateEntityActionState();
                              List list = worldObj.getEntitiesWithinAABB(Entity.class, AxisAlignedBB.getAABBPool().getAABB(posX, posY, posZ, posX + 1, posY + 1, posZ + 1).expand(16D, 4D, 16D));
                              for(int i = 0; i<list.size(); i++)<br="">        {
                                  Entity entity = (Entity)list.get(i);
                                  if(!list.isEmpty())
                                  {
                                      this.setTarget(entity);
                      
                                      if(!(entity instanceof EntityChicken))
                                      {
                                      this.setTarget(entity);
                                      }
                      
                                      if(!(entity instanceof EntityCow))
                                      {
                                      this.setTarget(entity);
                                      }
                      
                                      if(!(entity instanceof EntityPig))
                                      {
                                      this.setTarget(entity);
                                      }
                                  }
                              }
                          }
                      

                      PS : le getAABBPool() est barré dans mon code
                      Et j’ai pensé que cela viendrait du Entity.class, mais j’ai changer par toute les classes possible ça ne change rien

                      Class entière :

                      import java.util.List;
                      
                      import net.minecraft.entity.Entity;
                      import net.minecraft.entity.SharedMonsterAttributes;
                      import net.minecraft.entity.monster.EntityMob;
                      import net.minecraft.entity.passive.EntityChicken;
                      import net.minecraft.entity.passive.EntityCow;
                      import net.minecraft.entity.passive.EntityPig;
                      import net.minecraft.util.AxisAlignedBB;
                      import net.minecraft.world.World;
                      
                      public class EntityMobKevin extends EntityMob
                      {
                      
                          public EntityMobKevin(World world)
                          {
                              super(world);
                          }
                      
                          public void applyEntityAttributes()
                          {
                              super.applyEntityAttributes();
                              this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(40D);
                              this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(4D);
                              this.getEntityAttribute(SharedMonsterAttributes.knockbackResistance).setBaseValue(0D);
                              this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.99846372D);
                          }
                      
                          public void updateEntityActionState()
                          {
                              super.updateEntityActionState();
                              List list = worldObj.getEntitiesWithinAABB(Entity.class, AxisAlignedBB.getAABBPool().getAABB(posX, posY, posZ, posX + 1, posY + 1, posZ + 1).expand(16D, 4D, 16D));
                              for(int i = 0; i<list.size(); i++)<br="">        {
                                  Entity entity = (Entity)list.get(i);
                                  if(!list.isEmpty())
                                  {
                                      this.setTarget(entity);
                      
                                      if(!(entity instanceof EntityChicken))
                                      {
                                      this.setTarget(entity);
                                      }
                      
                                      if(!(entity instanceof EntityCow))
                                      {
                                      this.setTarget(entity);
                                      }
                      
                                      if(!(entity instanceof EntityPig))
                                      {
                                      this.setTarget(entity);
                                      }
                                  }
                              }
                          }
                      }
                      

                      Merci d’avance :)</list.size();></list.size();>

                      Joueur PC Master Race :D
                      Config : MSI B85-G43 GAMING - Intel Core i5 4460 @3.2GHz - be Quiet! Pure Rock - 8 Go DDR3 CAS 9 - Saegate SSHD 1 To - Zotac GTX 960 - Cooler Master G550M - Creative Sound Blaster Z - Logitech G230 - Razer DeathAdder Chroma - BlueStork KEYZ#1 (Azerty) - Zalman Z11+ - Asus VE247H

                      1 Reply Last reply Reply Quote 0
                      • elias54
                        elias54 Administrateurs last edited by

                        Salut !
                        Pour commencer :
                        @‘zery59’:

                            public void updateEntityActionState()
                        
                            {
                                super.updateEntityActionState();
                                List list = worldObj.getEntitiesWithinAABB(Entity.class, AxisAlignedBB.getAABBPool().getAABB(posX, posY, posZ, posX + 1, posY + 1, posZ + 1).expand(16D, 4D, 16D));
                                for(int i = 0; i<list.size(); i++)<br="">        {
                                    Entity entity = (Entity)list.get(i);
                                    if(!list.isEmpty())
                                    {
                                        this.setTarget(entity);
                                        
                                        if(!(entity instanceof EntityChicken))
                                        {
                                        this.setTarget(entity);
                                        }
                                        
                                        if(!(entity instanceof EntityCow))
                                        {
                                        this.setTarget(entity);
                                        }
                                        
                                        if(!(entity instanceof EntityPig))
                                        {
                                        this.setTarget(entity);
                                        }
                                    }
                                }
                            }
                        ```</list.size();>
                        

                        Déjà là, tu as mis Entity.class tout en haut, c’est déconseillé… C’est une des principales raisons pour laquelle le mob s’attaque lui même.
                        La 2nde; est que si tu veux pas que ton mob s’attaque, ou attaque les autres monstre du même type que ton mob (en gros : que tous les MOBS_A ne s’attaquent pas entre eux) est de tout simplement faire une condition :

                        
                                        if(!(entity instanceof EntityTonMob))
                                        {
                                        this.setTarget(entity);
                                        }
                        

                        @‘zery59’:

                        PS : le getAABBPool() est barré dans mon code

                        Euh… Si tu es en 1.7.10, ce tuto est réservé uniquement pour la 1.7.2. Mais je peux te dire ce qui change en 1.7.10, il y a juste à faire AxisAlignedBB.getAxisAlignedBB(etc…) (ou un truc comme ça…)

                        Ensuite,
                        @‘zery59’:

                        
                                    if(!list.isEmpty())
                                    {
                                        this.setTarget(entity);
                                        
                                        if(!(entity instanceof EntityChicken))
                                        {
                                        this.setTarget(entity);
                                        }
                                        
                                        if(!(entity instanceof EntityCow))
                                        {
                                        this.setTarget(entity);
                                        }
                                        
                                        if(!(entity instanceof EntityPig))
                                        {
                                        this.setTarget(entity);
                                        }
                                    }
                        }
                        

                        Alors là, très gros fail…
                        Si tu veux que ton mob n’attaque pas les animaux, tu as juste à faire :

                        
                                        if(!(entity instanceof EntityAnimal))
                                        {
                                        this.setTarget(entity);
                                        }
                        

                        Et hop, problème reglé.
                        Mais ce n’est pas tout, tu as déjà mis un setTarget tout seul, juste après le if(!list.isEmpty())… Or, tu l’avais déjà mis dans plusieurs conditions (toutes inutiles, vu que je t’ai indiqué une solution simple et optimisé ci-dessus)

                        Essaye de corriger un peu le tout en suivant ce que je viens de te dire, si cela ne fonctionne pas, expliques-moi concrètement ce que tu cherches à faire, et je m’occuperais de te faire ça.

                        Mon site | GitHub

                        1 Reply Last reply Reply Quote 0
                        • zery59
                          zery59 last edited by

                          Ah, d’accord ! Débile comme j’étais, je croyais que je devais mettre dans la liste les mobs que mon mob devait ATTAQUER –’

                          J’ai corrigé tout ça, et tout fonctionne parfaitement ! Merci beaucoup elias54 !
                          Pour le .getAABBPool() barré, je suis bien en 1.7.2. et ma version de forge :  10.12.2.1131 et version FML : v7.2.213.1131 Bizzard

                          Joueur PC Master Race :D
                          Config : MSI B85-G43 GAMING - Intel Core i5 4460 @3.2GHz - be Quiet! Pure Rock - 8 Go DDR3 CAS 9 - Saegate SSHD 1 To - Zotac GTX 960 - Cooler Master G550M - Creative Sound Blaster Z - Logitech G230 - Razer DeathAdder Chroma - BlueStork KEYZ#1 (Azerty) - Zalman Z11+ - Asus VE247H

                          1 Reply Last reply Reply Quote 0
                          • O
                            Oeilomega last edited by

                            Salut, j’ai réussi à coder mon mob comme je le voulais et le seul problème c’est le getAxisAlignedBB qui est barré:

                            ​package fr.oeilomega.wozcontent.common;
                            
                            import java.util.List;
                            
                            import net.minecraft.entity.Entity;
                            import net.minecraft.entity.EntityCreature;
                            import net.minecraft.entity.SharedMonsterAttributes;
                            import net.minecraft.entity.monster.EntityMob;
                            import net.minecraft.entity.passive.EntityChicken;
                            import net.minecraft.entity.passive.EntityCow;
                            import net.minecraft.entity.passive.EntityPig;
                            import net.minecraft.entity.player.EntityPlayer;
                            import net.minecraft.util.AxisAlignedBB;
                            import net.minecraft.world.World;
                            
                            public class wozzombie extends EntityMob
                            {
                            public wozzombie(World world)
                            {
                            super(world);
                            }
                            
                            public void applyEntityAttributes()
                            {
                            super.applyEntityAttributes();
                            this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(20D);
                            this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(8D);
                            this.getEntityAttribute(SharedMonsterAttributes.knockbackResistance).setBaseValue(0D);
                            this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.8D);
                            
                            }
                            public void updateEntityActionState()
                            {
                            List list = worldObj.getEntitiesWithinAABB(EntityCreature.class, AxisAlignedBB.getAxisAlignedBB().getAABB(posX, posY, posZ, posX + 1, posY + 1, posZ + 1).expand(16D, 4D, 16D));
                            for(int i = 0; i< list.size(); i++)
                            {
                            Entity entity = (Entity)list.get(i);
                            if(!list.isEmpty())
                            {
                            if(!(entity instanceof EntityPlayer))
                            {
                            this.setTarget(entity);
                            }
                            }
                            }
                            super.updateEntityActionState();
                            }
                            }
                            

                            Merci d’avance !

                            1 Reply Last reply Reply Quote 0
                            • elias54
                              elias54 Administrateurs last edited by

                              Quel build de forge utilises-tu ?

                              Mon site | GitHub

                              1 Reply Last reply Reply Quote 0
                              • O
                                Oeilomega last edited by

                                J’utilise le build 1180

                                1 Reply Last reply Reply Quote 0
                                • conquerorguepard
                                  conquerorguepard last edited by

                                  Ce tuto est t-il utilisable pour 1.8.8?

                                  1 Reply Last reply Reply Quote 0
                                  • elias54
                                    elias54 Administrateurs last edited by

                                    Nope, il faut maintenant utiliser le système d’AI de Mojang.

                                    Mon site | GitHub

                                    1 Reply Last reply Reply Quote 0
                                    • conquerorguepard
                                      conquerorguepard last edited by

                                      Comment on fait? Y aura t-il un tuto :/?

                                      1 Reply Last reply Reply Quote 0
                                      • elias54
                                        elias54 Administrateurs last edited by

                                        C’est un peu plus simple en 1.8. Si j’ai le temps je ferai un tuto. Bien qu’il y a deux manières de le faire en 1.8. Si c’est juste un mob qui attaque simplement un autre mobs sans autre conditions particulière, UNE ligne suffit dans les tasks.addTask.

                                        Mon site | GitHub

                                        1 Reply Last reply Reply Quote 0
                                        • conquerorguepard
                                          conquerorguepard last edited by

                                          C’est laquelle cette ligne? Mon mob est prêt mais il ne bouge pas et n’attaque pas. Je ne sais pas si le fait qu’il bouge provienne de l’IA, mais j’aimerai bien en savoir plus car j’ai cherché un peu partout je n’ai pas trouvé de tuto 1.8 sur l’IA d’un mob.
                                          Et je cherche aussi la commande pour qu’il puisse pop de jour. Mais on n’arrive pas à me répondre clairement à l’aide d’exemple.

                                          1 Reply Last reply Reply Quote 0
                                          • Heaven
                                            Heaven last edited by

                                            Bonjour mon getAABBPool() est en rouge method is cannot resolved
                                            Peut tu m aider stp

                                            1 Reply Last reply Reply Quote 0
                                            • Referenced by  robin4002 robin4002 
                                            • Referenced by  robin4002 robin4002 
                                            • Referenced by  robin4002 robin4002 
                                            • 1 / 1
                                            • First post
                                              Last post
                                            Design by Woryk
                                            Contact / Mentions Légales

                                            MINECRAFT FORGE FRANCE © 2018

                                            Powered by NodeBB