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

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
Ambos encontrados no GitHub Aqui


1.3 Aplicaзгo no script

Primeiramente iremos incluir o mysql no nosso script:

PHP Code:
#include <a_samp>
#include <a_mysql> 
Definimos as dialogs que iremos usar:

PHP Code:
#define DIALOG_REGISTRO     1
#define DIALOG_LOGIN        2 
Criamos as variaveis necessarias:

PHP Code:
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:

PHP Code:
#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

PHP Code:
    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

PHP Code:
    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":


PHP Code:
public OnGameModeInit()
{
    
IDConexao mysql_connect(HOSTUSUARIOSENHADATABASE); // 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;

PHP Code:
public OnGameModeExit()
{
    for(new 
0MAX_PLAYERSi++) 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;

PHP Code:
public OnPlayerConnect(playerid)
{
    
GetPlayerName(playeridPlayerInfo[playerid][pNome], 24); // Pegamos o nome do player somente uma vez quando se conectar e formatamos na variavel.
    
GetPlayerIp(playeridPlayerInfo[playerid][pIP], 26); // Mesma coisa no IP
    
    
new Query[90]; // criamos uma variavel com 90 celulas
    
mysql_format(IDConexaoQuerysizeof(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(IDConexaoQuery"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

PHP Code:
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(Dialogsizeof(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(playeridDIALOG_LOGINDIALOG_STYLE_PASSWORD"Registro"Dialog"Logar""Cancelar");
        } else { 
// se a linha nгo existir sera chamada a dialog de registro
        
        
format(Dialogsizeof(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(playeridDIALOG_REGISTRODIALOG_STYLE_PASSWORD"Registro"Dialog"Registrar""Cancelar");
    }
    return 
1;

PHP Code:
public OnPlayerDisconnect(playeridreason)
{
    
SalvarDados(playerid); // Chamamos a funзгo para salvar a conta do player que desconectar
    
return 1;

PHP Code:
public OnPlayerDeath(playeridkilleridreason)
{
    
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

PHP Code:
public OnDialogResponse(playeriddialogidresponselistiteminputtext[])
{
    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) < || 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(Dialogsizeof(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(playeridDIALOG_REGISTRODIALOG_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(IDConexaoQuerysizeof(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(IDConexaoQuery"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(playeridDIALOG_LOGINDIALOG_STYLE_PASSWORD"Digite sua senha:""Digite sua senha abaixo para logar-se""Logar""Voltar");     
                return 
1;
            }
            if(!
strcmp(PlayerInfo[playerid][pSenha], inputtexttrue20)) //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(IDConexaoQuerysizeof(Query), "SELECT * FROM `Contas` WHERE Nome='%s'"PlayerInfo[playerid][pNome]);
                
mysql_tquery(IDConexaoQuery"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(playeridDIALOG_LOGINDIALOG_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

PHP Code:
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

PHP Code:
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:

PHP Code:
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:

PHP Code:
stock CarregarDados(playerid)
// aqui carregaremos os ultimos dados das variaveis
    
PlayerInfo[playerid][pLogado] = true;
    
SetPlayerScore(playeridPlayerInfo[playerid][pLevel]); // setamos o level
    
GivePlayerMoney(playeridPlayerInfo[playerid][pDinheiro]); // o dinheiro
    
SetSpawnInfo(playerid0PlayerInfo[playerid][pSkin], 1958.331343.1215.36269.1500000);
    
SpawnPlayer(playerid); // forзamos o player a spawnar nas cordenas acima com as infos setadas nas variaveis
    
return 1;

SalvarDados:

PHP Code:
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(IDConexaoQuerysizeof(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(IDConexaoQuery"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

PHP Code:
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
Versгo utilizada R41-4
Cуdigo completo:
PHP Code:
#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(HOSTUSUARIOSENHADATABASE); // 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 
0MAX_PLAYERSi++) 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(playeridPlayerInfo[playerid][pNome], 24); // Pegamos o nome do player somente uma vez quando se conectar e formatamos na variavel.
    
GetPlayerIp(playeridPlayerInfo[playerid][pIP], 26); // Mesma coisa no IP
    
    
new Query[90]; // criamos uma variavel com 90 celulas
    
mysql_format(IDConexaoQuerysizeof(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(IDConexaoQuery"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(Dialogsizeof(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(playeridDIALOG_LOGINDIALOG_STYLE_PASSWORD"Registro"Dialog"Logar""Cancelar");
        } else { 
// se a linha nгo existir sera chamada a dialog de registro
        
        
format(Dialogsizeof(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(playeridDIALOG_REGISTRODIALOG_STYLE_PASSWORD"Registro"Dialog"Registrar""Cancelar");
    }
    return 
1;
}
public 
OnPlayerDisconnect(playeridreason)
{
    
SalvarDados(playerid); // Chamamos a funзгo para salvar a conta do player que desconectar
    
return 1;
}
public 
OnPlayerDeath(playeridkilleridreason)
{
    
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(playeriddialogidresponselistiteminputtext[])
{
    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) < || 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(Dialogsizeof(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(playeridDIALOG_REGISTRODIALOG_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(IDConexaoQuerysizeof(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(IDConexaoQuery"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(playeridDIALOG_LOGINDIALOG_STYLE_PASSWORD"Digite sua senha:""Digite sua senha abaixo para logar-se""Logar""Voltar");     
                return 
1;
            }
            if(!
strcmp(PlayerInfo[playerid][pSenha], inputtexttrue20)) //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(IDConexaoQuerysizeof(Query), "SELECT * FROM `Contas` WHERE Nome='%s'"PlayerInfo[playerid][pNome]);
                
mysql_tquery(IDConexaoQuery"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(playeridDIALOG_LOGINDIALOG_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(playeridPlayerInfo[playerid][pLevel]); // setamos o level
    
GivePlayerMoney(playeridPlayerInfo[playerid][pDinheiro]); // o dinheiro
    
SetSpawnInfo(playerid0PlayerInfo[playerid][pSkin], 1958.331343.1215.36269.1500000);
    
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(IDConexaoQuerysizeof(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(IDConexaoQuery"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)
Reply
#2

Muito bom o tutorial bem explicado.
Reply
#3

Estб bom, porйm deveria haver coisas a serem explicadas, no inicio tu utilizas mysql_query e depois a meio do script tu utilizas mysql_tquery, porque motivo? Qual й a diferenзa? Para alйm disso porque motivo й que crias a tabela no script? Porque nгo utilizas o phpMyAdmin ou o HeidSQL para manipulares a base de dados? Serб que й seguro criar uma tabela no script?
Estas sгo apenas umas questхes que deverбs responder a quem nгo sabe, um tutorial nгo deve focar na demonstraзгo do cуdigo mas sim como se faz, na lуgica, na teoria, depois sim, deves mostrar a prбtica utilizando exemplos.
Reply
#4

Fico bom podia melhorar mas esta bom sim, parabйns
Reply
#5

Muito bom, cabeзinha.
Reply
#6

Quote:
Originally Posted by LockedLucas
View Post
Muito bom o tutorial bem explicado.
Quote:
Originally Posted by iTakelot
View Post
Fico bom podia melhorar mas esta bom sim, parabйns
Quote:
Originally Posted by ipsLuan
View Post
Muito bom, cabeзinha.
Obrigado

Quote:
Originally Posted by RebeloX
View Post
Estб bom, porйm deveria haver coisas a serem explicadas, no inicio tu utilizas mysql_query e depois a meio do script tu utilizas mysql_tquery, porque motivo? Qual й a diferenзa? Para alйm disso porque motivo й que crias a tabela no script? Porque nгo utilizas o phpMyAdmin ou o HeidSQL para manipulares a base de dados? Serб que й seguro criar uma tabela no script?
Estas sгo apenas umas questхes que deverбs responder a quem nгo sabe, um tutorial nгo deve focar na demonstraзгo do cуdigo mas sim como se faz, na lуgica, na teoria, depois sim, deves mostrar a prбtica utilizando exemplos.
Usei mysql_query para criar as tabelas pois nгo precisaria de uma callback de resultado.
Bom sobre a questгo de criar a tabela й menos trabalhoso criar pelo script
Assim quer der um tempinho irei adicionar mais informзхes como vc mesmo citou.
Reply
#7

Muito Bom Parabйns
Reply
#8

Gostei muito da estruturaзгo do tуpico, parabйns. +8
Reply
#9

Ficou bem explicado, sу acho que poderia explicar algumas funзхes mas ta legal.

Parabйns.
Reply
#10

Quote:
Originally Posted by D3sconn3ct
View Post
Muito Bom Parabйns
Quote:
Originally Posted by ipsNan
View Post
Gostei muito da estruturaзгo do tуpico, parabйns. +8
Quote:
Originally Posted by FallweN
View Post
Ficou bem explicado, sу acho que poderia explicar algumas funзхes mas ta legal.

Parabйns.
Obrigado,
Й depois de postado vemos algumas coisas incompletas, mais vou ajeitando
Reply
#11

Parabйns, ficou muito bom
Reply
#12

Muito bom tutorial, vale lembrar que este tutorial й relacionado ao plugin do BlueG com versхes R33 em diante... Um pequeno cуdigo ъtil que pode ajudar caso nгo queiram usar threads para obtenзгo de cachк (em caso de querer criar algo simples e precisar de alguma ferramenta do cachк):

Quote:

new query[256];
mysql_format(SeuHandlerAqui, query, 256, "INSERT INTO `users` VALUES('NULL', '%s', '123456789');", "Willian_Luiggi_Gatinha");
new Cache:query_result = mysql_query(SeuHandlerAqui, query, true);

new IdDaConta = cache_insert_id(query_result);//retorna valor do auto_increment da base de dados

cache_delete(query_result);

+5 reps
Reply
#13

Muito bom
Reply
#14

Bacana, sу faltaram algumas funзхes.
Reply
#15

Quote:
Originally Posted by ImperioHosting
Посмотреть сообщение
Parabйns, ficou muito bom
Quote:
Originally Posted by HaRdiiZin
Посмотреть сообщение
Muito bom
Quote:
Originally Posted by Monotox
Посмотреть сообщение
Bacana, sу faltaram algumas funзхes.
Obrigado

Quote:
Originally Posted by ipsLeon
Посмотреть сообщение
Muito bom tutorial, vale lembrar que este tutorial й relacionado ao plugin do BlueG com versхes R33 em diante... Um pequeno cуdigo ъtil que pode ajudar caso nгo queiram usar threads para obtenзгo de cachк (em caso de querer criar algo simples e precisar de alguma ferramenta do cachк):

+5 reps
Lуgica muito bem citada, nem eu mesmo nгo sabia rs..
Obrigado
Reply
#16

Muito bom, parabens!! +rep
Reply
#17

Valeu o esforзo, gostei do que vi.

+10
Reply
#18

Quote:
Originally Posted by IgorLuiz
Посмотреть сообщение
Muito bom, parabens!! +rep
Quote:
Originally Posted by PT
Посмотреть сообщение
Valeu o esforзo, gostei do que vi.

+10
Obrigado
Reply
#19

Alguйm me ajuda, tipo eu fiz tudo sу quando o cara vai registrar no minimo й 4 caracteres sу que quando eu boto 3 ou 2 ou 1 ele reabre o registro e criar uma nova conta na database com o mesmo nome e nгo aparece o dialog de login.
Reply
#20

Quote:
Originally Posted by Marllun
Посмотреть сообщение
Alguйm me ajuda, tipo eu fiz tudo sу quando o cara vai registrar no minimo й 4 caracteres sу que quando eu boto 3 ou 2 ou 1 ele reabre o registro e criar uma nova conta na database com o mesmo nome e nгo aparece o dialog de login.
PHP код:
public OnDialogResponse(playeriddialogidresponselistiteminputtext[])
{
    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) < || strlen(inputtext) > 20// se a senha tiver menos de 4 ou mais de 20 caracteres ira retornar a dialog
            
{
                new 
Dialog[240]; // variavel da dialog registro
                
format(Dialogsizeof(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"Nome(playerid), IP(playerid));
                
ShowPlayerDialog(playeridDIALOG_REGISTRODIALOG_STYLE_PASSWORD"Registro"Dialog"Registrar""Cancelar");
                new 
Query[100]; // variavel com 100 celulas para inserir as informaзхes de registro na tabela
                
mysql_format(IDConexaoQuerysizeof(Query), "INSERT INTO `Contas`(`Nome`, `Senha`) VALUES ('%s', '%s')"Nome(playerid), inputtext); // formatamos a query para inserir na tabela do banco de dados
                
mysql_tquery(IDConexaoQuery"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
                
} else { // se nгo conter entre 4 e 20 caracteres ira retornar ao registro
            
                
SendClientMessage(playerid, -1"ERRO:{FFFFFF} A senha deve conter de 4 a 20 caracteres!");
                new 
Dialog[240]; // variavel da dialog registro
                
format(Dialogsizeof(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"Nome(playerid), IP(playerid));
                
ShowPlayerDialog(playeridDIALOG_REGISTRODIALOG_STYLE_PASSWORD"Registro"Dialog"Registrar""Cancelar");
            }
        }
        case 
DIALOG_LOGIN:
        {
            if(!
response) return Kick(playerid); // se clicar em cancelar na dialog login ira kickar o jogador
            
if(!strcmp(PlayerInfo[playerid][pSenha], inputtexttrue20)) //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(IDConexaoQuerysizeof(Query), "SELECT * FROM `Contas` WHERE Nome='%s'"Nome(playerid));
                
mysql_tquery(IDConexaoQuery"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(playeridDIALOG_LOGINDIALOG_STYLE_PASSWORD"Digite sua senha:""Digite sua senha abaixo para logar-se""Logar""Voltar");
            }
        }
    }
    return 
1;

Desculpe pelo meu erro, nгo vi
Tуpico concertado.
Reply


Forum Jump:


Users browsing this thread: 7 Guest(s)