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.
170 lines
4.1 KiB
170 lines
4.1 KiB
//========= Copyright Valve Corporation, All rights reserved. ============//
|
|
//
|
|
// Purpose:
|
|
//
|
|
// $NoKeywords: $
|
|
//=============================================================================//
|
|
|
|
#include "cbase.h"
|
|
#include "tf_passtime_ball.h"
|
|
#include "passtime_ballcontroller.h"
|
|
|
|
// memdbgon must be the last include file in a .cpp file!!!
|
|
#include "tier0/memdbgon.h"
|
|
|
|
//-----------------------------------------------------------------------------
|
|
namespace
|
|
{
|
|
int SortDescendingPriority( CPasstimeBallController *const *ppA, CPasstimeBallController *const *ppB )
|
|
{
|
|
return static_cast< CPasstimeBallController* >( *ppB )->GetPriority()
|
|
- static_cast< CPasstimeBallController* >( *ppA )->GetPriority();
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// static
|
|
int CPasstimeBallController::ApplyTo( CPasstimeBall *pBall )
|
|
{
|
|
// Sort controllers by iPriority, then call Apply until one returns true.
|
|
// From then on, skip controllers with a lower iPriority.
|
|
// This sorts the autolist, but that should be OK.
|
|
auto &controllers = GetAutoList();
|
|
controllers.Sort( &SortDescendingPriority );
|
|
int iMinPriority = INT_MIN;
|
|
int iNumControllers = 0;
|
|
|
|
for ( auto controller : controllers )
|
|
{
|
|
if ( !controller->IsEnabled() || !controller->IsActive() )
|
|
{
|
|
continue;
|
|
}
|
|
|
|
if ( controller->GetPriority() < iMinPriority )
|
|
{
|
|
break;
|
|
}
|
|
|
|
if ( controller->Apply( pBall ) )
|
|
{
|
|
iMinPriority = controller->GetPriority();
|
|
++iNumControllers;
|
|
}
|
|
}
|
|
return iNumControllers;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// static
|
|
int CPasstimeBallController::DisableOn( const CPasstimeBall *pBall )
|
|
{
|
|
auto &controllers = GetAutoList();
|
|
int iCount = 0;
|
|
for ( auto pController : controllers )
|
|
{
|
|
if ( pController->IsEnabled() )
|
|
{
|
|
pController->SetIsEnabled( false );
|
|
++iCount;
|
|
}
|
|
}
|
|
return iCount;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// static
|
|
void CPasstimeBallController::BallCollision( CPasstimeBall *pBall,
|
|
int iCollisionIndex, gamevcollisionevent_t *pEvent )
|
|
{
|
|
auto &controllers = GetAutoList();
|
|
for ( auto pController : controllers )
|
|
{
|
|
if ( pController->IsEnabled() && pController->IsActive() )
|
|
{
|
|
pController->OnBallCollision( pBall, iCollisionIndex, pEvent );
|
|
}
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// static
|
|
void CPasstimeBallController::BallPickedUp( CPasstimeBall *pBall,
|
|
CTFPlayer *pCatcher )
|
|
{
|
|
auto &controllers = GetAutoList();
|
|
for ( auto pController : controllers )
|
|
{
|
|
if ( pController->IsEnabled() && pController->IsActive() )
|
|
{
|
|
pController->OnBallPickedUp( pBall, pCatcher );
|
|
}
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// static
|
|
void CPasstimeBallController::BallDamaged( CPasstimeBall *pBall )
|
|
{
|
|
auto &controllers = GetAutoList();
|
|
for ( auto pController : controllers )
|
|
{
|
|
if ( pController->IsEnabled() && pController->IsActive() )
|
|
{
|
|
pController->OnBallDamaged( pBall );
|
|
}
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// static
|
|
void CPasstimeBallController::BallSpawned( CPasstimeBall *pBall )
|
|
{
|
|
auto &controllers = GetAutoList();
|
|
for ( auto pController : controllers )
|
|
{
|
|
if ( pController->IsEnabled() && pController->IsActive() )
|
|
{
|
|
pController->OnBallSpawned( pBall );
|
|
}
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
CPasstimeBallController::CPasstimeBallController( int iPriority )
|
|
: m_bEnabled( false )
|
|
, m_iPriority( iPriority ) {}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
void CPasstimeBallController::SetIsEnabled( bool bEnabled )
|
|
{
|
|
if ( m_bEnabled == bEnabled )
|
|
{
|
|
return;
|
|
}
|
|
|
|
m_bEnabled = bEnabled;
|
|
|
|
if ( bEnabled )
|
|
{
|
|
OnEnabled();
|
|
}
|
|
else
|
|
{
|
|
OnDisabled();
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
bool CPasstimeBallController::IsEnabled() const
|
|
{
|
|
return m_bEnabled;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
int CPasstimeBallController::GetPriority() const
|
|
{
|
|
return m_iPriority;
|
|
}
|
|
|