Salut,
ça me parait plutôt bien comme code, seulement tu as mis un return 1 dans ta boucle, dans le cas où tu test le joueur en question. Il faudrait remplacer ce return par un continue sinon tu ne traiteras pas les cas où l'ID est plus grand que celui du joueur.
Si tu veut être plus précis, je te recommande de faire varié le rayon de ta sphère acceptée avec la distance, je t'explique en code:
new Float:Dist = 25.0;//supposons que ceci est la distance entre les deux joueurs
new Float:rayon = 0.02;//le rapport rayon/distance est de 0.02, donc un angle de 1.15° à côté du joueur est accepté, tu peut mettre plus
rayon *= Dist;//ici on ajuste le rayon à la distance
if(IsPlayerInRangeOfPoint(toplayer, rayon, X, Y, Z))
{
//il est dans la bonne zone, on le cible.
}
par contre il y a un truc que je ne comprend pas à quoi ça sert, le x, y, z (dans ton code).
Fais aussi attention, GetXYinFrontOf ... fonctionne avec un angle, ici tu as le vecteur directeur de la caméra (à vérifier)
il te suffit de faire:
new Float:X, Float:Y, Float:Z;
new Float:X2, Float:Y2, Float:Z2;
new Float:Dist;
//on récupère les positions du joueur:
GetPlayerPos(playerid, X, Y, Z);
foreach(toplayer)
{
//on récupère les positions du second joueur:
GetPlayerPos(toplayer, X2,Y2, Z2);
X2 -= X;
Y2 -= Y;
Z2 -= Z;
Dist = floatsqroot(X2 * X2 + Y2 * Y2 + Z2 * Z2);
if(Dist > 20.0)continue;//ça c'est à voir...
X2 += X - CamX * Dist;//on soustrait car je le fait à l'envers (permet de sauver 1 groupe de variable)
Y2 += Y - CamY * Dist;
Z2 += Z - CamZ * Dist;
Dist *= 0.02;//je calcule mon rayon comme précédemment.
if(PointToPoint( X, Y, Z, X2, Y2, Z2, Dist))//fonction à définir avec un define, je te le ferai si tu veut
{
....
}
...
vois avec ça, je doit aller à mon cours, au pire je vais éditer pour terminer.
PS. codé sur le forum alors peut contenir de nombreuses fautes.
++Sim++