Es geht viel einfacher.
mit strcat.
Je nach Adminlevel einfach per strcat die sachen einfügen.
Beiträge von #lazy
-
-
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 TutorialSo, 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:
djIsSetDiese 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
-Button2Der 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 djsonSetSpawnInfo 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 -
Hey,
Ich weiß, das dieses Thema schon etwas älter ist.
Aber ich bin wirklich positiv von dieser Include ueberrascht.Man muss sich damit, im gegensatz zu mysql, nicht länger als 10 Sekunden auseinander setzen, um alles zu verstehen.
So sieht z.B. eine SpielerDatei aus:
{"Dominik":{"Passwort":"AlohaHe","Geld":23}}
Damit lässt sich, ähnlich wie bei mysql, alles sehr einfach und uebersichtlich verwalten.Alle Spieler können daher in einer Datei sein.
Das vereinfacht so einiges.Daher muss ich sagen:
Super Tutorial
Super Include -
Ganz sicher?
SII Schreibt ja wenn schon Geldboerse= 0.Naja, vllt. warst du dir nicht mehr ganz sicher.
Setzt du den Wert denn vorher auf was anderes als 0? -
Wird es denn in die Datei geschrieben?
-
Ich habe hierzu ein paar Fragen, haben mir es jetzt nicht ganz genau durchgelesen, daher könnte ich es uebersehen haben.
1. Muss das Callback OnQueryEnd genannt werden, oder kann ich es z.B. OnSthEnd nennen.
2. Kann ich das ganze auch anderweitig verwenden, also in ein anderes Callback weiterleiten-
3. Wie kann ich das denn bei den mysql Funktion von maddins Tutorial machen (mysql_setint ...)
4. Wird das ganze schon bei der r5 benötigt, da war ja das mysql_query anders. Wurde es da automatisch ausgeführt, oder war es unthreaded?
5. Ich muss dafür die r7 haben, oder? -
DetachTrailerFromVehicle
-
Du hast das doch nicht einfach abkopiert, oder -...-?
-
Joa, H4rd_Base,
Das stimmt, aber es ging ja nur ums prinzip.Wo ist denn das forward?
-
Eigentlich für alles.
Habe momentan aber noch nicht viel auf mysql geschrieben.
Da hab ich mir gedacht, wenn ich mich schon damit beschäftige, dann richtig. -
Es gibt ja eine möglichkeite per sscanf2 werte aus eine mysql datenbank auszulesen.
Das soll ja viel effizienter sein, als die funktionen von Maddins mysql Tutorial.Gibt es da denn auch eine Include, für die Vereinfachung.
Denn das ganze schaut recht kompliziert aus. -
mit SetTimerEx.
//Bei OnPlayerConnectSetTimerEx("LebensVerlust",1000*60,1,"i",playerid);
//Außerhalb eines callbacks:
forward LebensVerlust(playerid);
public LebensVerlust(playerid)
{
new Float:health; GetPlayerHealth(playerid,health);
SetPlayerHealth(playerid,health-1);
}
ungetestet. -
Falsch eingerückt.
Entweder richtig einrücken
oder
#pragma tabsize 0Ich empfehle dir Variante 1, das schafft mehr übersicht.
-
Hast du villeicht vergessen, bei einem befehl 1 zurückzugeben?
Falls ja, wird 0 zurückgegeben und das = Unknown Command. -
1. Muss du zuerst setspawninfo verwenden.
2. In welchem Callback ist das denn?
-
Sry,
hatte besseres zu tuen, als 2 Seiten von "Das ist das nex crew Script" zu lesen.
Tatsächlich ist dort eine AutoDatei vorhanden, die deines Namens entspricht. -
Weil die sichtdistanz auf 0 steht.
-
Zombie Panic Source, Countrr Strike Source (da gibst auch nen zombie mode), lect 4 dead (2)
-
Nein, ich meine direkt in der Datenbank.
Das das mit ++ oder += 1 geht, ist mir klar.
Aber wie soll ich denn die hausid eintragen:
mysql_Set_Int("Haus","HausID",random(9999999),/* Hier hängts bei mir, für where und is habe ich da keine erklärung. bei anderen dingen könnte ich ja einfach hausid und dann die "value" eintragen, Das random ist uebrigens nur zum beispiel. */...); -
Ich bin gerade dabei ein Haussystem mit mysql speicherung zu schreiben.
Ich hab bereits eines, welches funktioniert, aber das wird per SII gespeichert.
Da ich aber kein SII mehr verwenden möchte ...Meine Frage:
Wie kann ich die hausid immer um 1 hochsetzen?