21.07.2018, 04:37
E aн pessoal, resolvi estudar MySQL para ver se consigo aprender, ai eu vi este tutorial de um Sistema de Login em MySQL, quando fui testar ele nгo estб funcionando corretamente. Ele atй cria a tabela e tals, mas quando o player faz o registro ou desloga do servidor, ele nгo salva os dados do player, alguйm pode me ajudar?
Sistema de Login: https://sampforum.blast.hk/showthread.php?tid=579909
Cуdigo:
Sistema de Login: https://sampforum.blast.hk/showthread.php?tid=579909
Cуdigo:
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(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]);