#pragma semicolon 1 #define PLUGIN_AUTHOR "jenz" #define PLUGIN_VERSION "1.0" #include #include #include #include #include Database g_hDatabase; Handle g_h_time_activity = null; bool g_bLaserFagMap; int g_iPlayerLaserFagTier; int g_iPlayerKickLaserFag; int g_iPlayerLaserFagHourRatio; public Plugin myinfo = { name = "anti laser fag plugin", author = PLUGIN_AUTHOR, description = "stop laser fags if they play too many laser fag maps", version = PLUGIN_VERSION, url = "www.unloze.com" }; public void OnPluginStart() { g_h_time_activity = CreateTimer(10.0, time_update_laser_fag_activity, INVALID_HANDLE, TIMER_REPEAT); OnMapStart(); if (!g_hDatabase) { Database.Connect(SQL_OnDatabaseConnect, "unloze_playtimestats"); } ConVar cvar; HookConVarChange((cvar = CreateConVar("sm_mapchooser_laser_fag_tier", "17", "Tier required for not being kicked even if a laserfag")), Cvar_playerTierLaserFag); g_iPlayerLaserFagTier = cvar.IntValue; delete cvar; ConVar cvar1; HookConVarChange((cvar1 = CreateConVar("sm_mapchooser_laser_fag_playercount_kick", "55", "How many players on server before kicking laserfags")), Cvar_playerCountKickLaserFag); g_iPlayerKickLaserFag = cvar1.IntValue; delete cvar1; ConVar cvar2; HookConVarChange((cvar2 = CreateConVar("sm_mapchooser_laser_fag_hour_ratio", "5", "Tollerated ratio between non laser maps and laser maps played")), Cvar_playerLaserFagHourRatio); g_iPlayerLaserFagHourRatio = cvar2.IntValue; delete cvar2; } public void OnPluginEnd() { if (g_h_time_activity != null) delete g_h_time_activity; } public Action time_update_laser_fag_activity(Handle timer, any data) { if (!g_hDatabase) { return Plugin_Continue; } for (int client = 1; client <= MaxClients; client++) { if (IsValidClient(client) && !IsFakeClient(client)) { //if its laser fag map count all time on server, if its not laser fag map only count time when client is alive. if (!g_bLaserFagMap && !IsPlayerAlive(client)) { continue; } char sQuery[512]; char sName[MAX_NAME_LENGTH]; GetClientName(client, sName, sizeof(sName)); int size2 = 2 * strlen(sName) + 1; char[] sEscapedName = new char[size2 + 1]; g_hDatabase.Escape(sName, sEscapedName, size2 + 1); char sSID[64]; GetClientAuthId(client, AuthId_Steam2, sSID, sizeof(sSID)); if (g_bLaserFagMap) { Format(sQuery, sizeof(sQuery), "update unloze_playtimestats.play_time_laser_fag set laser_fag_time = laser_fag_time + 10 where steam_id = '%s'", sSID); } else { Format(sQuery, sizeof(sQuery), "update unloze_playtimestats.play_time_laser_fag set not_laser_fag_time = not_laser_fag_time + 10 where steam_id = '%s'", sSID); } g_hDatabase.Query(SQL_FinishedQuery, sQuery, _, DBPrio_Low); } } return Plugin_Continue; } public void insert_client(int client) { char sName[MAX_NAME_LENGTH]; GetClientName(client, sName, sizeof(sName)); int size2 = 2 * strlen(sName) + 1; char[] sEscapedName = new char[size2 + 1]; g_hDatabase.Escape(sName, sEscapedName, size2 + 1); char sQuery[512]; char sSID[64]; GetClientAuthId(client, AuthId_Steam2, sSID, sizeof(sSID)); Format(sQuery, sizeof(sQuery), "INSERT INTO `play_time_laser_fag` (`steam_id`, `player_name`, `laser_fag_time`, `not_laser_fag_time`) VALUES ('%s', '%s', 0, 0) ON DUPLICATE KEY UPDATE `player_name` = '%s'", sSID, sEscapedName, sEscapedName); g_hDatabase.Query(SQL_FinishedQuery, sQuery, _, DBPrio_Low); } public void SQL_FinishedQuery(Database db, DBResultSet results, const char[] error, any data) { if (!db || strlen(error)) { LogError("Query error 3: %s", error); } delete results; } public void Cvar_playerLaserFagHourRatio(ConVar convar, const char[] oldValue, const char[] newValue) { g_iPlayerLaserFagHourRatio = convar.IntValue; } public void Cvar_playerCountKickLaserFag(ConVar convar, const char[] oldValue, const char[] newValue) { g_iPlayerKickLaserFag = convar.IntValue; } public void Cvar_playerTierLaserFag(ConVar convar, const char[] oldValue, const char[] newValue) { g_iPlayerLaserFagTier = convar.IntValue; } public void SQL_OnDatabaseConnect(Database db, const char[] error, any data) { if(!db || strlen(error)) { LogError("Database error: %s", error); return; } g_hDatabase = db; for (int i = 1; i <= MaxClients; i++) { if(IsValidClient(i) && !IsFakeClient(i)) { OnClientPostAdminCheck(i); } } } public void OnMapStart() { char map[PLATFORM_MAX_PATH]; GetCurrentMap(map, PLATFORM_MAX_PATH); g_bLaserFagMap = GetMapLaserFag(map) == 0 ? false : true; if (!g_hDatabase) { Database.Connect(SQL_OnDatabaseConnect, "unloze_playtimestats"); return; } } public void OnClientPostAdminCheck(int client) { if (IsFakeClient(client)) { return; } insert_client(client); if (!g_bLaserFagMap) { return; } if (GetClientCount(false) < g_iPlayerKickLaserFag) { return; } int flags = GetUserFlagBits(client); if (GetPlayerTier_native(client) >= g_iPlayerLaserFagTier || Leader_Is(client) || flags & ADMFLAG_RESERVATION) { return; } char sQuery[512]; char sSID[64]; GetClientAuthId(client, AuthId_Steam2, sSID, sizeof(sSID)); Format(sQuery, sizeof(sQuery), "select laser_fag_time, not_laser_fag_time from unloze_playtimestats.play_time_laser_fag pt where pt.steam_id = '%s'", sSID); g_hDatabase.Query(SQL_OnQueryCompleted, sQuery, GetClientSerial(client), DBPrio_High); } public void SQL_OnQueryCompleted(Database db, DBResultSet results, const char[] error, int iSerial) { if (!db || strlen(error)) { delete results; LogError("Query error 3: %s", error); return; } int client; if ((client = GetClientFromSerial(iSerial)) == 0) { delete results; return; } if (results.RowCount && results.FetchRow()) { int laser_fag_hours = (results.FetchInt(0) / 60) / 60; int non_laser_fag_hours = (results.FetchInt(1) / 60 / 60); if (laser_fag_hours > g_iPlayerLaserFagHourRatio && laser_fag_hours / g_iPlayerLaserFagHourRatio > non_laser_fag_hours) { LogMessage("Kicked Client %N for being laser fag. laser fag hours: %i. non laser fag hours: %i.", client, laser_fag_hours, non_laser_fag_hours); KickClientEx(client, "You play too much laserfag maps. Go play normal maps or buy vip."); } } delete results; } stock bool IsValidClient(int client) { if (client > 0 && client <= MaxClients && IsClientConnected(client) && IsClientInGame(client)) return true; return false; }