Particules lancées par une arme



  • Bonsoir, je viens de finir le modèle 3D d'une de mes nouvelles armes, et je souhaiterait qu'elle lance des particules de flammes quand je fait clic droit mais je ne vois pas du tout comment les orienter, je sais juste comment la faire spawn, le code que j'utilise actuellement est :

    	public ActionResult<ItemStack> onItemRightClick(World worldIn, EntityPlayer playerIn, EnumHand handIn) {
    		Random rand = new Random();
    		for(int i = 1; i <= 10; i++) {
    			worldIn.spawnParticle(EnumParticleTypes.FLAME, playerIn.posX, playerIn.posY + 1.4, playerIn.posZ, 0,0,0);
    		}
    		return super.onItemRightClick(worldIn, playerIn, handIn);
    	}
    

    Merci de votre réponse, et vous souhaite une agréable journée, voici donc à quoi cela ressemble actuellement :
    text alternatif
    text alternatif
    text alternatif


  • Moddeurs confirmés Rédacteurs Administrateurs

    Bonsoir,

    Les 3 derniers paramètres de la fonction spawnParticle sont la vélocité des particules (actuellement tu as 0, 0, 0).

    Tu peux jeter un œil à la classe EntityThrowable de Minecraft pour voir comment Minecraft donne la vélocité à ce type d'entité qui est utilisé notament pour la flèche. En reprenant un code similaire tu pourras orienter les particules dans la direction où le joueur regarde lors du clic droit.



  • Okay, je vais donc voir de ce côté, merci encore robin4002 🙂



  • Alors j'ai réussi à récupérer le yaw, mai le pitch n'a pas l'air de fonctionner, si vous avez une technique, vidéo le montrant : https://youtu.be/rdxq-wfR5ds

    Merci de votre aide 🙂

    Code :

    	@Override
    	public ActionResult<ItemStack> onItemRightClick(World worldIn, EntityPlayer playerIn, EnumHand handIn) {
    		Random rand = new Random();
    		
            float f = -MathHelper.sin(playerIn.getRotationYawHead() * 0.017453292F) * MathHelper.cos(playerIn.rotationPitch * 0.017453292F);
            float f1 = -MathHelper.sin((playerIn.getRotationYawHead() + playerIn.rotationPitch) * 0.017453292F);
            float f2 = MathHelper.cos(playerIn.getRotationYawHead() * 0.017453292F) * MathHelper.cos(playerIn.rotationPitch * 0.017453292F);
            this.shoot((double)f, (double)f1, (double)f2, 1.2F, 1.2F);
            this.motionX += playerIn.motionX;
            this.motionZ += playerIn.motionZ;
            for(int i = 1; i <= 20; i++) {
        		worldIn.spawnParticle(EnumParticleTypes.FLAME, playerIn.posX, playerIn.posY + 1.4, playerIn.posZ, motionX, 0, motionZ);
            }
    		
    		
    		return super.onItemRightClick(worldIn, playerIn, handIn);
    	}
        
       public void shoot(double x, double y, double z, float velocity, float inaccuracy)
       {
    	   Random rand = new Random();
           float f = MathHelper.sqrt(x * x + y * y + z * z);
           x = x / (double)f;
           y = y / (double)f;
           z = z / (double)f;
           x = x + rand.nextGaussian() * 0.007499999832361937D * (double)inaccuracy;
           y = y + rand.nextGaussian() * 0.007499999832361937D * (double)inaccuracy;
           z = z + rand.nextGaussian() * 0.007499999832361937D * (double)inaccuracy;
           x = x * (double)velocity;
           y = y * (double)velocity;
           z = z * (double)velocity;
           this.motionX = x;
           this.motionY = y;
           this.motionZ = z;
           float f1 = MathHelper.sqrt(x * x + z * z);
       }
    

  • Moddeurs confirmés Rédacteurs Administrateurs

    Je n'ai pas compris pourquoi tu as fait des variables locals motionX , motionY et motionZ.

    Utiliser la variable f1 à la place de 0 ne fonctionne pas pour y ?

    Et sinon, si tu veux faire une boucle for 20 fois, vaut mieux ajouter un peu de random car là tes 20 particules sont exactement superposé, donc on en voit qu'une seule.



  • Yes c'était prévu, merci ça marche nickel, juste un souci de signe à régler et c'est good merci pour ton aide 😉



  • Du coup ça fonctionne nickel, merci pour votre aide toujours au top 👍🙂


Log in to reply