hl2_src-leak-2017/src/game/client/tf/tf_shared_content_manager.cpp

196 lines
5.0 KiB
C++

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