· 8 years ago · Apr 15, 2018, 06:36 PM
1#include <a_samp>
2#include <a_mysql>
3// =======================================
4#define DIALOG_REGISTRO 1
5#define DIALOG_LOGIN 2
6// =======================================
7#define DEFAULTPOSX 1139.4064
8#define DEFAULTPOSY -1761.9249
9#define DEFAULTPOSZ 13.5955
10#define DEFAULTPOSA 4.5833
11// =======================================
12enum pInfo
13{
14 pID,
15 pNome[24],
16 pIP[26],
17 pSenha[20],
18 pLevel,
19 pDinheiro,
20 pSkin,
21 pMatou,
22 pMorreu,
23 pAdmin,
24 Float: pPosX,
25 Float: pPosY,
26 Float: pPosZ,
27 Float: pPosA,
28 bool:pLogado
29};
30new PlayerInfo[MAX_PLAYERS][pInfo];
31// =======================================
32#define HOST "localhost"
33#define USUARIO "root"
34#define DATABASE "samp"
35#define SENHA ""
36
37new MySQL:IDConexao;
38// =======================================
39
40main(){}
41
42public OnGameModeInit()
43{
44 CriarTabela(); // Cria a Tabela
45 UsePlayerPedAnims();
46
47
48 return 1;
49}
50
51public OnGameModeExit()
52{
53 EmergenciaSD(); // Salva se o servidor crashar
54
55
56 return 1;
57}
58
59public OnPlayerConnect(playerid)
60{
61 // =======================================
62 GetPlayerName(playerid, PlayerInfo[playerid][pNome], 24);
63 GetPlayerIp(playerid, PlayerInfo[playerid][pIP], 26);
64
65 new Query[90];
66 mysql_format(IDConexao, Query, sizeof(Query), "SELECT `Senha`, `ID` FROM `Contas` WHERE `Nome`='%s'", PlayerInfo[playerid][pNome]);
67 mysql_tquery(IDConexao, Query, "VerificarContas", "i", playerid);
68 // =======================================
69
70
71 return 1;
72}
73public OnPlayerDisconnect(playerid, reason)
74{
75 SalvarDados(playerid); // Chamamos a função para salvar a conta do player que desconectar
76
77
78 return 1;
79}
80
81public OnPlayerDeath(playerid, killerid, reason)
82{
83 PlayerInfo[playerid][pMorreu]++; // se o player morrer ira acrescentar +1 na variavel de morte
84 PlayerInfo[killerid][pMatou]++; // se o player matar ira acrescentar +1 ...
85
86
87 return 1;
88}
89
90public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
91{
92 // ======================================= REGISTRO ======================================= //
93 switch(dialogid) // usaremos um switch para as dialogs
94 {
95 case DIALOG_REGISTRO:
96 {
97 if(!response) return Kick(playerid); // se clicar em cancelar na dialog registro ira kickar o jogador
98
99 if(strlen(inputtext) < 4 || strlen(inputtext) > 20) // se a senha tiver menos de 4 ou mais de 20 caracteres ira retornar a dialog
100 {
101 SendClientMessage(playerid, -1, "ERRO:{FFFFFF} A senha deve conter de 4 a 20 caracteres!");
102
103 new Dialog[240]; // variavel da dialog registro
104 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]);
105 ShowPlayerDialog(playerid, DIALOG_REGISTRO, DIALOG_STYLE_PASSWORD, "Registro", Dialog, "Registrar", "Cancelar");
106
107 } else { // se não conter entre 4 e 20 caracteres ira retornar ao registro
108
109 new Query[100]; // variavel com 100 celulas para inserir as informações de registro na tabela
110 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
111 mysql_tquery(IDConexao, Query, "DadosRegistrados", "i", playerid); // fazemos a consulta e enviamos o resultado para a callback DadosRegistrados
112 // enviamos para a callback DadosRegistrados para fazer uma especia de DEBUG, e tambem para darmos uma ID para a conta no banco de dados
113 RegistrarDados(playerid); // chamamos a função RegistrarDados para adicionar os valores nas variaveis do player
114 }
115 }
116// ======================================= LOGIN ======================================= //
117 case DIALOG_LOGIN:
118 {
119 if(!response) return Kick(playerid); // se clicar em cancelar na dialog login ira kickar o jogador
120 if(!strcmp(PlayerInfo[playerid][pSenha], inputtext, true, 20)) //comparamos a variavel coma senha do player com a senha digitada
121 { // se a comparação for correta vamos realizar a consulta para adicionar os valores contidos na tabela para as variaveis do player.
122
123 new Query[270];
124 mysql_format(IDConexao, Query, sizeof(Query), "SELECT * FROM `Contas` WHERE Nome='%s'", PlayerInfo[playerid][pNome]);
125 mysql_tquery(IDConexao, Query, "CarregarContas", "d", playerid);
126 // Formatamos a Query realizamos a consulta e enviamos o resultado para a callback CarregarContas
127
128 } else {
129 // comparação sem sucesso ::
130 SendClientMessage(playerid, -1, "ERRO:{FFFFFF} Senha incorreta !");
131 ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Digite sua senha:", "Digite sua senha abaixo para logar-se", "Logar", "Voltar");
132 }
133 }
134 }
135 // ======================================= // ======================================= //
136
137
138 return 1;
139}
140// =======================================
141forward DadosRegistrados(playerid);
142public DadosRegistrados(playerid)
143{
144 PlayerInfo[playerid][pID] = cache_insert_id(); // Adicionamos o ID da conta do player
145 printf("-> Nova conta registrada ID: %d", PlayerInfo[playerid][pID]); // Printf no samp server para informar que a conta foi registrada com sucesso
146 return 1;
147}
148// =======================================
149forward CarregarContas(playerid);
150public CarregarContas(playerid)
151{ // Resultado da consulta do login, adicionamos os valores contidos na tabela para as variaveis do player
152 cache_get_value_int(0, "ID", PlayerInfo[playerid][pID]);
153 cache_get_value_int(0, "Admin", PlayerInfo[playerid][pAdmin]);
154 cache_get_value_int(0, "Level", PlayerInfo[playerid][pLevel]);
155 cache_get_value_int(0, "Matou", PlayerInfo[playerid][pMatou]);
156 cache_get_value_int(0, "Morreu", PlayerInfo[playerid][pMorreu]);
157 cache_get_value_int(0, "Skin", PlayerInfo[playerid][pSkin]);
158 cache_get_value_int(0, "Dinheiro", PlayerInfo[playerid][pDinheiro]);
159 cache_get_value_float(0, "pPosX", PlayerInfo[playerid][pPosX]);
160 cache_get_value_float(0, "pPosY", PlayerInfo[playerid][pPosY]);
161 cache_get_value_float(0, "pPosZ", PlayerInfo[playerid][pPosZ]);
162 cache_get_value_float(0, "pPosA", PlayerInfo[playerid][pPosA]);
163
164
165 CarregarDados(playerid); // chamamos a função CarregarDados
166 return 1;
167}
168// =======================================
169forward DadosSalvos(playerid);
170public DadosSalvos(playerid) return printf("-> Conta salva ID: %d", PlayerInfo[playerid][pID]);
171// =======================================
172forward CriarTabela();
173public CriarTabela(){
174 IDConexao = mysql_connect(HOST, USUARIO, SENHA, DATABASE); // faremos a conexão ao host com as informações definidas acima
175
176 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, `pPosX` float(20) NOT NULL,`pPosY` float(20) NOT NULL,`pPosZ` float(20) NOT NULL,`pPosA` float(20) NOT NULL)", false);
177
178 if(mysql_errno(IDConexao) != 0) // Ultilizo essa maneira para saber se a conexão foi bem sucedida ou não
179 {
180 print("Falha na conexão ao banco de dados Mysql");
181 } else {
182 print("Conexão ao banco de dado Mysql efetuada com sucesso");
183 }
184 return 1;
185}
186// =======================================
187forward EmergenciaSD();
188public EmergenciaSD(){
189 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
190 mysql_close(IDConexao); // Aqui fechamos a conexão com o host
191 return 1;
192}
193// =======================================
194forward VerificarContas(playerid);
195public VerificarContas(playerid)
196{
197 new Dialog[240]; // Variavel para as dialogs com 240 celulas necessarias
198
199 if(cache_num_rows() > 0) // aqui o resultado da consulta da OnPlayerConnect
200 {// Se a linha for maior que 1 "existir" ira chamar a dialog de login
201
202 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
203
204 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]);
205 ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Registro", Dialog, "Logar", "Cancelar");
206
207 } else { // se a linha não existir sera chamada a dialog de registro
208
209 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]);
210 ShowPlayerDialog(playerid, DIALOG_REGISTRO, DIALOG_STYLE_PASSWORD, "Registro", Dialog, "Registrar", "Cancelar");
211 }
212 return 1;
213}
214// =======================================
215 // STOCKS //
216// =======================================
217stock RegistrarDados(playerid)
218{ //Aqui adicionaremos os valores das variaveis que o player ira inicio no servidor
219 PlayerInfo[playerid][pDinheiro] = 1500; // ou seja começara com 5000 reais
220 PlayerInfo[playerid][pAdmin] = 0; // sem nivel de admin
221 PlayerInfo[playerid][pLevel] = 0; // 1 level
222 PlayerInfo[playerid][pSkin] = 23; // skin 0 CJ
223 PlayerInfo[playerid][pMorreu] = 0; // ....
224 PlayerInfo[playerid][pMatou] = 0;
225 PlayerInfo[playerid][pPosX] = DEFAULTPOSX;
226 PlayerInfo[playerid][pPosY] = DEFAULTPOSY;
227 PlayerInfo[playerid][pPosZ] = DEFAULTPOSZ;
228 PlayerInfo[playerid][pPosA] = DEFAULTPOSA; // ....
229 CarregarDados(playerid); //chamamos a função CarregarDados
230 return 1;
231}
232// =======================================
233stock CarregarDados(playerid)
234{ // aqui carregaremos os ultimos dados das variaveis
235 PlayerInfo[playerid][pLogado] = true;
236 SetPlayerScore(playerid, PlayerInfo[playerid][pLevel]); // setamos o level
237 GivePlayerMoney(playerid, PlayerInfo[playerid][pDinheiro]); // o dinheiro
238 SetSpawnInfo(playerid, 0, PlayerInfo[playerid][pSkin], PlayerInfo[playerid][pPosX], PlayerInfo[playerid][pPosY], PlayerInfo[playerid][pPosZ], PlayerInfo[playerid][pPosA], 0, 0, 0, 0, 0, 0 );
239 SpawnPlayer(playerid); // forçamos o player a spawnar nas cordenas acima com as infos setadas nas variaveis
240 return 1;
241}
242// =======================================
243stock SalvarDados(playerid)
244{
245 //if(PlayerInfo[playerid][pLogado] == false) return 1; // se o player nao estiver logado não ira salvar nada
246 PlayerInfo[playerid][pDinheiro] = GetPlayerMoney(playerid);
247 GetPlayerPos(playerid, PlayerInfo[playerid][pPosX],PlayerInfo[playerid][pPosZ],PlayerInfo[playerid][pPosA]);
248 GetPlayerFacingAngle(playerid, PlayerInfo[playerid][pPosA]);
249
250 new Query[350]; // variavel com 350 celulas para salvamento
251 mysql_format(IDConexao, Query, sizeof(Query), "UPDATE `Contas` SET `Nome`='%s', `Level`=%d, `Admin`=%d, `Skin`=%d, `Matou`=%d, `Morreu`=%d, `Dinheiro`=%d , `pPosX`=%f,`pPosY`=%f,`pPosZ`=%f,`pPosA`=%f WHERE `ID`=%d",
252 PlayerInfo[playerid][pNome],
253 PlayerInfo[playerid][pLevel],
254 PlayerInfo[playerid][pAdmin],
255 PlayerInfo[playerid][pSkin],
256 PlayerInfo[playerid][pMatou],
257 PlayerInfo[playerid][pMorreu],
258 PlayerInfo[playerid][pDinheiro],
259 PlayerInfo[playerid][pPosX],
260 PlayerInfo[playerid][pPosY],
261 PlayerInfo[playerid][pPosZ],
262 PlayerInfo[playerid][pPosA],
263 PlayerInfo[playerid][pID]);
264 // formatamos a Query referente a ID da conta (WHERE `ID`=%d) e realizaremos a consulta para atualizar os dados no banco de dados
265 mysql_tquery(IDConexao, Query, "DadosSalvos","d", playerid); // consulta, e enviamos o resultado para a callback DadosSalvos para um DEBUG
266
267
268 PlayerInfo[playerid][pLevel] = 0; // resetamos as variaveis.
269 PlayerInfo[playerid][pAdmin] = 0;
270 PlayerInfo[playerid][pMatou] = 0;
271 PlayerInfo[playerid][pMorreu] = 0;
272 PlayerInfo[playerid][pDinheiro] = 0;
273
274 PlayerInfo[playerid][pLogado] = false;
275 return 1;
276}
277// =======================================