Créer une arme custom simple
-
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()); } -
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; } }:::
-
Petit Up car les armes ont toujours le même soucis.
-
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
-
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. -
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
-
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. -
Essaie de te servir de cela sinon
this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(20D); -
Y’a le soucis que je sois extends EntityThrowable avec cette solution nan?
-
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