Envoyer des boules de feu



  • Bonjour,
    Alors voilà : J'ai créé un système qui permet au joueur de lancer des boules de feu. Il marche assez bien, sauf que son utilisation est assez random :
    Par exemple, pour arriver à lancer une boule de feu qui ne despawn pas au lancer, je suis obligé de me déplacer sur le côté. Ce genre de problème n'étant pas admissible dans un mod public, je m'en remet à vous. Actuellement, je récupère ce qui semble être le regard du joueur, mais je n'en suis pas si sûr (des fois ça part à l'opposé –').

    Mon code :

    
    double d0 = player.getLookVec().xCoord;
    
    double d1 = player.getLookVec().yCoord;
    double d2 = player.getLookVec().zCoord;
    
    EntitySmallFireball esf = new EntitySmallFireball(world, player.posX, player.posY + 1.8, player.posZ, d0, d1, d2);
    world.spawnEntityInWorld(esf);
    

  • Administrateurs

    Tu as regardé dans le code du Ghast et du Blaze? Sinon, tu as le mod Genetics ( je crois ) qui permet de faire ça.

    Envoyé de mon Nexus 4 en utilisant Tapatalk



  • J'ai déjà regardé et j'utilise ça pour mes dragons. Le problème, c'est que l'on connait la position de l'entité ciblée, alors que là, on ne la connait pas.



  • Up une idée ? :huh:



  • Il y a un moyen de get le pos de la ou regarde le joueur ?



    1. double d0 = player.getLookVec().xCoord;
    2. double d1 = player.getLookVec().yCoord;
    3. double d2 = player.getLookVec().zCoord;

    Normalement c'est ça mais quand on regarde le ciel, ça récupère le bloc de juste après le joueur.



  • Moi je veux le bloques que le joueur regardes pour viser en gros



  • J'ai trouvé aussi EntityPlayer.getLook(float) mais je ne vois pas trop comment m'en servir. Sinon je ne crois pas qu'il y ait autre chose pour récupérer le regard (bloc visé) du joueur.



  • Up, quelqu'un ?



  • Up, ça marche mais c'est toujours aussi buggué, quelqu'un a une idée, une piste ?


  • Administrateurs

    Sinon il y a la fonction rayTrace mais elle n'est que disponible côté client.



  • Essaie peut être de lui donner un motion, je sais que quand je faisait des commandes pour les command bloc, il fallait rajouter le tag NBT Motion:[0.0,0.0,0.0], il doit bien y avoir une méthode comme ça dans le code du ghast. Je ne peux pas vérifier dans l'immédiat mais est-ce qu'il y a un autre constructeur pour la boule de ghast qui aurait comme paramètre une vélocité ou quelque chose d'autre dans le genre ?



  • @robin4002
    Merci, je teste.
    De toute façon j’exécute mon code côté client donc ça devrait aller.

    @SCAREX
    Je regarde de suite mais il me semble que non (j'avais regardé chez le blaze)

    EDIT:

    
    double d5 = this.targetedEntity.posX - this.posX;
    double d6 = this.targetedEntity.boundingBox.minY + (double)(this.targetedEntity.height / 2.0F) - (this.posY + (double)(this.height / 2.0F));
    double d7 = this.targetedEntity.posZ - this.posZ;
    
    […]
    EntityLargeFireball entitylargefireball = new EntityLargeFireball(this.worldObj, this, d5, d6, d7);
    entitylargefireball.field_92057_e = this.explosionStrength;
    double d8 = 4.0D;
    Vec3 vec3 = this.getLook(1.0F);
    entitylargefireball.posX = this.posX + vec3.xCoord * d8;
    entitylargefireball.posY = this.posY + (double)(this.height / 2.0F) + 0.5D;
    entitylargefireball.posZ = this.posZ + vec3.zCoord * d8;
    this.worldObj.spawnEntityInWorld(entitylargefireball);
    

    Donc toujours le même problème de la cible.

    J'ai regardé rayTrace mais je ne vois pas trop quoi mettre comme paramètres.
    Comment récupérer une MovingObjectPosition et à quoi correspond-t-elle ?
    A quoi correspond le float ?


  • Administrateurs

    Le premier et la distance, le deuxième je ne sais pas du tout ce qu'il fait. Essaye avec 0 ou 1.
    MovingObjectPosition mop = player.rayTrace(64, 1);
    Après avec le mop tu peux savoir si le joueur vise un bloc ou une entité, et tu peux avoir les coordonnés.



  • @'robin4002':

    Le premier et la distance, le deuxième je ne sais pas du tout ce qu'il fait. Essaye avec 0 ou 1.
    MovingObjectPosition mop = player.rayTrace(64, 1);
    Après avec le mop tu peux savoir si le joueur vise un bloc ou une entité, et tu peux avoir les coordonnés.

    Il me semble que j'avais utilisé une fonction similaire mais avec des sinus cosinus etc. et la méthode se trouvait dans la classe world, est-ce la même fonction ?


  • Administrateurs

    non, rayTrace se trouve dans EntityLivingBase



  • @'robin4002':

    non, rayTrace se trouve dans EntityLivingBase

    Je vérifierai plus tard.



  • Merci, je teste 🙂

    EDIT :
    Avec ce code, la boule de feu part toujours dans la même direction :

    
    double d5;
    
    double d6;
    double d7;
    
    MovingObjectPosition mop = player.rayTrace(128.0D, 1);
    
    if(mop.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK)
    {
                d5 = mop.blockX;
                d6 = mop.blockY;
                d7 = mop.blockZ;
    }
    else if(mop.typeOfHit == MovingObjectPosition.MovingObjectType.ENTITY)
    {
                d5 = mop.entityHit.posX;
                d6 = mop.entityHit.posY;
                d7 = mop.entityHit.posZ;
    }
    else
    {
                d5 = player.getLookVec().xCoord;
                d6 = player.getLookVec().yCoord;
                d7 = player.getLookVec().zCoord;
    }
    
    EntitySmallFireball entitylargefireball = new EntitySmallFireball(player.worldObj, player, d5, d6, d7);
    double d8 = 4.0D;
    Vec3 vec3 = player.getLook(1.0F);
    entitylargefireball.posX = player.posX + vec3.xCoord * d8;
    entitylargefireball.posY = player.posY + (double)(player.height / 2.0F) + 0.5D;
    entitylargefireball.posZ = player.posZ + vec3.zCoord * d8;
    player.worldObj.spawnEntityInWorld(entitylargefireball);
    
    

    J'ai testé avec rayTrace(128, 0) et rayTrace(128, 1), je vais tester d'autres valeurs demain.



  • Après test, le deuxième argument de rayTrace semble contrôler la direction, sauf qu'il m'est impossible de savoir réellement si la boule de feu va partir dans la bonne direction ou non (c'est assez random semble-t-il).

    Quelqu'un a une idée ?


  • Administrateurs

    Non désolé 😕