Modified source engine (2017) developed by valve and leaked in 2020. Not for commercial purporses
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.
 
 
 
 
 
 

196 lines
5.5 KiB

//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
//=============================================================================//
#include "cbase.h"
#include "tf_shareddefs.h"
#include "c_info_act.h"
#include "hud_timer.h"
// memdbgon must be the last include file in a .cpp file!!!
#include "tier0/memdbgon.h"
// We may get act begin messages for acts we haven't yet received entities for (usually during connection)
// We store the current act in this, and if an act arrives matching it, we start that act.
static int g_iCurrentActNumber = -1;
static float g_flActStartTime;
CHandle<C_InfoAct> g_hCurrentAct;
IMPLEMENT_CLIENTCLASS_DT(C_InfoAct, DT_InfoAct, CInfoAct)
RecvPropInt( RECVINFO(m_iActNumber) ),
RecvPropInt( RECVINFO(m_spawnflags) ),
RecvPropFloat( RECVINFO(m_flActTimeLimit) ),
RecvPropInt(RECVINFO(m_nRespawn1Team1Time) ),
RecvPropInt(RECVINFO(m_nRespawn1Team2Time) ),
RecvPropInt(RECVINFO(m_nRespawn2Team1Time) ),
RecvPropInt(RECVINFO(m_nRespawn2Team2Time) ),
RecvPropInt(RECVINFO(m_nRespawnTeam1Delay) ),
RecvPropInt(RECVINFO(m_nRespawnTeam2Delay) ),
END_RECV_TABLE()
typedef CHandle<C_InfoAct> ActHandle_t;
CUtlVector< ActHandle_t > g_hActs;
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
C_InfoAct::C_InfoAct()
{
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
C_InfoAct::~C_InfoAct()
{
ActHandle_t hAct;
hAct = this;
g_hActs.FindAndRemove( hAct );
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void C_InfoAct::OnPreDataChanged( DataUpdateType_t updateType )
{
BaseClass::OnPreDataChanged( updateType );
m_flPreviousTimeLimit = m_flActTimeLimit;
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void C_InfoAct::OnDataChanged( DataUpdateType_t updateType )
{
ActHandle_t hAct;
hAct = this;
if ( g_hActs.Find( hAct ) == g_hActs.InvalidIndex() )
{
g_hActs.AddToTail( hAct );
// Is this act the one that's supposed to be going?
if ( GetActNumber() == g_iCurrentActNumber )
{
StartAct( g_flActStartTime );
return;
}
}
// Timer changed?
if ( g_hCurrentAct == this )
{
if ( m_flPreviousTimeLimit != m_flActTimeLimit )
{
CHudTimer *timer = GET_HUDELEMENT( CHudTimer );
if ( timer )
{
timer->SetFixedTimer( m_flStartTime, m_flActTimeLimit );
}
}
}
BaseClass::OnDataChanged( updateType );
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void C_InfoAct::StartAct( float flStartTime )
{
g_hCurrentAct = this;
m_flStartTime = flStartTime;
CHudTimer *timer = GET_HUDELEMENT( CHudTimer );
if ( timer )
{
timer->SetFixedTimer( m_flStartTime, m_flActTimeLimit );
}
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
bool C_InfoAct::IsAWaitingAct( void )
{
return (m_spawnflags & SF_ACT_WAITINGFORGAMESTART) != 0;
}
//-----------------------------------------------------------------------------
// PReturns the respawn time remaining
//-----------------------------------------------------------------------------
float C_InfoAct::RespawnTimeRemaining( int nTeam, int nTimer ) const
{
if ((g_hCurrentAct != this) || (nTeam == 0))
return 0;
int nTimerTime;
float flTimeDelta = gpGlobals->curtime - m_flStartTime;
if (flTimeDelta <= 0)
return 0;
if (nTeam == 1)
{
nTimerTime = (nTimer == 1) ? m_nRespawn1Team1Time : m_nRespawn2Team1Time;
flTimeDelta -= m_nRespawnTeam1Delay;
}
else
{
nTimerTime = (nTimer == 1) ? m_nRespawn1Team2Time : m_nRespawn2Team2Time;
flTimeDelta -= m_nRespawnTeam2Delay;
}
if (nTimerTime <= 0)
return 0.0f;
// This case takes care of the initial spawn delay time...
if (flTimeDelta < 0)
{
return nTimerTime - flTimeDelta;
}
int nFactor = flTimeDelta / nTimerTime;
return nTimerTime - (flTimeDelta - nFactor * nTimerTime);
}
//-----------------------------------------------------------------------------
// Purpose: Server's told us to start an act
//-----------------------------------------------------------------------------
void StartAct( int iActNumber, float flStartTime )
{
g_iCurrentActNumber = iActNumber;
g_flActStartTime = flStartTime;
// Find the act
for ( int i = 0; i < g_hActs.Size(); i++ )
{
if ( g_hActs[i] && g_hActs[i]->GetActNumber() == iActNumber )
{
g_hActs[i]->StartAct( flStartTime );
}
}
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
int GetCurrentActNumber( void )
{
if ( g_hCurrentAct )
return g_hCurrentAct->GetActNumber();
return ACT_NONE_SPECIFIED;
}
//-----------------------------------------------------------------------------
// Purpose: Return true if the current act (if any) is a waiting act.
//-----------------------------------------------------------------------------
bool CurrentActIsAWaitingAct( void )
{
if ( g_hCurrentAct )
return g_hCurrentAct->IsAWaitingAct();
return false;
}