[Tutorial] Tutorial DOF2 - Registro/Login
#1

Tutorial - DOF2

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:

pawn Код:
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
Й claro que tem muitas outras funзхes de DOF2, mais essas sгo as mais usadas em vбrios sistemas e eu sei usб-las melhor.


Comeзando...

Primeiramente, vamos adicionar as includes ao nosso sistema.
pawn Код:
//TOPO DO GM/FS
#include    a_samp
#include    DOF2
Apуs isso, iremos definir o Id das DIALOGS.
pawn Код:
#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.
pawn Код:
enum Informacoes
{
    Senha,
    Matou,
    Morreu,
    Dinheiro
}

new Player[MAX_PLAYERS][Informacoes];
new Erro[MAX_PLAYERS];
Como jб foi dito, na callback OnGameModeExit(); serб adicionado:
pawn Код:
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:
pawn Код:
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.
pawn Код:
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);
pawn Код:
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

pawn Код:
#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.
Reply
#2

Nice '-'


passou por aqui
Reply
#3

Quote:
Originally Posted by dPlaYer_
Посмотреть сообщение
Nice '-'


passou por aqui
Obrigado pela colaboraзгo e a atenзгo
Reply
#4

Parabens

UP
Reply
#5

Se eu entendi bem a include DOF2 isso aki 'DOF2_CheckLogin' nгo vai funcionar no seu caso!

pawn Код:
Player[playerid][Senha] = strval(inputtext);
E isso nгo vai funcionar se o Player digitar caracteres!

Fora isso acho que muitos que nгo conhecem DOF2 vгo aprender a usa-la!
Reply
#6

Quote:
Originally Posted by Murilo_sousa
Посмотреть сообщение
Parabens

UP
Vlw '-'

Quote:
Originally Posted by paulor
Посмотреть сообщение
Se eu entendi bem a include DOF2 isso aki 'DOF2_CheckLogin' nгo vai funcionar no seu caso!

pawn Код:
Player[playerid][Senha] = strval(inputtext);
E isso nгo vai funcionar se o Player digitar caracteres!

Fora isso acho que muitos que nгo conhecem DOF2 vгo aprender a usa-la!
DOF2_CheckLogin, funcionou aqui, e eu fiz para ser usado realmente Nъmeros para a senha..
Eu testei o sistema e funcionou perfeitamente sem bug's.

E obrigado pela sua atenзгo, fiz exatamente para ajudar quem ainda nao sabe mecher com DOF2.
Reply
#7

Muito bom seu tutorial
Reply
#8

Quote:
Originally Posted by Juninho_Oakley
Посмотреть сообщение
Muito bom seu tutorial
Obrigado Juninho
Reply
#9

legal, mas podia ter explicado algumas funзхes como DOF2_SetString, SetFloat, GetString... etc
Reply
#10

Quote:
Originally Posted by Lucas_Alemao
View Post
legal, mas podia ter explicado algumas funзхes como DOF2_SetString, SetFloat, GetString... etc
verdade '-'
Vlw Lucas
Reply
#11

Gostei, mas poderia tambйm ter melhorado nos seguintes pontos ( coisas bem simples ) :

Quote:
Originally Posted by EditPawn
View Post
pawn Code:
if(DOF2_FileExists(arquivo)) //Verifica se a pasta existe
        // ...
    else if(!DOF2_FileExists(arquivo)) //Caso o arquivo nгo exista
        // ...
Bastava um else, fica melhor de ser ler : )

pawn Code:
new arquivo[64], //...

    if(!response) //Verifica se ele clicar em 'Cancelar"
        //...
    if(response) //Verifica se ele Confirma o Registro
        //...
Poderia ter usado menos cйlulas ( new arquivo[64]; ), afinal vocк nгo chegarб a usar nem 40.
E da mesma forma, bastava um else
Reply
#12

Quote:
Originally Posted by Viniborn
View Post
Gostei, mas poderia tambйm ter melhorado nos seguintes pontos ( coisas bem simples ) :



Poderia ter usado menos cйlulas ( new arquivo[64]; ), afinal vocк nгo chegarб a usar nem 40.
E da mesma forma, bastava um else
Vlw vini, vou prestar mais atenзгo nas cйlulas e else
obg por postar

Vou dar @EDIT

@EDIT

arrumei as cйlulas, e os else como voce disse que seria bom melhorar
Reply
#13

Prefiro a idйia de ensinar a usar DOF2 por completo do que tentar ensinar a criar somente um sistema de registro/login... Porйm, ficou legal (:
Reply
#14

Legal
Reply
#15

Quote:
Originally Posted by Willian_Luigi
View Post
Prefiro a idйia de ensinar a usar DOF2 por completo do que tentar ensinar a criar somente um sistema de registro/login... Porйm, ficou legal (:
Bom, como ainda nгo sei completamente tudo sobre salvamentos com DOF2, apesar de ser fбcil, sу queria mostrar um simples sistema, onde fosse possнvel entende-lo da melhor forma, e passar as funзхes mais usadas para salvamento de dados.

Obg por opinar

Quote:
Originally Posted by ViictorDaay-
View Post
Legal
Bom, eu esqueci de escrever o resto '-'
Seria:

pawn Code:
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
Acho que й isso
Se caso nгo for, alguem me corrige pf '-'
Reply
#16

pawn Code:
DOF2_GetInt(file[],key[],tag[]=""); // e o GetInt ele pega oque foi setado no arquivo
Reply
#17

Quote:
Originally Posted by ViictorDaay-
View Post
pawn Code:
DOF2_GetInt(file[],key[],tag[]=""); // e o GetInt ele pega oque foi setado no arquivo
isso,e armazena na variavel:

pawn Code:
Player[playerid][pAdmin] = DOF2_GetInt(arquivo, "Admin"):
irб carregar no arquivo e armazenar na variavel "Player[playerid][pAdmin]"
pelo simples fato que Player[playerid][pAdmin] й Igual ao arquivo que carregar no GetInt.
Reply
#18

Ficou bom cara eu mesmo tava precisando desse tuto, e muitos aqui no fуrum tambйm, gostei!
Nгo dou +rep porque dei recentemente
Reply
#19

Quote:
Originally Posted by Edu33
View Post
Ficou bom cara eu mesmo tava precisando desse tuto, e muitos aqui no fуrum tambйm, gostei!
Nгo dou +rep porque dei recentemente
Obg '-'
Nгo tem problema
Reply
#20

falta uma coisa ensina a encriptar as senhas com dof2 й muito importante
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)