· 8 years ago · Nov 15, 2017, 01:58 PM
1#include <a_samp>
2#include <a_mysql>
3/////////////////////////////////////////////////////////
4new MySQL:handle;
5new query[256];
6
7#define MYSQL_HOST "localhost"
8#define MYSQL_USER "root"
9#define MYSQL_PASSWORD ""
10#define MYSQL_DATABASE "db"
11/////////////////////////////////////////////////////////
12#define DIALOG_REGISTER 1
13#define DIALOG_LOGIN 2
14/////////////////////////////////////////////////////////
15enum ENUM_PLAYER_DATA
16{
17 SQLID,
18 Password[65],
19 Salt[11],
20 RegDate[65]
21}
22new PlayerInfo[MAX_PLAYERS][ENUM_PLAYER_DATA];
23/////////////////////////////////////////////////////////
24forward CheckPlayerData(playerid);
25public CheckPlayerData(playerid)
26{
27 if(cache_num_rows() > 0)
28 {
29 cache_get_value_name(0, "password", PlayerInfo[playerid][Password], 65);
30 cache_get_value_name(0, "salt", PlayerInfo[playerid][Salt], 11);
31 ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Prijava", "Vas racun je pronadjen, molimo vas upisite lozinku da se prijavite:", "Dalje", "Izlaz");
32 }
33 else
34 {
35 ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_INPUT, "Registracija", "Vas racun nije pronadjen, molimo vas upisite lozinku da se registrujete:", "Dalje", "Izlaz");
36 }
37 return true;
38}
39
40forward OnAccountLoad(playerid);
41public OnAccountLoad(playerid)
42{
43 if(cache_num_rows() > 0) {
44
45 cache_get_value(0, "id", PlayerInfo[playerid][SQLID]);
46 cache_get_value(0, "regdate", PlayerInfo[playerid][RegDate], 65);
47
48 // ovde ispod dodajete spawn, novac i slicno
49
50 printf("SQLID: %d | Register date: %s", PlayerInfo[playerid][SQLID], PlayerInfo[playerid][RegDate]);
51
52 SendClientMessage(playerid, -1, "Dobrodosli nazad.");
53 }
54 return true;
55}
56
57forward OnPlayerRegister(playerid);
58public OnPlayerRegister(playerid)
59{
60 PlayerInfo[playerid][SQLID] = cache_insert_id(); // uzimamo id igraca koji je unesen u bazu
61 SendClientMessage(playerid, -1, "Registrovali ste se na server.");
62 return true;
63}
64/////////////////////////////////////////////////////////
65stock MySQLConnect()
66{
67 new string[128];
68 handle = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DATABASE);
69 if(mysql_errno(handle) != 0 || handle == MYSQL_INVALID_HANDLE)
70 {
71 print("Konekcija sa databazom nije uspesna, pogledajte da li su sve informacije ispravne.");
72 //SendRconCommand("exit");
73 return true;
74 }
75 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 , `money` INT NULL , `level` INT NULL , `skin` INT NULL, `a_level` INT NULL, PRIMARY KEY (`id`))");
76 return true;
77}
78
79stock PlayerName(playerid)
80{
81 new name[MAX_PLAYER_NAME];
82 GetPlayerName(playerid, name, sizeof(name));
83 return name;
84}
85/////////////////////////////////////////////////////////
86main()
87{
88 print("\n----------------------------------");
89 print(" Dominus Fortis by Lucius");
90 print("----------------------------------\n");
91}
92
93public OnGameModeInit()
94{
95 MySQLConnect();
96 return true;
97}
98
99public OnGameModeExit()
100{
101 mysql_close(handle);
102 return true;
103}
104
105public OnPlayerRequestClass(playerid, classid)
106{
107 return true;
108}
109
110public OnPlayerConnect(playerid)
111{
112 mysql_format(handle, query, sizeof(query), "SELECT * FROM players WHERE name=`%s` LIMIT 1", PlayerName(playerid));
113 mysql_tquery(handle, query, "CheckPlayerData", "i", playerid);
114 return true;
115}
116
117public OnPlayerDisconnect(playerid)
118{
119 mysql_format(handle, query, sizeof(query), "UPDATE players SET money=`%d`, level=`%d`, skin=`%d` WHERE id=`%d`",
120 PlayerInfo[playerid][Money], PlayerInfo[playerid][Level], PlayerInfo[playerid][Skin],
121 PlayerInfo[playerid][SQLID]);
122 mysql_tquery(handle, query);
123 return true;
124}
125
126public OnPlayerSpawn(playerid)
127{
128 return true;
129}
130
131public OnPlayerDeath(playerid, killerid, reason)
132{
133 return true;
134}
135
136public OnVehicleSpawn(vehicleid)
137{
138 return true;
139}
140
141public OnVehicleDeath(vehicleid, killerid)
142{
143 return true;
144}
145
146public OnPlayerText(playerid, text[])
147{
148 return true;
149}
150
151public OnPlayerCommandText(playerid, cmdtext[])
152{
153 return true;
154}
155
156public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger)
157{
158 return true;
159}
160
161public OnPlayerExitVehicle(playerid, vehicleid)
162{
163 return true;
164}
165
166public OnPlayerStateChange(playerid, newstate, oldstate)
167{
168 return true;
169}
170
171public OnPlayerEnterCheckpoint(playerid)
172{
173 return true;
174}
175
176public OnPlayerLeaveCheckpoint(playerid)
177{
178 return true;
179}
180
181public OnPlayerEnterRaceCheckpoint(playerid)
182{
183 return true;
184}
185
186public OnPlayerLeaveRaceCheckpoint(playerid)
187{
188 return true;
189}
190
191public OnRconCommand(cmd[])
192{
193 return true;
194}
195
196public OnPlayerRequestSpawn(playerid)
197{
198 return true;
199}
200
201public OnObjectMoved(objectid)
202{
203 return true;
204}
205
206public OnPlayerObjectMoved(playerid, objectid)
207{
208 return true;
209}
210
211public OnPlayerPickUpPickup(playerid, pickupid)
212{
213 return true;
214}
215
216public OnVehicleMod(playerid, vehicleid, componentid)
217{
218 return true;
219}
220
221public OnVehiclePaintjob(playerid, vehicleid, paintjobid)
222{
223 return true;
224}
225
226public OnVehicleRespray(playerid, vehicleid, color1, color2)
227{
228 return true;
229}
230
231public OnPlayerSelectedMenuRow(playerid, row)
232{
233 return true;
234}
235
236public OnPlayerExitedMenu(playerid)
237{
238 return true;
239}
240
241public OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid)
242{
243 return true;
244}
245
246public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
247{
248 return true;
249}
250
251public OnRconLoginAttempt(ip[], password[], success)
252{
253 return true;
254}
255
256public OnPlayerUpdate(playerid)
257{
258 return true;
259}
260
261public OnPlayerStreamIn(playerid, forplayerid)
262{
263 return true;
264}
265
266public OnPlayerStreamOut(playerid, forplayerid)
267{
268 return true;
269}
270
271public OnVehicleStreamIn(vehicleid, forplayerid)
272{
273 return true;
274}
275
276public OnVehicleStreamOut(vehicleid, forplayerid)
277{
278 return true;
279}
280
281public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
282{
283 if(dialogid == DIALOG_LOGIN)
284 {
285 if(!response) return Kick(playerid);
286
287 new buf[65], name[MAX_PLAYER_NAME];
288 SHA256_PassHash(inputtext, PlayerInfo[playerid][Salt], buf, 65);
289
290 if(strcmp(buf, PlayerInfo[playerid][Password]) == 0)
291 {
292 // Password se podudara sa unesenim
293 // Sada treba da uzmemo ostale podatke
294
295 GetPlayerName(playerid, name, sizeof(name));
296
297 mysql_format(handle, query, sizeof(query), "SELECT * FROM players WHERE name = `%e` LIMIT 1", name);
298 mysql_tquery(handle, query, "OnAccountLoad", "i", playerid);
299
300 // sve smo zavrsili, u funkciji OnAccountLoad idete dalje
301 }
302 else
303 {
304 // ukoliko lozinka nije ispravna vracamo dialog
305 ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Prijava", "Lozinka koju ste uneli nije ispravna, pokusajte ponovo:", "Dalje", "Izlaz");
306 }
307 }
308
309 if(dialogid == DIALOG_REGISTER)
310 {
311 if(!response) return Kick(playerid);
312
313 if(strlen(inputtext) < 6 || strlen(inputtext) > 20) // ako je lozinka kraca od 6 i duza od 20 karaktera vraca dialog
314 {
315 ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_INPUT, "Registracija", "Vas racun nije pronadjen, molimo vas upisite lozinku da se registrujete:", "Dalje", "Izlaz");
316 return true;
317 }
318
319 // kao sto sam rekao salt je random generisan key, sada cemo ga randomizirati:
320
321 for (new i = 0; i < 10; i++) {
322 PlayerInfo[playerid][Salt][i] = random(100) + 50;
323 }
324
325 PlayerInfo[playerid][Salt][10] = 0;
326 SHA256_PassHash(inputtext, PlayerInfo[playerid][Salt], PlayerInfo[playerid][Password], 65);
327
328 // sada unosimo u bazu podatke igraca
329 new name[MAX_PLAYER_NAME];
330 GetPlayerName(playerid, name, sizeof(name));
331
332 mysql_format(handle, query, sizeof(query), "INSERT INTO players SET \
333 name=`%e`,\
334 password=`%e`,\
335 salt=`%e`,\
336 regdate=NOW()", name, PlayerInfo[playerid][Password], PlayerInfo[playerid][Salt]);
337
338 mysql_tquery(handle, query, "OnPlayerRegister", "d", playerid);
339 }
340 return true;
341}
342
343public OnPlayerClickPlayer(playerid, clickedplayerid, source)
344{
345 return true;
346}