From aef0d1c1268ab7d4bc18996c9c6b4da16a40aadc Mon Sep 17 00:00:00 2001 From: navewindre Date: Mon, 4 Dec 2023 18:06:10 +0100 Subject: bbbbbbbbwaaaaaaaaaaa --- sourcemod/scripting/gokz-racing/race_menu.sp | 464 +++++++++++++++++++++++++++ 1 file changed, 464 insertions(+) create mode 100644 sourcemod/scripting/gokz-racing/race_menu.sp (limited to 'sourcemod/scripting/gokz-racing/race_menu.sp') diff --git a/sourcemod/scripting/gokz-racing/race_menu.sp b/sourcemod/scripting/gokz-racing/race_menu.sp new file mode 100644 index 0000000..0518a2a --- /dev/null +++ b/sourcemod/scripting/gokz-racing/race_menu.sp @@ -0,0 +1,464 @@ +/* + A menu for hosting big races. +*/ + + + +#define ITEM_INFO_START "st" +#define ITEM_INFO_ABORT "ab" +#define ITEM_INFO_INVITE "iv" +#define ITEM_INFO_MODE "md" +#define ITEM_INFO_COURSE "co" +#define ITEM_INFO_TELEPORT "tp" + +static int raceMenuMode[MAXPLAYERS + 1]; +static int raceMenuCourse[MAXPLAYERS + 1]; +static int raceMenuCheckpointLimit[MAXPLAYERS + 1]; +static int raceMenuCheckpointCooldown[MAXPLAYERS + 1]; + + + +// =====[ PICK MODE ]===== + +void DisplayRaceMenu(int client, bool reset = true) +{ + if (InRace(client) && (!IsRaceHost(client) || GetRaceInfo(GetRaceID(client), RaceInfo_Type) != RaceType_Normal)) + { + GOKZ_PrintToChat(client, true, "%t", "You Are Already Part Of A Race"); + GOKZ_PlayErrorSound(client); + return; + } + + if (reset) + { + raceMenuMode[client] = GOKZ_GetCoreOption(client, Option_Mode); + raceMenuCourse[client] = 0; + } + + Menu menu = new Menu(MenuHandler_Race); + menu.SetTitle("%T", "Race Menu - Title", client); + RaceMenuAddItems(client, menu); + menu.Display(client, MENU_TIME_FOREVER); +} + +public int MenuHandler_Race(Menu menu, MenuAction action, int param1, int param2) +{ + if (action == MenuAction_Select) + { + char info[16]; + menu.GetItem(param2, info, sizeof(info)); + + if (StrEqual(info, ITEM_INFO_START, false)) + { + if (!StartHostedRace(param1)) + { + DisplayRaceMenu(param1, false); + } + } + else if (StrEqual(info, ITEM_INFO_ABORT, false)) + { + AbortHostedRace(param1); + DisplayRaceMenu(param1, false); + } + else if (StrEqual(info, ITEM_INFO_INVITE, false)) + { + if (!InRace(param1)) + { + HostRace(param1, RaceType_Normal, raceMenuCourse[param1], raceMenuMode[param1], raceMenuCheckpointLimit[param1], raceMenuCheckpointCooldown[param1]); + } + + SendRequestAll(param1); + GOKZ_PrintToChat(param1, true, "%t", "You Invited Everyone"); + DisplayRaceMenu(param1, false); + } + else if (StrEqual(info, ITEM_INFO_MODE, false)) + { + DisplayRaceModeMenu(param1); + } + else if (StrEqual(info, ITEM_INFO_COURSE, false)) + { + int course = raceMenuCourse[param1]; + do + { + course++; + if (!GOKZ_IsValidCourse(course)) + { + course = 0; + } + } while (!GOKZ_GetCourseRegistered(course) && course != raceMenuCourse[param1]); + raceMenuCourse[param1] = course; + DisplayRaceMenu(param1, false); + } + else if (StrEqual(info, ITEM_INFO_TELEPORT, false)) + { + DisplayRaceCheckpointMenu(param1); + } + } + else if (action == MenuAction_End) + { + delete menu; + } + return 0; +} + +void RaceMenuAddItems(int client, Menu menu) +{ + char display[32]; + + menu.RemoveAllItems(); + + bool pending = GetRaceInfo(GetRaceID(client), RaceInfo_Status) == RaceStatus_Pending; + FormatEx(display, sizeof(display), "%T", "Race Menu - Start Race", client); + menu.AddItem(ITEM_INFO_START, display, (InRace(client) && pending) ? ITEMDRAW_DEFAULT : ITEMDRAW_DISABLED); + + FormatEx(display, sizeof(display), "%T", "Race Menu - Invite Everyone", client); + menu.AddItem(ITEM_INFO_INVITE, display, (!InRace(client) || pending) ? ITEMDRAW_DEFAULT : ITEMDRAW_DISABLED); + + FormatEx(display, sizeof(display), "%T\n \n%T", "Race Menu - Abort Race", client, "Race Menu - Rules", client); + menu.AddItem(ITEM_INFO_ABORT, display, InRace(client) ? ITEMDRAW_DEFAULT : ITEMDRAW_DISABLED); + + FormatEx(display, sizeof(display), "%s", gC_ModeNames[raceMenuMode[client]]); + menu.AddItem(ITEM_INFO_MODE, display, InRace(client) ? ITEMDRAW_DISABLED : ITEMDRAW_DEFAULT); + + if (raceMenuCourse[client] == 0) + { + FormatEx(display, sizeof(display), "%T", "Race Rules - Main Course", client); + } + else + { + FormatEx(display, sizeof(display), "%T %d", "Race Rules - Bonus Course", client, raceMenuCourse[client]); + } + menu.AddItem(ITEM_INFO_COURSE, display, InRace(client) ? ITEMDRAW_DISABLED : ITEMDRAW_DEFAULT); + + FormatEx(display, sizeof(display), "%s", GetRaceRuleSummary(client, raceMenuCheckpointLimit[client], raceMenuCheckpointCooldown[client])); + menu.AddItem(ITEM_INFO_TELEPORT, display, InRace(client) ? ITEMDRAW_DISABLED : ITEMDRAW_DEFAULT); +} + + + +// =====[ MODE MENU ]===== + +static void DisplayRaceModeMenu(int client) +{ + Menu menu = new Menu(MenuHandler_RaceMode); + menu.ExitButton = false; + menu.ExitBackButton = true; + menu.SetTitle("%T", "Mode Rule Menu - Title", client); + GOKZ_MenuAddModeItems(client, menu, true); + menu.Display(client, MENU_TIME_FOREVER); +} + +public int MenuHandler_RaceMode(Menu menu, MenuAction action, int param1, int param2) +{ + if (action == MenuAction_Select) + { + raceMenuMode[param1] = param2; + DisplayRaceMenu(param1, false); + } + else if (action == MenuAction_Cancel) + { + DisplayRaceMenu(param1, false); + } + else if (action == MenuAction_End) + { + delete menu; + } + return 0; +} + + + +// =====[ CHECKPOINT MENU ]===== + +static void DisplayRaceCheckpointMenu(int client) +{ + Menu menu = new Menu(MenuHandler_RaceCheckpoint); + menu.ExitButton = false; + menu.ExitBackButton = true; + menu.SetTitle("%T", "Checkpoint Rule Menu - Title", client); + RaceCheckpointMenuAddItems(client, menu); + menu.Display(client, MENU_TIME_FOREVER); +} + +public int MenuHandler_RaceCheckpoint(Menu menu, MenuAction action, int param1, int param2) +{ + if (action == MenuAction_Select) + { + switch (param2) + { + case CheckpointRule_None: + { + raceMenuCheckpointLimit[param1] = 0; + raceMenuCheckpointCooldown[param1] = 0; + DisplayRaceMenu(param1, false); + } + case CheckpointRule_Limit: + { + DisplayCheckpointLimitMenu(param1); + } + case CheckpointRule_Cooldown: + { + DisplayCheckpointCooldownMenu(param1); + } + case CheckpointRule_Unlimited: + { + raceMenuCheckpointLimit[param1] = -1; + raceMenuCheckpointCooldown[param1] = 0; + DisplayRaceMenu(param1, false); + } + } + } + else if (action == MenuAction_Cancel) + { + DisplayRaceMenu(param1, false); + } + else if (action == MenuAction_End) + { + delete menu; + } + return 0; +} + +void RaceCheckpointMenuAddItems(int client, Menu menu) +{ + char display[32]; + + menu.RemoveAllItems(); + + FormatEx(display, sizeof(display), "%T", "Checkpoint Rule - None", client); + menu.AddItem("", display); + + if (raceMenuCheckpointLimit[client] == -1) + { + FormatEx(display, sizeof(display), "%T", "Checkpoint Rule - No Checkpoint Limit", client); + } + else + { + FormatEx(display, sizeof(display), "%T", "Checkpoint Rule - Checkpoint Limit", client, raceMenuCheckpointLimit[client]); + } + menu.AddItem("", display); + + if (raceMenuCheckpointCooldown[client] == 0) + { + FormatEx(display, sizeof(display), "%T", "Checkpoint Rule - No Checkpoint Cooldown", client); + } + else + { + FormatEx(display, sizeof(display), "%T", "Checkpoint Rule - Checkpoint Cooldown", client, raceMenuCheckpointCooldown[client]); + } + menu.AddItem("", display); + + FormatEx(display, sizeof(display), "%T", "Checkpoint Rule - Unlimited", client); + menu.AddItem("", display); +} + + + +// =====[ CP LIMIT MENU ]===== + +static void DisplayCheckpointLimitMenu(int client) +{ + char display[32]; + + Menu menu = new Menu(MenuHandler_RaceCheckpointLimit); + menu.ExitButton = false; + menu.ExitBackButton = true; + + if (raceMenuCheckpointLimit[client] == -1) + { + menu.SetTitle("%T", "Checkpoint Limit Menu - Title Unlimited", client); + } + else + { + menu.SetTitle("%T", "Checkpoint Limit Menu - Title Limited", client, raceMenuCheckpointLimit[client]); + } + + FormatEx(display, sizeof(display), "%T", "Checkpoint Limit Menu - Add One", client); + menu.AddItem("+1", display); + + FormatEx(display, sizeof(display), "%T", "Checkpoint Limit Menu - Add Five", client); + menu.AddItem("+5", display); + + FormatEx(display, sizeof(display), "%T", "Checkpoint Limit Menu - Remove One", client); + menu.AddItem("-1", display); + + FormatEx(display, sizeof(display), "%T", "Checkpoint Limit Menu - Remove Five", client); + menu.AddItem("-5", display); + + FormatEx(display, sizeof(display), "%T", "Checkpoint Limit Menu - Unlimited", client); + menu.AddItem("Unlimited", display); + + menu.Display(client, MENU_TIME_FOREVER); +} + +public int MenuHandler_RaceCheckpointLimit(Menu menu, MenuAction action, int param1, int param2) +{ + if (action == MenuAction_Select) + { + char item[32]; + menu.GetItem(param2, item, sizeof(item)); + if (StrEqual(item, "+1")) + { + if (raceMenuCheckpointLimit[param1] == -1) + { + raceMenuCheckpointLimit[param1]++; + } + raceMenuCheckpointLimit[param1]++; + } + if (StrEqual(item, "+5")) + { + if (raceMenuCheckpointLimit[param1] == -1) + { + raceMenuCheckpointLimit[param1]++; + } + raceMenuCheckpointLimit[param1] += 5; + } + if (StrEqual(item, "-1")) + { + raceMenuCheckpointLimit[param1]--; + } + if (StrEqual(item, "-5")) + { + raceMenuCheckpointLimit[param1] -= 5; + } + if (StrEqual(item, "Unlimited")) + { + raceMenuCheckpointLimit[param1] = -1; + DisplayRaceCheckpointMenu(param1); + return 0; + } + + raceMenuCheckpointLimit[param1] = raceMenuCheckpointLimit[param1] < 0 ? 0 : raceMenuCheckpointLimit[param1]; + DisplayCheckpointLimitMenu(param1); + } + else if (action == MenuAction_Cancel) + { + DisplayRaceCheckpointMenu(param1); + } + else if (action == MenuAction_End) + { + delete menu; + } + return 0; +} + + + +// =====[ CP COOLDOWN MENU ]===== + +static void DisplayCheckpointCooldownMenu(int client) +{ + char display[32]; + + Menu menu = new Menu(MenuHandler_RaceCPCooldown); + menu.ExitButton = false; + menu.ExitBackButton = true; + + if (raceMenuCheckpointCooldown[client] == -1) + { + menu.SetTitle("%T", "Checkpoint Cooldown Menu - Title None", client); + } + else + { + menu.SetTitle("%T", "Checkpoint Cooldown Menu - Title Limited", client, raceMenuCheckpointCooldown[client]); + } + + FormatEx(display, sizeof(display), "%T", "Checkpoint Cooldown Menu - Add One Second", client); + menu.AddItem("+1", display); + + FormatEx(display, sizeof(display), "%T", "Checkpoint Cooldown Menu - Add Five Seconds", client); + menu.AddItem("+5", display); + + FormatEx(display, sizeof(display), "%T", "Checkpoint Cooldown Menu - Remove One Second", client); + menu.AddItem("-1", display); + + FormatEx(display, sizeof(display), "%T", "Checkpoint Cooldown Menu - Remove Five Seconds", client); + menu.AddItem("-5", display); + + FormatEx(display, sizeof(display), "%T", "Checkpoint Cooldown Menu - None", client); + menu.AddItem("None", display); + + menu.Display(client, MENU_TIME_FOREVER); +} + +public int MenuHandler_RaceCPCooldown(Menu menu, MenuAction action, int param1, int param2) +{ + if (action == MenuAction_Select) + { + char item[32]; + menu.GetItem(param2, item, sizeof(item)); + if (StrEqual(item, "+1")) + { + if (raceMenuCheckpointCooldown[param1] == -1) + { + raceMenuCheckpointCooldown[param1]++; + } + raceMenuCheckpointCooldown[param1]++; + } + if (StrEqual(item, "+5")) + { + if (raceMenuCheckpointCooldown[param1] == -1) + { + raceMenuCheckpointCooldown[param1]++; + } + raceMenuCheckpointCooldown[param1] += 5; + } + if (StrEqual(item, "-1")) + { + raceMenuCheckpointCooldown[param1]--; + } + if (StrEqual(item, "-5")) + { + raceMenuCheckpointCooldown[param1] -= 5; + } + if (StrEqual(item, "None")) + { + raceMenuCheckpointCooldown[param1] = 0; + DisplayRaceCheckpointMenu(param1); + return 0; + } + + raceMenuCheckpointCooldown[param1] = raceMenuCheckpointCooldown[param1] < 0 ? 0 : raceMenuCheckpointCooldown[param1]; + DisplayCheckpointCooldownMenu(param1); + } + else if (action == MenuAction_Cancel) + { + DisplayRaceCheckpointMenu(param1); + } + else if (action == MenuAction_End) + { + delete menu; + } + return 0; +} + + + +// =====[ PRIVATE ]===== + +char[] GetRaceRuleSummary(int client, int checkpointLimit, int checkpointCooldown) +{ + char rulesString[64]; + if (checkpointLimit == -1 && checkpointCooldown == 0) + { + FormatEx(rulesString, sizeof(rulesString), "%T", "Rule Summary - Unlimited", client); + } + else if (checkpointLimit > 0 && checkpointCooldown == 0) + { + FormatEx(rulesString, sizeof(rulesString), "%T", "Rule Summary - Limited Checkpoints", client, checkpointLimit); + } + else if (checkpointLimit == -1 && checkpointCooldown > 0) + { + FormatEx(rulesString, sizeof(rulesString), "%T", "Rule Summary - Limited Cooldown", client, checkpointCooldown); + } + else if (checkpointLimit > 0 && checkpointCooldown > 0) + { + FormatEx(rulesString, sizeof(rulesString), "%T", "Rule Summary - Limited Everything", client, checkpointLimit, checkpointCooldown); + } + else if (checkpointLimit == 0) + { + FormatEx(rulesString, sizeof(rulesString), "%T", "Rule Summary - No Checkpoints", client); + } + + return rulesString; +} \ No newline at end of file -- cgit v1.2.3