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


  • Administrateurs

    ***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... ^^'


  • Administrateurs

    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.



  • 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 🙂


  • Modérateurs

    @'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 >.>


Log in to reply