233 lines
7.0 KiB
SourcePawn
233 lines
7.0 KiB
SourcePawn
#pragma semicolon 1
|
|
#define PLUGIN_AUTHOR "jenz"
|
|
#define PLUGIN_VERSION "1.0"
|
|
#include <sourcemod>
|
|
#include <cstrike>
|
|
#include <unloze_playtime>
|
|
#include <mapchooser_extended>
|
|
#include <leader>
|
|
|
|
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;
|
|
}
|