Flèche explosive.



  • Bonsoir,
    Je cherche a faire une flèche explosive.
    Lorsque la flèche touche une entity cela créer une explosion.

    Plusieurs questions:

    • J'aimerais faire simple donc esque le plus simple est de créer une entity ?
    • Si oui quelle fonction je peux prendre pour que quand la flèche touche l'entity une explosion apparaisse .

    Merci d'avance.



  • Oui il faut créer une entité (recopie la flèche), après pour l'explosion je crois que c'est onImpact.

    Envoyé de mon RAINBOW LITE 4G en utilisant Tapatalk



  • Méthode alternative :

    Tu fais spawn ton entity arrow dans la classe de ton bow et tu lui enregistres une valeur booléenne dans ses tags. Ensuite tu enregistres une classe d'event dans laquelle se trouveront :

    • L'event LivingHurtEvent et LivingDeathEvent ou tu instanceof l'entity du damagesource pour voir si il s'agit d'une EntityArrow et si dans ses tags on y retrouve ton boolean. Si c'est le cas, tu crées l'explosion avec l'instance du world
    • Si la flèche touche un block, elle est censé mourrir mais comme la flèche est une entity, et non une entity living, l'event LivingDeathEvent ne sera pas fired. Donc je te propose un tick handler (WorldEvent.TickEvent), où tu vas parcourir la liste World#loadedEntityList et voir à chaque index si l'entity concernée est une flèche/est morte (en s'écrasant contre un block) et possède le boolean stacké dans les tag. Si toutes ces conditions sont réunies, alors tu génères l'explosion.

    Cette solution peut te paraître + difficile que celle proposée par mon @VDD, mais l'avantage est que si tu souhaites créer plein de flèches aux effets différents dans l'avenir de ton mod, alors ce sera mieux de procéder ainsi, plutôt que de créer cinquante milles classes EntityArrow et RenderArrow (je dis cela car connaissant tes compétences, je suis quasi-sûr que tu ferais comme ça, et que tu laisserais l'héritage de côté, après, peut-être que je me trompe :o). Bref fais ce que tu veux 😃

    @AymericRed
    Ce serait la fonction onImpact seulement si il choisit de faire hériter sa classe de EntityThrowable. Dans le cas où il décide de faire à la sauce de la classe déjà existante EntityArrow (classe fille de Entity), il faudrait alors gérer l'impacte dans onLivingUpdate()



  • @'Plaigon':

    Méthode alternative :

    Tu fais spawn ton entity arrow dans la classe de ton bow et tu lui enregistres une valeur booléenne dans ses tags. Ensuite tu enregistres une classe d'event dans laquelle se trouveront :

    • L'event LivingHurtEvent et LivingDeathEvent ou tu instanceof l'entity du damagesource pour voir si il s'agit d'une EntityArrow et si dans ses tags on y retrouve ton boolean. Si c'est le cas, tu crées l'explosion avec l'instance du world
    • Si la flèche touche un block, elle est censé mourrir mais comme la flèche est une entity, et non une entity living, l'event LivingDeathEvent ne sera pas fired. Donc je te propose un tick handler (WorldEvent.TickEvent), où tu vas parcourir la liste World#loadedEntityList et voir à chaque index si l'entity concernée est une flèche/est morte (en s'écrasant contre un block) et possède le boolean stacké dans les tag. Si toutes ces conditions sont réunies, alors tu génères l'explosion.

    Cette solution peut te paraître + difficile que celle proposée par mon @VDD, mais l'avantage est que si tu souhaites créer plein de flèches aux effets différents dans l'avenir de ton mod, alors ce sera mieux de procéder ainsi, plutôt que de créer cinquante milles classes EntityArrow et RenderArrow (je dis cela car connaissant tes compétences, je suis quasi-sûr que tu ferais comme ça, et que tu laisserais l'héritage de côté, après, peut-être que je me trompe :o). Bref fais ce que tu veux 😃

    @AymericRed
    Ce serait la fonction onImpact seulement si il choisit de faire hériter sa classe de EntityThrowable. Dans le cas où il décide de faire à la sauce de la classe déjà existante EntityArrow (classe fille de Entity), il faudrait alors gérer l'impacte dans onLivingUpdate()

    Bah écoute je suis partant pour ta proposition et tu as raison, je vais essayer de faire la base je reviens vers vous si je suis bloqué!

    edit:
    [font=Ubuntu, sans-serifune valeur booléenne dans ses tags.]

    [font=Ubuntu, sans-serifC'est à dire ?]

    [font=Ubuntu, sans-serifJ'ai oublier de précisé aussi mais je veux garder la flèche de base .]
    [font=Ubuntu, sans-serifAvoir une flèche explosive et normale]



  • Ne t'inquiètes pas tu les auras toujours.
    Je voulais dire par là, faire un entityArrow.getEntityData().setBoolean("isExplosive", true);

    Revois les bases et les NBT's si tu veux partir sur mon alternative, sinon tu ne t'en sortiras pas 😉



  • @'Plaigon':

    Ne t'inquiètes pas tu les auras toujours.
    Je voulais dire par là, faire un entityArrow.getEntityData().setBoolean("isExplosive", true);

    Revois les bases et les NBT's si tu veux partir sur mon alternative, sinon tu ne t'en sortiras pas 😉

    Alors j'ai fais ça:

    class FlameBow:

    if(!world.isRemote){
                entityarrow.getEntityData().setBoolean("isExplosive", true);
                world.spawnEntityInWorld(entityarrow);
                System.out.println("flèches explosive");
               }
    

    Event:

    
    public void onLivingHurt(LivingHurtEvent event){
    
    EntityArrow entityarrow = new EntityArrow(Minecraft.getMinecraft().theWorld);
    
    if(event.source instanceof DamageSource && entityarrow.getEntityData().getBoolean("isExplosive") == true)
    {
    System.out.println("Hurt");
    event.entity.worldObj.newExplosion((Entity)null, event.entityLiving.posX, event.entityLiving.posY, event.entityLiving.posZ, 1, true, event.entity.worldObj.getGameRules().getGameRuleBooleanValue("mobGriefing"));
    }
    
    }
    
    public void onLivingDeath(LivingDeathEvent event){
    
    EntityArrow entityarrow = new EntityArrow(Minecraft.getMinecraft().theWorld);
    
    if(event.source instanceof DamageSource && entityarrow.getEntityData().getBoolean("isExplosive") == true)
    {
    System.out.println("Death");
    event.entity.worldObj.newExplosion((Entity)null, event.entityLiving.posX, event.entityLiving.posY, event.entityLiving.posZ, 1, true, event.entity.worldObj.getGameRules().getGameRuleBooleanValue("mobGriefing"));
    }
    
    }
    

    J'ai pas réussi a récupéré le damageSource de l'EntityArrow.


  • Moddeurs confirmés Rédacteurs Administrateurs

       @SubscribeEvent
       public void onLivingHurt(LivingHurtEvent event)
       {
           if(event.source.getSourceOfDamage() instanceof EntityArrow && event.source.getSourceOfDamage().getEntityData().getBoolean("isExplosive"))
           {
               System.out.println("Hurt");
               event.entity.worldObj.newExplosion((Entity)null, event.entityLiving.posX, event.entityLiving.posY, event.entityLiving.posZ, 1, true, event.entity.worldObj.getGameRules().getGameRuleBooleanValue("mobGriefing"));
           }
       }
    


  • @'robin4002':

       @SubscribeEvent
       public void onLivingHurt(LivingHurtEvent event)
       {
           if(event.source.getSourceOfDamage() instanceof EntityArrow && event.source.getSourceOfDamage().getEntityData().getBoolean("isExplosive"))
           {
               System.out.println("Hurt");
               event.entity.worldObj.newExplosion((Entity)null, event.entityLiving.posX, event.entityLiving.posY, event.entityLiving.posZ, 1, true, event.entity.worldObj.getGameRules().getGameRuleBooleanValue("mobGriefing"));
           }
       }
    

    Ah ok fallait un getSourceOfDamage ^^ et le == true a la fin du boolean n'est pas obligatoire ?
    En tout cas merci 🙂


  • Moddeurs confirmés Rédacteurs

    Non il n'est pas obligatoire, tester si une variable vaut true ça revient à tester à ça :

    
    if(variable == true) {
    
    }
    
    

    Cas où la variable vaut true :

    
    if(true == true) {
    
    }
    
    

    Donc il suffit de mettre :

    
    if(variable) {
    
    }
    
    

    Ce qui donnera :

    
    if(true) {
    
    }
    
    

    Même résonnement si la variable vaut false



  • D'acc 🙂


Log in to reply