Payday kommt in Sekundentakt

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 zusammen


    Ich habe das Problem, das mein Payday im Sekundentakt kommt


    hier mal der code


    forward PayDay();
    public PayDay()
    {
    for(new i;i<MAX_PLAYERS;i++)
    {
    if(GetPVarInt(i,"loggedin")==1)
    {
    if(SpielerInfo[i][pPayday]==60)
    {
    if(SpielerInfo[i][pRespect]==5)
    {
    levelup();
    return 1;
    }
    else
    {
    payday();
    return 1;
    }
    }
    else
    {
    SpielerInfo[i][pPayday]+=1;
    }
    }
    }
    return 1;
    }


    stock payday()
    {
    for(new i;i<MAX_PLAYERS;i++)
    {
    new xx[3],string[256],sendstr[256],current;
    gettime(xx[0],xx[1],xx[2]);
    format(string,sizeof string,"Es ist nun %d:%d Uhr",xx[0],xx[1]);
    SendClientMessage(i,cWhite,string);
    SendClientMessage(i, cGrey,"================[PayDay]================");
    current=SpielerInfo[i][pLevel]*100+random(1000);
    GebeGeld(i,current);
    format(sendstr,sizeof sendstr,"Geld erhalten: %d$",current);
    SendClientMessage(i, cWhite, sendstr);
    format(sendstr,sizeof sendstr,"Kontostand: %d$",SpielerInfo[i][pBank]);
    SendClientMessage(i, cWhite, sendstr);
    SendClientMessage(i, cWhite,"Einen Respektpunkt erhalten");
    SpielerInfo[i][pRespect]+=1;
    SendClientMessage(i, cGrey,"========================================");
    SpielerInfo[i][pPayday]=0;
    SpielerSpeichern(i);
    }
    return 1;
    }


    Sobald er die voll hat: if(SpielerInfo[i][pPayday]==60) kommt es immer im Sekundentakt


    Ich hoffe, das ihr den Fehler sehen könnt

  • Also an dem Schnipsel, den du uns gezeigt hast, liegt es nicht. Dann kommt, wie DT schon sagt, nur der Timer in Frage.

  • zeig lieber mal den settimer


    Genau und 1 Sekunde = 1000
    bei mir gehts so
    SetTimer("PayDayTimer",60000,true);// 1 Minute
    forward PayDayTimer();
    public PayDayTimer()
    {
    for(new i=0; i<GetMaxPlayers(); i++) {
    if(IsPlayerConnected(i)) {
    SpielerInfo[i][pSpielzeit]++;
    SpielerInfo[i][pGesammt]++;
    if(SpielerInfo[i][pSpielzeit] >= 60) {
    payday(i);
    SpielerInfo[i][pSpielzeit] = 0;
    SavePlayer(i);
    }
    }
    }
    }
    forward payday(i);
    public payday(i)
    {
    SpielerInfo[i][pPayDay] = 0;
    SpielerInfo[i][pEXP]++;
    SendClientMessage(i,GOLD,"|===PayDay===| Zahltag |===PayDay===|");
    if(SpielerInfo[i][pAgeld]==1 && SpielerInfo[i][pFraktion]==0)
    {
    SendClientMessage(i,WEIß,"Arbeitslosengeld: $870");
    SpielerInfo[i][pBank]+=870;
    }
    SendClientMessage(i,GOLD,"|===Zahltag===| PayDay |===Zahltag===|");
    SavePlayer(i);
    }

  • PaydayTimer[playerid] = SetTimerEx("PayDay",1000*60,1,"d",playerid);


    das ist der Timer nur ich versteh nicht wiso das nur im Sekundentakt kommt

  • public PayDayTimer()
    {
    for(new i=0; i<GetMaxPlayers(); i++) {
    if(IsPlayerConnected(i)) {
    SpielerInfo[i][pSpielzeit]++;
    SpielerInfo[i][pGesammt]++;
    if(SpielerInfo[i][pSpielzeit] >= 60) {
    SpielerInfo[i][pSpielzeit] = 0;
    payday(i);
    SavePlayer(i);
    }
    }
    }
    }


    Grund?
    Du musst die Spielzeit erst zurücksetzen und dann den PayDay ausführen.
    Der PayDay braucht bsp. 2 Sekunden... dann würde der PayDay erneut ausgeführt werden.
    Der PayDay löst den nächsten PayDay aus.


    Eigl. also eine Endlosschleife.

    Miete mich (nicht) :love:


  • Eben nicht schlaumeier in meinem Selfmade kommt der Payday alle 60 Min ! und nicht tausendmal...

  • du hast einen spieler zugeweisenen timer, was sehr gut ist, jedoch benutzt du im public nicht die übergebene var sondern gehst alle spieler durch.
    1. frage killst du den timmer aus?
    2.
    hier die richtige public


    forward PayDay(i);
    public PayDay(i)
    {
    if(GetPVarInt(i,"loggedin")==1)
    {
    if(SpielerInfo[i][pPayday]==60)
    {
    if(SpielerInfo[i][pRespect]==5)
    {
    levelup();
    }
    payday(i);
    return 1;
    }
    else
    {
    SpielerInfo[i][pPayday]+=1;
    }
    }
    return 1;
    }


    stock payday(i)
    {
    new xx[3],string[256],sendstr[256],current;
    gettime(xx[0],xx[1],xx[2]);
    format(string,sizeof string,"Es ist nun %d:%d Uhr",xx[0],xx[1]);
    SendClientMessage(i,cWhite,string);
    SendClientMessage(i, cGrey,"================[PayDay]================");
    current=SpielerInfo[i][pLevel]*100+random(1000);
    GebeGeld(i,current);
    format(sendstr,sizeof sendstr,"Geld erhalten: %d$",current);
    SendClientMessage(i, cWhite, sendstr);
    format(sendstr,sizeof sendstr,"Kontostand: %d$",SpielerInfo[i][pBank]);
    SendClientMessage(i, cWhite, sendstr);
    SendClientMessage(i, cWhite,"Einen Respektpunkt erhalten");
    SpielerInfo[i][pRespect]+=1;
    SendClientMessage(i, cGrey,"========================================");
    SpielerInfo[i][pPayday]=0;
    SpielerSpeichern(i);
    return 1;
    }


    @ Bubel Schwachsinn!
    es liegt wie oben beschreiben, daran dass jeder spieler einen neuen timer erhält, aber im public alle spieler gehandelt werden.

  • @ Bubel Schwachsinn!
    es liegt wie oben beschreiben, daran dass jeder spieler einen neuen timer erhält, aber im public alle spieler gehandelt werden.


    Ja klar.
    Der Thread Ersteller hatte diesen extra Spieler Timer trotzdem nicht genannt.
    Daher ging ich davon aus, dass es an der Reihenfolge lag.


    Wobei meines so oder so effektiver ist...
    Bsp. wenn du wirklich im Sekunden Takt arbeitest.


    Oder bei GTA: Westcoast war es bsp. der Fall.
    Da laggt der PayDay == Dauert länger als 1 Sekunde.
    Deshalb wurde dort beispielsweise erst die Zeit zurückgesetzt und dann der PayDay ausgeführt.

    Miete mich (nicht) :love: