Hallo Leute,
ich habe gerade ein System erstellt, das der Feuerwehr mehr Arbeit machen soll. Wenn ein Spieler mit seinem Auto einen Unfall baut, sodass das Auto anfängt zu brennen, soll das Leben des Autos immer wieder auf 24 gesetzt werden und der Spieler im Auto gefreezet sein (dies simmultiert einen Unfall, bei dem der Spieler im Auto eingeklemmt ist). Danach wird die Feuerwehr verständigt, welche den Auftrag mit "/accept feuer" annehmen kann. Sollte kein Ferwehrmann den Auftrag annehmen, so wird der Spieler nach 30 Sekunden entfreezet und aus dem Auto gerworfen (er konnte sich doch befreien) und der Timer, welcher das Auto repariert wird gestoppt. Das System ist eigentlich gut durchdacht, jedoch hängt es schon am Anfang. Wenn ein Auto brennt, wird weder die Feuerwehr verständigt, noch wird der Spieler gefreezet etc. Es klappt also nichts, da es schon ganz am Anfang Probleme gibt. Ich hoffe auf eure Hilfe.
Hier die Scriptausschnitte:
globale Variablen:
new feuerKHT[MAX_PLAYERS]; //falls kein Feuerwehrmann annimmt Timer (benötigt um Timer zu stoppen)
new feuerAHT[MAX_PLAYERS]; //Timer, welcher das Leben des Autos wieder auf 24 setzt (benötigt um Timer zu stoppen)
new feuer[MAX_PLAYERS]; //falls das Auto eines Spielers brennt und schon alles aus der Schleife ausgeführt wurde, wird der Wert auf 1 gesetzt und die Schleife beim nächsten mal übersprungen
new notrufid[MAX_PLAYERS] = 888; //damit wird die ID des Spielers, welcher einen Notruf abgibt gespeichert (benötigt für "/accept feuer")
new Float:notrufx,Float:notrufy,Float:notrufz; //Koodinaten des Spielers, welcher den Notruf abgibt (benötigt um Checkpoint für Feuerwehrmann zu setzten, nachdem er "/accept feuer" gemacht hat)
Der Timer, welcher prüft, ob das Auto brennt:
Bei ongamemodeinit:
public OnGameModeInit()
{
SetTimer("feuerT",1000,false); //Der Timer überprüft, ob das Auto eines Spielers brennt
//...
und der Timer an sich:
forward feuerT();
public feuerT()
{
for(new i=0; i<GetMaxPlayers(); i++)
{
if(IsPlayerConnected(i))
{
if(IsPlayerInAnyVehicle(i))
{
new Float:health[MAX_PLAYERS];
new veh[MAX_PLAYERS];
veh[i] = GetPlayerVehicleID(i);
GetVehicleHealth(veh[i], health[i]);
if(health[i] < 24) //Abfrage ob das Auto brennt
{
if(feuer[i] == 0) //Abfrage ob das Auto schon vorher brannte
{
TogglePlayerControllable(i,0); //Spieler wird gefreezet (weil er eingeklemmt ist)
SendClientMessage(i,GELB,"Dein Auto brennt und du kannst dich nicht befreien! Ruf die Feuerwehr mit /112!");
SendClientMessage(i,GELB,"Sollte keine Feuerwehr kommen, so kannst du in 30 Sekunden erneut versuchen dich zu befreien!");
feuerAHT[i]=SetTimerEx("feuerTAH",1000,false,"i",i); //Timer der das Auto des Spielers repariert wird gestartet
feuerKHT[i]=SetTimerEx("feuerTKH",30000,false,"i",i); //Timer falls kein Feuerwehrmann kommt wird gestartet
feuer[i] = 1; //Wird auf 1 gesetzt, damit das oben ausgeführte nich wiederholt wird
}
}
}
}
}
SetTimer("feuerT",1000,false); //Timer welcher überprüft, ob das Auto brennt wird erneut gestartet
return 1;
}
Der Reperatur Timer:
forward feuerTAH(playerid);
public feuerTAH(playerid)
{
new Float:health;
new veh;
veh = GetPlayerVehicleID(playerid);
GetVehicleHealth(veh, health);
if(health < 24)
{
SetVehicleHealth(GetPlayerVehicleID(playerid),23); //Auto wird repariert
feuerAHT[playerid]=SetTimerEx("feuerTAH",1000,false,"i",playerid); //Timer wird wiederholt
return 1;
}
else
{
TogglePlayerControllable(playerid,1); //falls etwas falsch läuft kann der Spieler sich nun wieder bewegen
return 1;
}
}
Der Timer der den Spieler befreit, wenn kein Feuerwehrmann kommt:
forward feuerTKH(playerid);
public feuerTKH(playerid)
{
new Float:health;
new veh;
veh = GetPlayerVehicleID(playerid);
GetVehicleHealth(veh, health);
if(health < 24)
{
RemovePlayerFromVehicle(playerid);
TogglePlayerControllable(playerid,1);
SendClientMessage(playerid,GRUEN,"Du konntest dich aus deinem Auto befreien!");
KillTimer(feuerAHT[playerid]);
feuer[playerid] = 0;
return 1;
}
return 1;
}
Der Notruf Befehl (/112):
Der Befehl an sich:
if(strcmp("/112", cmdtext, true) == 0)
{
ShowPlayerDialog(playerid,NOTRUFFK,DIALOG_STYLE_LIST,"Wo möchtest du anrufen?","Feuerwehr\nKrankenhaus","Auswählen","Schließen");
return 1;
}
Der Dialog des Befehls:
if(dialogid == NOTRUFFK)
{
if(response == 0)
{
return 1;
}
if(response == 1)
{
switch(listitem)
{
case 0:
{
for(new i=0; i<GetMaxPlayers(); i++)
{
if(IsPlayerConnected(i))
{
if(IstSpielerInFraktion(i,9)) //Feuerwehr
{
GetPlayerPos(playerid,notrufx,notrufy,notrufz);
new string[128];
format(string,sizeof(string),"%s braucht Hilfe von der Feuerwehr! ('/accept feuer' zum annehmen)",SpielerName(playerid));
SendClientMessage(i,GELB,string);
notrufid[i] = playerid;
}
}
}
}
case 1:
{
for(new i=0; i<GetMaxPlayers(); i++)
{
if(IsPlayerConnected(i))
{
if(IstSpielerInFraktion(i,2)) //Sanitäter
{
new string[128];
format(string,sizeof(string),"%s braucht einen Krankenwagen! ('/accept heal' zum annehmen)",SpielerName(playerid));
SendClientMessage(i,GELB,string);
}
}
}
}
}
}
}
Der "/accept feuer" Befehl:
if(strcmp("/accept feuer", cmdtext, true) == 0)
{
if(IstSpielerInFraktion(playerid,9))
{
if(notrufid[playerid] != 888)
{
KillTimer(feuerKHT[notrufid[playerid]]); //Der Timer (falls kein Feuerwehrmann kommt) des Spielers der den Notruf abgegeben hat wird gestoppt
new string[128];
format(string,sizeof(string),"%s hat deinen Notruf angenommen und ist zu dir unterwegs!",SpielerName(playerid));
SendClientMessage(notrufid[playerid],GRUEN,string);
new stringp[128];
format(stringp,sizeof(stringp),"Du hast den Notruf von %s angenommen! Seine Position wird dir nun auf der Karte angezeigt!",SpielerName(notrufid[playerid]));
SendClientMessage(playerid,GRUEN,stringp);
SetPlayerCheckpoint(playerid,notrufx,notrufy,notrufz,3); //Der Feuerwehrmann bekommt den Checkpoint angezeigt
notrufid[playerid] = 888;
return 1;
}
else
{
return SendClientMessage(playerid,ROT,"Es hat niemand die Feuerwehr gerufen!");
}
}
else
{
return SendClientMessage(playerid,ROT,"Du bist nicht bei der Feuerwehr!");
}
}
mfg
Jan