/******************************************************************************* Basic Protections (Driveby, teamkill, helikill, spawnkill, chat spam) Created 2007 - HAMM3R - Driveby detection elements adapted from code by Serafim - Modify it, erase it, explode it with a nuclear warhead... I don't care. *******************************************************************************/ #include // ADJUST THESE TO MODIFY EACH PROTECTION'S SETTINGS #define HELIKILL_PROTECTION 1 #define HELIKILL_MAX_KILLS 5 #define HELIKILL_TIMELIMIT 600 // 10 MINUTES #define DRIVEBY_PROTECTION 1 #define DRIVEBY_MAX_KILLS 5 #define DRIVEBY_TIMELIMIT 600 // 10 MINUTES #define TEAMKILL_PROTECTION 1 #define TEAMKILL_MAX_KILLS 5 #define TEAMKILL_TIMELIMIT 600 // 10 MINUTES #define SPAWNKILL_PROTECTION 1 #define SPAWNKILL_MAX_KILLS 4 #define SPAWNKILL_TIMELIMIT 40 // 40 SECONDS #define SPAM_PROTECTION 1 #define SPAM_MAX_MSGS 4 #define SPAM_TIMELIMIT 8 // 8 SECONDS forward Float:GetDistanceBetweenPlayers(p1,p2); new gSpamCount[MAX_PLAYERS][2]; new gTeamkillCount[MAX_PLAYERS][2]; new gHelikillCount[MAX_PLAYERS][2]; new gSpawnkillCount[MAX_PLAYERS][MAX_PLAYERS][2]; new gDrivebyCount[MAX_PLAYERS][2]; public OnPlayerText(playerid, text[]) { #if SPAM_PROTECTION SpamProtection(playerid); #endif return 1; } public OnPlayerDeath(playerid, killerid, reason) { if(reason == 50) { #if HELIKILL_PROTECTION HelikillProtection(killerid); #endif } if(GetPlayerTeam(killerid) == GetPlayerTeam(playerid)) { #if TEAMKILL_PROTECTION TeamkillProtection(killerid); #endif } if(!IsPlayerInAnyVehicle(playerid) && GetPlayerState(killerid) == PLAYER_STATE_DRIVER && (reason == WEAPON_TEC9 || reason == WEAPON_UZI || reason == WEAPON_MP5) && GetDistanceBetweenPlayers(playerid,killerid) < 100) { #if DRIVEBY_PROTECTION DrivebyProtection(killerid); #endif } #if SPAWNKILL_PROTECTION SpawnkillProtection(killerid,playerid); #endif return 1; } stock TeamkillProtection(killerid) { new string[64]; if(gTeamkillCount[killerid][0] == 0) { gTeamkillCount[killerid][0] = 1; gTeamkillCount[killerid][1] = TimeStamp(); } else { gTeamkillCount[killerid][0]++; if(TimeStamp() - gTeamkillCount[killerid][1] > DRIVEBY_TIMELIMIT) { gTeamkillCount[killerid][0] = 1; gTeamkillCount[killerid][1] = TimeStamp(); } else if(gTeamkillCount[killerid][0] == DRIVEBY_MAX_KILLS) { format(string,sizeof(string),"*** %s has been kicked (Excessive teamkilling)",GetName(killerid)); SendClientMessageToAll(0xC8BEBEAA,string); Kick(killerid); } else if(gTeamkillCount[killerid][0] == DRIVEBY_MAX_KILLS-1) { SendClientMessage(killerid,0xC8BEBEAA,"*** Stop teamkilling - Next one is a kick"); } } return 1; } stock HelikillProtection(killerid) { new string[64]; if(gHelikillCount[killerid][0] == 0) { gHelikillCount[killerid][0] = 1; gHelikillCount[killerid][1] = TimeStamp(); } else { gHelikillCount[killerid][0]++; if(TimeStamp() - gHelikillCount[killerid][1] > HELIKILL_TIMELIMIT) { gHelikillCount[killerid][0] = 1; gHelikillCount[killerid][1] = TimeStamp(); } else if(gHelikillCount[killerid][0] == HELIKILL_MAX_KILLS) { format(string,sizeof(string),"*** %s has been kicked (Excessive helikilling)",GetName(killerid)); SendClientMessageToAll(0xC8BEBEAA,string); Kick(killerid); } else if(gHelikillCount[killerid][0] == HELIKILL_MAX_KILLS-1) { SendClientMessage(killerid,0xC8BEBEAA,"*** Stop helikilling - Next one is a kick"); } } return 1; } stock DrivebyProtection(killerid) { new string[64]; if(gDrivebyCount[killerid][0] == 0) { gDrivebyCount[killerid][0] = 1; gDrivebyCount[killerid][1] = TimeStamp(); } else { gDrivebyCount[killerid][0]++; if(TimeStamp() - gDrivebyCount[killerid][1] > DRIVEBY_TIMELIMIT) { gDrivebyCount[killerid][1] = TimeStamp(); gDrivebyCount[killerid][0] = 1; } else if(gDrivebyCount[killerid][0] == DRIVEBY_MAX_KILLS) { format(string,sizeof(string),"*** %s has been kicked (Excessive drivebying)",GetName(killerid)); SendClientMessageToAll(0xC8BEBEAA,string); Kick(killerid); } else if(gDrivebyCount[killerid][0] == DRIVEBY_MAX_KILLS-1) { SendClientMessage(killerid,0xC8BEBEAA,"*** Stop drivebying - Next one is a kick"); } } return 1; } stock SpawnkillProtection(killerid, playerid) { new string[64]; if(gSpawnkillCount[killerid][playerid][0] == 0) { gSpawnkillCount[killerid][playerid][0] = 1; gSpawnkillCount[killerid][playerid][1] = TimeStamp(); } else { gSpawnkillCount[killerid][playerid][0]++; if(TimeStamp() - gSpawnkillCount[killerid][playerid][1] > SPAWNKILL_TIMELIMIT) { gSpawnkillCount[killerid][playerid][0] = 1; gSpawnkillCount[killerid][playerid][1] = TimeStamp(); } else if(gSpawnkillCount[killerid][playerid][0] == SPAWNKILL_MAX_KILLS) { format(string,sizeof(string),"*** %s has been kicked (Spawnkilling)",GetName(killerid)); SendClientMessageToAll(0xC8BEBEAA,string); Kick(killerid); } else if(gSpawnkillCount[killerid][playerid][0] == SPAWNKILL_MAX_KILLS-1) { SendClientMessage(killerid,0xC8BEBEAA,"*** Stop spawnkilling - Next one is a kick"); } } return 1; } stock SpamProtection(playerid) { new string[64]; if(gSpamCount[playerid][0] == 0) { gSpamCount[playerid][0] = 1; gSpamCount[playerid][1] = TimeStamp(); } else { gSpamCount[playerid][0]++; if(TimeStamp() - gSpamCount[playerid][1] > SPAM_TIMELIMIT) { gSpamCount[playerid][0] = 1; gSpamCount[playerid][1] = TimeStamp(); } else if(gSpamCount[playerid][0] == SPAM_MAX_MSGS) { format(string,sizeof(string),"*** %s has been kicked (Flood/Spam Protection)",GetName(playerid)); SendClientMessageToAll(0xC8BEBEAA,string); Kick(playerid); } // Best not to help them figure out the time limits /*else if(gSpamCount[playerid][0] == SPAM_MAX_MSGS-1) { SendClientMessage(playerid,0xC8BEBEAA,"*** Stop Spamming! Next one is a kick"); }*/ } return 1; } stock Float:GetDistanceBetweenPlayers(p1,p2) { new Float:x1,Float:y1,Float:z1,Float:x2,Float:y2,Float:z2; if (!IsPlayerConnected(p1) || !IsPlayerConnected(p2)){ return -1.00; } GetPlayerPos(p1,x1,y1,z1); GetPlayerPos(p2,x2,y2,z2); return floatsqroot(floatpower(floatabs(floatsub(x2,x1)),2)+floatpower(floatabs(floatsub(y2,y1)),2)+floatpower(floatabs(floatsub(z2,z1)),2)); } stock GetName(playerid) { new name[MAX_PLAYER_NAME]; GetPlayerName(playerid,name,sizeof(name)); return name; } stock TimeStamp() { new time = GetTickCount() / 1000; return time; }