· 7 years ago · Nov 03, 2018, 03:00 AM
1#include <a_samp>
2#include <a_mysql>
3#include <YSI\y_hooks>
4#include <zcmd>
5
6#define DIALOG_REGISTRO 1
7#define DIALOG_LOGIN 2
8#define DIALOG_SEXO 3
9
10#define HOMEM 1
11#define MULHER 2
12
13new MySQL:IDConexao; // Variavel responsavel pela ID da conexão com o host
14
15enum pInfo // enumerador com variaveis necessarias para nosso salvamento.
16{
17 pID,
18 pNome[24],
19 pIP[26],
20 pSexo,
21 pSenha[20],
22 pLevel,
23 pDinheiro,
24 pSkin,
25 pMatou,
26 pMorreu,
27 pAdmin,
28 bool:pLogado
29};
30new PlayerInfo[MAX_PLAYERS][pInfo];
31
32
33#define HOST "127.0.0.1" // IP de acesso ao phpmyadmin no caso se voce estiver hospedando no pc deixei localhost
34#define USUARIO "root" // Usuario por padrão é root
35#define DATABASE "Samp" // nome da database que voce criou.. como explicao no video acima
36#define SENHA "" // não possue senha caso tenha usado o wamp
37
38
39main(){}
40
41public OnGameModeInit()
42{
43 IDConexao = mysql_connect(HOST, USUARIO, SENHA, DATABASE); // faremos a conexão ao host com as informações definidas acima
44
45 // 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,`Sexo` 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);
46 //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 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);
47 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 DEFAULT '1',`Matou` int(10) NOT NULL DEFAULT '0',`Morreu` int(10) NOT NULL DEFAULT '0',`Skin` int(10) NOT NULL DEFAULT '0', `Sexo` TINYINT(2) NOT NULL DEFAULT '1',`Admin` int(10) NOT NULL DEFAULT '0',`Dinheiro` int(20) NOT NULL DEFAULT '5000')", false);
48 if(mysql_errno(IDConexao) != 0) // Ultilizo essa maneira para saber se a conexão foi bem sucedida ou não
49 {
50 print("Falha na conexão ao banco de dados Mysql");
51 } else {
52 print("Conexão ao banco de dado Mysql efetuada com sucesso");
53 }
54 return 1;
55}
56
57public OnGameModeExit()
58{
59 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
60 mysql_close(IDConexao); // Aqui fechamos a conexão com o host
61 return 1;
62}
63
64public OnPlayerConnect(playerid)
65{
66 GetPlayerName(playerid, PlayerInfo[playerid][pNome], 24); // Pegamos o nome do player somente uma vez quando se conectar e formatamos na variavel.
67 GetPlayerIp(playerid, PlayerInfo[playerid][pIP], 26); // Mesma coisa no IP
68
69 new Query[90]; // criamos uma variavel com 90 celulas
70 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)
71 mysql_tquery(IDConexao, Query, "VerificarContas", "i", playerid); // Faremos a consulta se a linha "Nome" existe sim ou não
72 // Usaremos mysql_tquery para realizar a consulta na tabela e enviar o resultado para a callback.
73 // o resultado sera enviado para callback VerificarContas
74 return 1;
75}
76
77forward VerificarContas(playerid);
78public VerificarContas(playerid)
79{
80 new Dialog[440]; // Variavel para as dialogs com 240 celulas necessarias
81
82 if(cache_num_rows() > 0) // aqui o resultado da consulta da OnPlayerConnect
83 {// Se a linha for maior que 1 "existir" ira chamar a dialog de login
84
85 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
86
87 format(Dialog, sizeof(Dialog)," {00FFFF}========= City Of Paradise =========\n\n {FFFFFF}Seja bem vindo novamente ao servidor\n\n{00FFFF}Usuario: {FFFFFF}%s {26F321}Registrado\n\n{00FFFF}Ip Conectado: {FFFFFF}%s\n\n{00FFFF}Status do Servidor: {26F321}Online", PlayerInfo[playerid][pNome], PlayerInfo[playerid][pIP]);
88 ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Registro", Dialog, "Logar", "Cancelar");
89
90 } else { // se a linha não existir sera chamada a dialog de registro
91
92 format(Dialog, sizeof(Dialog)," {00FFFF}========= City Of Paradise =========\n\n {FFFFFF}Seja muito bem vindo para se registrar insira uma senha\n\n{00FFFF}Nick {FFFFFF}%s {26F321}Disponivel !\n\n{00FFFF}Ip do Jogador {FFFFFF}%s\n\n{00FFFF}Status do servidor: {26F321}Online\n\n{00FFFF}WebSite: {FFFFFF}www.SkyBlue.com.br", PlayerInfo[playerid][pNome], PlayerInfo[playerid][pIP]);
93 ShowPlayerDialog(playerid, DIALOG_REGISTRO, DIALOG_STYLE_PASSWORD, "Registro", Dialog, "Registrar", "Cancelar");
94 }
95 return 1;
96}
97
98public OnPlayerDisconnect(playerid, reason)
99{
100 SalvarDados(playerid); // Chamamos a função para salvar a conta do player que desconectar
101 return 1;
102}
103
104public OnPlayerDeath(playerid, killerid, reason)
105{
106 PlayerInfo[playerid][pMorreu]++; // se o player morrer ira acrescentar +1 na variavel de morte
107 PlayerInfo[killerid][pMatou]++; // se o player matar ira acrescentar +1 ...
108 return 1;
109}
110
111public OnPlayerSpawn(playerid)
112{
113 SetPlayerSkin(playerid, PlayerInfo[playerid][pSkin]);
114 return 1;
115}
116
117public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
118{
119 switch(dialogid) // usaremos um switch para as dialogs
120 {
121 case DIALOG_REGISTRO:
122 {
123 if(!response) return Kick(playerid); // se clicar em cancelar na dialog registro ira kickar o jogador
124
125 if(strlen(inputtext) < 4 || strlen(inputtext) > 20) // se a senha tiver menos de 4 ou mais de 20 caracteres ira retornar a dialog
126 {
127 SendClientMessage(playerid, -1, "ERRO:{FFFFFF} A senha deve conter de 4 a 20 caracteres!");
128
129 new Dialog[240]; // variavel da dialog registro
130 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]);
131 ShowPlayerDialog(playerid, DIALOG_REGISTRO, DIALOG_STYLE_PASSWORD, "Registro", Dialog, "Registrar", "Cancelar");
132
133 } else { // se não conter entre 4 e 20 caracteres ira retornar ao registro
134
135 new Query[100]; // variavel com 100 celulas para inserir as informações de registro na tabela
136 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
137 mysql_tquery(IDConexao, Query, "DadosRegistrados", "i", playerid); // fazemos a consulta e enviamos o resultado para a callback DadosRegistrados
138 // enviamos para a callback DadosRegistrados para fazer uma especia de DEBUG, e tambem para darmos uma ID para a conta no banco de dados
139 // RegistrarDados(playerid); // chamamos a função RegistrarDados para adicionar os valores nas variaveis do player
140 ShowPlayerDialog(playerid, DIALOG_SEXO, DIALOG_STYLE_MSGBOX,"[City Of Paradise] - Sexo","Qual é seu sexo?","Masculino","Feminino");
141 }
142 }
143 case DIALOG_SEXO:
144 {
145 if(response)
146 {
147 PlayerInfo[playerid][pSexo] = 1;
148 PlayerInfo[playerid][pSkin] = 154;
149 SendClientMessage(playerid,-1,"Você é homem.");
150
151 }
152 else if(!response)
153 {
154 PlayerInfo[playerid][pSexo] = 2;
155 PlayerInfo[playerid][pSkin] = 56;
156 SendClientMessage(playerid,-1,"Você é mulher.");
157 }
158 RegistrarDados(playerid);
159 return 1;
160 }
161 case DIALOG_LOGIN:
162 {
163 if(!response) return Kick(playerid); // se clicar em cancelar na dialog login ira kickar o jogador
164 if(!strlen(inputtext)) // se não digitar nada ira retornar.
165 {
166 SendClientMessage(playerid, -1, "ERRO:{FFFFFF} Você não digitou a senha !");
167 ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Digite sua senha:", "Digite sua senha abaixo para logar-se", "Logar", "Voltar");
168 return 1;
169 }
170 if(!strcmp(PlayerInfo[playerid][pSenha], inputtext, true, 20)) //comparamos a variavel coma senha do player com a senha digitada
171 { // se a comparação for correta vamos realizar a consulta para adicionar os valores contidos na tabela para as variaveis do player.
172
173 new Query[70];
174 mysql_format(IDConexao, Query, sizeof(Query), "SELECT * FROM `Contas` WHERE Nome='%s'", PlayerInfo[playerid][pNome]);
175 mysql_tquery(IDConexao, Query, "CarregarContas", "d", playerid);
176 // Formatamos a Query realizamos a consulta e enviamos o resultado para a callback CarregarContas
177
178 } else {
179 // comparação sem sucesso ::
180 SendClientMessage(playerid, -1, "ERRO:{FFFFFF} Senha incorreta !");
181 ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Digite sua senha:", "Digite sua senha abaixo para logar-se", "Logar", "Voltar");
182 }
183 }
184 }
185 return 1;
186}
187
188forward DadosRegistrados(playerid);
189public DadosRegistrados(playerid)
190{
191 PlayerInfo[playerid][pID] = cache_insert_id(); // Adicionamos o ID da conta do player
192 printf("-> Nova conta registrada ID: %d", PlayerInfo[playerid][pID]); // Printf no samp server para informar que a conta foi registrada com sucesso
193 return 1;
194}
195
196forward CarregarContas(playerid);
197public CarregarContas(playerid)
198{ // Resultado da consulta do login, adicionamos os valores contidos na tabela para as variaveis do player
199 cache_get_value_int(0, "ID", PlayerInfo[playerid][pID]);
200 cache_get_value_int(0, "Admin", PlayerInfo[playerid][pAdmin]);
201 cache_get_value_int(0, "Level", PlayerInfo[playerid][pLevel]);
202 cache_get_value_int(0, "Sexo", PlayerInfo[playerid][pSexo]);
203 cache_get_value_int(0, "Morreu", PlayerInfo[playerid][pMorreu]);
204 cache_get_value_int(0, "Skin", PlayerInfo[playerid][pSkin]);
205 cache_get_value_int(0, "Dinheiro", PlayerInfo[playerid][pDinheiro]);
206 CarregarDados(playerid);
207 return 1;
208}
209
210stock RegistrarDados(playerid)
211{ //Aqui adicionaremos os valores das variaveis que o player ira inicio no servidor
212 PlayerInfo[playerid][pDinheiro] = 5000; // ou seja começara com 5000 reais
213 PlayerInfo[playerid][pAdmin] = 0; // sem nivel de admin
214 PlayerInfo[playerid][pLevel] = 1; // 1 level
215 PlayerInfo[playerid][pMorreu] = 0; // ....
216 //PlayerInfo[playerid][pSexo] = 0; // ....
217 CarregarDados(playerid); //chamamos a função CarregarDados
218 return 1;
219}
220
221stock CarregarDados(playerid)
222{
223 PlayerInfo[playerid][pLogado] = true;
224 SetPlayerScore(playerid, PlayerInfo[playerid][pLevel]);
225 GivePlayerMoney(playerid, PlayerInfo[playerid][pDinheiro]);
226 SetSpawnInfo(playerid, 0, PlayerInfo[playerid][pSkin], 1958.33, 1343.12, 15.36, 269.15,0,0,0,0,0,0);
227 SpawnPlayer(playerid);
228 return 1;
229}
230
231stock SalvarDados(playerid)
232{
233 if(PlayerInfo[playerid][pLogado] == false) return 1; // se o player nao estiver logado não ira salvar nada
234 PlayerInfo[playerid][pDinheiro] = GetPlayerMoney(playerid);
235 new Query[350]; // variavel com 350 celulas para salvamento
236 mysql_format(IDConexao, Query, sizeof(Query), "UPDATE `Contas` SET Nome='%s', Level=%d, Admin=%d, Skin=%d, Sexo=%d, Morreu=%d, Dinheiro=%d WHERE ID=%d",
237 PlayerInfo[playerid][pNome],
238 PlayerInfo[playerid][pLevel],
239 PlayerInfo[playerid][pAdmin],
240 GetPlayerSkin(playerid),
241 PlayerInfo[playerid][pSexo],
242 PlayerInfo[playerid][pMorreu],
243 PlayerInfo[playerid][pDinheiro],
244 PlayerInfo[playerid][pID]);
245 // formatamos a Query referente a ID da conta (WHERE `ID`=%d) e realizaremos a consulta para atualizar os dados no banco de dados
246 mysql_tquery(IDConexao, Query, "DadosSalvos","d", playerid); // consulta, e enviamos o resultado para a callback DadosSalvos para um DEBUG
247
248 PlayerInfo[playerid][pLevel] = 0; // resetamos as variaveis.
249 PlayerInfo[playerid][pAdmin] = 0;
250 PlayerInfo[playerid][pSexo] = 0;
251 PlayerInfo[playerid][pMorreu] = 0;
252 PlayerInfo[playerid][pDinheiro] = 0;
253 PlayerInfo[playerid][pLogado] = false;
254 return 1;
255}
256
257forward DadosSalvos(playerid);
258public DadosSalvos(playerid) return printf("-> Conta salva ID: %d", PlayerInfo[playerid][pID]);
259
260CMD:setarskin(playerid,params[])
261{
262SetPlayerSkin(playerid, strval(params));
263SalvarDados(playerid);
264}