· 5 years ago · May 13, 2020, 10:18 PM
1#define FILTERSCRIPT BY ALFA
2
3#include <a_samp>
4#include <foreach>
5#include <sqlitei>
6#include <zcmd>
7
8#define RCON_PASSWORD "changeme"
9
10#define LEAVETYPE_KICK 0
11#define LEAVETYPE_EXPLOIT 1
12#define LEAVETYPE_CHEAT 2
13#define LEAVETYPE_UNTRUSTED 3
14#define LEAVETYPE_BANNED 4
15#define LEAVETYPE_ADVERTISEMENT 5
16#define LEAVETYPE_FAIL_LOGIN 6
17
18#define MINUTES_5 300000
19#define MINUTES_10 600000
20#define MINUTES_15 900000
21#define MINUTES_30 1800000
22
23#define HOURS_1 3600000
24
25#define MAX_PLAYER_IP 16
26
27//#define DIALOG_CLOSEALL -1
28#define DIALOG_REQUESTANSWER 2000
29#define DIALOG_RCON 2001
30#define DIALOG_SETTINGS 2002
31#define DIALOG_SETTINGS_QUESTION 2003
32#define DIALOG_SETTINGS_ANSWER 2004
33#define DIALOG_SETTINGS_ADMIN 2005
34#define DIALOG_SETTINGS_ADMIN2 2006
35
36enum playerInfo
37{
38 dbID,
39 Untrusted, TimesDied,
40 DialogWarns, DeathWarns,
41 TextWarns, StateWarns,
42 ShotWarns, VehicleWarns,
43
44 TotalWarns,
45
46 TimesShot, LastShot, BulletsToDesync,
47 VehicleID, LastEntered,
48
49 EditingDialog,
50
51 Name[ 24 ], IP[ 16 ],
52
53 sQuestion[ 48 ], sAnswer[ 48 ],
54
55 LastDetection[ 16 ],
56
57 bool:QASetup,
58 bool:RequestAnswer,
59 bool:LoggedIn,
60 bool:AlreadyConnected,
61 bool:RCONAdmin
62};
63enum gameguardInfo
64{
65 KICK_DELAY,
66
67 MAX_UNTRUSTED_WARNS,
68
69 MAX_DIALOG_WARNS, MAX_TEXT_WARNS,
70 MAX_DEATH_WARNS, MAX_STATE_WARNS,
71 MAX_VEHICLE_WARNS,
72
73 MAX_SHOT_WARNS, MAX_DESYNC_BULLETS, MAX_BULLETS,
74
75 bool:ENABLED, bool:DESYNC,
76 bool:USE_RCON2
77};
78new
79 pInfo[ MAX_PLAYERS ][ playerInfo ],
80 gInfo[ gameguardInfo ]
81;
82new
83 DB:Database
84;
85
86
87#if defined FILTERSCRIPT
88
89public OnFilterScriptInit()
90{
91 print("\nGameGuard: loading");
92
93 Database = db_open("gameguard.db");
94
95 // ---- USERS
96 db_query(Database,
97 "CREATE TABLE IF NOT EXISTS users (userid INTEGER PRIMARY KEY AUTOINCREMENT,\
98 username VARCHAR(24),\
99 ip VARCHAR(16),\
100 untrusted INTEGER DEFAULT 0 NOT NULL,\
101 laston INTEGER DEFAULT 0 NOT NULL,\
102 question VARCHAR(48),\
103 answer VARCHAR(48)\
104 )");
105
106 // ---- BANS
107 db_query(Database,
108 "CREATE TABLE IF NOT EXISTS banned (banid INTEGER PRIMARY KEY AUTOINCREMENT,\
109 bannedname VARCHAR(24),\
110 bannedip VARCHAR(16),\
111 banreason VARCHAR(48),\
112 date INTEGER DEFAULT 0 NOT NULL,\
113 time INTEGER DEFAULT 0 NOT NULL\
114 )");
115
116 if(!strcmp(RCON_PASSWORD, "changeme"))
117 {
118 print("GameGuard: Please change 'RCON_PASSWORD' in the script!");
119 print("GameGuard: RCON is currently disabled.");
120 }
121
122 gInfo[ KICK_DELAY ] = 300; //300 ms
123 gInfo[ MAX_DIALOG_WARNS ] = 5, gInfo[ MAX_DEATH_WARNS ] = 5, gInfo[ MAX_UNTRUSTED_WARNS ] = 5;
124 gInfo[ MAX_TEXT_WARNS ] = 5, gInfo[ MAX_STATE_WARNS ] = 5, gInfo[ MAX_SHOT_WARNS ] = 5;
125 gInfo[ MAX_VEHICLE_WARNS ] = 5;
126 gInfo[ MAX_DESYNC_BULLETS ] = 5, gInfo[ MAX_BULLETS ] = 10;
127
128 gInfo[ ENABLED ] = true, gInfo[ DESYNC ] = false;
129 gInfo[ USE_RCON2 ] = true;
130
131 print("- - - - - - - - SETTINGS - - - - - - - -");
132 printf("GameGuard: 2nd RCON Password is set to %s", RCON_PASSWORD);
133 printf("GameGuard: Max Untrusted Warns is set to %d", gInfo[ MAX_UNTRUSTED_WARNS ]);
134 printf("GameGuard: Kick Delay is set to %d ms", gInfo[ KICK_DELAY ]);
135 printf("GameGuard: Max Bullets is set to %d (per second)", gInfo[ MAX_BULLETS ]);
136 printf("GameGuard: Max Dialog Warns is set to %d", gInfo[ MAX_DIALOG_WARNS ]);
137 printf("GameGuard: Max Death Warns is set to %d", gInfo[ MAX_DEATH_WARNS ]);
138 printf("GameGuard: Max Text Warns is set to %d", gInfo[ MAX_TEXT_WARNS ]);
139 printf("GameGuard: Max State Warns is set to %d", gInfo[ MAX_STATE_WARNS ]);
140 printf("GameGuard: Max Vehicle Warns is set to %d", gInfo[ MAX_VEHICLE_WARNS ]);
141 printf("GameGuard: Max Shot Warns is set to %d", gInfo[ MAX_SHOT_WARNS ]);
142 printf("GameGuard: Max Desync Bullets is set to %d", gInfo[ MAX_DESYNC_BULLETS ]);
143
144 foreach(Player, i)
145 {
146 OnPlayerConnect(i);
147
148 if(IsPlayerAdmin(i))
149 {
150 ShowPlayerDialog(i, DIALOG_RCON, DIALOG_STYLE_INPUT, "{72FA80}GAMEGUARD: {FFFFFF}RCON Login", "{FFFFFF}You're required to enter the 2nd {72FA80}RCON Password{FFFFFF}.\nIf you fail to do so, you'll be kicked", "Accept", "Cancel");
151 }
152 }
153 return 1;
154}
155public OnFilterScriptExit()
156{
157 print("GameGuard: unloading");
158 db_close(Database);
159 return 1;
160}
161
162#endif
163
164
165public OnPlayerConnect(playerid)
166{
167 if(gInfo[ ENABLED ] == true)
168 {
169 GetPlayerName(playerid, pInfo[ playerid ][ Name ], MAX_PLAYER_NAME+1);
170 GetPlayerIp(playerid, pInfo[ playerid ][ IP ], MAX_PLAYER_IP+1);
171 format(pInfo[ playerid ][ LastDetection ], 3, "\0");
172
173 if(!IsPlayerNPC(playerid))
174 {
175 SendClientMessage(playerid, -1, "{72FA80}GAMEGUARD: {FFFFFF}GameGuard is enabled in this server.");
176 if(pInfo[ playerid ][ AlreadyConnected ] == false)
177 {
178 new
179 Query[ 128 ], string[ 118 ],
180 DBResult:Result
181 ;
182 pInfo[ playerid ][ AlreadyConnected ] = true;
183
184 format(Query, sizeof(Query), "SELECT * FROM banned WHERE bannedname = '%s' OR bannedip = '%s'", DB_Escape(pInfo[ playerid ][ Name ]), pInfo[ playerid ][ IP ]);
185 Result = db_query(Database, Query);
186 if(db_num_rows(Result))
187 {
188 new
189 banreason[ 48 ]
190 ;
191 db_get_field_assoc(Result, "banreason", banreason, 48);
192 format(string, sizeof(string), "{72FA80}GAMEGUARD: {FFFFFF}This account is banned: {72FA80}%s{FFFFFF}.", banreason);
193 SendClientMessage(playerid, -1, string), SendLeaveMessage(playerid, LEAVETYPE_BANNED);
194
195 BlockIpAddressEx(pInfo[ playerid ][ IP ], HOURS_1, playerid);
196 }
197 else
198 {
199 format(Query, sizeof(Query), "SELECT * FROM users WHERE username = '%s' LIMIT 0, 1", DB_Escape(pInfo[ playerid ][ Name ]));
200 Result = db_query(Database, Query);
201 if(db_num_rows(Result))
202 {
203 db_get_field_assoc(Result, "untrusted", Query, 3); pInfo[ playerid ][ Untrusted ] = strval(Query);
204 if(pInfo[ playerid ][ Untrusted ] < gInfo[ MAX_UNTRUSTED_WARNS ])
205 {
206 db_get_field_assoc(Result, "userid", Query, 8); pInfo[ playerid ][ dbID ] = strval(Query);
207
208 db_get_field_assoc(Result, "question", pInfo[ playerid ][ sQuestion ], 48);
209 db_get_field_assoc(Result, "answer", pInfo[ playerid ][ sAnswer ], 48);
210
211 if(strlen(pInfo[ playerid ][ sQuestion ]) >= 7 && strlen(pInfo[ playerid ][ sAnswer ]) >= 1)
212 {
213 pInfo[ playerid ][ QASetup ] = true;
214
215 new
216 tempip[ 16 ]
217 ;
218 db_get_field_assoc(Result, "ip", tempip, MAX_PLAYER_IP);
219
220 if(strcmp(tempip, pInfo[ playerid ][ IP ], true))
221 {
222 pInfo[ playerid ][ RequestAnswer ] = true;
223 pInfo[ playerid ][ LoggedIn ] = false;
224 }
225 else
226 {
227 pInfo[ playerid ][ RequestAnswer ] = false;
228 pInfo[ playerid ][ LoggedIn ] = true;
229 }
230 }
231 else
232 {
233 SendClientMessage(playerid, -1, "{72FA80}GAMEGUARD: {FFFFFF}For your account safety, setup a secret question in /settings!");
234
235 format(pInfo[ playerid ][ sQuestion ], 4, "N/A");
236 format(pInfo[ playerid ][ sAnswer ], 4, "N/A");
237 }
238 }
239 else if(pInfo[ playerid ][ Untrusted ] >= gInfo[ MAX_UNTRUSTED_WARNS ])
240 {
241 SendLeaveMessage(playerid, LEAVETYPE_UNTRUSTED);
242 Ban_(playerid, "Untrusted");
243 }
244 }
245 else
246 {
247 new
248 year, month, day
249 ;
250 getdate(year, month, day);
251
252 format(Query, sizeof(Query), "INSERT INTO users (username, ip, laston) VALUES ('%s', '%s', '%d/%d/%d')",
253 DB_Escape(pInfo[ playerid ][ Name ]), pInfo[ playerid ][ IP ], year, month, day);
254 db_query(Database, Query);
255
256 format(Query, sizeof(Query), "SELECT userid FROM users WHERE username = '%s' LIMIT 0, 1", DB_Escape(pInfo[ playerid ][ Name ]));
257 Result = db_query(Database, Query);
258 if(db_num_rows(Result))
259 {
260 db_get_field_assoc(Result, "userid", Query, 8); pInfo[ playerid ][ dbID ] = strval(Query);
261
262 pInfo[ playerid ][ LoggedIn ] = true;
263 }
264 format(pInfo[ playerid ][ sQuestion ], 4, "N/A");
265 format(pInfo[ playerid ][ sAnswer ], 4, "N/A");
266 }
267 }
268 db_free_result(Result);
269 }
270 else
271 {
272 SendLeaveMessage(playerid, LEAVETYPE_EXPLOIT);
273 BlockIpAddressEx(pInfo[ playerid ][ IP ], HOURS_1, playerid, LEAVETYPE_EXPLOIT);
274 }
275 }
276 else
277 {
278 if(strcmp(pInfo[ playerid ][ IP ], "127.0.0.1"))
279 {
280 SendLeaveMessage(playerid, LEAVETYPE_EXPLOIT);
281 BlockIpAddressEx(pInfo[ playerid ][ IP ], HOURS_1, playerid, LEAVETYPE_EXPLOIT);
282 }
283 }
284 }
285 return 1;
286}
287public OnPlayerDisconnect(playerid, reason)
288{
289 if(gInfo[ ENABLED ] == true)
290 {
291 if(pInfo[ playerid ][ LoggedIn ] == true)
292 {
293 new
294 Query[ 128 ],
295 year, month, day
296 ;
297 getdate(year, month, day);
298 format(Query, sizeof(Query), "UPDATE users SET ip = '%s', untrusted = %d, laston = '%d/%d/%d' WHERE userid = %d",
299 pInfo[ playerid ][ IP ], pInfo[ playerid ][ Untrusted ], year, month, day, pInfo[ playerid ][ dbID ]);
300 db_query(Database, Query);
301 }
302 }
303 for(new i; i < _: playerInfo; ++i) pInfo[ playerid ][ playerInfo: i ] = 0;
304 return 1;
305}
306
307
308public OnPlayerRequestSpawn(playerid)
309{
310 if(gInfo[ ENABLED ] == true)
311 {
312 if(pInfo[ playerid ][ RequestAnswer ] == true && pInfo[ playerid ][ QASetup ] == true)
313 {
314 new
315 string[ 228 ]
316 ;
317 SendClientMessage(playerid, -1, "{72FA80}GAMEGUARD: {FFFFFF}IP's differ - Type the answer of your secret question.");
318
319 format(string, sizeof( string ), "{FFFFFF}Your last login IP, and your current IP ( {72FA80}%s{FFFFFF} ) don't match!\nYou're requested to type in your answer of your secret question!\nQuestion: {72FA80}%s{FFFFFF}",
320 pInfo[ playerid ][ IP ], pInfo[ playerid ][ sQuestion ]);
321
322 ShowPlayerDialog(playerid, DIALOG_REQUESTANSWER, DIALOG_STYLE_INPUT, "{72FA80}GAMEGUARD: {FFFFFF}Secret Answer", string, "Accept", "Cancel");
323 return 0;
324 }
325 }
326 if(gInfo[ DESYNC ] == true)
327 {
328 if(pInfo[ playerid ][ TotalWarns ] > 6)
329 {
330 return 0;
331 }
332 }
333 return 1;
334}
335public OnPlayerSpawn(playerid)
336{
337 if(gInfo[ ENABLED ] == true)
338 {
339 if(pInfo[ playerid ][ RequestAnswer ] == true)
340 {
341 SendLeaveMessage(playerid, LEAVETYPE_KICK);
342 BlockIpAddressEx(pInfo[ playerid ][ IP ], MINUTES_5, playerid);
343 }
344 }
345 return 1;
346}
347public OnPlayerDeath(playerid, killerid, reason)
348{
349 if(gInfo[ ENABLED ] == true)
350 {
351 pInfo[ playerid ][ TimesDied ]++;
352 if(pInfo[ playerid ][ TimesDied ] > 2)
353 {
354 pInfo[ playerid ][ TimesDied ] = 0, pInfo[ playerid ][ DeathWarns ]++, pInfo[ playerid ][ TotalWarns ]++;
355 if(pInfo[ playerid ][ DeathWarns ] >= gInfo[ MAX_DEATH_WARNS ])
356 {
357 SendLeaveMessage(playerid, LEAVETYPE_CHEAT);
358 BlockIpAddressEx(pInfo[ playerid ][ IP ], HOURS_1, playerid, LEAVETYPE_CHEAT);
359 }
360 format(pInfo[ playerid ][ LastDetection ], 10, "Fake-Kill");
361 }
362 }
363 if(gInfo[ DESYNC ] == true)
364 {
365 if(pInfo[ playerid ][ TotalWarns ] > 6)
366 {
367 return 0;
368 }
369 }
370 return 1;
371}
372
373public OnPlayerCommandReceived(playerid, cmdtext[])
374{
375 if(gInfo[ ENABLED ] == true)
376 {
377 if(gInfo[ USE_RCON2 ] == true)
378 {
379 if(IsPlayerAdmin(playerid) && pInfo[ playerid ][ RCONAdmin ] == false)
380 {
381 return 0;
382 }
383 }
384 else if(pInfo[ playerid ][ LoggedIn ] == false)
385 {
386 return 0;
387 }
388
389 if(strfind(".", cmdtext, true))
390 {
391 new
392 dots,
393 numbers,
394 colons
395 ;
396 for(new i; i < strlen(cmdtext); i++)
397 {
398 if(cmdtext[i] == '.')
399 {
400 dots++;
401 }
402 else if(cmdtext[i] <= '9' || cmdtext[i] >= '0')
403 {
404 numbers++;
405 }
406 else if(cmdtext[i] == ':')
407 {
408 colons++;
409 }
410 else continue;
411 }
412 if(dots == 3 && colons >= 0 && numbers >= 6)
413 {
414 format(pInfo[ playerid ][ LastDetection ], 15, "Advertisement");
415 pInfo[ playerid ][ TextWarns ]++, pInfo[ playerid ][ TotalWarns ]++;
416 if(pInfo[ playerid ][ TextWarns ] < gInfo[ MAX_TEXT_WARNS ] )
417 {
418 return 0;
419 }
420 else
421 {
422 BlockIpAddressEx(pInfo[ playerid ][ IP ], MINUTES_30, playerid, LEAVETYPE_ADVERTISEMENT);
423 SendLeaveMessage(playerid, LEAVETYPE_KICK);
424 return 0;
425 }
426 }
427 }
428 }
429 if(gInfo[ DESYNC ] == true)
430 {
431 if(pInfo[ playerid ][ TotalWarns ] > 6)
432 {
433 return 0;
434 }
435 }
436 return 1;
437}
438public OnPlayerText(playerid, text[])
439{
440 if(gInfo[ ENABLED ] == true)// && gInfo[ USE_RCON2 ] == true)
441 {
442 if(gInfo[ USE_RCON2 ] == true)
443 {
444 if(IsPlayerAdmin(playerid) && pInfo[ playerid ][ RCONAdmin ] == false)
445 {
446 return 0;
447 }
448 }
449 else if(pInfo[ playerid ][ LoggedIn ] == false)
450 {
451 return 0;
452 }
453
454 if(strfind(".", text, true))
455 {
456 new
457 dots,
458 numbers,
459 colons
460 ;
461 for(new i; i < strlen(text); i++)
462 {
463 if(text[i] == '.')
464 {
465 dots++;
466 }
467 else if(text[i] <= '9' || text[i] >= '0')
468 {
469 numbers++;
470 }
471 else if(text[i] == ':')
472 {
473 colons++;
474 }
475 else continue;
476 }
477 if(dots == 3 && colons >= 0 && numbers >= 6)
478 {
479 format(pInfo[ playerid ][ LastDetection ], 15, "Advertisement");
480 pInfo[ playerid ][ TextWarns ]++, pInfo[ playerid ][ TotalWarns ]++;
481 if(pInfo[ playerid ][ TextWarns ] < gInfo[ MAX_TEXT_WARNS ] )
482 {
483 SendClientMessage(playerid, -1, "{72FA80}GAMEGUARD: {FFFFFF}Advertising is not allowed!");
484 }
485 else
486 {
487 BlockIpAddressEx(pInfo[ playerid ][ IP ], MINUTES_30, playerid, LEAVETYPE_ADVERTISEMENT);
488 SendLeaveMessage(playerid, LEAVETYPE_KICK);
489 }
490 return 0;
491 }
492 }
493 }
494 if(gInfo[ DESYNC ] == true)
495 {
496 if(pInfo[ playerid ][ TotalWarns ] > 6)
497 {
498 return 0;
499 }
500 }
501 return 1;
502}
503public OnRconLoginAttempt(ip[], password[], success)
504{
505 if(strcmp(RCON_PASSWORD, "changeme"))
506 {
507 if(gInfo[ ENABLED ] == true)
508 {
509 if(!success)
510 {
511 foreach(Player, i)
512 {
513 if(strcmp(ip, pInfo[ i ][ IP ])) continue;
514 else BlockIpAddressEx(ip, HOURS_1, i, LEAVETYPE_FAIL_LOGIN), SendLeaveMessage(i, LEAVETYPE_KICK);
515 }
516 }
517 else
518 {
519 if(gInfo[ USE_RCON2 ] == true)
520 {
521 foreach(Player, i)
522 {
523 if(strcmp(ip, pInfo[ i ][ IP ])) continue;
524 else ShowPlayerDialog(i, DIALOG_RCON, DIALOG_STYLE_INPUT, "{72FA80}GAMEGUARD: {FFFFFF}RCON Login", "{FFFFFF}You're required to enter the 2nd {72FA80}RCON Password{FFFFFF}.\nIf you fail to do so, you'll be kicked", "Accept", "Cancel");
525 }
526 }
527 }
528 }
529 }
530 else
531 {
532 foreach(Player, i)
533 {
534 if(strcmp(ip, pInfo[ i ][ IP ])) continue;
535 else BlockIpAddressEx(ip, MINUTES_5, i, LEAVETYPE_KICK), SendLeaveMessage(i, LEAVETYPE_KICK), SendClientMessage(i, -1, "{72FA80}GAMEGUARD: {FFFFFF}RCON is disabled!");
536 }
537 }
538 return 1;
539}
540
541public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
542{
543 switch(dialogid)
544 {
545 case DIALOG_REQUESTANSWER:
546 {
547 if(response)
548 {
549 if(strcmp(pInfo[ playerid ][ sAnswer ], inputtext, false))
550 {
551 new
552 string[ 228 ]
553 ;
554
555 pInfo[ playerid ][ DialogWarns ]++, pInfo[ playerid ][ TotalWarns ]++;
556
557 format(string, sizeof(string), "{72FA80}GAMEGUARD: {FFFFFF}Invalid Secret Answer. (%d/%d)", pInfo[ playerid ][ DialogWarns ], gInfo[ MAX_DIALOG_WARNS ]);
558 SendClientMessage(playerid, -1, string);
559 if(pInfo[ playerid ][ DialogWarns ] < gInfo[ MAX_DIALOG_WARNS ])
560 {
561 format(string, sizeof( string ), "{FFFFFF}Your last login IP, and your current IP ( {72FA80}%s{FFFFFF} ) don't match!\nYou're requested to type in your answer of your secret question!\nQuestion: {72FA80}%s{FFFFFF}",
562 pInfo[ playerid ][ IP ], pInfo[ playerid ][ sQuestion ]);
563
564 ShowPlayerDialog(playerid, DIALOG_REQUESTANSWER, DIALOG_STYLE_INPUT, "{72FA80}GAMEGUARD: {FFFFFF}Invalid Secret Answer", string, "Accept", "Cancel");
565 }
566 else
567 {
568 SendLeaveMessage(playerid, LEAVETYPE_KICK);
569 BlockIpAddressEx(pInfo[ playerid ][ IP ], MINUTES_5, playerid);
570 }
571 }
572 else
573 {
574 pInfo[ playerid ][ RequestAnswer ] = false;
575 pInfo[ playerid ][ LoggedIn ] = true;
576
577 SendClientMessage(playerid, -1, "{72FA80}GAMEGUARD: {FFFFFF}Secret Answer accepted!");
578 }
579 }
580 else
581 {
582 SendLeaveMessage(playerid, LEAVETYPE_KICK);
583 BlockIpAddressEx(pInfo[ playerid ][ IP ], MINUTES_15, playerid);
584 }
585 }
586 case DIALOG_RCON:
587 {
588 if(gInfo[ USE_RCON2 ] == true)
589 {
590 if(response)
591 {
592 if(strcmp(inputtext, RCON_PASSWORD))
593 {
594 new
595 string[ 57 ]
596 ;
597
598 pInfo[ playerid ][ DialogWarns ]++, pInfo[ playerid ][ TotalWarns ]++;
599 format(string, sizeof(string), "{72FA80}GAMEGUARD: {FFFFFF}Invalid RCON Password. (%d/%d)", pInfo[ playerid ][ DialogWarns ], gInfo[ MAX_DIALOG_WARNS ]);
600 SendClientMessage(playerid, -1, string);
601
602 if(pInfo[ playerid ][ DialogWarns ] < gInfo[ MAX_DIALOG_WARNS ])
603 {
604 ShowPlayerDialog(playerid, DIALOG_RCON, DIALOG_STYLE_INPUT, "{72FA80}GAMEGUARD: {FFFFFF}RCON Login", "{FFFFFF}You're required to enter the 2nd {72FA80}RCON Password{FFFFFF}.\nIf you fail to do so, you'll be kicked", "Accept", "Cancel");
605 }
606 else
607 {
608 SendLeaveMessage(playerid, LEAVETYPE_KICK);
609 BlockIpAddressEx(pInfo[ playerid ][ IP ], HOURS_1, playerid, LEAVETYPE_FAIL_LOGIN);
610 }
611 }
612 else
613 {
614 pInfo[ playerid ][ RCONAdmin ] = true;
615 SendClientMessage(playerid, -1, "{72FA80}GAMEGUARD: {FFFFFF}Password Accepted.");
616 }
617 }
618 else
619 {
620 SendLeaveMessage(playerid, LEAVETYPE_KICK);
621 BlockIpAddressEx(pInfo[ playerid ][ IP ], HOURS_1, playerid, LEAVETYPE_FAIL_LOGIN);
622 }
623 }
624 }
625 case DIALOG_SETTINGS:
626 {
627 if(response)
628 {
629 new
630 string[ 386 ]
631 ;
632 switch(listitem)
633 {
634 case 0:
635 {
636 if(strlen(pInfo[ playerid ][ sQuestion ]) >= 7)
637 {
638 format(string, sizeof(string), "{FFFFFF}Enter a new {72FA80}Secret Question {FFFFFF}below!\nYour current Secret Question is {72FA80}%s",
639 pInfo[ playerid ][ sQuestion ]);
640 }
641 else
642 {
643 format(string, sizeof(string), "{FFFFFF}Set up your {72FA80}Secret Question {FFFFFF}below!\n* Make sure you'll remember the question & the answer!");
644 }
645 ShowPlayerDialog(playerid, DIALOG_SETTINGS_QUESTION, DIALOG_STYLE_INPUT, "{72FA80}GAMEGUARD: {FFFFFF}Secret Question", string, "Accept", "Back");
646 }
647 case 1:
648 {
649 if(strlen(pInfo[ playerid ][ sAnswer ]) >= 1)
650 {
651 format(string, sizeof(string), "{FFFFFF}Enter a new {72FA80}Secret Answer {FFFFFF}below!\nYour current Secret Answer is {72FA80}%s",
652 pInfo[ playerid ][ sAnswer ]);
653 }
654 else
655 {
656 format(string, sizeof(string), "{FFFFFF}Set up your {72FA80}Secret Answer {FFFFFF}below!\n* Make sure you'll remember the question & the answer!");
657 }
658 ShowPlayerDialog(playerid, DIALOG_SETTINGS_ANSWER, DIALOG_STYLE_INPUT, "{72FA80}GAMEGUARD: {FFFFFF}Secret Answer", string, "Accept", "Back");
659 }
660 case 2:
661 {
662 if(pInfo[ playerid ][ RCONAdmin ] == true)
663 {
664 format(string, sizeof(string), "{FFFFFF}Kick Delay: {72FA80}%d ms\n{FFFFFF}Max. Dialog Warnings: {72FA80}%d\n{FFFFFF}Max. Death Warnings: {72FA80}%d\n{FFFFFF}Max. Text Warnings: {72FA80}%d\n{FFFFFF}Max. State Warnings: {72FA80}%d\n{FFFFFF}Max. Shot Warnings: {72FA80}%d\n{FFFFFF}Max. Vehicle Warnings: {72FA80}%d\n{FFFFFF}2nd RCON: {72FA80}%s\n{FFFFFF}GameGuard: {72FA80}%s\n{FFFFFF}DeSync: {72FA80}%s",
665 gInfo[ KICK_DELAY ], gInfo[ MAX_DIALOG_WARNS ], gInfo[ MAX_DEATH_WARNS ], gInfo[ MAX_TEXT_WARNS ], gInfo[ MAX_STATE_WARNS ], gInfo[ MAX_SHOT_WARNS ], gInfo[ MAX_VEHICLE_WARNS ], RCON2_STATUS(), GAMEGUARD_STATUS(), DESYNC_STATUS());
666
667 ShowPlayerDialog(playerid, DIALOG_SETTINGS_ADMIN, DIALOG_STYLE_LIST, "{72FA80}GAMEGUARD: {FFFFFF}GameGuard Settings", string, "Edit", "Back");
668 }
669 }
670 case 3:
671 {
672 if(pInfo[ playerid ][ RCONAdmin ] == true)
673 {
674 new
675 dstring[ 999 ], count
676 ;
677 foreach(Player, i)
678 {
679 if(strlen(pInfo[ i ][ LastDetection ]) <= 3 && pInfo[ i ][ TotalWarns ] <= 2)
680 {
681 continue;
682 }
683 else
684 {
685 count++;
686 format(dstring, sizeof(dstring), "%s%s({72FA80}%d{FFFFFF}) | {72FA80}%s{FFFFFF} | {72FA80}%s {FFFFFF}({72FA80}%d total detections{FFFFFF})\n",
687 dstring, pInfo[ i ][ Name ], i, pInfo[ i ][ IP ], pInfo[ i ][ LastDetection ], pInfo[ i ][ TotalWarns ]);
688 }
689
690 }
691 if(count)
692 {
693 ShowPlayerDialog(playerid, DIALOG_SETTINGS_ADMIN, DIALOG_STYLE_LIST, "{72FA80}GAMEGUARD: {FFFFFF}Detected Players", dstring, "Edit", "Back");
694 }
695 else
696 {
697 ShowPlayerDialog(playerid, DIALOG_SETTINGS_ADMIN, DIALOG_STYLE_LIST, "{72FA80}GAMEGUARD: {FFFFFF}Detected Players", "Nobody has been detected.", "Edit", "Back");
698 }
699 }
700 }
701 }
702 }
703 }
704 case DIALOG_SETTINGS_QUESTION:
705 {
706 new
707 string[ 228 ]
708 ;
709 if(response)
710 {
711 if(strlen(inputtext) >= 8)
712 {
713 new
714 Query[ 98 ]
715 ;
716 format(Query, sizeof(Query), "UPDATE users SET question = '%s' WHERE userid = %d", DB_Escape(inputtext), pInfo[ playerid ][ dbID ]);
717 db_query(Database, Query);
718
719 format(string, sizeof(string), "{72FA80}GAMEGUARD: {FFFFFF}Secret Question changed to {72FA80}%s", inputtext);
720 SendClientMessage(playerid, -1, string);
721
722 format(pInfo[ playerid ][ sQuestion ], 48, "%s", inputtext);
723 if(strlen(pInfo[ playerid ][ sQuestion ]) > 0 && strlen(pInfo[ playerid ][ sAnswer ]) > 0)
724 {
725 pInfo[ playerid ][ QASetup ] = true;
726 }
727 if(strlen(pInfo[ playerid ][ sAnswer ]) >= 1)
728 {
729 format(string, sizeof(string), "{FFFFFF}Enter a new {72FA80}Secret Answer {FFFFFF}below!\nYour current Secret Answer is {72FA80}%s",
730 pInfo[ playerid ][ sAnswer ]);
731 }
732 else
733 {
734 format(string, sizeof(string), "{FFFFFF}Set up your {72FA80}Secret Answer {FFFFFF}below!\n* Make sure you'll remember the question & the answer!");
735 }
736 ShowPlayerDialog(playerid, DIALOG_SETTINGS_ANSWER, DIALOG_STYLE_INPUT, "{72FA80}GAMEGUARD: {FFFFFF}Secret Answer", string, "Accept", "Back");
737 }
738 else
739 {
740 SendClientMessage(playerid, -1, "{72FA80}GAMEGUARD: {FFFFFF}The Question must have at-least 8 characters!");
741 if(pInfo[ playerid ][ RCONAdmin ] == false)
742 {
743 format(string, sizeof(string), "{FFFFFF}Secret Question - {72FA80}%s\n{FFFFFF}Secret Answer - {72FA80}%s",
744 pInfo[ playerid ][ sQuestion ], pInfo[ playerid ][ sAnswer ]);
745 }
746 else
747 {
748 format(string, sizeof(string), "{FFFFFF}Secret Question - {72FA80}%s\n{FFFFFF}Secret Answer - {72FA80}%s\n{FFFFFF}GameGuard Settings\nDetected Players",
749 pInfo[ playerid ][ sQuestion ], pInfo[ playerid ][ sAnswer ]);
750 }
751 ShowPlayerDialog(playerid, DIALOG_SETTINGS, DIALOG_STYLE_LIST, "{72FA80}GAMEGUARD: {FFFFFF}Account Settings", string, "Select", "Close");
752 }
753 }
754 else
755 {
756 if(pInfo[ playerid ][ RCONAdmin ] == false)
757 {
758 format(string, sizeof(string), "{FFFFFF}Secret Question - {72FA80}%s\n{FFFFFF}Secret Answer - {72FA80}%s",
759 pInfo[ playerid ][ sQuestion ], pInfo[ playerid ][ sAnswer ]);
760 }
761 else
762 {
763 format(string, sizeof(string), "{FFFFFF}Secret Question - {72FA80}%s\n{FFFFFF}Secret Answer - {72FA80}%s\n{FFFFFF}GameGuard Settings\nDetected Players",
764 pInfo[ playerid ][ sQuestion ], pInfo[ playerid ][ sAnswer ]);
765 }
766 ShowPlayerDialog(playerid, DIALOG_SETTINGS, DIALOG_STYLE_LIST, "{72FA80}GAMEGUARD: {FFFFFF}Account Settings", string, "Select", "Close");
767 }
768 }
769 case DIALOG_SETTINGS_ANSWER:
770 {
771 new
772 string[ 228 ]
773 ;
774 if(response)
775 {
776 if(strlen(inputtext) >= 1)
777 {
778 new
779 Query[ 98 ]
780 ;
781 format(Query, sizeof(Query), "UPDATE users SET answer = '%s' WHERE userid = %d", DB_Escape(inputtext), pInfo[ playerid ][ dbID ]);
782 db_query(Database, Query);
783
784 format(string, sizeof(string), "{72FA80}GAMEGUARD: {FFFFFF}Secret Answer changed to {72FA80}%s", inputtext);
785 SendClientMessage(playerid, -1, string);
786
787 format(pInfo[ playerid ][ sAnswer ], 48, "%s", inputtext);
788 if(strlen(pInfo[ playerid ][ sQuestion ]) > 0 && strlen(pInfo[ playerid ][ sAnswer ]) > 0)
789 {
790 pInfo[ playerid ][ QASetup ] = true;
791 }
792 if(pInfo[ playerid ][ RCONAdmin ] == false)
793 {
794 format(string, sizeof(string), "{FFFFFF}Secret Question - {72FA80}%s\n{FFFFFF}Secret Answer - {72FA80}%s",
795 pInfo[ playerid ][ sQuestion ], pInfo[ playerid ][ sAnswer ]);
796 }
797 else
798 {
799 format(string, sizeof(string), "{FFFFFF}Secret Question - {72FA80}%s\n{FFFFFF}Secret Answer - {72FA80}%s\n{FFFFFF}GameGuard Settings\nDetected Players",
800 pInfo[ playerid ][ sQuestion ], pInfo[ playerid ][ sAnswer ]);
801 }
802 ShowPlayerDialog(playerid, DIALOG_SETTINGS, DIALOG_STYLE_LIST, "{72FA80}GAMEGUARD: {FFFFFF}Account Settings", string, "Select", "Close");
803 }
804 else
805 {
806 SendClientMessage(playerid, -1, "{72FA80}GAMEGUARD: {FFFFFF}The Answer must have at-least 1 character!");
807 if(pInfo[ playerid ][ RCONAdmin ] == false)
808 {
809 format(string, sizeof(string), "{FFFFFF}Secret Question - {72FA80}%s\n{FFFFFF}Secret Answer - {72FA80}%s",
810 pInfo[ playerid ][ sQuestion ], pInfo[ playerid ][ sAnswer ]);
811 }
812 else
813 {
814 format(string, sizeof(string), "{FFFFFF}Secret Question - {72FA80}%s\n{FFFFFF}Secret Answer - {72FA80}%s\n{FFFFFF}GameGuard Settings\nDetected Players",
815 pInfo[ playerid ][ sQuestion ], pInfo[ playerid ][ sAnswer ]);
816 }
817 ShowPlayerDialog(playerid, DIALOG_SETTINGS, DIALOG_STYLE_LIST, "{72FA80}GAMEGUARD: {FFFFFF}Account Settings", string, "Select", "Close");
818 }
819 }
820 else
821 {
822 if(pInfo[ playerid ][ RCONAdmin ] == false)
823 {
824 format(string, sizeof(string), "{FFFFFF}Secret Question - {72FA80}%s\n{FFFFFF}Secret Answer - {72FA80}%s",
825 pInfo[ playerid ][ sQuestion ], pInfo[ playerid ][ sAnswer ]);
826 }
827 else
828 {
829 format(string, sizeof(string), "{FFFFFF}Secret Question - {72FA80}%s\n{FFFFFF}Secret Answer - {72FA80}%s\n{FFFFFF}GameGuard Settings\nDetected Players",
830 pInfo[ playerid ][ sQuestion ], pInfo[ playerid ][ sAnswer ]);
831 }
832 ShowPlayerDialog(playerid, DIALOG_SETTINGS, DIALOG_STYLE_LIST, "{72FA80}GAMEGUARD: {FFFFFF}Account Settings", string, "Select", "Close");
833 }
834 }
835 case DIALOG_SETTINGS_ADMIN:
836 {
837 new
838 string[ 386 ]
839 ;
840 if(response)
841 {
842 switch(listitem)
843 {
844 case 0:
845 {
846 pInfo[ playerid ][ EditingDialog ] = 1;
847
848 format(string, sizeof(string), "{FFFFFF}Type in a new value for the {72FA80}kick delay\n{FFFFFF}The current delay is: {72FA80}%d ms",
849 gInfo[ KICK_DELAY ]);
850
851 ShowPlayerDialog(playerid, DIALOG_SETTINGS_ADMIN2, DIALOG_STYLE_INPUT, "{72FA80}GAMEGUARD: {FFFFFF}GameGuard Settings", string, "Accept", "Back");
852 }
853 case 1:
854 {
855 pInfo[ playerid ][ EditingDialog ] = 2;
856
857 format(string, sizeof(string), "{FFFFFF}Type in a new value for the {72FA80}Max. Dialog Warnings\n{FFFFFF}The current value is: {72FA80}%d",
858 gInfo[ MAX_DIALOG_WARNS ]);
859
860 ShowPlayerDialog(playerid, DIALOG_SETTINGS_ADMIN2, DIALOG_STYLE_INPUT, "{72FA80}GAMEGUARD: {FFFFFF}GameGuard Settings", string, "Accept", "Back");
861 }
862 case 2:
863 {
864 pInfo[ playerid ][ EditingDialog ] = 3;
865
866 format(string, sizeof(string), "{FFFFFF}Type in a new value for the {72FA80}Max. Death Warnings\n{FFFFFF}The current value is: {72FA80}%d",
867 gInfo[ MAX_DEATH_WARNS ]);
868
869 ShowPlayerDialog(playerid, DIALOG_SETTINGS_ADMIN2, DIALOG_STYLE_INPUT, "{72FA80}GAMEGUARD: {FFFFFF}GameGuard Settings", string, "Accept", "Back");
870 }
871 case 3:
872 {
873 pInfo[ playerid ][ EditingDialog ] = 4;
874
875 format(string, sizeof(string), "{FFFFFF}Type in a new value for the {72FA80}Max. Text Warnings\n{FFFFFF}The current value is: {72FA80}%d",
876 gInfo[ MAX_TEXT_WARNS ]);
877
878 ShowPlayerDialog(playerid, DIALOG_SETTINGS_ADMIN2, DIALOG_STYLE_INPUT, "{72FA80}GAMEGUARD: {FFFFFF}GameGuard Settings", string, "Accept", "Back");
879 }
880 case 4:
881 {
882 pInfo[ playerid ][ EditingDialog ] = 5;
883
884 format(string, sizeof(string), "{FFFFFF}Type in a new value for the {72FA80}Max. State Warnings\n{FFFFFF}The current value is: {72FA80}%d",
885 gInfo[ MAX_STATE_WARNS ]);
886
887 ShowPlayerDialog(playerid, DIALOG_SETTINGS_ADMIN2, DIALOG_STYLE_INPUT, "{72FA80}GAMEGUARD: {FFFFFF}GameGuard Settings", string, "Accept", "Back");
888 }
889 case 5:
890 {
891 pInfo[ playerid ][ EditingDialog ] = 6;
892
893 format(string, sizeof(string), "{FFFFFF}Type in a new value for the {72FA80}Max. Shot Warnings\n{FFFFFF}The current value is: {72FA80}%d",
894 gInfo[ MAX_SHOT_WARNS ]);
895
896 ShowPlayerDialog(playerid, DIALOG_SETTINGS_ADMIN2, DIALOG_STYLE_INPUT, "{72FA80}GAMEGUARD: {FFFFFF}GameGuard Settings", string, "Accept", "Back");
897 }
898 case 6:
899 {
900 pInfo[ playerid ][ EditingDialog ] = 7;
901
902 format(string, sizeof(string), "{FFFFFF}Type in a new value for the {72FA80}Max. Vehicle Warnings\n{FFFFFF}The current value is: {72FA80}%d",
903 gInfo[ MAX_VEHICLE_WARNS ]);
904
905 ShowPlayerDialog(playerid, DIALOG_SETTINGS_ADMIN2, DIALOG_STYLE_INPUT, "{72FA80}GAMEGUARD: {FFFFFF}GameGuard Settings", string, "Accept", "Back");
906 }
907 case 7:
908 {
909 if(gInfo[ USE_RCON2 ] == true)
910 {
911 gInfo[ USE_RCON2 ] = false;
912 }
913 else
914 {
915 gInfo[ USE_RCON2 ] = true;
916 }
917
918 format(string, sizeof(string), "{FFFFFF}Kick Delay: {72FA80}%d ms\n{FFFFFF}Max. Dialog Warnings: {72FA80}%d\n{FFFFFF}Max. Death Warnings: {72FA80}%d\n{FFFFFF}Max. Text Warnings: {72FA80}%d\n{FFFFFF}Max. State Warnings: {72FA80}%d\n{FFFFFF}Max. Shot Warnings: {72FA80}%d\n{FFFFFF}Max. Vehicle Warnings: {72FA80}%d\n{FFFFFF}2nd RCON: {72FA80}%s\n{FFFFFF}GameGuard: {72FA80}%s\n{FFFFFF}DeSync: {72FA80}%s",
919 gInfo[ KICK_DELAY ], gInfo[ MAX_DIALOG_WARNS ], gInfo[ MAX_DEATH_WARNS ], gInfo[ MAX_TEXT_WARNS ], gInfo[ MAX_STATE_WARNS ], gInfo[ MAX_SHOT_WARNS ], gInfo[ MAX_VEHICLE_WARNS ], RCON2_STATUS(), GAMEGUARD_STATUS(), DESYNC_STATUS());
920
921 ShowPlayerDialog(playerid, DIALOG_SETTINGS_ADMIN, DIALOG_STYLE_LIST, "{72FA80}GAMEGUARD: {FFFFFF}GameGuard Settings", string, "Edit", "Back");
922 }
923 case 8:
924 {
925 if(gInfo[ ENABLED ] == true)
926 {
927 gInfo[ ENABLED ] = false;
928 }
929 else
930 {
931 gInfo[ ENABLED ] = true;
932 gInfo[ DESYNC ] = false;
933 }
934
935 format(string, sizeof(string), "{FFFFFF}Kick Delay: {72FA80}%d ms\n{FFFFFF}Max. Dialog Warnings: {72FA80}%d\n{FFFFFF}Max. Death Warnings: {72FA80}%d\n{FFFFFF}Max. Text Warnings: {72FA80}%d\n{FFFFFF}Max. State Warnings: {72FA80}%d\n{FFFFFF}Max. Shot Warnings: {72FA80}%d\n{FFFFFF}Max. Vehicle Warnings: {72FA80}%d\n{FFFFFF}2nd RCON: {72FA80}%s\n{FFFFFF}GameGuard: {72FA80}%s\n{FFFFFF}DeSync: {72FA80}%s",
936 gInfo[ KICK_DELAY ], gInfo[ MAX_DIALOG_WARNS ], gInfo[ MAX_DEATH_WARNS ], gInfo[ MAX_TEXT_WARNS ], gInfo[ MAX_STATE_WARNS ], gInfo[ MAX_SHOT_WARNS ], gInfo[ MAX_VEHICLE_WARNS ], RCON2_STATUS(), GAMEGUARD_STATUS(), DESYNC_STATUS());
937
938 ShowPlayerDialog(playerid, DIALOG_SETTINGS_ADMIN, DIALOG_STYLE_LIST, "{72FA80}GAMEGUARD: {FFFFFF}GameGuard Settings", string, "Edit", "Back");
939 }
940 case 9:
941 {
942 if(gInfo[ DESYNC ] == true)
943 {
944 gInfo[ DESYNC ] = false;
945 }
946 else
947 {
948 gInfo[ DESYNC ] = true;
949 gInfo[ ENABLED ] = false;
950 }
951
952 format(string, sizeof(string), "{FFFFFF}Kick Delay: {72FA80}%d ms\n{FFFFFF}Max. Dialog Warnings: {72FA80}%d\n{FFFFFF}Max. Death Warnings: {72FA80}%d\n{FFFFFF}Max. Text Warnings: {72FA80}%d\n{FFFFFF}Max. State Warnings: {72FA80}%d\n{FFFFFF}Max. Shot Warnings: {72FA80}%d\n{FFFFFF}Max. Vehicle Warnings: {72FA80}%d\n{FFFFFF}2nd RCON: {72FA80}%s\n{FFFFFF}GameGuard: {72FA80}%s\n{FFFFFF}DeSync: {72FA80}%s",
953 gInfo[ KICK_DELAY ], gInfo[ MAX_DIALOG_WARNS ], gInfo[ MAX_DEATH_WARNS ], gInfo[ MAX_TEXT_WARNS ], gInfo[ MAX_STATE_WARNS ], gInfo[ MAX_SHOT_WARNS ], gInfo[ MAX_VEHICLE_WARNS ], RCON2_STATUS(), GAMEGUARD_STATUS(), DESYNC_STATUS());
954
955 ShowPlayerDialog(playerid, DIALOG_SETTINGS_ADMIN, DIALOG_STYLE_LIST, "{72FA80}GAMEGUARD: {FFFFFF}GameGuard Settings", string, "Edit", "Back");
956 }
957 }
958 }
959 else
960 {
961 if(pInfo[ playerid ][ RCONAdmin ] == false)
962 {
963 format(string, sizeof(string), "{FFFFFF}Secret Question - {72FA80}%s\n{FFFFFF}Secret Answer - {72FA80}%s",
964 pInfo[ playerid ][ sQuestion ], pInfo[ playerid ][ sAnswer ]);
965 }
966 else
967 {
968 format(string, sizeof(string), "{FFFFFF}Secret Question - {72FA80}%s\n{FFFFFF}Secret Answer - {72FA80}%s\n{FFFFFF}GameGuard Settings\nDetected Players",
969 pInfo[ playerid ][ sQuestion ], pInfo[ playerid ][ sAnswer ]);
970 }
971 ShowPlayerDialog(playerid, DIALOG_SETTINGS, DIALOG_STYLE_LIST, "{72FA80}GAMEGUARD: {FFFFFF}Account Settings", string, "Select", "Close");
972 }
973 }
974 case DIALOG_SETTINGS_ADMIN2:
975 {
976 new
977 string[ 366 ]
978 ;
979 if(response)
980 {
981 switch(pInfo[ playerid ][ EditingDialog ])
982 {
983 case 1:
984 {
985 if(strval(inputtext) < 100 || strval(inputtext) > 500)
986 {
987 SendClientMessage(playerid, -1, "{72FA80}GAMEGUARD: {FFFFFF}The time must be between 100ms and 500ms!");
988 }
989 else
990 {
991 gInfo[ KICK_DELAY ] = strval(inputtext);
992
993 format(string, sizeof(string), "{72FA80}GAMEGUARD: {FFFFFF}You've set the Kick Delay to %d ms!", gInfo[ KICK_DELAY ]);
994 SendClientMessage(playerid, -1, string);
995 }
996 }
997 case 2:
998 {
999 if(strval(inputtext) < 3 || strval(inputtext) > 10)
1000 {
1001 SendClientMessage(playerid, -1, "{72FA80}GAMEGUARD: {FFFFFF}The value must be between 3 and 10!");
1002 }
1003 else
1004 {
1005 gInfo[ MAX_DIALOG_WARNS ] = strval(inputtext);
1006
1007 format(string, sizeof(string), "{72FA80}GAMEGUARD: {FFFFFF}You've set the Max. Dialog Warnings to %d!", gInfo[ MAX_DIALOG_WARNS ]);
1008 SendClientMessage(playerid, -1, string);
1009 }
1010 }
1011 case 3:
1012 {
1013 if(strval(inputtext) < 5 || strval(inputtext) > 15)
1014 {
1015 SendClientMessage(playerid, -1, "{72FA80}GAMEGUARD: {FFFFFF}The value must be between 5 and 15!");
1016 }
1017 else
1018 {
1019 gInfo[ MAX_DEATH_WARNS ] = strval(inputtext);
1020
1021 format(string, sizeof(string), "{72FA80}GAMEGUARD: {FFFFFF}You've set the Max. Death Warnings to %d!", gInfo[ MAX_DEATH_WARNS ]);
1022 SendClientMessage(playerid, -1, string);
1023 }
1024 }
1025 case 4:
1026 {
1027 if(strval(inputtext) < 5 || strval(inputtext) > 10)
1028 {
1029 SendClientMessage(playerid, -1, "{72FA80}GAMEGUARD: {FFFFFF}The value must be between 5 and 10!");
1030 }
1031 else
1032 {
1033 gInfo[ MAX_TEXT_WARNS ] = strval(inputtext);
1034
1035 format(string, sizeof(string), "{72FA80}GAMEGUARD: {FFFFFF}You've set the Max. Text Warnings to %d!", gInfo[ MAX_TEXT_WARNS ]);
1036 SendClientMessage(playerid, -1, string);
1037 }
1038 }
1039 case 5:
1040 {
1041 if(strval(inputtext) < 5 || strval(inputtext) > 15)
1042 {
1043 SendClientMessage(playerid, -1, "{72FA80}GAMEGUARD: {FFFFFF}The value must be between 5 and 15!");
1044 }
1045 else
1046 {
1047 gInfo[ MAX_STATE_WARNS ] = strval(inputtext);
1048
1049 format(string, sizeof(string), "{72FA80}GAMEGUARD: {FFFFFF}You've set the Max. State Warnings to %d!", gInfo[ MAX_STATE_WARNS ]);
1050 SendClientMessage(playerid, -1, string);
1051 }
1052 }
1053 case 6:
1054 {
1055 if(strval(inputtext) < 5 || strval(inputtext) > 15)
1056 {
1057 SendClientMessage(playerid, -1, "{72FA80}GAMEGUARD: {FFFFFF}The value must be between 5 and 15!");
1058 }
1059 else
1060 {
1061 gInfo[ MAX_SHOT_WARNS ] = strval(inputtext);
1062
1063 format(string, sizeof(string), "{72FA80}GAMEGUARD: {FFFFFF}You've set the Max. Shot Warnings to %d!", gInfo[ MAX_SHOT_WARNS ]);
1064 SendClientMessage(playerid, -1, string);
1065 }
1066 }
1067 case 7:
1068 {
1069 if(strval(inputtext) < 5 || strval(inputtext) > 10)
1070 {
1071 SendClientMessage(playerid, -1, "{72FA80}GAMEGUARD: {FFFFFF}The value must be between 5 and 10!");
1072 }
1073 else
1074 {
1075 gInfo[ MAX_VEHICLE_WARNS ] = strval(inputtext);
1076
1077 format(string, sizeof(string), "{72FA80}GAMEGUARD: {FFFFFF}You've set the Max. Vehicle Warnings to %d!", gInfo[ MAX_VEHICLE_WARNS ]);
1078 SendClientMessage(playerid, -1, string);
1079 }
1080 }
1081 }
1082 format(string, sizeof(string), "{FFFFFF}Kick Delay: {72FA80}%d ms\n{FFFFFF}Max. Dialog Warnings: {72FA80}%d\n{FFFFFF}Max. Death Warnings: {72FA80}%d\n{FFFFFF}Max. Text Warnings: {72FA80}%d\n{FFFFFF}Max. State Warnings: {72FA80}%d\n{FFFFFF}Max. Shot Warnings: {72FA80}%d\n{FFFFFF}Max. Vehicle Warnings: {72FA80}%d\n{FFFFFF}2nd RCON: {72FA80}%s\n{FFFFFF}GameGuard: {72FA80}%s\n{FFFFFF}DeSync: {72FA80}%s",
1083 gInfo[ KICK_DELAY ], gInfo[ MAX_DIALOG_WARNS ], gInfo[ MAX_DEATH_WARNS ], gInfo[ MAX_TEXT_WARNS ], gInfo[ MAX_STATE_WARNS ], gInfo[ MAX_SHOT_WARNS ], gInfo[ MAX_VEHICLE_WARNS ], RCON2_STATUS(), GAMEGUARD_STATUS(), DESYNC_STATUS());
1084
1085 ShowPlayerDialog(playerid, DIALOG_SETTINGS_ADMIN, DIALOG_STYLE_LIST, "{72FA80}GAMEGUARD: {FFFFFF}GameGuard Settings", string, "Edit", "Back");
1086 pInfo[ playerid ][ EditingDialog ] = 0;
1087 }
1088 else
1089 {
1090 format(string, sizeof(string), "{FFFFFF}Kick Delay: {72FA80}%d ms\n{FFFFFF}Max. Dialog Warnings: {72FA80}%d\n{FFFFFF}Max. Death Warnings: {72FA80}%d\n{FFFFFF}Max. Text Warnings: {72FA80}%d\n{FFFFFF}Max. State Warnings: {72FA80}%d\n{FFFFFF}Max. Shot Warnings: {72FA80}%d\n{FFFFFF}Max. Vehicle Warnings: {72FA80}%d\n{FFFFFF}2nd RCON: {72FA80}%s\n{FFFFFF}GameGuard: {72FA80}%s\n{FFFFFF}DeSync: {72FA80}%s",
1091 gInfo[ KICK_DELAY ], gInfo[ MAX_DIALOG_WARNS ], gInfo[ MAX_DEATH_WARNS ], gInfo[ MAX_TEXT_WARNS ], gInfo[ MAX_STATE_WARNS ], gInfo[ MAX_SHOT_WARNS ], gInfo[ MAX_VEHICLE_WARNS ], RCON2_STATUS(), GAMEGUARD_STATUS(), DESYNC_STATUS());
1092
1093 ShowPlayerDialog(playerid, DIALOG_SETTINGS_ADMIN, DIALOG_STYLE_LIST, "{72FA80}GAMEGUARD: {FFFFFF}GameGuard Settings", string, "Edit", "Back");
1094 }
1095 }
1096 }
1097 return 1;
1098}
1099
1100public OnPlayerStateChange(playerid, newstate, oldstate)
1101{
1102 if(gInfo[ ENABLED ] == true)
1103 {
1104 if(newstate == PLAYER_STATE_DRIVER || newstate == PLAYER_STATE_PASSENGER)
1105 {
1106 new
1107 vID
1108 ;
1109 vID = GetPlayerVehicleID(playerid);
1110
1111 if(vID != pInfo[ playerid ][ VehicleID ] && gettime()-pInfo[ playerid ][ LastEntered ] < 2)
1112 {
1113 format(pInfo[ playerid ][ LastDetection ], 9, "Car-Warp");
1114 pInfo[ playerid ][ StateWarns ]++, pInfo[ playerid ][ TotalWarns ]++;
1115 if(pInfo[ playerid ][ StateWarns ] >= gInfo[ MAX_STATE_WARNS ])
1116 {
1117 SendLeaveMessage(playerid, LEAVETYPE_CHEAT);
1118 BlockIpAddressEx(pInfo[ playerid ][ IP ], HOURS_1, playerid, LEAVETYPE_CHEAT);
1119 }
1120 }
1121 pInfo[ playerid ][ VehicleID ] = vID;
1122 pInfo[ playerid ][ LastEntered ] = gettime();
1123 }
1124 }
1125 return 1;
1126}
1127public OnPlayerWeaponShot(playerid, weaponid, hittype, hitid, Float:fX, Float:fY, Float:fZ)
1128{
1129 if(gInfo[ ENABLED ] == true)
1130 {
1131 if(weaponid != 38 && weaponid != 30 && weaponid != 31 && weaponid != 28 && weaponid != 32)
1132 {
1133 if(gettime() - pInfo[ playerid ][ LastShot ] <= 1)
1134 {
1135 pInfo[ playerid ][ TimesShot ]++;
1136 }
1137 else
1138 {
1139 pInfo[ playerid ][ TimesShot ] = 0;
1140 }
1141
1142 if(pInfo[ playerid ][ TimesShot ] >= gInfo[ MAX_BULLETS ])
1143 {
1144 format(pInfo[ playerid ][ LastDetection ], 11, "Rapid-Fire");
1145 if(pInfo[ playerid ][ BulletsToDesync ] >= 1)
1146 {
1147 pInfo[ playerid ][ BulletsToDesync ]--;
1148 return 0;
1149 }
1150 else
1151 {
1152 pInfo[ playerid ][ BulletsToDesync ] = gInfo[ MAX_DESYNC_BULLETS ];
1153 return 0;
1154 /*pInfo[ playerid ][ ShotWarns ]++, pInfo[ playerid ][ TotalWarns ]++;
1155 if(pInfo[ playerid ][ ShotWarns ] >= gInfo[ MAX_SHOT_WARNS ])
1156 {
1157 SendLeaveMessage(playerid, LEAVETYPE_CHEAT);
1158 BlockIpAddressEx(pInfo[ playerid ][ IP ], HOURS_1, playerid, LEAVETYPE_CHEAT);
1159 }*/
1160 }
1161 }
1162 pInfo[ playerid ][ LastShot ] = gettime();
1163 }
1164 if(hittype == BULLET_HIT_TYPE_PLAYER)
1165 {
1166 if(!IsPlayerInAnyVehicle(playerid) && !IsPlayerInAnyVehicle(hitid))
1167 {
1168 if(GetPlayerSurfingVehicleID(playerid) == INVALID_VEHICLE_ID && GetPlayerSurfingVehicleID(playerid) == INVALID_VEHICLE_ID)
1169 {
1170 new
1171 Float:fOriginX, Float:fOriginY, Float:fOriginZ,
1172 Float:fHitPosX, Float:fHitPosY, Float:fHitPosZ
1173 ;
1174 GetPlayerLastShotVectors(playerid, fOriginX, fOriginY, fOriginZ, fHitPosX, fHitPosY, fHitPosZ);
1175
1176 if(!IsPlayerInRangeOfPoint(hitid, 3.0, fX, fY, fZ))
1177 {
1178 format(pInfo[ playerid ][ LastDetection ], 14, "Silent Aimbot");
1179 if(pInfo[ playerid ][ BulletsToDesync ] >= 1)
1180 {
1181 pInfo[ playerid ][ BulletsToDesync ]--;
1182 return 0;
1183 }
1184 else
1185 {
1186 pInfo[ playerid ][ BulletsToDesync ] = gInfo[ MAX_DESYNC_BULLETS ];
1187 return 0;
1188 }
1189 }
1190 }
1191 }
1192 }
1193 }
1194 if(gInfo[ DESYNC ] == true)
1195 {
1196 if(pInfo[ playerid ][ TotalWarns ] > 6)
1197 {
1198 return 0;
1199 }
1200 }
1201 return 1;
1202}
1203
1204public OnVehicleMod(playerid, vehicleid, componentid)
1205{
1206 if(gInfo[ ENABLED ] == true)
1207 {
1208 if(GetPlayerInterior(playerid) == 0)
1209 {
1210 format(pInfo[ playerid ][ LastDetection ], 12, "Car modding");
1211 pInfo[ playerid ][ VehicleWarns ]++, pInfo[ playerid ][ TotalWarns ]++;
1212 if(pInfo[ playerid ][ VehicleWarns ] >= gInfo[ MAX_VEHICLE_WARNS ])
1213 {
1214 SendLeaveMessage(playerid, LEAVETYPE_CHEAT);
1215 BlockIpAddressEx(pInfo[ playerid ][ IP ], HOURS_1, playerid, LEAVETYPE_CHEAT);
1216 }
1217 return 0;
1218 }
1219 }
1220 if(gInfo[ DESYNC ] == true)
1221 {
1222 if(pInfo[ playerid ][ TotalWarns ] > 6)
1223 {
1224 return 0;
1225 }
1226 }
1227 return 1;
1228}
1229
1230public OnPlayerUpdate(playerid)
1231{
1232 if(gInfo[ DESYNC ] == true)
1233 {
1234 if(pInfo[ playerid ][ TotalWarns ] > 6)
1235 {
1236 return 0;
1237 }
1238 }
1239 return 1;
1240}
1241
1242CMD:settings(playerid, params[])
1243{
1244 new
1245 string[ 228 ]
1246 ;
1247 if(pInfo[ playerid ][ RCONAdmin ] == false)
1248 {
1249 format(string, sizeof(string), "{FFFFFF}Secret Question - {72FA80}%s\n{FFFFFF}Secret Answer - {72FA80}%s",
1250 pInfo[ playerid ][ sQuestion ], pInfo[ playerid ][ sAnswer ]);
1251
1252 ShowPlayerDialog(playerid, DIALOG_SETTINGS, DIALOG_STYLE_LIST, "{72FA80}GAMEGUARD: {FFFFFF}Account Settings", string, "Select", "Close");
1253 }
1254 else
1255 {
1256 format(string, sizeof(string), "{FFFFFF}Secret Question - {72FA80}%s\n{FFFFFF}Secret Answer - {72FA80}%s\n{FFFFFF}GameGuard Settings\nDetected Players",
1257 pInfo[ playerid ][ sQuestion ], pInfo[ playerid ][ sAnswer ]);
1258
1259 ShowPlayerDialog(playerid, DIALOG_SETTINGS, DIALOG_STYLE_LIST, "{72FA80}GAMEGUARD: {FFFFFF}Account Settings", string, "Select", "Close");
1260 }
1261 return 1;
1262}
1263
1264CMD:test(playerid,params[])
1265{
1266 RepairVehicle(GetPlayerVehicleID(playerid));
1267 SetVehicleVelocity(GetPlayerVehicleID(playerid),500,500,5);
1268 return 1;
1269}
1270DB_Escape(text[])
1271{
1272 new
1273 ret[80* 2],
1274 ch,
1275 i,
1276 j
1277 ;
1278 while ((ch = text[i++]) && j < sizeof (ret))
1279 {
1280 if (ch == '\'')
1281 {
1282 if (j < sizeof (ret) - 2)
1283 {
1284 ret[j++] = '\'';
1285 ret[j++] = '\'';
1286 }
1287 }
1288 else if (j < sizeof (ret))
1289 {
1290 ret[j++] = ch;
1291 }
1292 else
1293 {
1294 j++;
1295 }
1296 }
1297 ret[sizeof (ret) - 1] = '\0';
1298 return ret;
1299}
1300SendLeaveMessage(playerid, leavetype = LEAVETYPE_KICK)
1301{
1302 new
1303 string[ 108 ]
1304 ;
1305 switch(leavetype)
1306 {
1307 case LEAVETYPE_KICK:
1308 {
1309 format(string, sizeof(string), "{72FA80}GAMEGUARD: {FFFFFF}Player %s left the game ({72FA80}Kicked{FFFFFF})",
1310 pInfo[ playerid ][ Name ]);
1311 }
1312 case LEAVETYPE_EXPLOIT:
1313 {
1314 format(string, sizeof(string), "{72FA80}GAMEGUARD: {FFFFFF}Player %s left the game ({72FA80}Exploit Usage{FFFFFF})",
1315 pInfo[ playerid ][ Name ]);
1316 }
1317 case LEAVETYPE_CHEAT:
1318 {
1319 format(string, sizeof(string), "{72FA80}GAMEGUARD: {FFFFFF}Player %s left the game ({72FA80}Cheat Usage{FFFFFF})",
1320 pInfo[ playerid ][ Name ]);
1321 }
1322 case LEAVETYPE_UNTRUSTED:
1323 {
1324 format(string, sizeof(string), "{72FA80}GAMEGUARD: {FFFFFF}Player %s left the game ({72FA80}Untrusted{FFFFFF})",
1325 pInfo[ playerid ][ Name ]);
1326 }
1327 case LEAVETYPE_BANNED:
1328 {
1329 format(string, sizeof(string), "{72FA80}GAMEGUARD: {FFFFFF}Player %s left the game ({72FA80}Banned{FFFFFF})",
1330 pInfo[ playerid ][ Name ]);
1331 }
1332 }
1333 SendClientMessageToAll(-1, string);
1334}
1335
1336
1337BlockIpAddressEx(ip[], blocktime, playerid = INVALID_PLAYER_ID, blocktype = LEAVETYPE_BANNED)
1338{
1339 pInfo[ playerid ][ Untrusted ]++;
1340
1341 BlockIpAddress(ip, blocktime);
1342 if(playerid != INVALID_PLAYER_ID)
1343 {
1344 if(pInfo[ playerid ][ Untrusted ] >= gInfo[ MAX_UNTRUSTED_WARNS ])
1345 {
1346 switch(blocktype)
1347 {
1348 case LEAVETYPE_EXPLOIT: Ban_(playerid, "Exploit Infraction");
1349 case LEAVETYPE_CHEAT: Ban_(playerid, "Cheat Infraction");
1350 case LEAVETYPE_UNTRUSTED: Ban_(playerid, "Untrusted Account");
1351 case LEAVETYPE_ADVERTISEMENT: Ban_(playerid, "Advertising");
1352 case LEAVETYPE_FAIL_LOGIN: Ban_(playerid, "Failed RCON Login");
1353 }
1354 }
1355 else
1356 {
1357 SetTimerEx("KickEx", gInfo[ KICK_DELAY ], false, "i", playerid);
1358 }
1359 }
1360}
1361Ban_(playerid, reason[])
1362{
1363 new
1364 Query[ 224 ],
1365 day, month, year,
1366 second, minute, hour
1367 ;
1368 getdate(day, month, year);
1369 gettime(hour, minute, second);
1370
1371 format(Query, sizeof( Query ), "INSERT INTO banned (bannedname, bannedip, banreason, date, time) VALUES ('%s', '%s', '%s', '%d/%d/%d', '%d:%d:%d')",
1372 DB_Escape(pInfo[ playerid ][ Name ]), pInfo[ playerid ][ IP ], DB_Escape(reason), day, month, year, hour, minute, second);
1373
1374 db_query(Database, Query);
1375
1376 SetTimerEx("KickEx", gInfo[ KICK_DELAY ], false, "i", playerid);
1377}
1378
1379RCON2_STATUS()
1380{
1381 new
1382 status[ 9 ]
1383 ;
1384 switch(gInfo[ USE_RCON2 ])
1385 {
1386 case true:
1387 {
1388 status = "Enabled";
1389 }
1390 case false:
1391 {
1392 status = "Disabled";
1393 }
1394 }
1395 return status;
1396}
1397GAMEGUARD_STATUS()
1398{
1399 new
1400 status[ 9 ]
1401 ;
1402 switch(gInfo[ ENABLED ])
1403 {
1404 case true:
1405 {
1406 status = "Enabled";
1407 }
1408 case false:
1409 {
1410 status = "Disabled";
1411 }
1412 }
1413 return status;
1414}
1415DESYNC_STATUS()
1416{
1417 new
1418 status[ 9 ]
1419 ;
1420 switch(gInfo[ DESYNC ])
1421 {
1422 case true:
1423 {
1424 status = "Enabled";
1425 }
1426 case false:
1427 {
1428 status = "Disabled";
1429 }
1430 }
1431 return status;
1432}
1433
1434
1435forward KickEx(playerid);
1436public KickEx(playerid)
1437{
1438 Kick(playerid);
1439 return 1;
1440}
1441
1442/*GetPlayerSpeed(playerid)
1443{
1444 new Float:velocity[ 4 ];
1445 if(IsPlayerInAnyVehicle(playerid))
1446 {
1447 GetVehicleVelocity(GetPlayerVehicleID(playerid), velocity[ 0 ], velocity[ 1 ], velocity[ 2 ]);
1448 }
1449 else
1450 {
1451 GetPlayerVelocity(playerid, velocity[ 0 ], velocity[ 1 ], velocity[ 2 ]);
1452 }
1453 velocity[3] = floatsqroot(floatpower(floatabs(velocity[ 0 ]), 2.0) + floatpower(floatabs(velocity[ 1 ]), 2.0) + floatpower(floatabs(velocity[ 2 ]), 2.0)) * 181.03625;
1454 return floatround(velocity[ 3 ]);
1455}
1456
1457forward SpeedCheck(playerid);
1458public SpeedCheck(playerid)
1459{
1460 if(pInfo[ playerid ][ LoggedIn ] == false) return 1;
1461 else if(gInfo[ ENABLED ] == false)
1462 {
1463 KillTimer(pInfo[ playerid ][ Timer ]);
1464 pInfo[ playerid ][ Timer ] = -1;
1465 }
1466 else
1467 {
1468 if(IsPlayerInAnyVehicle( playerid ))
1469 {
1470 if(GetPlayerSpeed( playerid ) >= 271)
1471 {
1472 new
1473 vehicleID,
1474 Float:velocity[ 3 ]
1475 ;
1476 vehicleID = GetPlayerVehicleID(playerid);
1477 GetVehicleVelocity(vehicleID, velocity[ 0 ], velocity[ 1 ], velocity[ 2 ]);
1478 do
1479 {
1480 SetVehicleVelocity(vehicleID, velocity[ 0 ]/2, velocity[ 1 ]/2, velocity[ 2 ]/2);
1481 }
1482 while(GetPlayerSpeed( playerid ) >= 271);
1483 }
1484 }
1485 }
1486 return 1;
1487}*/