Salut,
je me sens généreux là alors je t'explique,
tu doit lancé un timer dans onGameModeInit() qui te permettra de calculer la distance parcourue par les joueurs, tu doit donc mesurer la distance parcourue et la mettre en km (c'est ce que tu veut or les mesures de gta (on le présume) sont en mètres.
donc tu doit faire une loop qui testera tous les joueurs et ajoutera la distance qu'ils ont parcourue durant ce laps de temps, la meilleure base pour ceci serait le speedomètre de raf, en modifiant grandement....
voici le code de base:
enum SavePlayerPosEnum {
Float:LastX,
Float:LastY,
Float:LastZ
}
new SavePlayerPos[MAX_PLAYERS][SavePlayerPosEnum];
public UpdateSpeed()
{
new Float:x,Float:y,Float:z;
new Float:distance,value,string[256];
new Float:health;
for(new i=0; i<SLOTS; i++)
{
if(IsPlayerConnected(i) && IsPlayerInAnyVehicle(i))
{
TextDrawDestroy(Speedo[i]);
}
}
for(new i=0; i<SLOTS; i++)
{
if(IsPlayerConnected(i) && IsPlayerInAnyVehicle(i))
{
GetPlayerPos(i, x, y, z);
GetVehicleHealth(GetPlayerVehicleID(i), health);
distance = floatsqroot(floatpower(floatabs(floatsub(x,SavePlayerPos[i][LastX])),2)+floatpower(floatabs(floatsub(y,SavePlayerPos[i][LastY])),2)+floatpower(floatabs(floatsub(z,SavePlayerPos[i][LastZ])),2));
value = floatround(distance * 5000);
if(UpdateSeconds > 1)
{
value = floatround(value / UpdateSeconds);
}
format(string,sizeof(string),"~g~Vehicle : ~w~%s ~n~~b~MPH : ~w~%d / ~b~KM/H : ~w~%d~n~~r~Vehicle Health:~w~ %.2f",CarName[GetVehicleModel(GetPlayerVehicleID(i))-400],floatround(value/1600),floatround(value/1000),health);
Speedo[i] = TextDrawCreate(320.00, 380.00, string);
TextDrawSetOutline(Speedo[i], 0);
TextDrawFont(Speedo[i], 3);
TextDrawSetProportional(Speedo[i], 2);
TextDrawAlignment(Speedo[i], 2);
TextDrawShowForPlayer (i, Speedo[i]);
}
SavePlayerPos[i][LastX] = x;
SavePlayerPos[i][LastY] = y;
SavePlayerPos[i][LastZ] = z;
}
}
maintenant, on commence en retirant toutes les parties qui nous seront complètement inutiles (les textdraw, mais que tu devra faire plus tard afin d'afficher la valeur au joueur) :
public UpdateSpeed()
{
new Float:x,Float:y,Float:z;
new Float:distance;
for(new i=0; i<SLOTS; i++)
{
if(IsPlayerConnected(i) && IsPlayerInAnyVehicle(i))
{
GetPlayerPos(i, x, y, z);
distance = floatsqroot(floatpower(floatabs(floatsub(x,SavePlayerPos[i][LastX])),2)+floatpower(floatabs(floatsub(y,SavePlayerPos[i][LastY])),2)+floatpower(floatabs(floatsub(z,SavePlayerPos[i][LastZ])),2));
}
SavePlayerPos[i][LastX] = x;
SavePlayerPos[i][LastY] = y;
SavePlayerPos[i][LastZ] = z;
}
}
Maintenant il faut ajouté une variable distance, alors on reprend l'énumération:
enum SavePlayerPosEnum {
Float:LastX,
Float:LastY,
Float:LastZ,
Float:Distance
}
new SavePlayerPos[MAX_PLAYERS][SavePlayerPosEnum];
Et voilà qu'on a une variable qui représente la distance parcourue par chaque joueur.
Il ne reste plus qu'a bien là paramétré, il ne faut pas écrire par dessus la valeur de cette variable à chaque fois mais plutôt y ajouter une certaine valeur, ainsi on y arrivera:
public UpdateSpeed()
{
new Float:x,Float:y,Float:z;
new Float:dx,Float:dy,Float:dz;
for(new i=0; i<SLOTS; i++)
{
if(GetPlayerPos(i, x, y, z))//les fonction native retourne toutes ou presque une valeur importante: réussite ou non
{
dx -= SavePlayerPos[i][LastX];
dy -= SavePlayerPos[i][LastY];
dz -= SavePlayerPos[i][LastZ];
SavePlayerPos[i][Distance] += floatsqroot(dx*dx+dy*dy+dz*dz);
SavePlayerPos[i][LastX] = x;
SavePlayerPos[i][LastY] = y;
SavePlayerPos[i][LastZ] = z;
}
}
}
et voilà
il est possible que le code comporte certaines défaut mais bon...
bonne chance
++Sim++