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
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
|
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
//===========================================================================//
#ifndef COMBATWEAPON_SHARED_H
#define COMBATWEAPON_SHARED_H
#ifdef _WIN32
#pragma once
#endif
#include "sharedInterface.h"
#include "vphysics_interface.h"
#include "predictable_entity.h"
#include "soundflags.h"
#include "weapon_parse.h"
#include "baseviewmodel_shared.h"
#include "weapon_proficiency.h"
#include "utlmap.h"
#if defined( CLIENT_DLL )
#define CBaseCombatWeapon C_BaseCombatWeapon
#endif
// Hacky
#if defined ( TF_CLIENT_DLL ) || defined ( TF_DLL )
#include "econ_entity.h"
#endif // TF_CLIENT_DLL || TF_DLL
#if !defined( CLIENT_DLL )
extern void OnBaseCombatWeaponCreated( CBaseCombatWeapon * );
extern void OnBaseCombatWeaponDestroyed( CBaseCombatWeapon * );
void *SendProxy_SendLocalWeaponDataTable( const SendProp *pProp, const void *pStruct, const void *pVarData, CSendProxyRecipients *pRecipients, int objectID );
#endif
class CBasePlayer;
class CBaseCombatCharacter;
class IPhysicsConstraint;
class CUserCmd;
// How many times to display altfire hud hints (per weapon)
#define WEAPON_ALTFIRE_HUD_HINT_COUNT 1
#define WEAPON_RELOAD_HUD_HINT_COUNT 1
//Start with a constraint in place (don't drop to floor)
#define SF_WEAPON_START_CONSTRAINED (1<<0)
#define SF_WEAPON_NO_PLAYER_PICKUP (1<<1)
#define SF_WEAPON_NO_PHYSCANNON_PUNT (1<<2)
//Percent
#define CLIP_PERC_THRESHOLD 0.75f
// Put this in your derived class definition to declare it's activity table
// UNDONE: Cascade these?
#define DECLARE_ACTTABLE() static acttable_t m_acttable[];\
acttable_t *ActivityList( void );\
int ActivityListCount( void );
// You also need to include the activity table itself in your class' implementation:
// e.g.
// acttable_t CWeaponStunstick::m_acttable[] =
// {
// { ACT_MELEE_ATTACK1, ACT_MELEE_ATTACK_SWING, TRUE },
// };
//
// The stunstick overrides the ACT_MELEE_ATTACK1 activity, replacing it with ACT_MELEE_ATTACK_SWING.
// This animation is required for this weapon's operation.
//
// Put this after your derived class' definition to implement the accessors for the
// activity table.
// UNDONE: Cascade these?
#define IMPLEMENT_ACTTABLE(className) \
acttable_t *className::ActivityList( void ) { return m_acttable; } \
int className::ActivityListCount( void ) { return ARRAYSIZE(m_acttable); } \
typedef struct
{
int baseAct;
int weaponAct;
bool required;
} acttable_t;
class CHudTexture;
class Color;
namespace vgui2
{
typedef unsigned long HFont;
}
// -----------------------------------------
// Vector cones
// -----------------------------------------
// VECTOR_CONE_PRECALCULATED - this resolves to vec3_origin, but adds some
// context indicating that the person writing the code is not allowing
// FireBullets() to modify the direction of the shot because the shot direction
// being passed into the function has already been modified by another piece of
// code and should be fired as specified. See GetActualShotTrajectory().
// NOTE: The way these are calculated is that each component == sin (degrees/2)
#define VECTOR_CONE_PRECALCULATED vec3_origin
#define VECTOR_CONE_1DEGREES Vector( 0.00873, 0.00873, 0.00873 )
#define VECTOR_CONE_2DEGREES Vector( 0.01745, 0.01745, 0.01745 )
#define VECTOR_CONE_3DEGREES Vector( 0.02618, 0.02618, 0.02618 )
#define VECTOR_CONE_4DEGREES Vector( 0.03490, 0.03490, 0.03490 )
#define VECTOR_CONE_5DEGREES Vector( 0.04362, 0.04362, 0.04362 )
#define VECTOR_CONE_6DEGREES Vector( 0.05234, 0.05234, 0.05234 )
#define VECTOR_CONE_7DEGREES Vector( 0.06105, 0.06105, 0.06105 )
#define VECTOR_CONE_8DEGREES Vector( 0.06976, 0.06976, 0.06976 )
#define VECTOR_CONE_9DEGREES Vector( 0.07846, 0.07846, 0.07846 )
#define VECTOR_CONE_10DEGREES Vector( 0.08716, 0.08716, 0.08716 )
#define VECTOR_CONE_15DEGREES Vector( 0.13053, 0.13053, 0.13053 )
#define VECTOR_CONE_20DEGREES Vector( 0.17365, 0.17365, 0.17365 )
//-----------------------------------------------------------------------------
// Purpose: Base weapon class, shared on client and server
//-----------------------------------------------------------------------------
#if defined USES_ECON_ITEMS
#define BASECOMBATWEAPON_DERIVED_FROM CEconEntity
#else
#define BASECOMBATWEAPON_DERIVED_FROM CBaseAnimating
#endif
//-----------------------------------------------------------------------------
// Collect trace attacks for weapons that fire multiple projectiles per attack that also penetrate
//-----------------------------------------------------------------------------
class CDmgAccumulator
{
public:
CDmgAccumulator( void );
~CDmgAccumulator();
#ifdef GAME_DLL
virtual void Start( void ) { m_bActive = true; }
virtual void AccumulateMultiDamage( const CTakeDamageInfo &info, CBaseEntity *pEntity );
virtual void Process( void );
private:
CTakeDamageInfo m_updatedInfo;
CUtlMap< int, CTakeDamageInfo > m_TargetsDmgInfo;
#endif // GAME_DLL
private:
bool m_bActive;
};
//-----------------------------------------------------------------------------
// Purpose: Client side rep of CBaseTFCombatWeapon
//-----------------------------------------------------------------------------
// Hacky
class CBaseCombatWeapon : public BASECOMBATWEAPON_DERIVED_FROM
{
public:
DECLARE_CLASS( CBaseCombatWeapon, BASECOMBATWEAPON_DERIVED_FROM );
DECLARE_NETWORKCLASS();
DECLARE_PREDICTABLE();
CBaseCombatWeapon();
virtual ~CBaseCombatWeapon();
virtual bool IsBaseCombatWeapon( void ) const { return true; }
virtual CBaseCombatWeapon *MyCombatWeaponPointer( void ) { return this; }
// A derived weapon class should return true here so that weapon sounds, etc, can
// apply the proper filter
virtual bool IsPredicted( void ) const { return false; }
virtual void Spawn( void );
virtual void Precache( void );
void MakeTracer( const Vector &vecTracerSrc, const trace_t &tr, int iTracerType );
// Subtypes are used to manage multiple weapons of the same type on the player.
virtual int GetSubType( void ) { return m_iSubType; }
virtual void SetSubType( int iType ) { m_iSubType = iType; }
virtual void Equip( CBaseCombatCharacter *pOwner );
virtual void Drop( const Vector &vecVelocity );
virtual int UpdateClientData( CBasePlayer *pPlayer );
virtual bool IsAllowedToSwitch( void );
virtual bool CanBeSelected( void );
virtual bool VisibleInWeaponSelection( void );
virtual bool HasAmmo( void );
// Weapon Pickup For Player
virtual void SetPickupTouch( void );
virtual void DefaultTouch( CBaseEntity *pOther ); // default weapon touch
virtual void GiveTo( CBaseEntity *pOther );
// HUD Hints
virtual bool ShouldDisplayAltFireHUDHint();
virtual void DisplayAltFireHudHint();
virtual void RescindAltFireHudHint(); ///< undisplay the hud hint and pretend it never showed.
virtual bool ShouldDisplayReloadHUDHint();
virtual void DisplayReloadHudHint();
virtual void RescindReloadHudHint();
// Weapon client handling
virtual void SetViewModelIndex( int index = 0 );
virtual bool SendWeaponAnim( int iActivity );
virtual void SendViewModelAnim( int nSequence );
float GetViewModelSequenceDuration(); // Return how long the current view model sequence is.
bool IsViewModelSequenceFinished( void ); // Returns if the viewmodel's current animation is finished
virtual void SetViewModel();
virtual bool HasWeaponIdleTimeElapsed( void );
virtual void SetWeaponIdleTime( float time );
virtual float GetWeaponIdleTime( void );
// Weapon selection
virtual bool HasAnyAmmo( void ); // Returns true is weapon has ammo
virtual bool HasPrimaryAmmo( void ); // Returns true is weapon has ammo
virtual bool HasSecondaryAmmo( void ); // Returns true is weapon has ammo
bool UsesPrimaryAmmo( void ); // returns true if the weapon actually uses primary ammo
bool UsesSecondaryAmmo( void ); // returns true if the weapon actually uses secondary ammo
void GiveDefaultAmmo( void );
virtual bool CanHolster( void ) { return TRUE; }; // returns true if the weapon can be holstered
virtual bool DefaultDeploy( char *szViewModel, char *szWeaponModel, int iActivity, char *szAnimExt );
virtual bool CanDeploy( void ) { return true; } // return true if the weapon's allowed to deploy
virtual bool Deploy( void ); // returns true is deploy was successful
virtual bool Holster( CBaseCombatWeapon *pSwitchingTo = NULL );
virtual CBaseCombatWeapon *GetLastWeapon( void ) { return this; }
virtual void SetWeaponVisible( bool visible );
virtual bool IsWeaponVisible( void );
virtual bool ReloadOrSwitchWeapons( void );
virtual void OnActiveStateChanged( int iOldState ) { return; }
virtual bool HolsterOnDetach() { return false; }
virtual bool IsHolstered(){ return false; }
virtual void Detach() {}
// Weapon behaviour
virtual void ItemPreFrame( void ); // called each frame by the player PreThink
virtual void ItemPostFrame( void ); // called each frame by the player PostThink
virtual void ItemBusyFrame( void ); // called each frame by the player PostThink, if the player's not ready to attack yet
virtual void ItemHolsterFrame( void ) {}; // called each frame by the player PreThink, if the weapon is holstered
virtual void WeaponIdle( void ); // called when no buttons pressed
virtual void HandleFireOnEmpty(); // Called when they have the attack button down
// but they are out of ammo. The default implementation
// either reloads, switches weapons, or plays an empty sound.
virtual bool CanPerformSecondaryAttack() const;
virtual bool ShouldBlockPrimaryFire() { return false; }
#ifdef CLIENT_DLL
virtual void CreateMove( float flInputSampleTime, CUserCmd *pCmd, const QAngle &vecOldViewAngles ) {}
virtual int CalcOverrideModelIndex() OVERRIDE;
#endif
virtual bool IsWeaponZoomed() { return false; } // Is this weapon in its 'zoomed in' mode?
// Reloading
virtual void CheckReload( void );
virtual void FinishReload( void );
virtual void AbortReload( void );
virtual bool Reload( void );
bool DefaultReload( int iClipSize1, int iClipSize2, int iActivity );
bool ReloadsSingly( void ) const;
virtual bool AutoFiresFullClip( void ) { return false; }
virtual bool CanOverload( void ) { return false; }
virtual void UpdateAutoFire( void );
// Weapon firing
virtual void PrimaryAttack( void ); // do "+ATTACK"
virtual void SecondaryAttack( void ) { return; } // do "+ATTACK2"
// Firing animations
virtual Activity GetPrimaryAttackActivity( void );
virtual Activity GetSecondaryAttackActivity( void );
virtual Activity GetDrawActivity( void );
virtual float GetDefaultAnimSpeed( void ) { return 1.0; }
// Bullet launch information
virtual int GetBulletType( void );
virtual const Vector& GetBulletSpread( void );
virtual Vector GetBulletSpread( WeaponProficiency_t proficiency ) { return GetBulletSpread(); }
virtual float GetSpreadBias( WeaponProficiency_t proficiency ) { return 1.0; }
virtual float GetFireRate( void );
virtual int GetMinBurst() { return 1; }
virtual int GetMaxBurst() { return 1; }
virtual float GetMinRestTime() { return 0.3; }
virtual float GetMaxRestTime() { return 0.6; }
virtual int GetRandomBurst() { return random->RandomInt( GetMinBurst(), GetMaxBurst() ); }
virtual void WeaponSound( WeaponSound_t sound_type, float soundtime = 0.0f );
virtual void StopWeaponSound( WeaponSound_t sound_type );
virtual const WeaponProficiencyInfo_t *GetProficiencyValues();
// Autoaim
virtual float GetMaxAutoAimDeflection() { return 0.99f; }
virtual float WeaponAutoAimScale() { return 1.0f; } // allows a weapon to influence the perceived size of the target's autoaim radius.
// TF Sprinting functions
virtual bool StartSprinting( void ) { return false; };
virtual bool StopSprinting( void ) { return false; };
// TF Injury functions
virtual float GetDamage( float flDistance, int iLocation ) { return 0.0; };
virtual void SetActivity( Activity act, float duration );
inline void SetActivity( Activity eActivity ) { m_Activity = eActivity; }
inline Activity GetActivity( void ) { return m_Activity; }
virtual void AddViewKick( void ); // Add in the view kick for the weapon
virtual char *GetDeathNoticeName( void ); // Get the string to print death notices with
CBaseCombatCharacter *GetOwner() const;
void SetOwner( CBaseCombatCharacter *owner );
virtual void OnPickedUp( CBaseCombatCharacter *pNewOwner );
virtual void AddViewmodelBob( CBaseViewModel *viewmodel, Vector &origin, QAngle &angles ) {};
virtual float CalcViewmodelBob( void ) { return 0.0f; };
// Returns information about the various control panels
virtual void GetControlPanelInfo( int nPanelIndex, const char *&pPanelName );
virtual void GetControlPanelClassName( int nPanelIndex, const char *&pPanelName );
virtual bool ShouldShowControlPanels( void ) { return true; }
void Lock( float lockTime, CBaseEntity *pLocker );
bool IsLocked( CBaseEntity *pAsker );
//All weapons can be picked up by NPCs by default
virtual bool CanBePickedUpByNPCs( void ) { return true; }
virtual int GetSkinOverride() const { return -1; }
public:
// Weapon info accessors for data in the weapon's data file
const FileWeaponInfo_t &GetWpnData( void ) const;
virtual const char *GetViewModel( int viewmodelindex = 0 ) const;
virtual const char *GetWorldModel( void ) const;
virtual const char *GetAnimPrefix( void ) const;
virtual int GetMaxClip1( void ) const;
virtual int GetMaxClip2( void ) const;
virtual int GetDefaultClip1( void ) const;
virtual int GetDefaultClip2( void ) const;
virtual int GetWeight( void ) const;
virtual bool AllowsAutoSwitchTo( void ) const;
virtual bool AllowsAutoSwitchFrom( void ) const;
virtual int GetWeaponFlags( void ) const;
virtual int GetSlot( void ) const;
virtual int GetPosition( void ) const;
virtual char const *GetName( void ) const;
virtual char const *GetPrintName( void ) const;
virtual char const *GetShootSound( int iIndex ) const;
virtual int GetRumbleEffect() const;
virtual bool UsesClipsForAmmo1( void ) const;
virtual bool UsesClipsForAmmo2( void ) const;
bool IsMeleeWeapon() const;
// derive this function if you mod uses encrypted weapon info files
virtual const unsigned char *GetEncryptionKey( void );
virtual int GetPrimaryAmmoType( void ) const { return m_iPrimaryAmmoType; }
virtual int GetSecondaryAmmoType( void ) const { return m_iSecondaryAmmoType; }
virtual int Clip1() { return m_iClip1; }
virtual int Clip2() { return m_iClip2; }
// Ammo quantity queries for weapons that do not use clips. These are only
// used to determine how much ammo is in a weapon that does not have an owner.
// That is, a weapon that's on the ground for the player to get ammo out of.
int GetPrimaryAmmoCount() { return m_iPrimaryAmmoCount; }
void SetPrimaryAmmoCount( int count ) { m_iPrimaryAmmoCount = count; }
int GetSecondaryAmmoCount() { return m_iSecondaryAmmoCount; }
void SetSecondaryAmmoCount( int count ) { m_iSecondaryAmmoCount = count; }
virtual CHudTexture const *GetSpriteActive( void ) const;
virtual CHudTexture const *GetSpriteInactive( void ) const;
virtual CHudTexture const *GetSpriteAmmo( void ) const;
virtual CHudTexture const *GetSpriteAmmo2( void ) const;
virtual CHudTexture const *GetSpriteCrosshair( void ) const;
virtual CHudTexture const *GetSpriteAutoaim( void ) const;
virtual CHudTexture const *GetSpriteZoomedCrosshair( void ) const;
virtual CHudTexture const *GetSpriteZoomedAutoaim( void ) const;
virtual Activity ActivityOverride( Activity baseAct, bool *pRequired );
virtual acttable_t* ActivityList( void ) { return NULL; }
virtual int ActivityListCount( void ) { return 0; }
virtual void Activate( void );
virtual bool ShouldUseLargeViewModelVROverride() { return false; }
public:
// Server Only Methods
#if !defined( CLIENT_DLL )
DECLARE_DATADESC();
virtual void FallInit( void ); // prepare to fall to the ground
virtual void FallThink( void ); // make the weapon fall to the ground after spawning
// Weapon spawning
bool IsConstrained() { return m_pConstraint != NULL; }
bool IsInBadPosition ( void ); // Is weapon in bad position to pickup?
bool RepositionWeapon ( void ); // Attempts to reposition the weapon in a location where it can be
virtual void Materialize( void ); // make a weapon visible and tangible
void AttemptToMaterialize( void ); // see if the game rules will let the weapon become visible and tangible
virtual void CheckRespawn( void ); // see if this weapon should respawn after being picked up
CBaseEntity *Respawn ( void ); // copy a weapon
static int GetAvailableWeaponsInBox( CBaseCombatWeapon **pList, int listMax, const Vector &mins, const Vector &maxs );
// Weapon dropping / destruction
virtual void Delete( void );
void DestroyItem( void );
virtual void Kill( void );
virtual int CapabilitiesGet( void ) { return 0; }
virtual int ObjectCaps( void );
bool IsRemoveable() { return m_bRemoveable; }
void SetRemoveable( bool bRemoveable ) { m_bRemoveable = bRemoveable; }
// Returns bits for weapon conditions
virtual bool WeaponLOSCondition( const Vector &ownerPos, const Vector &targetPos, bool bSetConditions );
virtual int WeaponRangeAttack1Condition( float flDot, float flDist );
virtual int WeaponRangeAttack2Condition( float flDot, float flDist );
virtual int WeaponMeleeAttack1Condition( float flDot, float flDist );
virtual int WeaponMeleeAttack2Condition( float flDot, float flDist );
virtual void Operator_FrameUpdate( CBaseCombatCharacter *pOperator );
virtual void Operator_HandleAnimEvent( animevent_t *pEvent, CBaseCombatCharacter *pOperator );
virtual void Operator_ForceNPCFire( CBaseCombatCharacter *pOperator, bool bSecondary ) { return; }
// NOTE: This should never be called when a character is operating the weapon. Animation events should be
// routed through the character, and then back into CharacterAnimEvent()
void HandleAnimEvent( animevent_t *pEvent );
virtual int UpdateTransmitState( void );
void InputHideWeapon( inputdata_t &inputdata );
void Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value );
virtual CDmgAccumulator *GetDmgAccumulator( void ) { return NULL; }
// Client only methods
#else
virtual void BoneMergeFastCullBloat( Vector &localMins, Vector &localMaxs, const Vector &thisEntityMins, const Vector &thisEntityMaxs ) const;
virtual bool OnFireEvent( C_BaseViewModel *pViewModel, const Vector& origin, const QAngle& angles, int event, const char *options )
{
#if defined USES_ECON_ITEMS
return BaseClass::OnFireEvent( pViewModel, origin, angles, event, options );
#else
return false;
#endif
}
// Should this object cast shadows?
virtual ShadowType_t ShadowCastType();
virtual void SetDormant( bool bDormant );
virtual void OnDataChanged( DataUpdateType_t updateType );
virtual void OnRestore();
virtual void RestartParticleEffect( void ) {}
virtual void Redraw(void);
virtual void ViewModelDrawn( CBaseViewModel *pViewModel );
// Get the position that bullets are seen coming out. Note: the returned values are different
// for first person and third person.
bool GetShootPosition( Vector &vOrigin, QAngle &vAngles );
virtual void DrawCrosshair( void );
virtual bool ShouldDrawCrosshair( void ) { return true; }
// Weapon state checking
virtual bool IsCarriedByLocalPlayer( void );
virtual bool ShouldDrawUsingViewModel( void );
virtual bool IsActiveByLocalPlayer( void );
bool IsBeingCarried() const;
// Is the carrier alive?
bool IsCarrierAlive() const;
// Returns the aiment render origin + angles
virtual int DrawModel( int flags );
virtual bool ShouldDraw( void );
virtual bool ShouldDrawPickup( void );
virtual void HandleInput( void ) { return; };
virtual void OverrideMouseInput( float *x, float *y ) { return; };
virtual int KeyInput( int down, ButtonCode_t keynum, const char *pszCurrentBinding ) { return 1; }
virtual bool AddLookShift( void ) { return true; };
virtual void GetViewmodelBoneControllers(C_BaseViewModel *pViewModel, float controllers[MAXSTUDIOBONECTRLS]) { return; }
virtual void NotifyShouldTransmit( ShouldTransmitState_t state );
WEAPON_FILE_INFO_HANDLE GetWeaponFileInfoHandle() { return m_hWeaponFileInfo; }
virtual int GetWorldModelIndex( void );
virtual void GetToolRecordingState( KeyValues *msg );
virtual void GetWeaponCrosshairScale( float &flScale ) { flScale = 1.f; }
#if !defined USES_ECON_ITEMS
// Viewmodel overriding
virtual bool ViewModel_IsTransparent( void ) { return IsTransparent(); }
virtual bool ViewModel_IsUsingFBTexture( void ) { return UsesPowerOfTwoFrameBufferTexture(); }
virtual bool IsOverridingViewmodel( void ) { return false; };
virtual int DrawOverriddenViewmodel( C_BaseViewModel *pViewmodel, int flags ) { return 0; };
bool WantsToOverrideViewmodelAttachments( void ) { return false; }
#endif
#endif // End client-only methods
virtual bool CanLower( void ) { return false; }
virtual bool Ready( void ) { return false; }
virtual bool Lower( void ) { return false; }
virtual void HideThink( void );
virtual bool CanReload( void );
private:
typedef CHandle< CBaseCombatCharacter > CBaseCombatCharacterHandle;
CNetworkVar( CBaseCombatCharacterHandle, m_hOwner ); // Player carrying this weapon
protected:
#if defined ( TF_CLIENT_DLL ) || defined ( TF_DLL )
// Regulate crit frequency to reduce client-side seed hacking
void AddToCritBucket( float flAmount );
void RemoveFromCritBucket( float flAmount ) { m_flCritTokenBucket -= flAmount; }
bool IsAllowedToWithdrawFromCritBucket( float flDamage );
float m_flCritTokenBucket;
int m_nCritChecks;
int m_nCritSeedRequests;
#endif // TF
public:
// Networked fields
CNetworkVar( int, m_nViewModelIndex );
// Weapon firing
CNetworkVar( float, m_flNextPrimaryAttack ); // soonest time ItemPostFrame will call PrimaryAttack
CNetworkVar( float, m_flNextSecondaryAttack ); // soonest time ItemPostFrame will call SecondaryAttack
CNetworkVar( float, m_flTimeWeaponIdle ); // soonest time ItemPostFrame will call WeaponIdle
// Weapon state
bool m_bInReload; // Are we in the middle of a reload;
bool m_bFireOnEmpty; // True when the gun is empty and the player is still holding down the attack key(s)
bool m_bFiringWholeClip; // Are we in the middle of firing the whole clip;
// Weapon art
CNetworkVar( int, m_iViewModelIndex );
CNetworkVar( int, m_iWorldModelIndex );
// Sounds
float m_flNextEmptySoundTime; // delay on empty sound playing
Activity GetIdealActivity( void ) { return m_IdealActivity; }
int GetIdealSequence( void ) { return m_nIdealSequence; }
bool SetIdealActivity( Activity ideal );
void MaintainIdealActivity( void );
private:
Activity m_Activity;
int m_nIdealSequence;
Activity m_IdealActivity;
bool m_bRemoveable;
int m_iPrimaryAmmoCount;
int m_iSecondaryAmmoCount;
public:
IMPLEMENT_NETWORK_VAR_FOR_DERIVED( m_nNextThinkTick );
int WeaponState() const { return m_iState; }
// Weapon data
CNetworkVar( int, m_iState ); // See WEAPON_* definition
string_t m_iszName; // Classname of this weapon.
CNetworkVar( int, m_iPrimaryAmmoType ); // "primary" ammo index into the ammo info array
CNetworkVar( int, m_iSecondaryAmmoType ); // "secondary" ammo index into the ammo info array
CNetworkVar( int, m_iClip1 ); // number of shots left in the primary weapon clip, -1 it not used
CNetworkVar( int, m_iClip2 ); // number of shots left in the secondary weapon clip, -1 it not used
bool m_bFiresUnderwater; // true if this weapon can fire underwater
bool m_bAltFiresUnderwater; // true if this weapon can fire underwater
float m_fMinRange1; // What's the closest this weapon can be used?
float m_fMinRange2; // What's the closest this weapon can be used?
float m_fMaxRange1; // What's the furthest this weapon can be used?
float m_fMaxRange2; // What's the furthest this weapon can be used?
bool m_bReloadsSingly; // True if this weapon reloads 1 round at a time
float m_fFireDuration; // The amount of time that the weapon has sustained firing
int m_iSubType;
float m_flUnlockTime;
EHANDLE m_hLocker; // Who locked this weapon.
CNetworkVar( bool, m_bFlipViewModel );
IPhysicsConstraint *GetConstraint() { return m_pConstraint; }
private:
WEAPON_FILE_INFO_HANDLE m_hWeaponFileInfo;
IPhysicsConstraint *m_pConstraint;
int m_iAltFireHudHintCount; // How many times has this weapon displayed its alt-fire HUD hint?
int m_iReloadHudHintCount; // How many times has this weapon displayed its reload HUD hint?
bool m_bAltFireHudHintDisplayed; // Have we displayed an alt-fire HUD hint since this weapon was deployed?
bool m_bReloadHudHintDisplayed; // Have we displayed a reload HUD hint since this weapon was deployed?
float m_flHudHintPollTime; // When to poll the weapon again for whether it should display a hud hint.
float m_flHudHintMinDisplayTime; // if the hint is squelched before this, reset my counter so we'll display it again.
// Server only
#if !defined( CLIENT_DLL )
// Outputs
protected:
COutputEvent m_OnPlayerUse; // Fired when the player uses the weapon.
COutputEvent m_OnPlayerPickup; // Fired when the player picks up the weapon.
COutputEvent m_OnNPCPickup; // Fired when an NPC picks up the weapon.
COutputEvent m_OnCacheInteraction; // For awarding lambda cache achievements in HL2 on 360. See .FGD file for details
#else // Client .dll only
bool m_bJustRestored;
// Allow weapons resource to access m_hWeaponFileInfo directly
friend class WeaponsResource;
protected:
int m_iOldState;
#endif // End Client .dll only
};
#endif // COMBATWEAPON_SHARED_H
|