Der Code ist aber ziemlich abenteuerlich.
OnPlayerStateChange kannst du so machen:
if(newstate == PLAYER_STATE_DRIVER)
{
if(!IsANoTachoVehicle(GetPlayerVehicleID(playerid)))
{
TextDrawShowForPlayer(playerid, Speedo[playerid]);
//SetTimerEx("Speedometer", 100, 1, "d", playerid);
//Ich habe diesen Timer auskommentiert, da er jedes mal gestartet würde,
//wenn du in ein Fahrzeug einsteigst, das einen Tacho hat, sprich irgendwann
//hast du 1000 Timer am Laufen, von denen jeder 10x pro Sekunde aufgerufen
//wird. Deine CPU wird dir das nicht danken ;)
//Also besser so:
speedoTimer[playerid] = SetTimerEx("Speedometer", 100, 1, "d", playerid);
//Und den Timer auch wieder beenden, wenn der Speedometer nicht mehr angezeigt wird.
//Oder noch besser ist es, einen einzigen globalen Timer mit einer Schleife durch
//alle Spieler zu machen, der Timer wird dann bei OnGameModeInit gestartet.
if(IsABike(GetPlayerVehicleID(playerid)))
{
timer2[playerid] = SetTimerEx("TankTimer",60000,1,"i",playerid);
}
else
{
timer2[playerid] = SetTimerEx("TankTimer",20000,1,"i",playerid);
}
}
//Hier der Code für die Roller:
new veh = GetPlayerVehicleID(playerid);
for(new i=0; i<sizeof(rentroller); i++)
{
if(veh == rentroller[i])
{
SendClientMessage(playerid,0xF60000F6,"Dieses Fahrzeug kannst du mieten! Tippe /rentcar, wenn du nicht möchtest, dann /verlassen.");
SendClientMessage(playerid,0xF60000F6,"Das Auto wird nach 30 Minuten respawnt.");
TogglePlayerControllable(playerid,0);
break;
}
}
}
Alles anzeigen
Den /rentcar Befehl kannst du dann so machen:
if(!strcmp("/rentcar", cmdtext, true))
{
new veh = GetPlayerVehicleID(playerid);
for(new i=0; i<sizeof(rentroller); i++)
{
if(veh == rentroller[i])
{
new kosten;
switch(i)
{
case 0: kosten = 100;
case 1: kosten = 250;
case 2: kosten = 2000;
//...
default: kosten = 500;
}
if(GetPlayerMoney(playerid) <= kosten) return SendClientMessage(playerid,0xF60000F6,"Du hast nicht genügend Geld!");
SendClientMessage(playerid,0xF60000F6,"Du hast dieses Auto gemietet!");
TogglePlayerControllable(playerid,1);
GivePlayerMoney(playerid,kosten);
return 1;
}
}
return SendClientMessage(playerid, 0xFF0000FF, "Error: Dies ist kein Auto, das gemietet werden kann.");
}
Alles anzeigen
Der /verlassen Befehl bleibt weitgehend gleich.
Wenn du es nun anpassen willst, dass das Fahrzeug für genau 30 Minuten aktiv ist, dann musst du eine Spielervariable anlegen, in der du den Wert speicherst, wann die Zeit vorbei ist und eine Variable die die Index ID beinhaltet, unter den Includes:
new rentTime[MAX_PLAYERS];
new rentIdx[MAX_PLAYERS];
Sowie eine Variable um das Fahrzeug als gemietet zu markieren (-1 = nicht vermietet):
new rentBlocked[MAX_VEHICLES] = {-1,...};
Unter OnGameModeInit startest du einen Prüf-Timer:
SetTimer("CheckRentCars", 5000, true);
[wiki]SetTimer[/wiki]
Und der Code dazu:
forward CheckRentCars();
public CheckRentCars()
{
for(new i=0; i<MAX_PLAYERS; i++)
{
if(IsPlayerConnected(i) && rentTime[i] != 0 && rentTime[i] < gettime())
{
new idx = rentIdx[playerid];
SetVehicleToRespawn(rentroller[idx]);
SendClientMessage(i, 0xFF0000FF, "Zeit vorbei.");
rentTime[i] = 0;
}
}
return 1;
}
Alles anzeigen
Den /rentcar Befehl musst du dann so anpassen:
if(!strcmp("/rentcar", cmdtext, true))
{
if(rentTime[playerid] != 0) return SendClientMessage(playerid, 0xFF0000FF, "Error: Du hast bereits ein Auto gemietet.");
new veh = GetPlayerVehicleID(playerid);
for(new i=0; i<sizeof(rentroller); i++)
{
if(veh == rentroller[i])
{
new kosten;
switch(i)
{
case 0: kosten = 100;
case 1: kosten = 250;
case 2: kosten = 2000;
//...
default: kosten = 500;
}
if(GetPlayerMoney(playerid) <= kosten) return SendClientMessage(playerid,0xF60000F6,"Du hast nicht genügend Geld!");
SendClientMessage(playerid,0xF60000F6,"Du hast dieses Auto gemietet!");
TogglePlayerControllable(playerid,1);
GivePlayerMoney(playerid,kosten);
rentTime[playerid] = gettime() + 30 * 60 * 1000; //30 Minuten zu je 60 Sekunden und 1000ms.
rentIdx[playerid] = i;
rentBlocked[i] = playerid;
return 1;
}
}
return SendClientMessage(playerid, 0xFF0000FF, "Error: Dies ist kein Auto, das gemietet werden kann.");
}
Alles anzeigen
Bei OnPlayerDisconnect zum Beispiel:
if(rentTime[playerid] != 0)
{
new idx = rentIdx[playerid];
SetVehicleToRespawn(rentroller[idx]);
rentTime[playerid] = 0;
rentBlocked[idx] = -1;
}
Und das OnPlayerStateChange sieht dann so aus:
if(newstate == PLAYER_STATE_DRIVER)
{
if(!IsANoTachoVehicle(GetPlayerVehicleID(playerid)))
{
TextDrawShowForPlayer(playerid, Speedo[playerid]);
//SetTimerEx("Speedometer", 100, 1, "d", playerid);
//Ich habe diesen Timer auskommentiert, da er jedes mal gestartet würde,
//wenn du in ein Fahrzeug einsteigst, das einen Tacho hat, sprich irgendwann
//hast du 1000 Timer am Laufen, von denen jeder 10x pro Sekunde aufgerufen
//wird. Deine CPU wird dir das nicht danken ;)
//Also besser so:
speedoTimer[playerid] = SetTimerEx("Speedometer", 100, 1, "d", playerid);
//Und den Timer auch wieder beenden, wenn der Speedometer nicht mehr angezeigt wird.
//Oder noch besser ist es, einen einzigen globalen Timer mit einer Schleife durch
//alle Spieler zu machen, der Timer wird dann bei OnGameModeInit gestartet.
if(IsABike(GetPlayerVehicleID(playerid)))
{
timer2[playerid] = SetTimerEx("TankTimer",60000,1,"i",playerid);
}
else
{
timer2[playerid] = SetTimerEx("TankTimer",20000,1,"i",playerid);
}
}
//Hier der Code für die Roller:
new veh = GetPlayerVehicleID(playerid);
for(new i=0; i<sizeof(rentroller); i++)
{
if(veh == rentroller[i])
{
if(rentBlocked[i] == -1)
{
SendClientMessage(playerid,0xF60000F6,"Dieses Fahrzeug kannst du mieten! Tippe /rentcar, wenn du nicht möchtest, dann /verlassen.");
SendClientMessage(playerid,0xF60000F6,"Das Auto wird nach 30 Minuten respawnt.");
TogglePlayerControllable(playerid,0);
}
else
{
SendClientMessage(playerid,0xF60000F6,"Dieses Fahrzeug gehört bereits einem Spieler.");
RemovePlayerFromVehicle(playerid);
}
break;
}
}
}
Alles anzeigen
Beachte bitte die Kommentare im Code und passie die Stellen entsprechend an.