hl2_src-leak-2017/src/game/client/c_recipientfilter.cpp

221 lines
4.6 KiB
C++

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