Envoyer des boules de feu
-
Up, quelqu’un ?
-
Up, ça marche mais c’est toujours aussi buggué, quelqu’un a une idée, une piste ?
-
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 ? -
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 ?
-
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 ?
-
Non désolé

-
J’ai fait quelques recherches avec les codes des blaze et voilà le résultat trouvé :
public class ST18SpawnFireballCommand extends CommandBase { @Override public String getName(){ return "fireball"; } @Override public String getCommandUsage(ICommandSender p_71518_1_){ return null; } @Override public void execute(ICommandSender sender, String[] args){ if (sender instanceof EntityPlayerMP) { EntityPlayerMP p = (EntityPlayerMP) sender; MovingObjectPosition mop = p.rayTrace(128.0D, 1); double tx = mop.hitVec.xCoord; double ty = mop.hitVec.yCoord; double tz = mop.hitVec.zCoord; sender.addChatMessage(new ChatComponentText(String.format("position trouvée : (%.2f, %.2f, %.2f)", tx, ty, tz))); double d0 = tx - p.posX; double d1 = ty - (p.posY + (double) (p.height / 2.0F)); double d2 = tz - p.posZ; EntitySmallFireball entitysmallfireball = new EntitySmallFireball(p.worldObj, p, d0, d1, d2); entitysmallfireball.posY = p.posY + (double) (p.height / 2.0F) + 0.5D; p.worldObj.spawnEntityInWorld(entitysmallfireball); } } }chez moi ça marche parfaitement.
Pour robin : j’ai trouvé la fonction que j’avais utilisé, c’est la fonction rayTrace sauf qu’au moment de l’utiliser elle s’appelée func_147447_a mais se trouvée bien dans World.class
-
Merci, ça marche !
Un grand GG car sans toi (et robin) je n’aurais pas réussi !Il y a juste un petit problème, c’est que quand le joueur vise trop près de lui, la boule de feu part à l’opposé

EDIT :
Plus précisément quand il vise un bloc pas trop loin avec le regard un peu penché vers le bas. -
@‘MrBlockTNT’:
Merci, ça marche !
Un grand GG car sans toi (et robin) je n’aurais pas réussi !Il y a juste un petit problème, c’est que quand le joueur vise trop près de lui, la boule de feu part à l’opposé

EDIT :
Plus précisément quand il vise un bloc pas trop loin avec le regard un peu penché vers le bas.Le problème est que ça vient du code de la fireball, je suis en train de cherche une autre solution.
EDIT :
le problème vient de là :accelX += this.rand.nextGaussian() * 0.4D; accelY += this.rand.nextGaussian() * 0.4D; accelZ += this.rand.nextGaussian() * 0.4D;Si la différence entre la position visée et la position du joueur est négative et que cette valeur absolue est inférieure à random.nextGaussian() * 0.4D alors la boule pars de l’autre côté, même chose si le accel est supérieure et le random.nextGaussian() * 0.4D inférieure à la valeur absolue.
Ce que je viens de dire est très confus, voici un example :
//Ici un exemple de distance entre le joueur et la coordonnée visée, ici il y a 0.4 blocs de distance accelX = -0.4D; //Imaginons maintenant que le random.nextGaussian() * 0.4D donne 0.6D accelX += 0.6D //soit 0.2D donc la boule de feu part de l'autre côté