Spieler bekommt die maximale Anzahl an Spielern als Treuepunkte statt 1

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 mich heute erstmals an eine Treuepunkte System rangewagt.


    Zuerst war es so dass nur die ID 0 treuepunkte bekommen hat. Ich fragte meinen Bruder der sagte "arbeite mit schleife"


    Dann habe ich mit einer Schleife gearbeitet, jetzt bekommt jeder Spieler 5 Treuepunkte, da die maximale Anzahl an Spielern 5 ist.


    Eig soll er nur 1 erhalten....


    Bitte helft mir
    ich habe zuerst einen MinutenTimer gesetzt, der jedem Spieler jede Minute +1 geben soll, bei 120 soll der SPieler dann einen Treuepunkt bekommen


    SetTimer("Minut",12000,true);

    Code
    new treu = 0;

    Code
    forward Minut();
    public Minut()
    {
    //TREUESYSTEM
    treu ++;
    if(treu == 120)
    {
    treu = 0;

    for(new b=0; b<MAX_PLAYERS; b++)
    {



    }
    sInfo[playerid][treue] ++;
    }




    }


    hoffe ihr könnt mir helfen

  • Einfach so schreiben:


    new treue[MAX_PLAYERS];


    //Unter OnPlayerConnect
    treue[playerid] = 0;


    forward Minut();
    public Minut()
    {
    for(new i; i<MAX_PLAYERS; i++) {
    if(!IsPlayerConnected(i)) continue;
    treue[i]++;
    if(treue[i] == 120) sInfo[i][treue] ++,treue[i] = 0;
    }
    }


    mfg. :thumbup:

    ast2ufdyxkb1.png


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

  • warum hat dann jeder spieler 5 Treuepunkte bekommen? beide gehen nicht


    Rufst du den Timer evtl öfters auf? :huh:


    if(!IsPlayerConnected(i)) continue;


    Ja, das bedeutet, wenn der Spieler nicht online ist ...continue (sprich mache mit der Schleife weiter)


    mfg. :thumbup:

    ast2ufdyxkb1.png


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

  • Das kann ja auch nichts werden was ihr da macht.
    if(treue[i] == 120) sInfo[i][treue] ++,treue[i] = 0;
    Wie soll denn das richtig sein? Die Bezeichnung aus dem enum ist genau gleich wie das Array.




    @Stormi25:


    Unter die Includes:
    new pTreue[MAX_PLAYERS];


    Bei OnPlayerConnect:
    pTreue[playerid] = 0;


    Ganz unten im Gamemode:
    forward MinutenTimer();
    public MinutenTimer()
    {
    for(new i; i<MAX_PLAYERS; i++)
    {
    if(IsPlayerConnected(i))
    {
    pTreue[i]++;
    if(pTreue[i] == 120) //Nach 2 Stunden wäre das.
    {
    sInfo[i][treue]++;
    pTreue[i] = 0;
    }
    }
    }
    return 1;
    }


    Unter OnGameModeInit:
    SetTimer("MinutenTimer", 60000, true); //1 Minute

  • Mit Timern arbeiten ist in SAMP eh nie so die beste Lösung.
    Hab jetzt mal was ausm Kopf geschrieben, so würde ich es ca. machen:


    new timestamp_treue[MAX_PLAYERS][2];
    public OnPlayerDisconnect(playerid)
    {
    timestamp_treue[playerid][1] = gettime();
    new var;
    var = timestamp_treue[playerid][1] - timestamp_treue[playerid][0];
    if(var > 3600){//also wenn er mindestens 1 Stunde on war:
    var = var % 3600; // berechnet wie viele Stunden das jetzt waren
    // hier noch pInfo[playerid][pTreue] += var; oder halt wie auch immer du es bei dir hast.
    }
    return 1;
    }


    public OnPlayerConnect(playerid)
    {
    timestamp_treue[playerid][0] = gettime();
    return 1;
    }


    Ob es nun funktioniert ist die andere Frage, wahrscheinlich müsste man es ein wenig optimieren, aber so sollte es definitiv die beste Lösung sein, jedenfalls nach meiner Meinung

  • Ja stimmt fällt mir auch grad auf, man kann ja einfach gettime benutzen xD
    Also eher so:


    new timestamp_treue[MAX_PLAYERS];
    public OnPlayerDisconnect(playerid)
    {
    new var;
    var = gettime() - timestamp_treue[playerid];
    if(var >= 3600){//also wenn er mindestens 1 Stunde on war:
    var = var % 3600; // berechnet wie viele Stunden das jetzt waren
    // hier noch pInfo[playerid][pTreue] += var; oder halt wie auch immer du es bei dir hast.
    }
    return 1;
    }


    public OnPlayerConnect(playerid)
    {
    timestamp_treue[playerid] = gettime();
    return 1;
    }

  • alva:
    Dein Lösungsvorschlag ist zwar in Ordnung, aber wirklich Sinn macht er bei einem solchen Vorhaben nicht, da die Statistiken des Spielers ja erst aktualisiert werden, wenn er den Server verlässt, und das kann dauern. Ich habe in meinem Server, zum Vergleich, Spieler die weit über 100 Stunden am Stück online sind, das wäre schlecht, wenn sich da die Werte erst aktualisieren, wenn die den Server verlassen, vor allem wenn man bedenkt, dass zum Beispiel nach 90 Stunden der Server abstürzt, was ja vorkommen kann. Die Spieler wären da sicher nicht erfreut drüber.
    Das würde ich so also nicht empfehlen.
    Außerdem ist diese Berechnung hier falsch:
    var = var % 3600; // berechnet wie viele Stunden das jetzt waren
    das muss
    var = var / 3600; // berechnet wie viele Stunden das jetzt waren
    lauten, da dir sonst nur Werte zwischen 0 und 3599 ausgegeben werden, sprich für zum Beispiel 3 Stunden (10800 Sekunden) würde es dir 0 ausgeben, für 3 Stunden und 1 Minute würde es dir 60 ausgeben.
    Dennoch, wie gesagt, würde ich davon abraten.


    @Stormi25:
    Ok, kannst du dann bitte posten, wie dein angepasster Timer aussieht (Start des Timer, Callback)?

  • hallo Jeffry


    hier der angeforderte Code


    Timer


    mTimer = SetTimer("MinutenTimer", 60000, true); //1 Minute


    und das jeweilige callback


    forward MinutenTimer();
    public MinutenTimer()
    {
    for(new i; i<MAX_PLAYERS; i++) {
    if(IsPlayerConnected(i)) continue;
    treu[i]++;
    if(treu[i] == 1) sInfo[i][treue] ++,treu[i] = 0;

    }
    }


    danke auch an ChristianW und alva für die Mühe

  • Beitrag von Jeffry ()

    Dieser Beitrag wurde gelöscht, Informationen über den Löschvorgang sind nicht verfügbar.