summaryrefslogtreecommitdiff
path: root/game/client/c_recipientfilter.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'game/client/c_recipientfilter.cpp')
-rw-r--r--game/client/c_recipientfilter.cpp221
1 files changed, 221 insertions, 0 deletions
diff --git a/game/client/c_recipientfilter.cpp b/game/client/c_recipientfilter.cpp
new file mode 100644
index 0000000..ece0fab
--- /dev/null
+++ b/game/client/c_recipientfilter.cpp
@@ -0,0 +1,221 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//=============================================================================//
+
+#include "cbase.h"
+#include "prediction.h"
+
+// memdbgon must be the last include file in a .cpp file!!!
+#include "tier0/memdbgon.h"
+
+static IPredictionSystem g_RecipientFilterPredictionSystem;
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+C_RecipientFilter::C_RecipientFilter()
+{
+ Reset();
+}
+
+C_RecipientFilter::~C_RecipientFilter()
+{
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : src -
+//-----------------------------------------------------------------------------
+void C_RecipientFilter::CopyFrom( const C_RecipientFilter& src )
+{
+ m_bReliable = src.IsReliable();
+ m_bInitMessage = src.IsInitMessage();
+
+ m_bUsingPredictionRules = src.IsUsingPredictionRules();
+ m_bIgnorePredictionCull = src.IgnorePredictionCull();
+
+ int c = src.GetRecipientCount();
+ for ( int i = 0; i < c; ++i )
+ {
+ m_Recipients.AddToTail( src.GetRecipientIndex( i ) );
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void C_RecipientFilter::Reset( void )
+{
+ m_bReliable = false;
+ m_Recipients.RemoveAll();
+ m_bUsingPredictionRules = false;
+ m_bIgnorePredictionCull = false;
+}
+
+void C_RecipientFilter::MakeReliable( void )
+{
+ m_bReliable = true;
+}
+
+bool C_RecipientFilter::IsReliable( void ) const
+{
+ return m_bReliable;
+}
+
+int C_RecipientFilter::GetRecipientCount( void ) const
+{
+ return m_Recipients.Size();
+}
+
+int C_RecipientFilter::GetRecipientIndex( int slot ) const
+{
+ if ( slot < 0 || slot >= GetRecipientCount() )
+ return -1;
+
+ return m_Recipients[ slot ];
+}
+
+void C_RecipientFilter::AddAllPlayers( void )
+{
+ if ( !C_BasePlayer::GetLocalPlayer() )
+ return;
+
+ m_Recipients.RemoveAll();
+ AddRecipient( C_BasePlayer::GetLocalPlayer() );
+}
+
+void C_RecipientFilter::AddRecipient( C_BasePlayer *player )
+{
+ Assert( player );
+
+ if ( !player )
+ return;
+
+ int index = player->index;
+
+ // If we're predicting and this is not the first time we've predicted this sound
+ // then don't send it to the local player again.
+ if ( m_bUsingPredictionRules )
+ {
+ Assert( player == C_BasePlayer::GetLocalPlayer() );
+ Assert( prediction->InPrediction() );
+
+ // Only add local player if this is the first time doing prediction
+ if ( !g_RecipientFilterPredictionSystem.CanPredict() )
+ {
+ return;
+ }
+ }
+
+ // Already in list
+ if ( m_Recipients.Find( index ) != m_Recipients.InvalidIndex() )
+ return;
+
+ // this is a client side filter, only add the local player
+ if ( !player->IsLocalPlayer() )
+ return;
+
+ m_Recipients.AddToTail( index );
+}
+
+void C_RecipientFilter::RemoveRecipient( C_BasePlayer *player )
+{
+ if ( !player )
+ return;
+
+ int index = player->index;
+
+ // Remove it if it's in the list
+ m_Recipients.FindAndRemove( index );
+}
+
+void C_RecipientFilter::AddRecipientsByTeam( C_Team *team )
+{
+ AddAllPlayers();
+}
+
+void C_RecipientFilter::RemoveRecipientsByTeam( C_Team *team )
+{
+ Assert ( 0 );
+}
+
+void C_RecipientFilter::AddPlayersFromBitMask( CBitVec< ABSOLUTE_PLAYER_LIMIT >& playerbits )
+{
+ C_BasePlayer *pPlayer = C_BasePlayer::GetLocalPlayer();
+
+ if ( !pPlayer )
+ return;
+
+ // only add the local player on client side
+ if ( !playerbits[ pPlayer->index ] )
+ return;
+
+ AddRecipient( pPlayer );
+}
+
+void C_RecipientFilter::AddRecipientsByPVS( const Vector& origin )
+{
+ AddAllPlayers();
+}
+
+void C_RecipientFilter::AddRecipientsByPAS( const Vector& origin )
+{
+ AddAllPlayers();
+}
+
+void C_RecipientFilter::UsePredictionRules( void )
+{
+ if ( m_bUsingPredictionRules )
+ return;
+
+ if ( !prediction->InPrediction() )
+ {
+ Assert( 0 );
+ return;
+ }
+
+ C_BasePlayer *local = C_BasePlayer::GetLocalPlayer();
+ if ( !local )
+ {
+ Assert( 0 );
+ return;
+ }
+
+ m_bUsingPredictionRules = true;
+
+ // Cull list now, if needed
+ int c = GetRecipientCount();
+ if ( c == 0 )
+ return;
+
+ if ( !g_RecipientFilterPredictionSystem.CanPredict() )
+ {
+ RemoveRecipient( local );
+ }
+}
+
+bool C_RecipientFilter::IsUsingPredictionRules( void ) const
+{
+ return m_bUsingPredictionRules;
+}
+
+bool C_RecipientFilter::IgnorePredictionCull( void ) const
+{
+ return m_bIgnorePredictionCull;
+}
+
+void C_RecipientFilter::SetIgnorePredictionCull( bool ignore )
+{
+ m_bIgnorePredictionCull = ignore;
+}
+
+CLocalPlayerFilter::CLocalPlayerFilter()
+{
+ if ( C_BasePlayer::GetLocalPlayer() )
+ {
+ AddRecipient( C_BasePlayer::GetLocalPlayer() );
+ }
+} \ No newline at end of file