Timer oder Schleife Problem! startet der Timer nicht oder ist Schleife falsch?

Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • 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

  • Du kannst auch OnUnoccupiedVehicleUpdate dieses Callback ist für die synchonisation zwischen Fahrzeugen und Server verantwortlich.
    Ist wie OnPlayerUpdate dann brauchst du kein sekunden timer der "Timer" ist für jedes Auto auf dem Server also wird für jedes aufgerufen
    http://wiki.sa-mp.com/wiki/OnUnoccupiedVehicleUpdate
    Du kannst ruhig mit der hp anzahl höher gehen so ab 100 fängt das fahrzeug oder sogar noch ein wenig höher an zu brennen