SA-MP Forums

Go Back   SA-MP Forums > Non-English > Languages > Português/Portuguese > Lançamentos/Releases

Reply
 
Thread Tools Display Modes
Old 24/02/2011, 01:07 PM   #1
zSuYaNw
Godfather
 
zSuYaNw's Avatar
 
Join Date: Apr 2010
Location: Santa Catarina
Posts: 6,857
Reputation: 659
Default Como Criar Sistema de Adminstração Simples.

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:
Code:
plugins Init sscanf
e no topo do vosso código:
PHP Code:
#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 Code:
#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 Code:
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 Code:
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 Code:
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 Code:
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 Code:
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 Code:
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
__________________
Vamo TI
(Blog relacionado a programação e informatica em geral)


Grupo do Fórum SA-MP no WhatsApp PM*

Last edited by zSuYaNw; 08/06/2016 at 06:43 PM.
zSuYaNw is offline   Reply With Quote
Old 24/02/2011, 02:05 PM   #2
[Ips]Guh
Gangsta
 
[Ips]Guh's Avatar
 
Join Date: Apr 2010
Location: Brazil
Posts: 849
Reputation: 62
Default Re: Como Criar Sistema de Adminstração Simples.

Bom tuto Garfield...ajudara mtos ae...
[Ips]Guh is offline   Reply With Quote
Old 24/02/2011, 02:22 PM   #3
[AF]Junior
Gangsta
 
[AF]Junior's Avatar
 
Join Date: Jun 2010
Posts: 671
Reputation: 7
Default Re: Como Criar Sistema de Adminstração Simples.

Bem chique...
[AF]Junior is offline   Reply With Quote
Old 24/02/2011, 02:26 PM   #4
Falcon.
High-roller
 
Falcon.'s Avatar
 
Join Date: Jul 2010
Location: Brasília - DF
Posts: 1,760
Reputation: 173
Default Re: Como Criar Sistema de Adminstração Simples.

Legal.
Bom tutorial.
__________________

Republic Adventure RPG
em breve...

Falcon. is offline   Reply With Quote
Old 24/02/2011, 03:15 PM   #5
Kruger
Huge Clucker
 
Kruger's Avatar
 
Join Date: Jan 2011
Posts: 267
Reputation: 1
Default Re: Como Criar Sistema de Adminstração Simples.

'-'

Garfield Amo Seus Tutoriais Essas Setinhas Chama Atenção =D

Muito Bom !!
__________________
Code:
My Name : Kruger :)

My Favorite Games :




Club From the Heart : 

Kruger is offline   Reply With Quote
Old 24/02/2011, 04:22 PM   #6
JaltiPT
Big Clucker
 
Join Date: Jan 2011
Location: Desconhecida :O
Posts: 92
Reputation: 0
Default Re: Como Criar Sistema de Adminstração Simples.

Bom Tuto!
JaltiPT is offline   Reply With Quote
Old 27/02/2011, 12:44 AM   #7
zSuYaNw
Godfather
 
zSuYaNw's Avatar
 
Join Date: Apr 2010
Location: Santa Catarina
Posts: 6,857
Reputation: 659
Default Re: Como Criar Sistema de Adminstração Simples.

valew!
__________________
Vamo TI
(Blog relacionado a programação e informatica em geral)


Grupo do Fórum SA-MP no WhatsApp PM*
zSuYaNw is offline   Reply With Quote
Old 03/05/2011, 11:51 PM   #8
jovinon
Little Clucker
 
Join Date: Mar 2011
Posts: 24
Reputation: 1
Default Re: Como Criar Sistema de Adminstração Simples.

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 (c) 1997-2006, ITB CompuPhase


4 Errors.
Tem como ajudar? Deu isso aqui :/
jovinon is offline   Reply With Quote
Old 04/05/2011, 12:15 AM   #9
TheGarfield
Banned
 
Join Date: Jul 2010
Location: -_-
Posts: 651
Reputation: 11
Default Re: Como Criar Sistema de Adminstração Simples.

Code:
enum gAdmin
{
    bool:Logado, 
    Nivel
}
new AdminInfo[MAX_PLAYERS];

no topo do seu FS.
TheGarfield is offline   Reply With Quote
Old 04/05/2011, 10:48 PM   #10
JonathanFeitosa
High-roller
 
Join Date: Jan 2011
Location: Manaus/AM
Posts: 2,767
Reputation: 338
Default Re: Como Criar Sistema de Adminstração Simples.

NICE
__________________

Vendo/Faço GM'S e Sistemas. Contato por Mensagem Privada.
JonathanFeitosa is offline   Reply With Quote
Reply

Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
[AJUDA] Como criar um sistema de gang publica - POLICIA taynam22 Português/Portuguese 10 26/05/2011 08:33 PM
[FilterScript] Simples Sistema de Concessionaria ! Baddark2131 Lançamentos/Releases 17 03/04/2011 04:25 AM
[FilterScript] [FS] Sistema de AFK simples. zSuYaNw Lançamentos/Releases 10 14/11/2010 06:27 AM
[Resolvido]Como Criar Sistema Level Profissoes angels182 Português/Portuguese 2 23/04/2010 05:58 PM


All times are GMT. The time now is 01:14 PM.


Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.