Sistema de login e registro com Fini
Autor: [PP]KIZANO | Publicado: 2011-09-28T13:56:00-07:00

Olá pessoal, como estou fazendo meu GM do zero, usando Fini, vim ajudar o pessoal do fórum que não sabem usar a Fini.
Este é meu 1º tutorial, pode CRITIAR porque eu preciso saber o que eu errei para me aprimorar.
Então vamos começar:

Vá no topo do seu GM e coloque:


#include &lt;fini&gt; //vai carregar a include fini

#define DIALOG_LOGIN 1 //define nossa dialog de login e register
Depois coloque o seguinte no topo, mas perto de suas news.

enum pInfo{
&nbsp; &nbsp; cKey[128],
&nbsp; &nbsp; cLevel,
&nbsp; &nbsp; cReg,
&nbsp; &nbsp; cSkin,
&nbsp; &nbsp; cLog,
&nbsp; &nbsp; cGrana
}//define a variavel pInfo para diminiur nosso trabalho
new UserInfo[pInfo][MAX_PLAYERS];//acopla o pInfo a variavel UserInfo
new pName[MAX_PLAYER_NAME]; //define a variavel de nome, mas para todo o GM evitando repetições
Agora vamos as forwards:

//toda public que criamos precisa de uma forward :D
forward OnPlayerLogin(playerid,password[]); //para login
forward OnPlayerSave(playerid); //para salvar os dados
forward OnPlayerRegister(playerid, password[]); //para registrar
Agora vamos as publics nativas do SAMP:
public OnPlayerConnect(playerid){//public para quando o player conecta//vamos definir 2 string para nós usarmos no login&nbsp; &nbsp; new string[80];&nbsp; &nbsp; new string2[160];&nbsp; &nbsp; GetPlayerName(playerid, pName, sizeof(pName)); //pega o nome do player&nbsp; &nbsp; format(string, sizeof(string), "contas/%s.cfg",pName);//formata a string que verifica se existe o arquivo&nbsp; &nbsp; if(Fini_Exists(string))//verifica se existe o arquivo&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; //formata a string que aparecera no dialog para login&nbsp; &nbsp; &nbsp; &nbsp; format(string2, sizeof(string2), "{F5DEB3}Bem vindo ao Seu Servidor\n\n{B22222}Nome: {F5DEB3}%s\n{B22222}Status: {F5DEB3}Registrado\n\n Digite sua senha para logar:",pName);&nbsp; &nbsp; &nbsp; &nbsp; //mostra nossa dialog que formatamos a cima&nbsp; &nbsp; &nbsp; &nbsp; ShowPlayerDialog(playerid,DIALOG_LOGIN,DIALOG_STYLE_INPUT,"{B22222}Logar",string2,"Logar","Cancelar");&nbsp; &nbsp; }&nbsp; &nbsp; else&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; //formata a string que aparecera no dialog para registro&nbsp; &nbsp; &nbsp; &nbsp; format(string2, sizeof(string2), "{F5DEB3}Bem vindo ao Seu Servido\n\n{B22222}Nome: {F5DEB3}%s\n{B22222}Status: {F5DEB3}Não registrado\n\n Digite sua senha para registrar:",pName);&nbsp; &nbsp; &nbsp; &nbsp; //mostra nossa dialog formatada a cima&nbsp; &nbsp; &nbsp; &nbsp; ShowPlayerDialog(playerid,DIALOG_LOGIN+1,DIALOG_STYLE_INPUT,"{B22222}Registro",string2,"Registrar","Cancelar");&nbsp; &nbsp; &nbsp; &nbsp; //preste atenção no id dessa diaog: "DIALOG_LOGIN+1"&nbsp; &nbsp; &nbsp; &nbsp; //como definimos o "DIALOG_LOGIN" como 1 aqui ele pegara 1+1 e dara um novo id para o registro&nbsp; &nbsp; &nbsp; &nbsp; //evitando muitas definições :D&nbsp; &nbsp; }&nbsp; &nbsp; return 1;}public OnPlayerDisconnect(playerid){//public para quando o player sai do serv&nbsp; &nbsp; OnPlayerSave(playerid);//aki vai chamar a public q salva&nbsp; &nbsp; UserInfo[cLog][playerid] = 0;//desloga o player&nbsp; &nbsp; printf("Dados de ID: %d salvos com sucesso\n",playerid);//coloquei isso só para segurança pq mostra se salvou mesmo :P&nbsp; &nbsp; return 1;}public OnPlayerRequestSpawn(playerid){//public nativa do samp para &nbsp;quando o player clika em spawn//aqui embaixo ele vai verificar se o player estiver logado vai pode dar spawn, caso contrário não vai acontecer o spawn&nbsp; &nbsp; if(UserInfo[cLog][playerid] == 0)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; SendClientMessage(playerid, COLOR_WHITE, "Impossível ter spawn sem antes de logar.");//avisa o player&nbsp; &nbsp; &nbsp; &nbsp; return 0;//retorna 0 assim naum da spawn&nbsp; &nbsp; &nbsp;}&nbsp; &nbsp; //setiver logado efetua o spawn&nbsp; &nbsp; &nbsp;return 1;}public OnPlayerSpawn(playerid){//puclic quando da spawn//mais segurança//se não tiver logado congela o player//caso contrario descongela :D&nbsp; &nbsp; if(UserInfo[cLog][playerid] == 0)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; TogglePlayerControllable(playerid, 0);//aki congela&nbsp; &nbsp; &nbsp; &nbsp; return 1;&nbsp; &nbsp; }&nbsp; &nbsp; else&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; TogglePlayerControllable(playerid, 1);//aki descongela&nbsp; &nbsp; &nbsp; &nbsp; return 1;&nbsp; &nbsp; }}public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]){//public nativa do samp para resposta de dialog//vamos configurar os retornos do login e registro//aki embaixo vai verificar o login&nbsp; &nbsp; if(dialogid == DIALOG_LOGIN) //DIALOG_LOGIN é o ID da dialog de login&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; if(strlen(inputtext) == 0) //caso naum escreva nada retorna o login informando o erro da senha&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ShowPlayerDialog(playerid,DIALOG_LOGIN,DIALOG_STYLE_INPUT,"{B22222}Registro","\n{B22222}Senha incorreta!\n{F5DEB3}Insira sua senha novamente:","Logar","Cancelar");&nbsp; &nbsp; &nbsp; &nbsp; }else{&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; OnPlayerLogin(playerid,inputtext); //se escrever algo chama a public de login e passa a senha e o id da player&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; return 1;&nbsp; &nbsp; }//aki embaixo vai verificar o registro&nbsp; &nbsp; if(dialogid == DIALOG_LOGIN+1) //DIALOG_LOGIN+1 é o ID da dialod de registro&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; if(strlen(inputtext) == 0) //caso naum escreva nada retorna o registro informando q precisa de senha&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ShowPlayerDialog(playerid,DIALOG_LOGIN+1,DIALOG_STYLE_INPUT,"{B22222}Registro","\n{F5DEB3}Para registrar é necessário uma senha:","Registrar","Cancelar");&nbsp; &nbsp; &nbsp; &nbsp; }else{&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; OnPlayerRegister(playerid,inputtext); //se escrever algo chama a public de registro e passa a senha e o id da player&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; return 1;&nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; return 1;}
Até aqui tudo entendido?
Caso não comente para que eu te ajude
Se as publics que eu citei a cima já existem no seu GM só coloque o que eu coloquei nelas aqui nas suas publics
Agora finalizando vamos as publics de login, registro e salvamento

public OnPlayerLogin(playerid,password[]){//public que efetua o login&nbsp; &nbsp; new string[80]; //string para o nome do player&nbsp; &nbsp; GetPlayerName(playerid, pName, sizeof(pName)); //pega o noem do player pelo ID que foi passado&nbsp; &nbsp; format(string, sizeof(string), "contas/%s.cfg",pName); //formata a onde esta o arquivo de registro, se quiser mudar o local de salvamento antere o contas só não apague o %s&nbsp; &nbsp; Fini_OpenFile(string);//abre o arquivo&nbsp; &nbsp; if(strcmp(password,Fini_GetStr("Senha"), true) == 0) //verifica se a senha q foi passada &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp;//se a senha for igual faz isso aki embaixo&nbsp; &nbsp; &nbsp; &nbsp; UserInfo[cLevel][playerid] = Fini_GetValue("Level"); //Pega o level&nbsp; &nbsp; &nbsp; &nbsp; UserInfo[cReg][playerid] = Fini_GetValue("Reg"); //Pega a variavel de registro&nbsp; &nbsp; &nbsp; &nbsp; UserInfo[cSkin][playerid] = Fini_GetValue("Skin"); //Pega a skin&nbsp; &nbsp; &nbsp; &nbsp; UserInfo[cGrana][playerid] = Fini_GetValue("Grana"); //Pega o grana do player&nbsp; &nbsp; &nbsp; &nbsp; GivePlayerMoney(playerid, UserInfo[cGrana][playerid]); //devolve a grana salva&nbsp; &nbsp; &nbsp; &nbsp; UserInfo[cLog][playerid] = 1; //deixa como logado&nbsp; &nbsp; }&nbsp; &nbsp; else&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; //caso a senha não seja igual ele manda pro login de novo&nbsp; &nbsp; &nbsp; &nbsp; ShowPlayerDialog(playerid,DIALOG_LOGIN,DIALOG_STYLE_INPUT,"{B22222}Logar","{B22222}Senha incorreta!\n{F5DEB3}Insira sua senha novamente:","Logar","Cancelar");&nbsp; &nbsp; }&nbsp; &nbsp; Fini_CloseFile();//fecha o arquivo do player} public OnPlayerSave(playerid){//public q efetua o salvamento//coisas que tem no login e aqui são iguais não vou repetir&nbsp; &nbsp; new string[80];&nbsp; &nbsp; GetPlayerName(playerid, pName, sizeof(pName));&nbsp; &nbsp; format(string, sizeof(string), "contas/%s.cfg",pName);&nbsp; &nbsp; Fini_OpenFile(string);//abre o arquivo formatado a cima&nbsp; &nbsp; Fini_SetVal("Level", UserInfo[cLevel][playerid]);//salva o level&nbsp; &nbsp; Fini_SetVal("Reg", UserInfo[cReg][playerid]);//salva se foi registrado&nbsp; &nbsp; Fini_SetVal("Skin", UserInfo[cSkin][playerid]);//salva a skin&nbsp; &nbsp; Fini_SetVal("Grana", GetPlayerMoney(playerid));//salva a grana&nbsp; &nbsp; Fini_SaveFile(string);//salva o arquivo para efetuar as mudanças&nbsp; &nbsp; Fini_CloseFile();//fecha o arquivo, 1º salva depois fecha :@}public OnPlayerRegister(playerid, password[]){//por ultimo o registro&nbsp; &nbsp; new string[80];&nbsp; &nbsp; GetPlayerName(playerid, pName, sizeof(pName));&nbsp; &nbsp; format(string, sizeof(string), "contas/%s.cfg",pName);&nbsp; &nbsp; Fini_Create(string);//cria o arquivo do player&nbsp; &nbsp; Fini_OpenFile(string);//abre o arquivo do player&nbsp; &nbsp; Fini_SetStr("Senha", password);//salva a senha&nbsp; &nbsp; Fini_SetVal("Level", UserInfo[cLevel][playerid]);//salva o level, coloquei assim, pois vc pode querer dar level automaticamente&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //, mas como eu naum coloquei nehum valor no GM ele vai salvar como 0&nbsp; &nbsp; Fini_SetVal("Reg", 1);//salva se foi registrado&nbsp; &nbsp; Fini_SetVal("Skin", 178);//salva a skin, eu coloquei essa pq eu gosto, mas vc pode trocar&nbsp; &nbsp; Fini_SetVal("Grana", GetPlayerMoney(playerid)); //salva a gran do player&nbsp; &nbsp; Fini_SaveFile(string);//salva o arquivo&nbsp; &nbsp; Fini_CloseFile();// fecha o arquivo&nbsp; &nbsp; new string2[160];//string para definir o login, pq apos registrar temos q logar :D&nbsp; &nbsp; // \/ formata o q aparecera no login&nbsp; &nbsp; format(string2, sizeof(string2), "{F5DEB3}Bem vindo ao Seu Servidor\n\n{B22222}Nome: {F5DEB3}%s\n{B22222}Status: {F5DEB3}Registrado\n\n Digite sua senha para logar:",pName);&nbsp; &nbsp; //Dialog que efetua o login :D&nbsp; &nbsp; ShowPlayerDialog(playerid,DIALOG_LOGIN,DIALOG_STYLE_INPUT,"{B22222}Logar",string2,"Logar","Cancelar");
Ufaaa!
Acabou, espero que eu tenha ajudado vocês.
Comentem se precisar me manda MP e falem a nota do tutorial.

Todas as linhas estão comentadas, caso não intendo avise que eu te explico melhor.

Agradecimentos:

Falcon - Tutorial, Sherlock Holmes do Bugs(by drakins)

Drakins(banido) e KylePT pelo Desenvolvimento de Fini Cache File System
Jhony - Tester

Se mais detalhes sobre o Fini:
http://forum.sa-mp.com/showthread.php?t=250645


Download
http://pastebin.com/kwFCLKR1

Atenciosamente,
Deregudegu.