You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
750 lines
24 KiB
750 lines
24 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Weapons. |
|
// |
|
// CTFWeaponBase |
|
// | |
|
// |--> CTFWeaponBaseMelee |
|
// | | |
|
// | |--> CTFWeaponCrowbar |
|
// | |--> CTFWeaponKnife |
|
// | |--> CTFWeaponMedikit |
|
// | |--> CTFWeaponWrench |
|
// | |
|
// |--> CTFWeaponBaseGrenade |
|
// | | |
|
// | |--> CTFWeapon |
|
// | |--> CTFWeapon |
|
// | |
|
// |--> CTFWeaponBaseGun |
|
// |
|
//============================================================================= |
|
#ifndef TF_WEAPONBASE_H |
|
#define TF_WEAPONBASE_H |
|
#ifdef _WIN32 |
|
#pragma once |
|
#endif |
|
|
|
#include "tf_playeranimstate.h" |
|
#include "tf_weapon_parse.h" |
|
#include "npcevent.h" |
|
#include "ihasowner.h" |
|
#include "tf_item_wearable.h" |
|
|
|
// Client specific. |
|
#if defined( CLIENT_DLL ) |
|
#define CTFWeaponBase C_TFWeaponBase |
|
#define CTFWeaponAttachmentModel C_TFWeaponAttachmentModel |
|
#define CTFWeaponBaseGrenadeProj C_TFWeaponBaseGrenadeProj |
|
#include "tf_fx_muzzleflash.h" |
|
#include "GameEventListener.h" |
|
#endif |
|
|
|
#define MAX_TRACER_NAME 128 |
|
|
|
class CTFPlayer; |
|
class CBaseObject; |
|
class CTFWeaponBaseGrenadeProj; |
|
class CTFWeaponAttachmentModel; |
|
|
|
// Given an ammo type (like from a weapon's GetPrimaryAmmoType()), this compares it |
|
// against the ammo name you specify. |
|
// TFTODO: this should use indexing instead of searching and strcmp()'ing all the time. |
|
bool IsAmmoType( int iAmmoType, const char *pAmmoName ); |
|
void FindHullIntersection( const Vector &vecSrc, trace_t &tr, const Vector &mins, const Vector &maxs, CBaseEntity *pEntity ); |
|
|
|
// Reloading singly. |
|
enum |
|
{ |
|
TF_RELOAD_START = 0, |
|
TF_RELOADING, |
|
TF_RELOADING_CONTINUE, |
|
TF_RELOAD_FINISH |
|
}; |
|
|
|
// structure to encapsulate state of head bob |
|
struct BobState_t |
|
{ |
|
BobState_t() |
|
{ |
|
m_flBobTime = 0; |
|
m_flLastBobTime = 0; |
|
m_flLastSpeed = 0; |
|
m_flVerticalBob = 0; |
|
m_flLateralBob = 0; |
|
} |
|
|
|
float m_flBobTime; |
|
float m_flLastBobTime; |
|
float m_flLastSpeed; |
|
float m_flVerticalBob; |
|
float m_flLateralBob; |
|
}; |
|
|
|
enum EWeaponStrangeType_t |
|
{ |
|
STRANGE_UNKNOWN = -1, |
|
STRANGE_NOT_STRANGE = 0, |
|
STRANGE_IS_STRANGE = 1, |
|
}; |
|
|
|
enum EWeaponStatTrakModuleType_t |
|
{ |
|
MODULE_UNKNOWN = -1, |
|
MODULE_NONE = 0, |
|
MODULE_FOUND = 1, |
|
}; |
|
|
|
#ifdef CLIENT_DLL |
|
float CalcViewModelBobHelper( CBasePlayer *player, BobState_t *pBobState ); |
|
void AddViewModelBobHelper( Vector &origin, QAngle &angles, BobState_t *pBobState ); |
|
#endif |
|
|
|
// Interface for weapons that have a charge time |
|
class ITFChargeUpWeapon |
|
{ |
|
public: |
|
virtual bool CanCharge( void ) = 0; |
|
|
|
virtual float GetChargeBeginTime( void ) = 0; |
|
|
|
virtual float GetChargeMaxTime( void ) = 0; |
|
|
|
virtual float GetCurrentCharge( void ) |
|
{ |
|
return ( gpGlobals->curtime - GetChargeBeginTime() ) / GetChargeMaxTime(); |
|
} |
|
}; |
|
|
|
class CTraceFilterIgnoreTeammates : public CTraceFilterSimple |
|
{ |
|
public: |
|
// It does have a base, but we'll never network anything below here.. |
|
DECLARE_CLASS( CTraceFilterIgnoreTeammates, CTraceFilterSimple ); |
|
|
|
CTraceFilterIgnoreTeammates( const IHandleEntity *passentity, int collisionGroup, int iIgnoreTeam ) |
|
: CTraceFilterSimple( passentity, collisionGroup ), m_iIgnoreTeam( iIgnoreTeam ) |
|
{ |
|
} |
|
|
|
virtual bool ShouldHitEntity( IHandleEntity *pServerEntity, int contentsMask ) |
|
{ |
|
CBaseEntity *pEntity = EntityFromEntityHandle( pServerEntity ); |
|
|
|
if ( ( pEntity->IsPlayer() || pEntity->IsCombatItem() ) && ( pEntity->GetTeamNumber() == m_iIgnoreTeam || m_iIgnoreTeam == TEAM_ANY ) ) |
|
{ |
|
return false; |
|
} |
|
|
|
return BaseClass::ShouldHitEntity( pServerEntity, contentsMask ); |
|
} |
|
|
|
int m_iIgnoreTeam; |
|
}; |
|
|
|
class CTraceFilterIgnorePlayers : public CTraceFilterSimple |
|
{ |
|
public: |
|
// It does have a base, but we'll never network anything below here.. |
|
DECLARE_CLASS( CTraceFilterIgnorePlayers, CTraceFilterSimple ); |
|
|
|
CTraceFilterIgnorePlayers( const IHandleEntity *passentity, int collisionGroup ) |
|
: CTraceFilterSimple( passentity, collisionGroup ) |
|
{ |
|
} |
|
|
|
virtual bool ShouldHitEntity( IHandleEntity *pServerEntity, int contentsMask ) |
|
{ |
|
CBaseEntity *pEntity = EntityFromEntityHandle( pServerEntity ); |
|
if ( pEntity && pEntity->IsPlayer() ) |
|
return false; |
|
|
|
return BaseClass::ShouldHitEntity( pServerEntity, contentsMask ); |
|
} |
|
}; |
|
|
|
class CTraceFilterIgnoreFriendlyCombatItems : public CTraceFilterSimple |
|
{ |
|
public: |
|
DECLARE_CLASS( CTraceFilterIgnoreFriendlyCombatItems, CTraceFilterSimple ); |
|
|
|
CTraceFilterIgnoreFriendlyCombatItems( const IHandleEntity *passentity, int collisionGroup, int iIgnoreTeam, bool bIsProjectile = false ) |
|
: CTraceFilterSimple( passentity, collisionGroup ), m_iIgnoreTeam( iIgnoreTeam ) |
|
{ |
|
m_bCallerIsProjectile = bIsProjectile; |
|
} |
|
|
|
virtual bool ShouldHitEntity( IHandleEntity *pServerEntity, int contentsMask ) |
|
{ |
|
CBaseEntity *pEntity = EntityFromEntityHandle( pServerEntity ); |
|
|
|
// if ( ( pEntity->MyCombatCharacterPointer() || pEntity->MyCombatWeaponPointer() ) && pEntity->GetTeamNumber() == m_iIgnoreTeam ) |
|
// return false; |
|
// |
|
// if ( pEntity->IsPlayer() && pEntity->GetTeamNumber() == m_iIgnoreTeam ) |
|
// return false; |
|
|
|
if ( pEntity->IsCombatItem() ) |
|
{ |
|
if ( pEntity->GetTeamNumber() == m_iIgnoreTeam ) |
|
return false; |
|
|
|
// If source is a enemy projectile, be explicit, otherwise we fail a "IsTransparent" test downstream |
|
if ( m_bCallerIsProjectile ) |
|
return true; |
|
} |
|
|
|
return BaseClass::ShouldHitEntity( pServerEntity, contentsMask ); |
|
} |
|
|
|
int m_iIgnoreTeam; |
|
bool m_bCallerIsProjectile; |
|
}; |
|
|
|
#define ENERGY_WEAPON_MAX_CHARGE 20 |
|
|
|
#define TF_PARTICLE_WEAPON_BLUE_1 Vector( 0.345, 0.52, 0.635 ) |
|
#define TF_PARTICLE_WEAPON_BLUE_2 Vector( 0.145, 0.427, 0.55 ) |
|
#define TF_PARTICLE_WEAPON_RED_1 Vector( 0.72, 0.22, 0.23 ) |
|
#define TF_PARTICLE_WEAPON_RED_2 Vector( 0.5, 0.18, 0.125 ) |
|
|
|
//============================================================================= |
|
// |
|
// Base TF Weapon Class |
|
// |
|
#if defined( CLIENT_DLL ) |
|
class CTFWeaponBase : public CBaseCombatWeapon, public IHasOwner, public CGameEventListener |
|
#else |
|
class CTFWeaponBase : public CBaseCombatWeapon, public IHasOwner |
|
#endif |
|
{ |
|
DECLARE_CLASS( CTFWeaponBase, CBaseCombatWeapon ); |
|
DECLARE_NETWORKCLASS(); |
|
DECLARE_PREDICTABLE(); |
|
#if !defined ( CLIENT_DLL ) |
|
DECLARE_DATADESC(); |
|
#endif |
|
|
|
// Setup. |
|
CTFWeaponBase(); |
|
~CTFWeaponBase(); |
|
|
|
virtual void Spawn(); |
|
virtual void Activate( void ); |
|
virtual void Precache(); |
|
virtual bool IsPredicted() const { return true; } |
|
virtual void FallInit( void ); |
|
|
|
// Weapon Data. |
|
CTFWeaponInfo const &GetTFWpnData() const; |
|
virtual int GetWeaponID( void ) const; |
|
bool IsWeapon( int iWeapon ) const; |
|
virtual int GetDamageType() const { return g_aWeaponDamageTypes[ GetWeaponID() ]; } |
|
virtual int GetCustomDamageType() const { return TF_DMG_CUSTOM_NONE; } |
|
virtual int GetMaxClip1( void ) const; |
|
virtual int GetDefaultClip1( void ) const; |
|
virtual bool UsesPrimaryAmmo(); |
|
virtual float UberChargeAmmoPerShot( void ) { float fAmmo = 0; CALL_ATTRIB_HOOK_FLOAT( fAmmo, ubercharge_ammo ); return fAmmo * 0.01f; } |
|
|
|
virtual int Clip1() { return IsEnergyWeapon() ? Energy_GetEnergy() : m_iClip1; } |
|
virtual int Clip2() { return m_iClip2; } |
|
|
|
virtual bool HasAmmo( void ); |
|
|
|
// View model. |
|
virtual const char *GetViewModel( int iViewModel = 0 ) const; |
|
virtual const char *GetWorldModel( void ) const; |
|
|
|
virtual bool SendWeaponAnim( int iActivity ) OVERRIDE; |
|
|
|
virtual CBaseEntity *GetOwnerViaInterface( void ) { return GetOwner(); } |
|
|
|
virtual void Equip( CBaseCombatCharacter *pOwner ); |
|
virtual void Drop( const Vector &vecVelocity ); |
|
virtual void UpdateOnRemove( void ); |
|
virtual bool CanHolster( void ) const; |
|
virtual bool Holster( CBaseCombatWeapon *pSwitchingTo = NULL ); |
|
virtual bool Deploy( void ); |
|
virtual bool ForceWeaponSwitch() const OVERRIDE; |
|
virtual void Detach( void ); |
|
virtual void OnActiveStateChanged( int iOldState ); |
|
virtual bool OwnerCanJump( void ) { return true; } |
|
virtual bool VisibleInWeaponSelection( void ); |
|
virtual void UpdateHands( void ); |
|
|
|
virtual bool OwnerCanTaunt( void ) { return true; } |
|
virtual bool CanBeCritBoosted( void ); |
|
bool CanHaveRevengeCrits( void ); |
|
|
|
// Extra wearables. |
|
#ifdef GAME_DLL |
|
virtual void ChangeTeam( int iTeamNum ) OVERRIDE; |
|
virtual void UpdateExtraWearables(); |
|
virtual void ExtraWearableEquipped( CTFWearable *pExtraWearableItem ); |
|
virtual void ExtraWearableViewModelEquipped( CTFWearable *pExtraWearableItem ); |
|
virtual bool HideAttachmentsAndShowBodygroupsWhenPerformingWeaponIndependentTaunt() const { return true; } |
|
#endif // GAME_DLL |
|
virtual void RemoveExtraWearables( void ); |
|
|
|
// Attacks. |
|
virtual void Misfire( void ); |
|
virtual void FireFullClipAtOnce( void ); |
|
virtual void PrimaryAttack(); |
|
virtual void SecondaryAttack(); |
|
void CalcIsAttackCritical( void ); |
|
virtual bool CalcIsAttackCriticalHelper(); |
|
virtual bool CalcIsAttackCriticalHelperNoCrits(); |
|
bool IsCurrentAttackACrit() const { return m_bCurrentAttackIsCrit; } |
|
bool IsCurrentAttackARandomCrit() const { return m_bCurrentAttackIsCrit && m_bCurrentCritIsRandom; } |
|
bool IsCurrentAttackDuringDemoCharge() const { return m_bCurrentAttackIsDuringDemoCharge; } |
|
virtual ETFDmgCustom GetPenetrateType() const; |
|
virtual void GetProjectileFireSetup( CTFPlayer *pPlayer, Vector vecOffset, Vector *vecSrc, QAngle *angForward, bool bHitTeammates = true, float flEndDist = 2000.f ); |
|
virtual QAngle GetSpreadAngles( void ); |
|
float GetLastPrimaryAttackTime( void ) const { return m_flLastPrimaryAttackTime; } |
|
virtual bool CanPerformSecondaryAttack() const OVERRIDE; |
|
virtual bool IsFiring( void ) const { return false; } |
|
virtual bool AreRandomCritsEnabled( void ); |
|
|
|
// Reloads. |
|
virtual bool Reload( void ); |
|
virtual void AbortReload( void ); |
|
virtual bool DefaultReload( int iClipSize1, int iClipSize2, int iActivity ); |
|
void SendReloadEvents(); |
|
virtual bool IsReloading() const; // is the weapon reloading right now? |
|
|
|
virtual bool AutoFiresFullClip( void ) const OVERRIDE; |
|
bool AutoFiresFullClipAllAtOnce( void ) const; |
|
bool CanOverload( void ) const; |
|
virtual bool CheckReloadMisfire( void ) { return false; } |
|
|
|
virtual bool CanDrop( void ) { return false; } |
|
virtual bool AllowTaunts( void ) { return true; } |
|
|
|
// Fire Rate |
|
float ApplyFireDelay( float flDelay ) const; |
|
|
|
// Sound. |
|
bool PlayEmptySound(); |
|
bool IsSilentKiller(); |
|
|
|
// Activities. |
|
virtual void ItemBusyFrame( void ); |
|
virtual void ItemPostFrame( void ); |
|
virtual void ItemHolsterFrame( void ); |
|
|
|
virtual void SetWeaponVisible( bool visible ); |
|
|
|
virtual int GetActivityWeaponRole() const; |
|
virtual acttable_t *ActivityList( int &iActivityCount ) OVERRIDE; |
|
|
|
virtual Activity TranslateViewmodelHandActivityInternal( Activity actBase ); |
|
virtual int GetViewModelWeaponRole() { return GetTFWpnData().m_iWeaponType; } |
|
|
|
#ifdef GAME_DLL |
|
virtual void AddAssociatedObject( CBaseObject *pObject ) { } |
|
virtual void RemoveAssociatedObject( CBaseObject *pObject ) { } |
|
|
|
virtual void ApplyOnHitAttributes( CBaseEntity *pVictimBaseEntity, CTFPlayer *pAttacker, const CTakeDamageInfo &info ); |
|
virtual void ApplyPostHitEffects( const CTakeDamageInfo &inputInfo, CTFPlayer *pPlayer ); |
|
virtual void ApplyOnInjuredAttributes( CTFPlayer *pVictim, CTFPlayer *pAttacker, const CTakeDamageInfo &info ); // when owner of this weapon is hit |
|
|
|
virtual void Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ); |
|
|
|
virtual bool DeflectProjectiles(); |
|
virtual bool DeflectPlayer( CTFPlayer *pTarget, CTFPlayer *pOwner, Vector &vecForward, Vector &vecCenter, Vector &vecSize ); |
|
virtual bool DeflectEntity( CBaseEntity *pTarget, CTFPlayer *pOwner, Vector &vecForward, Vector &vecCenter, Vector &vecSize ); |
|
static void SendObjectDeflectedEvent( CTFPlayer *pNewOwner, CTFPlayer *pPrevOwner, int iWeaponID, CBaseAnimating *pObject ); |
|
static float DeflectionForce( const Vector &size, float damage, float scale ); |
|
virtual void PlayDeflectionSound( bool bPlayer ) {} |
|
virtual Vector GetDeflectionSize() { return Vector( 128, 128, 64 ); } |
|
|
|
virtual float GetJarateTime() { return 0.f; } |
|
|
|
void ApplyItemRegen( void ); |
|
|
|
kill_eater_event_t GetKillEaterKillEventType() const; |
|
#endif |
|
|
|
// Utility. |
|
CBasePlayer *GetPlayerOwner() const; |
|
CTFPlayer *GetTFPlayerOwner() const; |
|
|
|
#ifdef CLIENT_DLL |
|
virtual bool ShouldPlayClientReloadSound() { return false; } |
|
|
|
C_BaseEntity *GetWeaponForEffect(); |
|
|
|
virtual const char* ModifyEventParticles( const char* token ) { return token; } |
|
|
|
// Shadows |
|
virtual ShadowType_t ShadowCastType( void ) OVERRIDE; |
|
#endif |
|
|
|
virtual bool CanAttack(); |
|
virtual int GetCanAttackFlags() const { return TF_CAN_ATTACK_FLAG_NONE; } |
|
|
|
// Raising & Lowering for grenade throws |
|
bool WeaponShouldBeLowered( void ); |
|
virtual bool Ready( void ); |
|
virtual bool Lower( void ); |
|
|
|
virtual void WeaponIdle( void ); |
|
|
|
virtual void WeaponReset( void ); |
|
virtual void WeaponRegenerate( void ); |
|
|
|
// Muzzleflashes |
|
virtual const char *GetMuzzleFlashEffectName_3rd( void ) { return NULL; } |
|
virtual const char *GetMuzzleFlashEffectName_1st( void ) { return NULL; } |
|
virtual const char *GetMuzzleFlashModel( void ); |
|
virtual float GetMuzzleFlashModelLifetime( void ); |
|
virtual const char *GetMuzzleFlashParticleEffect( void ); |
|
|
|
virtual const char *GetTracerType( void ); |
|
|
|
virtual void Operator_HandleAnimEvent( animevent_t *pEvent, CBaseCombatCharacter *pOperator ); |
|
|
|
// CEconEntity |
|
virtual const char *GetInventoryModel( void ); |
|
virtual void ReapplyProvision( void ); |
|
virtual float GetSpeedMod( void ) { return 1.f; }; |
|
|
|
virtual bool CanFireCriticalShot( bool bIsHeadshot = false ); |
|
virtual bool CanFireRandomCriticalShot( float flCritChance ); |
|
|
|
virtual char const *GetShootSound( int iIndex ) const; |
|
void UpdateHiddenParentBodygroup( bool bHide ); |
|
|
|
virtual void OnControlStunned( void ); |
|
|
|
virtual bool HideWhileStunned( void ) { return true; } |
|
|
|
virtual bool IsViewModelFlipped( void ); |
|
|
|
virtual int GetMaxHealthMod() { return 0; } |
|
|
|
virtual float GetLastDeployTime( void ) { return m_flLastDeployTime; } |
|
|
|
// Energy Weapons |
|
virtual bool IsEnergyWeapon( void ) const { return false; } |
|
virtual bool IsBlastImpactWeapon( void ) const { return false; } |
|
float Energy_GetMaxEnergy( void ) const; |
|
float Energy_GetEnergy( void ) const { return m_flEnergy; } |
|
void Energy_SetEnergy( float flEnergy ) { m_flEnergy = flEnergy; } |
|
bool Energy_FullyCharged( void ) const; |
|
bool Energy_HasEnergy( void ); |
|
void Energy_DrainEnergy( void ); |
|
void Energy_DrainEnergy( float flDrain ); |
|
bool Energy_Recharge( void ); |
|
virtual float Energy_GetShotCost( void ) const { return 4.f; } |
|
virtual float Energy_GetRechargeCost( void ) const { return 4.f; } |
|
|
|
virtual Vector GetParticleColor( int iColor ); |
|
|
|
virtual void CheckReload( void ); |
|
virtual void FinishReload( void ); |
|
|
|
virtual bool HasLastShotCritical( void ) { return false; } |
|
|
|
virtual bool UseServerRandomSeed( void ) const { return true; } |
|
|
|
// Server specific. |
|
#if !defined( CLIENT_DLL ) |
|
|
|
// Spawning. |
|
virtual void CheckRespawn(); |
|
virtual CBaseEntity* Respawn(); |
|
void Materialize(); |
|
void AttemptToMaterialize(); |
|
|
|
// Death. |
|
void Die( void ); |
|
void SetDieThink( bool bDie ); |
|
|
|
// Disguise weapon. |
|
void DisguiseWeaponThink( void ); |
|
|
|
// Ammo. |
|
virtual const Vector& GetBulletSpread(); |
|
|
|
// Hit tracking for achievements |
|
// Track the number of kills we've had since we missed. Only works for bullet firing weapons right now. |
|
virtual void OnBulletFire( int iEnemyPlayersHit ); |
|
virtual void OnPlayerKill( CTFPlayer *pVictim, const CTakeDamageInfo &info ); |
|
virtual float GetLastHitTime( void ) { return m_flLastHitTime; } |
|
|
|
virtual int GetDropSkinOverride( void ) { return -1; } |
|
|
|
int GetKillStreak () const { return m_iKillStreak; } |
|
void SetKillStreak ( int value ) { m_iKillStreak = value; }; |
|
|
|
float GetClipScale () const { return m_flClipScale; } |
|
void SetClipScale ( float flScale ) { m_flClipScale = flScale; } |
|
// Client specific. |
|
#else |
|
|
|
bool IsFirstPersonView(); |
|
bool UsingViewModel(); |
|
C_BaseAnimating *GetAppropriateWorldOrViewModel(); |
|
|
|
virtual bool ShouldDraw( void ) OVERRIDE; |
|
virtual void UpdateVisibility( void ) OVERRIDE; |
|
|
|
virtual void ProcessMuzzleFlashEvent( void ); |
|
virtual void DispatchMuzzleFlash( const char* effectName, C_BaseEntity* pAttachEnt ); |
|
virtual int InternalDrawModel( int flags ); |
|
|
|
virtual bool ShouldPredict(); |
|
virtual void PostDataUpdate( DataUpdateType_t updateType ); |
|
virtual void OnDataChanged( DataUpdateType_t type ); |
|
virtual void OnPreDataChanged( DataUpdateType_t updateType ); |
|
virtual int GetWorldModelIndex( void ); |
|
virtual bool ShouldDrawCrosshair( void ); |
|
virtual void Redraw( void ); |
|
virtual void FireGameEvent( IGameEvent *event ); |
|
|
|
virtual void AddViewmodelBob( CBaseViewModel *viewmodel, Vector &origin, QAngle &angles ); |
|
virtual float CalcViewmodelBob( void ); |
|
BobState_t *GetBobState(); |
|
virtual bool AttachmentModelsShouldBeVisible( void ) OVERRIDE { return (m_iState == WEAPON_IS_ACTIVE) && !IsBeingRepurposedForTaunt(); } |
|
|
|
virtual bool ShouldEjectBrass() { return true; } |
|
|
|
bool OnFireEvent( C_BaseViewModel *pViewModel, const Vector& origin, const QAngle& angles, int event, const char *options ); |
|
|
|
// ItemEffect Hud defaults |
|
virtual const char * GetEffectLabelText() { return ""; } |
|
virtual float GetProgress() { return 0; } |
|
|
|
// Model muzzleflashes |
|
CHandle<C_MuzzleFlashModel> m_hMuzzleFlashModel[2]; |
|
|
|
bool IsUsingOverrideModel() const { return m_iWorldModelIndex != m_iCachedModelIndex; } |
|
|
|
#endif |
|
|
|
virtual int GetSkin(); |
|
|
|
static void UpdateWeaponBodyGroups( CTFPlayer* pPlayer, bool bHandleDeployedBodygroups ); |
|
void SetIsBeingRepurposedForTaunt( bool bCanOverride ) { m_bBeingRepurposedForTaunt = bCanOverride; } |
|
bool IsBeingRepurposedForTaunt() const { return m_bBeingRepurposedForTaunt; } |
|
|
|
int GetKillComboClass( void ) const { return m_nKillComboClass; } |
|
int GetKillComboCount( void ) const { return m_nKillComboCount; } |
|
void ClearKillComboCount( void ) { m_nKillComboCount = 0; } |
|
void AddKillCombo( int nClassKilled ) |
|
{ |
|
if ( m_nKillComboClass != nClassKilled ) |
|
{ |
|
m_nKillComboClass = nClassKilled; |
|
ClearKillComboCount(); |
|
} |
|
|
|
m_nKillComboCount = Min( 3, m_nKillComboCount + 1 ); |
|
} |
|
|
|
// Effect / Regeneration bar handling |
|
virtual float GetEffectBarProgress( void ); // Get the current bar state (will return a value from 0.0 to 1.0) |
|
bool HasEffectBarRegeneration( void ) { return InternalGetEffectBarRechargeTime() > 0; } // Check the base, not modified by attribute, because attrib may have reduced it to 0. |
|
float GetEffectBarRechargeTime( void ) { float flTime = InternalGetEffectBarRechargeTime(); CALL_ATTRIB_HOOK_FLOAT( flTime, effectbar_recharge_rate ); return flTime; } |
|
void DecrementBarRegenTime( float flTime ) { m_flEffectBarRegenTime -= flTime; } |
|
|
|
bool IsHonorBound( void ) const; |
|
|
|
virtual bool CanPickupOtherWeapon() const { return true; } |
|
|
|
EWeaponStrangeType_t GetStrangeType(); |
|
bool BHasStatTrakModule(); |
|
#ifdef CLIENT_DLL |
|
// StatTrak View Model Test |
|
void UpdateAllViewmodelAddons( void ); |
|
|
|
void AddStatTrakModel( CEconItemView *pItem, int nStatTrakType, AccountID_t holderAcctId ); |
|
void RemoveViewmodelStatTrak( void ); |
|
void RemoveWorldmodelStatTrak( void ); |
|
|
|
CHandle< CTFWeaponAttachmentModel > m_viewmodelStatTrakAddon; |
|
CHandle< CTFWeaponAttachmentModel > m_worldmodelStatTrakAddon; |
|
|
|
virtual const Vector& GetViewmodelOffset() OVERRIDE; |
|
#endif |
|
|
|
virtual bool ShouldRemoveInvisibilityOnPrimaryAttack() const { return true; } |
|
|
|
protected: |
|
virtual int GetEffectBarAmmo( void ) { return m_iPrimaryAmmoType; } |
|
virtual float InternalGetEffectBarRechargeTime( void ) { return 0; } // Time it takes for this regeneration bar to fully recharge from 0 to full. |
|
|
|
void StartEffectBarRegen( void ); // Call this when you want your bar to start recharging (usually when you've deployed your action) |
|
void EffectBarRegenFinished( void ); |
|
void CheckEffectBarRegen( void ); |
|
|
|
private: |
|
CNetworkVar( float, m_flEffectBarRegenTime ); // The time Regen is scheduled to complete |
|
|
|
protected: |
|
#ifdef CLIENT_DLL |
|
virtual void CreateMuzzleFlashEffects( C_BaseEntity *pAttachEnt, int nIndex ); |
|
|
|
virtual void UpdateExtraWearablesVisibility(); |
|
#endif // CLIENT_DLL |
|
|
|
// Reloads. |
|
void UpdateReloadTimers( bool bStart ); |
|
void SetReloadTimer( float flReloadTime ); |
|
bool ReloadSingly( void ); |
|
void ReloadSinglyPostFrame( void ); |
|
void IncrementAmmo( void ); |
|
|
|
bool NeedsReloadForAmmo1( int iClipSize1 ) const; |
|
bool NeedsReloadForAmmo2( int iClipSize2 ) const; |
|
|
|
protected: |
|
|
|
void PlayUpgradedShootSound( const char *pszSound ); |
|
|
|
int m_iWeaponMode; |
|
CNetworkVar( int, m_iReloadMode ); |
|
CNetworkVar( float, m_flReloadPriorNextFire ); |
|
CTFWeaponInfo *m_pWeaponInfo; |
|
bool m_bInAttack; |
|
bool m_bInAttack2; |
|
bool m_bCurrentAttackIsCrit; |
|
bool m_bCurrentCritIsRandom; |
|
bool m_bCurrentAttackIsDuringDemoCharge; |
|
|
|
EWeaponStrangeType_t m_eStrangeType; |
|
EWeaponStatTrakModuleType_t m_eStatTrakModuleType; |
|
|
|
CNetworkVar( bool, m_bLowered ); |
|
|
|
int m_iAltFireHint; |
|
|
|
int m_iReloadStartClipAmount; |
|
|
|
float m_flCritTime; |
|
CNetworkVar( float, m_flLastCritCheckTime ); // Deprecated |
|
int m_iLastCritCheckFrame; |
|
int m_iCurrentSeed; |
|
float m_flLastRapidFireCritCheckTime; |
|
|
|
float m_flLastDeployTime; |
|
|
|
char m_szTracerName[MAX_TRACER_NAME]; |
|
|
|
CNetworkVar( bool, m_bResetParity ); |
|
|
|
int m_iAmmoToAdd; |
|
float m_flLastPrimaryAttackTime; |
|
|
|
#ifdef GAME_DLL |
|
// Stores the number of kills we've made since we last shot & didn't hit a player. |
|
// Only hooked up to bullet firing right now, so you'll need to do plumbing if you want it for other weaponry. |
|
int m_iConsecutiveKills; |
|
|
|
// Accuracy tracking |
|
float m_flLastHitTime; |
|
int m_iHitsInTime; |
|
int m_iFiredInTime; |
|
|
|
// Used to generate active-weapon-only regen |
|
float m_flRegenTime; |
|
|
|
// for penetrating weapons with drain - only drain each victim once |
|
CHandle< CTFPlayer > m_hLastDrainVictim; |
|
CountdownTimer m_lastDrainVictimTimer; |
|
|
|
int m_iKillStreak; |
|
float m_flClipScale; |
|
#endif |
|
|
|
#ifdef CLIENT_DLL |
|
bool m_bOldResetParity; |
|
int m_iCachedModelIndex; |
|
int m_iEjectBrassAttachpoint; |
|
|
|
#endif |
|
|
|
CNetworkVar( bool, m_bReloadedThroughAnimEvent ); |
|
|
|
CNetworkVar( float, m_flEnergy ); |
|
|
|
public: |
|
CNetworkVar( bool, m_bDisguiseWeapon ); |
|
|
|
CNetworkVar( float, m_flLastFireTime ); |
|
|
|
CNetworkHandle( CTFWearable, m_hExtraWearable ); |
|
CNetworkHandle( CTFWearable, m_hExtraWearableViewModel ); |
|
|
|
CNetworkVar( float, m_flObservedCritChance ); |
|
|
|
virtual bool CanInspect() const; |
|
void HandleInspect(); |
|
|
|
enum TFWeaponInspectStage |
|
{ |
|
INSPECT_INVALID = -1, |
|
INSPECT_START, |
|
INSPECT_IDLE, |
|
INSPECT_END, |
|
|
|
INSPECT_STAGE_COUNT |
|
}; |
|
TFWeaponInspectStage GetInspectStage() const { return (TFWeaponInspectStage)m_nInspectStage.Get(); } |
|
float GetInspectAnimTime() const { return m_flInspectAnimTime; } |
|
|
|
private: |
|
CTFWeaponBase( const CTFWeaponBase & ); |
|
|
|
CNetworkVar( bool, m_bBeingRepurposedForTaunt ); |
|
|
|
CNetworkVar( int, m_nKillComboClass ); |
|
CNetworkVar( int, m_nKillComboCount ); |
|
|
|
int GetInspectActivity( TFWeaponInspectStage inspectStage ); |
|
bool IsInspectActivity( int iActivity ); |
|
CNetworkVar( float, m_flInspectAnimTime ); |
|
CNetworkVar( int, m_nInspectStage ); |
|
bool m_bInspecting; |
|
|
|
friend class CTFDroppedWeapon; |
|
|
|
#ifdef CLIENT_DLL |
|
bool m_bInitViewmodelOffset; |
|
Vector m_vecViewmodelOffset; |
|
#endif // CLIENT_DLL |
|
}; |
|
|
|
bool WeaponID_IsSniperRifle( int iWeaponID ); |
|
bool WeaponID_IsSniperRifleOrBow( int iWeaponID ); |
|
|
|
#define WEAPON_RANDOM_RANGE 10000 |
|
|
|
#ifdef CLIENT_DLL |
|
//----------------------------------------------------------------------------- |
|
// CTFWeaponAttachmentModel |
|
//----------------------------------------------------------------------------- |
|
class CTFWeaponAttachmentModel : public CBaseAnimating, public IHasOwner |
|
{ |
|
DECLARE_CLASS( CTFWeaponAttachmentModel, CBaseAnimating ); |
|
public: |
|
CTFWeaponAttachmentModel() { m_bIsViewModelAttachment = false; m_hWeaponAssociatedWith = NULL; } |
|
|
|
virtual bool ShouldDraw( void ); |
|
|
|
void Init( CBaseEntity *pParent, CTFWeaponBase *pAssociatedWeapon, bool bIsViewModel ); |
|
void SetWeaponAssociatedWith( CTFWeaponBase *pWeapon ) { m_hWeaponAssociatedWith = pWeapon; } |
|
CBaseEntity* GetWeaponAssociatedWith( void ) const { return m_hWeaponAssociatedWith.Get(); } |
|
|
|
bool BIsViewModelAttachment() { return m_bIsViewModelAttachment; } |
|
|
|
virtual CBaseEntity *GetOwnerViaInterface( void ) OVERRIDE { return m_hWeaponAssociatedWith.Get() ? m_hWeaponAssociatedWith.Get()->GetOwner() : NULL; } |
|
private: |
|
|
|
bool m_bIsViewModelAttachment; |
|
CHandle< CTFWeaponBase > m_hWeaponAssociatedWith; |
|
}; |
|
#endif // CLIENT_DLL |
|
|
|
#endif // TF_WEAPONBASE_H
|
|
|