Mob custom qui meurt en spawnant



  • Bonjour, je suis en train d'apprendre le modding Forge et suis donc en train de créer un mod contenant un exemple de "tout" ce que l'on peut faire, avec des commentaires. Ayant déjà de bonnes bases en Java, il s'agit principalement de "vocabulaire". Bref. 😛

    Mon problème est la création d'une entité (pour le moment) basique de type Biped. J'ai pour cela suivi divers tutos et la doc. Mon mob ne spawn pas naturellement, uniquement grâce a un œuf. Cependant, lorsque j'utilise ce dernier le mob apparaît déjà mort :s

    Au fait je suis en 1.6.4, Forge 9.11.1..964

    RESOLU : ne faites pas comme moi : écoutez elias54 !

    Voici ma classe :

    
    import net.minecraft.entity.EnumCreatureAttribute;
    import net.minecraft.entity.SharedMonsterAttributes;
    import net.minecraft.entity.ai.EntityAISwimming;
    import net.minecraft.entity.ai.EntityAIWander;
    import net.minecraft.entity.ai.EntityAIWatchClosest;
    import net.minecraft.entity.monster.EntityMob;
    import net.minecraft.entity.player.EntityPlayer;
    import net.minecraft.world.World;[/bt]
    
    public class CustomMob extends EntityMob
    {
       private double movementSpeed = 0.7D;
       private double knockbackResistance = 1.0D;
       private double attackDamage = 1.0D;
       private double maxHealth = 20.0D;
       public String  name = "Aerath44";
    
       public CustomMob(World world)
       {
           super(world);
    
           this.setSize(1.5F, 2.0F);
    
           this.getNavigator().setAvoidsWater(true);
    
           this.tasks.addTask(0, new EntityAISwimming(this));
           this.tasks.addTask(1, new EntityAIWander(this, 0.5D));
           this.tasks.addTask(2, new EntityAIWatchClosest(this, EntityPlayer.class, 150.0F));
       }
    
       @Override
       protected void applyEntityAttributes()
       {
           super.applyEntityAttributes();
    
           this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setAttribute(maxHealth);
           this.getEntityAttribute(SharedMonsterAttributes.knockbackResistance).setAttribute(knockbackResistance);
           this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setAttribute(movementSpeed);
       }
    
       public EnumCreatureAttribute getCreatureAttribute()
       {
           return EnumCreatureAttribute.UNDEFINED;
       }
    
       @Override
       protected boolean isValidLightLevel()
       {
           return true;
       }
    
       protected boolean isAIEnabled()
       {
           return true;
       }
    
       protected boolean canDespawn()
       {
           return true;
       }
    }
    
    

    Je suppose qu'il apparaît avec 0❤ mais normalement un mob sans vie disparaît simplement non :huh:
    En tout cas je l’avais constaté il y a quelques temps.



  • dans ce ce bout de code ->

    
    this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setAttribute(maxHealt?h);
    this.getEntityAttribute(SharedMonsterAttributes.knockbackResistance).setAttribut?e(knockbackResistance);
    this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setAttribute(move?mentSpeed);
    
    

    teste ".setBaseValue" aulieux de ".setAttribute"



  • Wow, quelle rapidité o_0
    Malheureusement, cette fonction n'existe pas pour moi. (Elle date de la 1.7 je crois)


  • Administrateurs

    Déjà deux gros problèmes :

    
    private double movementSpeed = 0.7D;
    private double knockbackResistance = 1.0D;
    private double attackDamage = 1.0D;
    private double maxHealth = 20.0D;
    public String name = "Aerath44";
    
    

    et

    
    @Override
    protected void applyEntityAttributes()
    {
    super.applyEntityAttributes();
    
    this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setAttribute(maxHealth);
    this.getEntityAttribute(SharedMonsterAttributes.knockbackResistance).setAttribute(knockbackResistance);
    this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setAttribute(movementSpeed);
    }
    
    

    Quel intérêt de déclarer des fields alors que tu peux mettre directement la valeur ?



  • Je prépare d'autres mobs donc je vais ajouter deux constructeurs à cette classe qui permettront de faire :
    … = new CustomMob(world, 0.7D, 1.0D, 1.0D, 20.0D, "Aerath44");
    ou
    ... = new CustomMob(world, 0.7D, 1.0D, 1.0D, 20.0D);


  • Moddeurs confirmés Rédacteurs Administrateurs

    ça ne serait pas ça :

    public EnumCreatureAttribute getCreatureAttribute()
    {
    return EnumCreatureAttribute.UNDEFINED;
    }
    

    Qui cause problème ?



  • Ah effectivement… Mais non. J'ai essayé d'enlever toute la fonction, ça n'a rien changé. J'ai changé à UNDEAD, rien non plus.
    Comme il n'y a pas d'attribut autre que UNDEAD et ARTHROPOD, j'ai supposé qu'il fallait UNDEFINED pour avoir ni l'un ni l'autre.



  • PS : lorsque j’enlève la ligne ```java
    this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setAttribute(maxHealt​h);

    De plus si je quitte le monde avec ces mobs, puis que je remet cette ligne le problème revient mais les mobs existants restent.


  • C'est bizarre… Fait des System.out.println(maxHealth); un peu partout. Si ton entité meurt en spawnant c'est que max Health est égal à 0. Comment tu as enregistré ton entité ?


  • Administrateurs

    @'Aerath':

    Je prépare d'autres mobs donc je vais ajouter deux constructeurs à cette classe qui permettront de faire :
    … = new CustomMob(world, 0.7D, 1.0D, 1.0D, 20.0D, "Aerath44");
    ou
    ... = new CustomMob(world, 0.7D, 1.0D, 1.0D, 20.0D);

    Sauf que ce n'est pas possible.



  • Et pourquoi ? Bien entendu, je dois les enregistrer une par une mais à par ça je vois pas le problème.

    Zak : depuis la fonction Init : j'appelle la fonction suivante placée dans mon proxy commun :

    public void registerEntities()
    {
    EntityRegistry.registerGlobalEntityID(CustomMob.class, "template_Mob", EntityRegistry.findGlobalUniqueEntityId(), new Color(0, 255, 0).getRGB(), new Color(255, 0, 0).getRGB());
    EntityRegistry.registerModEntity(CustomMob.class, "template_mob", 420, Sanctumine.instance, 40, 1, true);
    }
    

    Quand à l'idée de logger la vie, ça n'as rien donné :
    System.out.println(this.getMaxHealth() + "nom pour se repérer");
    me retourne 0.0 que ce soit dans le constructeur ou dans applyEntityAttributes().


  • Moddeurs confirmés Rédacteurs Administrateurs

    Heu 420 ça m'a pas l'air bon, essaye avec une autre id plus faible ( < 255)


  • Administrateurs

    Les ID des mobs apparemment je viens de vérifier : pas de limite…
    Mais en ce qui concerne tes fields dans ta classe, ils retournent bien 0.0D ... le système d'Attributes de mojang ne semble pas aimer.



  • Elias pourrait-tu m'expliquer en quoi le fait d'utiliser des fields et/ou un constructeur comme je l'ai suggéré poserait problème ? J'ai dû passer à coté d'un truc important ^^'


  • Moddeurs confirmés Rédacteurs Administrateurs

    Ah en effet, elias a raison. Tu pourra jamais faire ça :
    @'Aerath':

    Je prépare d'autres mobs donc je vais ajouter deux constructeurs à cette classe qui permettront de faire :
    … = new CustomMob(world, 0.7D, 1.0D, 1.0D, 20.0D, "Aerath44");
    ou
    ... = new CustomMob(world, 0.7D, 1.0D, 1.0D, 20.0D);

    Pour la simple est bonne raison que dans ton code, tu n'aura jamais à spécifier le constructeur du mob. Pour le faire spawner (que ce soit via un œuf ou le spawn naturel) minecraft utilise le constructeur qui contient juste word, donc tes variables n'auront pas la bonne valeur ce qui explique les problèmes rencontrés.



  • Je vois… Dommage. Je teste ça dès que possible.


    Effectivement, l'utilisation de fields dans les fonctions .setAttribute() ne fonctionne pas... Comme ne cessait de me le répéter Elias >_<
    Merci pour votre patience à tous 🙂


Log in to reply