Das geht viel einfacher:
- Unter Annahme, dass wir fünf Balken wollen (20l = 1 Balken), erstellen wir fünf TextDraws.
- Wir erstellen einen Timer für jedes Auto beim Erstellen des Autos, der dann aufgerufen wird, wenn der Tank 1l weniger enthält.
- Wenn der Timer aufgerufen wird testen wir, ob sich ein Fahrer im Auto befindet und ob der Motor läuft.
- Wenn ja, dann updaten wir die Balken, die angezeigt werden für den Fahrer.
- Auch müssen wir die Balken bei ein- und aussteigen updaten.
Also, machen wir uns ran (Beachte: Ich arbeite mit Iteratoren, damit ich Fahrzeuge und Spieler performanter handhaben kann - siehe Tutorial in meiner Signatur):
// Preprocessor Directives:
#include <foreach>
#define FUEL_TIMER_INTERVAL (50000)
// Aufbauen der Datenstruktur:
enum vehicleEnumerator {
vFuelTimerHandle,
vTank
}
new Text:fuelBars[5],
Iterator:vehicleIterator<MAX_VEHICLES>,
vehicleData[MAX_VEHICLES][vehicleEnumerator];
public OnGameModeInit() {
// TextDraws erstellen!
// ...
// Autos erstellen:
new vehicleID = CreateVehicle(/* ... */);
Iter_Add(vehicleIterator, vehicleID);
vehicleData[vehicleID][vFuelTimerHandle] = SetTimerEx("fuelTimer", FUEL_TIMER_INTERVAL, false, "i", vehicleID);
return 1;
}
public OnPlayerStateChange(playerid, newstate, oldstate) {
if(newstate == PLAYER_STATE_DRIVER) {
updateFuelTextDraws(playerid, floatround(vehicleData[GetPlayerVehicleID(playerid)][vTank] / 20, floatround_ceil));
} else if(oldstate == PLAYER_STATE_DRIVER) {
updateFuelTextDraws(playerid, 0);
}
return 1;
}
forward fuelTimer(vehicleID);
public fuelTimer(vehicleID) {
new vParams[7];
GetVehicleParamsEx(vehicleID, vParams[0], vParams[1], vParams[2], vParams[3], vParams[4], vParams[5], vParams[6]);
if(vParams[0] == 1) {
new driver = -1;
foreach(new i : Player) {
if(GetPlayerState(i) == PLAYER_STATE_DRIVER && GetPlayerVehicleID(i) == vehicleID) {
driver = i;
break;
}
}
if(driver != -1) {
updateFuelTextDraws(driver, floatround(vehicleData[vehicleID][vTank] / 20, floatround_ceil));
}
}
}
updateFuelTextDraws(playerid, bars) {
new j;
for(j = 4; j != bars - 1; j--) {
TextDrawHideForPlayer(playerid, fuelBars[j]);
}
for(j = 0; j != (bars > 0) ? (bars - 1) : (bars); j++) {
TextDrawShowForPlayer(playerid, fuelBars[j]);
}
}