summaryrefslogtreecommitdiff
path: root/sourcemod/scripting/gokz-replays/replay_menu.sp
diff options
context:
space:
mode:
authornavewindre <nw@moneybot.cc>2023-12-04 18:06:10 +0100
committernavewindre <nw@moneybot.cc>2023-12-04 18:06:10 +0100
commitaef0d1c1268ab7d4bc18996c9c6b4da16a40aadc (patch)
tree43e766b51704f4ab8b383583bdc1871eeeb9c698 /sourcemod/scripting/gokz-replays/replay_menu.sp
parent38f1140c11724da05a23a10385061200b907cf6e (diff)
bbbbbbbbwaaaaaaaaaaa
Diffstat (limited to 'sourcemod/scripting/gokz-replays/replay_menu.sp')
-rw-r--r--sourcemod/scripting/gokz-replays/replay_menu.sp139
1 files changed, 139 insertions, 0 deletions
diff --git a/sourcemod/scripting/gokz-replays/replay_menu.sp b/sourcemod/scripting/gokz-replays/replay_menu.sp
new file mode 100644
index 0000000..94acd66
--- /dev/null
+++ b/sourcemod/scripting/gokz-replays/replay_menu.sp
@@ -0,0 +1,139 @@
+/*
+ Lets player select a replay bot to play back.
+*/
+
+
+
+static int selectedReplayMode[MAXPLAYERS + 1];
+
+
+
+// =====[ PUBLIC ]=====
+
+void DisplayReplayModeMenu(int client)
+{
+ if (g_ReplayInfoCache.Length == 0)
+ {
+ GOKZ_PrintToChat(client, true, "%t", "No Replays Found (Map)");
+ GOKZ_PlayErrorSound(client);
+ return;
+ }
+
+ Menu menu = new Menu(MenuHandler_ReplayMode);
+ menu.SetTitle("%T", "Replay Menu (Mode) - Title", client, gC_CurrentMap);
+ GOKZ_MenuAddModeItems(client, menu, false);
+ menu.Display(client, MENU_TIME_FOREVER);
+}
+
+
+
+// =====[ EVENTS ]=====
+
+public int MenuHandler_ReplayMode(Menu menu, MenuAction action, int param1, int param2)
+{
+ if (action == MenuAction_Select)
+ {
+ selectedReplayMode[param1] = param2;
+ DisplayReplayMenu(param1);
+ }
+ else if (action == MenuAction_End)
+ {
+ delete menu;
+ }
+ return 0;
+}
+
+public int MenuHandler_Replay(Menu menu, MenuAction action, int param1, int param2)
+{
+ if (action == MenuAction_Select)
+ {
+ char info[4];
+ menu.GetItem(param2, info, sizeof(info));
+ int replayIndex = StringToInt(info);
+ int replayInfo[RP_CACHE_BLOCKSIZE];
+ g_ReplayInfoCache.GetArray(replayIndex, replayInfo);
+
+ char path[PLATFORM_MAX_PATH];
+ BuildPath(Path_SM, path, sizeof(path),
+ "%s/%s/%d_%s_%s_%s.%s",
+ RP_DIRECTORY_RUNS, gC_CurrentMap, replayInfo[0], gC_ModeNamesShort[replayInfo[1]], gC_StyleNamesShort[replayInfo[2]], gC_TimeTypeNames[replayInfo[3]], RP_FILE_EXTENSION);
+ if (!FileExists(path))
+ {
+ BuildPath(Path_SM, path, sizeof(path),
+ "%s/%d_%s_%s_%s.%s",
+ RP_DIRECTORY, gC_CurrentMap, replayInfo[0], gC_ModeNamesShort[replayInfo[1]], gC_StyleNamesShort[replayInfo[2]], gC_TimeTypeNames[replayInfo[3]], RP_FILE_EXTENSION);
+ if (!FileExists(path))
+ {
+ LogError("Failed to load file: \"%s\".", path);
+ GOKZ_PrintToChat(param1, true, "%t", "Replay Menu - No File");
+ return 0;
+ }
+ }
+
+ LoadReplayBot(param1, path);
+ }
+ else if (action == MenuAction_Cancel)
+ {
+ DisplayReplayModeMenu(param1);
+ }
+ else if (action == MenuAction_End)
+ {
+ delete menu;
+ }
+ return 0;
+}
+
+
+
+// =====[ PRIVATE ]=====
+
+static void DisplayReplayMenu(int client)
+{
+ Menu menu = new Menu(MenuHandler_Replay);
+ menu.SetTitle("%T", "Replay Menu - Title", client, gC_CurrentMap, gC_ModeNames[selectedReplayMode[client]]);
+ if (ReplayMenuAddItems(client, menu) > 0)
+ {
+ menu.Display(client, MENU_TIME_FOREVER);
+ }
+ else
+ {
+ GOKZ_PrintToChat(client, true, "%t", "No Replays Found (Mode)", gC_ModeNames[selectedReplayMode[client]]);
+ GOKZ_PlayErrorSound(client);
+ DisplayReplayModeMenu(client);
+ }
+}
+
+// Returns the number of replay menu items added
+static int ReplayMenuAddItems(int client, Menu menu)
+{
+ int replaysAdded = 0;
+ int replayCount = g_ReplayInfoCache.Length;
+ int replayInfo[RP_CACHE_BLOCKSIZE];
+ char temp[32], indexString[4];
+
+ menu.RemoveAllItems();
+
+ for (int i = 0; i < replayCount; i++)
+ {
+ IntToString(i, indexString, sizeof(indexString));
+ g_ReplayInfoCache.GetArray(i, replayInfo);
+ if (replayInfo[1] != selectedReplayMode[client]) // Wrong mode!
+ {
+ continue;
+ }
+
+ if (replayInfo[0] == 0)
+ {
+ FormatEx(temp, sizeof(temp), "Main %s", gC_TimeTypeNames[replayInfo[3]]);
+ }
+ else
+ {
+ FormatEx(temp, sizeof(temp), "Bonus %d %s", replayInfo[0], gC_TimeTypeNames[replayInfo[3]]);
+ }
+ menu.AddItem(indexString, temp, ITEMDRAW_DEFAULT);
+
+ replaysAdded++;
+ }
+
+ return replaysAdded;
+} \ No newline at end of file