[Dini]Login/Register System Cmd's

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
  • Guten Abend, liebe Scripter!


    Ich habe mich mal dazu entschieden, ein Login/Register System zu erstellen, dass jedoch über CMD's funktioniert.


    Benötigt wird die dini Include, zcmd Include und die sscanf Include.
    Download im Anhang oder hier Includes Download


    Vorraussetzungen:


    Ihr solltet Zeit haben und Aufmerksamkeit besitzen.
    Keine Besonderen Scriptkentnisse erforderlich.


    Los geht's!


    Zuerst geht es an unsere Includes & Defines.


    #include <a_samp>
    #include <zcmd>
    #include <sscanf>
    #include <dini>

    #define PLAYER_FOLDER "/Spieler/%s.ini"//Dient einer einfacheren Handhabung


    Jetzt die new's


    new SpielerName[MAX_PLAYERS][MAX_PLAYER_NAME];//Damit können wir später den Namen leichter ermitteln. Bsp.: SpielerName[pID];
    new Eingeloggt[MAX_PLAYERS];//Eine einfache Variable, welche für jeden Spieler verfügbar ist ([MAX_PLAYERS] )


    public OnPlayerConnect(playerid)
    {
    GetPlayerName(playerid, SpielerName[playerid], MAX_PLAYER_NAME); //Hier kommt das new SpielerName erstmal's zum Einsatz. Der Name jedes sich einloggenden Spielers wird ausgelsen
    new s[128];//Variable zum Ermitteln der Spielerdatei
    format(s, sizeof(s),PLAYER_FOLDER,SpielerName[playerid]);
    if(!dini_Exists(s)) { //Wenn die Spielerdatei nicht vorhanden ist
    SendClientMessage(playerid,0xF0F0F0FF,"Bitte registriere dich!");
    SendClientMessage(playerid,0xF0F0F0FF,"/register [Passwort]"); }
    else { //Falls sie vorhanden ist
    SendClientMessage(playerid,0xF0F0F0FF,"Bitte logge dich ein!");
    SendClientMessage(playerid,0xF0F0F0FF,"/login [Passwort]"); }
    return 1;
    }


    Unsere Cmd's


    CMD:register(playerid,params[])
    {
    new pass[200],s[128]; //Variablen für den Befehl (s könnte auch path o.Ä. heißen, dient zur Formatierung)
    if(sscanf(params, "s",pass))return SendClientMessage(playerid,0xF0F0F0FF,"TIPP: /register [Passwort]"); //Falls ihr sscanf nicht kennt, schaut euch den Link am Ende des Themas an. Einfache Erklärung: sscanf ermittelt die Parameter aus der Eingabe des Spielers
    format(s, sizeof(s),PLAYER_FOLDER,SpielerName[playerid]);
    if(!dini_Exists(s)) //Falls die Spielerdatei noch nicht existiert
    {
    dini_Create(s); //Spieler Datei wird im Ornder "Spieler" erstellt
    dini_Set(s, "Passwort", pass); //Passwort wird eingetragen
    SendClientMessage(playerid,0xF0F0F0FF,"Du hast dich erfolgreich registriert!");
    Eingeloggt[playerid] = 1; //Setzt die Variable Eingeloggt auf 1
    } else { SendClientMessage(playerid,0xF0F0F0FF,"Du bist bereits registriert!"); } //Falls doch, erscheint diese Nachricht [ kann auch else return heißen]
    return 1;
    }


    CMD:login(playerid,params[])
    {
    new pass[128],s[128],pw[200];
    if(sscanf(params, "s",pass))return SendClientMessage(playerid,0xF0F0F0FF,"TIPP: /login [Passwort]");
    if(pInfo[playerid][Eingeloggt] == 1)return SendClientMessage(playerid,0xF0F0F0FF,"Du bist bereits eingeloggt!"); //Falls Eingeloggt auf 1 steht, wird diese Nachricht returnt
    format(s, sizeof(s),PLAYER_FOLDER,SpielerName[playerid]);
    if(!dini_Exists(s))return SendClientMessage(playerid,0xF0F0F0FF,"Du musst dich erst registrieren!"); //Das Selbe Schema wie oben
    format(pw, sizeof(pw), "%s", dini_Get(s, "Passwort"));//Passwort wird ermittelt
    if(strcmp(pass, pw) == 0) //Falls das Passwort stimmt
    {
    Eingeloggt[playerid] = 1;//Variable wird auf 1 gesetzt
    SpawnPlayer(playerid); //Spawnt den Spieler direkt, um die Skinauswahl zu überspringen
    SendClientMessage(playerid,0xF0F0F0FF,"Du hast dich erfolgreich eingeloggt!");
    } else { SendClientMessage(playerid,0xF0F0F0FF,"Falsches Passwort angegeben!"); }//Falls nicht, erscheint wieder eine Nachricht [auch hier würde else return gehen]
    return 1;
    }


    CMD:changepass(playerid,params[]) {
    new pass[128],s[128,str[128];
    if(sscanf(params, "s",pass))return SendClientMessage(playerid,0xF0F0F0FF,"TIPP: /changepass [Passwort]");
    if(Eingeloggt[playerid] == 0)return SendClientMessage(playerid,0xF0F0F0FF,"Du musst dich erst einloggen");
    format(s, sizeof(s),PLAYER_FOLDER,SpielerName[playerid]);
    dini_Set(s, "Passwort", pass); //Neues Passwort wird eingetragen 'pass' ist die oben definierte Variable.
    format(str,sizeof(str),"Passwort erfolgreich geändert [%s]",pass);
    SendClientMessage(playerid,0xF0F0F0FF,str);
    return 1; }


    Falls ihr jetzt Eingeloggt nutzen wollt, hier ein Beispiel.


    public OnPlayerRequestSpawn(playerid)
    {
    if(Eingeloggt[playerid]== 0){ SendClientMessage(playerid, 0xF0F0F0FF, "Du musst dich vorher einloggen!"); return 0;}
    return 1;
    }


    Beim Disconnect solltet ihr Eingeloggt wieder auf 0 setzen, damit sich kein Anderer mit eurem Account vergnügen kann.


    public OnPlayerDisconnect(playerid, reason)
    {
    Eingeloggt[playerid] = 0;
    return 1;
    }


    Im Anhang gibt es die .pwn + die Includes zum Downloaden.
    Falls ihr noch Fragen habt, stellt sie hier im Thread, ich helfe gerne weiter.


    Hier noch die Erklärung zu sscanf klick


    Hoffe, ihr habt alles verstanden und ich hab nicht allzu umständlich erklärt.</a_samp>

  • Es geht.


    Du hast leider nicht erklärt, wie man nun eine Variable (Geld, Score, etc. ) in der Spielerdatei mitabspeichert, außerdem hast du einen Fehler gemacht, undzwar gibt es die Variable "pInfo" garnicht. ;)


    C:\Dokumente und Einstellungen\Mirko G\Desktop\FreeRoam-Project\gamemodes\mysqlscript.pwn(113) : error 017: undefined symbol "pInfo"


    //Edit


    Trotzdem hast du von mir etwas verdient. Ich gebe dir für das Tutorial 8 von 10 Punkten, da du mir geholfen hast, meinen Login Bug zu beheben, da sich jeder mit egal welchem Passwort einloggen konnte. Außerdem wollte ich schon immer wissen wie das geht mit Befehlen anstatt Dialogen. :)

  • So viel zum Thema dini ist scheiße Dixon hehe


    Gutes Tutorial 9.5/10 Punkten.