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 ?
- Dini
- ocmd
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.