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

    Créer un mob avec une simple AI (sans utiliser tasks.addTask)

    Les entités
    1.6.x
    3
    4
    5120
    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.
    • elias54
      elias54 Administrateurs dernière édition par robin4002

      ***Créer un mob avec une simple AI : ***

      Dans ce tutoriel, nous allons apprendre à fabriquer un mob qui aura une simple IA (Intelligence Artificielle).
      Nous ferons plus précisément une AI qui ordonnera le mob de suivre le joueur ! (Sans utiliser les fameux tasks.addTasks que vous pouvez notamment retrouver dans la class EntityZombie et autres)

      Pour commencer, il vous faut au moins la base de votre mob. (Je ne vous refais pas le tuto là dessus, allez voir mon autre tuto dans cette même section que j’ai fait spécialement pour. :D)

      Une fois la base de votre mob fait, ajoutez cette méthode en dessous de votre constructeur :

      public void onLivingUpdate()
      {
      }
      

      Pour l’instant, elle n’est pas reconnu… Il faut donc ajouter cette ligne dans celle ci :

      super.onLivingUpdate();
      

      Résultat, vous devez avoir la méthode qui doit ressembler à ça :

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

      Là, nous venons d’ajouter la fonction qui permet d’exécuter quelque chose pendant que le mob marche. (C’est donc là précisément où nous allons entrer notre code)
      C’est en quelque sorte un “Living Update Mob Event” (ça n’existe pas, inutile de chercher dans les class xD)

      Bref ! Passons donc au vif du sujet ! :3

      Faites de la place entre l’accolade “{” et la ligne super.onLivingUpdate();.
      Ensuite, nous allons déclarer ce dont on aura besoin, ajoutez ces lignes là où vous avez fait de la place (donc entre l’accolade “{” et super.blablabla de onLivingUpdate() ) :

      Minecraft mc = Minecraft.getMinecraft();
      EntityPlayer player = mc.thePlayer;
      PathEntity pathentity;
      

      Minecraft mc = Minecraft.getMinecraft();
      EntityPlayer player = mc.thePlayer;
      PathEntity pathentity;

      Ce sont précisément ces 3 déclarations dont nous auront besoin pour la suite du tuto, vérifiez si vous en avez loupé aucun ! (Il y en a que 3, donc cela devrait être facile ^^)

      Nous allons maintenant ajouter une ligne très importante, une ligne qui va vérifier si il y a un joueur près du mob, ou plutôt, une condition :

      if(player != null)
      {
      }
      

      Donc si on lit de manière brut :
      Si “player” n’est pas égal à “null”, effectuer ce qu’il y a entre les accolades.

      Maintenant, nous allons ajouter un float qui détermine la distance du joueur à l’entité (mob).

      Donc, cette ligne (DANS LA CONDITION JE PRECISE !)

      float f = player.getDistanceToEntity(this);
      

      Donc avant d’attaquer la suite, je veux vérifier que vous ayez exactement le code dans cette forme :

      public void onLivingUpdate()
      {
          Minecraft mc = Minecraft.getMinecraft();
          EntityPlayer player = mc.thePlayer;
          PathEntity pathentity;
          if(player != null)
          {
              float f = player.getDistanceToEntity(this);
          }
          super.onLivingUpdate();
      }
      

      Si vous avez mis le float au dessus de “if(player != null)” le jeu risque de crash.

      Maintenant, nous allons ajouter LE morceau de code qui va permettre au mob de suivre le joueur. Donc, CE code :

      if(f > 3F && f < 20F)
      {
          pathentity = worldObj.getPathEntityToEntity(this, player, 16F, true, false, false, true);
      }else {
          pathentity = null;
      }
      

      Donc pour traduire le code ci-dessus :

      si “f” est plus grand que la valeur “3” ET “f” plus petit que la valeur 20, exécuter ce qu’il y a entre les accolades, donc “pathentity = worldObj.getPathEntityToEntity blablabla” SINON : pathentity = null

      Voilà, je vous ai expliqué le fonctionnement de la condition.

      Maintenant, je vais vous expliquer à quoi sert les deux “pathentity” utilisés dans le “if” et dans le “else”

      pathentity = worldObj.getPathEntityToEntity(this, player, 16F, true, false, false, true);

      worldObj.getPathEntityToEntity : la fonction getPathEntityToEntity est appelée dans worldObj

      this, player : pour faire simple : “this” doit suivre “player” NE JAMAIS TOUCHER A “this”, mais en revanche, vous pouvez changer “player” par une autre entité !

      16F : détermine la distance à la quelle le mob détecte le joueur.

      Pour le reste, laissez comme c’est, sinon, l’AI ne fonctionnera pas. 😕

      *Pour finir : *

      pathentity = null : rien qu’en lisant, vous devez comprendre ^^.

      BON ! Maintenant que nous avons “déchiqueté” le code pour en apprendre davantage, nous allons passer à la dernière ligne à AJOUTER à LA FIN DU “if(player != null)” ! (juste au dessus de super.onLivingUpdate(); encore… 🙂 )

      setPathToEntity(pathentity);
      

      Cette ligne permet de valider ce que nous avons codé au dessus !

      Normalement, la classe entière devrait ressembler à ça :

      package ModTest.common;
      
      import net.minecraft.client.Minecraft;
      import net.minecraft.entity.EntityCreature;
      import net.minecraft.entity.player.EntityPlayer;
      import net.minecraft.pathfinding.PathEntity;
      import net.minecraft.world.World;
      
      public class EntityMobRideableTest extends EntityCreature
      {
          public EntityMobRideableTest(World world)
          {
              super(world);
          }
      
          public void onLivingUpdate()
          {
              Minecraft mc = Minecraft.getMinecraft();
              EntityPlayer player = mc.thePlayer;
              PathEntity pathentity;
              if(player != null)
              {
                  float f = player.getDistanceToEntity(this);
                  if(f > 3F && f < 20F)
                  {
                      pathentity = worldObj.getPathEntityToEntity(this, player, 16F, true, false, false, true);
                  }
                  else
                  {
                      pathentity = null;
                  }
                      setPathToEntity(pathentity);
              }
              super.onLivingUpdate();
          }
      }
      

      Bien sur, pour la vie, la texture, etc… c’est comme vous voulez ! x)
      –---------

      Ça sera tout pour ce tutoriel. 🙂

      Merci de donner un petit point de réputation si vous avez aimé ce tutoriel ! 🙂 Je ne peux malheureusement pas donner un screenshot du résultat, une vidéo serait plus convenable… 😕 Mais flemmard comme je suis… ^^’

      Mon site | GitHub

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

        Tutoriel mis à jour pour la 1.6.2 ! Le code fonctionne de la même manière. Pour la vie du mod/texture, merci de vous rendre sur mon tutoriel sur la création de mob basique.

        Mon site | GitHub

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

          Bonjour ! Est-ce que c’est possible de remplacer le :

          this, player,
          

          par : (Exemple)

          this, EntitySheep,
          

          Ou quelque chose comme ça ? J’ai essayer de faire :

          EntitySheep sheep = mc.thePlayer;
          

          Mais ça fonctionne pas 😞

          Merci si vous trouvez la solution 🙂

          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 réponse Dernière réponse Répondre Citer 0
          • jglrxavpok
            jglrxavpok Modérateurs dernière édition par

            @‘zery59’:

            Bonjour ! Est-ce que c’est possible de remplacer le :

            this, player,
            

            par : (Exemple)

            this, EntitySheep,
            

            Ou quelque chose comme ça ? J’ai essayer de faire :

            EntitySheep sheep = mc.thePlayer;
            

            Mais ça fonctionne pas 😞

            Merci si vous trouvez la solution 🙂

            Là, va juste falloir que tu revois tes bases de Java, mc.thePlayer est une variable de type EntityPlayer, pas EntitySheep >.>

            Modérateur sur MFF. 
            Mon Github: http://github.com/jglrxavpok
            Mon compte Steam si vous voulez jouer à CS:GO ou TF2 avec moi: https://steamcommunity.com/id/jglrxavpok/

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

            MINECRAFT FORGE FRANCE © 2018

            Powered by NodeBB