Timer Problem

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
  • Ich habe derzeit ein Problem it meinem Timer.


    Dieser spawnt den User nicht neu sobald die knastzeit abgelaufen ist.




    forward SetPlayerUnjail(playerid);
    public SetPlayerUnjail(playerid)
    {
    PlayerInfo[playerid][pJailTime]--;
    if(PlayerInfo[playerid][pJailTime]>0)
    {
    new string[128];
    format(string, sizeof(string), "Knastzeit %d Sekunden [%d Minuten] eingesperrt.",PlayerInfo[playerid][pJailTime],PlayerInfo[playerid][pJailTime]/60);
    GameTextForPlayer(playerid,string,259200000,3);
    }
    else if(PlayerInfo[playerid][pJailTime] == 0)
    {
    SpawnPlayer(playerid);
    }
    return 1;
    }

  • Wie startest du den Timer?
    Siehst du den GameText?

    Ich rufe den Timer wie folgt z.b beim Connecten auf



    if(PlayerInfo[playerid][pJailTime])
    {
    new string[128];
    SetTimer("SetPlayerUnjail", 1000, 1);
    SendClientMessage(playerid,COLOR_BUSBLUE,"Verbrecher gehören in den Knast!");
    SendClientMessage(playerid,COLOR_BUSBLUE,"Rein mit dir!");
    new Time = PlayerInfo[playerid][pJailTime], Min = Time/60, Sek = Time - Min*60;
    format(string,sizeof(string),"Du bist noch für %d Minuten und %d Sekunden im Knast!",Min,Sek);
    SendClientMessage(playerid,COLOR_BUSBLUE,string);
    SetPlayerPos(playerid,265.9037,77.2875,1001.0391);
    SetPlayerInterior(playerid,6);
    }


    Was ich glaub noch vergessen habe, den Timer zu killen daher sende ich nochmal den neuen Code der einen Funktion



    forward SetPlayerUnjail(playerid);
    public SetPlayerUnjail(playerid)
    {
    PlayerInfo[playerid][pJailTime]--;
    if(PlayerInfo[playerid][pJailTime]>0)
    {
    new string[128];
    new Time = PlayerInfo[playerid][pJailTime], Min = Time/60, Sek = Time - Min*60;
    format(string,sizeof(string),"%d Minuten %d Sekunden",Min,Sek);
    GameTextForPlayer(playerid,string,2000,3);
    }
    else if(PlayerInfo[playerid][pJailTime] == 0)
    {
    SetTimerEx("SpawnTimer",2000,false,"i",playerid);
    GameTextForPlayer(playerid,"Versuche ein besserer Mensch zusein",10000,3);
    KillTimer(SetPlayerUnjail(playerid));
    }
    return 1;
    }


    // Edit Frage vergessen zu beantworten



    Ja den Timer sehe ich bis er uf 0 ist bzw auf 1 Sekunde ausgelaufen ist. Danach zeigt er nichts mehr an

  • Das klappt so nicht wirklich, nur für ID 0.
    Mache es so:
    Unter den Includes:
    new jailTimer[MAX_PLAYERS] = {-1,...}; //Das ... setzt alle Indizes auf -1


    Dann den Timer so starten:
    SetTimer("SetPlayerUnjail", 1000, 1);
    ändern zu:
    if(jailTimer[playerid] != -1) KillTimer(jailTimer[playerid]);
    jailTimer[playerid] = SetTimerEx("SetPlayerUnjail", 1000, 1, "d", playerid);


    Und das Public so:
    forward SetPlayerUnjail(playerid);
    public SetPlayerUnjail(playerid)
    {
    PlayerInfo[playerid][pJailTime]--;
    if(PlayerInfo[playerid][pJailTime]>0)
    {
    new string[128];
    new Time = PlayerInfo[playerid][pJailTime], Min = Time/60, Sek = Time - Min*60;
    format(string,sizeof(string),"%d Minuten %d Sekunden",Min,Sek);
    GameTextForPlayer(playerid,string,2000,3);
    }
    else
    {
    SetTimerEx("SpawnTimer",2000,false,"i",playerid);
    GameTextForPlayer(playerid,"Versuche ein besserer Mensch zusein",10000,3);
    if(jailTimer[playerid] != -1) KillTimer(jailTimer[playerid]);
    jailTimer[playerid] = -1;
    }
    return 1;
    }


    Bei OnPlayerDisconnect:
    if(jailTimer[playerid] != -1) KillTimer(jailTimer[playerid]);
    jailTimer[playerid] = -1;

  • Schein irgendwas nicht bei zu klappen. Bekomme nichtmal mehr den Timer angezeigt.




    if(PlayerInfo[playerid][pJailTime])
    {

    new string[128];
    jailTimer[playerid] = SetTimerEx("SetPlayerUnjail", 1000, 1, "d", playerid);
    if(jailTimer[playerid] != -1) KillTimer(jailTimer[playerid]);
    SendClientMessage(playerid,COLOR_BUSBLUE,"Rein mit dir!");
    SendClientMessage(playerid,COLOR_BUSBLUE,"Verbrecher gehören in den Knast!");
    new Time = PlayerInfo[playerid][pJailTime], Min = Time/60, Sek = Time - Min*60;
    format(string,sizeof(string),"Du bist noch für %d Minuten und %d Sekunden im Knast!",Min,Sek);
    SendClientMessage(playerid,COLOR_BUSBLUE,string);
    SetPlayerPos(playerid,265.9037,77.2875,1001.0391);
    SetPlayerInterior(playerid,6);
    }

  • jailTimer[playerid] = SetTimerEx("SetPlayerUnjail", 1000, 1, "d", playerid);
    if(jailTimer[playerid] != -1) KillTimer(jailTimer[playerid]);

    Das ist ja auch quatsch...du setzt den Timer...(dann ist er immer != -1) und dann killst du ihn direkt :rolleyes:

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

  • Das ist ja auch quatsch...du setzt den Timer...(dann ist er immer != -1) und dann killst du ihn direkt :rolleyes:

    Das war auch schon der Fehler. Hoffe ich zumindest mal. Also ich hab es nun folgendermaßen gemacht




    if(PlayerInfo[playerid][pJailTime])
    {

    new string[128];
    jailTimer[playerid] = SetTimerEx("SetPlayerUnjail", 1000, 1, "d", playerid);
    if(jailTimer[playerid] == -1) KillTimer(jailTimer[playerid]);
    SendClientMessage(playerid,COLOR_BUSBLUE,"Rein mit dir!");
    SendClientMessage(playerid,COLOR_BUSBLUE,"Verbrecher gehören in den Knast!");
    new Time = PlayerInfo[playerid][pJailTime], Min = Time/60, Sek = Time - Min*60;
    format(string,sizeof(string),"Du bist noch für %d Minuten und %d Sekunden im Knast!",Min,Sek);
    SendClientMessage(playerid,COLOR_BUSBLUE,string);
    SetPlayerPos(playerid,265.9037,77.2875,1001.0391);
    SetPlayerInterior(playerid,6);
    }

  • Schein irgendwas nicht bei zu klappen. Bekomme nichtmal mehr den Timer angezeigt.

    Du hast zuerst den Timer gestartet und dann den Timer eine Zeile drunter wieder beendet, also die beiden Zeilen, die ich dir gegeben habe, vertauscht.


    Ich habe dir auch noch das format angepasst, damit du da keine Variablen brauchst, ist etwas geschickter dann:
    if(PlayerInfo[playerid][pJailTime])
    {
    new string[128];
    if(jailTimer[playerid] != -1) KillTimer(jailTimer[playerid]);
    jailTimer[playerid] = SetTimerEx("SetPlayerUnjail", 1000, 1, "d", playerid);
    SendClientMessage(playerid,COLOR_BUSBLUE,"Rein mit dir!");
    SendClientMessage(playerid,COLOR_BUSBLUE,"Verbrecher gehören in den Knast!");
    format(string,sizeof(string),"Du bist noch für %d Minuten und %d Sekunden im Knast!",PlayerInfo[playerid][pJailTime]/60,PlayerInfo[playerid][pJailTime]%60);
    SendClientMessage(playerid,COLOR_BUSBLUE,string);
    SetPlayerPos(playerid,265.9037,77.2875,1001.0391);
    SetPlayerInterior(playerid,6);
    }


    /60 gibt die Minuten an
    und %60 ist Modulo 60, da gibt den Rest an, der bei einer Teilung durch 60 übrig bleibt, was in dem Fall den Sekunden entspricht.
    Kleiner Trick am Rande :)

  • Oh supi danke :D