diff --git a/mapchooser_extended/scripting/nominations_extended.sp b/mapchooser_extended/scripting/nominations_extended.sp index 2c38eabe..8599c4e6 100755 --- a/mapchooser_extended/scripting/nominations_extended.sp +++ b/mapchooser_extended/scripting/nominations_extended.sp @@ -83,43 +83,153 @@ Handle g_Cvar_VIPTimeframeMaxTime = INVALID_HANDLE; int g_Player_NominationDelay[MAXPLAYERS+1]; int g_NominationDelay; +//clients ignoring maps that are unavailable +bool g_bClientsIgnoring[MAXPLAYERS + 1]; +Database g_dDatabase; + public void OnPluginStart() { - LoadTranslations("common.phrases"); - LoadTranslations("nominations.phrases"); - LoadTranslations("basetriggers.phrases"); // for Next Map phrase - LoadTranslations("mapchooser_extended.phrases"); + LoadTranslations("common.phrases"); + LoadTranslations("nominations.phrases"); + LoadTranslations("basetriggers.phrases"); // for Next Map phrase + LoadTranslations("mapchooser_extended.phrases"); - int arraySize = ByteCountToCells(PLATFORM_MAX_PATH); - g_MapList = CreateArray(arraySize); - g_AdminMapList = CreateArray(arraySize); + int arraySize = ByteCountToCells(PLATFORM_MAX_PATH); + g_MapList = CreateArray(arraySize); + g_AdminMapList = CreateArray(arraySize); - g_Cvar_ExcludeOld = CreateConVar("sm_nominate_excludeold", "1", "Specifies if the current map should be excluded from the Nominations list", 0, true, 0.00, true, 1.0); - g_Cvar_ExcludeCurrent = CreateConVar("sm_nominate_excludecurrent", "1", "Specifies if the MapChooser excluded maps should also be excluded from Nominations", 0, true, 0.00, true, 1.0); - g_Cvar_InitialDelay = CreateConVar("sm_nominate_initialdelay", "60.0", "Time in seconds before first Nomination can be made", 0, true, 0.00); - g_Cvar_NominateDelay = CreateConVar("sm_nominate_delay", "3.0", "Delay between nominations", 0, true, 0.00, true, 60.00); + g_Cvar_ExcludeOld = CreateConVar("sm_nominate_excludeold", "1", "Specifies if the current map should be excluded from the Nominations list", 0, true, 0.00, true, 1.0); + g_Cvar_ExcludeCurrent = CreateConVar("sm_nominate_excludecurrent", "1", "Specifies if the MapChooser excluded maps should also be excluded from Nominations", 0, true, 0.00, true, 1.0); + g_Cvar_InitialDelay = CreateConVar("sm_nominate_initialdelay", "60.0", "Time in seconds before first Nomination can be made", 0, true, 0.00); + g_Cvar_NominateDelay = CreateConVar("sm_nominate_delay", "3.0", "Delay between nominations", 0, true, 0.00, true, 60.00); - g_Cvar_VIPTimeframe = CreateConVar("sm_nominate_vip_timeframe", "1", "Specifies if the should be a timeframe where only VIPs can nominate maps", 0, true, 0.00, true, 1.0); - g_Cvar_VIPTimeframeMinTime = CreateConVar("sm_nominate_vip_timeframe_mintime", "1800", "Start of the timeframe where only VIPs can nominate maps (Format: HHMM)", 0, true, 0000.00, true, 2359.0); - g_Cvar_VIPTimeframeMaxTime = CreateConVar("sm_nominate_vip_timeframe_maxtime", "2200", "End of the timeframe where only VIPs can nominate maps (Format: HHMM)", 0, true, 0000.00, true, 2359.0); + g_Cvar_VIPTimeframe = CreateConVar("sm_nominate_vip_timeframe", "1", "Specifies if the should be a timeframe where only VIPs can nominate maps", 0, true, 0.00, true, 1.0); + g_Cvar_VIPTimeframeMinTime = CreateConVar("sm_nominate_vip_timeframe_mintime", "1800", "Start of the timeframe where only VIPs can nominate maps (Format: HHMM)", 0, true, 0000.00, true, 2359.0); + g_Cvar_VIPTimeframeMaxTime = CreateConVar("sm_nominate_vip_timeframe_maxtime", "2200", "End of the timeframe where only VIPs can nominate maps (Format: HHMM)", 0, true, 0000.00, true, 2359.0); - RegConsoleCmd("say", Command_Say); - RegConsoleCmd("say_team", Command_Say); + RegConsoleCmd("say", Command_Say); + RegConsoleCmd("say_team", Command_Say); - RegConsoleCmd("sm_nominate", Command_Nominate); - RegConsoleCmd("sm_nom", Command_Nominate); - RegConsoleCmd("sm_nomlist", Command_NominateList); + RegConsoleCmd("sm_nominate", Command_Nominate); + RegConsoleCmd("sm_nom", Command_Nominate); + RegConsoleCmd("sm_nomlist", Command_NominateList); - RegAdminCmd("sm_nominate_addmap", Command_Addmap, ADMFLAG_CHANGEMAP, "sm_nominate_addmap - Forces a map to be on the next mapvote."); - RegAdminCmd("sm_nominate_removemap", Command_Removemap, ADMFLAG_CHANGEMAP, "sm_nominate_removemap - Removes a map from Nominations."); + RegAdminCmd("sm_nominate_addmap", Command_Addmap, ADMFLAG_CHANGEMAP, "sm_nominate_addmap - Forces a map to be on the next mapvote."); + RegAdminCmd("sm_nominate_removemap", Command_Removemap, ADMFLAG_CHANGEMAP, "sm_nominate_removemap - Removes a map from Nominations."); - RegAdminCmd("sm_nominate_exclude", Command_AddExclude, ADMFLAG_CHANGEMAP, "sm_nominate_exclude [cooldown] [mode]- Forces a map to be inserted into the recently played maps. Effectively blocking the map from being nominated."); - RegAdminCmd("sm_nominate_exclude_time", Command_AddExcludeTime, ADMFLAG_CHANGEMAP, "sm_nominate_exclude_time [cooldown] [mode] - Forces a map to be inserted into the recently played maps. Effectively blocking the map from being nominated."); + RegAdminCmd("sm_nominate_exclude", Command_AddExclude, ADMFLAG_CHANGEMAP, "sm_nominate_exclude [cooldown] [mode]- Forces a map to be inserted into the recently played maps. Effectively blocking the map from being nominated."); + RegAdminCmd("sm_nominate_exclude_time", Command_AddExcludeTime, ADMFLAG_CHANGEMAP, "sm_nominate_exclude_time [cooldown] [mode] - Forces a map to be inserted into the recently played maps. Effectively blocking the map from being nominated."); - // Nominations Extended cvars - CreateConVar("ne_version", MCE_VERSION, "Nominations Extended Version", FCVAR_SPONLY|FCVAR_NOTIFY|FCVAR_DONTRECORD); + // Nominations Extended cvars + CreateConVar("ne_version", MCE_VERSION, "Nominations Extended Version", FCVAR_SPONLY|FCVAR_NOTIFY|FCVAR_DONTRECORD); - g_mapTrie = CreateTrie(); + g_mapTrie = CreateTrie(); + + //DB + if (!g_dDatabase) + { + //we have too many dbs so i am just re-using racetimercss + Database.Connect(SQL_OnDatabaseConnect, "racetimercss"); + } +} + +public void SQL_OnDatabaseConnect(Database db, const char[] error, any data) +{ + if(!db || strlen(error)) + { + LogError("Database error: %s", error); + return; + } + g_dDatabase = db; +} + +public void OnClientPostAdminCheck(int client) +{ + g_bClientsIgnoring[client] = false; + sql_select_hiding_unavailable_maps(client); +} + +public void sql_select_hiding_unavailable_maps(int client) +{ + if (!g_dDatabase) + { + Database.Connect(SQL_OnDatabaseConnect, "racetimercss"); + return; + } + char query[255]; + char steam_auth[64]; + GetClientAuthId(client, AuthId_Steam2, steam_auth, sizeof(steam_auth)); + //we have way too many dbs, just adding this to unloze_race_timer + Format(query, sizeof(query), "SELECT is_ignoring FROM `mapchooser_hide_unavailable` where steam_auth = '%s'", steam_auth); + g_dDatabase.Query(SQL_OnQueryCompleted_ignoring, query, client); +} + +public void SQL_OnQueryCompleted_ignoring(Database db, DBResultSet results, const char[] error, int client) +{ + if (!db) + { + return; + } + if (client > 0 && client <= MaxClients && IsClientConnected(client) && IsClientInGame(client)) + { + int val = 0; + if (results.RowCount && results.FetchRow()) + val = results.FetchInt(0); + if (val == 1) + { + g_bClientsIgnoring[client] = true; + } + } +} + +public void sql_insert_update_hiding_unavailable(int client) +{ + if (client > 0 && client <= MaxClients && IsClientConnected(client) && IsClientInGame(client)) + { + if (g_bClientsIgnoring[client]) + { + g_bClientsIgnoring[client] = false; + } + else + { + g_bClientsIgnoring[client] = true; + } + char sSID[64]; + char sQuery[256]; + GetClientAuthId(client, AuthId_Steam2, sSID, sizeof(sSID)); + if (!g_dDatabase) + { + Database.Connect(SQL_OnDatabaseConnect, "racetimercss"); + return; + } + if (StrEqual(sSID, "STEAM_ID_STOP_IGNORING_RETVALS") || StrEqual(sSID, "STEAM_ID_PENDING")) + { + PrintToChat(client, "Your steam ID is not working, not updating"); + return; + } + Format(sQuery, sizeof(sQuery), "INSERT INTO `mapchooser_hide_unavailable` (`steam_auth`, `is_ignoring`) VALUES ('%s', '%i') ON DUPLICATE KEY UPDATE `is_ignoring` = '%i'", sSID, g_bClientsIgnoring[client], g_bClientsIgnoring[client]); + DataPack hDataPack = new DataPack(); + hDataPack.WriteString(sQuery); + g_dDatabase.Query(SQL_FinishedQuery, sQuery, hDataPack, DBPrio_Normal); + } +} + +public void SQL_FinishedQuery(Database db, DBResultSet results, const char[] error, DataPack data) +{ + if (!db || strlen(error)) + { + char sQuery[256]; + ResetPack(data); + data.ReadString(sQuery, sizeof(sQuery)); + LogError("Query error 3: %s", error); + LogError("actual query: %s", sQuery); + } + delete data; +} + +public void OnClientDisconnect(int client) +{ + g_bClientsIgnoring[client] = false; } public APLRes AskPluginLoad2(Handle hThis, bool bLate, char[] err, int iErrLen) @@ -859,6 +969,18 @@ Menu BuildMapMenu(const char[] filter, int client) } } + //2023 edit to allow hiding/unhiding unavailable maps + char hiding_unavailable_maps[MAX_NAME_LENGTH]; + if (g_bClientsIgnoring[client]) + { + Format(hiding_unavailable_maps, sizeof(hiding_unavailable_maps), "Show all unavailable maps"); + } + else + { + Format(hiding_unavailable_maps, sizeof(hiding_unavailable_maps), "Hide all unavailable maps"); + } + AddMenuItem(menu, hiding_unavailable_maps, hiding_unavailable_maps); + for(int i = 0; i < GetArraySize(g_MapList); i++) { GetArrayString(g_MapList, i, map, sizeof(map)); @@ -875,6 +997,17 @@ Menu BuildMapMenu(const char[] filter, int client) StrCat(map, sizeof(map), " (Nominated)"); } } + if (g_bClientsIgnoring[client]) + { + if(AreRestrictionsActive() && ( + GetMapCooldownTime(map) > GetTime() || + GetMapTimeRestriction(map) || + GetMapPlayerRestriction(map) || + GetMapVIPRestriction(map, client))) + { + continue; + } + } AddMenuItem(menu, map, map); } } @@ -946,6 +1079,19 @@ public int Handler_MapSelectMenu(Menu menu, MenuAction action, int param1, int p char name[MAX_NAME_LENGTH]; GetMenuItem(menu, param2, map, sizeof(map)); + if (StrEqual(map, "Hide all unavailable maps")) + { + PrintToChat(param1, "Hiding all unavailable maps from the nomination list"); + sql_insert_update_hiding_unavailable(param1); + return 0; + } + if (StrEqual(map, "Show all unavailable maps")) + { + PrintToChat(param1, "Displaying all unavailable maps from the nomination list"); + sql_insert_update_hiding_unavailable(param1); + return 0; + } + GetClientName(param1, name, MAX_NAME_LENGTH); if(AreRestrictionsActive() && (