lots of changes
This commit is contained in:
@@ -0,0 +1,191 @@
|
||||
//----------------------------------------------------------------------------------------------------
|
||||
// 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;
|
||||
}
|
||||
Reference in New Issue
Block a user