Régénération d'un mob aux contact d'autres



  • Bonjour tout le monde ! C'est AlphaSwittleTeam pour un petit tuto sur comment faire régénérer des points de vie à un mob au contact d'autres !

    Sommaire :

    • Pré-requis
    • Au contact d'autres ? Gné o_O ?
    • Un peu de théorie.
    • Enfin la pratique !

    Pré-requis

    • Connaître un peu le Java.
    • Savoir faire un mob simple.

    Au contact d'autres ? Gné o_O ?

    Vous vous demandez ce que je veut dire par au contact d'autres ? Je veut dire que si par exemple votre mob est un boss (pharaon), et que ses sous-fifres (momies) sont à cotés de lui, il récupéreras de la vie !

    Un peu de théorie.

    Bon , voici la partie la plus ennuyeuse du tuto :D. Cette partie est certe ennuyeuse (et pour les flemmards, vous pouvez la passer), mais elle est importante pour comprendre la suite du tuto. Alors, allons-y !

    Premièrement, de quoi allons-nous avoirs besoin ?

    • La classe du mob "chef"
    • La classe du mob "sous-fifre"

    Nous avons aussi besoin d'une méthode qui s'exécute à chaque tick de l'entitée. Quoi de mieux dans ce cas que le onLivingUpdate() ?

    Nous n'aurons pas besoin de modifier la classe du "sous-fifre", seulement celle du chef 😉

    Enfin la pratique !

    Alors, prêts ? 1, 2, 3… Allons-y !

    Ouvrez la classe de votre mob "chef", et allez dans la fonction onLivingUpdate(), comme ceci :

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

    Bien ! C'est facile pour l'instant mais ça se corse 😄

    Dans la méthode ci-dessus, ajoutez ce bout de code :

    this.getEntitiesNearby(this.worldObj, this.posX, this.posY, this.posZ);
    

    Expliquons ce code :

    -Le worldObj est l'instance de l'objet World présent dans chaque mob.
    -Les 3 autres paramètres sont les coordonnées qu'on utiliseras plus tard.

    Vous devriez avoir une erreur : ne vous inquiétez pas, c'est normal, nous n'avons pas encore créer la méthode getEntitiesNearby().
    Remédions à cela et créons la, voulez vous ?

    private void getEntitiesNearby(World world, double currentPosX, double currentPosY, double currentPosZ)
    {
    }
    

    Réglons les paramètres pour qu'ils soient utilisables :

    private void getEntitiesNearby(World world, double currentPosX, double currentPosY, double currentPosZ)
    {
        currentPosX = this.posX;
        currentPosY = this.posY;
        currentPosZ = this.posZ;
    }
    

    Passons maintenant à la partie dure du tuto !

    Pour avoir un objet List de toutes les entitées dans un rayon donné, nous allons utiliser un objet AxisAlignedBB !

    List entitiesNearby = world.getEntitiesWithinAABB(VotreSousFifre.class, AxisAlignedBB.getBoundingBox(currentPosX, currentPosY, currentPosZ, currentPosX + 32, currentPosY + 32, currentPosZ + 32));
    

    Dans cet exemple, le mob aura une sphère de sélection invisible de 32 blocs !

    Maintenant, je veut faire que plus il y a d'entitées, plus le mob régénère ! Cela est possible à l'aide d'une boucle for :

    for (float i = 0; i <= mummiesNearby.size(); i++)
    {
    
    }
    

    Maintenant, il suffit de vérifier qu'on est sur le coté serveur, et de heal le mob !

    if (!this.worldObj.isRemote)
    {
        this.heal(i);
    }
    

    Et voila ! Notre méthode est finie ! Vous devriez avoir ça :

    private void getEntitiesNearby(World world, double currentPosX, double currentPosY, double currentPosZ)
    {
        currentPosX = this.posX;
        currentPosY = this.posY;
        currentPosZ = this.posZ;
        List entitiesNearby = world.getEntitiesWithinAABB(VotreSousFifre.class, AxisAlignedBB.getBoundingBox(currentPosX, currentPosY, currentPosZ, currentPosX + 32, currentPosY + 32, currentPosZ + 32));
    
        for (float i = 0; i <= mummiesNearby.size(); i++)
        {
            if (!this.worldObj.isRemote)
            {
                this.heal(i);
            }
        }
    }
    

    Et voila c'est fini ! A bientôt les amis !


  • Administrateurs

    currentPosX = this.posX;
    currentPosY = this.posY;
    currentPosZ = this.posZ;
    

    Ceci ne sert à rien, car tu as déjà appelé la méthode avec les mêmes valeurs.

    Sinon le tutoriel est pas mal, le seul problème c'est que je ne le trouve pas assez général, et donc je me demande s'il va servir à beaucoup de personne.



  • Oui je sais mais je me suis rendu compte que ça ne mets pas les valeurs que je veut 😞

    Et pour le tuto, oui je sais que c'est pas général mais bon ça peut toujours servir !

    Et j'aurais une question : est ce que se serait utile de faire un tuto pour coder plusieurs mods en meme temps en 1.7 ? quand je dis coder plusieurs mods je veut dire avoir chaque mod séparément 😄


  • Administrateurs

    Ça peut toujours servir oui, je compte aussi faire un tutoriel pour faire un setup comme je le fait moi quand j'aurai plus avancé dans les autres tuto.



  • Oki donc pas la peine que je le fasse moi ?


  • Administrateurs

    Ça dépend, on a peut être pas la même façon de faire et mon tuto va mettre du temps à sortir.



  • Ok alors je ferais quand j'aurais le temps 😉



  • Salut,

    Déjà merci pour ce tuto 🙂 ! Cependant j'aurai une petite question, tout marche comme il faut, mais comment peut t-on ajouter un effet de cœur sur le mob "chef" afin de montrer aux joueurs que le mob est entrain de se régénérer ?
    Car pour le moment il se régénère, mais les joueurs ne peuvent "pas le savoir" ! J'aimerai donc rajouter un effet visuel ^^' !

    Merci d'avance 🙂 !


  • Administrateurs

    Tu peux utiliser world.spawnParticule pour faire apparaitre des particules de cœurs.



  • Merci, de l'info mais .. peut tu me dire comment l'incorporer dans le code du mob car je ne vois pas bien comment faire 😕


  • Administrateurs

    Il suffit de le mettre au même endroit que la fonction heal. Après tu peux regarder le code four ou d'autre truc de mc qui font des particules pour un exemple d'utilisation de cette fonction.



  • import java.util.List;
    
    import net.minecraft.entity.SharedMonsterAttributes;
    import net.minecraft.entity.monster.EntityMob;
    import net.minecraft.entity.monster.EntityZombie;
    import net.minecraft.util.AxisAlignedBB;
    import net.minecraft.world.World;
    
    public class BlastOrg extends EntityMob {
    
    public BlastOrg(World world) 
    {
    super(world);
    }
    
    public void applyEntityAttributes()
    {
    super.applyEntityAttributes();
    this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(20D);
    this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(6D);
    this.getEntityAttribute(SharedMonsterAttributes.knockbackResistance).setBaseValue(1D);
    this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.8D);
    
    }
    
    public void onLivingUpdate()
    {
    super.onLivingUpdate();
    this.getEntitiesNearby(this.worldObj, this.posX, this.posY, this.posZ);
    }
    
    private void getEntitiesNearby(World world, double currentPosX, double currentPosY, double currentPosZ) 
    {
    currentPosX = this.posX;
    currentPosY = this.posY;
    currentPosZ = this.posZ;
    List entitiesNearby = world.getEntitiesWithinAABB(EntityZombie.class, AxisAlignedBB.getBoundingBox(currentPosX, currentPosY, currentPosZ, currentPosX + 32, currentPosY + 32, currentPosZ + 32));
    
    for (float i = 0; i <= entitiesNearby.size(); i++)
    {
    if (!this.worldObj.isRemote)
    {
    this.heal(i);
    worldObj.spawnParticle("heart", (double)(0.5F + 0.6F), (double)0.7F, (double)(0.7F - 0.6F), 0.0D, 0.0D, 0.0D);
    }
    
    }
    
    }
    
    }
    
    


  • Déso du double post, mais j'ai essayé de faire comme tu m'a dit, mais les particules n'apparaissent pas sur le mob "chef" au contact des autres 😕


  • Administrateurs

    spawnParticle est une méthode qui n'a que effet côté client il me semble, il faudrait donc le sortir de la condition if (!this.worldObj.isRemote)



  • Bha je cherche je cherche, mais aucun résultat concluant pour le moment 😕 !
    Si jamais t'a un morceau de code qui marche je suis preneur, en attendant je continu de chercher, j’éditerai ce post si je trouve.

    [Si je trouve je placerai le morceau de code, comme ça si quelqu'un en a besoin il pourra trouver le morceau de code 🙂 ]



  • Regardes dans referenced libraries ensuite forge et ensuite dans un package qui se finit par block recherche dans BlockFurnace.java



  • J'ai déjà cherché, j'ai déjà trouver la partie du code du four mais pas moyen d'arriver à l'adapter pour le mob



  • Pour moi c'est plus un exemple qu'un tutoriel.
    Par contre, il y a des truc qui ne servent a rien comme l'a dit Robin.

    ​private void getEntitiesNearby(World world, double currentPosX, double currentPosY, double currentPosZ)
    
    {
    currentPosX = this.posX;
    currentPosY = this.posY;
    currentPosZ = this.posZ;
    
    List entitiesNearby = world.getEntitiesWithinAABB(VotreSousFifre.class, AxisAlignedBB.getBoundingBox(currentPosX, currentPosY, currentPosZ, currentPosX + 32, currentPosY + 32, currentPosZ + 32));
    }
    

    Ça typiquement ça ne sert a rien, ça a l'air d'être faux et c'est une erreur de conception orientée objet.
    C'est pas propre du tout, ça duplique des variables, ça rend le code illisible, en tout cas pas clair du tout.

    Normalement le code de ta fonction devrais juste être :

    ​​private List <entity>getEntitiesNearby()
    {
    
    return this.worldObj.getEntitiesWithinAABB(VotreSousFifre.class, AxisAlignedBB.getBoundingBox(this.posX, this.posY, this.posZ, this.posX + 32, this.posY + 32, this.posZ + 32));
    }
    

    Mais vu que tu n'as qu'une seule instruction dans ta fonction et que la visibilité de celle-ci est privée, ça ne sert a rien de faire une fonction pour ça. Autant directement écrire l'instruction dans [size=xx-smallonLivingUpdate()]

    Edit : je n'avais pas vu que tu avais mis le heal dans la fonction getEntitiesNearby(), c'est encore pire du coup puisque la fonction n'a pas un nom correct. Déjà faire un assesseur qui retourne void c'est louche, mais getEntitiesNearby() veut bien dire "obtenir les entités à proximités" et pas faire le calcul des entités puis soigner au cas ou. Il faut mettre ton code au propre.</entity>