core/MenuStyle_Radio.cpp
changeset 1695 1c59f0a5e596
parent 1541 e46ad208b9b4
child 1696 35669010a13f
     1.1 --- a/core/MenuStyle_Radio.cpp	Sun Nov 18 06:25:33 2007 +0000
     1.2 +++ b/core/MenuStyle_Radio.cpp	Sun Nov 18 17:07:32 2007 +0000
     1.3 @@ -42,9 +42,15 @@
     1.4  CRadioStyle g_RadioMenuStyle;
     1.5  int g_ShowMenuId = -1;
     1.6  bool g_bRadioInit = false;
     1.7 +unsigned int g_RadioMenuTimeout = 0;
     1.8  
     1.9 -CRadioStyle::CRadioStyle() : m_players(new CBaseMenuPlayer[256+1])
    1.10 +CRadioStyle::CRadioStyle()
    1.11  {
    1.12 +	m_players = new CRadioMenuPlayer[256+1];
    1.13 +	for (size_t i = 0; i < 256+1; i++)
    1.14 +	{
    1.15 +		m_players[i].Radio_SetIndex(i);
    1.16 +	}
    1.17  }
    1.18  
    1.19  void CRadioStyle::OnSourceModAllInitialized()
    1.20 @@ -73,6 +79,16 @@
    1.21  		return;
    1.22  	}
    1.23  
    1.24 +	const char *val = g_pGameConf->GetKeyValue("RadioMenuTimeout");
    1.25 +	if (val != NULL)
    1.26 +	{
    1.27 +		g_RadioMenuTimeout = atoi(val);
    1.28 +	}
    1.29 +	else
    1.30 +	{
    1.31 +		g_RadioMenuTimeout = 0;
    1.32 +	}
    1.33 +
    1.34  	g_Menus.AddStyle(this);
    1.35  	g_Menus.SetDefaultStyle(this);
    1.36  
    1.37 @@ -203,6 +219,38 @@
    1.38  	m_FreeDisplays.push(display);
    1.39  }
    1.40  
    1.41 +CRadioMenuPlayer *CRadioStyle::GetRadioMenuPlayer(int client)
    1.42 +{
    1.43 +	return &m_players[client];
    1.44 +}
    1.45 +
    1.46 +void CRadioStyle::ProcessWatchList()
    1.47 +{
    1.48 +	if (!g_RadioMenuTimeout)
    1.49 +	{
    1.50 +		BaseMenuStyle::ProcessWatchList();
    1.51 +		return;
    1.52 +	}
    1.53 +
    1.54 +	BaseMenuStyle::ProcessWatchList();
    1.55 +
    1.56 +	CRadioMenuPlayer *pPlayer;
    1.57 +	float curtime = gpGlobals->curtime;
    1.58 +	unsigned int max_clients = g_Players.GetMaxClients();
    1.59 +	for (unsigned int i = 1; i <= max_clients; i++)
    1.60 +	{
    1.61 +		pPlayer = GetRadioMenuPlayer(i);
    1.62 +		if (!pPlayer->bInMenu || pPlayer->bInExternMenu)
    1.63 +		{
    1.64 +			continue;
    1.65 +		}
    1.66 +		if (pPlayer->Radio_NeedsRefresh())
    1.67 +		{
    1.68 +			pPlayer->Radio_Refresh();
    1.69 +		}
    1.70 +	}
    1.71 +}
    1.72 +
    1.73  CRadioDisplay::CRadioDisplay()
    1.74  {
    1.75  	Reset();
    1.76 @@ -326,17 +374,50 @@
    1.77  
    1.78  void CRadioDisplay::SendRawDisplay(int client, unsigned int time)
    1.79  {
    1.80 -	char buffer[4096];
    1.81 -	size_t len;
    1.82 +	int _sel_keys = (keys == 0) ? (1<<9) : keys;
    1.83 +	CRadioMenuPlayer *pPlayer = g_RadioMenuStyle.GetRadioMenuPlayer(client);
    1.84 +	pPlayer->Radio_Init(_sel_keys, m_Title.c_str(), m_BufferText.c_str());
    1.85 +	pPlayer->Radio_Refresh();
    1.86 +}
    1.87  
    1.88 -	len = UTIL_Format(buffer, sizeof(buffer), "%s\n%s", m_Title.c_str(), m_BufferText.c_str());
    1.89 +void CRadioMenuPlayer::Radio_SetIndex(unsigned int index)
    1.90 +{
    1.91 +	m_index = index;
    1.92 +}
    1.93 +
    1.94 +bool CRadioMenuPlayer::Radio_NeedsRefresh()
    1.95 +{
    1.96 +	return (gpGlobals->curtime - display_last_refresh >= g_RadioMenuTimeout);
    1.97 +}
    1.98  
    1.99 -	cell_t players[1] = {client};
   1.100 +void CRadioMenuPlayer::Radio_Init(int keys, const char *title, const char *text)
   1.101 +{
   1.102 +	display_len = UTIL_Format(display_pkt, 
   1.103 +		sizeof(display_pkt), 
   1.104 +		"%s\n%s", 
   1.105 +		title,
   1.106 +		text);
   1.107 +	display_keys = keys;
   1.108 +}
   1.109  
   1.110 -	int _sel_keys = (keys == 0) ? (1<<9) : keys;
   1.111 +void CRadioMenuPlayer::Radio_Refresh()
   1.112 +{
   1.113 +	cell_t players[1] = {m_index};
   1.114 +	char *ptr = display_pkt;
   1.115 +	char save = 0;
   1.116 +	size_t len = display_len;
   1.117 +	unsigned int time;
   1.118  
   1.119 -	char *ptr = buffer;
   1.120 -	char save = 0;
   1.121 +	/* Compute the new time */
   1.122 +	if (menuHoldTime == 0)
   1.123 +	{
   1.124 +		time = 0;
   1.125 +	}
   1.126 +	else
   1.127 +	{
   1.128 +		time = menuHoldTime - (unsigned int)(gpGlobals->curtime - menuStartTime);
   1.129 +	}
   1.130 +
   1.131  	while (true)
   1.132  	{
   1.133  		if (len > 240)
   1.134 @@ -345,7 +426,7 @@
   1.135  			ptr[240] = '\0';
   1.136  		}
   1.137  		bf_write *buffer = g_UserMsgs.StartMessage(g_ShowMenuId, players, 1, USERMSG_BLOCKHOOKS);
   1.138 -		buffer->WriteWord(_sel_keys);
   1.139 +		buffer->WriteWord(display_keys);
   1.140  		buffer->WriteChar(time ? time : -1);
   1.141  		buffer->WriteByte( (len > 240) ? 1 : 0 );
   1.142  		buffer->WriteString(ptr);
   1.143 @@ -355,10 +436,14 @@
   1.144  			ptr[240] = save;
   1.145  			ptr = &ptr[240];
   1.146  			len -= 240;
   1.147 -		} else {
   1.148 +		}
   1.149 +		else
   1.150 +		{
   1.151  			break;
   1.152  		}
   1.153  	}
   1.154 +
   1.155 +	display_last_refresh = gpGlobals->curtime;
   1.156  }
   1.157  
   1.158  int CRadioDisplay::GetAmountRemaining()