//========= 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 ); // ========================================================== // 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 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 m_hTrain; // start node CHandle m_hStartNode; // goal node CHandle m_hGoalNode; string_t m_iszTrain; string_t m_iszStartNode; string_t m_iszGoalNode; // list of node associations with control points typedef struct { CHandle hPathTrack; CHandle 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_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 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 > 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