[Tutorial] Como criar seu sistema de administraзгo 2.0
#1

Como criar seu sistema de administraзгo 2.0



Aviso: Este tutorial necessita de um conhecimento bбsico, pois utiliza Arrays, Enumeradores, Variбveis, Callbacks,Diretivas se vocк nгo tem o certo conhecimento na бrea, sugiro ler este tutorial(Oque vocк precisa saber sobre PAWN)







Introduзгo:
Depois de um simples tutorial que criei hб alguns anos atrбs resolvi criar este
mais explicativo e funзхes/includes atualizadas.


Nele ensinarei:
- Criando sistema de administraзгo (Contendo comando /Setlevel, /Kick, /Registrar, /Logar).
- Sistema de salvamento completo(Utilizando a include bINI).




Itens:
Primeiramente vamos pegar os itens necessбrios para o nosso sistema de administraзгo:
- Y_commands - ******
- sscanf 2.8.1 - ******
- Bini files - ipsBruno
Apуs ter baixado os arquivos acima, coloque cada arquivo em sua correspondente pasta.




Tutorial:
Coloque exatamente no seu gamemode/filterscript oque esta escrito abaixo:
pawn Код:
#include a_samp
#include YSI\y_commands
#include sscanf2
#include bINi
No cуdigo acima, ele apenas carrega as includes baixadas, lembrado que nгo usei
o sнmbolo 'maior que' | 'menor que' Esses: <,>.
nгo muda nada em questгo de velocidade, й sу estйtica


Primeiramente vamos criar os enumeradores, com eles iremos armazenar os valores
temporбrios como nнvel, score etc..

pawn Код:
enum E_ADMIN{
    bool: E_LOGGED,
   
    E_NOME[24],
    E_PLAYER,
    E_VALOR,
    E_NIVEL
};

Apуs ter criado os enumeradores, vocк deve estar ciente que tem que criar uma variбvel
multi-array para utiliza-los.



pawn Код:
enum E_ADMIN{
    bool: E_LOGGED,
   
    E_NOME[24],
    E_PLAYER,
    E_VALOR,
    E_NIVEL
};

new
    gPlayerData [ MAX_PLAYERS ] [ E_ADMIN ],
    gString [128]
;

Eu fiz na liberdade de fazer uma array gString que alйm da multi-array gPlayerData, ela й
usada para manipuaзхes de string do nosso sistema.

Agora vamos para algumas definiзхes para falicitar nosso trabalho:


pawn Код:
#define GetNick(%0)                     (GetPlayerName(playerid, gPlayerData[%0][E_NOME], 24), gPlayerData[%0][E_NOME])
#define IsPlayerLogged(%0)              gPlayerData[%0][E_LOGGED]


#define Vermelho                        0xFF0000FF

A funзгo "GetNick" pega o nick do jogador com base do nosso enumerador E_ADMIN, agora a funзгo
"IsPlayerLogged" verifica se o player estб logado, de acordo com o enumerador E_LOGGED.

A definiзгo "Vermelho" й nossa cor vermelha que iremos utilizar para sinalizar um erro.




Agora iremos colocar uma pequeno scriptzinho necessбrio no OnPlayerConnect

pawn Код:
public OnPlayerConnect(playerid){

    for(new i, e = _:E_ADMIN; i != e; ++i){
        gPlayerData[playerid][E_ADMIN: i] = 0;
    }
    return true;
}
Ele evita que caso algum player entre no servidor, pode pegar o ъltimo valor salvo pelo player antigo.


Atй agora seu cуdigo deve ficar mais ou menos assim:

pawn Код:
#include a_samp
#include YSI\y_commands
#include sscanf2
#include bINi


#define GetNick(%0)                     (GetPlayerName(playerid, gPlayerData[%0][E_NOME], 24), gPlayerData[%0][E_NOME])
#define IsPlayerLogged(%0)              gPlayerData[%0][E_LOGGED]


#define Vermelho                        0xFF0000FF



enum E_ADMIN{
    bool: E_LOGGED,
   
    E_NOME[24],
    E_PLAYER,
    E_VALOR,
    E_NIVEL
};

new
    gPlayerData [ MAX_PLAYERS ] [ E_ADMIN ],
    gString [128]
;



Agora vamos a segunda parte do nosso tutorial,

#Primeiro comando:
O primeiro comando do nosso sistema й o "/setlevel" que nada mais nada menos que
"dar" moderaзгo/administraзгo para um player.


Primeiramente vб em qualquer parte do script (fora das callbacks) e adicione a seguinte
cуdigo:


pawn Код:
CMD:setlevel(playerid, params[]){

    return true;
}

Aqui vocк estб inicializando o sistema de administraзгo com o primeiro comando, sendo ele
"/setlevel", mais como vamos usar o comando se nгo tem nenhuma funзгo nele?

Adicione agora dentro do nosso comando:
pawn Код:
if(!IsPlayerAdmin(playerid)){ // verificar se й administrador RCON.

        if(!IsPlayerLogged(playerid)) // Verificar se estб logado no sistema
            return SendClientMessage(playerid, Vermelho, "[Erro]: Vocк nгo estб logado para usar este comando");

        if(gPlayerData[playerid][E_NIVEL] < 5) // Verificar se estб com autorizaзгo
            return SendClientMessage(playerid, Vermelho, "[Erro]: Vocк nгo tem nнvel suficiente para usar este comando!");
    }

Explicaзгo
Caso o player que digitar o comando nгo for admin rcon ele irб executar os seguintes if's
abaixo dele. O primeiro verifica se o player estб logado, caso ele nгo estiver o comando
para ali mesmo, mais se estiver logado ele verifica o nнvel do player que digitou o comando
se for menor que 5 ele nгo tem autorizaзгo para usar o comando entгo sу admins masters(nivel 5)
podem usar o comando sem estar logado na RCON.



Bom apуs ter inserido nossa verificaзгo de autenticaзгo vamos ao restante, introduza logo abaixo
do cуdigo anterior,
pawn Код:
if(sscanf(params, "ii", gPlayerData[playerid][E_PLAYER],    gPlayerData[playerid][E_VALOR]))
        return SendClientMessage(playerid, Vermelho, "[Erro]: Uso: /Setlevel <id> <level>");
       
    if(!IsPlayerConnected(gPlayerData[playerid][E_PLAYER]))
        return SendClientMessage(playerid, Vermelho, "[Erro]: Player nгo conectado!");
       
    if(gPlayerData[playerid][E_VALOR] < 0 || gPlayerData[playerid][E_VALOR] > 5)
        return SendClientMessage(playerid, Vermelho, "[Erro]: Nнvel invбlido!, escolha de 0(retirar moderaзгo) atй 5(admin master)");
   
    static tempID;
    tempID = gPlayerData[playerid][E_PLAYER];
   
    if(!gPlayerData[tempID][E_LOGGED])
        return SendClientMessage(playerid, Vermelho, "[Erro]: Player nгo logado!");
Explicaзгo:
Caso o player estiver autorizado(Logado na rcon ou no sistema contendo no nнvel 5 de adminstrador)
poderб executar o cуdigo que nуs acabamos de colocar.

Nele sгo da parde de formataзгo do comando, entгo vamos lб,

Logo na primeira linha, o "if" formata os parвmetros de acordo com oque foi definido no
segundo parвmetro da funзгo sscanf(parece confuso, nгo ?), jб o segundo verificador
olha se o player estб no servidor e o terceiro verifica se o nнvel digitado й menor que 5
e maior que 0. O ъltimo verificador vк se o futuro administrador(ou nгo) estб logado e
para isto й criado uma variбvel temporara chamada "tempID" que terб o valor do id do
futuro(ou nгo) administrador.


Ъltima parte do comando de setlevel:
pawn Код:
gPlayerData[tempID][E_NIVEL] = gPlayerData[playerid][E_VALOR];

    format(gString, 128, "O Administrador %s deu ao player %s o nнvel de administraзгo #%i", GetNick(playerid), GetNick(tempID), gPlayerData[playerid][E_VALOR]);
    SendClientMessageToAll(-1, gString);
Logo na primeira Linha vocк pode notar que o nнvel do futuro administrador й modificado
para o valor que o master (player que digitou o comando) definiou, e na 3, 4є Linha й
uma mensagem enviada a todos sobre a nova mudanзa na staff de administradores.



Depois do comando "Setlevel" agora й a vez do comando "/Registrar" e "/Logar".

Vamos iniciar um novo comando:
pawn Код:
CMD:registrar(playerid, params[]){
    return true;
}
Logo apуs ter introduzido o cуdigo acima, coloque dentro dele:

pawn Код:
if(IsPlayerLogged(playerid)){
        return SendClientMessage(playerid, Vermelho, "[Erro]: Vocк jб estб logado!");
    }
   
    new Senha[32];
    if(sscanf(params, "s[32]", Senha))
        return SendClientMessage(playerid, Vermelho, "[Erro]: /Registrar <Senha>");
       
    if(strlen(Senha) < 3)
        return SendClientMessage(playerid, Vermelho, "[Erro]: Sua senha tem que ter no mнnimo 3 caracteres!");
Explicaзгo:
O primeiro comparador verifica se o player jб estб logado, com isto nгo precisa registrar
novamente, o segundo verifica se a utilizaзгo do comando estб correta e jб formata o mesmo.
A ъltima condicional verifica se a senha й menor que 3 caracteres, caso for returna a um
erro. Assim nгo concluindo o registro.

Agora vamos terminar o comando de registro:

pawn Код:
format(gString, 128, "/Contas/%s.ips", GetNick(playerid));
   
    INI_Open(gString);
    INI_WriteString(gString, "Senha",   Senha);
    INI_WriteInt(gString,"Score",GetPlayerScore(playerid));
    INI_WriteInt(gString,"Dinheiro",GetPlayerMoney(playerid));
    INI_Save();
    INI_Close();
   
    SendClientMessage(playerid, -1, "Registrado!");

Logo na primeira linha й formatado a string "gString" para a pasta/nomeplayer.ips.
e logo abaixo й criado a conta dele.



Agora vamos ao sistema de registro:
pawn Код:
CMD:logar(playerid, params[]){

    if(IsPlayerLogged(playerid)){
        return SendClientMessage(playerid, Vermelho, "[Erro]: Vocк jб estб logado!");
    }
   
    format(gString, 128, "/Contas/%s.ips", GetNick(playerid));
   
    if(!fexist(gString)){
        return SendClientMessage(playerid, Vermelho, "[Erro]: Em nosso banco de dados a sua conta nгo estб registrada. Digite /Registrar.");
    }
   
   
    return true;
}

Explicaзгo:
Na primeira condicional й verificado se o player jб estб logado, e logo apуs
ser feita a verificaзгo й formatado a string "gString" para checar se existe
o usuбrio em questгo.


pawn Код:
new Senha[32];
    if(sscanf(params, "s[32]", Senha))
        return SendClientMessage(playerid, Vermelho, "[Erro]: /Logar <Senha>");
       
    if(strlen(Senha) < 3)
        return SendClientMessage(playerid, Vermelho, "[Erro]: Sua senha tem que ter no mнnimo 3 caracteres!");
       
    INI_Open(gString);

    if(strcmp(INI_ReadString(gString, "Senha"), Senha, false) != 0)
        return SendClientMessage(playerid, Vermelho, "[Erro]: Senha incorreta.");

Explicaзгo:
Na primeira condicional й verificado & formatado o comando de acordo com os
parвmetros definidos pelo sscanf, na segunda condicional й verificado o tamanho da senha.
Logo tem uma funзгo que Abre o arquivo formatado anteriormente (gString) e verifica
se a arrray "Senha" й igual a que estб no arquivo, caso nгo for ela returna a um erro.



pawn Код:
ResetPlayerMoney(playerid);
    SetPlayerScore(playerid, 0);

   
    SetPlayerScore(playerid, INI_ReadInt(gString, "Score"));
    GivePlayerMoney(playerid, INI_ReadInt(gString, "Dinheiro"));
   
   
    SendClientMessage(playerid, -1, "Logado");
   
   
    gPlayerData[playerid][E_LOGGED] = true;

Explicaзгo:
Nas duas primeiras linhas й restado o dinheiro/score do player, porque logo abaixo
serб carregado o Score/Dinheiro do player pela conta salva dele e na ъltima linha й
indicado que o player estб registrado e logado.



Consideraзхes finais:
Bom, nгo se esqueзa de criar a pasta "Contas" no script files, caso vocк
nгo tenha entendido calhordas nenhuma irei postar o script do tutorial
funcionando perfeitamente.

- Download:
Reply
#2

Rep+ Muito Bom 10/10
Reply
#3

Excelente tutorial, mбs nгo ensina a criar um sistema de admin.
Reply
#4

Quote:
Originally Posted by Kuddy
Посмотреть сообщение
Excelente tutorial, mбs nгo ensina a criar um sistema de admin.
Eu sei, ele ensina a fazer bolo de chocolate no microondas, no difнcil demora para aprender

(Conta para ninguйm nгo).
Reply
#5

Tuto muito bom, parabйns!
Reply
#6

Quote:
Originally Posted by Kuddy
Посмотреть сообщение
Excelente tutorial, mбs nгo ensina a criar um sistema de admin.
Concordo, o que vocк estб fazendo й criar alguns cуdigos e fazer um mau sistema de administraзгo (A onde й que jб se viu um sistema de Admin que verifique se ele tб logado na rcon e depois verifique o nivel, rcon й coisa mбxima, toda a gente quer evitar usar rcon, por isso que se cria um sistema de admin com certas variaveis) , na minha opiniгo o que vocк deveria ter feito era estruturar o seu tutorial e apontar alguns tуpicos, como por exemplo: O que um sistema de admin tem, Formas de salvar dados (Bini,Dini,MySQL,SQLite,y_ini,SII), Alguns comandos base em um sistema de administraзгo ( com seus exemplos ), etc...

Vocк deve dar a estrutura entende? Nгo dar um bocado de cуdigo, ninguйm aprende com isso, й o mesmo que um aluno vai aprender equaзхes mas o professor em vez de explicar para ele dб a conta para ele resolver.

Enfim, й um bom tutorial, porйm nгo explica como fazer o sistema de administraзгo em sн.

(nгo leve isto como uma ofensa nem uma critica destrutiva, pense nela como uma critica construtiva, a pouco tempo teve um membro que foi ler o seu tutorial umas 4x e ele disse que nгo entendeu nada)
Reply
#7

Sistema de admin й o de menos aн. Se liga.
Reply
#8

Quote:
Originally Posted by Kuddy
Посмотреть сообщение
Excelente tutorial, mбs nгo ensina a criar um sistema de admin.
Pelo que entendi, o principal objetivo do tutorial й ensinar como usar as devidas funзхes para fazer o seu proprio sistema de administraзгo.

@Topic:
Boa gato, dps te dou uma lasanha hehe
Reply
#9

valew cara otimo tuto
Reply
#10

Simples, e muito bom

9/10

Poderia ter deixado em Dialog. Seria muito melhor
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)