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.
234 lines
6.6 KiB
234 lines
6.6 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
//============================================================================= |
|
|
|
#ifndef TEAM_TRAIN_WATCHER_H |
|
#define TEAM_TRAIN_WATCHER_H |
|
#ifdef _WIN32 |
|
#pragma once |
|
#endif |
|
|
|
#include "cbase.h" |
|
#include "trigger_area_capture.h" |
|
#include "shareddefs.h" |
|
#include "envspark.h" |
|
#include "GameEventListener.h" |
|
|
|
class CFuncTrackTrain; |
|
class CPathTrack; |
|
class CTeamControlPoint; |
|
|
|
#define TEAM_TRAIN_ALERT_DISTANCE 750 // alert is the VO warning |
|
#define TEAM_TRAIN_ALARM_DISTANCE 200 // alarm is the looping sound played at the control point |
|
|
|
#define TEAM_TRAIN_ALERT "Announcer.Cart.Warning" |
|
#define TEAM_TRAIN_FINAL_ALERT "Announcer.Cart.FinalWarning" |
|
#define TEAM_TRAIN_ALARM "Cart.Warning" |
|
#define TEAM_TRAIN_ALARM_SINGLE "Cart.WarningSingle" |
|
|
|
#define TW_THINK "CTeamTrainWatcherThink" |
|
#define TW_ALARM_THINK "CTeamTrainWatcherAlarmThink" |
|
#define TW_ALARM_THINK_INTERVAL 8.0 |
|
|
|
// #define TWMASTER_THINK "CTeamTrainWatcherMasterThink" |
|
|
|
DECLARE_AUTO_LIST( ITFTeamTrainWatcher ); |
|
|
|
class CTeamTrainWatcher : public CBaseEntity, public CGameEventListener, public ITFTeamTrainWatcher |
|
{ |
|
DECLARE_CLASS( CTeamTrainWatcher, CBaseEntity ); |
|
public: |
|
DECLARE_SERVERCLASS(); |
|
DECLARE_DATADESC(); |
|
|
|
CTeamTrainWatcher(); |
|
~CTeamTrainWatcher(); |
|
|
|
virtual void UpdateOnRemove( void ); |
|
virtual int UpdateTransmitState(); |
|
|
|
void InputRoundActivate( inputdata_t &inputdata ); |
|
void InputEnable( inputdata_t &inputdata ); |
|
void InputDisable( inputdata_t &inputdata ); |
|
|
|
void InputSetNumTrainCappers( inputdata_t &inputdata ); |
|
void InputOnStartOvertime( inputdata_t &inputdata ); |
|
void InputSetSpeedForwardModifier( inputdata_t &inputdata ); |
|
void InputSetTrainRecedeTime( inputdata_t &inputdata ); |
|
void InputSetTrainCanRecede( inputdata_t &inputdata ); |
|
void InputSetTrainRecedeTimeAndUpdate( inputdata_t &inputdata ); |
|
|
|
// ========================================================== |
|
// given a start node and a list of goal nodes |
|
// calculate the distance between each |
|
// ========================================================== |
|
void WatcherActivate( void ); |
|
|
|
void WatcherThink( void ); |
|
void WatcherAlarmThink( void ); |
|
|
|
CBaseEntity *GetTrainEntity( void ); |
|
bool IsDisabled( void ) { return m_bDisabled; } |
|
|
|
bool TimerMayExpire( void ); |
|
|
|
void StopCaptureAlarm( void ); |
|
|
|
void SetNumTrainCappers( int iNumCappers, CBaseEntity *pTrigger ); // only used for train watchers that control the train movement |
|
|
|
virtual void FireGameEvent( IGameEvent * event ); |
|
|
|
int GetCapturerCount( void ) const; // return the number of players who are "capturing" the payload, or -1 if the payload is blocked |
|
|
|
void ProjectPointOntoPath( const Vector &pos, Vector *posOnPath, float *distanceAlongPath ) const; // project the given position onto the track and return the point and how far along that projected position is |
|
bool IsAheadOfTrain( const Vector &pos ) const; // return true if the given position is farther down the track than the train is |
|
|
|
bool IsTrainAtStart( void ) const; // return true if the train hasn't left its starting position yet |
|
bool IsTrainNearCheckpoint( void ) const; // return true if the train is almost at the next checkpoint |
|
|
|
float GetTrainDistanceAlongTrack( void ) const; |
|
Vector GetNextCheckpointPosition( void ) const; // return world space location of next checkpoint along the path |
|
|
|
#if defined( STAGING_ONLY ) && defined( TF_DLL ) |
|
void DumpStats( void ); |
|
#endif // STAGING_ONLY && TF_DLL |
|
|
|
float GetTrainProgress() { return m_flTotalProgress; } |
|
|
|
private: |
|
|
|
void StartCaptureAlarm( CTeamControlPoint *pPoint ); |
|
void PlayCaptureAlert( CTeamControlPoint *pPoint, bool bFinalPointInMap ); |
|
void InternalSetNumTrainCappers( int iNumCappers, CBaseEntity *pTrigger ); |
|
void InternalSetSpeedForwardModifier( float flModifier ); |
|
#ifdef GLOWS_ENABLE |
|
void FindGlowEntity( void ); |
|
#endif // GLOWS_ENABLE |
|
void HandleTrainMovement( bool bStartReceding = false ); |
|
void HandleSparks( bool bSparks ); |
|
|
|
private: |
|
|
|
bool m_bDisabled; |
|
bool m_bTrainCanRecede; |
|
// === Data === |
|
|
|
// pointer to the train that we're checking |
|
CHandle<CFuncTrackTrain> m_hTrain; |
|
|
|
// start node |
|
CHandle<CPathTrack> m_hStartNode; |
|
|
|
// goal node |
|
CHandle<CPathTrack> m_hGoalNode; |
|
|
|
string_t m_iszTrain; |
|
string_t m_iszStartNode; |
|
string_t m_iszGoalNode; |
|
|
|
// list of node associations with control points |
|
typedef struct |
|
{ |
|
CHandle<CPathTrack> hPathTrack; |
|
CHandle<CTeamControlPoint> hCP; |
|
float flDistanceFromStart; |
|
bool bAlertPlayed; |
|
} node_cp_pair_t; |
|
|
|
node_cp_pair_t m_CPLinks[MAX_CONTROL_POINTS]; |
|
int m_iNumCPLinks; |
|
|
|
string_t m_iszLinkedPathTracks[MAX_CONTROL_POINTS]; |
|
string_t m_iszLinkedCPs[MAX_CONTROL_POINTS]; |
|
|
|
float m_flTotalPathDistance; // calculated only at round start, node graph |
|
// may get chopped as the round progresses |
|
|
|
float m_flTrainDistanceAccumulator; |
|
float m_flTrainDistanceFromStart; // actual distance along path of train, for comparing against m_CPLinks[].flDistanceFromStart |
|
|
|
float m_flSpeedLevels[3]; |
|
|
|
// === Networked Data === |
|
|
|
// current total progress, percentage |
|
CNetworkVar( float, m_flTotalProgress ); |
|
|
|
CNetworkVar( int, m_iTrainSpeedLevel ); |
|
|
|
CNetworkVar( int, m_nNumCappers ); |
|
|
|
bool m_bWaitingToRecede; |
|
CNetworkVar( float, m_flRecedeTime ); |
|
float m_flRecedeTotalTime; |
|
float m_flRecedeStartTime; |
|
COutputEvent m_OnTrainStartRecede; |
|
|
|
bool m_bCapBlocked; |
|
|
|
float m_flNextSpeakForwardConceptTime; // used to have players speak the forward concept every X seconds |
|
CHandle<CTriggerAreaCapture> m_hAreaCap; |
|
|
|
CSoundPatch *m_pAlarm; |
|
float m_flAlarmEndTime; |
|
bool m_bAlarmPlayed; |
|
|
|
// added for new mode where the train_watcher handles the train movement |
|
bool m_bHandleTrainMovement; |
|
string_t m_iszSparkName; |
|
CUtlVector< CHandle<CEnvSpark> > m_Sparks; |
|
float m_flSpeedForwardModifier; |
|
int m_iCurrentHillType; |
|
float m_flCurrentSpeed; |
|
bool m_bReceding; |
|
|
|
int m_nTrainRecedeTime; |
|
|
|
#ifdef GLOWS_ENABLE |
|
CNetworkVar( EHANDLE, m_hGlowEnt ); |
|
#endif // GLOWS_ENABLE |
|
}; |
|
|
|
|
|
inline float CTeamTrainWatcher::GetTrainDistanceAlongTrack( void ) const |
|
{ |
|
return m_flTrainDistanceFromStart; |
|
} |
|
|
|
inline int CTeamTrainWatcher::GetCapturerCount( void ) const |
|
{ |
|
return m_nNumCappers; |
|
} |
|
|
|
|
|
/* |
|
class CTeamTrainWatcherMaster : public CBaseEntity, public CGameEventListener |
|
{ |
|
DECLARE_CLASS( CTeamTrainWatcherMaster, CBaseEntity ); |
|
|
|
public: |
|
CTeamTrainWatcherMaster(); |
|
~CTeamTrainWatcherMaster(); |
|
|
|
void Precache( void ); |
|
|
|
private: |
|
void TWMThink( void ); |
|
void FireGameEvent( IGameEvent *event ); |
|
|
|
bool FindTrainWatchers( void ); |
|
|
|
private: |
|
CTeamTrainWatcher *m_pBlueWatcher; |
|
CTeamTrainWatcher *m_pRedWatcher; |
|
|
|
float m_flBlueProgress; |
|
float m_flRedProgress; |
|
}; |
|
|
|
extern EHANDLE g_hTeamTrainWatcherMaster; |
|
*/ |
|
|
|
#endif //TEAM_TRAIN_WATCHER_H
|
|
|