· 6 years ago · May 07, 2019, 10:46 AM
1//------------------------------------MYSQL-----------------------------------//
2#include <a_samp>
3#include <a_mysql>
4//-----------------------//
5new MySQL:handle;
6//-----------------------//
7#define MYSQL_HOST "localhost"
8#define MYSQL_USER "root"
9#define MYSQL_PASSWORD "" // po defaultu na localhostu nemate password, osim ukoliko ne koristite MAMP onda je password root
10#define MYSQL_DATABASE "samp"
11//-----------------------//
12#define DIALOG_LOGIN (0)
13#define DIALOG_REGISTER (1)
14//-----------------------//
15enum ENUM_PLAYER_DATA
16{
17 SQLID, // sqlid, unikatni user id
18 Password[65], // password, za ovo koristimo SHA256 password hash koji je dodat u zadnjoj samp verziji
19 Salt[11], // nasumicno generisano da modifikuje originalni hash,
20 RegDate[65] // datum registracije, ovo je samo "test" da vam pokazem kako da uzmete nesto iz tablice
21}
22new PlayerInfo[MAX_PLAYERS][ENUM_PLAYER_DATA];
23//-----------------------//
24public OnFilterScriptInit()
25{
26 return 1;
27}
28//-----------------------//
29public OnFilterScriptExit()
30{
31 return 1;
32}
33//-----------------------//
34public OnGameModeInit()
35{
36 handle = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DATABASE); // ovde sada koristimo onaj vec definisani handle i pokusavamo da se konektujemo sa vec definisanim informacijama
37
38 if(mysql_errno(handle) != 0 || handle == MYSQL_INVALID_HANDLE) // ukoliko postoji eror kod konekcije sa databazom ispisujemo sledece i zatvaramo konzolu ->
39 {
40 print("Konekcija sa databazom nije uspesna, pogledajte da li su sve informacije ispravne.");
41 SendRconCommand("exit");
42 return true;
43 }
44
45 mysql_tquery(handle, "CREATE TABLE IF NOT EXISTS `players` ( `id` INT NOT NULL AUTO_INCREMENT , `name` VARCHAR(24) NOT NULL , `password` VARCHAR(65) NOT NULL , `salt` VARCHAR(11) NOT NULL , `regdate` DATETIME NOT NULL , PRIMARY KEY (`id`))");
46
47 // Ovaj upit radi sledece:
48 // Proverava da li postoji tabela players i ukoliko ne postoji kreira istu
49 // id postavlja kao primary key i stavlja ga na auto increment sto znaci da prilikom svakog unosa u bazu id ce se sam podizati za jedan.
50 // name postavlja kao string duzine 24 karaktera, mozete name staviti da bude i unique sto bi znacilo da je to ime jedinstveno i da se ne moze uneti drugi red sa istim imenom, ali meni je to nepotrebno zbog provere na konektu.
51 // password stavljamo kao string isto duzine 65 karaktera
52 // salt isto samo sto je duzina 11 karaktera
53 // i na kraju regdate je datum registracije njega postavljamo kao DATETIME sto je u sustine vreme i datum.
54 return true;
55}
56//-----------------------//
57public OnGameModeExit()
58{
59 return 1;
60}
61//-----------------------//
62public OnPlayerRequestClass(playerid, classid)
63{
64 return 1;
65}
66//-----------------------//
67public OnPlayerConnect(playerid)
68{
69 new query[128], // ovde definisemo string za query koji cemo formatirati i poslati kao upit
70 name[MAX_PLAYER_NAME]; // uzimamo ime igraca u ovu varijablu
71
72 GetPlayerName(playerid, name, sizeof(name)); // uzimamo ime
73
74 mysql_format(handle, query, sizeof(query), "SELECT * FROM players WHERE name=`%e` LIMIT 1", name); // ovaj upit uzima sve iz tablice sa vasim imenom, limit 1 znaci prekid pretrage na prvom nadjenom rezultatu
75 mysql_tquery(handle, query, "CheckPlayerData", "i", playerid); // ovo je "threaded query" uzima sve ovo i salje ga na sledecu funkciju na proveru
76 return true;
77}
78//-----------------------//
79public OnPlayerDisconnect(playerid)
80{
81 new query[128];
82 mysql_format(handle, query, sizeof(query), "UPDATE players SET money=`%d`, level=`%d`, skin=`%d` WHERE id=`%d`",
83 PlayerInfo[playerid][Money], PlayerInfo[playerid][Level], PlayerInfo[playerid][Skin],
84 PlayerInfo[playerid][SQLID]);
85 mysql_tquery(handle, query);
86 return true;
87}
88//-----------------------//
89public OnPlayerSpawn(playerid)
90{
91 return 1;
92}
93//-----------------------//
94public OnPlayerDeath(playerid, killerid, reason)
95{
96 return 1;
97}
98//-----------------------//
99public OnVehicleSpawn(vehicleid)
100{
101 return 1;
102}
103//-----------------------//
104public OnVehicleDeath(vehicleid, killerid)
105{
106 return 1;
107}
108//-----------------------//
109public OnPlayerText(playerid, text[])
110{
111 return 1;
112}
113//-----------------------//
114public OnPlayerCommandText(playerid, cmdtext[])
115{
116 return 1;
117}
118//-----------------------//
119public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger)
120{
121 return 1;
122}
123//-----------------------//
124public OnPlayerExitVehicle(playerid, vehicleid)
125{
126 return 1;
127}
128//-----------------------//
129public OnPlayerStateChange(playerid, newstate, oldstate)
130{
131 return 1;
132}
133//-----------------------//
134public OnPlayerEnterCheckpoint(playerid)
135{
136 return 1;
137}
138//-----------------------//
139public OnPlayerLeaveCheckpoint(playerid)
140{
141 return 1;
142}
143//-----------------------//
144public OnPlayerEnterRaceCheckpoint(playerid)
145{
146 return 1;
147}
148//-----------------------//
149public OnPlayerLeaveRaceCheckpoint(playerid)
150{
151 return 1;
152}
153//-----------------------//
154public OnRconCommand(cmd[])
155{
156 return 1;
157}
158//-----------------------//
159public OnPlayerRequestSpawn(playerid)
160{
161 return 1;
162}
163//-----------------------//
164public OnObjectMoved(objectid)
165{
166 return 1;
167}
168//-----------------------//
169public OnPlayerObjectMoved(playerid, objectid)
170{
171 return 1;
172}
173//-----------------------//
174public OnPlayerPickUpPickup(playerid, pickupid)
175{
176 return 1;
177}
178//-----------------------//
179public OnVehicleMod(playerid, vehicleid, componentid)
180{
181 return 1;
182}
183//-----------------------//
184public OnVehiclePaintjob(playerid, vehicleid, paintjobid)
185{
186 return 1;
187}
188//-----------------------//
189public OnVehicleRespray(playerid, vehicleid, color1, color2)
190{
191 return 1;
192}
193//-----------------------//
194public OnPlayerSelectedMenuRow(playerid, row)
195{
196 return 1;
197}
198//-----------------------//
199public OnPlayerExitedMenu(playerid)
200{
201 return 1;
202}
203//-----------------------//
204public OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid)
205{
206 return 1;
207}
208//-----------------------//
209public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
210{
211 return 1;
212}
213//-----------------------//
214public OnRconLoginAttempt(ip[], password[], success)
215{
216 return 1;
217}
218//-----------------------//
219public OnPlayerUpdate(playerid)
220{
221 return 1;
222}
223//-----------------------//
224public OnPlayerStreamIn(playerid, forplayerid)
225{
226 return 1;
227}
228//-----------------------//
229public OnPlayerStreamOut(playerid, forplayerid)
230{
231 return 1;
232}
233//-----------------------//
234public OnVehicleStreamIn(vehicleid, forplayerid)
235{
236 return 1;
237}
238//-----------------------//
239public OnVehicleStreamOut(vehicleid, forplayerid)
240{
241 return 1;
242}
243//-----------------------//
244public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
245{
246 switch(dialogid)
247 {
248 case DIALOG_LOGIN:
249 {
250 if(!response) return Kick(playerid);
251
252 new buf[65], name[MAX_PLAYER_NAME];
253 SHA256_PassHash(inputtext, PlayerInfo[playerid][Salt], buf, 65);
254
255 if(strcmp(buf, PlayerInfo[playerid][Password]) == 0)
256 {
257 // Password se podudara sa unesenim
258 // Sada treba da uzmemo ostale podatke
259
260 GetPlayerName(playerid, name, sizeof(name));
261
262 mysql_format(handle, query, sizeof(query), "SELECT * FROM players WHERE name = `%e` LIMIT 1", name);
263 mysql_tquery(handle, query, "OnAccountLoad", "i", playerid);
264
265 // sve smo zavrsili, u funkciji OnAccountLoad idete dalje
266 }
267 else
268 {
269 // ukoliko lozinka nije ispravna vracamo dialog
270 ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Prijava", "Lozinka koju ste uneli nije ispravna, pokusajte ponovo:", "Dalje", "Izlaz");
271 }
272 }
273
274 case DIALOG_REGISTER:
275 {
276 if(!response) return Kick(playerid);
277
278 if(strlen(inputtext) < 6 || strlen(inputtext) > 20) // ako je lozinka kraca od 6 i duza od 20 karaktera vraca dialog
279 {
280 ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_INPUT, "Registracija", "Vas racun nije pronadjen, molimo vas upisite lozinku da se registrujete:", "Dalje", "Izlaz");
281 return true;
282 }
283
284 // kao sto sam rekao salt je random generisan key, sada cemo ga randomizirati:
285
286 for (new i = 0; i < 10; i++) {
287 PlayerInfo[playerid][Salt][i] = random(100) + 50;
288 }
289
290 PlayerInfo[playerid][Salt][10] = 0;
291 SHA256_PassHash(inputtext, PlayerInfo[playerid][Salt], PlayerInfo[playerid][Password], 65);
292
293 // sada unosimo u bazu podatke igraca
294 new query[256], name[MAX_PLAYER_NAME];
295 GetPlayerName(playerid, name, sizeof(name));
296
297 mysql_format(handle, query, sizeof(query), "INSERT INTO players SET \
298 name=`%e`,\
299 password=`%e`,\
300 salt=`%e`,\
301 regdate=NOW()", name, PlayerInfo[playerid][Password], PlayerInfo[playerid][Salt]);
302
303 mysql_tquery(handle, query, "OnPlayerRegister", "d", playerid);
304 }
305 }
306 return true;
307}
308//-----------------------//
309public OnPlayerClickPlayer(playerid, clickedplayerid, source)
310{
311 return 1;
312}
313//-----------------------//
314forward CheckPlayerData(playerid);
315public CheckPlayerData(playerid)
316{
317 if(cache_num_rows() > 0)
318 {
319 // cache_num_rows > 0 znaci da u tablici postoji bar jedan rezultat sa tim imenom
320 // sada uzimamo password i salt iz tablice i saljemo igraca na prijavu
321
322 cache_get_value(0, "password", PlayerInfo[playerid][Password], 65);
323 cache_get_value(0, "salt", PlayerInfo[playerid][Salt], 11);
324
325 ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Prijava", "Vas racun je pronadjen, molimo vas upisite lozinku da se prijavite:", "Dalje", "Izlaz");
326 }
327 else {
328 ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_INPUT, "Registracija", "Vas racun nije pronadjen, molimo vas upisite lozinku da se registrujete:", "Dalje", "Izlaz");
329 }
330 return true;
331}
332//-----------------------//
333forward OnAccountLoad(playerid);
334public OnAccountLoad(playerid)
335{
336 if(cache_num_rows() > 0) {
337
338 cache_get_value_int(0, "id", PlayerInfo[playerid][SQLID]);
339 cache_get_value(0, "regdate", PlayerInfo[playerid][RegDate], 65);
340
341 // ovde ispod dodajete spawn, novac i slicno
342
343 printf("SQLID: %d | Register date: %s", PlayerInfo[playerid][SQLID], PlayerInfo[playerid][RegDate]);
344
345 SendClientMessage(playerid, -1, "Dobrodosli nazad.");
346 }
347 return true;
348}
349//-----------------------//
350forward OnPlayerRegister(playerid);
351public OnPlayerRegister(playerid)
352{
353 PlayerInfo[playerid][SQLID] = cache_insert_id(); // uzimamo id igraca koji je unesen u bazu
354 SendClientMessage(playerid, -1, "Registrovali ste se na server.");
355 return true;
356}
357
358//-----------------------------------END--------------------------------------//