Team Fortress 2 Source Code as on 22/4/2020
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.
|
|
//========= 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() ); } }
|