#define FILTERSCRIPT #include #include #include #include #define RCON_PASSWORD "changeme" #define LEAVETYPE_KICK 0 #define LEAVETYPE_EXPLOIT 1 #define LEAVETYPE_CHEAT 2 #define LEAVETYPE_UNTRUSTED 3 #define LEAVETYPE_BANNED 4 #define LEAVETYPE_ADVERTISEMENT 5 #define LEAVETYPE_FAIL_LOGIN 6 #define MINUTES_5 300000 #define MINUTES_10 600000 #define MINUTES_15 900000 #define MINUTES_30 1800000 #define HOURS_1 3600000 #define MAX_PLAYER_IP 16 //#define DIALOG_CLOSEALL -1 #define DIALOG_REQUESTANSWER 2000 #define DIALOG_RCON 2001 #define DIALOG_SETTINGS 2002 #define DIALOG_SETTINGS_QUESTION 2003 #define DIALOG_SETTINGS_ANSWER 2004 #define DIALOG_SETTINGS_ADMIN 2005 #define DIALOG_SETTINGS_ADMIN2 2006 enum playerInfo { dbID, Untrusted, TimesDied, DialogWarns, DeathWarns, TextWarns, StateWarns, ShotWarns, VehicleWarns, TotalWarns, TimesShot, LastShot, BulletsToDesync, VehicleID, LastEntered, EditingDialog, Name[ 24 ], IP[ 16 ], sQuestion[ 48 ], sAnswer[ 48 ], LastDetection[ 16 ], bool:QASetup, bool:RequestAnswer, bool:LoggedIn, bool:AlreadyConnected, bool:RCONAdmin }; enum gameguardInfo { KICK_DELAY, MAX_UNTRUSTED_WARNS, MAX_DIALOG_WARNS, MAX_TEXT_WARNS, MAX_DEATH_WARNS, MAX_STATE_WARNS, MAX_VEHICLE_WARNS, MAX_SHOT_WARNS, MAX_DESYNC_BULLETS, MAX_BULLETS, bool:ENABLED, bool:DESYNC, bool:USE_RCON2 }; new pInfo[ MAX_PLAYERS ][ playerInfo ], gInfo[ gameguardInfo ] ; new DB:Database ; #if defined FILTERSCRIPT public OnFilterScriptInit() { print("\nGameGuard: loading"); Database = db_open("gameguard.db"); // ---- USERS db_query(Database, "CREATE TABLE IF NOT EXISTS users (userid INTEGER PRIMARY KEY AUTOINCREMENT,\ username VARCHAR(24),\ ip VARCHAR(16),\ untrusted INTEGER DEFAULT 0 NOT NULL,\ laston INTEGER DEFAULT 0 NOT NULL,\ question VARCHAR(48),\ answer VARCHAR(48)\ )"); // ---- BANS db_query(Database, "CREATE TABLE IF NOT EXISTS banned (banid INTEGER PRIMARY KEY AUTOINCREMENT,\ bannedname VARCHAR(24),\ bannedip VARCHAR(16),\ banreason VARCHAR(48),\ date INTEGER DEFAULT 0 NOT NULL,\ time INTEGER DEFAULT 0 NOT NULL\ )"); if(!strcmp(RCON_PASSWORD, "changeme")) { print("GameGuard: Please change 'RCON_PASSWORD' in the script!"); print("GameGuard: RCON is currently disabled."); } gInfo[ KICK_DELAY ] = 300; //300 ms gInfo[ MAX_DIALOG_WARNS ] = 5, gInfo[ MAX_DEATH_WARNS ] = 5, gInfo[ MAX_UNTRUSTED_WARNS ] = 5; gInfo[ MAX_TEXT_WARNS ] = 5, gInfo[ MAX_STATE_WARNS ] = 5, gInfo[ MAX_SHOT_WARNS ] = 5; gInfo[ MAX_VEHICLE_WARNS ] = 5; gInfo[ MAX_DESYNC_BULLETS ] = 5, gInfo[ MAX_BULLETS ] = 10; gInfo[ ENABLED ] = true, gInfo[ DESYNC ] = false; gInfo[ USE_RCON2 ] = true; print("- - - - - - - - SETTINGS - - - - - - - -"); printf("GameGuard: 2nd RCON Password is set to %s", RCON_PASSWORD); printf("GameGuard: Max Untrusted Warns is set to %d", gInfo[ MAX_UNTRUSTED_WARNS ]); printf("GameGuard: Kick Delay is set to %d ms", gInfo[ KICK_DELAY ]); printf("GameGuard: Max Bullets is set to %d (per second)", gInfo[ MAX_BULLETS ]); printf("GameGuard: Max Dialog Warns is set to %d", gInfo[ MAX_DIALOG_WARNS ]); printf("GameGuard: Max Death Warns is set to %d", gInfo[ MAX_DEATH_WARNS ]); printf("GameGuard: Max Text Warns is set to %d", gInfo[ MAX_TEXT_WARNS ]); printf("GameGuard: Max State Warns is set to %d", gInfo[ MAX_STATE_WARNS ]); printf("GameGuard: Max Vehicle Warns is set to %d", gInfo[ MAX_VEHICLE_WARNS ]); printf("GameGuard: Max Shot Warns is set to %d", gInfo[ MAX_SHOT_WARNS ]); printf("GameGuard: Max Desync Bullets is set to %d", gInfo[ MAX_DESYNC_BULLETS ]); foreach(Player, i) { OnPlayerConnect(i); if(IsPlayerAdmin(i)) { 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"); } } return 1; } public OnFilterScriptExit() { print("GameGuard: unloading"); db_close(Database); return 1; } #endif public OnPlayerConnect(playerid) { if(gInfo[ ENABLED ] == true) { GetPlayerName(playerid, pInfo[ playerid ][ Name ], MAX_PLAYER_NAME+1); GetPlayerIp(playerid, pInfo[ playerid ][ IP ], MAX_PLAYER_IP+1); format(pInfo[ playerid ][ LastDetection ], 3, "\0"); if(!IsPlayerNPC(playerid)) { SendClientMessage(playerid, -1, "{72FA80}GAMEGUARD: {FFFFFF}GameGuard is enabled in this server."); if(pInfo[ playerid ][ AlreadyConnected ] == false) { new Query[ 128 ], string[ 118 ], DBResult:Result ; pInfo[ playerid ][ AlreadyConnected ] = true; format(Query, sizeof(Query), "SELECT * FROM banned WHERE bannedname = '%s' OR bannedip = '%s'", DB_Escape(pInfo[ playerid ][ Name ]), pInfo[ playerid ][ IP ]); Result = db_query(Database, Query); if(db_num_rows(Result)) { new banreason[ 48 ] ; db_get_field_assoc(Result, "banreason", banreason, 48); format(string, sizeof(string), "{72FA80}GAMEGUARD: {FFFFFF}This account is banned: {72FA80}%s{FFFFFF}.", banreason); SendClientMessage(playerid, -1, string), SendLeaveMessage(playerid, LEAVETYPE_BANNED); BlockIpAddressEx(pInfo[ playerid ][ IP ], HOURS_1, playerid); } else { format(Query, sizeof(Query), "SELECT * FROM users WHERE username = '%s' LIMIT 0, 1", DB_Escape(pInfo[ playerid ][ Name ])); Result = db_query(Database, Query); if(db_num_rows(Result)) { db_get_field_assoc(Result, "untrusted", Query, 3); pInfo[ playerid ][ Untrusted ] = strval(Query); if(pInfo[ playerid ][ Untrusted ] < gInfo[ MAX_UNTRUSTED_WARNS ]) { db_get_field_assoc(Result, "userid", Query, 8); pInfo[ playerid ][ dbID ] = strval(Query); db_get_field_assoc(Result, "question", pInfo[ playerid ][ sQuestion ], 48); db_get_field_assoc(Result, "answer", pInfo[ playerid ][ sAnswer ], 48); if(strlen(pInfo[ playerid ][ sQuestion ]) >= 7 && strlen(pInfo[ playerid ][ sAnswer ]) >= 1) { pInfo[ playerid ][ QASetup ] = true; new tempip[ 16 ] ; db_get_field_assoc(Result, "ip", tempip, MAX_PLAYER_IP); if(strcmp(tempip, pInfo[ playerid ][ IP ], true)) { pInfo[ playerid ][ RequestAnswer ] = true; pInfo[ playerid ][ LoggedIn ] = false; } else { pInfo[ playerid ][ RequestAnswer ] = false; pInfo[ playerid ][ LoggedIn ] = true; } } else { SendClientMessage(playerid, -1, "{72FA80}GAMEGUARD: {FFFFFF}For your account safety, setup a secret question in /settings!"); format(pInfo[ playerid ][ sQuestion ], 4, "N/A"); format(pInfo[ playerid ][ sAnswer ], 4, "N/A"); } } else if(pInfo[ playerid ][ Untrusted ] >= gInfo[ MAX_UNTRUSTED_WARNS ]) { SendLeaveMessage(playerid, LEAVETYPE_UNTRUSTED); Ban_(playerid, "Untrusted"); } } else { new year, month, day ; getdate(year, month, day); format(Query, sizeof(Query), "INSERT INTO users (username, ip, laston) VALUES ('%s', '%s', '%d/%d/%d')", DB_Escape(pInfo[ playerid ][ Name ]), pInfo[ playerid ][ IP ], year, month, day); db_query(Database, Query); format(Query, sizeof(Query), "SELECT userid FROM users WHERE username = '%s' LIMIT 0, 1", DB_Escape(pInfo[ playerid ][ Name ])); Result = db_query(Database, Query); if(db_num_rows(Result)) { db_get_field_assoc(Result, "userid", Query, 8); pInfo[ playerid ][ dbID ] = strval(Query); pInfo[ playerid ][ LoggedIn ] = true; } format(pInfo[ playerid ][ sQuestion ], 4, "N/A"); format(pInfo[ playerid ][ sAnswer ], 4, "N/A"); } } db_free_result(Result); } else { SendLeaveMessage(playerid, LEAVETYPE_EXPLOIT); BlockIpAddressEx(pInfo[ playerid ][ IP ], HOURS_1, playerid, LEAVETYPE_EXPLOIT); } } else { if(strcmp(pInfo[ playerid ][ IP ], "127.0.0.1")) { SendLeaveMessage(playerid, LEAVETYPE_EXPLOIT); BlockIpAddressEx(pInfo[ playerid ][ IP ], HOURS_1, playerid, LEAVETYPE_EXPLOIT); } } } return 1; } public OnPlayerDisconnect(playerid, reason) { if(gInfo[ ENABLED ] == true) { if(pInfo[ playerid ][ LoggedIn ] == true) { new Query[ 128 ], year, month, day ; getdate(year, month, day); format(Query, sizeof(Query), "UPDATE users SET ip = '%s', untrusted = %d, laston = '%d/%d/%d' WHERE userid = %d", pInfo[ playerid ][ IP ], pInfo[ playerid ][ Untrusted ], year, month, day, pInfo[ playerid ][ dbID ]); db_query(Database, Query); } } for(new i; i < _: playerInfo; ++i) pInfo[ playerid ][ playerInfo: i ] = 0; return 1; } public OnPlayerRequestSpawn(playerid) { if(gInfo[ ENABLED ] == true) { if(pInfo[ playerid ][ RequestAnswer ] == true && pInfo[ playerid ][ QASetup ] == true) { new string[ 228 ] ; SendClientMessage(playerid, -1, "{72FA80}GAMEGUARD: {FFFFFF}IP's differ - Type the answer of your secret question."); 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}", pInfo[ playerid ][ IP ], pInfo[ playerid ][ sQuestion ]); ShowPlayerDialog(playerid, DIALOG_REQUESTANSWER, DIALOG_STYLE_INPUT, "{72FA80}GAMEGUARD: {FFFFFF}Secret Answer", string, "Accept", "Cancel"); return 0; } } if(gInfo[ DESYNC ] == true) { if(pInfo[ playerid ][ TotalWarns ] > 6) { return 0; } } return 1; } public OnPlayerSpawn(playerid) { if(gInfo[ ENABLED ] == true) { if(pInfo[ playerid ][ RequestAnswer ] == true) { SendLeaveMessage(playerid, LEAVETYPE_KICK); BlockIpAddressEx(pInfo[ playerid ][ IP ], MINUTES_5, playerid); } } return 1; } public OnPlayerDeath(playerid, killerid, reason) { if(gInfo[ ENABLED ] == true) { pInfo[ playerid ][ TimesDied ]++; if(pInfo[ playerid ][ TimesDied ] > 2) { pInfo[ playerid ][ TimesDied ] = 0, pInfo[ playerid ][ DeathWarns ]++, pInfo[ playerid ][ TotalWarns ]++; if(pInfo[ playerid ][ DeathWarns ] >= gInfo[ MAX_DEATH_WARNS ]) { SendLeaveMessage(playerid, LEAVETYPE_CHEAT); BlockIpAddressEx(pInfo[ playerid ][ IP ], HOURS_1, playerid, LEAVETYPE_CHEAT); } format(pInfo[ playerid ][ LastDetection ], 10, "Fake-Kill"); } } if(gInfo[ DESYNC ] == true) { if(pInfo[ playerid ][ TotalWarns ] > 6) { return 0; } } return 1; } public OnPlayerCommandReceived(playerid, cmdtext[]) { if(gInfo[ ENABLED ] == true) { if(gInfo[ USE_RCON2 ] == true) { if(IsPlayerAdmin(playerid) && pInfo[ playerid ][ RCONAdmin ] == false) { return 0; } } else if(pInfo[ playerid ][ LoggedIn ] == false) { return 0; } if(strfind(".", cmdtext, true)) { new dots, numbers, colons ; for(new i; i < strlen(cmdtext); i++) { if(cmdtext[i] == '.') { dots++; } else if(cmdtext[i] <= '9' || cmdtext[i] >= '0') { numbers++; } else if(cmdtext[i] == ':') { colons++; } else continue; } if(dots == 3 && colons >= 0 && numbers >= 6) { format(pInfo[ playerid ][ LastDetection ], 15, "Advertisement"); pInfo[ playerid ][ TextWarns ]++, pInfo[ playerid ][ TotalWarns ]++; if(pInfo[ playerid ][ TextWarns ] < gInfo[ MAX_TEXT_WARNS ] ) { return 0; } else { BlockIpAddressEx(pInfo[ playerid ][ IP ], MINUTES_30, playerid, LEAVETYPE_ADVERTISEMENT); SendLeaveMessage(playerid, LEAVETYPE_KICK); return 0; } } } } if(gInfo[ DESYNC ] == true) { if(pInfo[ playerid ][ TotalWarns ] > 6) { return 0; } } return 1; } public OnPlayerText(playerid, text[]) { if(gInfo[ ENABLED ] == true)// && gInfo[ USE_RCON2 ] == true) { if(gInfo[ USE_RCON2 ] == true) { if(IsPlayerAdmin(playerid) && pInfo[ playerid ][ RCONAdmin ] == false) { return 0; } } else if(pInfo[ playerid ][ LoggedIn ] == false) { return 0; } if(strfind(".", text, true)) { new dots, numbers, colons ; for(new i; i < strlen(text); i++) { if(text[i] == '.') { dots++; } else if(text[i] <= '9' || text[i] >= '0') { numbers++; } else if(text[i] == ':') { colons++; } else continue; } if(dots == 3 && colons >= 0 && numbers >= 6) { format(pInfo[ playerid ][ LastDetection ], 15, "Advertisement"); pInfo[ playerid ][ TextWarns ]++, pInfo[ playerid ][ TotalWarns ]++; if(pInfo[ playerid ][ TextWarns ] < gInfo[ MAX_TEXT_WARNS ] ) { SendClientMessage(playerid, -1, "{72FA80}GAMEGUARD: {FFFFFF}Advertising is not allowed!"); } else { BlockIpAddressEx(pInfo[ playerid ][ IP ], MINUTES_30, playerid, LEAVETYPE_ADVERTISEMENT); SendLeaveMessage(playerid, LEAVETYPE_KICK); } return 0; } } } if(gInfo[ DESYNC ] == true) { if(pInfo[ playerid ][ TotalWarns ] > 6) { return 0; } } return 1; } public OnRconLoginAttempt(ip[], password[], success) { if(strcmp(RCON_PASSWORD, "changeme")) { if(gInfo[ ENABLED ] == true) { if(!success) { foreach(Player, i) { if(strcmp(ip, pInfo[ i ][ IP ])) continue; else BlockIpAddressEx(ip, HOURS_1, i, LEAVETYPE_FAIL_LOGIN), SendLeaveMessage(i, LEAVETYPE_KICK); } } else { if(gInfo[ USE_RCON2 ] == true) { foreach(Player, i) { if(strcmp(ip, pInfo[ i ][ IP ])) continue; 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"); } } } } } else { foreach(Player, i) { if(strcmp(ip, pInfo[ i ][ IP ])) continue; else BlockIpAddressEx(ip, MINUTES_5, i, LEAVETYPE_KICK), SendLeaveMessage(i, LEAVETYPE_KICK), SendClientMessage(i, -1, "{72FA80}GAMEGUARD: {FFFFFF}RCON is disabled!"); } } return 1; } public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) { switch(dialogid) { case DIALOG_REQUESTANSWER: { if(response) { if(strcmp(pInfo[ playerid ][ sAnswer ], inputtext, false)) { new string[ 228 ] ; pInfo[ playerid ][ DialogWarns ]++, pInfo[ playerid ][ TotalWarns ]++; format(string, sizeof(string), "{72FA80}GAMEGUARD: {FFFFFF}Invalid Secret Answer. (%d/%d)", pInfo[ playerid ][ DialogWarns ], gInfo[ MAX_DIALOG_WARNS ]); SendClientMessage(playerid, -1, string); if(pInfo[ playerid ][ DialogWarns ] < gInfo[ MAX_DIALOG_WARNS ]) { 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}", pInfo[ playerid ][ IP ], pInfo[ playerid ][ sQuestion ]); ShowPlayerDialog(playerid, DIALOG_REQUESTANSWER, DIALOG_STYLE_INPUT, "{72FA80}GAMEGUARD: {FFFFFF}Invalid Secret Answer", string, "Accept", "Cancel"); } else { SendLeaveMessage(playerid, LEAVETYPE_KICK); BlockIpAddressEx(pInfo[ playerid ][ IP ], MINUTES_5, playerid); } } else { pInfo[ playerid ][ RequestAnswer ] = false; pInfo[ playerid ][ LoggedIn ] = true; SendClientMessage(playerid, -1, "{72FA80}GAMEGUARD: {FFFFFF}Secret Answer accepted!"); } } else { SendLeaveMessage(playerid, LEAVETYPE_KICK); BlockIpAddressEx(pInfo[ playerid ][ IP ], MINUTES_15, playerid); } } case DIALOG_RCON: { if(gInfo[ USE_RCON2 ] == true) { if(response) { if(strcmp(inputtext, RCON_PASSWORD)) { new string[ 57 ] ; pInfo[ playerid ][ DialogWarns ]++, pInfo[ playerid ][ TotalWarns ]++; format(string, sizeof(string), "{72FA80}GAMEGUARD: {FFFFFF}Invalid RCON Password. (%d/%d)", pInfo[ playerid ][ DialogWarns ], gInfo[ MAX_DIALOG_WARNS ]); SendClientMessage(playerid, -1, string); if(pInfo[ playerid ][ DialogWarns ] < gInfo[ MAX_DIALOG_WARNS ]) { 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"); } else { SendLeaveMessage(playerid, LEAVETYPE_KICK); BlockIpAddressEx(pInfo[ playerid ][ IP ], HOURS_1, playerid, LEAVETYPE_FAIL_LOGIN); } } else { pInfo[ playerid ][ RCONAdmin ] = true; SendClientMessage(playerid, -1, "{72FA80}GAMEGUARD: {FFFFFF}Password Accepted."); } } else { SendLeaveMessage(playerid, LEAVETYPE_KICK); BlockIpAddressEx(pInfo[ playerid ][ IP ], HOURS_1, playerid, LEAVETYPE_FAIL_LOGIN); } } } case DIALOG_SETTINGS: { if(response) { new string[ 386 ] ; switch(listitem) { case 0: { if(strlen(pInfo[ playerid ][ sQuestion ]) >= 7) { format(string, sizeof(string), "{FFFFFF}Enter a new {72FA80}Secret Question {FFFFFF}below!\nYour current Secret Question is {72FA80}%s", pInfo[ playerid ][ sQuestion ]); } else { format(string, sizeof(string), "{FFFFFF}Set up your {72FA80}Secret Question {FFFFFF}below!\n* Make sure you'll remember the question & the answer!"); } ShowPlayerDialog(playerid, DIALOG_SETTINGS_QUESTION, DIALOG_STYLE_INPUT, "{72FA80}GAMEGUARD: {FFFFFF}Secret Question", string, "Accept", "Back"); } case 1: { if(strlen(pInfo[ playerid ][ sAnswer ]) >= 1) { format(string, sizeof(string), "{FFFFFF}Enter a new {72FA80}Secret Answer {FFFFFF}below!\nYour current Secret Answer is {72FA80}%s", pInfo[ playerid ][ sAnswer ]); } else { format(string, sizeof(string), "{FFFFFF}Set up your {72FA80}Secret Answer {FFFFFF}below!\n* Make sure you'll remember the question & the answer!"); } ShowPlayerDialog(playerid, DIALOG_SETTINGS_ANSWER, DIALOG_STYLE_INPUT, "{72FA80}GAMEGUARD: {FFFFFF}Secret Answer", string, "Accept", "Back"); } case 2: { if(pInfo[ playerid ][ RCONAdmin ] == true) { 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", 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()); ShowPlayerDialog(playerid, DIALOG_SETTINGS_ADMIN, DIALOG_STYLE_LIST, "{72FA80}GAMEGUARD: {FFFFFF}GameGuard Settings", string, "Edit", "Back"); } } case 3: { if(pInfo[ playerid ][ RCONAdmin ] == true) { new dstring[ 999 ], count ; foreach(Player, i) { if(strlen(pInfo[ i ][ LastDetection ]) <= 3 && pInfo[ i ][ TotalWarns ] <= 2) { continue; } else { count++; format(dstring, sizeof(dstring), "%s%s({72FA80}%d{FFFFFF}) | {72FA80}%s{FFFFFF} | {72FA80}%s {FFFFFF}({72FA80}%d total detections{FFFFFF})\n", dstring, pInfo[ i ][ Name ], i, pInfo[ i ][ IP ], pInfo[ i ][ LastDetection ], pInfo[ i ][ TotalWarns ]); } } if(count) { ShowPlayerDialog(playerid, DIALOG_SETTINGS_ADMIN, DIALOG_STYLE_LIST, "{72FA80}GAMEGUARD: {FFFFFF}Detected Players", dstring, "Edit", "Back"); } else { ShowPlayerDialog(playerid, DIALOG_SETTINGS_ADMIN, DIALOG_STYLE_LIST, "{72FA80}GAMEGUARD: {FFFFFF}Detected Players", "Nobody has been detected.", "Edit", "Back"); } } } } } } case DIALOG_SETTINGS_QUESTION: { new string[ 228 ] ; if(response) { if(strlen(inputtext) >= 8) { new Query[ 98 ] ; format(Query, sizeof(Query), "UPDATE users SET question = '%s' WHERE userid = %d", DB_Escape(inputtext), pInfo[ playerid ][ dbID ]); db_query(Database, Query); format(string, sizeof(string), "{72FA80}GAMEGUARD: {FFFFFF}Secret Question changed to {72FA80}%s", inputtext); SendClientMessage(playerid, -1, string); format(pInfo[ playerid ][ sQuestion ], 48, "%s", inputtext); if(strlen(pInfo[ playerid ][ sQuestion ]) > 0 && strlen(pInfo[ playerid ][ sAnswer ]) > 0) { pInfo[ playerid ][ QASetup ] = true; } if(strlen(pInfo[ playerid ][ sAnswer ]) >= 1) { format(string, sizeof(string), "{FFFFFF}Enter a new {72FA80}Secret Answer {FFFFFF}below!\nYour current Secret Answer is {72FA80}%s", pInfo[ playerid ][ sAnswer ]); } else { format(string, sizeof(string), "{FFFFFF}Set up your {72FA80}Secret Answer {FFFFFF}below!\n* Make sure you'll remember the question & the answer!"); } ShowPlayerDialog(playerid, DIALOG_SETTINGS_ANSWER, DIALOG_STYLE_INPUT, "{72FA80}GAMEGUARD: {FFFFFF}Secret Answer", string, "Accept", "Back"); } else { SendClientMessage(playerid, -1, "{72FA80}GAMEGUARD: {FFFFFF}The Question must have at-least 8 characters!"); if(pInfo[ playerid ][ RCONAdmin ] == false) { format(string, sizeof(string), "{FFFFFF}Secret Question - {72FA80}%s\n{FFFFFF}Secret Answer - {72FA80}%s", pInfo[ playerid ][ sQuestion ], pInfo[ playerid ][ sAnswer ]); } else { format(string, sizeof(string), "{FFFFFF}Secret Question - {72FA80}%s\n{FFFFFF}Secret Answer - {72FA80}%s\n{FFFFFF}GameGuard Settings\nDetected Players", pInfo[ playerid ][ sQuestion ], pInfo[ playerid ][ sAnswer ]); } ShowPlayerDialog(playerid, DIALOG_SETTINGS, DIALOG_STYLE_LIST, "{72FA80}GAMEGUARD: {FFFFFF}Account Settings", string, "Select", "Close"); } } else { if(pInfo[ playerid ][ RCONAdmin ] == false) { format(string, sizeof(string), "{FFFFFF}Secret Question - {72FA80}%s\n{FFFFFF}Secret Answer - {72FA80}%s", pInfo[ playerid ][ sQuestion ], pInfo[ playerid ][ sAnswer ]); } else { format(string, sizeof(string), "{FFFFFF}Secret Question - {72FA80}%s\n{FFFFFF}Secret Answer - {72FA80}%s\n{FFFFFF}GameGuard Settings\nDetected Players", pInfo[ playerid ][ sQuestion ], pInfo[ playerid ][ sAnswer ]); } ShowPlayerDialog(playerid, DIALOG_SETTINGS, DIALOG_STYLE_LIST, "{72FA80}GAMEGUARD: {FFFFFF}Account Settings", string, "Select", "Close"); } } case DIALOG_SETTINGS_ANSWER: { new string[ 228 ] ; if(response) { if(strlen(inputtext) >= 1) { new Query[ 98 ] ; format(Query, sizeof(Query), "UPDATE users SET answer = '%s' WHERE userid = %d", DB_Escape(inputtext), pInfo[ playerid ][ dbID ]); db_query(Database, Query); format(string, sizeof(string), "{72FA80}GAMEGUARD: {FFFFFF}Secret Answer changed to {72FA80}%s", inputtext); SendClientMessage(playerid, -1, string); format(pInfo[ playerid ][ sAnswer ], 48, "%s", inputtext); if(strlen(pInfo[ playerid ][ sQuestion ]) > 0 && strlen(pInfo[ playerid ][ sAnswer ]) > 0) { pInfo[ playerid ][ QASetup ] = true; } if(pInfo[ playerid ][ RCONAdmin ] == false) { format(string, sizeof(string), "{FFFFFF}Secret Question - {72FA80}%s\n{FFFFFF}Secret Answer - {72FA80}%s", pInfo[ playerid ][ sQuestion ], pInfo[ playerid ][ sAnswer ]); } else { format(string, sizeof(string), "{FFFFFF}Secret Question - {72FA80}%s\n{FFFFFF}Secret Answer - {72FA80}%s\n{FFFFFF}GameGuard Settings\nDetected Players", pInfo[ playerid ][ sQuestion ], pInfo[ playerid ][ sAnswer ]); } ShowPlayerDialog(playerid, DIALOG_SETTINGS, DIALOG_STYLE_LIST, "{72FA80}GAMEGUARD: {FFFFFF}Account Settings", string, "Select", "Close"); } else { SendClientMessage(playerid, -1, "{72FA80}GAMEGUARD: {FFFFFF}The Answer must have at-least 1 character!"); if(pInfo[ playerid ][ RCONAdmin ] == false) { format(string, sizeof(string), "{FFFFFF}Secret Question - {72FA80}%s\n{FFFFFF}Secret Answer - {72FA80}%s", pInfo[ playerid ][ sQuestion ], pInfo[ playerid ][ sAnswer ]); } else { format(string, sizeof(string), "{FFFFFF}Secret Question - {72FA80}%s\n{FFFFFF}Secret Answer - {72FA80}%s\n{FFFFFF}GameGuard Settings\nDetected Players", pInfo[ playerid ][ sQuestion ], pInfo[ playerid ][ sAnswer ]); } ShowPlayerDialog(playerid, DIALOG_SETTINGS, DIALOG_STYLE_LIST, "{72FA80}GAMEGUARD: {FFFFFF}Account Settings", string, "Select", "Close"); } } else { if(pInfo[ playerid ][ RCONAdmin ] == false) { format(string, sizeof(string), "{FFFFFF}Secret Question - {72FA80}%s\n{FFFFFF}Secret Answer - {72FA80}%s", pInfo[ playerid ][ sQuestion ], pInfo[ playerid ][ sAnswer ]); } else { format(string, sizeof(string), "{FFFFFF}Secret Question - {72FA80}%s\n{FFFFFF}Secret Answer - {72FA80}%s\n{FFFFFF}GameGuard Settings\nDetected Players", pInfo[ playerid ][ sQuestion ], pInfo[ playerid ][ sAnswer ]); } ShowPlayerDialog(playerid, DIALOG_SETTINGS, DIALOG_STYLE_LIST, "{72FA80}GAMEGUARD: {FFFFFF}Account Settings", string, "Select", "Close"); } } case DIALOG_SETTINGS_ADMIN: { new string[ 386 ] ; if(response) { switch(listitem) { case 0: { pInfo[ playerid ][ EditingDialog ] = 1; format(string, sizeof(string), "{FFFFFF}Type in a new value for the {72FA80}kick delay\n{FFFFFF}The current delay is: {72FA80}%d ms", gInfo[ KICK_DELAY ]); ShowPlayerDialog(playerid, DIALOG_SETTINGS_ADMIN2, DIALOG_STYLE_INPUT, "{72FA80}GAMEGUARD: {FFFFFF}GameGuard Settings", string, "Accept", "Back"); } case 1: { pInfo[ playerid ][ EditingDialog ] = 2; format(string, sizeof(string), "{FFFFFF}Type in a new value for the {72FA80}Max. Dialog Warnings\n{FFFFFF}The current value is: {72FA80}%d", gInfo[ MAX_DIALOG_WARNS ]); ShowPlayerDialog(playerid, DIALOG_SETTINGS_ADMIN2, DIALOG_STYLE_INPUT, "{72FA80}GAMEGUARD: {FFFFFF}GameGuard Settings", string, "Accept", "Back"); } case 2: { pInfo[ playerid ][ EditingDialog ] = 3; format(string, sizeof(string), "{FFFFFF}Type in a new value for the {72FA80}Max. Death Warnings\n{FFFFFF}The current value is: {72FA80}%d", gInfo[ MAX_DEATH_WARNS ]); ShowPlayerDialog(playerid, DIALOG_SETTINGS_ADMIN2, DIALOG_STYLE_INPUT, "{72FA80}GAMEGUARD: {FFFFFF}GameGuard Settings", string, "Accept", "Back"); } case 3: { pInfo[ playerid ][ EditingDialog ] = 4; format(string, sizeof(string), "{FFFFFF}Type in a new value for the {72FA80}Max. Text Warnings\n{FFFFFF}The current value is: {72FA80}%d", gInfo[ MAX_TEXT_WARNS ]); ShowPlayerDialog(playerid, DIALOG_SETTINGS_ADMIN2, DIALOG_STYLE_INPUT, "{72FA80}GAMEGUARD: {FFFFFF}GameGuard Settings", string, "Accept", "Back"); } case 4: { pInfo[ playerid ][ EditingDialog ] = 5; format(string, sizeof(string), "{FFFFFF}Type in a new value for the {72FA80}Max. State Warnings\n{FFFFFF}The current value is: {72FA80}%d", gInfo[ MAX_STATE_WARNS ]); ShowPlayerDialog(playerid, DIALOG_SETTINGS_ADMIN2, DIALOG_STYLE_INPUT, "{72FA80}GAMEGUARD: {FFFFFF}GameGuard Settings", string, "Accept", "Back"); } case 5: { pInfo[ playerid ][ EditingDialog ] = 6; format(string, sizeof(string), "{FFFFFF}Type in a new value for the {72FA80}Max. Shot Warnings\n{FFFFFF}The current value is: {72FA80}%d", gInfo[ MAX_SHOT_WARNS ]); ShowPlayerDialog(playerid, DIALOG_SETTINGS_ADMIN2, DIALOG_STYLE_INPUT, "{72FA80}GAMEGUARD: {FFFFFF}GameGuard Settings", string, "Accept", "Back"); } case 6: { pInfo[ playerid ][ EditingDialog ] = 7; format(string, sizeof(string), "{FFFFFF}Type in a new value for the {72FA80}Max. Vehicle Warnings\n{FFFFFF}The current value is: {72FA80}%d", gInfo[ MAX_VEHICLE_WARNS ]); ShowPlayerDialog(playerid, DIALOG_SETTINGS_ADMIN2, DIALOG_STYLE_INPUT, "{72FA80}GAMEGUARD: {FFFFFF}GameGuard Settings", string, "Accept", "Back"); } case 7: { if(gInfo[ USE_RCON2 ] == true) { gInfo[ USE_RCON2 ] = false; } else { gInfo[ USE_RCON2 ] = true; } 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", 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()); ShowPlayerDialog(playerid, DIALOG_SETTINGS_ADMIN, DIALOG_STYLE_LIST, "{72FA80}GAMEGUARD: {FFFFFF}GameGuard Settings", string, "Edit", "Back"); } case 8: { if(gInfo[ ENABLED ] == true) { gInfo[ ENABLED ] = false; } else { gInfo[ ENABLED ] = true; gInfo[ DESYNC ] = false; } 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", 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()); ShowPlayerDialog(playerid, DIALOG_SETTINGS_ADMIN, DIALOG_STYLE_LIST, "{72FA80}GAMEGUARD: {FFFFFF}GameGuard Settings", string, "Edit", "Back"); } case 9: { if(gInfo[ DESYNC ] == true) { gInfo[ DESYNC ] = false; } else { gInfo[ DESYNC ] = true; gInfo[ ENABLED ] = false; } 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", 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()); ShowPlayerDialog(playerid, DIALOG_SETTINGS_ADMIN, DIALOG_STYLE_LIST, "{72FA80}GAMEGUARD: {FFFFFF}GameGuard Settings", string, "Edit", "Back"); } } } else { if(pInfo[ playerid ][ RCONAdmin ] == false) { format(string, sizeof(string), "{FFFFFF}Secret Question - {72FA80}%s\n{FFFFFF}Secret Answer - {72FA80}%s", pInfo[ playerid ][ sQuestion ], pInfo[ playerid ][ sAnswer ]); } else { format(string, sizeof(string), "{FFFFFF}Secret Question - {72FA80}%s\n{FFFFFF}Secret Answer - {72FA80}%s\n{FFFFFF}GameGuard Settings\nDetected Players", pInfo[ playerid ][ sQuestion ], pInfo[ playerid ][ sAnswer ]); } ShowPlayerDialog(playerid, DIALOG_SETTINGS, DIALOG_STYLE_LIST, "{72FA80}GAMEGUARD: {FFFFFF}Account Settings", string, "Select", "Close"); } } case DIALOG_SETTINGS_ADMIN2: { new string[ 366 ] ; if(response) { switch(pInfo[ playerid ][ EditingDialog ]) { case 1: { if(strval(inputtext) < 100 || strval(inputtext) > 500) { SendClientMessage(playerid, -1, "{72FA80}GAMEGUARD: {FFFFFF}The time must be between 100ms and 500ms!"); } else { gInfo[ KICK_DELAY ] = strval(inputtext); format(string, sizeof(string), "{72FA80}GAMEGUARD: {FFFFFF}You've set the Kick Delay to %d ms!", gInfo[ KICK_DELAY ]); SendClientMessage(playerid, -1, string); } } case 2: { if(strval(inputtext) < 3 || strval(inputtext) > 10) { SendClientMessage(playerid, -1, "{72FA80}GAMEGUARD: {FFFFFF}The value must be between 3 and 10!"); } else { gInfo[ MAX_DIALOG_WARNS ] = strval(inputtext); format(string, sizeof(string), "{72FA80}GAMEGUARD: {FFFFFF}You've set the Max. Dialog Warnings to %d!", gInfo[ MAX_DIALOG_WARNS ]); SendClientMessage(playerid, -1, string); } } case 3: { if(strval(inputtext) < 5 || strval(inputtext) > 15) { SendClientMessage(playerid, -1, "{72FA80}GAMEGUARD: {FFFFFF}The value must be between 5 and 15!"); } else { gInfo[ MAX_DEATH_WARNS ] = strval(inputtext); format(string, sizeof(string), "{72FA80}GAMEGUARD: {FFFFFF}You've set the Max. Death Warnings to %d!", gInfo[ MAX_DEATH_WARNS ]); SendClientMessage(playerid, -1, string); } } case 4: { if(strval(inputtext) < 5 || strval(inputtext) > 10) { SendClientMessage(playerid, -1, "{72FA80}GAMEGUARD: {FFFFFF}The value must be between 5 and 10!"); } else { gInfo[ MAX_TEXT_WARNS ] = strval(inputtext); format(string, sizeof(string), "{72FA80}GAMEGUARD: {FFFFFF}You've set the Max. Text Warnings to %d!", gInfo[ MAX_TEXT_WARNS ]); SendClientMessage(playerid, -1, string); } } case 5: { if(strval(inputtext) < 5 || strval(inputtext) > 15) { SendClientMessage(playerid, -1, "{72FA80}GAMEGUARD: {FFFFFF}The value must be between 5 and 15!"); } else { gInfo[ MAX_STATE_WARNS ] = strval(inputtext); format(string, sizeof(string), "{72FA80}GAMEGUARD: {FFFFFF}You've set the Max. State Warnings to %d!", gInfo[ MAX_STATE_WARNS ]); SendClientMessage(playerid, -1, string); } } case 6: { if(strval(inputtext) < 5 || strval(inputtext) > 15) { SendClientMessage(playerid, -1, "{72FA80}GAMEGUARD: {FFFFFF}The value must be between 5 and 15!"); } else { gInfo[ MAX_SHOT_WARNS ] = strval(inputtext); format(string, sizeof(string), "{72FA80}GAMEGUARD: {FFFFFF}You've set the Max. Shot Warnings to %d!", gInfo[ MAX_SHOT_WARNS ]); SendClientMessage(playerid, -1, string); } } case 7: { if(strval(inputtext) < 5 || strval(inputtext) > 10) { SendClientMessage(playerid, -1, "{72FA80}GAMEGUARD: {FFFFFF}The value must be between 5 and 10!"); } else { gInfo[ MAX_VEHICLE_WARNS ] = strval(inputtext); format(string, sizeof(string), "{72FA80}GAMEGUARD: {FFFFFF}You've set the Max. Vehicle Warnings to %d!", gInfo[ MAX_VEHICLE_WARNS ]); SendClientMessage(playerid, -1, string); } } } 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", 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()); ShowPlayerDialog(playerid, DIALOG_SETTINGS_ADMIN, DIALOG_STYLE_LIST, "{72FA80}GAMEGUARD: {FFFFFF}GameGuard Settings", string, "Edit", "Back"); pInfo[ playerid ][ EditingDialog ] = 0; } else { 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", 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()); ShowPlayerDialog(playerid, DIALOG_SETTINGS_ADMIN, DIALOG_STYLE_LIST, "{72FA80}GAMEGUARD: {FFFFFF}GameGuard Settings", string, "Edit", "Back"); } } } return 1; } public OnPlayerStateChange(playerid, newstate, oldstate) { if(gInfo[ ENABLED ] == true) { if(newstate == PLAYER_STATE_DRIVER || newstate == PLAYER_STATE_PASSENGER) { new vID ; vID = GetPlayerVehicleID(playerid); if(vID != pInfo[ playerid ][ VehicleID ] && gettime()-pInfo[ playerid ][ LastEntered ] < 2) { format(pInfo[ playerid ][ LastDetection ], 9, "Car-Warp"); pInfo[ playerid ][ StateWarns ]++, pInfo[ playerid ][ TotalWarns ]++; if(pInfo[ playerid ][ StateWarns ] >= gInfo[ MAX_STATE_WARNS ]) { SendLeaveMessage(playerid, LEAVETYPE_CHEAT); BlockIpAddressEx(pInfo[ playerid ][ IP ], HOURS_1, playerid, LEAVETYPE_CHEAT); } } pInfo[ playerid ][ VehicleID ] = vID; pInfo[ playerid ][ LastEntered ] = gettime(); } } return 1; } public OnPlayerWeaponShot(playerid, weaponid, hittype, hitid, Float:fX, Float:fY, Float:fZ) { if(gInfo[ ENABLED ] == true) { if(weaponid != 38 && weaponid != 30 && weaponid != 31 && weaponid != 28 && weaponid != 32) { if(gettime() - pInfo[ playerid ][ LastShot ] <= 1) { pInfo[ playerid ][ TimesShot ]++; } else { pInfo[ playerid ][ TimesShot ] = 0; } if(pInfo[ playerid ][ TimesShot ] >= gInfo[ MAX_BULLETS ]) { format(pInfo[ playerid ][ LastDetection ], 11, "Rapid-Fire"); if(pInfo[ playerid ][ BulletsToDesync ] >= 1) { pInfo[ playerid ][ BulletsToDesync ]--; return 0; } else { pInfo[ playerid ][ BulletsToDesync ] = gInfo[ MAX_DESYNC_BULLETS ]; return 0; /*pInfo[ playerid ][ ShotWarns ]++, pInfo[ playerid ][ TotalWarns ]++; if(pInfo[ playerid ][ ShotWarns ] >= gInfo[ MAX_SHOT_WARNS ]) { SendLeaveMessage(playerid, LEAVETYPE_CHEAT); BlockIpAddressEx(pInfo[ playerid ][ IP ], HOURS_1, playerid, LEAVETYPE_CHEAT); }*/ } } pInfo[ playerid ][ LastShot ] = gettime(); } if(hittype == BULLET_HIT_TYPE_PLAYER) { if(!IsPlayerInAnyVehicle(playerid) && !IsPlayerInAnyVehicle(hitid)) { if(GetPlayerSurfingVehicleID(playerid) == INVALID_VEHICLE_ID && GetPlayerSurfingVehicleID(playerid) == INVALID_VEHICLE_ID) { new Float:fOriginX, Float:fOriginY, Float:fOriginZ, Float:fHitPosX, Float:fHitPosY, Float:fHitPosZ ; GetPlayerLastShotVectors(playerid, fOriginX, fOriginY, fOriginZ, fHitPosX, fHitPosY, fHitPosZ); if(!IsPlayerInRangeOfPoint(hitid, 3.0, fX, fY, fZ)) { format(pInfo[ playerid ][ LastDetection ], 14, "Silent Aimbot"); if(pInfo[ playerid ][ BulletsToDesync ] >= 1) { pInfo[ playerid ][ BulletsToDesync ]--; return 0; } else { pInfo[ playerid ][ BulletsToDesync ] = gInfo[ MAX_DESYNC_BULLETS ]; return 0; } } } } } } if(gInfo[ DESYNC ] == true) { if(pInfo[ playerid ][ TotalWarns ] > 6) { return 0; } } return 1; } public OnVehicleMod(playerid, vehicleid, componentid) { if(gInfo[ ENABLED ] == true) { if(GetPlayerInterior(playerid) == 0) { format(pInfo[ playerid ][ LastDetection ], 12, "Car modding"); pInfo[ playerid ][ VehicleWarns ]++, pInfo[ playerid ][ TotalWarns ]++; if(pInfo[ playerid ][ VehicleWarns ] >= gInfo[ MAX_VEHICLE_WARNS ]) { SendLeaveMessage(playerid, LEAVETYPE_CHEAT); BlockIpAddressEx(pInfo[ playerid ][ IP ], HOURS_1, playerid, LEAVETYPE_CHEAT); } return 0; } } if(gInfo[ DESYNC ] == true) { if(pInfo[ playerid ][ TotalWarns ] > 6) { return 0; } } return 1; } public OnPlayerUpdate(playerid) { if(gInfo[ DESYNC ] == true) { if(pInfo[ playerid ][ TotalWarns ] > 6) { return 0; } } return 1; } CMD:settings(playerid, params[]) { new string[ 228 ] ; if(pInfo[ playerid ][ RCONAdmin ] == false) { format(string, sizeof(string), "{FFFFFF}Secret Question - {72FA80}%s\n{FFFFFF}Secret Answer - {72FA80}%s", pInfo[ playerid ][ sQuestion ], pInfo[ playerid ][ sAnswer ]); ShowPlayerDialog(playerid, DIALOG_SETTINGS, DIALOG_STYLE_LIST, "{72FA80}GAMEGUARD: {FFFFFF}Account Settings", string, "Select", "Close"); } else { format(string, sizeof(string), "{FFFFFF}Secret Question - {72FA80}%s\n{FFFFFF}Secret Answer - {72FA80}%s\n{FFFFFF}GameGuard Settings\nDetected Players", pInfo[ playerid ][ sQuestion ], pInfo[ playerid ][ sAnswer ]); ShowPlayerDialog(playerid, DIALOG_SETTINGS, DIALOG_STYLE_LIST, "{72FA80}GAMEGUARD: {FFFFFF}Account Settings", string, "Select", "Close"); } return 1; } CMD:test(playerid,params[]) { RepairVehicle(GetPlayerVehicleID(playerid)); SetVehicleVelocity(GetPlayerVehicleID(playerid),500,500,5); return 1; } DB_Escape(text[]) { new ret[80* 2], ch, i, j ; while ((ch = text[i++]) && j < sizeof (ret)) { if (ch == '\'') { if (j < sizeof (ret) - 2) { ret[j++] = '\''; ret[j++] = '\''; } } else if (j < sizeof (ret)) { ret[j++] = ch; } else { j++; } } ret[sizeof (ret) - 1] = '\0'; return ret; } SendLeaveMessage(playerid, leavetype = LEAVETYPE_KICK) { new string[ 108 ] ; switch(leavetype) { case LEAVETYPE_KICK: { format(string, sizeof(string), "{72FA80}GAMEGUARD: {FFFFFF}Player %s left the game ({72FA80}Kicked{FFFFFF})", pInfo[ playerid ][ Name ]); } case LEAVETYPE_EXPLOIT: { format(string, sizeof(string), "{72FA80}GAMEGUARD: {FFFFFF}Player %s left the game ({72FA80}Exploit Usage{FFFFFF})", pInfo[ playerid ][ Name ]); } case LEAVETYPE_CHEAT: { format(string, sizeof(string), "{72FA80}GAMEGUARD: {FFFFFF}Player %s left the game ({72FA80}Cheat Usage{FFFFFF})", pInfo[ playerid ][ Name ]); } case LEAVETYPE_UNTRUSTED: { format(string, sizeof(string), "{72FA80}GAMEGUARD: {FFFFFF}Player %s left the game ({72FA80}Untrusted{FFFFFF})", pInfo[ playerid ][ Name ]); } case LEAVETYPE_BANNED: { format(string, sizeof(string), "{72FA80}GAMEGUARD: {FFFFFF}Player %s left the game ({72FA80}Banned{FFFFFF})", pInfo[ playerid ][ Name ]); } } SendClientMessageToAll(-1, string); } BlockIpAddressEx(ip[], blocktime, playerid = INVALID_PLAYER_ID, blocktype = LEAVETYPE_BANNED) { pInfo[ playerid ][ Untrusted ]++; BlockIpAddress(ip, blocktime); if(playerid != INVALID_PLAYER_ID) { if(pInfo[ playerid ][ Untrusted ] >= gInfo[ MAX_UNTRUSTED_WARNS ]) { switch(blocktype) { case LEAVETYPE_EXPLOIT: Ban_(playerid, "Exploit Infraction"); case LEAVETYPE_CHEAT: Ban_(playerid, "Cheat Infraction"); case LEAVETYPE_UNTRUSTED: Ban_(playerid, "Untrusted Account"); case LEAVETYPE_ADVERTISEMENT: Ban_(playerid, "Advertising"); case LEAVETYPE_FAIL_LOGIN: Ban_(playerid, "Failed RCON Login"); } } else { SetTimerEx("KickEx", gInfo[ KICK_DELAY ], false, "i", playerid); } } } Ban_(playerid, reason[]) { new Query[ 224 ], day, month, year, second, minute, hour ; getdate(day, month, year); gettime(hour, minute, second); format(Query, sizeof( Query ), "INSERT INTO banned (bannedname, bannedip, banreason, date, time) VALUES ('%s', '%s', '%s', '%d/%d/%d', '%d:%d:%d')", DB_Escape(pInfo[ playerid ][ Name ]), pInfo[ playerid ][ IP ], DB_Escape(reason), day, month, year, hour, minute, second); db_query(Database, Query); SetTimerEx("KickEx", gInfo[ KICK_DELAY ], false, "i", playerid); } RCON2_STATUS() { new status[ 9 ] ; switch(gInfo[ USE_RCON2 ]) { case true: { status = "Enabled"; } case false: { status = "Disabled"; } } return status; } GAMEGUARD_STATUS() { new status[ 9 ] ; switch(gInfo[ ENABLED ]) { case true: { status = "Enabled"; } case false: { status = "Disabled"; } } return status; } DESYNC_STATUS() { new status[ 9 ] ; switch(gInfo[ DESYNC ]) { case true: { status = "Enabled"; } case false: { status = "Disabled"; } } return status; } forward KickEx(playerid); public KickEx(playerid) { Kick(playerid); return 1; } /*GetPlayerSpeed(playerid) { new Float:velocity[ 4 ]; if(IsPlayerInAnyVehicle(playerid)) { GetVehicleVelocity(GetPlayerVehicleID(playerid), velocity[ 0 ], velocity[ 1 ], velocity[ 2 ]); } else { GetPlayerVelocity(playerid, velocity[ 0 ], velocity[ 1 ], velocity[ 2 ]); } velocity[3] = floatsqroot(floatpower(floatabs(velocity[ 0 ]), 2.0) + floatpower(floatabs(velocity[ 1 ]), 2.0) + floatpower(floatabs(velocity[ 2 ]), 2.0)) * 181.03625; return floatround(velocity[ 3 ]); } forward SpeedCheck(playerid); public SpeedCheck(playerid) { if(pInfo[ playerid ][ LoggedIn ] == false) return 1; else if(gInfo[ ENABLED ] == false) { KillTimer(pInfo[ playerid ][ Timer ]); pInfo[ playerid ][ Timer ] = -1; } else { if(IsPlayerInAnyVehicle( playerid )) { if(GetPlayerSpeed( playerid ) >= 271) { new vehicleID, Float:velocity[ 3 ] ; vehicleID = GetPlayerVehicleID(playerid); GetVehicleVelocity(vehicleID, velocity[ 0 ], velocity[ 1 ], velocity[ 2 ]); do { SetVehicleVelocity(vehicleID, velocity[ 0 ]/2, velocity[ 1 ]/2, velocity[ 2 ]/2); } while(GetPlayerSpeed( playerid ) >= 271); } } } return 1; }*/