· 7 years ago · Jan 16, 2019, 08:56 PM
1#include <a_samp>
2#include <a_mysql>
3#include <foreach>
4#include <sscanf2>
5#include <zcmd>
6
7#define MYSQL_HOST "localhost"
8#define MYSQL_USER "root"
9#define MYSQL_PASS ""
10#define MYSQL_DATABASE "underground"
11
12#define DIALOG_REGISTER (0)
13#define DIALOG_LOGIN (1)
14
15new
16 MySQL: Database, Corrupt_Check[MAX_PLAYERS];
17
18enum ENUM_PLAYER_DATA
19{
20 ID,
21 Name[25],
22
23 Password[65],
24 Salt[11],
25
26 PasswordFails,
27
28 Kills,
29 Deaths,
30
31 Skin,
32
33 Score,
34 Cash,
35
36 Cache: Player_Cache,
37 bool:LoggedIn
38}
39
40new pInfo[MAX_PLAYERS][ENUM_PLAYER_DATA];
41
42main()
43{
44 print("\n----------------------------------");
45 print(" Blank Gamemode by your name here");
46 print("----------------------------------\n");
47}
48
49
50public OnGameModeInit()
51{
52 new MySQLOpt: option_id = mysql_init_options();
53 mysql_set_option(option_id, AUTO_RECONNECT, true);
54
55 Database = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASS, MYSQL_DATABASE, option_id);
56
57 if(Database == MYSQL_INVALID_HANDLE || mysql_errno(Database) != 0)
58 {
59 print("I couldn't connect to the MySQL server, closing.");
60
61 SendRconCommand("exit");
62 return 1;
63 }
64
65 print("I have connected to the MySQL server.");
66
67 mysql_tquery(Database, "CREATE TABLE IF NOT EXISTS `PLAYERS` (`ID` int(11) NOT NULL AUTO_INCREMENT,`USERNAME` varchar(24) NOT NULL,`PASSWORD` char(65) NOT NULL,`SALT` char(11) NOT NULL,`SCORE` mediumint(7), `KILLS` mediumint(7), `CASH` mediumint(7) NOT NULL DEFAULT '0',`DEATHS` mediumint(7) NOT NULL DEFAULT '0', `SKIN` mediumint(7) NOT NULL DEFAULT '0' , PRIMARY KEY (`ID`), UNIQUE KEY `USERNAME` (`USERNAME`))");
68
69 return 1;
70}
71
72public OnGameModeExit()
73{
74 foreach(new i: Player)
75 {
76 if(IsPlayerConnected(i))
77 {
78 OnPlayerDisconnect(i, 1);
79 }
80 }
81
82 mysql_close(Database);
83 return 1;
84}
85
86public OnPlayerRequestClass(playerid, classid)
87{
88 SetPlayerPos(playerid, 1958.3783, 1343.1572, 15.3746);
89 SetPlayerCameraPos(playerid, 1958.3783, 1343.1572, 15.3746);
90 SetPlayerCameraLookAt(playerid, 1958.3783, 1343.1572, 15.3746);
91 return 1;
92}
93
94public OnPlayerConnect(playerid)
95{
96 new DB_Query[115];
97
98 pInfo[playerid][Kills] = 0;
99 pInfo[playerid][Deaths] = 0;
100 pInfo[playerid][Skin] = 0;
101 pInfo[playerid][PasswordFails] = 0;
102
103 GetPlayerName(playerid, pInfo[playerid][Name], MAX_PLAYER_NAME); // Getting the player's name.
104 Corrupt_Check[playerid]++;
105
106 mysql_format(Database, DB_Query, sizeof(DB_Query), "SELECT * FROM `PLAYERS` WHERE `USERNAME` = '%e' LIMIT 1", pInfo[playerid][Name]);
107 mysql_tquery(Database, DB_Query, "OnPlayerDataCheck", "ii", playerid, Corrupt_Check[playerid]);
108 return 1;
109}
110
111forward public OnPlayerDataCheck(playerid, corrupt_check);
112public OnPlayerDataCheck(playerid, corrupt_check)
113{
114 if (corrupt_check != Corrupt_Check[playerid]) return Kick(playerid);
115
116 new String[150];
117
118 if(cache_num_rows() > 0)
119 {
120 cache_get_value(0, "PASSWORD", pInfo[playerid][Password], 65);
121 cache_get_value(0, "SALT", pInfo[playerid][Salt], 11);
122
123 pInfo[playerid][Player_Cache] = cache_save();
124
125 format(String, sizeof(String), "{FFFFFF}Welcome back, %s.\n\n{0099FF}This account is already registered.\n\
126 {0099FF}Please, input your password below to proceed to the game.\n\n", pInfo[playerid][Name]);
127 ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Login System", String, "Login", "Leave");
128 }
129 else
130 {
131 format(String, sizeof(String), "{FFFFFF}Welcome %s.\n\n{0099FF}This account is not registered.\n\
132 {0099FF}Please, input your password below to proceed to the game.\n\n", pInfo[playerid][Name]);
133 ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "Registration System", String, "Register", "Leave");
134 }
135 return 1;
136}
137
138public OnPlayerDisconnect(playerid, reason)
139{
140 Corrupt_Check[playerid]++;
141 if(IsPlayerConnected()) // ovo si zaboravio da dodas
142 {
143 new DB_Query[256];
144 mysql_format(Database, DB_Query, sizeof(DB_Query), "UPDATE `PLAYERS` SET `SCORE` = '%d', `CASH` = '%d', `KILLS` = '%d', `DEATHS` = '%d', `SKIN` = '%d', WHERE `ID` = '%d' LIMIT 1",
145 pInfo[playerid][Score], pInfo[playerid][Cash], pInfo[playerid][Kills], pInfo[playerid][Deaths], pInfo[playerid][Skin], pInfo[playerid][ID]);
146 mysql_tquery(Database, DB_Query);
147 }
148 if(cache_is_valid(pInfo[playerid][Player_Cache]))
149 {
150 cache_delete(pInfo[playerid][Player_Cache]);
151 pInfo[playerid][Player_Cache] = MYSQL_INVALID_CACHE;
152 }
153
154 pInfo[playerid][LoggedIn] = false;
155 print("OnPlayerDisconnect has been called.");
156 return 1;
157}
158
159public OnPlayerSpawn(playerid)
160{
161 return 1;
162}
163
164forward public OnPlayerRegister(playerid);
165public OnPlayerRegister(playerid)
166{
167 SendClientMessage(playerid, 0x00FF00FF, "You are now registered and has been logged in.");
168 pInfo[playerid][LoggedIn] = true;
169 return 1;
170}
171
172public OnPlayerDeath(playerid, killerid, reason)
173{
174 if(killerid != INVALID_PLAYER_ID)
175 {
176 pInfo[killerid][Kills]++;
177 pInfo[playerid][Deaths]++;
178 }
179 return 1;
180}
181
182public OnVehicleSpawn(vehicleid)
183{
184 return 1;
185}
186
187public OnVehicleDeath(vehicleid, killerid)
188{
189 return 1;
190}
191
192public OnPlayerText(playerid, text[])
193{
194 return 1;
195}
196
197
198
199public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger)
200{
201 return 1;
202}
203
204public OnPlayerExitVehicle(playerid, vehicleid)
205{
206 return 1;
207}
208
209public OnPlayerStateChange(playerid, newstate, oldstate)
210{
211 return 1;
212}
213
214public OnPlayerEnterCheckpoint(playerid)
215{
216 return 1;
217}
218
219public OnPlayerLeaveCheckpoint(playerid)
220{
221 return 1;
222}
223
224public OnPlayerEnterRaceCheckpoint(playerid)
225{
226 return 1;
227}
228
229public OnPlayerLeaveRaceCheckpoint(playerid)
230{
231 return 1;
232}
233CMD:setmoney(playerid, params[])
234{
235 new id, money;
236 if(sscanf(params, "ud", id, money)) SendClientMessage(playerid, -1, "Usage: /setmoney [id][amount]");
237 else
238 {
239 GivePlayerMoney(id, money);
240 pInfo[playerid][Cash] = GetPlayerMoney(playerid);
241
242
243 }
244 return 1;
245}
246
247CMD:skin(playerid, params[])
248{
249 new skinid;
250 if(sscanf(params, "d", skinid)) SendClientMessage(playerid, -1, "Usage: /skin [id]");
251 else
252 {
253 SetPlayerSkin(playerid, skinid);
254 pInfo[playerid][Skin] = GetPlayerSkin(playerid);
255 }
256 return 1;
257}
258CMD:gmx(playerid, params[])
259{
260 if(IsPlayerAdmin(playerid))
261 {
262 SendRconCommand("gmx");
263 }
264 else SendClientMessage(playerid, -1, "You don't have permission for that!");
265 return 1;
266}
267public OnRconCommand(cmd[])
268{
269 return 1;
270}
271
272public OnPlayerRequestSpawn(playerid)
273{
274 if(pInfo[playerid][LoggedIn] == false) return 0;
275 return 1;
276}
277
278public OnObjectMoved(objectid)
279{
280 return 1;
281}
282
283public OnPlayerObjectMoved(playerid, objectid)
284{
285 return 1;
286}
287
288public OnPlayerPickUpPickup(playerid, pickupid)
289{
290 return 1;
291}
292
293public OnVehicleMod(playerid, vehicleid, componentid)
294{
295 return 1;
296}
297
298public OnVehiclePaintjob(playerid, vehicleid, paintjobid)
299{
300 return 1;
301}
302
303public OnVehicleRespray(playerid, vehicleid, color1, color2)
304{
305 return 1;
306}
307
308public OnPlayerSelectedMenuRow(playerid, row)
309{
310 return 1;
311}
312
313public OnPlayerExitedMenu(playerid)
314{
315 return 1;
316}
317
318public OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid)
319{
320 return 1;
321}
322
323public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
324{
325 return 1;
326}
327
328public OnRconLoginAttempt(ip[], password[], success)
329{
330 return 1;
331}
332
333public OnPlayerUpdate(playerid)
334{
335 return 1;
336}
337
338public OnPlayerStreamIn(playerid, forplayerid)
339{
340 return 1;
341}
342
343public OnPlayerStreamOut(playerid, forplayerid)
344{
345 return 1;
346}
347
348public OnVehicleStreamIn(vehicleid, forplayerid)
349{
350 return 1;
351}
352
353public OnVehicleStreamOut(vehicleid, forplayerid)
354{
355 return 1;
356}
357
358public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
359{
360 switch (dialogid)
361 {
362 case DIALOG_LOGIN:
363 {
364 if(!response) return Kick(playerid);
365
366 new Salted_Key[65];
367 SHA256_PassHash(inputtext, pInfo[playerid][Salt], Salted_Key, 65);
368
369 if(strcmp(Salted_Key, pInfo[playerid][Password]) == 0)
370 {
371 cache_set_active(pInfo[playerid][Player_Cache]);
372
373 cache_get_value_int(0, "ID", pInfo[playerid][ID]);
374
375 cache_get_value_int(0, "KILLS", pInfo[playerid][Kills]);
376 cache_get_value_int(0, "DEATHS", pInfo[playerid][Deaths]);
377 cache_get_value_int(0, "SKIN", pInfo[playerid][Skin]);
378
379 cache_get_value_int(0, "SCORE", pInfo[playerid][Score]);
380 cache_get_value_int(0, "CASH", pInfo[playerid][Cash]);
381
382 SetPlayerScore(playerid, pInfo[playerid][Score]);
383
384 ResetPlayerMoney(playerid);
385 GivePlayerMoney(playerid, pInfo[playerid][Cash]);
386 SetPlayerSkin(playerid, pInfo[playerid][Skin]);
387
388 cache_delete(pInfo[playerid][Player_Cache]);
389 pInfo[playerid][Player_Cache] = MYSQL_INVALID_CACHE;
390
391 pInfo[playerid][LoggedIn] = true;
392 SendClientMessage(playerid, 0x00FF00FF, "Logged in to the account.");
393 }
394 else
395 {
396 new String[150];
397
398 pInfo[playerid][PasswordFails] += 1;
399 printf("%s has been failed to login. (%d)", pInfo[playerid][Name], pInfo[playerid][PasswordFails]);
400
401 if (pInfo[playerid][PasswordFails] >= 3)
402 {
403 format(String, sizeof(String), "%s has been kicked Reason: {FF0000}(%d/3) Login fails.", pInfo[playerid][Name], pInfo[playerid][PasswordFails]);
404 SendClientMessageToAll(0x969696FF, String);
405 Kick(playerid);
406 }
407 else
408 {
409 format(String, sizeof(String), "Wrong password, you have %d out of 3 tries.", pInfo[playerid][PasswordFails]);
410 SendClientMessage(playerid, 0xFF0000FF, String);
411
412 format(String, sizeof(String), "{FFFFFF}Welcome back, %s.\n\n{0099FF}This account is already registered.\n\
413 {0099FF}Please, input your password below to proceed to the game.\n\n", pInfo[playerid][Name]);
414 ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Login System", String, "Login", "Leave");
415 }
416 }
417 }
418 case DIALOG_REGISTER:
419 {
420 if(!response) return Kick(playerid);
421
422 if(strlen(inputtext) <= 5 || strlen(inputtext) > 60)
423 {
424 SendClientMessage(playerid, 0x969696FF, "Invalid password length, should be 5 - 60.");
425
426 new String[150];
427
428 format(String, sizeof(String), "{FFFFFF}Welcome %s.\n\n{0099FF}This account is not registered.\n\
429 {0099FF}Please, input your password below to proceed.\n\n", pInfo[playerid][Name]);
430 ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "Registration System", String, "Register", "Leave");
431 }
432 else
433 {
434
435 for (new i = 0; i < 10; i++)
436 {
437 pInfo[playerid][Salt][i] = random(79) + 47;
438 }
439
440 pInfo[playerid][Salt][10] = 0;
441 SHA256_PassHash(inputtext, pInfo[playerid][Salt], pInfo[playerid][Password], 65);
442
443 new DB_Query[225];
444
445 mysql_format(Database, DB_Query, sizeof(DB_Query), "INSERT INTO `PLAYERS` (`USERNAME`, `PASSWORD`, `SALT`, `SCORE`, `KILLS`, `CASH`, `DEATHS`, `SKIN`)\
446 VALUES ('%e', '%s', '%e', '20', '0', '0', '0', '0')", pInfo[playerid][Name], pInfo[playerid][Password], pInfo[playerid][Salt]);
447 mysql_tquery(Database, DB_Query, "OnPlayerRegister", "d", playerid);
448 }
449 }
450 }
451 return 1;
452}
453
454public OnPlayerClickPlayer(playerid, clickedplayerid, source)
455{
456 return 1;
457}