Bom eu vi algumas pessoas pedindo tutoriais sobre DOF2, e decidi criar esse tutorial simples, com algumas funções mais utilizadas. O sistema que fiz é o típico Registro e Login, um sistema fácil e simples de se fazer, ainda mais quando se fala de DOF2.
Bom, vamos começar o tutorial, se tiver algo para complementar, peço que avise para mim corrigir o problema pois ainda não sei usar todas as funções da include.
Funções que iremos usar
Iremos usar as seguintes funções nesse sistema de Registro e Login:
Code:
DOF2_Exit(); //Função para fechar a include (Creio eu) que terá que sempre ser colocada na callback OnGameModeExit DOF2_SaveFile(); //Para salvar as alterações feitas no arquivo DOF2_GetInt(file[],key[],tag[]=""); //Armazena o valor correspondente na variável DOF2_SetInt(file[],key[],value,tag[]=""); //Substitui a 'key' existente no arquivo pela 'tag' no arquivo DOF2_FileExists(file[]); //Verifica se o arquivo existe DOF2_CreateFile(file[],password[]=""); //Cria um arquivo
Começando...
Primeiramente, vamos adicionar as includes ao nosso sistema.
Code:
//TOPO DO GM/FS #include a_samp #include DOF2
Após isso, iremos definir o Id das DIALOGS.
Code:
#define DIALOG_REGISTRO 1 #define DIALOG_LOGAR 2
Agora, vamos adicionar uma enum para armazenar as informações do jogador, juntamente criando a variável para o player e uma outra variável para verificar se o player errou a senha e ser kickado após errar 'X' vezes.
Code:
enum Informacoes { Senha, Matou, Morreu, Dinheiro } new Player[MAX_PLAYERS][Informacoes]; new Erro[MAX_PLAYERS];
Como já foi dito, na callback OnGameModeExit(); será adicionado:
Code:
public OnGameModeExit() { DOF2_Exit(); return 1; }
Bom, agora o player precisa se registrar antes de entrar no jogo, quando o player se conectar no servidor, irá aparecer uma Dialog para Registro, caso sua conta esteja criada na pasta "Contas" retorna a Dialog de Login. Ficando assim:
Code:
public OnPlayerConnect(playerid) { new arquivo[40], name[MAX_PLAYER_NAME]; //'arquivo' uma string para a format | 'name' para pegar o nome do playerid GetPlayerName(playerid, name, 32); //Pega o nome do playerid format(arquivo, 40, "Contas/%s.ini", name); //Formata o arquivo com o nome do playerid if(DOF2_FileExists(arquivo)) //Verifica se a pasta existe { //Caso existir, irá retornar a dialog de Login ShowPlayerDialog(playerid, DIALOG_LOGAR, DIALOG_STYLE_PASSWORD, "Logar", "Você é Registrado, digite sua senha para logar!\nSe errar 5 vezes sua conta será banida!", "Confirma", "Cancelar"); } else //Caso o arquivo não exista { //Irá retornar a dialog de registro ShowPlayerDialog(playerid, DIALOG_REGISTRO, DIALOG_STYLE_INPUT, "Registro", "Você ainda não é Registrado, digite uma senha para se registrar!", "Confirma", "Cancelar"); } return 1; }
Agora, vamos as dialogs, onde irá ser para o player logar ou registrar.
Code:
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) { new arquivo[40], name[MAX_PLAYER_NAME]; //'arquivo' uma string para a format | 'name' para pegar o nome do playerid GetPlayerName(playerid, name, 32); //Para pegar o nome do playerid format(arquivo, 40, "Contas/%s.ini", name); //Formata o arquivo com o nome do playerid if(dialogid == DIALOG_REGISTRO) { if(!strval(inputtext)) //Verifica se o player digitou LETRAS, caso for true { //Retorna a dialog de registro novamente para ele digitar NÚMEROS ShowPlayerDialog(playerid, DIALOG_REGISTRO, DIALOG_STYLE_INPUT, "Registro", "Digite apenas números!\nDigite sua senha novamente para se registrar!", "Confirma", "Cancelar"); return 1; } if(!response) //Verifica se ele clicar em 'Cancelar" { //Caso ele clicar em cancelar, irá retornar ao playerid KICK Kick(playerid); return 1; } else //Verifica se ele Confirma o Registro { //Caso for true, ira criar o arquivo na pasta CONTAS Player[playerid][Senha] = strval(inputtext); //Player[playerid][Senha] vai ser igual ao que ele digitar na dialog Registro DOF2_CreateFile(arquivo); //Vai criar o arquvivo na pasta Contas DOF2_SetInt(arquivo, "Senha", Player[playerid][Senha]); //Vai salvar a senha do playerid DOF2_SetInt(arquivo, "Matou", Player[playerid][Matou]); //Vai salvar quantas vezes ele matou DOF2_SetInt(arquivo, "Morreu", Player[playerid][Morreu]); //Vai salvar quantas vezes ele morreu DOF2_SetInt(arquivo, "Dinheiro", Player[playerid][Dinheiro]); //Vai salvar o dinheiro dele DOF2_SaveFile(); //E finalmente salvando o arquivo, sem essa função o arquivo não será salvo! //Retornando a dialog de Login ao player no final para ele logar no server ShowPlayerDialog(playerid, DIALOG_LOGAR, DIALOG_STYLE_PASSWORD, "Logar", "Você se cadastrou, agora é só logar com sua senha registrada!", "Confirma", "Cancelar"); } } if(dialogid == DIALOG_LOGAR) { if(!strval(inputtext)) //Verifica se o player digitou letras, caso for true { //Retorna a dialog de Login novamente para ele digitar NÚMEROS ShowPlayerDialog(playerid, DIALOG_LOGAR, DIALOG_STYLE_PASSWORD, "Logar", "Digite apenas números!\nDigite sua senha cadastrada para logar!\nSe errar 5 vezes sua conta será banida!", "Confirma", "Cancelar"); return 1; } if(!response) //Verifica se ele clicar em 'Cancelar" { //Caso ele clicar em cancelar, irá retornar ao playerid KICK Kick(playerid); return 1; } else //Verifica se ele Confirma o Login { //Caso for true, ira verificar se o que ele digitar será a mesma senha que ele se registrou anteriormente Player[playerid][Senha] = DOF2_GetInt(arquivo, "Senha"); //Pega a senha do jogador no arquivo da conta if(strval(inputtext) == Player[playerid][Senha]) //Se o que ele digitar for igual ao valor que carregou aqui em cima /\ { //Retornará os dados do player e após irá dar Spawn no mesmo Player[playerid][Matou] = DOF2_GetInt(arquivo, "Matou"); //Pega quantos ele matou no arquivo Player[playerid][Morreu] = DOF2_GetInt(arquivo, "Morreu"); //Pega quantos ele morreu no arquivo Player[playerid][Dinheiro] = DOF2_GetInt(arquivo, "Dinheiro"); //Pega o dinheiro e iguala ao Player[playerid][Dinheiro] GivePlayerMoney(playerid, Player[playerid][Dinheiro]); //Da o dinheiro carregado acima SpawnPlayer(playerid); //Spawna o player } else //Caso ele digitar a senha errada { ShowPlayerDialog(playerid, DIALOG_LOGAR, DIALOG_STYLE_PASSWORD, "Logar", "Você digitou sua senha errado, digite-a novamente para logar!\nSe errar 5 vezes sua conta será banida!", "Confirma", "Cancelar"); Erro[playerid]++; //O erro vai aumentar cada vez que ele errar if(Erro[playerid] == 5) //Quando chegar à 5 vezes, irá retornar a msg e o Ban { SendClientMessage(playerid, -1, "Sua conta está banida por errar 5 vezes a sua senha, contacte o Admin para retirar seu Ban!"); Ban(playerid); return 1; } } } } return 1; }
Se caso o player sair do servidor, vamos precisar salvar a conta dele, para não dar erros depois na hora que ele for logar e não estiver salvo suas informaçoes(Dinheiro, Kills, Deaths). Então na callback OnPlayerDisconnect(playerid);
Code:
public OnPlayerDisconnect(playerid) { new arquivo[40], name[MAX_PLAYER_NAME]; //'arquivo' uma string para a format | 'name' para pegar o nome do playerid GetPlayerName(playerid, name, 32); //Para pegar o nome do playerid format(arquivo, 40, "Contas/%s.ini", name); //Formata o arquivo com o nome do playerid if(DOF2_FileExists(arquivo)) //Verifica se o arquivo da conta do playerid existe { Player[playerid][Dinheiro] = GetPlayerMoney(playerid); //Pega o dinheiro que o player tem no momento e iguala a Var de informações dele DOF2_SetInt(arquivo, "Senha", Player[playerid][Senha]); //Salva a senha, caso ele tenha modificado DOF2_SetInt(arquivo, "Matou", Player[playerid][Matou]); //Salva quantos players ele matou DOF2_SetInt(arquivo, "Morreu", Player[playerid][Morreu]); //Salva quantas vezes ele morreu DOF2_SetInt(arquivo, "Dinheiro", Player[playerid][Dinheiro]); //Salva o dinheiro que foi igualado ao GetPlayerMoney logo acima no começo da função DOF2_SaveFile(); //E finalmente salvando o arquivo } return 1; }
Sobre o Tutorial
Bom, o sistema é SIMPLES e não muito otimizado, poderia ser mais otimizado com menos linhas, mas prefiro fazer assim para que possamos entender melhor e para quem ainda não sabe mecher com Pawn possa interpretar melhor os códigos.
Requerimentos
Include a_samp
Include DOF2 - PASTEBIN
Sistema Completo e mais Otimizado
Code:
#include a_samp #include DOF2 #define DIALOG_REGISTRO 1 #define DIALOG_LOGAR 2 enum Informacoes { Senha, Matou, Morreu, Dinheiro } new Player[MAX_PLAYERS][Informacoes]; new Erro[MAX_PLAYERS]; main() { print("Tutorial feito por: EditPawn"); } public OnGameModeExit() { DOF2_Exit(); return 1; } public OnPlayerConnect(playerid) { if(DOF2_FileExists(Contas(playerid))) ShowPlayerDialog(playerid, DIALOG_LOGAR, DIALOG_STYLE_PASSWORD, "Logar", "Você é Registrado, digite sua senha para logar!\nSe errar 5 vezes sua conta será banida!", "Confirma", "Cancelar"); else ShowPlayerDialog(playerid, DIALOG_REGISTRO, DIALOG_STYLE_INPUT, "Registro", "Você ainda não é Registrado, digite uma senha para se registrar!", "Confirma", "Cancelar"); return 1; } public OnPlayerDisconnect(playerid) { SalvarContas(playerid); return 1; } public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) { if(dialogid == DIALOG_REGISTRO) { if(!strval(inputtext)) return ShowPlayerDialog(playerid, DIALOG_REGISTRO, DIALOG_STYLE_INPUT, "Registro", "Digite apenas números!\nDigite sua senha novamente para se registrar!", "Confirma", "Cancelar"); if(!response) return Kick(playerid); else { Player[playerid][Senha] = strval(inputtext); SalvarContas(playerid); ShowPlayerDialog(playerid, DIALOG_LOGAR, DIALOG_STYLE_PASSWORD, "Logar", "Você se cadastrou, agora é só logar com sua senha registrada!", "Confirma", "Cancelar"); } } if(dialogid == DIALOG_LOGAR) { if(!strval(inputtext)) return ShowPlayerDialog(playerid, DIALOG_LOGAR, DIALOG_STYLE_PASSWORD, "Logar", "Digite apenas números!\nDigite sua senha cadastrada para logar!\nSe errar 5 vezes sua conta será banida!", "Confirma", "Cancelar"); if(!response) return Kick(playerid); else { Player[playerid][Senha] = DOF2_GetInt(Contas(playerid), "Senha"); if(strval(inputtext) == Player[playerid][Senha]) { Player[playerid][Matou] = DOF2_GetInt(Contas(playerid), "Matou"); Player[playerid][Morreu] = DOF2_GetInt(Contas(playerid), "Morreu"); Player[playerid][Dinheiro] = DOF2_GetInt(Contas(playerid), "Dinheiro"); GivePlayerMoney(playerid, Player[playerid][Dinheiro]); } else { ShowPlayerDialog(playerid, DIALOG_LOGAR, DIALOG_STYLE_PASSWORD, "Logar", "Você digitou sua senha errado, digite-a novamente para logar!\nSe errar 5 vezes sua conta será banida!", "Confirma", "Cancelar"); Erro[playerid]++; if(Erro[playerid] == 5) { SendClientMessage(playerid, -1, "Sua conta está banida por errar 5 vezes a sua senha, contacte o Admin para retirar seu Ban!"); Ban(playerid); return 1; } } } } return 1; } stock Contas(playerid) { new arquivo[40], name[MAX_PLAYER_NAME]; GetPlayerName(playerid, name, 32); format(arquivo, 40, "Contas/%s.ini", name); return arquivo; } stock SalvarContas(playerid) { if(!DOF2_FileExists(Contas(playerid))) DOF2_CreateFile(Contas(playerid)); else { Player[playerid][Dinheiro] = GetPlayerMoney(playerid); DOF2_SetInt(Contas(playerid), "Senha", Player[playerid][Senha]); DOF2_SetInt(Contas(playerid), "Matou", Player[playerid][Matou]); DOF2_SetInt(Contas(playerid), "Morreu", Player[playerid][Morreu]); DOF2_SetInt(Contas(playerid), "Dinheiro", Player[playerid][Dinheiro]); DOF2_SaveFile(); } return 1; }
Créditos
EditPawn - Por criar o Tutorial
Dúvidas/Sugestões/Críticas
Bom, ainda não sei usar todas as funções do DOF2 como já falei anteriormente, mas caso haja algum erro, dúvida, sugestões ou até mesmo críticas, estarei a disposição a responder ao mesmo. Espero que seja útil à quem ainda não sabe mecher com DOF2.
Espero que gostem do meu primeiro tuto '-'
@EDIT
Esqueci de mencionar...
Terá que criar a pasta 'Contas' na ScriptFiles para salvar as contas.
@EDIT²
Arrumei as células e else '-'
@EDIT³
Trocado e Arrumado no sistema de login o DOF2_CheckLogin para outro sistema.
não funfa
ResponderExcluirCheio de bug
ResponderExcluirEste comentário foi removido pelo autor.
ResponderExcluir