//========= 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 ); }