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()