diff options
Diffstat (limited to 'game/client/tf/tf_shared_content_manager.cpp')
| -rw-r--r-- | game/client/tf/tf_shared_content_manager.cpp | 195 |
1 files changed, 195 insertions, 0 deletions
diff --git a/game/client/tf/tf_shared_content_manager.cpp b/game/client/tf/tf_shared_content_manager.cpp new file mode 100644 index 0000000..7a34418 --- /dev/null +++ b/game/client/tf/tf_shared_content_manager.cpp @@ -0,0 +1,195 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: Generic in-game abuse reporting +// +// $NoKeywords: $ +//=============================================================================// + +#include "cbase.h" +#include "GameEventListener.h" +#include "tf_shared_content_manager.h" +#include "confirm_dialog.h" +#include "clientmode_tf.h" +#include "tf_gamerules.h" + + +// memdbgon must be the last include file in a .cpp file!!! +#include "tier0/memdbgon.h" + +// Declare singleton object +static C_TFSharedContentManager s_SharedContentManager; +C_TFSharedContentManager *TFSharedContentManager() { return &s_SharedContentManager; } + +//----------------------------------------------------------------------------- +// Romevision-specific dialog and callback +//----------------------------------------------------------------------------- +extern ConVar tf_romevision_opt_in; +extern ConVar tf_romevision_skip_prompt; + +void PromptAcceptRomevisionSharingCallback( bool bConfirm, void *pContext ) +{ + if ( bConfirm ) + { + tf_romevision_opt_in.SetValue( true ); + } +} + +static void PromptAcceptRomevisionSharing() +{ + if ( tf_romevision_opt_in.GetBool() == false ) + { + ShowConfirmOptOutDialog( "#TF_Prompt_Romevision_Title", "#TF_Prompt_Romevision_Message", + "#TF_Prompt_Romevsion_OK", "#TF_Prompt_Romevsion_Cancel", + "#TF_Prompt_Romevsion_Opt_Out", "tf_romevision_skip_prompt", + PromptAcceptRomevisionSharingCallback, NULL ); + } +} + +//----------------------------------------------------------------------------- +bool C_TFSharedContentManager::Init() +{ + m_iSharedVisionFlags = TF_VISION_FILTER_NONE; + m_PlayersWhoHaveOfferedVision.Purge(); + m_SharedVisionQueue.Purge(); + + return true; +} + +//----------------------------------------------------------------------------- +void C_TFSharedContentManager::Update( float frametime ) +{ + // check our shared vision queue + if ( m_SharedVisionQueue.Count() > 0 ) + { + int iTeam = GetLocalPlayerTeam(); + bool bPrompt = false; + + if ( iTeam == TEAM_SPECTATOR ) + { + bPrompt = true; + } + else if ( iTeam > LAST_SHARED_TEAM ) + { + C_TFPlayer *pTFLocalPlayer = C_TFPlayer::GetLocalTFPlayer(); + if ( pTFLocalPlayer && pTFLocalPlayer->GetPlayerClass() && ( pTFLocalPlayer->GetPlayerClass()->GetClassIndex() > TF_CLASS_UNDEFINED ) ) + { + bPrompt = true; + } + } + + if ( bPrompt ) + { + OfferSharedVision_Internal( m_SharedVisionQueue[0].iFlag, m_SharedVisionQueue[0].unAccountID ); + m_SharedVisionQueue.Remove( 0 ); + } + } +} + +//----------------------------------------------------------------------------- +bool C_TFSharedContentManager::CanOfferVision( int iFlag ) +{ + bool bRetVal = false; + + switch ( iFlag ) + { + case TF_VISION_FILTER_ROME: + if ( TFGameRules() && TFGameRules()->IsMannVsMachineMode() ) + { + bRetVal = true; + } + break; + default: + break; + } + + return bRetVal; +} + +//----------------------------------------------------------------------------- +void C_TFSharedContentManager::OfferSharedVision( int iFlag, uint32 unAccountID ) +{ + if ( !CanOfferVision( iFlag ) ) + return; + + for ( int i = 0 ; i < m_SharedVisionQueue.Count() ; i++ ) + { + if ( ( m_SharedVisionQueue[i].iFlag == iFlag ) && ( m_SharedVisionQueue[i].unAccountID == unAccountID ) ) + { + // we already have this entry in the queue + return; + } + } + + shared_vision_entry_t data = { iFlag, unAccountID }; + m_SharedVisionQueue.AddToTail( data ); +} + +//----------------------------------------------------------------------------- +void C_TFSharedContentManager::PrintChatText( int iFlag, uint32 unAccountID ) +{ + // add some chat text saying who has offered the vision, but only once-per-player to avoid spam + if ( m_PlayersWhoHaveOfferedVision.Find( unAccountID ) == m_PlayersWhoHaveOfferedVision.InvalidIndex() ) + { + const char *pszPlayerName = NULL; + + CBasePlayer *pPlayer = GetPlayerByAccountID( unAccountID ); + if ( pPlayer ) + { + pszPlayerName = pPlayer->GetPlayerName(); + } + + if ( pszPlayerName && pszPlayerName[0] ) + { + KeyValuesAD pKeyValues( "data" ); + pKeyValues->SetString( "player", pszPlayerName ); + + const char *pText = NULL; + switch ( iFlag ) + { + case TF_VISION_FILTER_ROME: + if ( TFGameRules() && TFGameRules()->IsMannVsMachineMode() ) + { + pText = "#TF_Player_OptionalVision"; + } + break; + default: + break; + } + + if ( pText ) + { + GetClientModeTFNormal()->PrintTextToChat( pText, pKeyValues ); + } + } + + m_PlayersWhoHaveOfferedVision.AddToHead( unAccountID ); + } +} + +//----------------------------------------------------------------------------- +void C_TFSharedContentManager::OfferSharedVision_Internal( int iFlag, uint32 unAccountID ) +{ + if ( !CanOfferVision( iFlag ) ) + return; + + // If we haven't already offered it + if ( ( m_iSharedVisionFlags & iFlag ) == 0 ) + { + switch( iFlag ) + { + case TF_VISION_FILTER_ROME: + if ( !IsLocalPlayerUsingVisionFilterFlags( TF_VISION_FILTER_ROME ) && ( tf_romevision_skip_prompt.GetBool() == false ) ) + { + PromptAcceptRomevisionSharing(); + } + break; + default: + break; + } + + AddSharedVision( iFlag ); + } + + // Display who is offering the shared vision + PrintChatText( iFlag, unAccountID ); +} |