//---------------------------------------------------------------------------------------------------- // Radio settings: per-player preferences stored as clientprefs cookies, exposed as a "Radio" entry // in the stock Client Preferences menu (sm_settings / !settings) that opens a sub-menu with the // voice-line volume and a toggle for receiving the custom radio commands (thanks, cheer). //---------------------------------------------------------------------------------------------------- static Cookie g_hVolumeCookie; static Cookie g_hCustomCookie; static int g_iVolume[MAXPLAYERS + 1]; static bool g_bCustom[MAXPLAYERS + 1]; static const int g_iVolumeSteps[] = {100, 75, 50, 25, 0}; #define RADIO_VOLUME_DEFAULT 100 void Settings_Init() { g_hVolumeCookie = new Cookie("radio_volume", "Radio voice line volume in percent (0 = off)", CookieAccess_Protected); g_hCustomCookie = new Cookie("radio_custom", "Receive the custom radio commands (thanks, cheer)", CookieAccess_Protected); SetCookieMenuItem(CookieMenu_Radio, 0, "Radio"); // Late load: clients may already be in game with cached cookies. for (int i = 1; i <= MaxClients; i++) { g_iVolume[i] = RADIO_VOLUME_DEFAULT; g_bCustom[i] = true; if (IsClientConnected(i) && AreClientCookiesCached(i)) OnClientCookiesCached(i); } } void Settings_OnClientConnected(int client) { // until the cookies arrive g_iVolume[client] = RADIO_VOLUME_DEFAULT; g_bCustom[client] = true; } public void OnClientCookiesCached(int client) { char val[8]; g_hVolumeCookie.Get(client, val, sizeof(val)); if (val[0]) // never set = keep the default { int volume = StringToInt(val); if (volume < 0) volume = 0; else if (volume > 100) volume = 100; g_iVolume[client] = volume; } g_hCustomCookie.Get(client, val, sizeof(val)); if (val[0]) g_bCustom[client] = StringToInt(val) != 0; } float Settings_GetVolume(int client) { return g_iVolume[client] / 100.0; } bool Settings_GetCustom(int client) { return g_bCustom[client]; } public void CookieMenu_Radio(int client, CookieMenuAction action, any info, char[] buffer, int maxlen) { switch (action) { case CookieMenuAction_DisplayOption: { FormatEx(buffer, maxlen, "Radio"); } case CookieMenuAction_SelectOption: { Settings_ShowMainMenu(client); } } } static void Settings_ShowMainMenu(int client) { Menu menu = new Menu(Menu_RadioMain); menu.SetTitle("Radio Settings"); char display[64]; FormatEx(display, sizeof(display), "Sound volume: %d%%", g_iVolume[client]); menu.AddItem("volume", display); FormatEx(display, sizeof(display), "Custom Radio (thanks, cheer): %s", g_bCustom[client] ? "Enabled" : "Disabled"); menu.AddItem("custom", display); menu.ExitBackButton = true; // back to sm_settings menu.Display(client, MENU_TIME_FOREVER); } public int Menu_RadioMain(Menu menu, MenuAction action, int client, int param) { switch (action) { case MenuAction_Select: { char item[8]; menu.GetItem(param, item, sizeof(item)); if (StrEqual(item, "volume")) { Settings_ShowVolumeMenu(client); } else if (StrEqual(item, "custom")) { g_bCustom[client] = !g_bCustom[client]; g_hCustomCookie.Set(client, g_bCustom[client] ? "1" : "0"); Settings_ShowMainMenu(client); // re-show with the new state } } case MenuAction_Cancel: { if (param == MenuCancel_ExitBack) ShowCookieMenu(client); } case MenuAction_End: { delete menu; } } return 0; } static void Settings_ShowVolumeMenu(int client) { Menu menu = new Menu(Menu_RadioVolume); menu.SetTitle("Radio Sound Volume"); char item[8], display[16]; for (int i = 0; i < sizeof(g_iVolumeSteps); i++) { int volume = g_iVolumeSteps[i]; IntToString(volume, item, sizeof(item)); if (volume > 0) FormatEx(display, sizeof(display), "%d%%", volume); else strcopy(display, sizeof(display), "Off"); if (volume == g_iVolume[client]) StrCat(display, sizeof(display), " <<"); menu.AddItem(item, display); } menu.ExitBackButton = true; // back to the Radio sub-menu menu.Display(client, MENU_TIME_FOREVER); } public int Menu_RadioVolume(Menu menu, MenuAction action, int client, int param) { switch (action) { case MenuAction_Select: { char item[8]; menu.GetItem(param, item, sizeof(item)); int volume = StringToInt(item); g_iVolume[client] = volume; char val[8]; IntToString(volume, val, sizeof(val)); g_hVolumeCookie.Set(client, val); Settings_ShowVolumeMenu(client); // re-show with the new pick marked } case MenuAction_Cancel: { if (param == MenuCancel_ExitBack) Settings_ShowMainMenu(client); } case MenuAction_End: { delete menu; } } return 0; }