sm-plugins/mapchooser_extended/scripting/map_cooldown_tracker.sp

196 lines
6.2 KiB
SourcePawn

#pragma semicolon 1
#define PLUGIN_AUTHOR "jenz"
#define PLUGIN_VERSION "1.0"
#include <sourcemod>
#include <cstrike>
#include <mapchooser_extended>
int g_iPlayerCount_time_track;
int g_iTopMapsToMarkWithCooldown;
int g_iUnmarkCooldowns;
int g_iCurrentPlayerCount;
int g_iMapStartTime;
Database g_hDatabase;
public Plugin myinfo =
{
name = "map_tracker_cooldown",
author = PLUGIN_AUTHOR,
description = "assigns cooldowns on maps and tracks their played time on the server",
version = PLUGIN_VERSION,
url = "www.unloze.com"
};
public void OnPluginStart()
{
if (!g_hDatabase)
{
Database.Connect(SQL_OnDatabaseConnect, "unloze_playtimestats");
}
ConVar cvar;
HookConVarChange((cvar = CreateConVar("mce_min_players_track_time", "20", "Playercount in full number required for tracking minutes spend on a map.")), Cvar_playersCount);
g_iPlayerCount_time_track = cvar.IntValue;
delete cvar;
ConVar cvar1;
HookConVarChange((cvar1 = CreateConVar("mce_top_ordered_maps_on_cooldown", "30", "These highest listed maps will receive the cooldown boolean")), Cvar_TopMarkedWithCooldown);
g_iTopMapsToMarkWithCooldown = cvar1.IntValue;
delete cvar1;
ConVar cvar2;
HookConVarChange((cvar2 = CreateConVar("mce_UnmarkCooldowns", "120", "How far down the list does a map need to be for getting unmarked again")), Cvar_UnmarkedCooldown);
g_iUnmarkCooldowns = cvar2.IntValue;
delete cvar2;
g_iCurrentPlayerCount = GetClientCount(false);
CreateTimer(30.0, CheckPlayerCount, _, TIMER_REPEAT);
}
public Action CheckPlayerCount(Handle timer)
{
g_iCurrentPlayerCount = GetClientCount(false);
return Plugin_Continue;
}
public void Cvar_playersCount(ConVar convar, const char[] oldValue, const char[] newValue)
{
g_iPlayerCount_time_track = convar.IntValue;
}
public void Cvar_TopMarkedWithCooldown(ConVar convar, const char[] oldValue, const char[] newValue)
{
g_iTopMapsToMarkWithCooldown = convar.IntValue;
}
public void Cvar_UnmarkedCooldown(ConVar convar, const char[] oldValue, const char[] newValue)
{
g_iUnmarkCooldowns = 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;
UpdateTopListedMapsWithCooldown();
}
public void OnMapStart()
{
int i_port = GetConVarInt(FindConVar("hostport"));
if (i_port != 27019 && i_port != 27015)
{
return;
}
g_iMapStartTime = GetTime();
if (!g_hDatabase)
{
Database.Connect(SQL_OnDatabaseConnect, "unloze_playtimestats");
}
else
{
UpdateTopListedMapsWithCooldown();
}
}
public void UpdateTopListedMapsWithCooldown()
{
//just set every map in top g_iTopMapsToMarkWithCooldown on cooldown
char sQuery[512];
Format(sQuery, sizeof(sQuery), "update unloze_playtimestats.map_minutes_played set on_cooldown = true where mapname in ( SELECT mapname FROM (select mmp.mapname from unloze_playtimestats.map_minutes_played mmp order by mmp.minutes desc limit %i) as top) and on_cooldown is false", g_iTopMapsToMarkWithCooldown);
g_hDatabase.Query(SQL_FinishedQuery1, sQuery, _, DBPrio_High);
}
public void SQL_FinishedQuery1(Database db, DBResultSet results, const char[] error, DataPack data)
{
delete results;
if (!db || strlen(error))
{
LogError("Query error: %s", error);
}
delete data;
UpdateUnmarkCooldown();
}
public void UpdateUnmarkCooldown()
{
//if map in listing fell below g_iUnmarkCooldowns then set the bool to false again.
char sQuery[512];
Format(sQuery, sizeof(sQuery), "update unloze_playtimestats.map_minutes_played set on_cooldown = false where mapname not in ( SELECT mapname FROM (select mmp.mapname from unloze_playtimestats.map_minutes_played mmp order by mmp.minutes desc limit %i) as top) and on_cooldown is true", g_iUnmarkCooldowns);
g_hDatabase.Query(SQL_FinishedQuery2, sQuery, _, DBPrio_High);
}
public void SQL_FinishedQuery2(Database db, DBResultSet results, const char[] error, DataPack data)
{
delete results;
if (!db || strlen(error))
{
LogError("Query error: %s", error);
}
delete data;
SelectMapsToCooldownForMapChooser();
}
public void SelectMapsToCooldownForMapChooser()
{
char sQuery[512];
Format(sQuery, sizeof(sQuery), "select mapname, map_list_index from (select mapname, ROW_NUMBER() OVER(ORDER BY minutes DESC) as map_list_index, mmp.on_cooldown from unloze_playtimestats.map_minutes_played mmp) as targets where on_cooldown");
g_hDatabase.Query(SQL_FinishedQuerySelectMaps, sQuery, _, DBPrio_High);
}
public void SQL_FinishedQuerySelectMaps(Database db, DBResultSet results, const char[] error, DataPack data)
{
if (!db || strlen(error))
{
LogError("Query error in SQL_FinishedQuerySelectMaps: %s", error);
delete results;
return;
}
while (results.RowCount && results.FetchRow())
{
char mapname[256];
results.FetchString(0, mapname, sizeof(mapname));
int map_list_index = results.FetchInt(1);
ExcludeMapListingPriority(mapname, g_iUnmarkCooldowns - map_list_index);
}
delete results;
}
public void OnMapEnd()
{
int i_port = GetConVarInt(FindConVar("hostport"));
if (i_port != 27019 && i_port != 27015)
{
return;
}
int elapsed = GetTime() - g_iMapStartTime;
int minutes = RoundToFloor(elapsed / 60.0);
char Mapname[128];
GetCurrentMap(Mapname, sizeof(Mapname));
//LogMessage("minutes: %i. map: %s", minutes, Mapname);
if (g_iCurrentPlayerCount > g_iPlayerCount_time_track)
{
char sQuery[512];
Format(sQuery, sizeof(sQuery), "INSERT INTO `map_minutes_played` (`mapname`, `minutes`, `updated_on`) VALUES ('%s', '%i', NOW()) ON DUPLICATE KEY UPDATE `minutes` = `minutes` + '%i', `updated_on` = NOW()", Mapname, minutes, minutes);
g_hDatabase.Query(SQL_FinishedQuery, sQuery, _, DBPrio_Low);
}
}
public void SQL_FinishedQuery(Database db, DBResultSet results, const char[] error, DataPack data)
{
delete results;
if (!db || strlen(error))
{
LogError("Query error: %s", error);
}
delete data;
}