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/shared/tf/tf_weapon_medigun.h | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'game/shared/tf/tf_weapon_medigun.h')
| -rw-r--r-- | game/shared/tf/tf_weapon_medigun.h | 299 |
1 files changed, 299 insertions, 0 deletions
diff --git a/game/shared/tf/tf_weapon_medigun.h b/game/shared/tf/tf_weapon_medigun.h new file mode 100644 index 0000000..fdc1fc7 --- /dev/null +++ b/game/shared/tf/tf_weapon_medigun.h @@ -0,0 +1,299 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +//============================================================================= + +#ifndef TF_WEAPON_MEDIGUN_H +#define TF_WEAPON_MEDIGUN_H +#ifdef _WIN32 +#pragma once +#endif + +#include "tf_weaponbase_gun.h" + +#if defined( CLIENT_DLL ) +#define CWeaponMedigun C_WeaponMedigun +#define CTFMedigunShield C_TFMedigunShield +#endif + +class CTFMedigunShield; +class CTFReviveMarker; + +enum medigun_weapontypes_t +{ + MEDIGUN_STANDARD = 0, + MEDIGUN_UBER, + MEDIGUN_QUICKFIX, + MEDIGUN_RESIST, +}; + +enum medigun_resist_types_t +{ + MEDIGUN_BULLET_RESIST = 0, + MEDIGUN_BLAST_RESIST, + MEDIGUN_FIRE_RESIST, + MEDIGUN_NUM_RESISTS +}; + +struct MedigunEffects_t +{ + ETFCond eCondition; + ETFCond eWearingOffCondition; + const char *pszChargeOnSound; + const char *pszChargeOffSound; +}; + +extern MedigunEffects_t g_MedigunEffects[MEDIGUN_NUM_CHARGE_TYPES]; + +#define MAX_HEALING_TARGETS 1 //6 + +#define CLEAR_ALL_TARGETS -1 + + + + +//========================================================= +// Beam healing gun +//========================================================= +class CWeaponMedigun : public CTFWeaponBaseGun +{ + DECLARE_CLASS( CWeaponMedigun, CTFWeaponBaseGun ); +public: + DECLARE_NETWORKCLASS(); + DECLARE_PREDICTABLE(); + + CWeaponMedigun( void ); + ~CWeaponMedigun( void ); + + virtual void Precache(); + + virtual bool Deploy( void ); + virtual bool Holster( CBaseCombatWeapon *pSwitchingTo ); + virtual void UpdateOnRemove( void ); + virtual void ItemHolsterFrame( void ); + virtual void ItemPostFrame( void ); + virtual bool Lower( void ); + virtual void PrimaryAttack( void ); + virtual void SecondaryAttack( void ); + virtual void WeaponIdle( void ); + void DrainCharge( void ); + virtual void WeaponReset( void ); + + virtual float GetTargetRange( void ); + virtual float GetStickRange( void ); + virtual float GetHealRate( void ); + virtual bool AppliesModifier( void ) { return true; } + + virtual int GetWeaponID( void ) const { return TF_WEAPON_MEDIGUN; } + int GetMedigunType( void ) const; + + + bool IsReleasingCharge( void ) const; + medigun_charge_types GetChargeType( void ) const; + + void CycleResistType(); + medigun_resist_types_t GetResistType() const; + + CBaseEntity *GetHealTarget( void ) { return IsAttachedToBuilding() ? NULL : m_hHealingTarget.Get(); } + + bool IsAllowedToTargetBuildings( void ); + bool IsAttachedToBuilding( void ); + +#ifdef GAME_DLL + // We may or may not be healing this person still. Resets on WeaponReset + CBaseEntity *GetMostRecentHealTarget( void ) { return m_hLastHealingTarget.Get(); } + void RecalcEffectOnTarget( CTFPlayer *pPlayer, bool bInstantRemove = false ); +#endif + + float GetReleaseStartedAt( void ) { return m_flReleaseStartedAt; } + +#if defined( CLIENT_DLL ) + // Stop all sounds being output. + void StopHealSound( bool bStopHealingSound = true, bool bStopNoTargetSound = true ); + + virtual void OnDataChanged( DataUpdateType_t updateType ); + virtual void ClientThink(); + void UpdateEffects( void ); + void ForceHealingTargetUpdate( void ) { m_bUpdateHealingTargets = true; } + + void StopChargeEffect( bool bImmediately ); + void ManageChargeEffect( void ); + + void UpdateMedicAutoCallers( void ); +#else + + void HealTargetThink( void ); + void AddCharge( float flPercentage ); + void SubtractCharge( float flPercentage ); +#endif + + void SetChargeLevel( float flChargeLevel ) { m_flChargeLevel = flChargeLevel; } + float GetChargeLevel( void ) const { return m_flChargeLevel; } + float GetMinChargeAmount( void ) const; + + virtual void OnControlStunned( void ); + + virtual bool IsHolstered(){ return m_bHolstered; } + + float GetProgress( void ); + const char* GetEffectLabelText( void ) { return "#TF_Rescue"; } + bool EffectMeterShouldFlash( void ); + +private: + void SubtractChargeAndUpdateDeployState( float flSubtractAmount, bool bForceDrain ); + bool FindAndHealTargets( void ); + void MaintainTargetInSlot(); + void FindNewTargetForSlot(); + void RemoveHealingTarget( bool bStopHealingSelf = false ); + bool HealingTarget( CBaseEntity *pTarget ); + bool AllowedToHealTarget( CBaseEntity *pTarget ); + void CheckAchievementsOnHealTarget( void ); + void StartHealingTarget( CBaseEntity *pTarget ); + void StopHealingOwner( void ); + + const char *GetHealSound() const; + +#ifdef GAME_DLL + void UberchargeChunkDeployed(); +#endif + + void CreateMedigunShield( void ); + void RemoveMedigunShield( void ); + +public: + +#ifdef STAGING_ONLY + CTFMedigunShield *GetMedigunShield() const { return m_hMedigunShield; } + bool HasPermanentShield() const; +#endif // STAGING_ONLY + +#ifdef GAME_DLL + CNetworkHandle( CBaseEntity, m_hHealingTarget ); + CHandle< CBaseEntity > m_hLastHealingTarget; +#else + CNetworkHandle( C_BaseEntity, m_hHealingTarget ); +#endif + + bool m_bWasHealingBeforeDeath; + +protected: + // Networked data. + CNetworkVar( bool, m_bHealing ); + CNetworkVar( bool, m_bAttacking ); + + double m_flNextBuzzTime; + float m_flHealEffectLifetime; // Count down until the healing effect goes off. + float m_flReleaseStartedAt; + + CNetworkVar( bool, m_bHolstered ); + CNetworkVar( bool, m_bChargeRelease ); + CNetworkVar( float, m_flChargeLevel ); + CNetworkVar( int, m_nChargeResistType ); + + float m_flNextTargetCheckTime; + bool m_bCanChangeTarget; // used to track the PrimaryAttack key being released for AutoHeal mode + bool m_bAttack2Down; + bool m_bAttack3Down; + bool m_bReloadDown; + float m_flEndResistCharge; + + struct targetdetachtimes_t + { + float flTime; + EHANDLE hTarget; + }; + CUtlVector<targetdetachtimes_t> m_DetachedTargets; // Tracks times we last applied charge to a target. Used to drain faster for more targets. + +#ifdef GAME_DLL + CDamageModifier m_DamageModifier; // This attaches to whoever we're healing. + bool m_bHealingSelf; + int m_nHealTargetClass; + int m_nChargesReleased; +#endif + + CHandle< CTFMedigunShield > m_hMedigunShield; + CHandle< CTFReviveMarker > m_hReviveMarker; + +#ifdef CLIENT_DLL + bool m_bPlayingSound; + bool m_bUpdateHealingTargets; + struct healingtargeteffects_t + { + C_BaseEntity *pOwner; + C_BaseEntity *pTarget; + CNewParticleEffect *pEffect; + CNewParticleEffect *pCustomEffect; + }; + healingtargeteffects_t m_hHealingTargetEffect; + + float m_flDenySecondary; + bool m_bOldChargeRelease; + int m_nOldChargeResistType; + + C_BaseEntity *m_pChargeEffectOwner; + CNewParticleEffect *m_pChargeEffect; + CSoundPatch *m_pChargedSound; + CSoundPatch *m_pDisruptSound; + + CUtlVector< int > m_iAutoCallers; + float m_flAutoCallerCheckTime; +#endif + +private: + CWeaponMedigun( const CWeaponMedigun & ); +}; + +class CTFMedigunShield : public CBaseAnimating +{ + DECLARE_CLASS( CTFMedigunShield, CBaseAnimating ); + +public: + DECLARE_NETWORKCLASS(); + DECLARE_PREDICTABLE(); + DECLARE_DATADESC(); + + CTFMedigunShield(); + ~CTFMedigunShield(); + + virtual void Spawn(); + virtual void Precache(); + virtual bool IsCombatItem( void ) const { return true; } + + void UpdateShieldPosition( void ); + +#ifdef GAME_DLL + virtual void TraceAttack( const CTakeDamageInfo &info, const Vector &vecDir, trace_t *ptr, CDmgAccumulator *pAccumulator ); + virtual int OnTakeDamage( const CTakeDamageInfo &info ); + + static CTFMedigunShield *Create( CTFPlayer *pOwner ); + // virtual bool TestCollision( const Ray_t &ray, unsigned int mask, trace_t& trace ); + virtual bool ShouldCollide( int collisionGroup, int contentsMask ) const; + virtual void StartTouch( CBaseEntity *pOther ) OVERRIDE; + void ShieldTouch( CBaseEntity *pOther ); + virtual void EndTouch( CBaseEntity *pOther ) OVERRIDE; + void ShieldThink( void ); + void RemoveShield( void ); + +#ifdef STAGING_ONLY + void SetPermanentShield( bool bPermanent ) { m_bPermanentShield = bPermanent; } +#endif // STAGING_ONLY + +#else + virtual void ClientThink(); +#endif + +private: + int m_nBlinkCount; +#ifdef GAME_DLL + float m_flShieldEnergyLevel; + CSoundPatch *m_pTouchLoop; + +#ifdef STAGING_ONLY + bool m_bPermanentShield; +#endif // STAGING_ONLY + +#endif // GAME_DLL +}; + +#endif // TF_WEAPON_MEDIGUN_H |