diff --git a/discord_verificiation/scripting/anti_laser_fag.sp b/discord_verificiation/scripting/anti_laser_fag.sp new file mode 100644 index 0000000..5931c6c --- /dev/null +++ b/discord_verificiation/scripting/anti_laser_fag.sp @@ -0,0 +1,232 @@ +#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; +} diff --git a/discord_verificiation/sql/create_tables.sql b/discord_verificiation/sql/create_tables.sql new file mode 100644 index 0000000..9ee24e1 --- /dev/null +++ b/discord_verificiation/sql/create_tables.sql @@ -0,0 +1,7 @@ +CREATE TABLE unloze_playtimestats.play_time_laser_fag ( + `steam_id` varchar(64) NOT NULL, + `player_name` varchar(256) NOT NULL, + `laser_fag_time` bigint(20) NOT NULL, + `not_laser_fag_time` bigint(20) NOT NULL, + PRIMARY KEY (`steam_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;