summaryrefslogtreecommitdiff
path: root/game/client/tf/tf_shared_content_manager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'game/client/tf/tf_shared_content_manager.cpp')
-rw-r--r--game/client/tf/tf_shared_content_manager.cpp195
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 );
+}