• Register
    • Login
    • Search
    • Recent
    • Tags
    • Popular
    • Users
    • Groups

    Solved Ramassage d'item…

    1.7.x
    1.7.2
    4
    7
    2212
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • DarkSilver974
      DarkSilver974 last edited by

      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…

      1 Reply Last reply Reply Quote 0
      • DarkSilver974
        DarkSilver974 last edited by

        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?

        1 Reply Last reply Reply Quote 0
        • robin4002
          robin4002 Moddeurs confirmés Rédacteurs Administrateurs last edited by

          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.

          1 Reply Last reply Reply Quote 1
          • DarkSilver974
            DarkSilver974 last edited by

            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!

            1 Reply Last reply Reply Quote 0
            • robin4002
              robin4002 Moddeurs confirmés Rédacteurs Administrateurs last edited by

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

              1 Reply Last reply Reply Quote 0
              • Folgansky
                Folgansky Correcteurs last edited by

                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)

                1 Reply Last reply Reply Quote 0
                • Deleted
                  Deleted last edited by

                  Tout simplement :

                  
                  world.createExplosion(entityItem, par2, par3, par4, f, false);
                  
                  
                  1 Reply Last reply Reply Quote 0
                  • 1 / 1
                  • First post
                    Last post
                  Design by Woryk
                  Contact / Mentions Légales

                  MINECRAFT FORGE FRANCE © 2018

                  Powered by NodeBB