diff options
Diffstat (limited to 'gameui/PlayerListDialog.cpp')
| -rw-r--r-- | gameui/PlayerListDialog.cpp | 250 |
1 files changed, 250 insertions, 0 deletions
diff --git a/gameui/PlayerListDialog.cpp b/gameui/PlayerListDialog.cpp new file mode 100644 index 0000000..85b1267 --- /dev/null +++ b/gameui/PlayerListDialog.cpp @@ -0,0 +1,250 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// + +#include "PlayerListDialog.h" + +#include <vgui/ILocalize.h> +#include <vgui/ISurface.h> +#include <vgui_controls/ListPanel.h> +#include <KeyValues.h> +#include <vgui_controls/Label.h> +#include <vgui_controls/Button.h> +#include <vgui_controls/MessageBox.h> +#include <vgui_controls/ComboBox.h> + +#include "EngineInterface.h" +#include "game/client/IGameClientExports.h" +#include "GameUI_Interface.h" +#include "steam/steam_api.h" +#include "fmtstr.h" + +// memdbgon must be the last include file in a .cpp file!!! +#include "tier0/memdbgon.h" + +using namespace vgui; + +//----------------------------------------------------------------------------- +// Purpose: Constructor +//----------------------------------------------------------------------------- +CPlayerListDialog::CPlayerListDialog(vgui::Panel *parent) : BaseClass(parent, "PlayerListDialog") +{ + SetSize(320, 240); + SetTitle("#GameUI_CurrentPlayers", true); + + m_pMuteButton = new Button(this, "MuteButton", ""); + + m_pPlayerList = new ListPanel(this, "PlayerList"); + m_pPlayerList->AddColumnHeader(0, "Name", "#GameUI_PlayerName", 180); + m_pPlayerList->AddColumnHeader(1, "Properties", "#GameUI_Properties", 80); + + m_pPlayerList->SetEmptyListText("#GameUI_NoOtherPlayersInGame"); + + LoadControlSettings("Resource/PlayerListDialog.res"); +} + +//----------------------------------------------------------------------------- +// Purpose: Destructor +//----------------------------------------------------------------------------- +CPlayerListDialog::~CPlayerListDialog() +{ +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CPlayerListDialog::Activate() +{ + BaseClass::Activate(); + + // refresh player list + m_pPlayerList->DeleteAllItems(); + int maxClients = engine->GetMaxClients(); + for (int i = 1; i <= maxClients; i++) + { + // get the player info from the engine + player_info_t pi; + + if ( !engine->GetPlayerInfo(i, &pi) ) + continue; + + char szPlayerIndex[32]; + Q_snprintf(szPlayerIndex, sizeof( szPlayerIndex ), "%d", i); + + // collate user data then add it to the table + KeyValues *data = new KeyValues(szPlayerIndex); + + data->SetString("Name", pi.name ); + data->SetInt("index", i); + + // add to the list + m_pPlayerList->AddItem(data, 0, false, false); + } + + // refresh player properties info + RefreshPlayerProperties(); + + // select the first item by default + m_pPlayerList->SetSingleSelectedItem( m_pPlayerList->GetItemIDFromRow(0) ); + + // toggle button states + OnItemSelected(); +} + +//----------------------------------------------------------------------------- +// Purpose: walks the players and sets their info display in the list +//----------------------------------------------------------------------------- +void CPlayerListDialog::RefreshPlayerProperties() +{ + for (int i = 0; i <= m_pPlayerList->GetItemCount(); i++) + { + KeyValues *data = m_pPlayerList->GetItem(i); + if (!data) + continue; + + // assemble properties + int playerIndex = data->GetInt("index"); + player_info_t pi; + + if ( !engine->GetPlayerInfo( playerIndex, &pi) ) + { + // disconnected + data->SetString("properties", "Disconnected"); + continue; + } + + data->SetString( "name", pi.name ); + + bool muted = false, friends = false, bot = false; + + if ( GameClientExports() && GameClientExports()->IsPlayerGameVoiceMuted(playerIndex) ) + { + muted = true; + } + if ( pi.fakeplayer ) + { + bot = true; + } + + if (bot) + { + data->SetString("properties", "CPU Player"); + } + else if (muted && friends) + { + data->SetString("properties", "Friend; Muted"); + } + else if (muted) + { + data->SetString("properties", "Muted"); + } + else if (friends) + { + data->SetString("properties", "Friend"); + } + else + { + data->SetString("properties", ""); + } + } + m_pPlayerList->RereadAllItems(); +} + +//----------------------------------------------------------------------------- +// Purpose: Handles the AddFriend command +//----------------------------------------------------------------------------- +void CPlayerListDialog::OnCommand(const char *command) +{ + if (!stricmp(command, "Mute")) + { + ToggleMuteStateOfSelectedUser(); + } + else + { + BaseClass::OnCommand(command); + } +} + +//----------------------------------------------------------------------------- +// Purpose: toggles whether a user is muted or not +//----------------------------------------------------------------------------- +void CPlayerListDialog::ToggleMuteStateOfSelectedUser() +{ + if (!GameClientExports()) + return; + + for ( int iSelectedItem = 0; iSelectedItem < m_pPlayerList->GetSelectedItemsCount(); iSelectedItem++ ) + { + KeyValues *data = m_pPlayerList->GetItem( m_pPlayerList->GetSelectedItem( iSelectedItem ) ); + if (!data) + return; + int playerIndex = data->GetInt("index"); + Assert(playerIndex); + + if (GameClientExports()->IsPlayerGameVoiceMuted(playerIndex)) + { + GameClientExports()->UnmutePlayerGameVoice(playerIndex); + } + else + { + GameClientExports()->MutePlayerGameVoice(playerIndex); + } + } + + RefreshPlayerProperties(); + OnItemSelected(); +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CPlayerListDialog::OnItemSelected() +{ + // make sure the data is up-to-date + RefreshPlayerProperties(); + + // set the button state based on the selected item + bool bMuteButtonEnabled = false; + if (m_pPlayerList->GetSelectedItemsCount() > 0) + { + KeyValues *data = m_pPlayerList->GetItem(m_pPlayerList->GetSelectedItem(0)); + + player_info_t pi; + + int iLocalPlayer = engine->GetLocalPlayer(); + + int iPlayerIndex = data->GetInt("index"); + bool isValidPlayer = engine->GetPlayerInfo( iPlayerIndex, &pi ); + + // make sure the player is not a bot, or the user + // Matt - changed this check to see if player indeces match, instead of using friends ID + if ( pi.fakeplayer || iPlayerIndex == iLocalPlayer ) // || pi.friendsID == g_pFriendsUser->GetFriendsID() ) + { + // invalid player, + isValidPlayer = false; + } + + if (data && isValidPlayer && GameClientExports() && GameClientExports()->IsPlayerGameVoiceMuted(data->GetInt("index"))) + { + m_pMuteButton->SetText("#GameUI_UnmuteIngameVoice"); + } + else + { + m_pMuteButton->SetText("#GameUI_MuteIngameVoice"); + } + + if (GameClientExports() && isValidPlayer) + { + bMuteButtonEnabled = true; + } + } + else + { + m_pMuteButton->SetText("#GameUI_MuteIngameVoice"); + } + + m_pMuteButton->SetEnabled( bMuteButtonEnabled ); +} |