• S'inscrire
    • Se connecter
    • Recherche
    • Récent
    • Mots-clés
    • Populaire
    • Utilisateurs
    • Groupes

    Résolu Ramassage d'item…

    1.7.x
    1.7.2
    4
    7
    2353
    Charger plus de messages
    • Du plus ancien au plus récent
    • Du plus récent au plus ancien
    • Les plus votés
    Répondre
    • Répondre à l'aide d'un nouveau sujet
    Se connecter pour répondre
    Ce sujet a été supprimé. Seuls les utilisateurs avec les droits d'administration peuvent le voir.
    • DarkSilver974
      DarkSilver974 dernière édition par

      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 réponse Dernière réponse Répondre Citer 0
      • DarkSilver974
        DarkSilver974 dernière édition par

        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 réponse Dernière réponse Répondre Citer 0
        • robin4002
          robin4002 Moddeurs confirmés Rédacteurs Administrateurs dernière édition par

          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 réponse Dernière réponse Répondre Citer 1
          • DarkSilver974
            DarkSilver974 dernière édition par

            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 réponse Dernière réponse Répondre Citer 0
            • robin4002
              robin4002 Moddeurs confirmés Rédacteurs Administrateurs dernière édition par

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

              1 réponse Dernière réponse Répondre Citer 0
              • Folgansky
                Folgansky Correcteurs dernière édition par

                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 réponse Dernière réponse Répondre Citer 0
                • Deleted
                  Deleted dernière édition par

                  Tout simplement :

                  
                  world.createExplosion(entityItem, par2, par3, par4, f, false);
                  
                  
                  1 réponse Dernière réponse Répondre Citer 0
                  • 1 / 1
                  • Premier message
                    Dernier message
                  Design by Woryk
                  Contact / Mentions Légales

                  MINECRAFT FORGE FRANCE © 2018

                  Powered by NodeBB