Huhu, ich hab mir gedacht weils so oft gefragt wird könnte ich mal ein Tut posten in dem beschrieben wird wie man ein Adminsystem erstellt. Also als Grundlage verwende ich das Account System von BlackFoX_UD_.
So dann legen wir mal los, als erstes müssen den Enums eine Zeile hinzufügen
enum spieler_daten
{
wanted,
skin,
Float:lastx,Float:lasty,Float:lastz,
eingeloggt,
AdminLevel // Diese Variable wird später für das Laden und abfragen benötigt.
}
new Spieler[MAX_PLAYERS][spieler_daten];
So. nun suchen wir uns den Register Dialog und fügen folgendes hinzu
case DIALOG_REG: // ID Registrieren
{
if(!strlen(inputtext))
{
ShowPlayerDialog(playerid,DIALOG_REG,1,"Registrieren","Bitte Registriere dich","Abbrechen","Weiter");
return SendClientMessage(playerid,0xFFFFFFFF,"Das Passwort ist zu kurz!");
}
dini_Create(accFormat);
dini_Set(accFormat,"Passwort",inputtext);
dini_IntSet(accFormat, "AdminLevel" , 0); // Hier wird das Adminlevel in der Spielerdatei auf 0 gesetzt.
Spieler[playerid][AdminLevel] = 0; // Hier wird das Levels des neu registrierten Spielers auf 0 gesetzt.
Spieler[playerid][eingeloggt] = 1;
SendClientMessage(playerid,0xFFFFFFFF,"Account wurde angelegt und du wurdest eingeloggt.");
}
Laden des Adminlevels beim Login, ihr sucht den folgenden Code unter OnPlayerDialogResponse
if(strcmp(inputtext,dini_Get(accFormat,"Passwort")) == 0)
{
Spieler[playerid][wanted] = dini_Int(accFormat,"wanted");
Spieler[playerid][skin] = dini_Int(accFormat,"skin");
Spieler[playerid][lastx] = dini_Float(accFormat,"lastx");
Spieler[playerid][lasty] = dini_Float(accFormat,"lasty");
Spieler[playerid][lastz] = dini_Float(accFormat,"lastz");
GivePlayerMoney(playerid,dini_Int(accFormat,"Geld"));
SetPlayerScore(playerid,dini_Int(accFormat,"Score"));
Spieler[playerid][eingeloggt] = 1;
SendClientMessage(playerid,0xFFFFFFFF,"Du wurdest erfolgreich eingeloggt.");
}
und ersetzt ihn durch
if(strcmp(inputtext,dini_Get(accFormat,"Passwort")) == 0)
{
Spieler[playerid][wanted] = dini_Int(accFormat,"wanted");
Spieler[playerid][skin] = dini_Int(accFormat,"skin");
Spieler[playerid][lastx] = dini_Float(accFormat,"lastx");
Spieler[playerid][lasty] = dini_Float(accFormat,"lasty");
Spieler[playerid][lastz] = dini_Float(accFormat,"lastz");
GivePlayerMoney(playerid,dini_Int(accFormat,"Geld"));
SetPlayerScore(playerid,dini_Int(accFormat,"Score"));
Spieler[playerid][AdminLevel] = dini_Int(accFormat, "AdminLevel"); // Das Level wird aus der Datei geladen
Spieler[playerid][eingeloggt] = 1;
SendClientMessage(playerid,0xFFFFFFFF,"Du wurdest erfolgreich eingeloggt.");
}
So nun zeige ich euch noch wie man mit diesem Level Befehle erstellt. Zuerst benötigt ihr das sscanf Makro (da die Wiki down ist findet ihrs hier) und das dcmd Makro muss unter die includes!
#include <a_samp>
#include <dini>
#define dcmd(%1,%2,%3) if ((strcmp((%3)[1], #%1, true, (%2)) == 0) && ((((%3)[(%2) + 1] == 0) && (dcmd_%1(playerid, "")))||(((%3)[(%2) + 1] == 32) && (dcmd_%1(playerid, (%3)[(%2) + 2]))))) return 1
So damit haben wir jetzt dcmd definiert wird Zeit für den ersten Befehl
public OnPlayerCommandText(playerid, cmdtext[])
{
//anderer Code
dcmd(setlevel,8,cmdtext); // Die 8 steht für die Anzahl der Buchstaben im Wort setlevel - also 8 insgesamt.
return 0;
}
Und nun der eigentliche Befehl
dcmd_setlevel(playerid,params[])
{
new pID, Level;
if(sscanf(params, "ud",pID,Level))return SendClientMessage(playerid,0xFF0000FF,"Benutze: /setlevel [ID][Level]!"); //Falls nur /setlevel eingegeben wurde
if (pID == INVALID_PLAYER_ID)return SendClientMessage(playerid,0xFF0000FF,"Spielerid ist nicht vorhanden!");
// Falls eine falsche ID angegeben wurde, wird 0 returnt ;)
if(Spieler[playerid][AdminLevel] > 3) // Hier wird abgefragt ob das Level des Spielers der den Befehl eingegeben hat größer als 3 ist.
{
new adminstring[128],levelsetter[MAX_PLAYER_NAME], playername[MAX_PLAYER_NAME];
GetPlayerName(pID,playername,sizeof playername);
format(adminstring,sizeof(adminstring),"Admins/%s.sav",playername);
GetPlayerName(playerid,levelsetter,sizeof(levelsetter));
Spieler[pID][AdminLevel] = Level; //Hier wird die Levelvariable mit dem neu eingegebenen Level überschrieben
dini_IntSet(adminstring,"AdminLevel",Level); // Und hier das neue Level in der Datei gespeichert.
format(adminstring,sizeof(adminstring),"%s hat dein Level auf %d gesetzt!",levelsetter, Level);
SendClientMessage(pID,0x33FF33FF, adminstring);
}
else return SendClientMessage(playerid, 0xFF0000FF, "Dein Level reicht nicht aus!");
// Falls das Level nicht ausreicht wird dieser Text gesendet.
return 1;
}
Und zur Einfachheit halber hab ich noch einen weiteren Befehl erstellt, dazu sucht ihr wieder OnPlayerCommandText und ersetzt
public OnPlayerCommandText(playerid, cmdtext[])
{
//anderer Code
dcmd(setlevel,8,cmdtext); // Die 8 steht für die Anzahl der Buchstaben im Wort setlevel - also 8.
return 0;
}
durch
public OnPlayerCommandText(playerid, cmdtext[])
{
//anderer Code
dcmd(setlevel,8,cmdtext); // Die 8 steht für die Anzahl der Buchstaben im Wort setlevel - also 8.
dcmd(kick, 4, cmdtext); // Dieses Mal nur 4 Buchstaben
return 0;
}
Dieser Befehl kommt direkt unter den dcmd_setlevel Befehl!
dcmd_kick(playerid,params[])
{
new pID, str[64];
if(sscanf(params, "uz",pID,str))return SendClientMessage(playerid,0xFF0000FF,"USAGE: /kick ID Grund");
//Falls nur /Kick eingegeben wurde
if (pID == INVALID_PLAYER_ID)return SendClientMessage(playerid,0xFF0000FF,"Kein Spieler mit angegebener ID Online!");
//Falsche Id
if (pID == playerid)return SendClientMessage(playerid,0xFF0000FF,"Du kannst dich nicht selber kicken!");
// Falls man seine eigene ID angegeben hat ;)
if(Spieler[playerid][AdminLevel] > 0) // Wenn das Level größer ist als 0
{
new ThePlayer[MAX_PLAYER_NAME], str2[128];
GetPlayerName(pID,ThePlayer,sizeof(ThePlayer));
format(str2,sizeof(str2),"%s wurde vom Server gekickt!(Grund: %s)",ThePlayer,str[0] ? str : "<Kein Grund>");
// Falls kein Grund angegeben wird als Grund <Kein Grund> angegeben
SendClientMessageToAll(0xFF0000FF,str);
Kick(pID);
}
else return SendClientMessage(playerid, 0xFF0000FF, "Dein Level reicht nicht aus!");
return 1;
}
Im Anhang ist das fertige Script
Für Anregungen, Verbesserungen und Kommentare wäre ich dankbar.
Lg Hp
Pastebin
*Update* : Habe den Code etwas optimiert und auch die .pwn optimiert und den Pastebin Link eingefügt.
*Update2*: Bug gefixxt und Code weiter optimiert.
Stand: 18.10.2010breadfish.de/wcf/attachment/2400/