RE: Simples Accountsystem (Automatisch)

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • RE: Simples Accountsystem (Automatisch)

      Heyho,

      basierend auf das Accountsystem von Map, dazu sein Tutorial habe ich mich an etwas anderem versucht. Undzwar ein Accountsystem zu machen, indem man sich nicht selber einloggen oder registrieren muss. Nein, hier geht das alles automatisch. Nun, wie folgt wird am Anfang eine neue Datenbank erstellt:

      Quellcode

      1. db = sql.create("accounts.db")
      2. sql.query(db, "CREATE TABLE IF NOT EXISTS `users` (`uid` INTEGER PRIMARY KEY, `username`, `password`, `playername`, `kills` INTEGER DEFAULT 0, `deaths` INTEGER DEFAULT 0)")


      Dann hatten wir EventListener für das System geschrieben, bei dem System kommt nun ein Event dazu. "OnClientEnter", "ClientEnter". Über dieses Event, werden wir den Spieleraccount registrieren bzw. dafür eine Funktion aufrufen.

      Quellcode

      1. AddEventListener("OnChat", "Chat")
      2. AddEventListener("OnClientConnect", "ClientConnect")
      3. AddEventListener("OnClientEnter", "ClientEnter")
      4. AddEventListener("OnDie", "Kill")
      5. AddEventListener("OnPlayerJoinTeam", "PlayerJoinTeam")
      6. AddEventListener("OnClientDrop", "Leave")


      Hier wird noch ein Array "Accounts" hinzugefügt. Dazu auch ein Integer, KDRate, für die spätere Kills/Deaths Rate die man dann mit /stats aufrufen kann.

      Quellcode

      1. Accounts = {}
      2. KDRate = 0


      Wie folgt, kommen wieder Tick Funktionen, die wir aber nicht brauchen werden:

      Quellcode

      1. iTick = 0
      2. function Tick(Time, ServerTick)
      3. iTick = iTick + 1
      4. end
      5. function TickDefered(Time, ServerTick)
      6. end
      7. function PostTick(Time, ServerTick)
      8. end


      In der nächsten Funktion, CheckAccount(Username) wird überprüft, ob es den angegebenen Account schon gibt. Ist dem so, gibt sie true zurück. Gibt es den Account noch nicht, gibt sie false zurück.

      Quellcode

      1. function CheckAccount(Name)
      2. result = sql.query(db, "SELECT * FROM `users` WHERE `username` = '" .. EscapeString(Name) .. "'")
      3. if (result[1] and result[1]["uid"]) then
      4. return true
      5. end
      6. return false
      7. end


      In der Funktion "Update(ID)" werden die Daten des letzens Logins in den Account gespeichert.

      Quellcode

      1. function Update(ClientID)
      2. if (Accounts[ClientID]["uid"] == nil) then
      3. return
      4. end
      5. 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"] .. "'")
      6. end


      Jetzt wird die Funktion CheckAccount verwendet, undzwar für die Funktion Register. Zuerst wird geprüft ob es den Account schon gibt. Wenn ja, wird der Account eingeloggt. Wenn nicht wird ein neuer Account erstellt und auch automatisch eingeloggt.

      Quellcode

      1. function Register(User, Pass, ClientID)
      2. if(CheckAccount(User) == true) then
      3. Login(User, Pass, ClientID)
      4. else
      5. sql.query(db, "INSERT INTO `users` (`username`, `password`, `playername`) VALUES ('" .. EscapeString(User) .. "', '" .. EscapeString(Pass) .. "', '" .. EscapeString(GetPlayerName(ClientID)) .. "')")
      6. Login(User, Pass, ClientID)
      7. end
      8. end


      Jeder, der sich das Tutorial von Map schonmal angesehen hat, weiß was hier passiert. Zuerst werden die Daten abgefragt, stimmen sie überein wird man eingeloggt. Accounts[ClientID] wird dann zu Accounts["uid"] sozusagen geändert oder umgewandelt. Print("kills", result[1]["kills]) gibt den Score des gerade eingeloggten Spielers in der Konsole frei. Dann wird dem Spieler sein gespeicherter Score mit SetPlayerScore zugewiesen. Zuletzt wird man in das Spiel befördert.

      Quellcode

      1. function Login(User, Pass, ClientID)
      2. result = sql.query(db, "SELECT * FROM `users` WHERE `username` = '" .. EscapeString(User) .. "' AND `password` = '" .. EscapeString(Pass) .. "'")
      3. if (result[1] and result[1]["uid"]) then
      4. Accounts[ClientID] = result[1]
      5. Print("kills", result[1]["kills"])
      6. Print("deaths", result[1]["deaths"])
      7. SetPlayerScore(ClientID, Accounts[ClientID]["kills"])
      8. SetPlayerTeam(ClientID, 0)
      9. else
      10. Register(User, Pass, ClientID)
      11. end
      12. end
      Alles anzeigen


      Hier wird man ausgeloggt, die Daten des Accounts werden gespeichert, Accounts[ClientID] wird geleert und man wird zum Spectator versetzt. Diese Funktion benutzen wir in diesem System jedoch nicht.

      Quellcode

      1. function Logout(ClientID)
      2. Update(ClientID)
      3. Accounts[ClientID] = {}
      4. SetPlayerTeam(ClientID, -1)
      5. end


      So, jetzt du der Funktion "GetStats" hier werden dein Score, deine Tode und deine Kills/Deaths Rate errechnet und wiedergegeben. Ist dein Score oder
      deine Tode unter 1 wird die Rate immer als 0 angezeigt.

      Quellcode

      1. function GetStats(ID)
      2. SendChatTarget(ID, "Kills: "..Accounts[ID]["kills"])
      3. SendChatTarget(ID, "Deaths: "..Accounts[ID]["deaths"])
      4. if(Accounts[ID]["kills"] < 1 or Accounts[ID]["deaths"] < 1) then
      5. KDRate = 0
      6. else
      7. KDRate = ((Accounts[ID]["kills"])/(Accounts[ID]["deaths"]))
      8. end
      9. SendChatTarget(ID, "K/D: "..KDRate)
      10. end


      Hier in der Funktion Chat, gibt es 3 Kommandos. /stats führt GetStats aus, was wir gerade besprochen haben. /cmdlist und /info geben nur Infos im Chat wieder.

      Quellcode

      1. function Chat(Text, ID, Team)
      2. if (Text:sub(1, 1) == "/") then
      3. if (Text:sub(1, 6) == "/stats" and (Text:len() == 6)) then
      4. GetStats(ID)
      5. elseif (Text:sub(1, 8) == "/cmdlist" and (Text:len() == 8)) then
      6. SendChatTarget(ID, "Servercommands:")
      7. SendChatTarget(ID, "Commando - Funktion")
      8. SendChatTarget(ID, "/stats - Gibt deine Stats wieder, Score etc.")
      9. SendChatTarget(ID, "/info - Info ueber die Mod")
      10. elseif (Text:sub(1, 5) == "/info" and (Text:len() == 5)) then
      11. SendChatTarget(ID, "System based on the Lua Accountsystem by Map")
      12. SendChatTarget(ID, "Death Match with Saved Scores. Have Fun!")
      13. else
      14. SendChatTarget(ID, "Unknown command")
      15. SendChatTarget(ID, "/cmdlist")
      16. end
      17. return true
      18. end
      19. end
      Alles anzeigen


      In der nächsten Funktion, Kill(Killer, Victim, Weapon) wird der Score des Killers um ein hoch gesetzt, und das Opfer bekommt bei seinen Toden ein Punkt dazu.

      Quellcode

      1. function Kill(Killer, Victim, Weapon)
      2. if (Killer ~= Victim) then
      3. Accounts[Killer]["kills"] = Accounts[Killer]["kills"] + 1
      4. end
      5. Accounts[Victim]["deaths"] = Accounts[Killer]["deaths"] + 1
      6. end


      Zur drittletzten Funktion, undzwar wenn man Leavt (oder auch ausloggt in dem Fall) werden die alten Daten in dem Account gespeichert.

      Quellcode

      1. function Leave(ID, Reason)
      2. Update(ID)
      3. end


      In der vorletzen Funktion, wenn zum Server connecten, wird in der Konsole die ID des Spielers ausgegeben und Accounts auf Null gesetzt.
      SetPlayerTeam ist deaktiviert, weil wir sie hier nicht benötigen.

      Quellcode

      1. function ClientConnect(ClientID)
      2. Print("Clear", ClientID)
      3. Accounts[ClientID] = {}
      4. --SetPlayerTeam(ClientID, -1)
      5. end


      In der letzten Funktion, wenn man den Server betritt wird man registriert oder eingeloggt. Je nach dem, ob man schon registriert ist oder nicht.

      Quellcode

      1. function ClientEnter(ClientID)
      2. Register(GetPlayerName(ClientID), GetPlayerClan(ClientID), ClientID)
      3. end


      Hier nochmal der gesamte Code:

      Klick!

      So das wars von meinem Tutorial, ich hoffe euch hat es gefallen und ihr könnt auch etwas damit anfangen.
      Was ihr jetzt gelernt habt ist, wie ihr eine einfache Modifikation macht mit einem automatischen Accountsystem.

      lg.
    • Für Citymods oder anderes ist das System auch nicht gedacht, eher für Instagib, DM oder so falls man die Stats speichern möchte. Kann jeder selbst entscheiden, ob er die Variante von MAP94 nimmt, also mit den Commandos oder das berabeitete von mir das halt komplett Automatisch funktioniert.