Première erreur : Tu récupères deux fois de suite la position du joueur (CoordX et CoordX2) l'une à la suite de l'autre.
J'imagine que ces deux appels à la fonction GetPlayerPos se font si rapidement que CoordX et CoordX2 doivent sensiblement être égaux et que donc la vitesse que tu calcules doit être complétement fausse.
Deuxième erreur : Tu calcules la vitesse du joueur dans le plan (XY) et tu oublies que GTA est en 3D et qu'il y a un composante Z. (La vitesse d'un joueur en chute libre sera de 0 KM/H avec tes calculs .... !!!)
Autre chose : floatsqroot pour calculer une racine carrée me semble plus rapide que ton algorithme.
Donc petit cours sur le compteur de vitesse :
Effectivement, comme l'a dit Guigui, il faut se baser sur un timer. Donc on démarre un timer de 1000ms dans OnGameModeInit (1000ms sinon on risque de surcharger le serveur si tous les joueurs mettent le compteur de vitesse). On verra plus loin ce qu'on met dedans.
Ensuite, on met en place notre commande "/vitesse" et là, on ne fait que sauvegarder la position (Xa, Ya, Za) du joueur dans un tableau (une entree par joueur) et positionner un flag (un par joueur) pour dire que le joueur a demandé le compteur de vitesse.
Dans notre Timer :
Si le joueur a demandé le compteur de vitesse (test sur le flag qu'on a positionné dans la commande)
On récupère la position de joueur (Xb, Yb, Zb) (ce qui fait qu'on va récupérer la position de joueur toutes les secondes).
Ensuite, on calcule la distance (en 3D) qu'il a parcouru depuis sa dernière position.
La distance entres un point A(Xa Ya, Za) et B(Xb, Yb, Zb) dans l'espace est :
Dist = floatsqroot ((Xb-Xa)*(Xb-Xa) + (Yb-Ya)*(Yb-Ya) + (Zb-ZXa)*(Zb-Za))
Dans SA-MP, les coordonnées sont en mètres (enfin je crois) donc la vitesse du joueur est :
Vitesse en m/s -> Vitms = Dist/1.0 (puisque notre timer est à 1 seconde) (cette ligne en inutile dans le script)
Donc Vitesse en KM/H -> VitKmh = Dist / 3600.0 (C'est cette vitesse qu'on affiche)
Enfin, on sauvegarde la nouvelle position du joueur (Xa, Ya, Za) = (Xb, Yb, Zb)
Dernière petite chose : Si le joueur refait /vitesse, on reset le flag comme ça le compteur ne s'affiche plus
Par contre, vu qu'on utilise un timer, la précision n'est pas géniale et à vitesse constante du ton véhicule, le vitesse affichée peut varier de +/- 10 km/h. Pour un peu plus de précision, on peut utiliser la fonction GetTickCount (disponible exclusivement sous Windows) et sauvegarder le TickCount en même temps que la position du joueur et faire les calcul avec la différence entre le TickCount suvegardé et le TickCount du moment où l'on calcule.
++
Syg