Wie macht man ein Accountsystem? und wie bringt man alles in ein einfaches Tutorial?
Ganz einfach. Wir halten das ganze so simpel wie möglich. "Und wie?" Mit Lua.
Die neue Version (L1.3, release:kurz nach 0.7.0) des N-Server bringt einige Neuerungen mit. Zum einen ist es seit dieser Version möglich dass auch Standard Clients auf einen N-Server können und zum anderen haben wir eine Datenbank-Schnittstelle in Lua eingebaut. Das ganze ist so simpel wie möglich gehalten und ermöglicht es jedem ein Accountsystem zu erstellen, dass NICHT auf TEXTFILES sonder auf eine SQLITE3-Datenbank basiert. Wie das möglich ist und was erforderlich ist zeige ich in diesem Tutorial:
Als erstes müssen wir und den neusten N-Server von github runterladen und kompilieren oder hier(Release, Debug) ein Dev-Version downloaden.
Die Lua(mit allen fixes) kann hier heruntergeladen werden: hier
Wenn dies erledigt ist geht es auch direkt ans Coden. Wir erstellen einfach eine mod die die Punkte der spieler in einer Datenbank speichert!
Der ganz folgende code kommt in die server.lua in den lua ordner:
Öffnen der Datenbank und erstellen der Tabelle `users`
Hinzufügen der EventListener
Chat für Chatcommands
ClientConnect zum zurücksetzten beim join
Leave um den Account beim verlassen zu speichern
Erstellen eines leeren Arrays für die eingeloggten Accounts
Tick funktionen. Hierbei nicht benötigt.
Escape Funktion - um SQL-Injection zu vermeiden
Diese Funktion testet ob es den Account schon gibt. Wir fragen ab ob es einen Account mit dem Name "Name" gibt
Alles anzeigen
Trennt Chat-Parameter voneinander und gib den Gewünschten zurück
Die For-Schleife springt immer zum nächsten Parameter. Der Code nach der For-Schneidet den Rest ab.
Speichert die Änderungen an dem Account mit der angegebenen ClientID.
Alles anzeigen
Kommentare im code.
Kills und Deaths zählen.
Zurücksetzten/Löschen des Accounts wenn Spieler den Server betritt.
Update Account wenn Spieler den Server verlässt
Join Sperre wenn nicht eingeloggt
Nun noch die Config-file:
So das war jetzt einiges an code. Eure eigenen Werte könnt ihr in diesen Zeilen hinzufügen:
Erstellen der Tabelle:
sql.query(db, "CREATE TABLE IF NOT EXISTS `users` (`uid` INTEGER PRIMARY KEY, `username`, `password`, `playername`, `kills` INTEGER DEFAULT 0, `deaths` INTEGER DEFAULT 0)")
Update des Accounts:
sql.query(db, "UPDATE `users` SET `playername` = '" .. EscapeString(GetPlayerName(ClientID)) .. "', `kills` = '" .. EscapeString(Accounts[ClientID]["kills"]) .. "', `deaths` = '" .. EscapeString(Accounts[ClientID]["deaths"]) .. "' WHERE `uid` = '" .. Accounts[ClientID]["uid"] .. "'")
Auf grundlage dieser Mod/dieses Tutorials kann man mit ein bisschen übung eine ganze Levelmod programmieren.
Wenn ihr fragen oder anregungen habt schreibt mir diese.
Ganz einfach. Wir halten das ganze so simpel wie möglich. "Und wie?" Mit Lua.
Die neue Version (L1.3, release:kurz nach 0.7.0) des N-Server bringt einige Neuerungen mit. Zum einen ist es seit dieser Version möglich dass auch Standard Clients auf einen N-Server können und zum anderen haben wir eine Datenbank-Schnittstelle in Lua eingebaut. Das ganze ist so simpel wie möglich gehalten und ermöglicht es jedem ein Accountsystem zu erstellen, dass NICHT auf TEXTFILES sonder auf eine SQLITE3-Datenbank basiert. Wie das möglich ist und was erforderlich ist zeige ich in diesem Tutorial:
Als erstes müssen wir und den neusten N-Server von github runterladen und kompilieren oder hier(Release, Debug) ein Dev-Version downloaden.
Die Lua(mit allen fixes) kann hier heruntergeladen werden: hier
Wenn dies erledigt ist geht es auch direkt ans Coden. Wir erstellen einfach eine mod die die Punkte der spieler in einer Datenbank speichert!
Der ganz folgende code kommt in die server.lua in den lua ordner:
Öffnen der Datenbank und erstellen der Tabelle `users`
Hinzufügen der EventListener
Chat für Chatcommands
ClientConnect zum zurücksetzten beim join
Leave um den Account beim verlassen zu speichern
Erstellen eines leeren Arrays für die eingeloggten Accounts
Tick funktionen. Hierbei nicht benötigt.
Escape Funktion - um SQL-Injection zu vermeiden
Diese Funktion testet ob es den Account schon gibt. Wir fragen ab ob es einen Account mit dem Name "Name" gibt
Quellcode
Trennt Chat-Parameter voneinander und gib den Gewünschten zurück
Die For-Schleife springt immer zum nächsten Parameter. Der Code nach der For-Schneidet den Rest ab.
Quellcode
- function Update(ClientID)
- if (Accounts[ClientID]["uid"] == nil) then
- return
- end
- sql.query(db, "UPDATE `users` SET `playername` = '" .. EscapeString(GetPlayerName(ClientID)) .. "', `kills` = '" .. EscapeString(Accounts[ClientID]["kills"]) .. "', `deaths` = '" .. EscapeString(Accounts[ClientID]["deaths"]) .. "' WHERE `uid` = '" .. Accounts[ClientID]["uid"] .. "'")
- end
Speichert die Änderungen an dem Account mit der angegebenen ClientID.
Quellcode
- function Chat(Text, ID, Team)
- if (Text:sub(1, 1) == "/") then --prüfe auf chat command[/color]
- if (Text:sub(1, 9) == "/register" and Accounts[ID]["uid"] == nil) then --prüfe auf register
- Username = GetParameter(Text, 1) --frage username ab
- Password = GetParameter(Text, 2) --frage password ab
- if (Username == nil or Password == nil) then --prüfe ob username und password vorhanden sind
- SendChatTarget(ID, "Usage: /register username password!") --meldung
- elseif (CheckAccount(Username) == false) then --prüfe ob account vorhanden sind
- sql.query(db, "INSERT INTO `users` (`username`, `password`, `playername`) VALUES ('" .. EscapeString(Username) .. "', '" .. EscapeString(Password) .. "', '" .. EscapeString(GetPlayerName(ID)) .. "')") --erstelle account
- SendChatTarget(ID, "Account created successfully!") --meldung
- else
- SendChatTarget(ID, "This account already exist!") --meldung
- end
- elseif (Text:sub(1, 6) == "/login" and Accounts[ID]["uid"] == nil) then --prüfe auf login
- Username = GetParameter(Text, 1) --frage username ab
- Password = GetParameter(Text, 2) --frage password ab
- if (Username == nil or Password == nil) then --prüfe ob username und password vorhanden sind
- SendChatTarget(ID, "Usage: /login username password!") --meldung
- else
- result = sql.query(db, "SELECT * FROM `users` WHERE `username` = '" .. EscapeString(Username) .. "' AND `password` = '" .. EscapeString(Password) .. "'") --hole userdaten aus der Datebank
- if (result[1] and result[1]["uid"]) then --wenn account vorhanden
- Accounts[ID] = result[1] --kopiere account daten
- SendChatTarget(ID, "Logged in successfully!") --meldung
- SetPlayerScore(ID, Accounts[ID]["kills"]) --player die punkte zuweisen
- SetPlayerTeam(ID, 0) --player in Team 0 setzten[/color]
- else
- SendChatTarget(ID, "The username or the password is wrong!") --meldung
- end
- end
- elseif (Text:sub(1, 7) == "/logout" and Accounts[ID]["uid"] ~= nil) then --prüfe auf logout
- Accounts[ID] = {}
- SendChatTarget(ID, "Successfully logged out!") --meldung
- SetPlayerTeam(ID, -1)
- else
- SendChatTarget(ID, "Unknown command") --meldung
- SendChatTarget(ID, "/register") --meldung
- SendChatTarget(ID, "/login") --meldung
- SendChatTarget(ID, "/logout") --meldung
- end
- return true --chat verstecken
- end
- end
Kommentare im code.
Kills und Deaths zählen.
Zurücksetzten/Löschen des Accounts wenn Spieler den Server betritt.
Update Account wenn Spieler den Server verlässt
Join Sperre wenn nicht eingeloggt
Nun noch die Config-file:
So das war jetzt einiges an code. Eure eigenen Werte könnt ihr in diesen Zeilen hinzufügen:
Erstellen der Tabelle:
sql.query(db, "CREATE TABLE IF NOT EXISTS `users` (`uid` INTEGER PRIMARY KEY, `username`, `password`, `playername`, `kills` INTEGER DEFAULT 0, `deaths` INTEGER DEFAULT 0)")
Update des Accounts:
sql.query(db, "UPDATE `users` SET `playername` = '" .. EscapeString(GetPlayerName(ClientID)) .. "', `kills` = '" .. EscapeString(Accounts[ClientID]["kills"]) .. "', `deaths` = '" .. EscapeString(Accounts[ClientID]["deaths"]) .. "' WHERE `uid` = '" .. Accounts[ClientID]["uid"] .. "'")
Auf grundlage dieser Mod/dieses Tutorials kann man mit ein bisschen übung eine ganze Levelmod programmieren.
Wenn ihr fragen oder anregungen habt schreibt mir diese.
Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von MAP94 ()