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

    Résolu Créer une arme custom simple

    1.7.x
    1.7.10
    5
    41
    5180
    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.
    • Folgansky
      Folgansky Correcteurs dernière édition par

      Salut à tous,

      Tout comme le sujet où je demandais votre aide au fur et à mesure concernant les montures, j’aimerais vous solliciter pour des items type arme à feu.
      Je ne veux rien faire de trop compliqué étant donné mon niveau et plus c’est simple plus ça pourrait donner envie à d’autres de le faire.

      Alors ce qui me fait ouvrir ce topic à ce moment de mon dév ce sont les Gui.
      Actuellement mes armes ont deux types de fonctionnement très basiques:
      -On reste appuyé, si au bout de x ticks on relâche “pouf” ça tire.
      -On reste appuyé, ça tire tous les x ticks et arrivé à un certain nombre de tirs on doit rester encore appuyer y ticks avant de pouvoir retirer.

      De toute façon voici l’une de mes classes, celle d’une arme qui fonctionne de la première façon:

      :::

      public class ItemRailGun extends Item 
      {   
          private int timer = 0;
      
          public void onPlayerStoppedUsing(ItemStack stack, World world, EntityPlayer player, int useTime)
          {
      if (this.timer < 60)
      {
      this.timer = 0;
      }
      if (this.timer >= 60)
      {
             EntityBullet entityBullet = new EntityBullet(world, player);
             world.playSoundAtEntity(player, "note.bd", 0.3F, 1.0F);
             if (!world.isRemote)
             {
                 player.worldObj.spawnEntityInWorld(entityBullet);
             this.timer = 0;
             } 
      }
           }
      
          public void onUsingTick(ItemStack stack, EntityPlayer player, int count)
          {
             this.timer++;
             if (timer == 60)
             Minecraft.getMinecraft().displayGuiScreen(new GuiRailgun());
          }
      
          public ItemStack onEaten(ItemStack stack, World world, EntityPlayer player)
          {
              return stack;
          }
      
          public int getMaxItemUseDuration(ItemStack stack)
          {
              return 300;
          }
      
          public EnumAction getItemUseAction(ItemStack stack)
          {
              return EnumAction.bow;
          }
      
          public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player)
          {
              if (player.capabilities.isCreativeMode || player.inventory.hasItem(ModPg2.itemRailGun))
              {
                  player.setItemInUse(stack, this.getMaxItemUseDuration(stack));
              }
              return stack;
           } 
      }
      

      :::

      J’ai fais deux armes qui ressemblent à ça pour le moment:
      :::

      Alors mon** soucis** actuel c’est le Gui que j’affiche une fois l’arme “chargée”.
      Il faut appuyer sur echap pour tirer.

      ! ```java
      public class GuiRailgun extends GuiScreen 
      {
      int guiWidth = 120;
      int guiHeight = 4;
      ! public void initGui() 
      {
      }
      ! public void updateScreen() 
      {
      super.updateScreen();
      }
      ! public boolean doesGuiPauseGame() 
      {
      return false;
      }
      ! // protected void keyTyped(char typedChar, int keyCode) 
      // {
      // }
      ! protected void actionPerformed(GuiButton button) 
      {
      }
      ! public void drawScreen(int mouseX, int mouseY, float partialTicks) 
      {
      int guix = (width - guiWidth) / 2;
      int guiy = (height - guiHeight) / 2;
      mc.renderEngine.bindTexture(new ResourceLocation(ModPg2.MODID, “textures/gui/guiscreen/GuiArme.png”));
      drawTexturedModalRect(guix, guiy + 90, 0, 0, guiWidth, guiHeight);
      GL11.glColor4f(1, 1, 1, 1);
      fontRendererObj.drawString(“Chargé”, guix + 160, guiy + 107, 660000);
      super.drawScreen(mouseX, mouseY, partialTicks);
      }
      }

      :::
      >! On m'a laissé entendre que c'est la méthode keyTyped qui devait gérer ça, hors en la mettant vide (je ne sais pas quoi y mettre sinon) c'est pire et même échap ne nous permet pas de sortir du Gui (et accessoirement tirer du coup).
      >! J'aurai par la suite d'autres questions concernant les GuiScreen car j'ai pu suivre le tuto sur les GuiContainer pour un bloc type four et le système d'affichage progressif du Gui (pour la barre de cuisson) m'intéresse sans comprendre vraiment comment faire.
      >! EDIT:
      >! Bon visiblement pour le fonctionnement que je veux ce n'est pas un Gui qu'il me faut mais des Overlay (Barre dont l'affichage dépend d'une valeur). Du coup je me redocumente à ce sujet.
      1 réponse Dernière réponse Répondre Citer 0
      • SCAREX
        SCAREX dernière édition par

        As-tu essayé ton code avec 2 joueurs en même temps ? Je suppose que non, il faut que tu mettes ton timer dans les tag nbt et non dans la classe, de plus, à quoi sert ceci : “|| player.inventory.hasItem(ModPg2.itemRailGun” ?

        Site web contenant mes scripts : http://SCAREXgaming.github.io

        Pas de demandes de support par MP ni par skype SVP.
        Je n'accepte sur skype que l…

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

          Han, j’avais totalement zappé le coup des nbt. ça aurait été un joyeux bordel j’imagine.

          Le coup du hasItem c’est juste pour ne pas être embêté par la UseDuration au cas où certains resteraient tout le temps appuyé sur la “gâchette” mais ça c’est pour la seconde façon de fonctionner, je l’ai laissé ici car ça ne dérangeait pas.

          Edit: C’quoi les nbt pour un item? x]

          Edit2: Du coup chui tombé sur ton topic de backpack

          En faisant:

           public void writeToNBT(ItemStack stack) 
           {
          if (!stack.hasTagCompound()) stack.setTagCompound(new NBTTagCompound());
          stack.writeToNBT(stack.getTagCompound());
          
           }
          

          Est-ce que je suis loin du truc?
          Je ne sais pas ce qu’il faut y mettre dans cette méthode en fait.

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

            Les tags nbt n’apparaissent pas par défaut sur les items, il faut juste vérifier au bon moment s’ils sont présent et ce qu’ils contiennent, sinon ta méthode writeToNBT ne sera jamais appelée

            Site web contenant mes scripts : http://SCAREXgaming.github.io

            Pas de demandes de support par MP ni par skype SVP.
            Je n'accepte sur skype que l…

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

              Pour ta méthode keyTyped, ce n’est pas compliqué, le char correspond à la lettre tapée et le integer correspond à l’id de la touche pour Java. Donc si tu veux quitter ton menu avec echap, l’id de la touche echap est 1. Si tu as des questions sur cette méthode, n’hésite pas 🙂

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

                Eh bien à vrai dire, j’ai assez rapidement rajouté des edit au premier post car il s’avère qu’utiliser des GuiScreen n’est pas indiqué dans mon cas, je devrais plutôt passer par des overlay. Du coup le keyTyped ne me concerne plus en premier plan.

                De plus Scarex a soulevé un problème dans mon code que je m’efforce de comprendre. De ce que j’ai compris, déjà ma méthode ne semble pas mal rédigée (bon point) mais elle n’est appelée nulle part et donc ne sert à rien (mauvais point).

                Du coup il faudrait que je mette ça en condition quelque part simplement?
                :::

                    public void onUsingTick(ItemStack stack, EntityPlayer player, int count)
                    {
                    if(stack.hasTagCompound() && timerTir == "valeur pour fonctionner")
                             //Il se passe quelquechose de différent pour chaque personne utilisant cet item, fonction du nbt de leur item en main
                    }
                

                :::

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

                  En fait il faudrait vérifier dans onItemRightClick si ton itemstack hasTagCompound, ensuite get le timeTir qui devrait aussi être enregistré dans les tags de l’item, et en fonction de sa valeur le joueur pourra ou non tirer. C’est ça ce que tu souhaites faire ? Je n’ai pas tout compris ^^’

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

                    Bah en regardant la classe d’un de mes flingues (le spoiler Railgun) Scarex m’a informé de ma bêtise car utiliser l’arme modifie un timer, mais si plusieurs joueurs utilisent l’arme en même temps ça modifie d’autant de fois cette valeur bref une bourde.

                    Du coup on me parle des nbt, qui servent à ce que j’ai compris à enregistrer des valeurs de façon individuelle.
                    Alors je tente de comprendre comment l’utiliser.

                    J’crée la méthode writeToNBT, puis on me dit qu’il faut que cette méthode soit appelée pour checker ce qu’il y a dedans.
                    Enfin bref, je ne sais pas utiliser les nbt tag.

                    Je dois enregistrer dans les nbt de l’arme, une valeur qui correspond au temps d’utilisation de l’arme.
                    En fonction de cette valeur dans les nbt j’imagine que les autres méthodes fonctionneront toujours de la même façon en mettant simplement la valeur en condition.

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

                      Ok donc ça semble bien être ce que je t’ai proposé dans mon message #7 🙂
                      “En fait il faudrait vérifier dans onItemRightClick si ton itemstack hasTagCompound, ensuite get le timeTir qui devrait aussi être enregistré dans les tags de l’item, et en fonction de sa valeur le joueur pourra ou non tirer”

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

                        Ok, alors heureusement que je furète un peu sur tous les topics depuis plusieurs mois, ça me permet de trouver les connaissances en java qui me font défaut.
                        Du coup grâce au tuto de robin sur le kit outils (et son épée à nbt) j’ai pu mieux voir ce qu’il m’était demandé de faire.

                        Voici ma classe, est-ce que j’ai mal fais?

                        :::

                        public class ItemRailGun extends Item 
                        {   
                            private int timer = 0;
                        
                            public void onPlayerStoppedUsing(ItemStack stack, World world, EntityPlayer player, int useTime)
                            {
                        if (this.timer < 60)
                        {
                        this.timer = 0;
                        }
                        if (this.timer >= 60)
                        {
                               EntityBullet entityBullet = new EntityBullet(world, player);
                               world.playSoundAtEntity(player, "note.bd", 0.3F, 1.0F);
                               if (!world.isRemote)
                               {
                                   player.worldObj.spawnEntityInWorld(entityBullet);
                               this.timer = 0;
                               } 
                        }
                             }
                        
                            public void onUsingTick(ItemStack stack, EntityPlayer player, int count)
                            {
                            if(!stack.hasTagCompound())
                        {
                        stack.setTagCompound(new NBTTagCompound());
                        }
                            int timer = stack.getTagCompound().getInteger("timer");
                                this.timer++;
                            stack.getTagCompound().setInteger("timer", timer);
                            }
                        
                            public ItemStack onEaten(ItemStack stack, World world, EntityPlayer player)
                            {
                                return stack;
                            }
                        
                            public int getMaxItemUseDuration(ItemStack stack)
                            {
                                return 300;
                            }
                        
                            public EnumAction getItemUseAction(ItemStack stack)
                            {
                                return EnumAction.bow;
                            }
                        
                            public boolean onLeftClickEntity(ItemStack stack, EntityPlayer player, Entity entity)
                            {
                                return true;
                            }
                        
                            public ItemStack onItemLeftClick(ItemStack itemStackIn, World worldIn, EntityPlayer playerIn)
                            {
                             if(worldIn.isRemote)
                             {
                             ModPg2.zoom = !ModPg2.zoom;
                             }
                                return itemStackIn;
                            }
                        
                            public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player)
                            {
                                if (player.capabilities.isCreativeMode || player.inventory.hasItem(ModPg2.itemRailGun))
                                {
                                    player.setItemInUse(stack, this.getMaxItemUseDuration(stack));
                                }
                                return stack;
                             } 
                        }
                        

                        :::

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

                          
                          int timer = stack.getTagCompound().getInteger("timer");
                                 this.timer++;
                             stack.getTagCompound().setInteger("timer", timer);
                          
                          

                          Sa serait plus logique et ça ne causerait aucune erreur de set avant de get, tu ne penses pas ^^

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

                            J’ai fais dans cet ordre car il est dans cet ordre dans le tuto de robin, rien de plus.

                            :::

                            
                            1.  **public** ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player)
                            2.  {
                            3.  **if**(player.isSneaking())
                            4.  {
                            5.  **if**(!stack.hasTagCompound())
                            6.  {
                            7.  stack.setTagCompound(**new** NBTTagCompound());
                            8.  }
                            9.  **byte** mode = stack.getTagCompound().getByte("mode");
                            10.  mode++;
                            11.  **if**(mode == 3)
                            12.  {
                            13.  mode = 0;
                            14.  }
                            15.  stack.getTagCompound().setByte("mode", mode);
                            16.  **if**(!world.isRemote)
                            17.  {
                            18.  player.addChatMessage(**new** ChatComponentTranslation(mode == 0 ? "sword.mode.message.0" : mode == 1 ? "sword.mode.message.1" : "sword.mode.message.2"));
                            19.  }
                            20.  }
                            21.  **else**
                            22.  {
                            23.  **super**.onItemRightClick(stack, world, player);
                            24.  }
                            25.  **return** stack;
                            26.  }
                            
                            

                            :::

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

                              T’as essayé le code au moins ?
                              Je suis quasi-sûr que c’est dans l’autre sens 🙂
                              Dès que je peux je teste

                              Et puis la méthode onUsingTick et onPlayerStoppedUsing ne marchent pas (je n’arrive pas à les appeler), je te conseille d’utiliser ces 2 là respectivement équivalentes 🙂

                              public void onUpdate(ItemStack p_77663_1_, World p_77663_2_, Entity p_77663_3_, int p_77663_4_, boolean p_77663_5_) {}

                              public ItemStack onItemRightClick(ItemStack p_77659_1_, World p_77659_2_, EntityPlayer p_77659_3_) {}

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

                                Non je n’ai pas testé encore car dans l’histoire j’ai deux armes et la seconde a un fonctionnement plus complexe avec 3 variables. Je voulais déjà savoir si ma façon de faire concernant les nbt était convenable pour une.

                                :::

                                public class ItemPlasmaGun extends Item 
                                {   
                                    private int timerTir = 0;
                                    private int timerCold = 100;
                                    private boolean onUse;
                                
                                    public void onPlayerStoppedUsing(ItemStack stack, World world, EntityPlayer player, int useTime)
                                    {
                                    this.onUse = false;
                                    }
                                
                                    public void onUsingTick(ItemStack stack, EntityPlayer player, int count)
                                    {
                                       if(this.onUse == false)
                                       this.onUse = true;
                                       if (timerTir <= 150)
                                       {
                                           this.timerTir++;
                                       }
                                       if (timerTir % 5 == 0 && timerCold != 0 && timerTir <= 150)
                                       {
                                       EntityBullet entityBullet = new EntityBullet(player.worldObj, player);
                                       player.worldObj.playSoundAtEntity(player, "note.bd", 0.3F, 1.0F);
                                       if (!player.worldObj.isRemote)
                                       {
                                           player.worldObj.spawnEntityInWorld(entityBullet);
                                       } 
                                       }       
                                    }
                                
                                    public void onUpdate(ItemStack stack, World world, Entity entity, int i, boolean b) 
                                    {
                                    if(timerTir > 0 && timerTir != 151 && this.onUse == false)
                                    {
                                    this.timerTir–; 
                                    }
                                    if (timerTir > 150 && timerCold != 0)
                                         {
                                        this.timerCold--;
                                         }
                                         if (timerCold == 0)
                                         {
                                        this.timerTir = 0;
                                        this.timerCold = 100;
                                         }
                                //         System.out.println(timerTir + "tir");
                                //         System.out.println(timerCold + "cold");
                                    }    
                                
                                    public ItemStack onEaten(ItemStack stack, World world, EntityPlayer player)
                                    {
                                        return stack;
                                    }
                                
                                public int getMaxItemUseDuration(ItemStack stack)
                                    {
                                        return 3000;
                                    }
                                
                                public EnumAction getItemUseAction(ItemStack stack)
                                    {
                                        return EnumAction.bow;
                                    }
                                
                                public boolean onLeftClickEntity(ItemStack stack, EntityPlayer player, Entity entity)
                                {
                                return true;
                                }
                                
                                public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player)
                                {
                                if (player.capabilities.isCreativeMode || player.inventory.hasItem(ModPg2.itemPlasmaGun))
                                {
                                player.setItemInUse(stack, this.getMaxItemUseDuration(stack));
                                }
                                return stack;
                                }
                                
                                public void writeToNBT(ItemStack stack) 
                                {
                                if (!stack.hasTagCompound()) stack.setTagCompound(new NBTTagCompound());
                                stack.writeToNBT(stack.getTagCompound());  
                                }
                                }
                                

                                :::

                                Donc en gros quand on tire on fait monter une valeur, quand on ne tire plus, elle descend (sauf si elle atteint un maximum). Une valeur booléenne est utilisée pour savoir si l’item est en train d’être utilisé ou non (y’a peut-être plus simple mais j’ai pas voulu demander).
                                Si la première valeur atteint son maximum, elle ne peut plus redescendre quand on ne tire plus, une seconde valeur diminue alors (un cooldown) jusqu’à remettre à leurs valeurs initiales les deux valeurs.

                                C’est une arme qui doit mimer une arme futuriste type Halo, avec surchauffe.

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

                                  Bon en fait je me suis trompé 😕
                                  L’histoire du get et set n’a apparemment pas vraiment d’importante
                                  Voici un code qui semble pour le moment fonctionnel, après t’as juste à faire tes conditions pour la valeur de timer. Sa je pense que tu en seras capable 😉

                                  
                                  public void onUpdate(ItemStack stack, World p_77663_2_, Entity p_77663_3_, int p_77663_4_, boolean p_77663_5_)
                                  {
                                  super.onUpdate(stack, p_77663_2_, p_77663_3_, p_77663_4_, p_77663_5_);
                                  if(!stack.hasTagCompound())
                                  stack.setTagCompound(new NBTTagCompound());
                                  int timer = stack.getTagCompound().getInteger("timer");
                                  timer++;
                                  stack.getTagCompound().setInteger("timer", timer);
                                  System.out.println(timer);
                                  }
                                  
                                  
                                  1 réponse Dernière réponse Répondre Citer 0
                                  • Folgansky
                                    Folgansky Correcteurs dernière édition par

                                    Est-ce que je suis obligé de mettre ça dans la méthode onUpdate?

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

                                      Tu voulais le mettre autre part ?

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

                                        Eh bien c’est simplement le “this.timer++;” dans le onUpdate qui me gène. Il faut qu’il soit dans la méthode onUsingTick.

                                        Si la place de cette ligne n’influence pas les nbt alors aucune autre question, je vais essayer de mettre les nbt pour la seconde arme suivant ce modèle. Comme ça on pourra me dire si ça semble correspondre à du java fonctionnel ou non.

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

                                          Je t’ai dit avoir testé le code. Il fonctionne très bien, je sais ce que je fais 🙂
                                          Au cas où tu n’aurais pas débuggé, la méthode onUsingTick semble ne pas marcher et puis elle sert à la même chose que onUpdate() : être appelé à chaque tick.

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

                                            onUsingTick est appelé quand on fait un clic droit, à chaque tick.

                                            Moddeur 1.8

                                            Développeur Java

                                            1 réponse Dernière réponse Répondre Citer 0
                                            • 1
                                            • 2
                                            • 3
                                            • 1 / 3
                                            • Premier message
                                              Dernier message
                                            Design by Woryk
                                            Contact / Mentions Légales

                                            MINECRAFT FORGE FRANCE © 2018

                                            Powered by NodeBB