Beitrag von Nathan1995 ()
Dieser Beitrag wurde vom Autor gelöscht ().
Also erstmal: Du erstellst einen Timer innerhalb einer schleife. Das heisst bei dem Befehl /coutndown und den anderen publics werden 500 Timer (!) erstellt. Das solltest du auf keinen fall tun. Zudem solltest du eine IsPlayerConnected abfrage mit in die schleife bringen. Und eine Globale variable anzulegen halte ich auch für überflüssig.
Versuch es mal so:
forward Countdown(playerid);
forward Countdown2(playerid);
forward Countdown3(playerid);
forward Countdown4(playerid);
if(strcmp("/Countdown",cmdtext,true)==0||strcmp("/CD",cmdtext,true)==0)
{
new Float:X, Float:Y, Float:Z;
GetPlayerPos(playerid, X, Y, Z);
for(new i=0;i<MAX_PLAYERS;i++)
{
if(IsPlayerConnected(i) && IsPlayerInRangeOfPoint(i,30,X,Y,Z) && IsPlayerInAnyVehicle(i))
{
SendClientMessage(i,Gelb,"Countdown wurde auf 3 Sekunden gestellt!");
TogglePlayerControllable(i,0);
}
}
SetTimer("Countdown",1000,false);
return 1;
}
public Countdown(playerid)
{
for(new i=0;i<MAX_PLAYERS;i++)
{
if(IsPlayerConnected(i) && IsPlayerInRangeOfPoint(i,30,X,Y,Z) && IsPlayerInAnyVehicle(i))
{
SendClientMessage(CountDown,Gelb,"3!");
}
}
SetTimer("Countdown2",1000,false);
}
public Countdown2(playerid)
{
for(new i=0;i<MAX_PLAYERS;i++)
{
if(IsPlayerConnected(i) && IsPlayerInRangeOfPoint(i,30,X,Y,Z) && IsPlayerInAnyVehicle(i))
{
SendClientMessage(CountDown,Gelb,"2!");
}
}
SetTimer("Countdown3",1000,false);
}
public Countdown3(playerid)
{
for(new i=0;i<MAX_PLAYERS;i++)
{
if(IsPlayerConnected(i) && IsPlayerInRangeOfPoint(i,30,X,Y,Z) && IsPlayerInAnyVehicle(i))
{
SendClientMessage(CountDown,Gelb,"1!");
}
}
SetTimer("Countdown4",1000,false);
}
public Countdown4(playerid)
{
for(new i=0;i<MAX_PLAYERS;i++)
{
if(IsPlayerConnected(i) && IsPlayerInRangeOfPoint(i,30,X,Y,Z) && IsPlayerInAnyVehicle(i))
{
SendClientMessage(i,Gelb,"GO GO GO GO GO GO GO GO GO");
TogglePlayerControllable(i,1);
}
}
}
Aber auch hier ein kleiner Hinweis:
Du kannst den ganzen Spaß auch angenehmer gestalten, in dem du nur einen Timer nutzt!
Wie kann das Problem gelöst werden mit nur einem Timer?
1. Variable counter = 3
2. Der Timer wird jede Sekunde aufgerufen, repeat true
3. Im Timer wird counter als "3" ausgegeben und dann um einen verringert: counter--
4. Wenn counter == 0 : GoGoGo & Timer killen
Probiere ein wenig schonender und sauberer zu scripten
1. Dein Index (playerid) ist unnötig, es ändert sich nicht viel.
Du startest deinen Timer, der jede Sekunde aufgerufen wird ganz normal, nur dass du jetzt sagst, das er ihn immer wiedeholen soll.
Und am Ende killst du den Timer: siehe wiki : KillTimer
Nöööö Schick mal den Teil, den du schon geändert hast zu einem Timer, mit KillTimer und co
Ist eigentlich nicht mehr weit entfernt
Grober Aufbau
SetTimer("MeinTimer", 1000, true);
public MeinTimer()
{
switch (counter)
{
case 3:
{
}
[...]
case 0:
{
--> Hier Timer killen
}
}
counter--;
}
Weil durch den Timer immer die Funktion Counter aufgerufen wird, und somit immer wieder counter auf 3 gesetzt wird. Mach new counter=3; mal global dann sollte es gehen. Und vergiss nicht es bei case 0 wieder auf 3 zu setzen.