SetTimerEx Bug

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


    Ich habe versucht ein Verletzungssystem zu erstellen aber der Killtimer funkzuniert nicht.


    Man sollte unter 6 hp auf dem Boden liegen und einen Textdraw bekommen. Das klappt.
    Wenn man mehr als 6 hp hat sollte man wieder aufstehen können und der Textdraw sollte verschwienden. Das klappt auch.
    ab 6 hp sollte der Timer verschwienden aber man stirbt trotzdem nach 60 sek obwohl man mehr wie 6 hp hat.




    new Verletzttimer[MAX_PLAYERS];



    //das ist bei OnplayerUpdate


    new Float:bhealth;
    GetPlayerHealth(playerid, bhealth);
    if(bhealth > 6.0)
    {
    TextDrawHideForPlayer(playerid,VERLETZT);
    TextDrawShowForPlayer(playerid,Ts3);
    TextDrawShowForPlayer(playerid,TsIp);
    KillTimer(Verletzttimer[playerid]);
    }
    else if(bhealth < 6.0)
    {
    LoopingAnim(playerid, "SWEET", "Sweet_injuredloop", 2.5, 1, 0, 0, 0, 0); // Dieing of Crac
    RemovePlayerFromVehicle(playerid);
    TextDrawShowForPlayer(playerid,VERLETZT);
    TextDrawHideForPlayer(playerid,Ts3);
    Verletzttimer[playerid] = SetTimerEx("verletztsein",60000,0,"i",playerid);
    TextDrawHideForPlayer(playerid,TsIp);
    }



    forward verletztsein(playerid);
    public verletztsein(playerid)
    {
    SetPlayerHealth(playerid,0);
    return 1;
    }


    MFG

  • Hey, das liegt daran, dass der Inhalt oben wahrscheinlich in einem Timer steht.
    Wird der Timer mehrfach aufgerufen, wird der Timer auch mehrfach gestartet.
    D.h. du musst dafür Sorge tragen, dass der Timer wirklich nur 1x gestartet wird.


    z.B.

    new Float:bhealth;
    GetPlayerHealth(playerid, bhealth);
    if(bhealth > 6.0)
    {
    TextDrawHideForPlayer(playerid,VERLETZT);
    TextDrawShowForPlayer(playerid,Ts3);
    TextDrawShowForPlayer(playerid,TsIp);
    KillTimer(Verletzttimer[playerid]);
    SetPVarInt(playerid,"verletzt_timer",0);
    }
    else if(bhealth < 6.0 && GetPVarInt(playerid,"verletzt_timer") != 1)
    {
    LoopingAnim(playerid, "SWEET", "Sweet_injuredloop", 2.5, 1, 0, 0, 0, 0); // Dieing of Crac
    RemovePlayerFromVehicle(playerid);
    TextDrawShowForPlayer(playerid,VERLETZT);
    TextDrawHideForPlayer(playerid,Ts3);
    Verletzttimer[playerid] = SetTimerEx("verletztsein",60000,0,"i",playerid);
    TextDrawHideForPlayer(playerid,TsIp);
    SetPVarInt(playerid,"verletzt_timer",1);
    }


    E: Was heißt wahrscheinlich, OnPlayerUpdate kann mehr als 10x pro Sekunde aufgerufen werden. xD



    Gruß.

  • Das liegt daran, dass der Timer X mal gestartet wird, wenn du weniger als 6 Healthpunkte hast, jedes mal wenn OnPlayerUpdate aufgerufen wird wird der Timer nochmal gestartet (nicht von vorne, sondern parallel so den bereits existierenden).


    Empfehlenswert wäre es so zu machen:
    new Float:bhealth;
    GetPlayerHealth(playerid, bhealth);
    if(Verletzttimer[playerid] != -1 && bhealth > 6.0)
    {
    TextDrawHideForPlayer(playerid,VERLETZT);
    TextDrawShowForPlayer(playerid,Ts3);
    TextDrawShowForPlayer(playerid,TsIp);
    KillTimer(Verletzttimer[playerid]);
    Verletzttimer[playerid] = -1;
    }
    else if(Verletzttimer[playerid] == -1 && bhealth <= 6.0)
    {
    LoopingAnim(playerid, "SWEET", "Sweet_injuredloop", 2.5, 1, 0, 0, 0, 0); // Dieing of Crac
    RemovePlayerFromVehicle(playerid);
    TextDrawShowForPlayer(playerid,VERLETZT);
    TextDrawHideForPlayer(playerid,Ts3);
    Verletzttimer[playerid] = SetTimerEx("verletztsein",60000,0,"i",playerid);
    TextDrawHideForPlayer(playerid,TsIp);
    }


    Und bei der Deklaration:
    new Verletzttimer[MAX_PLAYERS] = {-1,...}; //Setzt alle Indizes auf -1


    Nach der Methode von iEnerqie würde es zwar auf den ersten Blick auch klappen, allerdings wird die Variable vom Timer nicht zurückgesetzt, und da bei > 6.0 die Prüfung fehlt, ob der Timer läuft, wird der Timer mit der ID X ständig beendet. Bekommt ein anderer Timer diese ID zugewiesen, dann wird dieser Timer sofort beendet (ist wie bei den playerids, wenn du ständig versuchst, ID 10 zu kicken, irgendwann bekommt wieder einer die ID 10 und wird sofort gekickt).


    Zu deiner Frage:
    Das _ könnte hier bestehen bleiben, da die pVar nichts mit dem Array zu tun hat. Eine pVar und ein Array gleichzeitig zu nutzen macht aber keinen Sinn, da man es allein über das Array regeln kann (siehe Code).