[Hilfe]Payday System

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, mal wieder komme ich nicht weiter.
    Diesmal bei einem Payday System.
    Also, ich versuche die Zeit vom Payday usw zu Speichern... Finde iwi nichts raus...


    forward:
    forward paydaytimer();
    ist ja klar


    OnPlayerConnect:
    new Timer[MAX_PLAYERS];
    Timer[playerid] = SetTimerEx("paydaytimer",1000*60,1,"i",playerid);


    Payday public
    public paydaytimer()
    {
    for (new i = 0; i < MAX_PLAYERS; i++)
    {
    if(!IsPlayerConnected(i))continue;
    if(GetPVarInt(i,"loggedin")==0)continue;
    GetPVarInt(i,"Payday");
    SetPVarInt(i,"Payday",GetPVarInt(i,"Payday")+1);

    if(GetPVarInt(i,"Payday")==60)
    {
    SetPVarInt(i,"Payday",0);
    SetPVarInt(i,"Respektpunkte",GetPVarInt(i,"Respektpunkte")+1);
    ShowPlayerDialog(i,DIALOG_PayDay,DIALOG_STYLE_MSGBOX,"---------|Zahltag|----------","Du hast 1 Respektpunkt bekommen.\n------------------------------","OK","");
    if(GetPVarInt(i,"Respektpunkte")==12)
    {
    GetPlayerScore(i);
    SetPlayerScore(i,GetPlayerScore(i)+1);
    SendClientMessage(i,HBlau,"Du bist nun Level-Up!");
    }
    continue;
    }
    }
    return 1;
    }


    Hoffe ihr könnt mir helfen!

  • Mach einen Minuten timer!!
    Dann beim Timer wird eine Variable um 1 erhöht!
    Wenn diese Variable beispielsweise (für jeden Spieler einzeln) auf 60 ist, bekommt der Spieler payday und
    die Variable wird wieder auf 0 gesetzt!
    Hört sich kompliziert an ist aber relativ einfach!


    Liebe Grüße, Blazer ;)

    Erst wenn
    der letzte Baum gerodet,
    der letzte Fisch vergiftet
    und der letzte Fisch gefangen ist,
    werdet ihr feststellen,
    dass man Gold nicht essen kann.

  • Zitat von Pille

    Aber beides geht nicht ^^


    Sicher geht das.
    ca so:


    new paytime[MAX_PLAYERS];


    public OnGameModeInit ()
    {
    SetTimer("Minute",60000,true);
    }


    forward Minute ();
    public Minute ()
    {
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(!IsPlayerConnected(i)) continue;
    if(eingeloggt[i] == 0) continue; // Kann raus genommen werden wenn das nicht abgefragt werden muss!
    paytime[i]++;
    if(paytime[i] == 60) // 60 steht für 60 Minuten
    {
    //Hier kommt rein was passieren soll wenn der Spieler payday hat!
    paytime[i] = 0; // Die Variable Paytime wird wieder auf 0 gesetzt.
    }
    }
    }


    Pille -> beides geht man braucht nur Grundkenntnisse.

    Erst wenn
    der letzte Baum gerodet,
    der letzte Fisch vergiftet
    und der letzte Fisch gefangen ist,
    werdet ihr feststellen,
    dass man Gold nicht essen kann.

  • Sicher geht das.


    Möglich ist es, sinnvoll nicht.
    Du hast in deinem Beispiel einen globalen Timer gemacht, in dem alle User durchgegangen werden.
    So ist das okay, keine Frage..
    Sinnlos wirds erst dann, wenn man für jeden Spieler unter OnPlayerConnect einen Timer startet,
    wo jeder Spieler durchgegangen wird, wie in dem Beispiel von 'Keybinder'.


    Möglich ist es - aber dann auch nur, wenn man es richtig programmiert.
    Aber selbst dann ist es unlogisch und sinnlos.


    forward paydaytimer(); // Ein Callback ohne Parameter


    SetTimerEx("paydaytimer",1000*60,1,"i",playerid);
    // Ein Timer mit Parameter zu dem Callback ohne Parameter


    = sinnlos

  • Zitat von Pille

    Sinnlos wirds erst dann, wenn man für jeden Spieler unter OnPlayerConnect einen Timer startet,
    wo jeder Spieler durchgegangen wird, wie in dem Beispiel von 'Keybinder'.


    Bitte lies es dir nochmal aufmerksam durch.
    Wo wird beim connecten ein Timer gesetzt?
    Der Timer wird bei Ongame ... init gesetzt.
    Ich würde es empfehlen es so zu machen wie ich es geschrieben habe.
    Was ist daran sinnlos und "unlogisch" wenn es so funktioniert wie es soll?

    Erst wenn
    der letzte Baum gerodet,
    der letzte Fisch vergiftet
    und der letzte Fisch gefangen ist,
    werdet ihr feststellen,
    dass man Gold nicht essen kann.

  • hmm kriege es immer noch nit hin...


    Also, der Timer (paydaytimer) ist ja jede Minute...
    Er sollte eigentlich nach jeder Minute in die Spielerdatei bei Payday +1 machen, macht er aber nicht.
    Deswegen kann auch 1. nicht Payday kommen und 2. bei /status nach jedem Relog wieder 60 Minuten.


    Genau das gleich bei Respektpunkte.


    Kann mir jemand helfen?

  • Bitte lies es dir nochmal aufmerksam durch.


    Das kann ich nur zurückgeben.


    Zitat:

    Du hast in deinem Beispiel einen globalen Timer gemacht, in dem alle User durchgegangen werden.
    So ist das okay, keine Frage..


    Sinnlos wirds erst dann, wenn man für jeden Spieler unter OnPlayerConnect einen Timer startet,
    wo jeder Spieler durchgegangen wird, wie in dem Beispiel von 'Keybinder'.



    @Keybinder: Starte bei OnGameModeInit einen Timer, der jede Minute abläuft.
    In diesem Timer erhöhst du die Variable eines Spielers, der online ist, um eins,
    und wenn sie 60 ist, setzt du sie wieder auf 0 und gibst ihm den Payday.

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • Du machst einfach einen Variable wie PayDayZeit[MAX_PLAYERS];


    Und setzt in deinem PayDay - Timer dann jeweils die Variable für jeden Spieler um 1 hoch, es sei denn
    die Variable ist = 60, dann setzt du diese wieder auf 0 und gibst dem Spieler seinen PayDay.


    Bei deinem Spieler Speichern Stock speicherst du ebenfalls die PayDayZeit[playerid] Variable in seine Datei.

  • Hier Code:


    forwards:
    forward paydaytimer(playerid);
    forward payday(playerid);


    OnGameModeInit:
    SetTimer("paydaytimer",1000*60,true);


    Publics
    public paydaytimer(playerid)
    {
    for (new i = 0; i < MAX_PLAYERS; i++)
    {
    if(!IsPlayerConnected(i))continue;
    if(GetPVarInt(i,"loggedin")==0)continue;
    GetPVarInt(i,"Payday");
    SetPVarInt(i,"Payday",GetPVarInt(i,"Payday")+1);


    if(GetPVarInt(i,"Payday")==60)
    {
    payday(playerid);
    }
    continue;
    }
    return 1;
    }




    public payday(playerid)
    {
    SetPVarInt(playerid,"Payday",0);
    SetPVarInt(playerid,"Respektpunkte",GetPVarInt(playerid,"Respektpunkte")+1);
    ShowPlayerDialog(playerid,DIALOG_PayDay,DIALOG_STYLE_MSGBOX,"---------|Zahltag|----------","Du hast 1 Respektpunkt bekommen.\n------------------------------","OK","");
    if(GetPVarInt(playerid,"Respektpunkte")==12)
    {
    GetPlayerScore(playerid);
    SetPlayerScore(playerid,GetPlayerScore(playerid)+1);
    SendClientMessage(playerid,HBlau,"Du bist nun Level-Up!");
    }
    return 1;
    }

  • SetPVarInt bleibt ja auch nur bis zu einem Relogg. Danach sind die Daten futsch.


    Also musst du es speichern. Ich denke du arbeitest mit Dini.

    new Pfad[256], pnam[MAX_PLAYER_NAME];
    GetPlayerName(i, pnam, MAX_PLAYER_NAME);
    format(Pfad, 256, "/DEINORDNER/%s.txt", pnam);
    dini_IntSet(Pfad, "PayDayZeit", GetPVarInt(playerid, "PayDay"));
    dini_IntSet(Pfad, "Respektpunkte", GetPVarInt(playerid, "Respektpunkte"));


    Wenn du schon einen Stock zum speichern hast, füge einfach nur


    dini_IntSet(Pfad, "PayDayZeit", GetPVarInt(playerid, "PayDay"));
    dini_IntSet(Pfad, "Respektpunkte", GetPVarInt(playerid, "Respektpunkte"));[/pwn]
    Die ein, aber änder "Pfad" in den String der beim Speicher Stock verwendet wird.