Djson Tutorials - #001 - Login/Registersystem

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
  • Login/Register System - mit djson


    Hallo,
    Ich möchte heute ein Tutorial präsentieren.
    Euch wird erklärt, wie ein Login/Register Script mit der Include "djson" erstellbar ist.



    Info an meine lieben Copy/Paste freunde:
    In diesem Tutorial gibt es nichts zu kopieren, ihr müsst wirklich kompetenz zeigen, in dem ihr Text in Code umwandeln müsst.


    Zur Include:
    djson ist, wie man ggf. schon am d erkennen kann, eine Include von DracoBlue.
    Dieser ist auch Ersteller von DINI, wie ich diese Include nicht sonderlich mag.
    Da sie langsam und umständlich ist.
    djson aber, ist eine wirklich brauchbare Include.
    Man kann z.B. alle Spieler in eine Datei schreiben:
    Das wäre dann in etwa so aufgebaut:

    Code
    {"Dominik."{"Passwort":"Hallo123","Geld":23,"Positionen":{"X": 0.0,"Y": 0.0,"Z": 0.0}}}


    Die Include: http://forum.sa-mp.com/showthread.php?t=48439
    Ein Tutorial: [ SCRIPTING ] DJson 1.6 Tutorial


    So, nun kommen wir zum Scripting Teil.
    Zuerst müssen wir folgendes in das Callback "OnGameModeInit" schreiben:
    djson_GameModeInit
    und
    if(fexist("Spieler.txt") == 0) { djCreateFile("Spieler.txt"); }
    //Damit wird die Datei erstellt, wenn sie noch nicht vorhanden ist, nicht zwingend notwendig, erspart aber das manuelle erstellen.
    ähnlich in "OnGameModeExit":

    Code
    djson_GameModeExit


    Nun gehen wir zum Callback "OnPlayerConnect", da dieses ja bekanntlich aufgerufen wird, wenn ein Spieler einen Server betritt.
    Als erstes müssen wir überprüfen, ob ein Eintrag in der Spieler Datei besteht.
    Die Datei heißt Spieler.txt.
    So, zuerst brauchen wir den Namen des Spielers.
    Die Funktion zu auslesen, nennt sich GetPlayerName.

    new name[MAX_PLAYER_NAME]; //Die Variable, in die der Name des Spielers geschrieben wird
    GetPlayerName(playerid,name,MAX_PLAYER_NAME); //Nun hat die Variable name den Wert des Spielernamens. Lässt sich auch per print(name); überprüfen.


    Nun wird die Funktion, zum überprüfen ob eine Eintrag existiert benötigt.
    fexist können wir das nicht benutzen.
    Die Funktion nennt sich:
    djIsSet


    Diese gibt true/false zurück.
    Eintrag vorhanden | Rückgabewert = true
    Eintrag nicht vorhanden | Rückgabewert = false.
    nun müssen wir das in eine Abfrage packen.
    if(djIsSet("Spieler.txt",name) == false)
    Das würde jetzt bedeuten, das der Eintrag nicht vorhanden ist.
    Sollte er vorhanden sein, das true durch false ersetzen.
    oder einfach ein else verwenden, also der Rückgabewert alles andere, nur nicht true ist.


    Nun brauchen wir 2 Dialoge. Einen zum Registrieren, einen zum Einloggen.
    Dazu benutzen wir ShowPlayerDialog.


    der Dialog zum Registrieren könnnte in etwa so aussehen:
    ShowPlayerDialog(playerid,dReg,DIALOG_STYLE_INPUT,"Registrierung","Du scheinst neu zu sein,\nRegistriere dich, in dem du ein gewünschtes Passwort einträgst:","Weiter","");
    Gehen wir die Parameter nun einzeln durch:
    -playerid, die ID des Spielers
    -dReg, die DialogID die übrigens, sofern keine Nummer angegeben ist, definiert werden muss.
    -DIALOG_STYLE_INPUT, die Art des Dialoges, in diesem Fall ein Textfeld, zum eintragen.
    -Die Überschrift
    -Haupttext
    -Button1
    -Button2


    Der Dialog zum Einloggen in etwa so:
    ShowPlayerDialog(playerid,dLog,DIALOG_STYLE_PASSWORD,"Einloggen","Dein Account wurde gefunden.\nLogge dich nun ein:","Weiter","");
    Die Parameter sind identisch, lediglich die Dialogid und die DialogArt sind unterschiedlich.
    Die DialogID wurde geändert, da bei OnDialogResponse andere Verwendungen für die Buttons und die Inputbox vorgesehen sind.
    Die Dialogart nun von INPUT zu PASSWORD geändert, da das Passwort nun mit Punkten verdeckt sein soll.


    Ich denke mal, ihr seit in der Lage diesen Text in 2 Zeilen Code umzuwandeln.


    Wichtig: Damit man nicht einfach auf SPAWN drücken kann, ändert bei OnPlayerRequestSpawn das return 1; zu return 0;


    Nun gehen wir zum Callback OnDialogResponse
    Dies wird beim aufrufen von Dialogen, auswählen von listitems und drücken von Buttons (alles im Dialog) aufgerufen.


    nun müssen wir 2 cases (was direkt übersetzt fälle heißt) hinzufügen, sofern die Effiziente Methode switch statt eine else-if Struktur angewendet wurde.


    Einmal:
    case dReg:
    und
    case dLog:


    Beginnen wir mit dReg.


    nun müssen wir die Buttons abfragen. Da nur Button 1 angegeben wurde, reicht diese Abfrage:
    if(response == 1)


    Zunächst muss auch noch die Länge überprüft werden.
    Damit man nicht ein leeres Feld eintragen kann.
    das geht mit strlen
    strlen gibt die stringlänge zurück.


    Das ganze könnte man so anwenden:
    if(strlen(inputtext) < 1) return ShowPlayerDialog(playerid,dReg,DIALOG_STYLE_INPUT,"Registrierung","Kein Passwort eingegeben!\nVersuche es erneut:","Weiter","");


    Innerhalb diese Abfragen brauchen wir:
    -SetSpawnInfo
    -SpawnPlayer
    -und djson


    SetSpawnInfo muss vor SpawnPlayer festgelegt werden, sofern AddPlayerClass nicht verwendet wurde.
    in etwa so:
    SetSpawnInfo(playerid,0,0,0.0,0.0,0.0,0.0,0,0,0,0,0,0);
    Die Parameter:
    playerid, die ID des Spielers
    team, das Team des Spielers (SetPlayerTeam, GetPlayerTeam) ist aber uninteressant, daher 0
    Skin, hier der CJ-Skin
    X, Die XPosition
    Y, Die YPosition
    Z, Die ZPosition
    Angle, die Blickrichtung
    Die restlichen 6 0en sind für die 3 Spawn Waffen, und die jeweilige Munition.


    SpawnPlayer hat nur einen Parameter, playerid. Diese Funktion kann direkt danach angewendet werden.
    Damit der Spieler auch gespawnt wird.


    Nun zu djson.
    Wir müssen den Spieler Eintrag ja erstmal erstellen.
    Da brauchen wir:
    -Den Nutzernamen
    -Das Passwort
    Ein rohes Login/Registerscript halt.


    Dafür brauchen wir die funktion djSet.
    Diese schreibt strings in eine Datei.


    Aber erst muss ein string formatiert werden.
    format(DerVarName,sizeof DerVarName,"%s/Passwort",name);
    djSet("Spieler.txt",DerVarName,inputtext)
    Inputtext ist in der Text, der ins Eingabefeld geschrieben wurde.
    Nun sieht es in der Datei so aus:
    {"Dominik.":{"Passwort":"GewaehltesPasswort"}}


    Kommen wir nun zum Login Dialog.
    Dort muss zuerst überprüft werden, ob das Passwort korrekt ist.


    Das geht mit strcmp
    Diese funktion gibt den Wer 0 zurück, wenn die Strings identisch sind.
    Die Parameter:
    -String 1 -
    - Das sind die beiden strings, die miteinander verglichen werden
    -String 2 -
    -bool:ignorecase - Ein Boolean, wird er auf true gesetzt, ist Hey dasselbe wie hEy, setzt man ihn auf false, sind das unterschiedliche Strings, das bleibt aber euch überlassen.
    Also müssen wir das ganze Abfragen.
    Zuvor muss der pfad aber wieder formatiert werden.
    Das ist auch oben erklärt, und muss nicht erneut beschrieben werden.
    In etwa so:
    if(strcmp(inputtext,dj("Spieler.cfg",pfad),true) == 0)
    Die Funktion dj, liest einen String aus der Spielerdatei.


    Um nicht unnötig Zeilen zu verbrauchen, kann auch abgefragt werden ob die Strings NICHT identisch sind.
    Also:

    if(strcmp(inputtext,dj("Spieler.cfg",pfad),true) != 0) return ShowPlayerDialog(playerid,dLog,DIALOG_STYLE_PASSWORD,"Login","Die Passwörter waren nicht identisch!\nVersuche es erneut:","Weiter","");
    Das spart ein else und Zusammenfassungsklammern.


    So nun müssen wir wieder SetSpawnInfo und SpawnPlayer verwenden.
    Die Nutzung ist oben bereits erklärt.


    Schon ist ein Login/Registerscript geschrieben.



    #e: Überschrift geändert, Text geändert, siehe RJ'S post.
    #e: Fehler in der Überschrift

  • SetSpawnInfo muss vor SpawnPlayer festgelegt werden.

    As welchen grund SetSpawnInfo?
    wenn man AddPlayerClass nutzt dann macht das eigendlich keinen Sinn


    aber sonst gut erklärt :thumbup:

  • Da ich die Classauswahl nicht mag, habe ich es so erklärt.


    dann machs doch einfach
    schreib mit hin bei der Requestclass deine SetSpawninfo und das spawnplayer....


    aber das ist eh nebensache