GUI Register&Login mit Admin und Premium System

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
  • Moin zusammen, ich möchte euch ein Tutorial über Register & Login System zeigen.
    Also ich fange mal an, dies ist kein Copy & Past.


    Ganz oben machen wir erst einmal:


    #include <a_samp>
    #include <dini>


    Was bedeutet das eigentlich? Mit #include <Name>, Name ist ggf. a_samp, fügen wir einen Script rein, dies Spart Zeit und Platz.


    So, danach kommt
    #define DIALOG_LOGIN 1
    #define DIALOG_REG 2


    Was bedeutet #define ? Das ist einfach zusagen, es ist ein Platzhalter. (Siehe: Platzhalter )


    Nun kommen wir zum Enum ich mache den Standart Enum:


    enum spieler_daten
    {
    skin,
    eingeloggt,
    Admin,
    Premium,
    Geld,
    Score
    }
    new Spieler[MAX_PLAYERS][spieler_daten];


    Nehmen wir uns den Score vor, der Score dort bedeutet das in der Ini Datei eine Textzeile Score=0 heißen wird. Dazu aber später mehr...
    "new Spieler[MAX_PLAYERS][spieler_daten];" Muss immer unter dem Enum! Sonst Fehler ! Siehe Beitrag weiter unten für Infos xD


    Bei "public OnPlayerConnect(playerid)" schreiben wir folgendes:


    new string[64];
    new pname[MAX_PLAYERS],accFormat[128];
    GetPlayerName(playerid,pname,sizeof pname);
    format(accFormat,sizeof accFormat,"German/Spieler/%s.ini",pname); //Prüft ob Datei schon Existiert
    if(fexist(accFormat))
    {
    ShowPlayerDialog(playerid,DIALOG_LOGIN,1,"Login","Dein Account wurde gefunden! Du kannst dich nun Einloggen.","Abbrechen","Weiter");
    format(string, sizeof(string), "Herzlich Willkommen %s!", pname) ;
    }
    else // Wenn nicht schreibt er:
    {
    ShowPlayerDialog(playerid,DIALOG_REG,1,"Registrieren","{FFFFFF}Dein Account wurde {CC0000}nicht{FFFFFF} gefunden. Wir freuen uns das du unseren\n Server gefunden hast. Bitte gib dein Passwort ein!","Abbrechen","Weiter");
    GivePlayerMoney(playerid, 15000); // GGF. ANPASSEN !!!!
    }


    Nun sind wir auch schon bei "public OnPlayerDisconnect(playerid, reason)"


    new pname[MAX_PLAYERS],accFormat[128];
    GetPlayerName(playerid,pname,sizeof pname);
    format(accFormat,sizeof accFormat,"German/Spieler/%s.ini",pname);//Öffnet seine Datei
    if(fexist(accFormat) && Spieler[playerid][eingeloggt])
    {//Speichert alles<!>
    dini_IntSet(accFormat,"skin",Spieler[playerid][skin]);
    dini_IntSet(accFormat,"Premium",Spieler[playerid][Premium]);
    dini_IntSet(accFormat,"Admin",Spieler[playerid][Admin]);
    dini_IntSet(accFormat,"Geld",Spieler[playerid][Geld]);
    dini_IntSet(accFormat,"Score",Spieler[playerid][Score]);
    }
    Spieler[playerid][eingeloggt] = 0;// Loggt den Spieler aus der Dini aus


    Jetzt wird es einwenig Schwieriger!
    Wir sind jetzt bei "public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])"


    new pname[MAX_PLAYERS],accFormat[128];
    GetPlayerName(playerid,pname,sizeof pname);
    format(accFormat,sizeof accFormat,"German/Spieler/%s.ini",pname);//Sucht Spieler's Datei
    if(response)
    {
    switch(dialogid)
    {
    case DIALOG_LOGIN:// Wenn gefunden:
    {
    if(!strlen(inputtext))
    {
    ShowPlayerDialog(playerid,DIALOG_LOGIN,1,"Login","Dein Account wurde gefunden! Du kannst dich nun Einloggen.","Abbrechen","Weiter");
    return SendClientMessage(playerid,0xFFFFFFFF,"Du hast kein Passwort angegeben!");// Keine Passwort eingabe
    }
    if(strcmp(inputtext,dini_Get(accFormat,"Passwort")) == 0)//Wenn man erfolgreich Eingeloggt ist...
    {//Lädt alles auser der Dini
    Spieler[playerid][skin] = dini_Int(accFormat,"skin");
    Spieler[playerid][eingeloggt] = 1;
    Spieler[playerid][Premium] = dini_Int(accFormat, "Premium");
    SetPlayerScore(playerid, dini_Int(accFormat, "Score"));
    GivePlayerMoney(playerid, dini_Int(accFormat, "Geld")-GetPlayerMoney(playerid));
    Spieler[playerid][Admin] = dini_Int(accFormat, "Admin");
    SendClientMessage(playerid,0xFFFFFFFF,"Du hast dich {CC0000}Eingeloggt{FFFFFF}.");
    }
    else//Wenn das Passwort falsch ist
    {
    ShowPlayerDialog(playerid,DIALOG_LOGIN,1,"Login","Dein Account wurde gefunden! Du kannst dich nun Einloggen.","Abbrechen","Weiter");
    SendClientMessage(playerid,0xFFFFFFFF,"Du hast ein falsches Passwort eingegeben!");
    }
    }
    case DIALOG_REG:// Datei nicht gefunden
    {
    if(!strlen(inputtext))
    {
    ShowPlayerDialog(playerid,DIALOG_REG,1,"Registrieren","Bitte Registriere dich","Abbrechen","Weiter");
    return SendClientMessage(playerid,0xFFFFFFFF,"Dein Passwort ist zukurz!");
    }// Erstellt die Ini Datei für den Spieler mit allem auf 0
    dini_Create(accFormat);
    dini_Set(accFormat,"Passwort",inputtext);
    dini_IntSet(accFormat, "Admin" , 0);
    dini_IntSet(accFormat, "Score", 0);
    dini_IntSet(accFormat, "Geld", 0);
    dini_IntSet(accFormat, "Premium", 0);
    Spieler[playerid][Admin] = 0;
    Spieler[playerid][eingeloggt] = 1;//Loggt den Spieler automatisch ein
    SendClientMessage(playerid,0xFFFFFFFF,"Du hast dir einen Account auf /*DEINNAME*/ angelegt. Viel Spaß!");
    }
    }
    }
    else
    {
    switch(dialogid)//Bei falschem Passwort
    {
    case DIALOG_LOGIN:ShowPlayerDialog(playerid,DIALOG_LOGIN,1,"Login","Bitte logge dich ein","Abbrechen","Weiter");
    case DIALOG_REG:ShowPlayerDialog(playerid,DIALOG_REG,1,"Registrieren","{FFFFFF}Dein Account wurde {CC0000}nicht{FFFFFF} gefunden. Wir freuen uns das du unseren\n Server gefunden hast. Bitte gib dein Passwort ein!","Abbrechen","Weiter");
    }
    }
    if(strcmp(inputtext,dini_Get(accFormat,"Passwort")) == 0)//Erfolgreich eingeloggt
    {
    Spieler[playerid][skin] = dini_Int(accFormat,"skin");
    Spieler[playerid][Admin] = dini_Int(accFormat, "Admin"); // Das Level wird aus der Datei geladen
    Spieler[playerid][Premium] = dini_Int(accFormat, "Premium");
    SetPlayerScore(playerid, dini_Int(accFormat, "Score"));
    GivePlayerMoney(playerid, dini_Int(accFormat, "Geld")-GetPlayerMoney(playerid));
    Spieler[playerid][eingeloggt] = 1;
    SendClientMessage(playerid,0xFFFFFFFF,"Du wurdest erfolgreich eingeloggt.");
    }


    Ich hoffe ich konnte euch damit weiterhelfen, sollte ich irgendwo ein Fehler gemacht haben bitte bescheid geben !<Nehme Kritik entgegen>!
    Ich wünsche euch viel Spaß
    PS: Das ist mein erstes Tutorial ;)


    MFG,


    Dead

    Einmal editiert, zuletzt von DeadSecret ()

  • Für Anfänger schön aber ich würde es niemanden empfehlen.
    Man kann da einiges Optimieren.
    Wozu benutzt du ne strlen Funktion ? Dauert doch viel zu lange wenn du überprüfen willst ob was eingegeben wurde dann überprüf ob die Zelle leer ist die erste also das machst du so.



    if(!inputtext[0])return Text; //bedeutet das die Zelle leer ist.


    MFG RFT

    RFT

  • ich krieg immer errors


    C:\Dokumente und Einstellungen\JackJackson\Desktop\SAMP Server\gamemodes\GermanTest-Server.pwn(317) : error 001: expected token: ",", but found "["
    C:\Dokumente und Einstellungen\JackJackson\Desktop\SAMP Server\gamemodes\GermanTest-Server.pwn(317) : error 029: invalid expression, assumed zero
    C:\Dokumente und Einstellungen\JackJackson\Desktop\SAMP Server\gamemodes\GermanTest-Server.pwn(317) : warning 215: expression has no effect
    C:\Dokumente und Einstellungen\JackJackson\Desktop\SAMP Server\gamemodes\GermanTest-Server.pwn(317) : error 001: expected token: ";", but found "]"
    C:\Dokumente und Einstellungen\JackJackson\Desktop\SAMP Server\gamemodes\GermanTest-Server.pwn(317) : fatal error 107: too many error messages on one line


    Compilation aborted.Pawn compiler 3.2.3664 Copyright (c) 1997-2006, ITB CompuPhase



    4 Errors.



    in den zeilen
    public OnPlayerDisconnect(playerid, reason)
    {
    new pname[MAX_PLAYERS],accFormat[128];
    GetPlayerName(playerid,pname,sizeof pname);
    format(accFormat,sizeof accFormat,"Spieler/%s.ini",pname);//Öffnet seine Datei
    if(fexist(accFormat) && Spieler[playerid][eingeloggt])
    {//Speichert alles<!>
    dini_IntSet("skin",Spieler[playerid][skin]);
    dini_IntSet("Premium",Spieler[playerid][Premium]);
    dini_IntSet("Admin",Spieler[playerid][Admin]);
    dini_IntSet("Geld",Spieler[playerid][Geld]);
    dini_IntSet("Score",Spieler[playerid][Score]);
    }
    Spieler[playerid][eingeloggt] = 0;// Loggt den Spieler aus der Dini aus
    return 1;
    }



    sonst ist es super ohne register und login ist gut ich gebt dir :thumbup: :thumbup: :thumbup: :thumbup: :thumbup: :thumbup: :thumbup: :thumbup: :thumbup: :thumbup: :thumbup: :thumbup: :thumbup: :thumbup: :thumbup: :thumbup: :thumbup: :thumbup: :thumbup: :thumbup: :thumbup: :thumbup: :thumbup: :thumbup: /10

  • public OnPlayerDisconnect(playerid, reason)
    {
    new pname[MAX_PLAYERS],accFormat[128];
    GetPlayerName(playerid,pname,sizeof pname);
    format(accFormat,sizeof accFormat,"German/Spieler/%s.ini",pname);
    if(fexist(accFormat) && Spieler[playerid][eingeloggt])
    {
    dini_IntSet(accFormat,"skin",Spieler[playerid][skin]);
    dini_IntSet(accFormat,"Premium",Spieler[playerid][Premium]);
    dini_IntSet(accFormat,"Admin",Spieler[playerid][Admin]);
    SetPlayerScore(playerid, dini_Int(accFormat, "Score"));
    GivePlayerMoney(playerid, dini_Int(accFormat, "Geld")-GetPlayerMoney(playerid));
    }
    Spieler[playerid][eingeloggt] = 0;
    return 1;
    }


    Poste mal nur die Zeile, wenn es das auch nicht tut
    Danke an alle :D

  • ich hab nur noch 2 errors


    C:\Dokumente und Einstellungen\JackJackson\Desktop\SAMP Server\gamemodes\GermanTest-Server.pwn(47) : error 017: undefined symbol "spieler_daten"
    C:\Dokumente und Einstellungen\JackJackson\Desktop\SAMP Server\gamemodes\GermanTest-Server.pwn(47) : error 009: invalid array size (negative, zero or out of bounds)
    2 Errors.



    new Spieler[MAX_PLAYERS][spieler_daten];


    dies mal ist es nur die spieler daten die er nicht erkennt

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • damit habe ich glaube noch nie gearbeitet ^^ Mache immer das was mir einfacher gefällt, kommt aber meistens zu buggs die ich wieder fixxen muss wie zurzeit mit Haus System und Property System für mei nFreeroam server *-*

  • Ein Performance-Test hat ergeben, dass das PVar System deutlich langsamer ist als eine Variable.
    Die Zeit beim Setzen ist circa 0,3 Mikrosekunden langsamer bei den PVars.
    Das machst sich dann auch eher bei Servern bemerkbar, bei denen viele Leute spielen, und millisekündlich tausende Variablen gesetzt und gelöscht werden.
    Dann kann es auch schon mal zu Lags kommen.

  • danfai: Genau und wenn du mir diesen Server zeigst bekommst du einen Keks!
    Ganz ehrlich, die SAMP-Devs haben sich bei ihrem PVar-System schon was gedacht, ansonsten wäre es wohl nicht, wie auch bewiesen wurde, ressourcenschonender.
    Laggs entstehen nicht zwangsläufig durch langsame Funktionen, sondern auch durch mangelnde Leistung.


    @Tut: Nett, aber einiges unnötiges drin, wie RFT schon gesagt hat. Außerdem fehlt das Admin- und Premiumsystem oder die Überschrift stimmt nicht. Als 3. Punkt gibt es schon viele Tuts mit dini, ein anderes Syste, wäre mal was neues.


    //E: danfai eingefügt.

    Moderator der Bereiche: Coding, Vorstellungsrunde und Handelsecke. Über Verwarnungen, falls du zu den Wenigen gehörst, die eine Verwarnung von mir erhalten haben, kannst du jederzeit mit mir reden, sofern der Umgangston stimmt.


    expect us. / unkompetent. Das neue dynamisch. / easy-stripping.net - coming soon! / "9§. the entire website bestands out of english." / Vollprofi in allem, wo gibt und noch mehr; kann auch OOP.
    Kleine Coding-Frage? Schau doch in #dev im IRC vorbei, wir können dir sicher helfen.


    Ich bin für Aufträge im Bereich der Webentwicklung (z.B. User Control Panel) zu haben. Kontaktiere mich diesbezüglich einfach in einer privaten Nachricht mit deinen, möglichst konkreten, Vorstellungen.


    lesen.denken.posten. - [22:54:14] <Goldkiller2> früher gabs immer so coole user da stand in der signatur "lesen.denken.posten."


    Mafia 2 Multiplayer (m2mp.de) - Eine kostenlose Modifikation für Mafia 2, die es, ähnlich wie SAMP, erlaubt über das Internet oder LAN mit bis zu 1000 anderen Spielern zu spielen.

  • Ich habe gerade auch ein Performance Test durchgeführt und bin auf das gleiche Ergebnis gekommen.
    Das wiederlegt deine These.


    Es ist auch nachvollziehbar. Bei SetPVar wird eine Funktion ausgeführt, in der eine Variable gesetzt und gepeichert wird.
    Bei nur einer Variable, wird nur die Variable definiert.


    Aber nun wieder BTT.


    Edit: Will noch jemand von TripoX was posten...

  • Zitat

    Laggs entstehen nicht zwangsläufig durch langsame Funktionen, sondern auch durch mangelnde Leistung.


    Man sollte beim Programmieren immer auf die Performance achten, wenn man das nicht tut, dann kann man zwar auf mehr Leitung setzen, allerdings ist diese Mehrleistung immer mit Mehrkosten verbunden.


    Ist das Thema jetzt erledigt?



    // Edit: Rechtschreibung

  • @Tut: Nett, aber einiges unnötiges drin, wie RFT schon gesagt hat. Außerdem fehlt das Admin- und Premiumsystem oder die Überschrift stimmt nicht. Als 3. Punkt gibt es schon viele Tuts mit dini, ein anderes Syste, wäre mal was neues.


    Warum? Er Lädt und Speichert Admin und Premium, nur weil ich kein /setadminlevel oder /makepremium befehl rein gemacht habe ? Ich weiß schon was ich mache ...

  • Hi eine frage, was ist das:
    #include <dini>
    und woher bekomme ich die?


    mfg

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen