Level Problem

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
  • forward hoechstesLevel();
    public hoechstesLevel()
    {
    new pew;
    new dings;
    for(new i=0; i < MAX_PLAYERS; i++) // Alle Spieler nehmen
    {
    new level = GetPVarInt(i, "Level"); // Setzen des Levels
    if(i == 1) // Bei ersten Wert
    {
    pew = GetPVarInt(i, "Level"); // Var setzen auf den ersten Wert
    }
    if(level > pew) // Wenn neuer Wert von anderer Spieler größer
    {
    dings = i; // So speicher ich i in dings , jedes mal, wenn level über dem Wert davor war.
    pew = level;
    spielerName(dings); // So nehme ich ja den Namen vom besten spieler.
    }
    }
    new msg[128];
    format(msg, sizeof(msg), "%s ist der führende Spieler mit Level %i", spielerName(dings), pew);
    SendClientMessageToAll(COLOR_TURKIS, msg);
    return 1;
    }


    Ich habe ein Problem, wie schaffe ich es das das funktioniert?

  • Mal theoretisch:


    Du gehst jeden Spieler durch - beim ersten Speicherst sein Level - beim 2. machst du ne if abfrage ob das level größer ist als das vorher gespeicherte , wenn ja überschreiben wenn nein nicht - und das so weiter bis es durch ist.
    Zusätzlich beim überschreiben den namen speichern, willste ja auch ausgeben.


    Dann die Variable, also Name und Score ausgeben.


    - Tomsen

  • Mahlzeit,


    4#Future:
    Der Code stammt von mir, da ich aber leider meine Daten vergessen hatte, konnte ich nicht selbst posten, und musste Atzen dazu nötigen. :p
    Das genaue Problem ist, dass das Level nicht richtig angezeigt wird.
    Wenn ich das richtig im Spiel verstanden habe, dann steht immer mein Name dort, sprich der von der niedrigsten playerid aber das Level von ihm. (So oder so ähnlich :p)


    Tomsen:
    Genau so habe ich es ja gemacht, deswegen verstehe ich nicht ganz, was du damit sagen willst. :/


    Laut Dudalus, kann man nicht nach 0 abfragen. Würde es dann was bringen, wenn ich stattdessen einen Bot reinhaue, der einfach nichts macht, sondern einfach nur anwesend ist, damit der Bot die ID 0 hat, und der erste Spieler bei 1 startet?
    Bei dem Code jetzt habe ich beginnend von 1 es gemacht (Was dann auch Fehler verursacht.).


    Gruß,
    Neo. :)

  • GetHighestLevel()
    {
    new pID, temp;
    for(new i; i < MAX_PLAYERS; i++)
    if((temp < GetPVarInt(i, "Level")))
    temp = GetPVarInt(i, "Level"), pID = i;
    return pID;
    }

    Wer ist der Mensch hinter der Uniform? Ist euch das bekannt?
    Es ist der selbe der noch eben in Zivil neben euch stand.
    Warum wird er gehasst und so selten respektiert?
    Warum ist er derjenige der seinen Hals für euch riskiert?
    Trägt der Bulle eine Weste, das hat er früher nie gemacht,
    die Zeiten haben sich geändert und jeder Dienst ist ein Kampf!
    Warum gibt’s das SEK und warum sind sie so brutal?
    Und wieso hat wieder einer mit seinem Leben bezahlt?

  • Die gesamte Denkweise :D


    Du siehst ja anhand meiner Funktion wie einfach das in 3 Zeilen geht.

    Wer ist der Mensch hinter der Uniform? Ist euch das bekannt?
    Es ist der selbe der noch eben in Zivil neben euch stand.
    Warum wird er gehasst und so selten respektiert?
    Warum ist er derjenige der seinen Hals für euch riskiert?
    Trägt der Bulle eine Weste, das hat er früher nie gemacht,
    die Zeiten haben sich geändert und jeder Dienst ist ein Kampf!
    Warum gibt’s das SEK und warum sind sie so brutal?
    Und wieso hat wieder einer mit seinem Leben bezahlt?


  • Sollte eigentlich auch so Funktionieren ...



    GetHighestLevel()
    {
    new i, temp;
    for(i < MAX_PLAYERS; i++)
    if((temp < GetPVarInt(i, "Level")))
    temp = GetPVarInt(i, "Level");
    return i;
    }



    Eine Variable gespart.

  • Immernoch nicht.
    Die For-Schleife wird sofort abgebrochen.
    Wenn du sowas vorhast musst du die Klammern benutzen:
    for(;i!=MAX_PLAYERS;i++)
    {
    if(temp<GetPVarInt(i,"Level")
    {
    temp=GetPVarInt(i,"Level");
    break;
    }
    }


    Und nein, die Korrektur bzgl. der For-Schleife habe ich nicht von dir, sie ist aber trotzdem oder deswegen richtig.
    Eine For-Schleife hat drei Blöcke, davon können beliebig viele leer bleiben.
    Endlosschleife geht z.B. so:

    Code
    for(;;){}



    EDIT: For-Schleifen von offizieller Seite erklärt gibt es übrigens hier, @BlackAce-Junior: http://wiki.sa-mp.com/wiki/Control_Structures#for_.28.29

  • Waere aber trotzdem noch falsch:
    Player id 0 = Level 0
    Player id 1 = Level 1
    Player id 2 = Level 2


    temp (unter der vorraussetzung, dass PAWN tatsaechlich die uninitialisierten Werte auf 0 setzt) < 0 ? Nein. Weiter in der Schleife.
    temp (=0) < 1 (level der id 1) ? Ja. Schleifen abbruch, Melde: Gefunden! Player id 1 hat das hoechste Level. (Trotz, dass player id 2 ein hoeheres level hat.)


    Hoffe ich habe mich verstaendlich ausgedrueckt.