Timer buggen rum!

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
  • Hey.


    Ich habe bei den meisten Timern / Funktionen von mir ein großes Problem.


    Undzwar wenn ich sie alleine teste , geht alles perfekt , nur wenn mehrere auf dem Server sind nicht.


    zB. bei /verhaften , alleine klappt alles perfekt , bei mehreren wird die Knastzeit und das Geld nur auf 0 gesetzt.


    Dann bei Timern , alleine laufen sie perfekt , bei mehreren Leuten schneller , zB. wenn 2 Leute da sind erhöht sich eine Variable 2x anstatt 1x!


    Beispiel:


    Spoiler anzeigen

    if(deagleeventaktiv)
    {
    for(new i=0;i<MAX_PLAYERS;i++)
    {
    if(deagleeventteilnehmer[i])
    {
    SendClientMessage(playerid,Hellblau,"Das Event wurde gestartet!");
    DeagleTime = 2;
    DeagleTimer = SetTimer("DeagleEventTimer",1000,1);
    }
    }
    }

    Spoiler anzeigen
    public DeagleEventTimer()
    {
    if(DeagleTime >= 1)
    {
    for(new i=0;i<MAX_PLAYERS;i++)
    {
    if(deagleeventteilnehmer[i])
    {
    if(DeagleTime == 2)
    {
    SendClientMessage(i,Hellblau,"Das Event startet in 20 Sekunden.");
    }
    else if(DeagleTime == 7)
    {
    SendClientMessage(i,Hellblau,"Das Event startet in 15 Sekunden.");
    }
    else if(DeagleTime == 12)
    {
    SendClientMessage(i,Hellblau,"Das Event startet in 10 Sekunden.");
    }
    else if(DeagleTime == 19)
    {
    SendClientMessage(i,Hellblau,"Das Event startet in 3 Sekunden.");
    }
    else if(DeagleTime == 20)
    {
    SendClientMessage(i,Hellblau,"Das Event startet in 2 Sekunden.");
    }
    else if(DeagleTime == 21)
    {
    SendClientMessage(i,Hellblau,"Das Event startet in 1 Sekunde.");
    }
    else if(DeagleTime >= 22)
    {
    SendClientMessage(i,Hellblau,"Viel Glück!");
    TogglePlayerControllable(i,1);
    DeagleCheckTimer=SetTimer("DeagleCheck",1000,1);
    DeagleTime=0;
    KillTimer(DeagleTimer);
    }
    }
    }
    DeagleTime++;
    }
    }

  • Zunächsteinmal:


    Beitrag Bearbeiten > Code löschen > Über dem Text Feld über der Grauen Leiste Von "Editor" zu "Quellcode" wechseln > drücken den Code zwischen die Klammern ] & [ kopieren und erneut absenden


    So ist er 1. Im richtigen Format und kein Zitat oder sowas und
    2. Er ist eingerückt und deutlich besser lesbar...


    Merken, danke...



    Und zum Thema:
    Kommt auf die Situation an, manchmal lohnt es sich eher einen SetTimerEx spezifisch für den Spieler der ihn braucht laufen zu lassen.
    Bei dem deinem Beispiel (oh gott wie kann man Variabeln nur so nennen x_x) sehe ich was es werden soll und das du dich vom Tutorial inspiriert lassen hast.
    Aber anstelle bei dem Countdown hochzuzählen, wie wäre es mit herunterzählen? :D
    Ungetestet, ausm Kopf geschrieben...

    if(deagleeventaktiv)
    {
    for(new i=0;i<MAX_PLAYERS;i++)
    {
    if(deagleeventteilnehmer)
    {
    SendClientMessage(playerid,Hellblau,"Das Event wurde gestartet!");
    DeagleTime = 20;
    DeagleTimer = SetTimer("DeagleEventTimer",1000,1);
    }
    }
    }


    public DeagleEventTimer()
    {
    new tstring[128];
    for(new i=0;i<MAX_PLAYERS;i++)
    {
    //Wenn kein Teilnehmer oder nicht On, spring zum nächsten
    if(!deagleeventteilnehmer[i] || !IsPlayerConnected(i)) continue;


    if(DeagleTime == 20 || DeagleTime == 15 || DeagleTime == 10 || DeagleTime >= 3)
    {
    format(tstring,sizeof(tstring),"Das Event startet in %d Sekunden.",DeagleTime);
    SendClientMessage(i,Hellblau,tstring);
    DeagleTime -= 1;
    }
    if(DeagleTime <= 0)
    {
    SendClientMessage(i,Hellblau,"Viel Glück!");
    TogglePlayerControllable(i,1)
    DeagleTime = 0;
    KillTimer(DeagleTimer);
    }
    }
    }

  • Okay danke ^^


    Also ich habs immer im [pwn] Format , nur diesesmal nicht :D


    Ich teste es später aus , wenn mein Kumpel da ist ;)


    Edit: Da wir grade bei dem Deagle-Timer sind , da ist noch ein Problem.


    Undzwar wird nur 1 Spieler unfreezt , der andere bleibt gefreezt !

  • Komplettzitat = Unnötig ;)


    Habs nochmal überarbeitet, so wird die schleife nicht jedesmal, sondern nur wenn sie muss aufgerufen.
    Getestet und funzt.

    public DeagleEventTimer()
    {
    if(DeagleTime == 20 || DeagleTime == 15 || DeagleTime == 10 || DeagleTime == 3 || DeagleTime == 2 || DeagleTime == 1)
    {
    new tstring[40];
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(!deagleeventteilnehmer[i] || !IsPlayerConnected(i)) continue;

    format(tstring,sizeof(tstring),"Das Event startet in %d Sekunden.",DeagleTime);
    SendClientMessage(i,Hellblau,tstring);
    }
    }
    if(DeagleTime <= 0)
    {
    for(new i=0;i<MAX_PLAYERS;i++)
    {
    if(!deagleeventteilnehmer[i] || !IsPlayerConnected(i)) continue;


    SendClientMessage(i,Hellblau,"Viel Glück!");
    TogglePlayerControllable(i,1);
    }
    DeagleTime = 0;
    KillTimer(DeagleTimer);
    }
    DeagleTime -= 1;
    }

  • Okay ich muss es dann später testen wenn er on ist :>


    Edit: Es geht nicht ._.


    Es wird runtergezählt , wenn der Countdown vorbei ist wird "Viel Glück!" gespammt, nur er wurde unfreezt !


    Aber wieso wird die Variable im Timer so oft verringert wie Spieler on sind/teilnehmen?


    zB hier , geht die Variable PayDayZeit jede Sekunde um 2 runter , wenn 2 Spieler online sind!


    public paydaytimer(playerid)
    {
    for(new i=0;i<GetMaxPlayers();i++)
    {
    if(IsPlayerConnected(i) && !IsPlayerNPC(i))
    {
    new Spieler[64];
    format(Spieler,sizeof(Spieler),"Spieler/%s.txt",PlayerName(i));
    //if(PayDayZeit[playerid]<2700)
    if(PayDayZeit[i]>0)
    {
    PayDayZeit[i]--;
    dini_IntSet(Spieler,"Payday",PayDayZeit[i]);
    }
    else
    {
    new geld;
    new gehalt;
    new hartz4;
    new levelbonus = GetPlayerScore(i)*300;
    switch(dini_Int(Spieler,"Fraktionsrang"))
    {
    case 0: {gehalt = 2500;}
    case 1: {gehalt = 4500;}
    case 2: {gehalt = 6000;}
    case 3: {gehalt = 7500;}
    case 4: {gehalt = 10000;}
    case 5: {gehalt = 12500;}
    }
    if(dini_Int(Spieler,"Hartz4")==1)
    {
    hartz4+=750;
    }
    else
    {
    hartz4=0;
    }
    geld=gehalt+hartz4+levelbonus;
    GivePlayerMoney(playerid,geld);
    SendClientMessage(i,Hellblau,"Payday");
    dini_IntSet(Spieler,"Levelpunkte",dini_Int(Spieler,"Levelpunkte")+1);
    new levelpunkteprolevel=GetPlayerScore(i)*2;
    levelpunkteprolevel+=6;
    new gehaltstring[128];
    new hartz4string[128];
    new levelbstring[128];
    new levelustring[128];
    new levelpstring[128];
    format(gehaltstring,sizeof(gehaltstring),"Gehalt: %i€",gehalt);
    format(hartz4string,sizeof(hartz4string),"Hartz IV: %i€",hartz4);
    format(levelbstring,sizeof(levelbstring),"Levelbonus: %i€",levelbonus);
    format(levelustring,sizeof(levelustring),"Glückwunsch! Du bist nun Level %i.",GetPlayerScore(i)+1);
    format(levelpstring,sizeof(levelpstring),"Dir fehlen noch %i Levelpunkte bis Level %i.",levelpunkteprolevel-dini_Int(Spieler,"Levelpunkte"),GetPlayerScore(i)+1);
    SendClientMessage(i,Hellblau,"|_______Payday_______|");
    SendClientMessage(i,Weiss,gehaltstring);
    if(hartz4>0)
    {
    SendClientMessage(i,Weiss,hartz4string);
    }
    SendClientMessage(i,Weiss,levelbstring);
    SendClientMessage(i,Weiss,levelpstring);
    if(dini_Int(Spieler,"Levelpunkte")>=levelpunkteprolevel)
    {
    SetPlayerScore(i,GetPlayerScore(playerid)+1);
    SendClientMessage(i,Weiss,levelustring);
    dini_IntSet(Spieler,"Levelpunkte",0);
    }
    PayDayZeit[i]=2700;
    }
    }
    }
    }