[Tutorial] Como Criar Sistema de Adminstraзгo Simples.
#1

Criando sistema de administraзгo simples

Nota: Caso vocк seja novato em PAWN, aconselho ler este tutorial, de "Oque vocк precisa sabe sobre PAWN".






Configurando:
Bom, para comeзar este tutorial, precisaremos do sistema zSINI que pode ser encontrado aqui, com esse sistema que vocк irб salvar as informaзхes do jogador. Tambйm precisaremos da plugin sscanf que pode ser encontrada aqui.

Primeiramente,vamos incluir o zSINI no nosso cуdigo. Logo apуs que colocar o zSINI.inc na pasta include e Init na pasta plugin, coloque no topo do seu projeto zSINI. Faзa o mesmo com o sscanf, coloque sscanf2.ini na pasta include do seu pawno e copie o sscanf.dll para sua pasta de plugins. Coloque #include <sscanf2> no topo do cуdigo para incluir no nosso projeto.

Nгo esqueзa de colocar no server.cfg as plugins Init e sscanf.

Ficando:
Код:
plugins Init sscanf
e no topo do vosso cуdigo:
PHP код:
#include <zSINI>
#include <sscanf> 




Tutorial:
Com nosso servidor e nosso pawno configurados, vamos ao cуdigo! Vamos iniciar declarando a pasta aonde irб ficar as contas dos jogadores para que possamos acessar e modificar facilmente.
PHP код:
#define PASTAPLAYERS     "Registro/%s.ini" 
Agora vamos criar nossas variбveis e arrays! Aqui nesta parte й aonde que fica as variбveis de armazenamento de dados do jogador, й um passo muito importante para vocк que deseja otimizar seu cуdigo.
PHP код:
enum gAdmin
{
    
bool:Logado
    
Nivel
}
new 
AdminInfo[MAX_PLAYERS][gAdmin];
new 
string[200]; 
Explicando:
A variбvel AdminInfo irб servir como uma fonte principal de dados aonde serгo armazenado os dados dos jogadores, note que utilizei um enumerador para organizaзгo. Agora a array string serб utilizada para formatar-mos nossas strings.




Agora vamos na parte um pouco complicada, vamos criar o comando de registro.. й aonde й criado um arquivo. Mas neste momento irei mostrar como fazer um simples comando em ZCMD. Para criarmos devemos sempre permanecer a mesma lуgica de comandos:

PHP код:
CMD:nome_do_comando(playeridparams[])
{
         return 
1;

Como pode notar, apуs aos dois ponto vem o nome do comando em que deseja criar. TODO comando tem que haver 2 parвmetros! [b]playerid[b] e params aonde sгo processados as informaзхes do jogador.

playerid - ID do jogador que digitou o comando.
params - parвmetros que o jogador digitou.


Agora que vocк intendeu o bбsico do ZCMD, vamos as funзхes:
PHP код:
CMD:registrar(playeridparams[])
{
    
// Criamos uma array para pegar o nome do jogador
    
new Nome[24];
    
    
// Armazenamos na array "Nome" o nome do jogador
    
GetPlayerName(playeridNome24);
    
    
// Formatamos a "string" em base da nossa definiзгo. Exemplo: 
    // Registro/zSuYaNw.ini
    
format(stringsizeof(string), PASTAPLAYERSNome); 
    
// Verificamos se o arquivo existe, se ele existir informa para o jogador que jб existe uma conta
    // com o mesmo nome.
    
if(fexist(string)) 
        return 
SendClientMessage(playerid, -1"Erro: Vocк jб estб registrado!");
    
    
// agora iremos pegar a senha do jogador, precisaremos de uma array de 32 cйlulas:
    
    
new Senha[32];
    
    if(
sscanf(params,"s[32]"Senha)) 
        return 
SendClientMessage(playeridCor,"[ERRO]: /Registrar <senha>");
    
// Criamos a conta do jogador
    
IniCreate(string);
    
// Agora vamos abrir a conta que criamos acima."
    
IniOpen(string);
    {
    
        
IniSet("Senha"Senha); // Salvamos a senha do jogador na conta
        
IniIntSet("Score"GetPlayerScore(playerid)); // Salvamos agora o score do jogador.
        
IniIntSet("Nivel"0); // Salvamos tambйm o nнvel administrativo
    
}
    
    
// Depois de fazer as operaзхes no arquivo de texto, iremos  salvar.. para salvar usamos a funзгo InClose.
    
IniClose();
    
    
    
// Informamos para o servidor que o jogador nгo estб logado:
    
AdminInfo[playerid][Logado] = false;
    
    
// Informamos tambйm o nнvel administrativo do jogador:
    
AdminInfo[playerid][Nivel] = 0// Nнvel 0 = Sem administraзгo.
    
    
    // Enviamos uma mensagem informando a senha:
    
format(stringsizeof(string),"Registrado com sucesso! Senha: %s"Senha);
    
SendClientMessage(playerid, -1string);
    return 
1;

No cуdigo acima, expliquei oque cada funзгo faz. Й a parte mais crucial do sistema pois se houver um erro pode acarretar vбrios futuros bugs.
Logo Abaixo mostrarei como realizar o comando para logar.

Crie tambйm:
PHP код:
CMD:logar(playeridparams[])
{    
    
    
// Criamos uma array para pegar o nome do jogador
    
new Nome[24];
    
    
// Armazenamos na array "Nome" o nome do jogador
    
GetPlayerName(playeridNome24);
    
    
// Formatamos a "string" em base da nossa definiзгo. Exemplo: 
    // Registro/zSuYaNw.ini
    
format(stringsizeof(string), PASTAPLAYERSNome); 
    
// Verificamos se o arquivo existe, se ele existir informa para o jogador que jб existe uma conta
    // com o mesmo nome caso o arquivo nгo existir ele informa que nгo estб registrado.
    
if(!fexist(string)) 
        return 
SendClientMessage(playerid, -1"Erro: Vocк nгo estб registrado!");
    
// Agora iremos pegar a senha do jogador, precisaremos de uma array de 32 cйlulas:    
    
new Senha[32];
    
    
// A Funзгo do sscanf extrai parвmetros da strings, e neste caso iremos estrair a senha:
    
if(sscanf(params,"s[32]"Senha)) 
        return 
SendClientMessage(playerid, -1,"[ERRO]: /Logar <senha>");
    
// Vamos veriricar se a senha que o jogador digitou й a correta:
    // Para isso, precisaremos abrir o arquivo e comparar a senha Armazenada na variбvel "Senha" 
    // comparar com oque estб salvo no arquivo:
    
    
new Senha2[32];
    
IniOpen(string);
    {
        
// Iremos armazenar
        
format(Senha232"%s"IniGet("Senha"));
    }
    
    
// Iremos fechar nosso arquivo.
    
IniClose();
    
    
// A Funзгo strcmp compara duas strings que no nosso caso й a Senhas do jogadores:
    // A Array Senha2 Retorna a senha do Arquivo e a Array Senha retorna a senha digitada
    // E se for incorrecta retornarб uma mensagem.
    
if(strcmp(Senha2Senhatrue) != 0)  
        return 
SendClientMessage(playerid, -1,"[ERRO]: Senha Icorreta!");
        
        
    
// Caso as senhas se coincidirem continua a funзгo:
    // Precisaremos abrir novamente o arquivo para pegar as informaзхes:
    
IniOpen(string);
    {
    
        
SetPlayerScore(playeridIniIntGet("Score");
        
AdminInfo[playerid][Nivel] = IniIntGet("Nivel");
    }
    
    
// Apуs que pegarmos as informaзхes iremos fechar nosso arquivo.
    
IniClose();
    
    
    
// Informamos que o jogador estб logado:
    
AdminInfo[playerid][Logado] = true;
    
// Enviamos uma mensagem informando a senha:
    
format(stringsizeof(string),"Logado com sucesso! Senha: %s"Senha);
    
SendClientMessage(playerid, -1string);    
    return 
1;

Os dois principais comandos foram criados, agora sу falta criar as principais funзхes e como exemplo criarei a funзгo SetLevel, que serб usada como exemplos para as demais funзхes.

Agora abaixo, vocк notarб como funciona nosso sistema de administraзгo:
PHP код:
CMD:setlevel(playeridparams[])
{
    
// Vamos verificar se o jogador estб logado na RCON, caso nгo estiver ele a condiзгo verifica se ele й admin nнvel 5:
    
if(!IsPlayerAdmin(playerid))
    {
        
//Caso o jogador nгo estiver logado na RCON ele faz outra verificaзгo de nнvel
        
if(AdminInfo[playerid][Nivel] < 5
            return 
SendClientMessage(playerid, -1,"[ERRO]: Seu nнvel й insuficiente para setar como admin ou nгo estб logado na rcon.");
    }
    
    
// Caso o jogador em questгo for nнvel 5 ou administrador na RCON o comando irб prosseguir. e o primeiro passo й criar as variбveis:
    
new         
        
outro_jogador// serб usada para informar o jogador que serб promovido
        
outro_nivel // nнvel do jogador que serб promovido.
    
;
    
    
// Utilizamos a funзгo sscanf para extrair da nossa string o jogador (ID) e o nнvel que iremos promover
    
if(sscanf(params"ud"outro_jogadoroutro_nivel
        return 
SendClientMessage(playerid, -1,"[ERRO]: Correto: /SetNivel [ID] [Nivel].");
    
// Vamos limitar o nнvel.  sendo o 5 o mбximo de nivel e o nнvel 1 como o mнnimo
    
if(outro_nivel ||outro_nivelLevel 1
        return 
SendClientMessage(playerid, -1,"[ERRO]: Bote nivel maior que 1 e menor que 5!");
    
// Agora iremos verificar se o jogador que serб promovido estб online, esta verificaзгo й muito importante para evitar 
    // crash do servidor.
    
if(IsPlayerConnected(outro_jogador))
        return 
SendClientMessage(playerid, -1"Jogador nгo conectado!");
        
    
// Promovendo:
    // Modificamos a variбvel do jogador para o nнvel desejado do administrador
    
AdminInfo[outro_jogador][Nivel] == outro_nivel;
    
    
// Enviando a mensagem para o jogador promovido: 
    
SendClientMessage(outro_jogador, -1"[INFO]: Parabйns, vocк й um adminstrador");
    
    
// Enviando mensagem para o jogador que promoveu:
    
SendClientMessage(playerid, -1"[INFO]: Parabйns, promoveu o jogador!");
    return 
1;

Como vocк notou, a variбvel AdminInfo[playerid][Nivel] foi utilizada para armazenar o nнvel administrativo do jogador. Devemos sempre limpar essa variбvel ao player conectar ou ao desconectar
pois caso um administrador sair, e outro player entrar com o mesmo ID poderб ganhar poderes administrativos. Entгo em OnPlayerDisconnect colocaremos:

PHP код:
public OnPlayerDisconnect(playeridreason
{
    
// Criamos uma array para pegar o nome do jogador
    
new Nome[24];
    
    
// Armazenamos na array "Nome" o nome do jogador
    
GetPlayerName(playeridNome24);
    
    
// Formatamos a "string" em base da nossa definiзгo. Exemplo: 
    // Registro/zSuYaNw.ini
    
format(stringsizeof(string), PASTAPLAYERSNome); 
    
// Verificamos se o arquivo existe, se ele existir salvaremos a conta do jogador
    
if(fexist(string)) 
    {
        
// Agora vamos abrir a conta que criamos acima."
        
IniOpen(string);
        {
        
            
IniSet("Senha"Senha); // Salvamos a senha do jogador na conta
            
IniIntSet("Score"GetPlayerScore(playerid)); // Salvamos agora o score do jogador.
            
IniIntSet("Nivel"AdminInfo[playerid][Nivel]); // Salvamos tambйm o nнvel administrativo
        
}
        
        
// Depois de fazer as operaзхes no arquivo de texto, iremos  salvar.. para salvar usamos a funзгo InClose.
        
IniClose();    
    }
    
// Apуs salvar as informaзхes iremos limpar nossos dados:
    
AdminInfo[playerid][Nivel] = 0;
    
AdminInfo[playerid][Logado] = false;
    
    return 
1;

Como vocк notou ,tudo segue a mesma lуgica entre salvamento e carregamento de dados. caso tiver alguma dъvida referente Hб esse tуpico, pode-se perguntar aqui.






Crйditos:
- zSuYaNw




Atualizado 08/06/2016
Reply
#2

Bom tuto Garfield...ajudara mtos ae...
Reply
#3

Bem chique...
Reply
#4

Legal.
Bom tutorial.
Reply
#5

'-'

Garfield Amo Seus Tutoriais Essas Setinhas Chama Atenзгo =D

Muito Bom !!
Reply
#6

Bom Tuto!
Reply
#7

valew!
Reply
#8

Quote:

C:\Users\Samuel\Documents\GTA\samp03csvr_R2-2_win32\gamemodes\serverSV.pwn(130) : error 017: undefined symbol "AdminInfo"
C:\Users\Samuel\Documents\GTA\samp03csvr_R2-2_win32\gamemodes\serverSV.pwn(130) : warning 215: expression has no effect
C:\Users\Samuel\Documents\GTA\samp03csvr_R2-2_win32\gamemodes\serverSV.pwn(130) : error 001: expected token: ";", but found "]"
C:\Users\Samuel\Documents\GTA\samp03csvr_R2-2_win32\gamemodes\serverSV.pwn(130) : error 029: invalid expression, assumed zero
C:\Users\Samuel\Documents\GTA\samp03csvr_R2-2_win32\gamemodes\serverSV.pwn(130) : fatal error 107: too many error messages on one line

Compilation aborted.Pawn compiler 3.2.3664 Copyright © 1997-2006, ITB CompuPhase


4 Errors.

Tem como ajudar? Deu isso aqui :/
Reply
#9

pawn Код:
enum gAdmin
{
    bool:Logado,
    Nivel
}
new AdminInfo[MAX_PLAYERS];
no topo do seu FS.
Reply
#10

NICE
Reply


Forum Jump:


Users browsing this thread: 3 Guest(s)