Ca faisait un moment que je n'étais pas passé par là.
Je vais donc faire mon chieur ..... :)
1 - Pour Dizzy : La fonction IsNumeric existe certainement en C (même code qu'en PAWN) depuis avant ta naissance. Donc t'en approprier les crédits me semble un peu abusé. D'ailleurs, la fonction que tu montres se trouve dans <utils.h>, pas dans <dutils.h> (dans cette include, elle prend en compte le signe du nombre).
Pour l'autre fonction, <dutil.h> en contient une avec le même nom et le même paramètre (ce qui me parait louche, personnellement, étant français, quand je fais une fonction moi même, je lui donne un nom français ainsi qu'à ses paramètres).
Concernant le contenu de ta fonction ValidEmail, il est très différent du contenu de celle qu'on trouve dans <dutils.h> ce qui pourrait indiquer que c'est toi qui l'a écrite.
2 - Pour sazuke :
Hérésie !!!!
Pourquoi faire un #define à l'intérieur d'une fonction, autant mettre directement le code.
Hérésie 2 !!!!
Utilisation de continue dans une boucle for = truc de débutant qui ne sait pas coder et qui croit optimiser son code :
Le tien :
for(new i = 0; i < GetMaxPlayers(); i++)
{
if(!IsPlayerConnected( i )){continue;}
GetPlayerPos(playerid, x1, y1, z1);
if(DISTANCE(x, y, z, x1, y1, z1) < Distance)
{
Distance = DISTANCE(x, y, z, x1, y1, z1);
Playerid = i;
}
}
Le mien (qui fait la même chose) :
for(new i = 0; i < GetMaxPlayers(); i++)
{
if (IsPlayerConnected (i)) // On ne traite que les joueurs connectés
{
GetPlayerPos (playerid, x1, y1, z1);
if (DISTANCE (x, y, z, x1, y1, z1) < Distance)
{
Distance = DISTANCE (x, y, z, x1, y1, z1);
Playerid = i;
}
}
}
Autre chose, le floatsqroot consomme beaucoup de ressources, pour ta comparaison il vaut mieux élever la distance au carré. De même que faire un floatpower pour élever au carré consomme plus que de simplement multiplier le nombre par lui même.
De plus, faire le calcul 2 fois consommera presque 2 fois plus de temps CPU.
Autre remarque : grosse erreur d'inattention dans le deuxième GetPlayerPos, il faut mettre i, pas playerid.
Mais l'erreur la plus grosse que tu es faîte dans cette fonction c'est que ta boucle for va faire le test pour TOUS les joueurs, y compris le joueur pour lequel on appelle la fonction. Et le résultat sera donc toujours le même : Le joueur le plus proche du joueur X est ..... le joueur X lui-même :).
Au final, on oublie le #define qui ne servira plus à rien (ça ma fait du mal quand j'ai vu ça :(), on corrige tous les petits défauts cités ci-dessus et on obtient un version optimisée (non testée mais je suis confiant) :
stock JoueurLePlusProche( playerid )
{
if(!IsPlayerConnected( playerid )){return -1;}
new PlusProcheJoueur = INVALID_PLAYER_ID;
new Float:Distance = 3000000000000.0; // Distance que je pense être impossible entre deux joueurs ^^
new Float:x, Float:y, Float:z, Float:x1, Float:y1, Float:z1, Float:D;
GetPlayerPos(playerid, x, y, z);
for(new i = 0; i < GetMaxPlayers (); i++)
{
if (IsPlayerConnected (i) && i != playerid) // Il ne faut pas faire le test pour le joueur lui-même
{
GetPlayerPos (i, x1, y1, z1);
D=(x-x1)*(x-x1)+(y-y1)*(y-y1)+(z-z1)*(z-z1);
if(D < Distance*Distance)
{
Distance = floatsqroot (D);
PlusProcheJoueur = i;
}
}
}
return PlusProcheJoueur;
}
NB : Les crédits restent à sazuke car c'est lui qui a eu l'idée de cette fonction, ce qui est certainement la chose le plus difficile en programmation (avoir des idées).
++
Syg