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