diff options
| author | navewindre <nw@moneybot.cc> | 2023-12-04 18:06:10 +0100 |
|---|---|---|
| committer | navewindre <nw@moneybot.cc> | 2023-12-04 18:06:10 +0100 |
| commit | aef0d1c1268ab7d4bc18996c9c6b4da16a40aadc (patch) | |
| tree | 43e766b51704f4ab8b383583bdc1871eeeb9c698 /sourcemod/scripting/gokz-global/maptop_menu.sp | |
| parent | 38f1140c11724da05a23a10385061200b907cf6e (diff) | |
bbbbbbbbwaaaaaaaaaaa
Diffstat (limited to 'sourcemod/scripting/gokz-global/maptop_menu.sp')
| -rw-r--r-- | sourcemod/scripting/gokz-global/maptop_menu.sp | 249 |
1 files changed, 249 insertions, 0 deletions
diff --git a/sourcemod/scripting/gokz-global/maptop_menu.sp b/sourcemod/scripting/gokz-global/maptop_menu.sp new file mode 100644 index 0000000..0c71346 --- /dev/null +++ b/sourcemod/scripting/gokz-global/maptop_menu.sp @@ -0,0 +1,249 @@ +/* + Menu with the top global times for a map course and mode. +*/ + +static bool cameFromLocalRanks[MAXPLAYERS + 1]; +static char mapTopMap[MAXPLAYERS + 1][64]; +static int mapTopCourse[MAXPLAYERS + 1]; +static int mapTopMode[MAXPLAYERS + 1]; + + + +// =====[ PUBLIC ]===== + +void DisplayMapTopModeMenu(int client, const char[] map, int course) +{ + FormatEx(mapTopMap[client], sizeof(mapTopMap[]), map); + mapTopCourse[client] = course; + + Menu menu = new Menu(MenuHandler_MapTopModeMenu); + MapTopModeMenuSetTitle(client, menu); + GOKZ_MenuAddModeItems(client, menu, false); + menu.Display(client, MENU_TIME_FOREVER); +} + +void DisplayMapTopMenu(int client, const char[] map, int course, int mode) +{ + FormatEx(mapTopMap[client], sizeof(mapTopMap[]), map); + mapTopCourse[client] = course; + mapTopMode[client] = mode; + + Menu menu = new Menu(MenuHandler_MapTopMenu); + MapTopMenuSetTitle(client, menu); + MapTopMenuAddItems(client, menu); + menu.Display(client, MENU_TIME_FOREVER); +} + +void DisplayMapTopSubmenu(int client, const char[] map, int course, int mode, int timeType, bool fromLocalRanks = false) +{ + char modeStr[32]; + + cameFromLocalRanks[client] = fromLocalRanks; + + DataPack dp = new DataPack(); + dp.WriteCell(GetClientUserId(client)); + dp.WriteCell(timeType); + + FormatEx(mapTopMap[client], sizeof(mapTopMap[]), map); + mapTopCourse[client] = course; + mapTopMode[client] = mode; + GOKZ_GL_GetModeString(mode, modeStr, sizeof(modeStr)); + + // TODO Hard coded 128 tick + // TODO Hard coded cap at top 20 + // TODO Not true NUB yet + GlobalAPI_GetRecordsTop(DisplayMapTopSubmenuCallback, dp, _, _, _, map, 128, course, modeStr, + timeType == TimeType_Nub ? DEFAULT_BOOL : false, _, 0, 20); +} + + + +// =====[ EVENTS ]===== + +public int MenuHandler_MapTopModeMenu(Menu menu, MenuAction action, int param1, int param2) +{ + if (action == MenuAction_Select) + { + // param1 = client, param2 = mode + DisplayMapTopMenu(param1, mapTopMap[param1], mapTopCourse[param1], param2); + } + else if (action == MenuAction_End) + { + delete menu; + } + return 0; +} + +public int MenuHandler_MapTopMenu(Menu menu, MenuAction action, int param1, int param2) +{ + if (action == MenuAction_Select) + { + char info[8]; + menu.GetItem(param2, info, sizeof(info)); + int timeType = StringToInt(info); + DisplayMapTopSubmenu(param1, mapTopMap[param1], mapTopCourse[param1], mapTopMode[param1], timeType); + } + if (action == MenuAction_Cancel && param2 == MenuCancel_Exit) + { + DisplayMapTopModeMenu(param1, mapTopMap[param1], mapTopCourse[param1]); + } + else if (action == MenuAction_End) + { + delete menu; + } + return 0; +} + +public int MenuHandler_MapTopSubmenu(Menu menu, MenuAction action, int param1, int param2) +{ + if (action == MenuAction_Cancel && param2 == MenuCancel_Exit) + { + if (cameFromLocalRanks[param1]) + { + GOKZ_LR_ReopenMapTopMenu(param1); + } + else + { + DisplayMapTopMenu(param1, mapTopMap[param1], mapTopCourse[param1], mapTopMode[param1]); + } + } + if (action == MenuAction_End) + { + delete menu; + } + return 0; +} + + + +// =====[ PRIVATE ]===== + +static void MapTopModeMenuSetTitle(int client, Menu menu) +{ + if (mapTopCourse[client] == 0) + { + menu.SetTitle("%T", "Global Map Top Mode Menu - Title", client, mapTopMap[client]); + } + else + { + menu.SetTitle("%T", "Global Map Top Mode Menu - Title (Bonus)", client, mapTopMap[client], mapTopCourse[client]); + } +} + +static void MapTopMenuSetTitle(int client, Menu menu) +{ + if (mapTopCourse[client] == 0) + { + menu.SetTitle("%T", "Global Map Top Menu - Title", client, mapTopMap[client], gC_ModeNames[mapTopMode[client]]); + } + else + { + menu.SetTitle("%T", "Global Map Top Menu - Title (Bonus)", client, mapTopMap[client], mapTopCourse[client], gC_ModeNames[mapTopMode[client]]); + } +} + +static void MapTopMenuAddItems(int client, Menu menu) +{ + char display[32]; + for (int i = 0; i < TIMETYPE_COUNT; i++) + { + FormatEx(display, sizeof(display), "%T", "Global Map Top Menu - Top", client, gC_TimeTypeNames[i]); + menu.AddItem(IntToStringEx(i), display); + } +} + +public int DisplayMapTopSubmenuCallback(JSON_Object top, GlobalAPIRequestData request, DataPack dp) +{ + dp.Reset(); + int client = GetClientOfUserId(dp.ReadCell()); + int timeType = dp.ReadCell(); + delete dp; + + if (request.Failure) + { + LogError("Failed to get top records with Global API."); + return 0; + } + + if (!top.IsArray) + { + LogError("GlobalAPI returned a malformed response while looking up the top records."); + return 0; + } + + if (!IsValidClient(client)) + { + return 0; + } + + Menu menu = new Menu(MenuHandler_MapTopSubmenu); + if (mapTopCourse[client] == 0) + { + menu.SetTitle("%T", "Global Map Top Submenu - Title", client, + gC_TimeTypeNames[timeType], mapTopMap[client], gC_ModeNames[mapTopMode[client]]); + } + else + { + menu.SetTitle("%T", "Global Map Top Submenu - Title (Bonus)", client, + gC_TimeTypeNames[timeType], mapTopMap[client], mapTopCourse[client], gC_ModeNames[mapTopMode[client]]); + } + + if (MapTopSubmenuAddItems(menu, top, timeType) == 0) + { // If no records found + if (timeType == TimeType_Pro) + { + GOKZ_PrintToChat(client, true, "%t", "No Global Times Found (PRO)"); + } + else + { + GOKZ_PrintToChat(client, true, "%t", "No Global Times Found"); + } + + if (cameFromLocalRanks[client]) + { + GOKZ_LR_ReopenMapTopMenu(client); + } + else + { + DisplayMapTopMenu(client, mapTopMap[client], mapTopCourse[client], mapTopMode[client]); + } + } + else + { + menu.Pagination = 5; + menu.Display(client, MENU_TIME_FOREVER); + } + return 0; +} + +// Returns number of record times added to the menu +static int MapTopSubmenuAddItems(Menu menu, JSON_Object records, int timeType) +{ + char playerName[MAX_NAME_LENGTH]; + char display[128]; + + for (int i = 0; i < records.Length; i++) + { + APIRecord record = view_as<APIRecord>(records.GetObjectIndexed(i)); + + record.GetPlayerName(playerName, sizeof(playerName)); + + switch (timeType) + { + case TimeType_Nub: + { + FormatEx(display, sizeof(display), "#%-2d %11s %3d TP %s", + i + 1, GOKZ_FormatTime(record.Time), record.Teleports, playerName); + } + case TimeType_Pro: + { + FormatEx(display, sizeof(display), "#%-2d %11s %s", + i + 1, GOKZ_FormatTime(record.Time), playerName); + } + } + + menu.AddItem("", display, ITEMDRAW_DISABLED); + } + + return records.Length; +}
\ No newline at end of file |
