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:
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":
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