Timer Probleme

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 Brotfische & Hallo Jeffry: :D


    Ich habe mal wieder ein Problem, sehr drigend.
    Erst hatte ich ja Spawn Probleme und nun habe ich allgemein Probleme mit meinem Tot System.


    Das Problem ist: Bin ich ganz alleine auf meinem Server geht alles perfekt. Ich sterbe, komme 120 Sekunden auf Friedhof. Logge ich mich währenddessen aus und wieder ein beginnt das Spiel von vorne(so soll es auch sein).
    Jedoch kommt ein 2ter Spieler hinzu, geht die Zeit mega schnell um(in 1 Sekunde steigert sich mein Wert um 6 -8 obwohl er nur 1 höher dürfte).
    Ja und irgendwie killt er den Timer nicht wenn man wieder lebt :/


    Bin ich dann wieder am Leben bekomme ich eine Nachricht "Die Ärzte haben zulange gebraucht......" und der jenige der mit auf dem Server ist(und nicht mal tot war) bekommt diese Nachricht auch o,O



    Hier mal mein Code:
    OnPlayerDeath

    Spoiler anzeigen
    else if(SpielerInfo[playerid][pTot] == 0)
    {
    SpielerInfo[playerid][pTot] = 1;
    Tottime[playerid] = 0;
    GetPlayerPos(playerid,tx[playerid],ty[playerid],tz[playerid]);
    toticon[playerid] = CreatePickup(1254,1,tx[playerid],ty[playerid],tz[playerid],-1);
    format(string, sizeof(string), "%s", SpielerName(playerid));
    totlabel = Create3DTextLabel(string,0xFF0000FF, tx[playerid], ty[playerid], tz[playerid], 32.0, 0);
    format(string,sizeof(string),"%s ist gestorben! Er braucht dringend einen Arzt.",SpielerName(playerid));
    SendFraktionMessage(2, medic, string);
    SpielerInfo[playerid][pTotskin] = 162;
    }


    Mein Timer bei OnPlayerSpawn:


    Spoiler anzeigen
    if(SpielerInfo[playerid][pTot] == 1)
    {
    SetPlayerPos(playerid,-2719.6924,-318.3633,7.8438);
    SetPlayerVirtualWorld(playerid, 1);
    SetPlayerHealth(playerid,10000000000);
    SetPlayerSkin(playerid, SpielerInfo[playerid][pTotskin]);
    SetPlayerWeather(playerid, 8);
    Tottime[playerid] = 0;
    SendClientMessage(playerid,info,"Du bist gestorben. Du musst nun 2 Minuten auf dem Friedhof verbringen.");
    timer[playerid] = SetTimerEx("TotSekunde",1000,true,"i",playerid);
    SetPlayerWantedLevel(playerid, SpielerInfo[playerid][pSterne]);
    }

    Hier der TotSekunde/reanimation/tottimer Public:


    Spoiler anzeigen
    forward TotSekunde();
    public TotSekunde()
    {
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(IsPlayerConnected(i))
    {
    Tottime[i] ++;
    if(Tottime[i] == 120)
    {
    Tottime[i] = 0;
    tottimer(i);
    }
    }
    }
    return 1;
    }
    public tottimer(playerid)
    {
    // tzeit[playerid] --;
    // if(tzeit[playerid] == 0)
    // {
    SetPlayerPos(playerid,-2655.4741,636.9430,14.4531);
    SetPlayerVirtualWorld(playerid,0);
    KillTimer(timer[playerid]);
    SetPlayerHealth(playerid, 100);
    DestroyPickup(toticon[playerid]);
    Delete3DTextLabel(totlabel);
    TogglePlayerControllable(playerid,1);
    SpielerInfo[playerid][pTot] = 0;
    SetPlayerWeather(playerid, 0);
    Tottime[playerid] = 0;
    SetPlayerSkin(playerid,SpielerInfo[playerid][pSkin]);
    SetPlayerWorldBounds(playerid, 999999.9, -999999.9, 999999.9, -999999.9);
    SendClientMessage(playerid, erfolg, "Die Ärzte haben zulange gebraucht. Du wurdest nun im Krankenhaus wiederbelebt.");
    //}
    return 1;
    }

    Spoiler anzeigen
    public reanimation(playerid)
    {
    new Float:x,Float:y,Float:z,string[144];
    GetPlayerPos(playerid,x,y,z);
    for(new i = 0; i<MAX_PLAYERS; i++)
    {
    if(!IsPlayerConnected(i))continue;
    if(SpielerInfo[i][pTot] == 0)continue;
    if(!IsPlayerInRangeOfPoint(playerid,5,tx[i],ty[i],tz[i]))continue;
    format(string,144,"Du hast den Spieler '%s' erfolgreich reanimiert.",SpielerName(i));
    SendClientMessage(playerid,erfolg,string);
    format(string,144,"'%s' hat dich erfolgreich reanimiert.",SpielerName(playerid));
    SendClientMessage(i,erfolg,string);
    SetPlayerWorldBounds(playerid, 999999.9, -999999.9, 999999.9, -999999.9);
    SetPlayerHealth(i, 100);
    SetPlayerPos(i,x,y,z);
    KillTimer(timer[i]);
    DestroyPickup(toticon[i]);
    Delete3DTextLabel(totlabel);
    SetPlayerWeather(i, 0);
    Tottime[i] = 0;
    SpielerInfo[i][pTot] = 0;
    SetPlayerVirtualWorld(i,0);
    TogglePlayerControllable(i,1);
    TogglePlayerControllable(playerid,1);
    SetPlayerSkin(i,SpielerInfo[i][pSkin]);
    }
    return 1;
    }


    Irgendwie ist bestimmt vieles falsch ^^
    Wie gesagt oben ist alles beschrieben.
    Noch ne kleine Frage, da ich die Zeit ja hochzähle und nicht runter, kommt bei meinem Friedhof befehl ja statt "Du musst noch 120 Sekunden auf dem Friedhof bleiben"
    "Du musst noch 3 Sekunden ....." und das geht hoch auf 120.
    Kann ich das irgendwie machen das es runter geht statt hoch(am public nichts ändern sondern irgendwie im Befehl machen?)


    ocmd:friedhof(playerid, params[])
    {
    new string[144];
    format(string,144,"Friedhof: Du musst noch '%d' Sekunden auf dem Friedhof sein.",Tottime[playerid]);
    SendClientMessage(playerid,info,string);
    return 1;
    }



    Mit freundlichen Grüßen



    Die heutigen Noobs, sind die Profis von morgen! :thumbup:


    Danke an Jeffry für seine ständige Hilfsbereitschaft und freundliche Art. 8)

    Einmal editiert, zuletzt von ENEF ()

  • Jedoch kommt ein 2ter Spieler hinzu, geht die Zeit mega schnell um(in 1 Sekunde steigert sich mein Wert um 6 -8 obwohl er nur 1 höher dürfte).


    Es könnte sein, dass das Problem ist, wenn du stirbst den Timer startest, das kann ich aber so nicht beurteilen, da ich den Code dazu nicht sehe.
    Wenn ich das richtig, sehe verwendest du deinen Timer falsch.
    Du setzt den Timer immer wenn ein Spieler tot ist, für einen Spieler.
    ABER du rufst ihn nicht so auf.
    timer[playerid] = SetTimerEx("TotSekunde",1000,true,"i",playerid);
    //das ruft nach einer Sekunde die Funktion so auf:
    TotSekunde(playerid);


    Du hast dort aber keine Parameter.
    Wenn du schon einen Parameter hast, kannst du ihn auch besser nutzen.


    Alternativ, kannst du den Timer auch dauerhaft laufen lassen, aber dann musst du bedenken, das du abfragen musst, ob der Spieler auch wirklich tot ist.


    Zu deiner zweiten Frage, du könntest das gegenrechnen
    format(string,144,"Friedhof: Du musst noch '%d' Sekunden auf dem Friedhof sein.",120 - Tottime[playerid]);
    Dürfte das richtige Resultat bringen

    "Bevor ich mir Informationen aus der "Bild" hole,
    werde ich anfangen, Wahlergebnisse danach vorauszusagen,
    neben welchen Busch unsere Katze gepinkelt hat."

    Margarete Stokowski

  • Hi,


    danke, das mit dem Command hat super Funktioniert.


    Ich starte den Timer bei OnPlayerSpawn und das auch nur, wenn der Spieler Tot ist, schau:


    else if(SpielerInfo[playerid][pTot] == 1)//Wenn er Tot ist
    {
    SetPlayerPos(playerid,-2719.6924,-318.3633,7.8438);
    SetPlayerVirtualWorld(playerid, 1);
    SetPlayerHealth(playerid,10000000000);
    SetPlayerSkin(playerid, SpielerInfo[playerid][pTotskin]);
    SetPlayerWeather(playerid, 8);
    Tottime[playerid] = 0;
    SendClientMessage(playerid,info,"Du bist gestorben. Du musst nun 2 Minuten auf dem Friedhof verbringen.");
    timer[playerid] = SetTimerEx("TotSekunde",1000,true,"i",playerid);//Startet er den Timer
    SetPlayerWantedLevel(playerid, SpielerInfo[playerid][pSterne]);
    }



    Die heutigen Noobs, sind die Profis von morgen! :thumbup:


    Danke an Jeffry für seine ständige Hilfsbereitschaft und freundliche Art. 8)

  • Ich starte den Timer bei OnPlayerSpawn und das auch nur, wenn der Spieler Tot ist, schau:


    Ich hab das vorhin nur übersehen, schau nochmal in den Beitrag, dort hab ich es bereits editiert

    "Bevor ich mir Informationen aus der "Bild" hole,
    werde ich anfangen, Wahlergebnisse danach vorauszusagen,
    neben welchen Busch unsere Katze gepinkelt hat."

    Margarete Stokowski

  • timer[playerid] = SetTimerEx("TotSekunde",1000,true,"i",playerid);//Startet er den Timer
    Der Parameter macht ja Sinn,du benutzt ihn aber nie:
    forward TotSekunde();
    public TotSekunde()
    {
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(IsPlayerConnected(i))
    {
    Tottime[i] ++;
    if(Tottime[i] == 120)
    {
    Tottime[i] = 0;
    tottimer(i);
    }
    }
    }
    return 1;
    }
    Anstatt durch alle Spieler mit der Schleife zu gehen, nutzt doch den Parameter den du mit SetTimerEx übergibst.

  • Hallo,


    es scheint nun alles zu funktionieren, bin noch Anfänger sorry :)


    Danke für die schnelle Hilfe und gute Erklärung!


    Habe es jetzt so wie ihr gesagt habt:

    Spoiler anzeigen
    forward TotSekunde(playerid);
    public TotSekunde(playerid)
    {
    if(IsPlayerConnected(playerid))
    {
    Tottime[playerid] ++;
    if(Tottime[playerid] == 120)
    {
    Tottime[playerid] = 0;
    tottimer(playerid);
    }
    }
    return 1;
    }


    Mit freundlichen Grüßen



    Die heutigen Noobs, sind die Profis von morgen! :thumbup:


    Danke an Jeffry für seine ständige Hilfsbereitschaft und freundliche Art. 8)