You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
195 lines
5.0 KiB
195 lines
5.0 KiB
//========= 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 ); |
|
}
|
|
|