From b6c0cb232ddd22b818c152e280b57caccc43ce17 Mon Sep 17 00:00:00 2001 From: jenz Date: Fri, 14 Aug 2026 16:40:31 +0200 Subject: [PATCH] added category menu for nominations and putting maps into sub menus --- .../scripting/nominations_extended_avg.sp | 172 ++++++++++++++---- 1 file changed, 140 insertions(+), 32 deletions(-) diff --git a/mapchooser_extended/scripting/nominations_extended_avg.sp b/mapchooser_extended/scripting/nominations_extended_avg.sp index 97a987c..c2e3ba5 100755 --- a/mapchooser_extended/scripting/nominations_extended_avg.sp +++ b/mapchooser_extended/scripting/nominations_extended_avg.sp @@ -71,6 +71,9 @@ Handle g_Cvar_VIPTimeframe = INVALID_HANDLE; Handle g_Cvar_VIPTimeframeMinTime = INVALID_HANDLE; Handle g_Cvar_VIPTimeframeMaxTime = INVALID_HANDLE; +KeyValues g_Config; + + int g_Player_NominationDelay[MAXPLAYERS+1]; int g_NominationDelay; @@ -127,6 +130,26 @@ public void OnMapStart() //we have too many dbs so i am just re-using racetimercss Database.Connect(SQL_OnDatabaseConnect, "racetimercss"); } + + if(g_Config) + delete g_Config; + + char sConfigFile[PLATFORM_MAX_PATH]; + BuildPath(Path_SM, sConfigFile, sizeof(sConfigFile), "configs/mapchooser_extended.cfg"); + if(!FileExists(sConfigFile)) + { + LogMessage("Could not find config: \"%s\"", sConfigFile); + return; + } + + g_Config = new KeyValues("mapchooser_extended"); + if(!g_Config.ImportFromFile(sConfigFile)) + { + delete g_Config; + LogMessage("ImportFromFile() failed!"); + return; + } + g_Config.Rewind(); } public void SQL_OnDatabaseConnect(Database db, const char[] error, any data) @@ -700,26 +723,45 @@ public int Handler_NominateListMenu(Menu menu, MenuAction action, int param1, in return 0; } +void SetNominateMenuTitle(Menu menu, int client) +{ + int nominate_worth = GetPlayerWorthRTV_boost_(client); + if (Leader_Is(client)) + SetMenuTitle(menu, "Nominate Map: (%i Nomination Boost Leader)", 999); + else + SetMenuTitle(menu, "Nominate Map: (%i Nomination Boost)", nominate_worth); +} + void AttemptNominate(int client, const char[] filter = "") { if(!client) return; Menu menu = g_MapMenu; - menu = BuildMapMenu(filter, client); - - int nominate_worth = GetPlayerWorthRTV_boost_(client); - if (Leader_Is(client)) + if (filter[0]) { - SetMenuTitle(menu, "Nominate Map: (%i Nomination Boost Leader)", 999); + // preserves the existing behavior for the "map wasnt found, try a substring search" fallback + menu = BuildMapMenu(filter, client); } else { - SetMenuTitle(menu, "Nominate Map: (%i Nomination Boost)", nominate_worth); + menu = BuildCategoryMenu(client); } + + SetNominateMenuTitle(menu, client); DisplayMenu(menu, client, MENU_TIME_FOREVER); } +public void GetMapCategory(const char[] mapname, char[] output_category, int maxlen) +{ + strcopy(output_category, maxlen, "Uncategorized"); + if (g_Config && g_Config.JumpToKey(mapname)) + { + g_Config.GetString("MapCategory", output_category, maxlen, "Uncategorized"); + g_Config.Rewind(); + } +} + void AttemptAdminNominate(int client, const char[] filter = "") { if(!client) @@ -867,11 +909,81 @@ bool PopulateNominateListMenu(Menu menu, int client, const char[] filter = "") return true; } -Menu BuildMapMenu(const char[] filter, int client) +Menu BuildCategoryMenu(int client) +{ + Menu menu = CreateMenu(Handler_CategorySelectMenu, MENU_ACTIONS_DEFAULT); + + //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); + + ArrayList categories = CreateArray(ByteCountToCells(64)); + static char map[PLATFORM_MAX_PATH]; + static char category[64]; + + for (int i = 0; i < GetArraySize(g_MapList); i++) + { + GetArrayString(g_MapList, i, map, sizeof(map)); + GetMapCategory(map, category, sizeof(category)); + + if (FindStringInArray(categories, category) == -1) + PushArrayString(categories, category); + } + + SortADTArray(categories, Sort_Ascending, Sort_String); + + for (int i = 0; i < GetArraySize(categories); i++) + { + GetArrayString(categories, i, category, sizeof(category)); + AddMenuItem(menu, category, category); + } + + delete categories; + + SetMenuExitButton(menu, true); + return menu; +} + +public int Handler_CategorySelectMenu(Menu menu, MenuAction action, int param1, int param2) +{ + switch(action) + { + case MenuAction_End: + { + delete menu; + } + case MenuAction_Select: + { + static char item[64]; + GetMenuItem(menu, param2, item, sizeof(item)); + + if (StrEqual(item, "Hide all unavailable maps") || StrEqual(item, "Show all unavailable maps")) + { + sql_insert_update_hiding_unavailable(param1); + Menu refreshed = BuildCategoryMenu(param1); + SetNominateMenuTitle(refreshed, param1); + DisplayMenu(refreshed, param1, MENU_TIME_FOREVER); + return 0; + } + + Menu submenu = BuildMapMenu("", param1, item); + SetNominateMenuTitle(submenu, param1); + DisplayMenu(submenu, param1, MENU_TIME_FOREVER); + } + } + return 0; +} + +Menu BuildMapMenu(const char[] filter, int client, const char[] category = "") { Menu menu = CreateMenu(Handler_MapSelectMenu, MENU_ACTIONS_DEFAULT|MenuAction_DrawItem|MenuAction_DisplayItem); static char map[PLATFORM_MAX_PATH * 2]; + static char mapCategory[64]; int arraySize = ByteCountToCells(PLATFORM_MAX_PATH); ArrayList MapList = CreateArray(arraySize); @@ -909,22 +1021,19 @@ 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)); + if (category[0]) + { + //only shows maps that are in this actual category. + GetMapCategory(map, mapCategory, sizeof(mapCategory)); + if (!StrEqual(mapCategory, category)) + continue; + } + if(!filter[0] || StrContains(map, filter, false) != -1) { if (client != 0 && nominated_maps) @@ -966,7 +1075,10 @@ Menu BuildMapMenu(const char[] filter, int client) delete OwnerList; delete sm; - SetMenuExitButton(menu, true); + if (category[0]) + SetMenuExitBackButton(menu, true); + else + SetMenuExitButton(menu, true); return menu; } @@ -1013,6 +1125,15 @@ public int Handler_MapSelectMenu(Menu menu, MenuAction action, int param1, int p delete menu; } } + case MenuAction_Cancel: + { + if (param2 == MenuCancel_ExitBack) + { + Menu back = BuildCategoryMenu(param1); + SetNominateMenuTitle(back, param1); + DisplayMenu(back, param1, MENU_TIME_FOREVER); + } + } case MenuAction_Select: { //2023-03-22 edit since client sometimes is 0 which fucks up mapchooser @@ -1028,19 +1149,6 @@ 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); int Index_Cooldown = GetExcludedMapListingPriority(map); if (Index_Cooldown > 0)