08.01.2013, 18:22
(
Последний раз редактировалось zSuYaNw; 08.01.2013 в 18:59.
)
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
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;
}
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!");
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);
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;
}
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!");
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: