diff options
| author | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
|---|---|---|
| committer | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
| commit | 3bf9df6b2785fa6d951086978a3e66f49427166a (patch) | |
| tree | 2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /game/client/tf/vgui/report_player_dialog.cpp | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'game/client/tf/vgui/report_player_dialog.cpp')
| -rw-r--r-- | game/client/tf/vgui/report_player_dialog.cpp | 305 |
1 files changed, 305 insertions, 0 deletions
diff --git a/game/client/tf/vgui/report_player_dialog.cpp b/game/client/tf/vgui/report_player_dialog.cpp new file mode 100644 index 0000000..62eb9b8 --- /dev/null +++ b/game/client/tf/vgui/report_player_dialog.cpp @@ -0,0 +1,305 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// +#include "cbase.h" +#include "report_player_dialog.h" +#include "gc_clientsystem.h" +#include "ienginevgui.h" + +using namespace vgui; + +// in seconds +static const float MIN_REPORT_INTERVAL = 300.f; + +struct ReportedPlayer_t +{ + CSteamID steamID; + float flReportedTime; +}; +CUtlVector< ReportedPlayer_t > vecReportedPlayers; + +bool CanReportPlayer( CSteamID steamID, bool bVerbose ) +{ + bool bCanReport = true; + for (int i = 0; i < vecReportedPlayers.Count(); ++i) + { + if ( vecReportedPlayers[i].steamID == steamID ) + { + float flTimeSinceLastReported = gpGlobals->curtime - vecReportedPlayers[i].flReportedTime; + bCanReport = flTimeSinceLastReported >= MIN_REPORT_INTERVAL; + if ( !bCanReport && bVerbose ) + { + float flCooldownTime = MIN_REPORT_INTERVAL - flTimeSinceLastReported; + ConMsg( "Already reported this player. You can report this player again in %.2f seconds\n", flCooldownTime ); + } + break; + } + } + + return bCanReport; +} + +bool ReportPlayerAccount( CSteamID steamID, int nReason ) +{ + if ( !steamID.IsValid() ) + { + Warning( "Reporting an invalid steam ID\n" ); + return false; + } + + if ( !CanReportPlayer( steamID, true ) ) + { + return false; + } + + if ( nReason <= CMsgGC_ReportPlayer_EReason_kReason_INVALID || nReason >= CMsgGC_ReportPlayer_EReason_kReason_COUNT ) + { + Assert( !"Invalid report reason" ); + return false; + } + + GCSDK::CProtoBufMsg< CMsgGC_ReportPlayer > msg( k_EMsgGC_ReportPlayer ); + msg.Body().set_account_id_target( steamID.GetAccountID() ); + msg.Body().set_reason( (CMsgGC_ReportPlayer_EReason)nReason ); + GCClientSystem()->BSendMessage( msg ); + ConMsg( "Report sent. Thank you.\n" ); + + ReportedPlayer_t reportedPlayer; + reportedPlayer.steamID = steamID; + reportedPlayer.flReportedTime = gpGlobals->curtime; + vecReportedPlayers.AddToTail( reportedPlayer ); + return true; +} + +//----------------------------------------------------------------------------- +// Purpose: Constructor +//----------------------------------------------------------------------------- +CReportPlayerDialog::CReportPlayerDialog( vgui::Panel *parent ) : BaseClass( parent, "ReportPlayerDialog" ) +{ + vgui::VPANEL gameuiPanel = enginevgui->GetPanel( PANEL_GAMEUIDLL ); + SetParent( gameuiPanel ); + + vgui::HScheme scheme = vgui::scheme()->LoadSchemeFromFile("resource/SourceScheme.res", "Client"); + SetScheme(scheme); + + SetSize( 320, 270 ); + SetTitle( "#GameUI_ReportPlayerCaps", true ); + + m_pReportButton = new Button( this, "ReportButton", "" ); + 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" ); + m_pReasonBox = new ComboBox( this, "ReasonBox", 5, false ); + + LoadControlSettings( "Resource/ReportPlayerDialog.res" ); +} + +//----------------------------------------------------------------------------- +// Purpose: Destructor +//----------------------------------------------------------------------------- +CReportPlayerDialog::~CReportPlayerDialog() +{ +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CReportPlayerDialog::Activate() +{ + BaseClass::Activate(); + + m_pPlayerList->DeleteAllItems(); + + static EUniverse universe = steamapicontext->SteamUtils()->GetConnectedUniverse(); + + for ( int i = 1; i <= engine->GetMaxClients(); i++ ) + { + player_info_t pi; + if ( !engine->GetPlayerInfo( i, &pi ) ) + continue; + + // no need to add local player + if ( engine->GetLocalPlayer() == i ) + continue; + + // Already reported + CSteamID steamID( pi.friendsID, universe, k_EAccountTypeIndividual ); + if ( !CanReportPlayer( steamID, false ) ) + { + continue; + } + + char szPlayerIndex[32]; + Q_snprintf( szPlayerIndex, sizeof( szPlayerIndex ), "%d", i ); + + KeyValues *pData = new KeyValues( szPlayerIndex ); + pData->SetString( "Name", pi.name ); + pData->SetInt( "index", i ); + m_pPlayerList->AddItem( pData, 0, false, false ); + } + + m_pReasonBox->RemoveAll(); + KeyValues *pKeyValues = new KeyValues( "data" ); + SetDialogVariable( "combo_label", g_pVGuiLocalize->Find( "#GameUI_ReportPlayerReason" ) ); + pKeyValues->SetInt( "reason", 0 ); + m_pReasonBox->AddItem( g_pVGuiLocalize->Find( "GameUI_ReportPlayer_Choose" ), pKeyValues ); + pKeyValues->SetInt( "reason", 1 ); + m_pReasonBox->AddItem( g_pVGuiLocalize->Find( "GameUI_ReportPlayer_Cheating" ), pKeyValues ); + pKeyValues->SetInt( "reason", 2 ); + m_pReasonBox->AddItem( g_pVGuiLocalize->Find( "GameUI_ReportPlayer_Idle" ), pKeyValues ); + pKeyValues->SetInt( "reason", 3 ); + m_pReasonBox->AddItem( g_pVGuiLocalize->Find( "GameUI_ReportPlayer_Harassment" ), pKeyValues ); + pKeyValues->SetInt( "reason", 4 ); + m_pReasonBox->AddItem( g_pVGuiLocalize->Find( "GameUI_ReportPlayer_Griefing" ), pKeyValues ); + m_pReasonBox->SilentActivateItemByRow( 0 ); + pKeyValues->deleteThis(); + + RefreshPlayerProperties(); + m_pPlayerList->SetSingleSelectedItem( m_pPlayerList->GetItemIDFromRow( 0 ) ); + OnItemSelected(); +} + +//----------------------------------------------------------------------------- +// Purpose: walks the players and sets their info display in the list +//----------------------------------------------------------------------------- +void CReportPlayerDialog::RefreshPlayerProperties() +{ + for ( int i = 0; i <= m_pPlayerList->GetItemCount(); i++ ) + { + KeyValues *pData = m_pPlayerList->GetItem( i ); + if ( !pData ) + continue; + + int playerIndex = pData->GetInt( "index" ); + + player_info_t pi; + if ( !engine->GetPlayerInfo( playerIndex, &pi ) ) + { + pData->SetString( "properties", "Disconnected" ); + continue; + } + + pData->SetString( "name", pi.name ); + + if ( pi.fakeplayer ) + { + pData->SetString( "properties", "CPU Player" ); + } + else + { + pData->SetString( "properties", "" ); + } + } + m_pPlayerList->RereadAllItems(); +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +bool CReportPlayerDialog::IsValidPlayerSelected() +{ + bool bIsValidPlayer = false; + + if ( m_pPlayerList->GetSelectedItemsCount() > 0 ) + { + KeyValues *pData = m_pPlayerList->GetItem( m_pPlayerList->GetSelectedItem( 0 ) ); + player_info_t pi; + bIsValidPlayer = engine->GetPlayerInfo( pData->GetInt( "index" ), &pi ); +#ifdef _DEBUG + bIsValidPlayer = bIsValidPlayer && pData->GetInt( "index" ) != engine->GetLocalPlayer(); +#else + bIsValidPlayer = bIsValidPlayer && !pi.fakeplayer && pData->GetInt( "index" ) != engine->GetLocalPlayer(); +#endif + } + + return bIsValidPlayer; +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CReportPlayerDialog::OnCommand( const char *command ) +{ + if ( !stricmp( command, "Report" ) ) + { + ReportPlayer(); + } + else + { + BaseClass::OnCommand( command ); + } +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CReportPlayerDialog::ReportPlayer() +{ + for ( int iSelectedItem = 0; iSelectedItem < m_pPlayerList->GetSelectedItemsCount(); iSelectedItem++ ) + { + KeyValues *pPlayerData = m_pPlayerList->GetItem( m_pPlayerList->GetSelectedItem( iSelectedItem ) ); + if ( !pPlayerData ) + return; + + Assert( pPlayerData->GetInt( "index" ) ); + + // INVALID = 0; + // CHEATING = 1; + // IDLE = 2; + // HARASSMENT = 3; + // GRIEFING = 4; + + player_info_t pi; + if ( !engine->GetPlayerInfo( pPlayerData->GetInt( "index" ), &pi ) ) + return; + + CSteamID steamID( pi.friendsID, GetUniverse(), k_EAccountTypeIndividual ); + KeyValues *pReasonData = m_pReasonBox->GetActiveItemUserData(); + int nReason = ( pReasonData ) ? pReasonData->GetInt( "reason", 0 ) : 0; + ReportPlayerAccount( steamID, nReason ); + Close(); + return; + } + + RefreshPlayerProperties(); + OnItemSelected(); +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CReportPlayerDialog::OnItemSelected() +{ + RefreshPlayerProperties(); + + bool bReportButtonEnabled = IsValidPlayerSelected(); + if ( !bReportButtonEnabled ) + { + m_pReportButton->SetText( "#GameUI_ReportPlayer" ); + } + + // Reason selected? + KeyValues *pUserData = m_pReasonBox->GetActiveItemUserData(); + bReportButtonEnabled = bReportButtonEnabled && pUserData && pUserData->GetInt( "reason", 0 ) > 0; + m_pReportButton->SetEnabled( bReportButtonEnabled ); +} + +//----------------------------------------------------------------------------- +// Purpose: Called when text changes in combo box +//----------------------------------------------------------------------------- +void CReportPlayerDialog::OnTextChanged( KeyValues *data ) +{ + Panel *pPanel = reinterpret_cast< vgui::Panel* >( data->GetPtr( "panel" ) ); + vgui::ComboBox *pComboBox = dynamic_cast< vgui::ComboBox* >( pPanel ); + if ( pComboBox && pComboBox == m_pReasonBox ) + { + bool bReportButtonEnabled = IsValidPlayerSelected(); + KeyValues *pReasonData = m_pReasonBox->GetActiveItemUserData(); + bReportButtonEnabled = bReportButtonEnabled && pReasonData && pReasonData->GetInt( "reason", 0 ) > 0; + m_pReportButton->SetEnabled( bReportButtonEnabled ); + } +} |