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
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
|
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose: CTF Flag.
//
//=============================================================================//
#ifndef ENTITY_CAPTURE_FLAG_H
#define ENTITY_CAPTURE_FLAG_H
#ifdef _WIN32
#pragma once
#endif
#include "tf_item.h"
#include "tf_shareddefs.h"
#ifdef CLIENT_DLL
#define CCaptureFlag C_CaptureFlag
#else
class CTFBot;
#endif
#define TF_FLAG_THINK_TIME 0.25f
#define TF_FLAG_OWNER_PICKUP_TIME 3.0f
#define TF_FLAG_TRAIL_ALPHA 96
#define TF_FLAG_NUMBEROFSKINS 3
#define TF_FLAG_MODEL "models/flag/briefcase.mdl"
#define TF_FLAG_ICON "../hud/objectives_flagpanel_carried"
#define TF_FLAG_EFFECT "player_intel_papertrail"
#define TF_FLAG_TRAIL "flagtrail"
//=============================================================================
//
// CTF Flag defines.
//
#define TF_CTF_ENEMY_STOLEN "CaptureFlag.EnemyStolen"
#define TF_CTF_ENEMY_DROPPED "CaptureFlag.EnemyDropped"
#define TF_CTF_ENEMY_CAPTURED "CaptureFlag.EnemyCaptured"
#define TF_CTF_ENEMY_RETURNED "CaptureFlag.EnemyReturned"
#define TF_CTF_TEAM_STOLEN "CaptureFlag.TeamStolen"
#define TF_CTF_TEAM_DROPPED "CaptureFlag.TeamDropped"
#define TF_CTF_TEAM_CAPTURED "CaptureFlag.TeamCaptured"
#define TF_CTF_TEAM_RETURNED "CaptureFlag.TeamReturned"
#define TF_CTF_FLAGSPAWN "CaptureFlag.FlagSpawn"
#define TF_CTF_CAPTURED_TEAM_SCORE 1
//=============================================================================
//
// Attack/Defend Flag defines.
//
#define TF_AD_ENEMY_STOLEN "AttackDefend.EnemyStolen"
#define TF_AD_ENEMY_DROPPED "AttackDefend.EnemyDropped"
#define TF_AD_ENEMY_CAPTURED "AttackDefend.EnemyCaptured"
#define TF_AD_ENEMY_RETURNED "AttackDefend.EnemyReturned"
#define TF_MVM_AD_ENEMY_STOLEN "MVM.AttackDefend.EnemyStolen"
#define TF_MVM_AD_ENEMY_DROPPED "MVM.AttackDefend.EnemyDropped"
#define TF_MVM_AD_ENEMY_CAPTURED "MVM.AttackDefend.EnemyCaptured"
#define TF_MVM_AD_ENEMY_RETURNED "MVM.AttackDefend.EnemyReturned"
#define TF_AD_TEAM_STOLEN "AttackDefend.TeamStolen"
#define TF_AD_TEAM_DROPPED "AttackDefend.TeamDropped"
#define TF_AD_TEAM_CAPTURED "AttackDefend.TeamCaptured"
#define TF_AD_TEAM_RETURNED "AttackDefend.TeamReturned"
#define TF_AD_CAPTURED_SOUND "AttackDefend.Captured"
//=============================================================================
//
// Invade Flag defines.
//
#define TF_INVADE_ENEMY_STOLEN "Invade.EnemyStolen"
#define TF_INVADE_ENEMY_DROPPED "Invade.EnemyDropped"
#define TF_INVADE_ENEMY_CAPTURED "Invade.EnemyCaptured"
#define TF_INVADE_TEAM_STOLEN "Invade.TeamStolen"
#define TF_INVADE_TEAM_DROPPED "Invade.TeamDropped"
#define TF_INVADE_TEAM_CAPTURED "Invade.TeamCaptured"
#define TF_INVADE_FLAG_RETURNED "Invade.FlagReturned"
#define TF_INVADE_CAPTURED_TEAM_SCORE 1
#define TF_INVADE_NEUTRAL_TIME 30.0f
//=============================================================================
//
// Resource Flag defines.
//
#define TF_RESOURCE_FLAGSPAWN "Resource.FlagSpawn"
#define TF_RESOURCE_ENEMY_STOLEN "Announcer.SD_TheirTeamHasFlag"
#define TF_RESOURCE_ENEMY_DROPPED "Announcer.SD_TheirTeamDroppedFlag"
#define TF_RESOURCE_ENEMY_CAPTURED "Announcer.SD_TheirTeamCapped"
#define TF_RESOURCE_TEAM_STOLEN "Announcer.SD_OurTeamHasFlag"
#define TF_RESOURCE_TEAM_DROPPED "Announcer.SD_OurTeamDroppedFlag"
#define TF_RESOURCE_TEAM_CAPTURED "Announcer.SD_OurTeamCapped"
#define TF_RESOURCE_RETURNED "Announcer.SD_FlagReturned"
// Halloween event strings
#define TF_RESOURCE_EVENT_ENEMY_STOLEN "Announcer.SD_Event_TheirTeamHasFlag"
#define TF_RESOURCE_EVENT_ENEMY_DROPPED "Announcer.SD_Event_TheirTeamDroppedFlag"
#define TF_RESOURCE_EVENT_TEAM_STOLEN "Announcer.SD_Event_OurTeamHasFlag"
#define TF_RESOURCE_EVENT_TEAM_DROPPED "Announcer.SD_Event_OurTeamDroppedFlag"
#define TF_RESOURCE_EVENT_RETURNED "Announcer.SD_Event_FlagReturned"
#define TF_RESOURCE_EVENT_NAGS "Announcer.SD_Event_FlagNags"
#define TF_RESOURCE_EVENT_RED_CAPPED "Announcer.SD_Event_CappedRed"
#define TF_RESOURCE_EVENT_BLUE_CAPPED "Announcer.SD_Event_CappedBlu"
//=============================================================================
//
// Robot Destruction Flag defines.
//
#define TF_RD_ENEMY_STOLEN "RD.EnemyStolen"
#define TF_RD_ENEMY_DROPPED "RD.EnemyDropped"
#define TF_RD_ENEMY_CAPTURED "RD.EnemyCaptured"
#define TF_RD_ENEMY_RETURNED "RD.EnemyReturned"
#define TF_RD_TEAM_STOLEN "RD.TeamStolen"
#define TF_RD_TEAM_DROPPED "RD.TeamDropped"
#define TF_RD_TEAM_CAPTURED "RD.TeamCaptured"
#define TF_RD_TEAM_RETURNED "RD.TeamReturned"
#define TF_RESOURCE_CAPTURED_TEAM_SCORE 1
//=============================================================================
//
// Powerup mode defines.
//
#define TF_RUNE_INTEL_CAPTURED "CaptureFlag.TeamCapturedExcited"
//=============================================================================
//
// Robot Destruction defines
//
#ifdef CLIENT_DLL
#define CCaptureFlagReturnIcon C_CaptureFlagReturnIcon
#define CBaseAnimating C_BaseAnimating
#endif
class CCaptureFlagReturnIcon: public CBaseAnimating
{
public:
DECLARE_CLASS( CCaptureFlagReturnIcon, CBaseEntity );
DECLARE_NETWORKCLASS();
CCaptureFlagReturnIcon();
#ifdef CLIENT_DLL
virtual int DrawModel( int flags );
void DrawReturnProgressBar( void );
virtual RenderGroup_t GetRenderGroup( void );
virtual bool ShouldDraw( void ) { return true; }
virtual void GetRenderBounds( Vector& theMins, Vector& theMaxs );
private:
IMaterial *m_pReturnProgressMaterial_Empty; // For labels above players' heads.
IMaterial *m_pReturnProgressMaterial_Full;
#else
public:
virtual void Spawn( void );
virtual int UpdateTransmitState( void );
#endif
};
//=============================================================================
//
// CTF Flag class.
//
DECLARE_AUTO_LIST( ICaptureFlagAutoList );
class CCaptureFlag : public CTFItem, public ICaptureFlagAutoList
{
public:
DECLARE_CLASS( CCaptureFlag, CTFItem );
DECLARE_NETWORKCLASS();
CCaptureFlag();
~CCaptureFlag();
unsigned int GetItemID( void ) const OVERRIDE;
void Precache( void );
void Spawn( void );
virtual void UpdateOnRemove( void );
void FlagTouch( CBaseEntity *pOther );
bool IsDisabled( void ) const;
void SetDisabled( bool bDisabled );
void SetVisibleWhenDisabled( bool bVisible );
bool IsPoisonous( void ) { return m_flTimeToSetPoisonous > 0 && gpGlobals->curtime > m_flTimeToSetPoisonous; }
float GetPoisonTime( void ) const { return m_flTimeToSetPoisonous; }
bool IsVisibleWhenDisabled( void ) { return m_bVisibleWhenDisabled; }
CBaseEntity *GetPrevOwner( void ) { return m_hPrevOwner.Get(); }
//-----------------------------------------------------------------------------
// Purpose: Sets the flag status
//-----------------------------------------------------------------------------
void SetFlagStatus( int iStatus, CBasePlayer *pNewOwner = NULL );
// Game DLL Functions
#ifdef GAME_DLL
CCaptureFlag &operator=( const CCaptureFlag& rhs );
virtual void Activate( void );
static CCaptureFlag* Create( const Vector& vecOrigin, const char *pszModelName, ETFFlagType type );
// Input handlers
void InputEnable( inputdata_t &inputdata );
void InputDisable( inputdata_t &inputdata );
void InputRoundActivate( inputdata_t &inputdata );
void InputForceDrop( inputdata_t &inputdata );
void InputForceReset( inputdata_t &inputdata );
void InputForceResetSilent( inputdata_t &inputdata );
void InputForceResetAndDisableSilent( inputdata_t &inputdata );
void InputSetReturnTime( inputdata_t &inputdata );
void InputShowTimer( inputdata_t &inputdata );
void InputForceGlowDisabled( inputdata_t &inputdata );
void Think( void );
void CreateReturnIcon( void );
void DestroyReturnIcon( void );
void ResetFlagReturnTime( void ) { m_flResetTime = 0; }
void SetFlagReturnIn( float flTime )
{
m_flResetTime = gpGlobals->curtime + flTime;
m_flMaxResetTime = flTime;
}
void SetFlagReturnIn( float flTime, float flMaxResetTime )
{
m_flResetTime = gpGlobals->curtime + flTime;
m_flMaxResetTime = flMaxResetTime;
}
void ResetFlagNeutralTime( void ) { m_flNeutralTime = 0; }
void SetFlagNeutralIn( float flTime )
{
m_flNeutralTime = gpGlobals->curtime + flTime;
m_flMaxResetTime = flTime;
}
bool IsCaptured( void ){ return m_bCaptured; }
int UpdateTransmitState();
void StartFlagTrail ( void );
void RemoveFlagTrail ( void );
EHANDLE m_pFlagTrail;
float m_flFlagTrailLife;
bool m_bInstantTrailRemove;
int GetNumTags() const { return m_tags.Count(); }
const char* GetTag( int i ) const { return m_tags[i]; }
void AddFollower( CTFBot* pBot );
void RemoveFollower( CTFBot* pBot );
int GetNumFollowers() const { return m_followers.Count(); }
void AddPointValue( int nPoints );
#else // CLIENT DLL Functions
virtual bool ShouldDraw() OVERRIDE;
virtual bool IsVisibleToTargetID() const OVERRIDE;
virtual const char *GetIDString( void ) { return "entity_capture_flag"; };
virtual void OnPreDataChanged( DataUpdateType_t updateType );
virtual void OnDataChanged( DataUpdateType_t updateType );
void CreateSiren( void );
void DestroySiren( void );
void ManageTrailEffects( void );
CNewParticleEffect *m_pGlowTrailEffect;
CNewParticleEffect *m_pPaperTrailEffect;
virtual void Simulate( void );
float GetMaxResetTime() { return m_flMaxResetTime; }
float GetReturnProgress( void );
public:
void UpdateGlowEffect( void );
virtual bool ShouldHideGlowEffect( void );
#endif
// TODO: Both of these should be updated to work with floats instead of ints.
int GetReturnTime( int nMaxReturnTime );
int GetMaxReturnTime( void );
void Capture( CTFPlayer *pPlayer, int nCapturePoint );
virtual void PickUp( CTFPlayer *pPlayer, bool bInvisible );
virtual void Drop( CTFPlayer *pPlayer, bool bVisible, bool bThrown = false, bool bMessage = true );
ETFFlagType GetType( void ) const { return (ETFFlagType)m_nType.Get(); }
bool IsDropped( void );
bool IsHome( void );
bool IsStolen( void );
void ResetFlag( void )
{
Reset();
ResetMessage();
}
const char *GetFlagModel( void );
void GetHudIcon( int nTeam, char *pchName, int nBuffSize );
const char *GetPaperEffect( void );
void GetTrailEffect( int nTeam, char *pchName, int nBuffSize );
int GetPointValue() const { return m_nPointValue.Get(); }
private:
void Reset( void );
void ResetMessage( void );
void InternalForceReset( bool bSilent = false );
#ifdef GAME_DLL
void PlaySound( IRecipientFilter& filter, const char *pszString, int iTeam = TEAM_ANY );
float m_flNextTeamSoundTime[TF_TEAM_COUNT];
void SetGlowEnabled( bool bGlowEnabled ){ m_bGlowEnabled = bGlowEnabled; }
#endif
bool IsGlowEnabled( void ){ return m_bGlowEnabled; }
private:
CNetworkVar( bool, m_bDisabled ); // Enabled/Disabled?
CNetworkVar( bool, m_bVisibleWhenDisabled );
CNetworkVar( int, m_nType ); // Type of game this flag will be used for.
CNetworkVar( int, m_nFlagStatus );
CNetworkVar( float, m_flResetTime ); // Time until the flag is placed back at spawn.
CNetworkVar( float, m_flMaxResetTime ); // Time the flag takes to return in the current mode
CNetworkVar( float, m_flNeutralTime ); // Time until the flag becomes neutral (used for the invade gametype)
CNetworkHandle( CBaseEntity, m_hPrevOwner );
CNetworkVar( int, m_nPointValue ); // How many points this flag is worth when scored. Used in Robot Destruction mode.
CNetworkVar( float, m_flAutoCapTime );
CNetworkVar( bool, m_bGlowEnabled );
#ifdef GAME_DLL
string_t m_iszModel;
string_t m_iszHudIcon;
string_t m_iszPaperEffect;
string_t m_iszTrailEffect;
string_t m_iszTags;
CUtlStringList m_tags;
CUtlVector< CHandle< CTFBot > > m_followers;
#endif
CNetworkString( m_szModel, MAX_PATH );
CNetworkString( m_szHudIcon, MAX_PATH );
CNetworkString( m_szPaperEffect, MAX_PATH );
CNetworkString( m_szTrailEffect, MAX_PATH );
CNetworkVar( int, m_nUseTrailEffect );
int m_iOriginalTeam;
float m_flOwnerPickupTime;
int GetReturnTimeShotClockMode( int nStartReturnTime );
inline bool IsFlagShotClockModePossible() const
{
return m_nType == TF_FLAGTYPE_CTF
|| m_nType == TF_FLAGTYPE_ROBOT_DESTRUCTION
|| m_nType == TF_FLAGTYPE_RESOURCE_CONTROL;
}
float m_flLastPickupTime; // What the time was of the last pickup by any player.
float m_flLastResetDuration; // How long was the last time to reset before being picked up?
int m_nReturnTime; // Length of time (in seconds) before dropped flag/intelligence returns to base.
int m_nNeutralType; // Type of neutral flag (only used for Invade game type).
int m_nScoringType; // Type of scoring for flag capture (only used for Invade game type).
bool m_bReturnBetweenWaves; // Used in MvM mode to determine if the flag should return between waves.
bool m_bUseShotClockMode; // Used to determine whether we should be using shot clock mode or not.
CNetworkVar( float, m_flTimeToSetPoisonous ); // Time to set the flag as poisonous
EHANDLE m_hReturnIcon;
#ifdef GAME_DLL
Vector m_vecResetPos; // The position the flag should respawn (reset) at.
QAngle m_vecResetAng; // The angle the flag should respawn (reset) at.
COutputEvent m_outputOnReturn; // Fired when the flag is returned via timer.
COutputEvent m_outputOnPickUp; // Fired when the flag is picked up.
COutputEvent m_outputOnPickUpTeam1; // Fired when the flag is picked up by RED.
COutputEvent m_outputOnPickUpTeam2; // Fired when the flag is picked up by BLU.
COutputEvent m_outputOnDrop; // Fired when the flag is dropped.
COutputEvent m_outputOnCapture; // Fired when the flag is captured.
COutputEvent m_OnCapTeam1;
COutputEvent m_OnCapTeam2;
COutputEvent m_OnTouchSameTeam;
bool m_bAllowOwnerPickup;
bool m_bCaptured;
EHANDLE m_hInitialPlayer;
EHANDLE m_hInitialParent;
Vector m_vecOffset;
#else
IMaterial *m_pReturnProgressMaterial_Empty; // For labels above players' heads.
IMaterial *m_pReturnProgressMaterial_Full;
int m_nOldTeamNumber;
EHANDLE m_hOldOwner;
CGlowObject *m_pGlowEffect;
CGlowObject *m_pCarrierGlowEffect;
HPARTICLEFFECT m_hSirenEffect;
bool m_bOldGlowEnabled;
#endif
DECLARE_DATADESC();
};
#endif // ENTITY_CAPTURE_FLAG_H
|