24.02.2011, 13:07
(
Последний раз редактировалось zSuYaNw; 08.06.2016 в 18:43.
)
Criando sistema de administraзгo simples
Nota: Caso vocк seja novato em PAWN, aconselho ler este tutorial, de "Oque vocк precisa sabe sobre PAWN".
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
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"
PHP код:
enum gAdmin
{
bool:Logado,
Nivel
}
new AdminInfo[MAX_PLAYERS][gAdmin];
new string[200];
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(playerid, params[])
{
return 1;
}
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(playerid, params[])
{
// Criamos uma array para pegar o nome do jogador
new Nome[24];
// Armazenamos na array "Nome" o nome do jogador
GetPlayerName(playerid, Nome, 24);
// Formatamos a "string" em base da nossa definiзгo. Exemplo:
// Registro/zSuYaNw.ini
format(string, sizeof(string), PASTAPLAYERS, Nome);
// 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(playerid, Cor,"[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(string, sizeof(string),"Registrado com sucesso! Senha: %s", Senha);
SendClientMessage(playerid, -1, string);
return 1;
}
Logo Abaixo mostrarei como realizar o comando para logar.
Crie tambйm:
PHP код:
CMD:logar(playerid, params[])
{
// Criamos uma array para pegar o nome do jogador
new Nome[24];
// Armazenamos na array "Nome" o nome do jogador
GetPlayerName(playerid, Nome, 24);
// Formatamos a "string" em base da nossa definiзгo. Exemplo:
// Registro/zSuYaNw.ini
format(string, sizeof(string), PASTAPLAYERS, Nome);
// 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(Senha2, 32, "%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(Senha2, Senha, true) != 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(playerid, IniIntGet("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(string, sizeof(string),"Logado com sucesso! Senha: %s", Senha);
SendClientMessage(playerid, -1, string);
return 1;
}
Agora abaixo, vocк notarб como funciona nosso sistema de administraзгo:
PHP код:
CMD:setlevel(playerid, params[])
{
// 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_jogador, outro_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 > 5 ||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;
}
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(playerid, reason)
{
// Criamos uma array para pegar o nome do jogador
new Nome[24];
// Armazenamos na array "Nome" o nome do jogador
GetPlayerName(playerid, Nome, 24);
// Formatamos a "string" em base da nossa definiзгo. Exemplo:
// Registro/zSuYaNw.ini
format(string, sizeof(string), PASTAPLAYERS, Nome);
// 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;
}
Crйditos:
- zSuYaNw
Atualizado 08/06/2016