diff options
| author | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
|---|---|---|
| committer | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
| commit | 3bf9df6b2785fa6d951086978a3e66f49427166a (patch) | |
| tree | 2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /game/server/team_train_watcher.h | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'game/server/team_train_watcher.h')
| -rw-r--r-- | game/server/team_train_watcher.h | 234 |
1 files changed, 234 insertions, 0 deletions
diff --git a/game/server/team_train_watcher.h b/game/server/team_train_watcher.h new file mode 100644 index 0000000..cb527ac --- /dev/null +++ b/game/server/team_train_watcher.h @@ -0,0 +1,234 @@ +//========= 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 |