SSGamers - 12 Anos online por você.

#SSGamers - A Comunidade que mais crescer no brasil!

Participe do fórum, é rápido e fácil

SSGamers - 12 Anos online por você.

#SSGamers - A Comunidade que mais crescer no brasil!

SSGamers - 12 Anos online por você.

Gostaria de reagir a esta mensagem? Crie uma conta em poucos cliques ou inicie sessão para continuar.
Chegou o novo tema 6.5.5 - SSGamers - Servidores online de qualidade - Aproveite e entre para nossa comunidade, inscreva-se já! - Ouça nossa web radio - Veja nossas novidades - Participe dos nossos setores de jogos online - Parcerias aberta fale já com um administrador.

    [Tutorial] Criando um sistema em MySQL R41-4 [2017]

    Weslley_Script
    Weslley_Script
    SS - Fundador
    SS - Fundador


    Steam Steam : WeslleySSGames
    Zello : WeslleySSGames
    Mensagens : 11378
    Moedas : 1031967
    Data de inscrição : 06/10/2011
    Idade : 28
    Localização : Brasil

    [Tutorial] Criando um sistema em MySQL R41-4 [2017] Empty [Tutorial] Criando um sistema em MySQL R41-4 [2017]

    Mensagem por Weslley_Script Sex 17 Mar 2023 - 9:39

    Criando um sistema em MySQL versгo R41-4 [2017]


    Ola amigos do forum samp!

    Como vejo muitas pessoas tentando usar mysql resolvi fazer esse tutorial com a versгo mais recente,
    ja que os tutorias que temos na nossa board sгo todos antigos e ultrapassados. Espero que gostem
    (Atualizado 16/02/2018- Versгo R41-4)

    1.0 Introduзгo

    Irei ensinar nesse tutorial como utilizar o basico do MySQL, ou seja criaremos um simples sistema de salvamento.
    Para estudo, salvaremos como exemplos Nome, Senha, Level, Dinheiro, Skin, Kills, Deaths e nivel de admin.

    1.1 Banco de dados

    Antes de tudo devemos criar nossa data base onde sera feito todo o nosso salvamento.
    Temos esse video abaixo explicando como criar utilizando o WampServer.
    Caso ainda nгo saiba criar uma data base por favor assista, mais somente ate a parte de criaзгo da data base.
    As tabelas por enquanto nгo nos interessam.

    Video


    1.2 Arquivos necessarios

    libmariadb.dll > Na pasta do samp server.
    log-core.dll > Na pasta do samp server.
    mysql.dll ou .so para linux > Na pasta plugin
    a_mysql.inc > Na pasta includes do pawno para copilar o script



    1.3 Aplicaзгo no script

    Primeiramente iremos incluir o mysql no nosso script:



    Código:
    #include <a_samp>
    #include <a_mysql> 

    Definimos as dialogs que iremos usar:



    Código:
    #define DIALOG_REGISTRO     1
    #define DIALOG_LOGIN        2 

    Criamos as variaveis necessarias:



    Código:
    new MySQL:IDConexao; // Variavel responsavel pela ID da conexгo com o host
    enum pInfo // enumerador com variaveis necessarias para nosso salvamento.
    {
        pID,
        pNome[24],
        pIP[26],
        pSenha[20],
        pLevel,
        pDinheiro,
        pSkin,
        pMatou,
        pMorreu,
        pAdmin,
         bool:pLogado
    };
    new PlayerInfo[MAX_PLAYERS][pInfo]; 

    Agora iremos usar defines para facilitar nossa conexao ao banco de dados:



    Código:
    #define HOST      "localhost" // IP de acesso ao phpmyadmin no caso se voce estiver hospedando no pc deixei localhost
    #define USUARIO   "root" // Usuario por padrгo й root
    #define DATABASE  "samp" // nome da database que voce criou.. como explicao no video acima
    #define SENHA     ""   // nгo possue senha caso tenha usado o wamp 

    Agora como eu disse acima nгo precisamos criar as tabelas como no video, podemos usar uma funзгo do mysql mesmo:
    WAMP versгo 2.5



    Código:
        mysql_query(IDConexao, "CREATE TABLE IF NOT EXISTS `Contas`(`ID`int AUTO_INCREMENT PRIMARY KEY, `Nome`varchar(24) NOT NULL,`Senha` varchar(20) NOT NULL,`Level` int(20) NOT NULL,`Matou` int(10) NOT NULL,`Morreu` int(10) NOT NULL,`Skin` int(10) NOT NULL,`Admin` int(10) NOT NULL,`Dinheiro` int(20) NOT NULL)", false); 

    WAMP versгo atual 3.0.6

    Código:
        mysql_query(IDConexao, "CREATE TABLE IF NOT EXISTS `Contas`(`ID`int AUTO_INCREMENT PRIMARY KEY, `Nome`varchar(24) NOT NULL DEFAULT ' ',`Senha` varchar(20) NOT NULL DEFAULT ' ',`Level` int(20) NOT NULL DEFAULT 0,`Matou` int(10) NOT NULL DEFAULT 0,`Morreu` int(10) NOT NULL DEFAULT 0,`Skin` int(10) NOT NULL DEFAULT 0,`Admin` int(10) NOT NULL DEFAULT 0,`Dinheiro` int(20) NOT NULL DEFAULT 0)", false); 

    Ou seja, CREATE TABLE IF NOT EXISTS "Criar a tabela se ela nгo existir":




    Código:
    public OnGameModeInit()
    {
        IDConexao = mysql_connect(HOST, USUARIO, SENHA, DATABASE); // faremos a conexгo ao host com as informaзхes definidas acima
        mysql_query(IDConexao, "CREATE TABLE IF NOT EXISTS `Contas`(`ID`int AUTO_INCREMENT PRIMARY KEY, `Nome`varchar(24) NOT NULL,`Senha` varchar(20) NOT NULL,`Level` int(20) NOT NULL,`Matou` int(10) NOT NULL,`Morreu` int(10) NOT NULL,`Skin` int(10) NOT NULL,`Admin` int(10) NOT NULL,`Dinheiro` int(20) NOT NULL)", false);
        if(mysql_errno(IDConexao) != 0) // Ultilizo essa maneira para saber se a conexгo foi bem sucedida ou nгo
        {
            print("Falha na conexгo ao banco de dados Mysql");
            } else {
            print("Conexгo ao banco de dado Mysql efetuada com sucesso");
        }
        return 1;




    Código:
    public OnGameModeExit()
    {
        for(new i = 0; i < MAX_PLAYERS; i++) SalvarDados(i); // Realizamos um loop na funзгo Funзгo SalvarDados para q salve todas as contas numa posivel queda do servidor
        mysql_close(IDConexao); // Aqui fechamos a conexгo com o host
        return 1;




    Código:
    public OnPlayerConnect(playerid)
    {
        GetPlayerName(playerid, PlayerInfo[playerid][pNome], 24); // Pegamos o nome do player somente uma vez quando se conectar e formatamos na variavel.
        GetPlayerIp(playerid, PlayerInfo[playerid][pIP], 26); // Mesma coisa no IP
        
        new Query[90]; // criamos uma variavel com 90 celulas
        mysql_format(IDConexao, Query, sizeof(Query), "SELECT `Senha`, `ID` FROM `Contas` WHERE `Nome`='%s'", PlayerInfo[playerid][pNome]); // formatamos a Query selecionando SENHA e ID referente a tabela Contas Linha (NOME)
        mysql_tquery(IDConexao, Query, "VerificarContas", "i", playerid); // Faremos a consulta se a linha "Nome" existe sim ou nгo
        // Usaremos mysql_tquery para realizar a consulta na tabela e enviar o resultado para a callback.
        // o resultado sera enviado para callback VerificarContas
        return 1;


    Callback com o resultado da consulta acima



    Código:
    forward VerificarContas(playerid);
    public VerificarContas(playerid)
    {
        new Dialog[240]; // Variavel para as dialogs com 240 celulas necessarias
        
        if(cache_num_rows() > 0) // aqui o resultado da consulta da OnPlayerConnect
        {// Se a linha for maior que 1 "existir" ira chamar a dialog de login
            cache_get_value(0, "Senha", PlayerInfo[playerid][pSenha], 20); // Pegamos o valor da tabela e setamos a variavel pSenha que sera necessaria para o login
            
            format(Dialog, sizeof(Dialog),"{F8F8FF}Bem Vindo(a) Ao Servidor {058AFF}%s{F8F8FF}\n\nVocк ja tem uma Conta registrada\n\nDigite sua senha para Logar\n\nStatus: {1E90FF}Registrado{F8F8FF}\n\nIP: {058AFF}%s", PlayerInfo[playerid][pNome], PlayerInfo[playerid][pIP]);
            ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Registro", Dialog, "Logar", "Cancelar");
            } else { // se a linha nгo existir sera chamada a dialog de registro
            
            format(Dialog, sizeof(Dialog),"{F8F8FF}Bem Vindo(a) Ao Servidor {058AFF}%s{F8F8FF}\n\nVocк nгo tem uma Conta registrada\n\nDigite uma senha para Registrar\n\nStatus: {058AFF}N/A Registrado{F8F8FF}\n\nIP: {058AFF}%s", PlayerInfo[playerid][pNome], PlayerInfo[playerid][pIP]);
            ShowPlayerDialog(playerid, DIALOG_REGISTRO, DIALOG_STYLE_PASSWORD, "Registro", Dialog, "Registrar", "Cancelar");
        }
        return 1;




    Código:
    public OnPlayerDisconnect(playerid, reason)
    {
        SalvarDados(playerid); // Chamamos a funзгo para salvar a conta do player que desconectar
        return 1;




    Código:
    public OnPlayerDeath(playerid, killerid, reason)
    {
        PlayerInfo[playerid][pMorreu]++; // se o player morrer ira acrescentar +1 na variavel de morte
        PlayerInfo[killerid][pMatou]++; // se o player matar ira acrescentar +1 ...
        return 1;


    Vamos para as dialogs



    Código:
    public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
    {
        switch(dialogid) // usaremos um switch para as dialogs
        {
            case DIALOG_REGISTRO:
            {
                if(!response) return Kick(playerid); // se clicar em cancelar na dialog registro ira kickar o jogador
                
                if(strlen(inputtext) < 4 || strlen(inputtext) > 20) // se a senha tiver menos de 4 ou mais de 20 caracteres ira retornar a dialog
                {
                    SendClientMessage(playerid, -1, "ERRO:{FFFFFF} A senha deve conter de 4 a 20 caracteres!");
                    new Dialog[240]; // variavel da dialog registro
                    format(Dialog, sizeof(Dialog),"{F8F8FF}Bem Vindo(a) Ao Servidor {058AFF}%s{F8F8FF}\n\nVocк nгo tem uma Conta registrada\n\nDigite uma senha para Registrar\n\nStatus: {058AFF}N/A Registrado{F8F8FF}\n\nIP: {058AFF}%s", PlayerInfo[playerid][pNome], PlayerInfo[playerid][pIP]);
                    ShowPlayerDialog(playerid, DIALOG_REGISTRO, DIALOG_STYLE_PASSWORD, "Registro", Dialog, "Registrar", "Cancelar");
                    } else { // se nгo conter entre 4 e 20 caracteres ira retornar ao registro
                    new Query[100]; // variavel com 100 celulas para inserir as informaзхes de registro na tabela
                    mysql_format(IDConexao, Query, sizeof(Query), "INSERT INTO `Contas`(`Nome`, `Senha`) VALUES ('%s', '%s')", PlayerInfo[playerid][pNome], inputtext); // formatamos a query para inserir na tabela do banco de dados
                    mysql_tquery(IDConexao, Query, "DadosRegistrados", "i", playerid); // fazemos a consulta e enviamos o resultado para a callback DadosRegistrados
                    // enviamos para a callback DadosRegistrados para fazer uma especia de  DEBUG, e tambem para darmos uma ID para a conta no banco de dados
                    RegistrarDados(playerid); // chamamos a funзгo RegistrarDados para adicionar os valores nas variaveis do player
                }
            }
            case DIALOG_LOGIN:
            {
                if(!response) return Kick(playerid); // se clicar em cancelar na dialog login ira kickar o jogador
                if(!strlen(inputtext)) // se nгo digitar nada ira retornar. 
                { 
                        SendClientMessage(playerid, -1, "ERRO:{FFFFFF} Vocк nгo digitou a senha !"); 
                    ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Digite sua senha:", "Digite sua senha abaixo para logar-se", "Logar", "Voltar");     
                    return 1;
                }
                if(!strcmp(PlayerInfo[playerid][pSenha], inputtext, true, 20)) //comparamos a variavel coma senha do player com a senha digitada
                { // se a comparaзгo for correta vamos realizar a consulta para adicionar os valores contidos na tabela para as variaveis do player.
                    new Query[70];
                    mysql_format(IDConexao, Query, sizeof(Query), "SELECT * FROM `Contas` WHERE Nome='%s'", PlayerInfo[playerid][pNome]);
                    mysql_tquery(IDConexao, Query, "CarregarContas", "d", playerid);
                    // Formatamos a Query realizamos a consulta e enviamos o resultado para a callback CarregarContas
                    } else {
                    // comparaзгo sem sucesso ::
                    SendClientMessage(playerid, -1, "ERRO:{FFFFFF} Senha incorreta !");
                    ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Digite sua senha:", "Digite sua senha abaixo para logar-se", "Logar", "Voltar");
                }
            }
        }
        return 1;


    Callback com o resultado da consulta da DIALOG_REGISTRO



    Código:
    forward DadosRegistrados(playerid);
    public DadosRegistrados(playerid)
    {
        PlayerInfo[playerid][pID] = cache_insert_id(); // Adicionamos o ID da conta do player
        printf("-> Nova conta registrada ID: %d", PlayerInfo[playerid][pID]); // Printf no samp server para informar que a conta foi registrada com sucesso
        return 1;


    Callback com resultado da consulta da DIALOG_LOGIN



    Código:
    forward CarregarContas(playerid);
    public CarregarContas(playerid)
    { // Resultado da consulta do login, adicionamos os valores contidos na tabela para as variaveis do player
        cache_get_value_int(0, "ID", PlayerInfo[playerid][pID]);
        cache_get_value_int(0, "Admin", PlayerInfo[playerid][pAdmin]);
        cache_get_value_int(0, "Level", PlayerInfo[playerid][pLevel]);
        cache_get_value_int(0, "Matou", PlayerInfo[playerid][pMatou]);
        cache_get_value_int(0, "Morreu", PlayerInfo[playerid][pMorreu]);
        cache_get_value_int(0, "Skin", PlayerInfo[playerid][pSkin]);
        cache_get_value_int(0, "Dinheiro", PlayerInfo[playerid][pDinheiro]);
        
        CarregarDados(playerid); // chamamos a funзгo CarregarDados
        return 1;


    Agora vamos as funзхes que foram chamadas:

    RegistrarDados:



    Código:
    stock RegistrarDados(playerid)
    {  //Aqui adicionaremos os valores das variaveis que o player ira inicio no servidor
        PlayerInfo[playerid][pDinheiro] = 5000; // ou seja comeзara com 5000 reais
        PlayerInfo[playerid][pAdmin] = 0; // sem nivel de admin
        PlayerInfo[playerid][pLevel] = 1; // 1 level
        PlayerInfo[playerid][pSkin] = 0; // skin 0 CJ
        PlayerInfo[playerid][pMorreu] = 0; // ....
        PlayerInfo[playerid][pMatou] = 0; // ....
        CarregarDados(playerid); //chamamos a funзгo CarregarDados
        return 1;


    CarregarDados:



    Código:
    stock CarregarDados(playerid)
    { // aqui carregaremos os ultimos dados das variaveis
        PlayerInfo[playerid][pLogado] = true;
        SetPlayerScore(playerid, PlayerInfo[playerid][pLevel]); // setamos o level
        GivePlayerMoney(playerid, PlayerInfo[playerid][pDinheiro]); // o dinheiro
        SetSpawnInfo(playerid, 0, PlayerInfo[playerid][pSkin], 1958.33, 1343.12, 15.36, 269.15, 0, 0, 0, 0, 0, 0 );
        SpawnPlayer(playerid); // forзamos o player a spawnar nas cordenas acima com as infos setadas nas variaveis
        return 1;


    SalvarDados:



    Código:
    stock SalvarDados(playerid)
    {
        //if(PlayerInfo[playerid][pLogado] == false) return 1; // se o player nao estiver logado nгo ira salvar nada
        PlayerInfo[playerid][pDinheiro] = GetPlayerMoney(playerid);
        new Query[350]; // variavel com 350 celulas para salvamento
        mysql_format(IDConexao, Query, sizeof(Query), "UPDATE `Contas` SET `Nome`='%s', `Level`=%d, `Admin`=%d, `Skin`=%d, `Matou`=%d, `Morreu`=%d, `Dinheiro`=%d WHERE `ID`=%d",
        PlayerInfo[playerid][pNome],
        PlayerInfo[playerid][pLevel],
        PlayerInfo[playerid][pAdmin],
        PlayerInfo[playerid][pSkin],
        PlayerInfo[playerid][pMatou],
        PlayerInfo[playerid][pMorreu],
        PlayerInfo[playerid][pDinheiro],
        PlayerInfo[playerid][pID]);
        // formatamos a Query referente a ID da conta (WHERE `ID`=%d) e realizaremos a consulta para atualizar os dados no banco de dados
        mysql_tquery(IDConexao, Query, "DadosSalvos","d", playerid); // consulta, e enviamos o resultado para a callback DadosSalvos para um DEBUG
        
        
        PlayerInfo[playerid][pLevel] = 0; // resetamos as variaveis.
        PlayerInfo[playerid][pAdmin] = 0;
        PlayerInfo[playerid][pMatou] = 0;
        PlayerInfo[playerid][pMorreu] = 0;
        PlayerInfo[playerid][pDinheiro] = 0;
        PlayerInfo[playerid][pLogado] = false;
        return 1;


    Callback com resultado da consulta da stock SalvarDados



    Código:
    forward DadosSalvos(playerid);
    public DadosSalvos(playerid) return printf("-> Conta salva ID: %d", PlayerInfo[playerid][pID]);
    // Printf no samp server para informar que a conta foi salva com sucesso 

    1.4 Download



    Codigo completo:


    Código:
    #include <a_samp>
    #include <a_mysql>
    #define DIALOG_REGISTRO     1
    #define DIALOG_LOGIN     2
    new MySQL:IDConexao; // Variavel responsavel pela ID da conexгo com o host
    enum pInfo // enumerador com variaveis necessarias para nosso salvamento.
    {
        pID,
        pNome[24],
        pIP[26],
        pSenha[20],
        pLevel,
        pDinheiro,
        pSkin,
        pMatou,
        pMorreu,
        pAdmin,
        bool:pLogado
    };
    new PlayerInfo[MAX_PLAYERS][pInfo];
    #define HOST      "localhost" // IP de acesso ao phpmyadmin no caso se voce estiver hospedando no pc deixei localhost
    #define USUARIO   "root" // Usuario por padrгo й root
    #define DATABASE  "samp" // nome da database que voce criou.. como explicao no video acima
    #define SENHA     ""   // nгo possue senha caso tenha usado o wamp
    main(){}
    public OnGameModeInit()
    {
        IDConexao = mysql_connect(HOST, USUARIO, SENHA, DATABASE); // faremos a conexгo ao host com as informaзхes definidas acima
        mysql_query(IDConexao, "CREATE TABLE IF NOT EXISTS `Contas`(`ID`int AUTO_INCREMENT PRIMARY KEY, `Nome`varchar(24) NOT NULL,`Senha` varchar(20) NOT NULL,`Level` int(20) NOT NULL,`Matou` int(10) NOT NULL,`Morreu` int(10) NOT NULL,`Skin` int(10) NOT NULL,`Admin` int(10) NOT NULL,`Dinheiro` int(20) NOT NULL)", false);
        if(mysql_errno(IDConexao) != 0) // Ultilizo essa maneira para saber se a conexгo foi bem sucedida ou nгo
        {
            print("Falha na conexгo ao banco de dados Mysql");
            } else {
            print("Conexгo ao banco de dado Mysql efetuada com sucesso");
        }
        return 1;
    }
    public OnGameModeExit()
    {
        for(new i = 0; i < MAX_PLAYERS; i++) SalvarDados(i); // Realizamos um loop na funзгo Funзгo SalvarDados para q salve todas as contas numa posivel queda do servidor
        mysql_close(IDConexao); // Aqui fechamos a conexгo com o host
        return 1;
    }
    public OnPlayerConnect(playerid)
    {
        GetPlayerName(playerid, PlayerInfo[playerid][pNome], 24); // Pegamos o nome do player somente uma vez quando se conectar e formatamos na variavel.
        GetPlayerIp(playerid, PlayerInfo[playerid][pIP], 26); // Mesma coisa no IP
        
        new Query[90]; // criamos uma variavel com 90 celulas
        mysql_format(IDConexao, Query, sizeof(Query), "SELECT `Senha`, `ID` FROM `Contas` WHERE `Nome`='%s'", PlayerInfo[playerid][pNome]); // formatamos a Query selecionando SENHA e ID referente a tabela Contas Linha (NOME)
        mysql_tquery(IDConexao, Query, "VerificarContas", "i", playerid); // Faremos a consulta se a linha "Nome" existe sim ou nгo
        // Usaremos mysql_tquery para realizar a consulta na tabela e enviar o resultado para a callback.
        // o resultado sera enviado para callback VerificarContas
        return 1;
    }
    forward VerificarContas(playerid);
    public VerificarContas(playerid)
    {
        new Dialog[240]; // Variavel para as dialogs com 240 celulas necessarias
        
        if(cache_num_rows() > 0) // aqui o resultado da consulta da OnPlayerConnect
        {// Se a linha for maior que 1 "existir" ira chamar a dialog de login
            cache_get_value(0, "Senha", PlayerInfo[playerid][pSenha], 20); // Pegamos o valor da tabela e setamos a variavel pSenha que sera necessaria para o login
            
            format(Dialog, sizeof(Dialog),"{F8F8FF}Bem Vindo(a) Ao Servidor {058AFF}%s{F8F8FF}\n\nVocк ja tem uma Conta registrada\n\nDigite sua senha para Logar\n\nStatus: {1E90FF}Registrado{F8F8FF}\n\nIP: {058AFF}%s", PlayerInfo[playerid][pNome], PlayerInfo[playerid][pIP]);
            ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Registro", Dialog, "Logar", "Cancelar");
            } else { // se a linha nгo existir sera chamada a dialog de registro
            
            format(Dialog, sizeof(Dialog),"{F8F8FF}Bem Vindo(a) Ao Servidor {058AFF}%s{F8F8FF}\n\nVocк nгo tem uma Conta registrada\n\nDigite uma senha para Registrar\n\nStatus: {058AFF}N/A Registrado{F8F8FF}\n\nIP: {058AFF}%s", PlayerInfo[playerid][pNome], PlayerInfo[playerid][pIP]);
            ShowPlayerDialog(playerid, DIALOG_REGISTRO, DIALOG_STYLE_PASSWORD, "Registro", Dialog, "Registrar", "Cancelar");
        }
        return 1;
    }
    public OnPlayerDisconnect(playerid, reason)
    {
        SalvarDados(playerid); // Chamamos a funзгo para salvar a conta do player que desconectar
        return 1;
    }
    public OnPlayerDeath(playerid, killerid, reason)
    {
        PlayerInfo[playerid][pMorreu]++; // se o player morrer ira acrescentar +1 na variavel de morte
        PlayerInfo[killerid][pMatou]++; // se o player matar ira acrescentar +1 ...
        return 1;
    }
    public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
    {
        switch(dialogid) // usaremos um switch para as dialogs
        {
            case DIALOG_REGISTRO:
            {
                if(!response) return Kick(playerid); // se clicar em cancelar na dialog registro ira kickar o jogador
                
                if(strlen(inputtext) < 4 || strlen(inputtext) > 20) // se a senha tiver menos de 4 ou mais de 20 caracteres ira retornar a dialog
                {
                    SendClientMessage(playerid, -1, "ERRO:{FFFFFF} A senha deve conter de 4 a 20 caracteres!");
                    new Dialog[240]; // variavel da dialog registro
                    format(Dialog, sizeof(Dialog),"{F8F8FF}Bem Vindo(a) Ao Servidor {058AFF}%s{F8F8FF}\n\nVocк nгo tem uma Conta registrada\n\nDigite uma senha para Registrar\n\nStatus: {058AFF}N/A Registrado{F8F8FF}\n\nIP: {058AFF}%s", PlayerInfo[playerid][pNome], PlayerInfo[playerid][pIP]);
                    ShowPlayerDialog(playerid, DIALOG_REGISTRO, DIALOG_STYLE_PASSWORD, "Registro", Dialog, "Registrar", "Cancelar");
                    } else { // se nгo conter entre 4 e 20 caracteres ira retornar ao registro
                    new Query[100]; // variavel com 100 celulas para inserir as informaзхes de registro na tabela
                    mysql_format(IDConexao, Query, sizeof(Query), "INSERT INTO `Contas`(`Nome`, `Senha`) VALUES ('%s', '%s')", PlayerInfo[playerid][pNome], inputtext); // formatamos a query para inserir na tabela do banco de dados
                    mysql_tquery(IDConexao, Query, "DadosRegistrados", "i", playerid); // fazemos a consulta e enviamos o resultado para a callback DadosRegistrados
                    // enviamos para a callback DadosRegistrados para fazer uma especia de  DEBUG, e tambem para darmos uma ID para a conta no banco de dados
                    RegistrarDados(playerid); // chamamos a funзгo RegistrarDados para adicionar os valores nas variaveis do player
                }
            }
            case DIALOG_LOGIN:
            {
                if(!response) return Kick(playerid); // se clicar em cancelar na dialog login ira kickar o jogador
                if(!strlen(inputtext)) // se nгo digitar nada ira retornar. 
                { 
                        SendClientMessage(playerid, -1, "ERRO:{FFFFFF} Vocк nгo digitou a senha !"); 
                    ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Digite sua senha:", "Digite sua senha abaixo para logar-se", "Logar", "Voltar");     
                    return 1;
                }
                if(!strcmp(PlayerInfo[playerid][pSenha], inputtext, true, 20)) //comparamos a variavel coma senha do player com a senha digitada
                { // se a comparaзгo for correta vamos realizar a consulta para adicionar os valores contidos na tabela para as variaveis do player.
                    new Query[70];
                    mysql_format(IDConexao, Query, sizeof(Query), "SELECT * FROM `Contas` WHERE Nome='%s'", PlayerInfo[playerid][pNome]);
                    mysql_tquery(IDConexao, Query, "CarregarContas", "d", playerid);
                    // Formatamos a Query realizamos a consulta e enviamos o resultado para a callback CarregarContas
                    } else {
                    // comparaзгo sem sucesso ::
                    SendClientMessage(playerid, -1, "ERRO:{FFFFFF} Senha incorreta !");
                    ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Digite sua senha:", "Digite sua senha abaixo para logar-se", "Logar", "Voltar");
                }
            }
        }
        return 1;
    }
    forward DadosRegistrados(playerid);
    public DadosRegistrados(playerid)
    {
        PlayerInfo[playerid][pID] = cache_insert_id(); // Adicionamos o ID da conta do player
        printf("-> Nova conta registrada ID: %d", PlayerInfo[playerid][pID]); // Printf no samp server para informar que a conta foi registrada com sucesso
        return 1;
    }
    forward CarregarContas(playerid);
    public CarregarContas(playerid)
    { // Resultado da consulta do login, adicionamos os valores contidos na tabela para as variaveis do player
        cache_get_value_int(0, "ID", PlayerInfo[playerid][pID]);
        cache_get_value_int(0, "Admin", PlayerInfo[playerid][pAdmin]);
        cache_get_value_int(0, "Level", PlayerInfo[playerid][pLevel]);
        cache_get_value_int(0, "Matou", PlayerInfo[playerid][pMatou]);
        cache_get_value_int(0, "Morreu", PlayerInfo[playerid][pMorreu]);
        cache_get_value_int(0, "Skin", PlayerInfo[playerid][pSkin]);
        cache_get_value_int(0, "Dinheiro", PlayerInfo[playerid][pDinheiro]);
        
        CarregarDados(playerid); // chamamos a funзгo CarregarDados
        return 1;
    }
    stock RegistrarDados(playerid)
    {  //Aqui adicionaremos os valores das variaveis que o player ira inicio no servidor
        PlayerInfo[playerid][pDinheiro] = 5000; // ou seja comeзara com 5000 reais
        PlayerInfo[playerid][pAdmin] = 0; // sem nivel de admin
        PlayerInfo[playerid][pLevel] = 1; // 1 level
        PlayerInfo[playerid][pSkin] = 0; // skin 0 CJ
        PlayerInfo[playerid][pMorreu] = 0; // ....
        PlayerInfo[playerid][pMatou] = 0; // ....
        CarregarDados(playerid); //chamamos a funзгo CarregarDados
        return 1;
    }
    stock CarregarDados(playerid)
    { // aqui carregaremos os ultimos dados das variaveis
        PlayerInfo[playerid][pLogado] = true;
        SetPlayerScore(playerid, PlayerInfo[playerid][pLevel]); // setamos o level
        GivePlayerMoney(playerid, PlayerInfo[playerid][pDinheiro]); // o dinheiro
        SetSpawnInfo(playerid, 0, PlayerInfo[playerid][pSkin], 1958.33, 1343.12, 15.36, 269.15, 0, 0, 0, 0, 0, 0 );
        SpawnPlayer(playerid); // forзamos o player a spawnar nas cordenas acima com as infos setadas nas variaveis
        return 1;
    }
    stock SalvarDados(playerid)
    {
        //if(PlayerInfo[playerid][pLogado] == false) return 1; // se o player nao estiver logado nгo ira salvar nada
        PlayerInfo[playerid][pDinheiro] = GetPlayerMoney(playerid);
        new Query[350]; // variavel com 350 celulas para salvamento
        mysql_format(IDConexao, Query, sizeof(Query), "UPDATE `Contas` SET `Nome`='%s', `Level`=%d, `Admin`=%d, `Skin`=%d, `Matou`=%d, `Morreu`=%d, `Dinheiro`=%d WHERE `ID`=%d",
        PlayerInfo[playerid][pNome],
        PlayerInfo[playerid][pLevel],
        PlayerInfo[playerid][pAdmin],
        PlayerInfo[playerid][pSkin],
        PlayerInfo[playerid][pMatou],
        PlayerInfo[playerid][pMorreu],
        PlayerInfo[playerid][pDinheiro],
        PlayerInfo[playerid][pID]);
        // formatamos a Query referente a ID da conta (WHERE `ID`=%d) e realizaremos a consulta para atualizar os dados no banco de dados
        mysql_tquery(IDConexao, Query, "DadosSalvos","d", playerid); // consulta, e enviamos o resultado para a callback DadosSalvos para um DEBUG
        
        
        PlayerInfo[playerid][pLevel] = 0; // resetamos as variaveis.
        PlayerInfo[playerid][pAdmin] = 0;
        PlayerInfo[playerid][pMatou] = 0;
        PlayerInfo[playerid][pMorreu] = 0;
        PlayerInfo[playerid][pDinheiro] = 0;
        PlayerInfo[playerid][pLogado] = false;
        return 1;
    }
    forward DadosSalvos(playerid);
    public DadosSalvos(playerid) return printf("-> Conta salva ID: %d", PlayerInfo[playerid][pID]); 

    1.5 Creditos

    Cleyson Stein pela crianзгo do Tutorial
    BlueG Criaзгo do plugin mysql para samp
    Ao canal PC USER Brasil do ******* onde o video se encontra.
    Agradecimentos ao membro SammyJ por informar um erro.


    Caso haja algum erro por favor me informar.
    (Atualizado 07/11/2017- Versгo R41-4)



    [Tutorial] Criando um sistema em MySQL R41-4 [2017] D07Xwqb
    [Tutorial] Criando um sistema em MySQL R41-4 [2017] Yjab9HN

      Data/hora atual: Dom 28 Abr 2024 - 10:16