Kann mir jmd erklären wie ein /stats system geht?

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,


    ich will dir hier nicht einfach eins hinklatschen und das wars. Fazit du kopierst es und hast nichts verstanden


    Daher fangen wir mit ein paar Grundlegenden Fragen an die auch ich als Info brauche


    • Arbeitest du mit MYSQL oder DIni
    • hast du ein playerInfo ENUM?
    • Soll es als Dialog, Textdraw o. Text angezeigt werden?


    Hast du schonmal angefangen etwas auszuprobieren in die richtung?

  • Ein "/stats" System kann man es ja nicht nennen, oder?
    Eher einen Stats-Befehl.


    Statistiken sind nur darauf aufgebaut, Daten auszugeben.
    Sprich, die Daten, die du gesetzt hast, gibst du einfach dem Chat oder dem Dialog aus, und lässt ihn so damit anzeigen.


    Das ist nichts schwieriges, und auch nicht gerade was anderes, als eine normale Textnachricht zu formatieren.

  • Ein "/stats" System kann man es ja nicht nennen, oder?
    Eher einen Stats-Befehl.


    Statistiken sind nur darauf aufgebaut, Daten auszugeben.
    Sprich, die Daten, die du gesetzt hast, gibst du einfach dem Chat oder dem Dialog aus, und lässt ihn so damit anzeigen.


    Das ist nichts schwieriges, und auch nicht gerade was anderes, als eine normale Textnachricht zu formatieren.

    du weißt schon dass er wissen wollte WIE es geht nicht WAS das is´t

  • Hey Silvio Castro,


    Ich möchte es dir an der Speichermöglichkeit dini erklären.
    Fangen wir an :



    Als erstes würde ich dir nahelegen, ein Include für das erstellen unseres Stats Befehls : Ich zeig es dir am beispiel des Includes zcmd. Du kannst natürlich auch andere verwenden wie z.B. dcmd oder ocmd.


    Hier verlink ich dir ein Tutorial über zcmd : http://forum.sa-mp.de/gta-mult…t-parametern-7#post414950
    Hier zum Download : http://www.solidfiles.com/d/87…2d16d464e90c8cf9/zcmd.inc


    Zunächst erstmal, musst du zcmd includen. Dafür gehst du beispielweise zum Anfang deines Scripts und includest es wie ein anderes Include auch :


    #include <zcmd>



    Danach ziehst du die gedownloadete .inc-Datei in deinen Include Ordner (Server/Pawno/Includes)


    Nun betrachten wir erstmal die Grundschreibweise eines Befehles mit zcmd. Dies sieht folgendermaßen aus :


    COMMAND:meinbefehl(playerid,params[]){return 1;



    }


    "Sagt" den Server, das ein Befehl mit zcmd folgt
    der Befehl, den man später mit (aus den beispiel entnommen) /meinbefehl ausführt
    "Sagt" den Server, das sich der Befehl auf uns bezieht bzw. das wir den Befehl in Aktion geben. Dieses ist i.d.R. standartmäßig in den Klammern zu finden.
    Mit params[] sagen wir, was der Befehl später ausführt.


    Da wir allerdings einen /stats Befehl haben wollen, können wir den Command folgend schonmal umschreiben :


    COMMAND:stats(playerid,params[]){ return 1;}


    Wenn wir jetzt den Server starten würden und /stats eingeben, so würde dies noch keine Wirkung ergeben.
    Da wir ja aber wollen, dass der Spieler eine Übersicht über seinen Spielverlauf/Erfolge ect. bekommt, müssen wir logischer Weise irgendwo auslesen. Dafür gibt es mit den Speicherprogramm dini (http://forum.sa-mp.de/gta-mult…ng-fragen-441#post1376776) zwei Möglichkeiten :


    • Das erstellen von einen enum
    • Sogenannte PVar´s.


    Ich erklär es dir an den PVar´s, da es nicht so kompliziert ist als bei enums, wo man die Variablen zurück setzten muss.


    Nun gehst du in den stock deines Scripts, wo du eine Spielerdatei für jeden neuen Spieler beim ersten betritt des Servers erstellen lässt. In meinen Fall ist das der stock Register.


    stock Register(playerid,key[]){ new Spielerdatei[64]; new name[MAX_PLAYER_NAME]; GetPlayerName(playerid,name,sizeof(name)); format(Spielerdatei,sizeof(Spielerdatei),"spieler/%s.txt",name); dini_Create(Spielerdatei); dini_Set(Spielerdatei,"Passwort",key); return 1;}



    So sollte eigendlich der stock aussehen, wenn du noch keine weiteren Daten außer das jeweilige Passwort speichert. Da wir aber (normaler Weise) den Spieler nicht anzeigen wollen, wie sein Passwort lautet, so müssen wir dort PVars erstellen, die sich um Erfolge/Einstellung ect. drehen und für den späteren Spielerlauf entscheiden sein können.


    In den Statssystem hier erstelle ich nur ein "geringfügiges" System, den Rest müsstest du dann selber ergänzen. Es funktioniert allerdings dann nach dem selben Prinzip.


    Ich möchte gerne, dass der /stats-Befehl uns unseren Namen, mein Level sowie meine Fraktion anzeigt.
    Also benötigen wir 2 Zeilen, die bei den /stats Befehl abgerufen werden. Unseren Namen lesen wir über einen anderen stock dann aus, dazu aber später. Wir ergänzen zum stock Register :


    SetPVarInt(playerid,"Level",0); SetPVarInt(playerid,"Fraktion",0);


    "Sagt" den Server, dass er eine neue Zeile in die .txt Datei setzen muss.
    Steht dafür, das er das ganze in einer Zahl abspeichern soll.
    Unter welcher "Kennung" soll das ganze Abgespeichert werden
    Spielereigene Einstellung.


    Würde uns der Spieler das ganze in einer .txt Datei abspeichern, sieht das etwa so aus :


    Passwort=dein_passwortLevel=0Fraktion=0
    Jetzt müssen wir aber noch die PVars laden, wenn der Spieler den Server betritt sowie die Pvars abspeichern, wenn der Spieler den Server wieder verlässt.
    Damit man das ganze laden tut, erstellen wir uns einen neuen stock. Ich nenne ihn SpielerLaden.
    stock SpielerLaden(playerid){ SetPlayerScore(playerid,dini_Int(Spielerdatei,"Level")); SetPVarInt(playerid,"Fraktion",dini_Int(Spielerdatei,"Fraktion")); return 1;}

    Jetzt weiß der Server, dass er das Level des Spielers aus der Spielerdatei (.txt - Datei) setzen soll sowie den Spieler in die Fraktion laut der Spielerdatei setzten muss.
    Damit der Server dann auch weiß, wann er es jeweils laden muss, schreiben wir folgendes in den Login stock:
    stock LoadAccount(playerid){ new Spielerdatei[64]; new name[MAX_PLAYER_NAME]; GetPlayerName(playerid,name,sizeof(name)); format(Spielerdatei,sizeof(Spielerdatei),"spieler/%s.txt",name); SetPlayerScore(playerid,dini_Int(Spielerdatei,"Level")); SetPVarInt(playerid,"Fraktion",dini_Int(Spielerdatei,"Fraktion")); return 1;}


    Wenn das Passwort des Spielers richtig ist, dann sollst du den Account laden, andernfall den Spieler kicken!


    Nun müssen wir auch dafür sorgen, dass der Spieler gespeichert wird. Das machen wir ebenfalls in einen neuen stock speichern. Ich nenne ihn SpielerSpeichern :


    stock SpielerSpeichern(playerid){ new Spielerdatei[64]; new name[MAX_PLAYER_NAME]; GetPlayerName(playerid,name,sizeof(name)); format(Spielerdatei,sizeof(Spielerdatei),"spieler/%s.txt",name); dini_IntSet(Spielerdatei,"Level",GetPlayerScore(playerid)); dini_IntSet(Spielerdatei,"Fraktion",GetPVarInt(playerid,"Fraktion")); return 1;}


    Setze die Spielerinformationen neu : Lese das Level von den aktuellen Score des Spielers ab und die Fraktion aus der aktuellen Variable!


    Damit unser Spieler beim Verlassen des Servers auch gespeichert wird, schreiben wir folgendes in den public OnPlayerDisconect.


    public OnPlayerDisconnect(playerid, reason){ SpielerSpeichern(playerid); return 1;}


    Damit wir später den Namen des Spielers ausgeben können, müssen wir uns noch einen stock erstellen, der wiefolgt aussehen sollte :


    stock SpielerName(playerid){ new name[MAX_PLAYER_NAME]; GetPlayerName(playerid,name,sizeof(name)); return name;}



    Nun haben wir die Grundvoraussetzungen, um ein /stats Befehl in Angriff zu nehmen :


    COMMAND:stats(playerid,params[]){ return 1;}



    Ich zeig es dir anhand einer Nachricht an den Spieler


    COMMAND:stats(playerid,params[]){ new string[128]; format(string,sizeof(string),"Name : %s |Level : %i |Fraktionsnummer : %i",SpielerName(playerid),GetPVarInt(playerid,"Level"),GetPVarInt(playerid,"Fraktion")); return 1;}



    Jetzt haben wir einen string mit Variablen. Nun müssen wir nurnoch eine SendClientMessage an den Spieler richten, damit er seine statistik und den string von oben angezeigt bekommt.



    COMMAND:stats(playerid,params[]){ new string[128]; format(string,sizeof(string),"Name : %s |Level : %i |Fraktionsnummer : %i",SpielerName(playerid),GetPVarInt(playerid,"Level"),GetPVarInt(playerid,"Fraktion")); SendClientMessage(playerid,weiß,string); return 1;}



    Ich hoffe ich konnte dir weiterhelfen!
    Mit freundlichen Grüßen
    Niknew


    PS: Man kann natürlich auch den Fraktionsnamen ausgeben, allerdings hab ich dafür heute leider keine Nerven mehr gehabt. Bei mit ist es gefühlte 6 Uhr morgens. Wenn du allerdings gerne die Fraktionsnamen ausgegeben haben möchtest, kannst du dich an die anderen netten User oder an mich via PN melden.


    //Mir sind leider die Klammern verrutscht, du musst sie eig. nur an die richtige stelle bringen. Hoffe es bringt dir doch etwas