MFF

    Minecraft Forge France
    • Récent
    • Mots-clés
    • Populaire
    • Utilisateurs
    • Groupes
    • Forge Events
      • Automatique
      • Foncé
      • Clair
    • S'inscrire
    • Se connecter

    Créer une arme custom simple

    Planifier Épinglé Verrouillé Déplacé Résolu 1.7.x
    1.7.10
    41 Messages 5 Publieurs 5.5k Vues 1 Watching
    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.
    • FolganskyF Hors-ligne
      Folgansky Correcteurs
      dernière édition par

      J’veux bien mais je ne comprend pas ce que ça veut dire. (en java)

      Le “private int timer” vire je suppose et je fais comment pour récupérer la valeur du nbt tag voulu, svp?

      1 réponse Dernière réponse Répondre Citer 0
      • BrokenSwingB Hors-ligne
        BrokenSwing Moddeurs confirmés Rédacteurs
        dernière édition par

        Quand tu veux récupéré le timer présent dans le NBTTagCompound tu fait :

        
        int timer = stack.getTagCompound().getInteger("timer");
        
        
        1 réponse Dernière réponse Répondre Citer 0
        • FolganskyF Hors-ligne
          Folgansky Correcteurs
          dernière édition par

          D’acc, est-ce que j’en ai trop mis ou pas assez?

          :::

          
          public class ItemRailGun extends Item 
          {      
              public void onPlayerStoppedUsing(ItemStack stack, World world, EntityPlayer player, int useTime)
              {
             int timer = stack.getTagCompound().getInteger("timer");
          if (timer < 60)
          {
          timer = 0;
             stack.getTagCompound().setInteger("timer", timer);
          }
          if (timer >= 60)
          {
                 EntityBullet entityBullet = new EntityBullet(world, player);
                 world.playSoundAtEntity(player, "note.bd", 0.3F, 1.0F);
                 if (!world.isRemote)
                 {
                     player.worldObj.spawnEntityInWorld(entityBullet);
                 timer = 0;
             stack.getTagCompound().setInteger("timer", timer);
                 } 
          }
               }
          
              public void onUsingTick(ItemStack stack, EntityPlayer player, int count)
              {
             int timer = stack.getTagCompound().getInteger("timer");
                  timer++;
             stack.getTagCompound().setInteger("timer", timer);
              }
          
              public void onUpdate(ItemStack stack, World world, Entity entity, int i, boolean b) 
              {
              if(!stack.hasTagCompound())
          {
          stack.setTagCompound(new NBTTagCompound());
          }
              int timer = stack.getTagCompound().getInteger("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 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 supposé qu’il fallait set à chaque fois que ma valeur change.
          De ce que j’ai compris "   stack.getTagCompound().setInteger(“timer”, timer);" permet d’enregistrer la valeur.

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

            Tout est bon sauf dans le onUpdate où tout ce que tu fais c’est récupérer la variable puis “set” la variable sans aucune action entre

            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
            • FolganskyF Hors-ligne
              Folgansky Correcteurs
              dernière édition par

              Ouki, j’ai viré cette méthode du coup.

              Par contre j’ai un problème avec l’arme à cause du onUsingTick. Si je set la valeur après le timer++; l’arme “pète un plomb” (fais l’action de l’arc comme voulu mais fonctionne comme un clignotant) et la valeur monte toute seule même sans utiliser l’arme.

              Si je retire le set, évidemment la valeur reste à 1 mais l’action “arc” se déroule normalement.

              :::

              public class ItemRailGun extends Item 
              {      
              public void onPlayerStoppedUsing(ItemStack stack, World world, EntityPlayer player, int useTime)
                  {
              int timer = stack.getTagCompound().getInteger("timer");
              if (timer < 60)
              {
              timer = 0;
              stack.getTagCompound().setInteger("timer", timer);
              }
              if (timer >= 60)
              {
              EntityBullet entityBullet = new EntityBullet(world, player);
              world.playSoundAtEntity(player, "note.bd", 0.3F, 1.0F);
              if (!world.isRemote)
              {
              player.worldObj.spawnEntityInWorld(entityBullet);
              timer = 0;
              stack.getTagCompound().setInteger("timer", timer);
              } 
              }
                   }
              
                  public void onUsingTick(ItemStack stack, EntityPlayer player, int count)
                  {
                  if(!stack.hasTagCompound())
                      {
                      stack.setTagCompound(new NBTTagCompound());
                      }
                  int timer = stack.getTagCompound().getInteger("timer");
                      timer++;
                      stack.getTagCompound().setInteger("timer", timer);
                      System.out.println(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 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
              • SCAREXS Hors-ligne
                SCAREX
                dernière édition par

                Regarde si la méthode est appelée en permanence, si oui rajoute une condition pour vérifier que le joueur est en train de l’utiliser.

                Au passage : tu as déjà un timer incrémenté tous les ticks, regarde le dernier paramètre de la fonction onPlayerStoppedUsing.

                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
                • FolganskyF Hors-ligne
                  Folgansky Correcteurs
                  dernière édition par

                  Oui j’avais vu ce paramètre (après) mais le fonctionnement de ma deuxième arme nécessite tout de même d’enregistrer une valeur dans les nbt (en gros pour faire diminuer le count quand le joueur n’utilise pas l’arme).

                  Par contre je me sers d’une valeur booléenne pour savoir si l’item est utilisé, y a-t-il plus simple?
                  En gros l’arme réagit comme si on était en train de l’utiliser alors que non.

                  Voici la classe de ma deuxième arme (modifiée selon les derniers bons conseils et possédant déjà une valeur booléenne pour tenter de résoudre le problème), mais le problème persiste

                  :::

                  public class ItemPlasmaGun extends Item 
                  {   
                      public void onPlayerStoppedUsing(ItemStack stack, World world, EntityPlayer player, int useTime)
                      {
                          boolean onUse = stack.getTagCompound().getBoolean("onUse");
                      onUse = false;
                          stack.getTagCompound().setBoolean("onUse", onUse);
                      }
                  
                      public void onUsingTick(ItemStack stack, EntityPlayer player, int count)
                      {
                      int timerTir = stack.getTagCompound().getInteger("timerTir");
                      int timerCold = stack.getTagCompound().getInteger("timerCold");
                      boolean onUse = stack.getTagCompound().getBoolean("onUse");
                      if(onUse == false)
                      {
                      onUse = true;
                      stack.getTagCompound().setBoolean("onUse", onUse);
                      }
                      if (timerTir <= 150 && onUse == true)
                      {
                      timerTir++;
                      stack.getTagCompound().setInteger("timerTir", timerTir);
                      }
                      if (timerTir % 5 == 0 && timerCold != 0 && timerTir <= 150 && onUse == true)
                      {
                      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(!stack.hasTagCompound())
                           {
                          stack.setTagCompound(new NBTTagCompound());
                           }
                        int timerTir = stack.getTagCompound().getInteger("timerTir");
                        int timerCold = stack.getTagCompound().getInteger("timerCold");
                      boolean onUse = stack.getTagCompound().getBoolean("onUse");
                      if(timerTir > 0 && timerTir != 151 && onUse == false)
                      {      
                      timerTir–; 
                      stack.getTagCompound().setInteger("timerTir", timerTir);
                      }
                      if (timerTir > 150 && timerCold != 0)
                           {    
                      timerCold--;
                      stack.getTagCompound().setInteger("timerCold", timerCold);
                           }
                           if (timerCold == 0)
                           {        
                          timerTir = 0;
                          timerCold = 100;
                          stack.getTagCompound().setInteger("timerTir", timerTir);
                          stack.getTagCompound().setInteger("timerCold", timerCold);
                           }
                          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());  
                  }
                  }
                  

                  :::

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

                    Dans ton code il y a beaucoup de choses inutiles et il y a des choses que je ne comprends pas :

                    • Pourquoi faire ceci :
                    boolean onUse = stack.getTagCompound().getBoolean("onUse");
                    onUse = false;
                    stack.getTagCompound().setBoolean("onUse", onUse);
                    
                    

                    au lieu de ceci :

                    stack.getTagCompound().setBoolean("onUse", false);
                    
                    • A quoi ça sert de faire ça :
                    public void writeToNBT(ItemStack stack)
                    {
                    if (!stack.hasTagCompound()) stack.setTagCompound(new NBTTagCompound());
                    stack.writeToNBT(stack.getTagCompound());
                    }
                    

                    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
                    • FolganskyF Hors-ligne
                      Folgansky Correcteurs
                      dernière édition par

                      Parce que je ne sais absolument pas me servir des nbt et que je tâtonne, du coup merci pour ces précisions, je vais changer ça.

                      Peut-être que ça réglera mon soucis d’arme qui ne s’arrête plus de tirer (j’éditerai dans tous les cas)

                      Edit: Non actuellement le code est plus propre mais toujours le même soucis à l’activation

                      Edit: Le soucis c’est que ma méthode onStoppedUsing a du mal à être appelée, il faut avoir de la chance quand on clique droit, donc le boolean qui doit faire yo-yo , je cherche pourquoi.

                      :::

                      public class ItemRailGun extends Item 
                      {      
                      public void onPlayerStoppedUsing(ItemStack stack, World world, EntityPlayer player, int useTime)
                          {
                          stack.getTagCompound().setBoolean("onUse", false);    
                      int timer = stack.getTagCompound().getInteger("timer");
                      if (timer < 60)
                      {
                      stack.getTagCompound().setInteger("timer", 0);
                      }
                      if (timer >= 60)
                      {
                      EntityBullet entityBullet = new EntityBullet(world, player);
                      world.playSoundAtEntity(player, "note.bd", 0.3F, 1.0F);
                      if (!world.isRemote)
                      {
                      player.worldObj.spawnEntityInWorld(entityBullet);
                      stack.getTagCompound().setInteger("timer", 0);
                      } 
                      }
                           }
                      
                          public void onUsingTick(ItemStack stack, EntityPlayer player, int count)
                          {
                          if(!stack.hasTagCompound())
                              {
                              stack.setTagCompound(new NBTTagCompound());
                              }
                          int timer = stack.getTagCompound().getInteger("timer");
                          stack.getTagCompound().setBoolean("onUse", true); 
                          if(stack.getTagCompound().getBoolean("onUse") == true)
                          {
                          timer++;
                          stack.getTagCompound().setInteger("timer", timer);
                          }
                              System.out.println(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 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
                      • FolganskyF Hors-ligne
                        Folgansky Correcteurs
                        dernière édition par

                        Petit Up car les armes ont toujours le même soucis.

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

                          Personnellement dans mon mod d’armes, j’ai créé une proxy client qui envoi un paquet à chaque tentative de tir, ensuite le serveur décide ou non de faire tirer le joueur, je ne sais plus pourquoi j’avais choisi cette méthode mais je crois que c’était du à un problème avec l’appel de ces fonctions

                          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
                          • FolganskyF Hors-ligne
                            Folgansky Correcteurs
                            dernière édition par

                            Han, les paquets… Justement j’ai voulu créer des armes qui pourraient s’en passer. Visiblement ce n’est pas si facile.
                            Merci pour cette info Scarex, elle me permet de jeter l’éponge, du moins de mettre ce projet de côté un bon moment.

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

                              Tu sais, il ne faut pas baisser les bras si vite ! Les packets avec de la motivation et de l’attention, c’est quasi un jeu d enfant 🙂
                              Essaie et poste ton code, on sera la pour te dire ce qui va et ce qui ne va pas 🙂

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

                                Re les gens, je suis parti sur un tout autre fonctionnement, plus simple et fonctionnel pour le coup.

                                Du coup je bosse un peu sur les “balles”.
                                Mon soucis actuel c’est réglé la vitesse de l’entité (qui est extends EntityThrowable)

                                public void setArrowHeading(double d, double d1, double d2, float spread, float speed)
                                {
                                spread /= 5F;
                                float f2 = MathHelper.sqrt_double(d * d + d1 * d1 + d2 * d2);
                                d /= f2;
                                d1 /= f2;
                                d2 /= f2;
                                d *= speed;
                                d1 *= speed;
                                d2 *= speed;
                                d += rand.nextGaussian() * spread * speed * 0.005D ;
                                d1 += rand.nextGaussian() * spread * speed * 0.005D ;
                                d2 += rand.nextGaussian() * spread * speed * 0.005D ;
                                motionX = d;
                                motionY = d1;
                                motionZ = d2;
                                float f3 = MathHelper.sqrt_double(d * d + d2 * d2);
                                prevRotationYaw = rotationYaw = (float) ((Math.atan2(d, d2) * 180D) / 3.1415927410125732D);
                                prevRotationPitch = rotationPitch = (float) ((Math.atan2(d1, f3) * 180D) / 3.1415927410125732D);
                                }
                                

                                C’est la bonne méthode pour modifier le paramètre j’ai supposé mais je ne suis arrivé à rien de concluant en tentant des trucs comme:

                                motionX = d * 5;
                                ``` (et le y et Z avec)
                                Tout bêtement quoi.
                                1 réponse Dernière réponse Répondre Citer 0
                                • DeletedD Hors-ligne
                                  Deleted
                                  dernière édition par

                                  Essaie de te servir de cela sinon
                                  this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(20D);

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

                                    Y’a le soucis que je sois extends EntityThrowable avec cette solution nan?

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

                                      Ah peut-être, je ne sais pas. Les EntityAttribute héritent de la classe EntityLivingBase, je crois….Et EntityThrowable hérite de Entity 😕
                                      Soit tu ré adaptes ta classe pour qu’elle étende d’EntityLiving, soit tu gardes l’idée des motions qui n’est pas si mal 🙂

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

                                      MINECRAFT FORGE FRANCE © 2024

                                      Powered by NodeBB