Ecco un tutorial su come creare un admin system.
iniziamo mettendo in alto una variabile e un enum:
<div class="code_top" align="left">CODICE
enum gAdmin
{
Livello,
}
new Player[MAX_PLAYERS][gAdmin];
** Per saperne di più sugli ENUM andare qui: http://pawnoscripter.forumfree.it/?t=49489705
** MAX_PLAYERS è costante, già definita, che indica i player massimi che un server può contenere. In questo caso ( o almeno credo) Samp può contenere fino a 500 player. Verrà poi sostituito con "playerid".Ora lo script diventa semplice:
CODICE
public OnPlayerConnect(playerid)
{
Player[playerid][Livello] = 0;
return 1;
}
Ogni volta che il player entra gli verrà settato il livello di Admin a 0.
Ora Dobbiamo costruire i comandi. Iniziamo con il comando per aumentare il livello admin di un player. Io metto circa 4 (contando anche lo 0) livelli.
CODICE
if (strcmp(cmd, "/settadmin", true) == 0)
{
if((IsPlayerAdmin(playerid) == 1) || (Player[playerid][Livello] == 3))
{
new tmp[256];
new id;
new lvadmin;
tmp = strtok(cmdtext, idx);
if (!strlen(tmp)){
SendClientMessage(playerid, COLOR_RED, ".:ERRORE:. UTILIZZA: /settadmin [playerid] [n° livello]");
return 1;
}
id = strval(tmp);
if(!IsPlayerConnected(id)){
SendClientMessage(playerid, COLOR_RED, ".:ERRORE:. Il player non è connesso");
return 1;}
tmp = strtok(cmdtext, idx);
if (!strlen(tmp)) {
SendClientMessage(playerid, COLOR_RED, ".:ERRORE:. UTILIZZA: /settadmin [playerid] [n° livello]");
return 1;}
lvadmin = strval(tmp);
if ((lvadmin != 0) && (lvadmin != 1) && (lvadmin != 2) && (lvadmin != 3)){
SendClientMessage(playerid, COLOR_YELLOW, ".:ATTENZIONE:. I livelli sono 0 / 1 / 2 / 3 ");
return 1;}
new name2[MAX_PLAYER_NAME];
GetPlayerName(playerid,name,sizeof(name));
GetPlayerName(id, name2, sizeof(name2));
format(string, sizeof(string), ".:ESEGUITO:. %s ha settato il livello admin di %s in %d", name, name2, lvadmin);
Player[id][Livello] = lvadmin;
SendClientMessageToAll(COLORE, string);
return 1;
}
else{
SendClientMessage(playerid, COLOR_RED, ".:ERROR:. Non puoi utilizzare questo comando");}
return 1;
}
** Per avere informazioni su come utilizzare lo strtok: http://pawnoscripter.forumfree.it/?t=48457415Andiamo ad analizzare lo script:
CODICE
if (strcmp(cmd, "/settadmin", true) == 0)
{
if((IsPlayerAdmin(playerid) == 1) || (Player[playerid][Livello] == 3))
{
/* TUTTO IL CODICE */
}else{
SendClientMessage(playerid, COLOR_RED, ".:ERROR:. Non puoi utilizzare questo comando");}
return 1;
}
Questo script indica che se uno digita "settadmin" ed è ADMIN RCON oppure Admin livello 3 allora potrà utilizzare il comando, altrimenti gli manda un messaggio di errore e non potrà utilizzarlo.
CODICE
if (!strlen(tmp)){
SendClientMessage(playerid, COLOR_RED, ".:ERRORE:. UTILIZZA: /settadmin [playerid] [n° livello]");
return 1;
}
tmp = strtok(cmdtext, idx);
if (!strlen(tmp)) {
SendClientMessage(playerid, COLOR_RED, ".:ERRORE:. UTILIZZA: /settadmin [playerid] [n° livello]");
return 1;
}
Nel primo caso controlliamo se il player ha digitato correttamente il comando. Qui, ad esempio, gli manda un mess di errore se non scrive l'id del player o se non scrive il livello.
CODICE
id = strval(tmp);
if(!IsPlayerConnected(id)){
SendClientMessage(playerid, COLOR_RED, ".:ERRORE:. Il player non è connesso");
return 1;}
Questa riga assegna un valore a id, cioè quella della prima digitazione del player (/settadmin
IDPLAYER numero). Poi controlliamo se il player digitato è connesso. Se non lo è blocchiamo il comando e mandiamo un mess d'errore.
CODICE
lvadmin = strval(tmp);
if ((lvadmin != 0) && (lvadmin != 1) && (lvadmin != 2) && (lvadmin != 3)){
SendClientMessage(playerid, COLOR_YELLOW, ".:ATTENZIONE:. I livelli sono 0 / 1 / 2 / 3 ");
return 1;}
Facciamo assumere a lvadmin l'ultima digitazione del player (/settadmin idplayer
LIVELLO). Se i livelli NON (il non è dato dal punto esclamativo es. != 1 cioè se non è uguale a 1) sono uguali a 0, 1, 2, 3 ovvero se il player, al posto di digitare quei numeri, ne digita altri allora blocchiamo il comando e mandiamo un messaggio di errore.
CODICE
/* PARTE MESSAGGISTICA (lol) */
new name2[MAX_PLAYER_NAME], name[MAX_PLAYER_NAME], string[256];
GetPlayerName(playerid,name,sizeof(name));
GetPlayerName(id, name2, sizeof(name2));
format(string, sizeof(string), ".:ESEGUITO:. %s ha settato il livello admin di %s in %d", name, name2, lvadmin);
SendClientMessageToAll(COLORE, string);
/* ASSEGNAMENTO LIVELLO */
Player[id][Livello] = lvadmin;
Questa è l'ultima parte. Dichiariamo due variabili: name2 e name.
Poi con
CODICE
GetPlayerName(id, name2, sizeof(name2));
Ghetiamo il nome del player selezionato con la variabile ID (riguardare sopra).
CODICE
GetPlayerName(playerid,name,sizeof(name));
Ghetiamo il nome del player che ha digitato il comando.
Con la variabile string, andiamo a "comporre" il format.
CODICE
format(string, sizeof(string), ".:ESEGUITO:. %s ha settato il livello admin di %s in %d", name, name2, lvadmin);
Così facciamo assumere alla variabile string, il "valore" della frase dopo riportata. In + settiamo il nome del player che ha usato il comando, quello che ne ha "subito" l'effetto e il livello admin ricevuto. Mandiamo il tutto con un SendClientMessageToAll(colore, string) in modo che tutti i player possano saperlo.
CODICE
Player[id][Livello] = lvadmin;
Qui facciamo assumere al player "ID" (ovvero quello selezionato con il comando), il valore d lvadmin ovvero il livello di admin selezionato.
--
Per tutti i comandi admin, quindi, dovremmo utilizzare questa stringa:
CITAZIONE
if (strcmp(cmd, "/comando", true) == 0)
{
if((IsPlayerAdmin(playerid) == 1) || (Player[playerid][Livello] == LIVELLO_ADMIN))
{
se invece vogliamo creare un comando che possono usarlo i player dal livello 1 fino al livello 3, usiamo:
CITAZIONE
if (strcmp(cmd, "/comando", true) == 0)
{
if((IsPlayerAdmin(playerid) == 1) || (Player[playerid][Livello] >= 1))
{
sostituire l'1 con un altro livello di partenza.
Ovviamente esistono modi e modi per creare un admin system, io ho scelto questo perchè è quello più semplice da capire.
GUIDA IN CONTINUO AGGIORNAMENTO