aboutsummaryrefslogtreecommitdiff
path: root/sp/src/game/server/team_train_watcher.h
blob: 22b82c6f085f9f6fa5328039eda720ad1cff7d95 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
//========= 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<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_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