Das Problem ist, dass du auf den Index von VehicleInfo mit der vehicleid drauf zu greifst, das geht aber nicht, da die vehicleid nicht der Index-ID entspricht.
Erstelle dazu eine folgende Funktion, um aus der vehicleid den Index zu bekommen:
stock getVehIndex(vehicleid)
{
for(new i = 0; i < sizeof(VehicleInfo); i++)
{
if(VehicleInfo[i][v_Objekt] == vehicleid)
{
return i;
}
}
return -1;
}
Dann kannst du die TachoTimer Funktion so schreiben:
forward TachoTimer();
public TachoTimer()
{
for(new i=0; i < MAX_PLAYERS; i++)
{
new vID = GetPlayerVehicleID(i);
if(!IsPlayerConnected(i) || PlayerInfo[i][p_LoggedIn] != true)continue;
if(!IsPlayerInAnyVehicle(i))continue;
new idx = getVehIndex(vID);
if(idx == -1) continue;
new tacho[256], Float:hp;
GetVehicleHealth(vID, hp);
VehicleInfo[idx][v_Kilometer] += e_GetDistance(vID);
format(tacho, sizeof(tacho), "%s~n~Geschwindigkeit: %dkm/h~n~Kilometerstand: %d.%dkm~n~Treibstoff: %dl~n~Schaden: %0.2f", VehicleNames[GetVehicleModel(vID)-400], GetPlayerSpeed(i), VehicleInfo[idx][v_Kilometer]/1000, VehicleInfo[idx][v_Kilometer]%1000, VehicleInfo[idx][v_Tank], hp);
PlayerTextDrawSetString(i, Tacho[i][0], tacho);
if(VehicleEngineOn(vID))PlayerTextDrawSetString(i, Tacho[i][2], "~g~Motor");
else PlayerTextDrawSetString(i, Tacho[i][2], "~w~Motor");
if(VehicleLightsOn(vID))PlayerTextDrawSetString(i, Tacho[i][3], "~g~Licht");
else PlayerTextDrawSetString(i, Tacho[i][3], "~w~Licht");
if(VehicleDoorLocked(vID))PlayerTextDrawSetString(i, Tacho[i][4], "~g~Tueren");
else PlayerTextDrawSetString(i, Tacho[i][4], "~w~Tueren");
GetVehiclePos(vID, VehicleInfo[idx][v_KMX], VehicleInfo[idx][v_KMY], VehicleInfo[idx][v_KMZ]);
}
return 1;
}
Zu dem anderen Problem:
Da musst du die e_GetDistance Funktion ebenfalls abändern. Und zwar zu:
stock e_GetDistance(vehicleid)
{
new Float:x2, Float:y2, Float:z2, Float:value, idx = getVehIndex(vehicleid);
if(idx == -1) return 0;
GetVehiclePos(vehicleid, x2, y2, z2);
value = floatsqroot(floatpower(floatabs(floatsub(x2, VehicleInfo[idx][v_KMX])), 2)+floatpower(floatabs(floatsub(y2, VehicleInfo[idx][v_KMY])), 2)+floatpower(floatabs(floatsub(z2, VehicleInfo[idx][v_KMZ])), 2));
return floatround(value);
}
Zudem musst du dann beim Laden der Fahrzeuge den Wert von diesen Variablen
VehicleInfo[idx][v_KMX], VehicleInfo[idx][v_KMY], VehicleInfo[idx][v_KMZ]
auf den Wert von
VehicleInfo[idx][v_X], VehicleInfo [idx][v_Y], VehicleInfo[idx][v_Z]
setzen, damit nicht der Null-Punkt als Berechnungsstart genommen wird.
Dann musst du außerdem, wenn die Distanz dazu gerechnet wurde, also in der Funktion zur Positionsberechnung, oder dort wo es der Variable hinzugefügt wird (je nach dem wie der Rest deines Systems aussieht) die Koordinaten aktualisieren, sprich:
GetVehiclePos(vehicleid, VehicleInfo[idx][v_KMX], VehicleInfo[idx][v_KMY], VehicleInfo[idx][v_KMZ]);
Damit diese neue Position als neuer Berechnungsstart genommen wird.