Whitelist 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
  • Guten Abend,

    in diesem Thread zeige ich euch wie ihr ein Whitelist System erstellt.

    Es wird nicht die beste und ressourcensparenste Methode sein, aber, die zur Erklärung, einfachste.

    Nun fangen wir direkt mal an.


    Was brauchen wir für Includes ?


    Diese müsst ihr runterladen und in euren /serverordner/pawno/includes Ordner einfügen.

    Dazu geht ihr noch in eurem /serverordner/scriptfiles/ und erstellt das Verzeichnis "White".

    Ganz oben im Script die Includes einbinden:

    #include <ocmd>
    #include <dini>

    Darunter müssen wir noch die Farbe Weiß definieren

    #define weiß #FFFAF0

    Zuerst gehen wir zu unserem Public "OnPlayerConnect"



    public OnPlayerConnect(playerid)
    {
    format(Spieler,sizeof(Spieler),"/White/%s.txt",Name(playerid)); //Wir setzen die Abfrage zum Verzeichnis in eine Variable, damit es übersichtlicher ist
    return 1;
    }


    Nun kommen wir zur IF-Abfrage, ob die Datei "Spieler" im Verzeichnis /White/ liegt und geben Messages aus



    public OnPlayerConnect(playerid)
    {
    new Spieler[200]; // Hier erstellen wir neue Platzhalter
    format(Spieler,sizeof(Spieler),"/White/%s.txt",Name(playerid)); //Wir setzen die Abfrage zum Verzeichnis in eine Variable, damit es übersichtlicher ist
    if(!dini_Exists(Spieler)) //Falls die Datei "Spieler" nicht existiert senden wir Messages und kicken den Spieler
    {
    SendClientMessage(playerid,weiß,"AdmCmd: Du stehst nicht auf der Whitelist. "); //Wir schicken dem Spieler vor dem Kick vom Server noch eine Nachricht, dass er nicht auf der Whitelist steht.
    SendClientMessage(playerid,weiß,"AdmCmd: Melde dich bei einem Administrator im Teamspeak oder Forum"); //hier das Gleiche
    Kick(playerid); //Wir schmeißen den Spieler vom Server runter
    }
    return 1;
    }

    Nun befehlen wir dem Server was er tun soll, wenn die Datei "Spieler" doch existiert



    public OnPlayerConnect(playerid)
    {
    format(Spieler,sizeof(Spieler),"/White/%s.txt",Name(playerid)); //Wir setzen die Abfrage zum Verzeichnis in eine Variable, damit es übersichtlicher ist
    if(!dini_Exists(Spieler)) //Falls die Datei "Spieler" nicht existiert senden wir MEssages und kicken den Spieler
    {
    SendClientMessage(playerid,weiß,"AdmCmd: Du stehst nicht auf der Whitelist. "); //Wir schicken dem Spieler vor dem Kick vom Server noch eine Nachricht, dass er nicht auf der Whitelist steht.
    SendClientMessage(playerid,weiß,"AdmCmd: Melde dich bei einem Administrator im Teamspeak oder Forum"); //hier das Gleiche
    Kick(playerid); //Wir schmeißen den Spieler vom Server runter
    }
    else
    {
    //Hier kommt eure Abfrage ob der Spieler registriert ist oder sich nun einloggen soll. Ich nehme meine als Beispiel, ihr solltet eure Anpassen!
    new SpielerDatei[64]; // neue Variable für die Spielerdatei
    format(SpielerDatei,sizeof(SpielerDatei),"/White/%s.txt",name); //Die Abfrage zum Verzeichnis
    SendClientMessage(playerid,weiß,"AdmCmd: Du bist in der Whitelist eingetragen und wirst nun weitergeleitet......"); //Message, dass er weitergeleitet wird
    if(dini_Exists(SpielerDatei)) //Abfrage ob die Datei "SpielerDatei" schon besteht. WICHTIG: Nicht "Spieler", sind beides andere Dateien und hier schreiben wir nicht in die gleiche Datei, wie in der Whitelist
    {
    ShowPlayerDialog(playerid,DIALOG_LOGIN,DIALOG_STYLE_PASSWORD,"Login","Dein Account wurde gefunden. Gib bitte dein Passwort ein:","Login","Abbrechen"); //Mein Dialog für den Login. Hier müsst auch ihr es an euer Script anpassen
    }
    else
    {
    ShowPlayerDialog(playerid,DIALOG_REGISTER,DIALOG_STYLE_PASSWORD,"Registrieren","Bitte gib dein gewünschtes Passwort ein:","Register","Abbrechen"); //Mein Dialog für diejenigen, die noch NICHT REGISTRIERT sind...ANPASSEN!
    }
    }
    return 1;
    }



    Als letztes kommen die Befehle, um als Administrator Benutzer in die Datenbank einzutragen oder auszutragen
    Hier zuerst der Befehl, um einen Benutzer einzutragen



    ocmd:adduser(playerid,params[]) //Befehl mit OCMD um einen Spieler der Whitelist hinzuzufügen
    {
    if(IsPlayerAdmin(playerid)) return ShowPlayerDialog(playerid,DIALOG_ADD,DIALOG_STYLE_INPUT,"Whitelist-System","Gebe den Spielersnamen für die Whitelist an:","Eintragen","Abbrechen"); //Dialog, um den Spieler einzutragen (geht auch mit Sccanf. Event. erläutere ich das noch)
    return 1;
    }

    Jetzt der Befehl, um einen Benutzer aus der Whitelist zu löschen



    ocmd:deluser(playerid,params[])
    {
    if(IsPlayerAdmin(playerid)) return ShowPlayerDialog(playerid,DIALOG_REMOVE,DIALOG_STYLE_INPUT,"Whitelist-System","Gebe den Spielersnamen für die Whitelist an","Austragen","Abbrechen"); //Dialog, um den Spieler auszutragen(geht auch mit Sccanf. Event. erläutere ich das noch)
    return 1;
    }

    Jetzt müssen wir die Dialoge bestimmen, ganz oben im Script unter den Includes

    #define DIALOG_ADD 1 //Auch hier eventuell anpassen, sodass sich die Zahlen nicht überschlagen

    #define DIALOG_REMOVE 2 //hier das gleiche


    Nun gehen wir zu "OnDialogResponse" und bestimmen, was im Dialog vom Befehl gemacht werden soll



    public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
    {
    if(dialogid == DIALOG_WHITELIST) //Abfrage, ob die Dialog ID der ID in unserem Befehl entspricht
    {
    new Spieler[200], string[128]; //Hier wieder zwei neue Variablen. Einmal für die Datei und für die Zeichenkette (string)
    format(Spieler,sizeof(Spieler),"/White/%s.txt",inputtext); //Wieder wird der Pfad formatiert mit der Eingabe im Dialog
    if(response) //Falls er etwas eingegeben hat und auf Eintragen geklickt hat oder Enter gedrückt hat
    {
    if(!dini_Exists(Spieler)) //IF-Zweig, ob die Datei schon im Verzeichnis der Whitelist liegt oder nicht. Hier fragt er ab, ob sie nicht drin liegt
    {
    format(string,sizeof(string),"AdmCmd: Spieler %s wurde in die Whitelist erfolgreich eingetragen", inputtext); // wir formatieren den String und geben den Spielernamen aus (%s), der in den Dialog (inputtext) eingegebn wurde
    SendClientMessage(playerid,weiß,string); //Wir senden den formatierten String an den Spieler ab, der den Befehl eingegeben hat
    dini_Create(Spieler); //Die Datei mit dem "Inputtext" des Spielers wird im Verzeichnis erstellt
    }
    else //Wenn es die Datei mit dem Namen bereits gibt
    {
    format(string,sizeof(string),"AdmCmd: Spieler %s gibt es bereits in der Whitelist", inputtext); //String wird auch hier formatiert und mit dem Inuputtext bestückt
    SendClientMessage(playerid,weiß,string); //nachricht wird wieder ausgegeben
    ShowPlayerDialog(playerid,DIALOG_ADD,DIALOG_STYLE_INPUT,"Whitelist-System","Gebe den Spielernamen für die Whitelist an:","Eintragen","Abbrechen"); //Wir zeigen dem Spieler noch einmal den Dialog, da er eventuell einen falschen Namen eingegebn hat
    }
    }
    }

    Im Dialog ist es fast das gleiche, wie bei "OnPlayerConnect"
    Nun ist es wieder das gleiche nur mit Remove. Ich denke das kann sich jeder selbst erklären, bzw. habe ich ja oben bereits. ändern sich nur ein paar Buchstaben



    public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
    {
    if(dialogid == DIALOG_WHITELIST) //Abfrage, ob die Dialog ID der ID in unserem Befehl entspricht
    {
    new Spieler[200], string[128]; //Hier wieder zwei neue Variablen. Einmal für die Datei und für die Zeichenkette (string)
    format(Spieler,sizeof(Spieler),"/White/%s.txt",inputtext); //Wieder wird der Pfad formatiert mit der Eingabe im Dialog
    if(response) //Falls er etwas eingegeben hat und auf Eintragen geklickt hat oder Enter gedrückt hat
    {
    if(!dini_Exists(Spieler)) //IF-Zweig, ob die Datei schon im Verzeichnis der Whitelist liegt oder nicht. Hier fragt er ab, ob sie nicht drin liegt
    {
    format(string,sizeof(string),"AdmCmd: Spieler %s wurde in die Whitelist erfolgreich eingetragen", inputtext); // wir formatieren den String und geben den Spielernamen aus (%s), der in den Dialog (inputtext) eingegebn wurde
    SendClientMessage(playerid,weiß,string); //Wir senden den formatierten String an den Spieler ab, der den Befehl eingegeben hat
    dini_Create(Spieler); //Die Datei mit dem "Inputtext" des Spielers wird im Verzeichnis erstellt
    }
    else //Wenn es die Datei mit dem Namen bereits gibt
    {
    format(string,sizeof(string),"AdmCmd: Spieler %s gibt es bereits in der Whitelist", inputtext); //String wird auch hier formatiert und mit dem Inuputtext bestückt
    SendClientMessage(playerid,weiß,string); //nachricht wird wieder ausgegeben
    ShowPlayerDialog(playerid,DIALOG_ADD,DIALOG_STYLE_INPUT,"Whitelist-System","Gebe den Spielernamen für die Whitelist an:","Eintragen","Abbrechen"); //Wir zeigen dem Spieler noch einmal den Dialog, da er eventuell einen falschen Namen eingegebn hat
    }
    }
    }
    if(dialogid == DIALOG_REMOVE)
    {
    new Spieler[200], string[128];
    format(Spieler,sizeof(Spieler),"/White/%s.txt",inputtext);
    if(response == 1)
    {
    if(dini_Exists(Spieler)) //Hier: Wenn die Datei schon besteht
    {
    dini_Remove(Spieler); //Spieler wurde aus der Datenbank/Verzeichnis "White" gelöscht
    format(string,sizeof(string),"AdmCmd: Du hast Spieler %s erfolgreich aus der Whitelist ausgetragen ", inputtext);
    SendClientMessage(playerid,weiß,string);
    }
    else
    {
    format(string,sizeof(string),"AdmCmd: Spieler %s ist nicht in der Whitelist eingetragen", inputtext);
    SendClientMessage(playerid,weiß,string);
    ShowPlayerDialog(playerid,DIALOG_REMOVE,DIALOG_STYLE_INPUT,"Whitelist-System","Gebe den Spielernamen für die Whitelist an","Austragen","Abbrechen");
    }
    }
    }
    return 1;
    }


    //edit Hier noch ein Stock für den Namen. Danke an [DT]deed, der mich darauf hingewiesen hat.

    stock Name(playerid)
    {
    new name[MAX_PLAYER_NAME];
    GetPlayerName(playerid,name,sizeof(name));
    return name;
    }


    Das hier ist nicht die optimale Lösung. Man kann einfach aus der Account Datenbank abfragen/eintragen/austragen und in der Registration dann dort rein schreiben.
    Jedoch ist es so leichter zu erklären. Hoffe es hat euch geholfen. Bei Problemen könnt ihr mich per PN oder Skype kontaktieren. Habe es selbst nicht getestet, müsste aber klappen.
    Fehler bitte sofort melden.

    6 Mal editiert, zuletzt von Pall. ()

  • Gutes Tutorial nur,
    Kick(playerid); //Wir schmeißen den Spieler vom Server runter
    Funktionier nicht ganz^^. Du musst einen Timer setzen, sonst bekommt der Spieler die Nachricht nicht.


    Ansonsten hätte man es ein bisschen übersichtlicher machen können, indem man die Namen in einer Datei speichert.
    Wäre auch einfach gewesen :) .


    8/10 Punkten


    L.G.
    heyho

  • Dein Tutorial ist gut.
    Einfach zu verstehen :3


    9/10 Fische


    LG

    "Imagine if the government went after corruption as hard as it goes after guys who run filesharing sites. Priorities. " - @Snowden
    "More worrying than FBI temporarily running a server that contained child porn, is hacking computers anywhere in the world with one warrant" - @josephfcox


  • Danke dir :) Ja, hätte alles in eine Datei schreiben können, doch so war es einfacher zu erklären. Ich füg vielleicht das noch bei, dass man in eine Datei schreibt.
    Der Kick Befehl müsste funktioniere, bzw. hat er bei mir^^



    Dein Tutorial ist gut.
    Einfach zu verstehen :3


    9/10 Fische


    LG


    Danke Neon 8)

  • Ich will da ja nicht drauf rumhacken, aber guck dir das mal an Kick


    L.G.
    heyho ^^

    heyhooo
    Das funktioniert auch so :3 habs getestet

    "Imagine if the government went after corruption as hard as it goes after guys who run filesharing sites. Priorities. " - @Snowden
    "More worrying than FBI temporarily running a server that contained child porn, is hacking computers anywhere in the world with one warrant" - @josephfcox

  • Hey,
    das Tutorial so ist gut erklärt
    Allerdings glaube das jeder der, dass nun wirklich haben möchte es sich nicht durchlesen wird
    Sondern es sich einfach Kopiert da dies für ihn einfacher ist
    Da du es beim Tutorial nur Kommentierst daneben


    Natürlich trotzdem gut erklärt und auch wirklich verständlich
    10/10 Punkten


    Und Das was er mit dem kick meint
    Ist das der SPIELER der gekickt wird die Nachricht nicht erhält
    Da die priorität des kick's höher als die der nachricht ist
    Wird der kick ehr ausgeführt

  • Dein Tutorial ist gut.
    Einfach zu verstehen :3


    9/10 Fische


    LG



    Danke. Mit dem Kick, das mache ich gleich noch. Hatte in Erinnerung es ging.
    Dass sie es kopieren ist immer die Gefahr beim Tutorial, aber wenn sie es nicht lernen wollen, dann ist es ihr Pech ;)

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • Sieht nicht so schlecht aus, man kanns zwar als c&p nehmen aber du hast es gut erklärt.
    Aber, warum jeden dialog einzeln definieren, wenn man es einfacher in einem enum machen kann ;)


    Zu deinem ocmd befehl, für was klammern?
    Wenn du nur eine sache nach einer abfrage machen kannst, kannst du ein return benutzen, sprich so:

    ocmd:deluser(playerid,params[])
    {
    if(IsPlayerAdmin(playerid))return ShowPlayerDialog(playerid,DIALOG_REMOVE,DIALOG_STYLE_INPUT,"Whitelist-System","Gebe den Spielersnamen für die Whitelist an","Austragen","Abbrechen");
    return 1;
    }

    Wären schon 2 zeilen gespart, das macht auf dauer nen unterschied ;)



    Dann, warum bei if(response ==1)
    ein ==1? if(response) ist das gleiche :)


    Aber sonst siehts sauber aus.

  • Soweit so gut, ich hab mich jetzt nicht auf alles konzentriert, habe aber gemerkt, dass du zu oft GetPlayerName benutzt, ich meine klar du brauchst es aber die "new name[24];" sind mir zu viel, wäre es nicht einfacher eine Funktion zu erstellen und diese dann ständig zu verwenden ? Gemeint >> GetName(playerid); "(stock) GetName(playerid) { new ......... }"

  • Soweit so gut, ich hab mich jetzt nicht auf alles konzentriert, habe aber gemerkt, dass du zu oft GetPlayerName benutzt, ich meine klar du brauchst es aber die "new name[24];" sind mir zu viel, wäre es nicht einfacher eine Funktion zu erstellen und diese dann ständig zu verwenden ? Gemeint >> GetName(playerid); "(stock) GetName(playerid) { new ......... }"


    Jap wäre es, füge es ein, wollte nur nicht extra einen Stock dafür erstellen ^^

  • Wenn ich mich nicht Irre hast du hier einen Denkfehler oder Schreibfehler.
    format(SpielerDatei,sizeof(SpielerDatei),"/Accounts/%s.txt",name); //Die Abfrage zum Verzeichnis

    Schau dir mal das Verzeichnis an.



    Eine etwas kürzere Methode.

    Spoiler anzeigen
    Unter OnPlayerConnect
    if (Whitelist(playerid)) {
    } else {
    SendClientMessage(playerid, COLOR_RED, "Du bist kein Betatester!");
    Kick(playerid);
    }
    OCMD Befehl

    ocmd:whitelist(playerid, params[]){
    new Namee[24];
    if(IstAdmin(playerid)){
    if(sscanf(params, "s", Namee)) return SendClientMessage(playerid, COLOR_CORNSILK, "Benutzung: /whitelist [Name]");
    new
    File:hFile,coordsstring[128],
    string[128];
    format(coordsstring,128, "%s\r\n",Namee);
    hFile = fopen("Whitelist.cfg", io_append);
    fwrite(hFile, coordsstring);
    fclose(hFile);
    format(string,sizeof(string),"%s wurde zur Whitelist hinzugefügt!",Namee);
    SendClientMessage(playerid,COLOR_YELLOW,string);}
    return 1;
    }
    Whitelist Funktion

    Whitelist(playerid)
    {
    if (gdebug==1){printf("DEBUG Whitelist Check(%d) (%s)", playerid);}
    new playername2[MAX_PLAYER_NAME];
    GetPlayerName(playerid, playername2, sizeof(playername2));
    new File: file = fopen("Whitelist.cfg", io_read);
    if (file)
    {
    new valtmp[MAX_PLAYER_NAME];
    while (fread(file, valtmp)) {
    StripNewLine(valtmp);
    if (!strcmp(valtmp, playername2, true, strlen(playername2))) {
    fclose(file);
    return 1;
    }
    }
    }
    fclose(file);
    return 0;
    }

  • Den Stock hätte ich nicht erstellen brauchen, denn im Endeffekt benutze ich den Namen nur bei OnPlayerConnect.
    Habs trotzdem mal geändert.
    Zu Dem Verzeichnis. Ja habe mich da verschrieben, habs aber schon geändert. Tut mir leid, dumm :sleeping:

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