[GUIDA]Basi per un Admin System

« Older   Newer »
  Share  
[IwS]SnOoP
view post Posted on 30/4/2012, 20:32     +1   -1




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&#91;MAX&#95;PLAYERS]&#91;gAdmin]&#59;


** 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&#91;playerid]&#91;Livello] &#61; 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) &#61;&#61; 0)
       {
       if((IsPlayerAdmin(playerid) &#61;&#61; 1) &#124;&#124; (Player&#91;playerid]&#91;Livello] &#61;&#61; 3))
       {

       new tmp&#91;256]&#59;
       new        id;
       new lvadmin;
       tmp &#61; strtok(cmdtext, idx)&#59;

       if (&#33;strlen(tmp)){
       SendClientMessage(playerid, COLOR&#95;RED, "&#46;&#58;ERRORE&#58;&#46; UTILIZZA&#58; /settadmin &#91;playerid] &#91;n° livello]")&#59;
   return 1;
       }
       id &#61; strval(tmp)&#59;
       if(&#33;IsPlayerConnected(id)){
       SendClientMessage(playerid, COLOR&#95;RED, "&#46;&#58;ERRORE&#58;&#46; Il player non è connesso")&#59;
       return 1;}
       tmp &#61; strtok(cmdtext, idx)&#59;
       if (&#33;strlen(tmp)) {
       SendClientMessage(playerid, COLOR&#95;RED, "&#46;&#58;ERRORE&#58;&#46; UTILIZZA&#58; /settadmin &#91;playerid] &#91;n° livello]")&#59;
       return 1;}
        lvadmin &#61; strval(tmp)&#59;
       if ((lvadmin &#33;&#61; 0) &#38;&#38; (lvadmin &#33;&#61; 1) &#38;&#38; (lvadmin &#33;&#61; 2) &#38;&#38; (lvadmin &#33;&#61; 3)){
       SendClientMessage(playerid, COLOR&#95;YELLOW, "&#46;&#58;ATTENZIONE&#58;&#46; I livelli sono 0 / 1 / 2 / 3  ")&#59;
       return 1;}
       new name2&#91;MAX&#95;PLAYER&#95;NAME]&#59;
       GetPlayerName(playerid,name,sizeof(name))&#59;
       GetPlayerName(id, name2, sizeof(name2))&#59;
       format(string, sizeof(string), "&#46;&#58;ESEGUITO&#58;&#46; %­s ha settato il livello admin di %­s in %d", name, name2, lvadmin)&#59;
       Player&#91;id]&#91;Livello] &#61; lvadmin;
       SendClientMessageToAll(COLORE, string)&#59;
       return 1;
       }
       else{
       SendClientMessage(playerid, COLOR&#95;RED, "&#46;&#58;ERROR&#58;&#46; Non puoi utilizzare questo comando")&#59;}
       return 1;
       }


** Per avere informazioni su come utilizzare lo strtok:
http://pawnoscripter.forumfree.it/?t=48457415

Andiamo ad analizzare lo script:

CODICE
if (strcmp(cmd, "/settadmin", true) &#61;&#61; 0)
       {
       if((IsPlayerAdmin(playerid) &#61;&#61; 1) &#124;&#124; (Player&#91;playerid]&#91;Livello] &#61;&#61; 3))
       {

   /*  TUTTO IL CODICE */
     
       }else{
       SendClientMessage(playerid, COLOR&#95;RED, "&#46;&#58;ERROR&#58;&#46; Non puoi utilizzare questo comando")&#59;}
       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 (&#33;strlen(tmp)){
       SendClientMessage(playerid, COLOR&#95;RED, "&#46;&#58;ERRORE&#58;&#46; UTILIZZA&#58; /settadmin &#91;playerid] &#91;n° livello]")&#59;
   return 1;
       }
       tmp &#61; strtok(cmdtext, idx)&#59;
       if (&#33;strlen(tmp)) {
       SendClientMessage(playerid, COLOR&#95;RED, "&#46;&#58;ERRORE&#58;&#46; UTILIZZA&#58; /settadmin &#91;playerid] &#91;n° livello]")&#59;
       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&#39;id del player o se non scrive il livello.

CODICE
id &#61; strval(tmp)&#59;
       if(&#33;IsPlayerConnected(id)){
       SendClientMessage(playerid, COLOR&#95;RED, "&#46;&#58;ERRORE&#58;&#46; Il player non è connesso")&#59;
       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&#39;errore.

CODICE
lvadmin &#61; strval(tmp)&#59;
       if ((lvadmin &#33;&#61; 0) &#38;&#38; (lvadmin &#33;&#61; 1) &#38;&#38; (lvadmin &#33;&#61; 2) &#38;&#38; (lvadmin &#33;&#61; 3)){
       SendClientMessage(playerid, COLOR&#95;YELLOW, "&#46;&#58;ATTENZIONE&#58;&#46; I livelli sono 0 / 1 / 2 / 3  ")&#59;
       return 1;}


Facciamo assumere a lvadmin l&#39;ultima digitazione del player (/settadmin idplayer LIVELLO). Se i livelli NON (il non è dato dal punto esclamativo es. &#33;= 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&#91;MAX&#95;PLAYER&#95;NAME], name&#91;MAX&#95;PLAYER&#95;NAME], string&#91;256]&#59;
       GetPlayerName(playerid,name,sizeof(name))&#59;
       GetPlayerName(id, name2, sizeof(name2))&#59;
       format(string, sizeof(string), "&#46;&#58;ESEGUITO&#58;&#46; %­s ha settato il livello admin di %­s in %d", name, name2, lvadmin)&#59;
       SendClientMessageToAll(COLORE, string)&#59;

/* ASSEGNAMENTO LIVELLO */
       Player&#91;id]&#91;Livello] &#61; lvadmin;


Questa è l&#39;ultima parte. Dichiariamo due variabili: name2 e name.
Poi con
CODICE
GetPlayerName(id, name2, sizeof(name2))&#59;

Ghetiamo il nome del player selezionato con la variabile ID (riguardare sopra).
CODICE
GetPlayerName(playerid,name,sizeof(name))&#59;

Ghetiamo il nome del player che ha digitato il comando.

Con la variabile string, andiamo a "comporre" il format.

CODICE
format(string, sizeof(string), "&#46;&#58;ESEGUITO&#58;&#46; %­s ha settato il livello admin di %­s in %d", name, name2, lvadmin)&#59;

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&#39;effetto e il livello admin ricevuto. Mandiamo il tutto con un SendClientMessageToAll(colore, string) in modo che tutti i player possano saperlo.

CODICE
Player&#91;id]&#91;Livello] &#61; 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) &#124;&#124; (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) &#124;&#124; (Player[playerid][Livello] >= 1))
{

sostituire l&#39;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

 
Top
[GdM]selmer
view post Posted on 27/7/2012, 11:21     +1   -1




a me da i seguenti errori:

(66) : error 017: undefined symbol "Player"
(66) : error 033: array must be indexed (variable "-unknown-")
(66) : warning 215: expression has no effect
(66) : error 001: expected token: ";", but found "]"
(66) : fatal error 107: too many error messages on one line
 
Top
1 replies since 30/4/2012, 20:32   197 views
  Share