Ramassage d'item…



  • Bonjour,
    Savez vous quelle est la fonction qui est appelé lorsequ'on ramasse un item, à ajouter dans la classe de celui-ci?
    Il s'agit en fait d'une bombe, et il me faut reinitialiser le temps_avant_l'explosion lorsequ'on la ramasse, car en plus sinon apres j'ai modifier le drop de l'item qui m'empeche de relancer d'autre bombes avant que le compte a rebours n'ai atteint 0….
    En bref, soit je rendre l'item irramassable, soit je trouve le truc à ajouter pour modifier le ramassage. Et je ne sais, ni l'un, ni l'autre.. 😞
    Merci d'avance!


    si ça vous aide a comprendre, je peux vous passer ma classe d'item, apres tout c sur ce forum que j'ai (presque) tout appris en modding, alors filer mes classes...



  • What?! Je ne croit rien avoir changé, mais je ne peux plus ramasser l'item, et il est limite buggé… il reste suspendu en l'air a l'emplacement de ma tête au moment ou je l'ai droppé... pourtant j'ai la dernière version de forge?! Quelqu'un peut m'expliquer ce prodige?
    voici mon code:

    
    import java.util.List;
    
    import net.minecraft.entity.Entity;
    import net.minecraft.entity.item.EntityItem;
    import net.minecraft.entity.player.EntityPlayer;
    import net.minecraft.item.Item;
    import net.minecraft.item.ItemStack;
    import net.minecraft.util.ChatComponentTranslation;
    import net.minecraft.util.DamageSource;
    import net.minecraft.world.Explosion;
    import net.minecraft.world.World;
    
    public class itemBombe extends Item{
    public int nexplosion=0;
    
    public boolean onDroppedByPlayer(ItemStack item, EntityPlayer player)
    {
    if(this.nexplosion==0){
    player.addChatMessage(new ChatComponentTranslation("bombe.run"));
    return true;
    }
    else
    {
    player.addChatMessage(new ChatComponentTranslation("bombe.non.run"));
    return false;
    }
    
    }
    
    public boolean onEntityItemUpdate(EntityItem entityItem)
    {
    
    this.nexplosion++;
    if(this.nexplosion>=300){
    
    double par2 = entityItem.posX;
    double par3 = entityItem.posY;
    double par4 = entityItem.posZ;
    World world = entityItem.worldObj;
    float f = 10F; //Force de l'explosion
    Explosion explosion = new Explosion(world, entityItem, par2, par3, par4, f);
    world.createExplosion(entityItem, par2, par3, par4, f, true);
    entityItem.attackEntityFrom(DamageSource.setExplosionSource(explosion), 50); //comme ça je supprime l'item pour pas qu'il explose a répétition
    this.nexplosion=0;
    }
    return true;
    }
    
    public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean advanced)
    {
    list.add("Drop it on the floor...and run!");
    }
    }
    
    

    Enfin... c'est bien ce que je voulait mais... c un bug qui n'est la que sur mon ordi ou c du a un truc que je ne comprend vraaaaiment pas?


  • Administrateurs

    Salut,
    Bravo, grâce à toi je m'amuse à faire exploser ma map x)
    Je vous ce que tu veux faire, c'est juste excellent et bien pensé 😛 en tout cas ça m'amuse beaucoup.

    J'ai une solution pour remettre le timer à 0 lorsqu'on récupère l'item.
    Il faut juste passer par un événement : http://www.minecraftforgefrance.fr/showthread.php?tid=716
    Autre chose, j'ai utilisé un tag nbt pour le temps avant l'explosion. Le désavantage d'avoir une variable dans la classe de ton item, c'est qu'elle va s'appliquer à tout les entity items en même temps (donc si tu lance une nouvelle bombe, elle va prendre le timer de la première). Avec les tag nbt se problème est évité.

    Voila donc la classe de l'item :

    package ton.package;
    
    import java.util.List;
    
    import net.minecraft.entity.item.EntityItem;
    import net.minecraft.entity.player.EntityPlayer;
    import net.minecraft.item.Item;
    import net.minecraft.item.ItemStack;
    import net.minecraft.nbt.NBTTagCompound;
    import net.minecraft.util.ChatComponentTranslation;
    import net.minecraft.util.DamageSource;
    import net.minecraft.world.Explosion;
    import net.minecraft.world.World;
    
    public class itemBombe extends Item
    {
    public boolean onEntityItemUpdate(EntityItem entityItem)
    {
    ItemStack stack = entityItem.getEntityItem();
    if(!stack.hasTagCompound())
    {
    stack.setTagCompound(new NBTTagCompound());
    }
    stack.getTagCompound().setInteger("explosion", stack.getTagCompound().getInteger("explosion") + 1);
    if(stack.getTagCompound().getInteger("explosion") >= 300)
    {
    double par2 = entityItem.posX;
    double par3 = entityItem.posY;
    double par4 = entityItem.posZ;
    World world = entityItem.worldObj;
    float f = 10F; // Force de l'explosion
    Explosion explosion = new Explosion(world, entityItem, par2, par3, par4, f);
    world.createExplosion(entityItem, par2, par3, par4, f, true);
    entityItem.attackEntityFrom(DamageSource.setExplosionSource(explosion), 50); // comme ça je supprime l'item pour pas qu'il explose a répétition
    stack.getTagCompound().setInteger("explosion", 0);
    }
    return false;
    }
    
    public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean advanced)
    {
    list.add("Drop it on the floor…and run!");
    }
    }
    

    Dans la classe principale de ton mod, enregistre un classe d'event avec la méthode de forge (voir dans le tutoriel), créé la classe et ajoute dedans :

    @SubscribeEvent
    public void onPickup(EntityItemPickupEvent event)
    {
    if(event.item.getEntityItem().getItem() == TaClassePrincipale.lItemEnQuestion)
    {
    if(!event.item.getEntityItem().hasTagCompound())
    {
    event.item.getEntityItem().setTagCompound(new NBTTagCompound());
    }
    event.item.getEntityItem().getTagCompound().setInteger("explosion", 0);
    }
    }
    

    Testé et approuvé 😛

    Dernière chose, pense à lire la java doc. Celle de la fonction onEntityItemUpdate :

    /**
    * Called by the default implemetation of EntityItem's onUpdate method, allowing for cleaner
    * control over the update of the item without having to write a subclass.
    *
    * @param entityItem The entity Item
    * @return Return true to skip any further update code.
    */
    

    Toi tu avais mit return true, donc tout le reste du code dans la fonction onUpdate de l'entity item était ignoré, c'est pour ça que l'item flottait dans l'air.



  • Ravi de t'avoir aidé, mais j'ai encore amélioré mon système d'explosif, si sa t'éclate. Voila le code:

    
    package fr.voila.loulou.nicolas.modMoreOres.common;
    
    import java.awt.List;
    import net.minecraft.entity.item.EntityItem;
    import net.minecraft.entity.player.EntityPlayer;
    import net.minecraft.item.Item;
    import net.minecraft.item.ItemStack;
    import net.minecraft.util.DamageSource;
    import net.minecraft.world.Explosion;
    import net.minecraft.world.World;
    
    public class itemBombe extends Item{
    
    public boolean onEntityItemUpdate(EntityItem entityItem)
    {
    entityItem.delayBeforeCanPickup=200;
    if(entityItem.age>=80){
    
    double par2 = entityItem.posX;
    double par3 = entityItem.posY;
    double par4 = entityItem.posZ;
    World world = entityItem.worldObj;
    float f = 15F; //Force de l'explosion
    Explosion explosion = new Explosion(world, entityItem, par2, par3, par4, f);
    world.createExplosion(entityItem, par2, par3, par4, f, true);
    entityItem.attackEntityFrom(DamageSource.setExplosionSource(explosion), 50); //comme ça je supprime l'item pour pas qu'il explose a répétition
    }
    return false;
    }
    
    public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean advanced)
    {
    list.add("Drop it on the floor…and run!");
    }
    }
    
    

    Bah voila c'est tout simple, mais ça marche! xD
    J'en ai fait une variante, une simple grenade qui explose en 2,5 secondes, et ça suffit a raser bien des villages de pnj 😉


    je me sert de la variable age, c'est aussi simple, et ça ne crée aucun probleme!
    Encore merci beaucoup!

    PS: Pour ce qui veulent utiliser mon code, servez vous! De plus je suis en train de commencer un mod qui rajoute des explosifs, alors peut etre si il est a peu près achevé je le mettrai sur le forum!


  • Administrateurs

    En effet, utiliser l'age de l'entité est encore plus simple ^^
    Je passe en résolu du-coup.


  • Correcteurs

    Salut, petite question en passant car j'ai bien aimé cet item.

    Cependant j'aimerais supprimer le fait que l'explosion casse des blocs autour, il aurait-il un moyen?

    Pour plus de détail, mon serveur annule les effets d'explosion des grenades de flan's mod ou la tnt vanilla mais pourtant n'enlève pas les effets de cet item là
    (ça fait des blocs d'air buggués ou je ne sais pas trop quoi en plus)



  • Tout simplement :

    
    world.createExplosion(entityItem, par2, par3, par4, f, false);