summaryrefslogtreecommitdiff
path: root/game/server/tf/tf_projectile_arrow.h
diff options
context:
space:
mode:
authorFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
committerFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
commit3bf9df6b2785fa6d951086978a3e66f49427166a (patch)
tree2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /game/server/tf/tf_projectile_arrow.h
downloadarchived-source-engine-2018-hl2-src-master.tar.xz
archived-source-engine-2018-hl2-src-master.zip
Diffstat (limited to 'game/server/tf/tf_projectile_arrow.h')
-rw-r--r--game/server/tf/tf_projectile_arrow.h216
1 files changed, 216 insertions, 0 deletions
diff --git a/game/server/tf/tf_projectile_arrow.h b/game/server/tf/tf_projectile_arrow.h
new file mode 100644
index 0000000..1769842
--- /dev/null
+++ b/game/server/tf/tf_projectile_arrow.h
@@ -0,0 +1,216 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// TF Arrow Projectile
+//
+//=============================================================================
+#ifndef TF_PROJECTILE_ARROW_H
+#define TF_PROJECTILE_ARROW_H
+#ifdef _WIN32
+#pragma once
+#endif
+
+#include "tf_player.h"
+#include "tf_weaponbase_rocket.h"
+#include "iscorer.h"
+
+class CTFProjectile_Arrow : public CTFBaseRocket, public IScorer
+{
+public:
+
+ DECLARE_CLASS( CTFProjectile_Arrow, CTFBaseRocket );
+ DECLARE_NETWORKCLASS();
+ DECLARE_DATADESC();
+
+ CTFProjectile_Arrow();
+ ~CTFProjectile_Arrow();
+
+ // Creation.
+ static CTFProjectile_Arrow *Create( const Vector &vecOrigin, const QAngle &vecAngles, const float fSpeed, const float fGravity, ProjectileType_t projectileType, CBaseEntity *pOwner = NULL, CBaseEntity *pScorer = NULL );
+ virtual void InitArrow( const QAngle &vecAngles, const float fSpeed, const float fGravity, ProjectileType_t projectileType, CBaseEntity *pOwner = NULL, CBaseEntity *pScorer = NULL );
+ virtual void Spawn();
+ virtual void Precache();
+ virtual int GetWeaponID( void ) const { return m_iWeaponId; }
+ virtual int GetProjectileType ( void ) const OVERRIDE;
+
+ virtual bool StrikeTarget( mstudiobbox_t *pBox, CBaseEntity *pOther );
+ virtual void OnArrowImpact( mstudiobbox_t *pBox, CBaseEntity *pOther, CBaseEntity *pAttacker );
+ virtual bool OnArrowImpactObject( CBaseEntity *pOther );
+ bool PositionArrowOnBone( mstudiobbox_t *pBox, CBaseAnimating *pOtherAnim );
+ void GetBoneAttachmentInfo( mstudiobbox_t *pBox, CBaseAnimating *pOtherAnim, Vector &bonePosition, QAngle &boneAngles, int &boneIndexAttached, int &physicsBoneIndex );
+
+ void ImpactThink( void );
+ void BuildingHealingArrow( CBaseEntity *pOther );
+
+ int GetArrowSkin() const;
+
+ // IScorer interface
+ virtual CBasePlayer *GetScorer( void );
+ virtual CBasePlayer *GetAssistant( void ) { return NULL; }
+
+ void SetScorer( CBaseEntity *pScorer );
+ void SetCritical( bool bCritical ) { m_bCritical = bCritical; }
+
+ virtual float GetDamage();
+ virtual bool CanHeadshot();
+
+ virtual void OnArrowMissAllPlayers( void );
+ virtual void ArrowTouch( CBaseEntity *pOther );
+ virtual void CheckSkyboxImpact( CBaseEntity *pOther );
+ bool CheckRagdollPinned( const Vector &start, const Vector &vel, int boneIndexAttached, int physicsBoneIndex, CBaseEntity *pOther, int iHitGroup, int iVictim );
+ virtual void AdjustDamageDirection( const CTakeDamageInfo &info, Vector &dir, CBaseEntity *pEnt );
+ void ImpactSound( const char *pszSoundName, bool bLoudForAttacker = false );
+ virtual void BreakArrow();
+ virtual void ImpactTeamPlayer( CTFPlayer *pOther ) {}
+
+ void FadeOut( int iTime );
+ void RemoveThink();
+
+ virtual const char * GetTrailParticleName( void );
+ void CreateTrail( void );
+ void RemoveTrail( void );
+
+ virtual void IncrementDeflected( void );
+
+ virtual void Deflected( CBaseEntity *pDeflectedBy, Vector &vecDir );
+
+ virtual bool ShouldNotDetonate( void ) { return true; }
+ bool IsAlight() { return m_bArrowAlight; }
+ void SetArrowAlight( bool bAlight ) { m_bArrowAlight = bAlight; }
+ virtual bool IsDeflectable() OVERRIDE { return true; }
+ void SetPenetrate( bool bPenetrate = false ) { m_bPenetrate = bPenetrate; SetSolidFlags( FSOLID_NOT_SOLID | FSOLID_TRIGGER ); }
+ bool CanPenetrate() const { return m_bPenetrate; }
+ virtual bool IsDestroyable( void ) OVERRIDE { return false; }
+ virtual bool IsBreakable( void ) const { return true; }
+
+ void SetApplyMilkOnHit() { m_bApplyMilkOnHit = true; }
+
+private:
+
+ CBaseHandle m_Scorer;
+
+ float m_flImpactTime;
+ Vector m_vecImpactNormal;
+
+ float m_flTrailLife;
+ EHANDLE m_pTrail;
+
+ bool m_bStruckEnemy;
+
+ CNetworkVar( bool, m_bArrowAlight );
+ CNetworkVar( bool, m_bCritical );
+
+ bool m_bPenetrate;
+
+ CNetworkVar( int, m_iProjectileType );
+ int m_iWeaponId;
+
+ bool m_bFiredWhileZoomed;
+
+protected:
+ CUtlVector< int > m_HitEntities;
+ float m_flInitTime;
+
+ bool m_bApplyMilkOnHit; // For Apothacary's Arrow which can sometimes be special
+};
+
+class CTFProjectile_HealingBolt : public CTFProjectile_Arrow
+{
+public:
+
+ DECLARE_CLASS( CTFProjectile_HealingBolt, CTFProjectile_Arrow );
+ DECLARE_NETWORKCLASS();
+ DECLARE_DATADESC();
+
+ virtual void InitArrow( const QAngle &vecAngles, const float fSpeed, const float fGravity, ProjectileType_t projectileType, CBaseEntity *pOwner = NULL, CBaseEntity *pScorer = NULL ) OVERRIDE;
+
+ virtual bool CanHeadshot() { return false; }
+ virtual void ImpactTeamPlayer( CTFPlayer *pOther );
+
+ virtual float GetCollideWithTeammatesDelay() const { return 0.f; }
+};
+
+class CTFProjectile_GrapplingHook : public CTFProjectile_Arrow
+{
+public:
+
+ DECLARE_CLASS( CTFProjectile_GrapplingHook, CTFProjectile_Arrow );
+ DECLARE_NETWORKCLASS();
+ DECLARE_DATADESC();
+
+ CTFProjectile_GrapplingHook();
+
+ virtual void Spawn() OVERRIDE;
+ virtual void Precache() OVERRIDE;
+ virtual void UpdateOnRemove() OVERRIDE;
+ virtual void InitArrow( const QAngle &vecAngles, const float fSpeed, const float fGravity, ProjectileType_t projectileType, CBaseEntity *pOwner = NULL, CBaseEntity *pScorer = NULL ) OVERRIDE;
+ virtual void OnArrowImpact( mstudiobbox_t *pBox, CBaseEntity *pOther, CBaseEntity *pAttacker ) OVERRIDE;
+ virtual bool OnArrowImpactObject( CBaseEntity *pOther ) OVERRIDE;
+ virtual void OnArrowMissAllPlayers( void ) OVERRIDE {}
+ virtual void CheckSkyboxImpact( CBaseEntity *pOther ) OVERRIDE;
+
+ virtual void BreakArrow() { /*DO NOTHING*/ }
+
+ virtual bool IsDeflectable() OVERRIDE { return false; }
+ virtual bool IsBreakable( void ) const OVERRIDE { return false; }
+
+ virtual float GetDamage() OVERRIDE { return 1.f; }
+ virtual bool CanHeadshot() OVERRIDE { return false; }
+ virtual bool CanCollideWithTeammates() const OVERRIDE { return false; }
+
+ void HookTarget( CBaseEntity *pOther );
+ void HookLatchedThink();
+
+private:
+ void StartImpactFleshSoundLoop();
+ void StopImpactFleshSoundLoop();
+
+ CSoundPatch *m_pImpactFleshSoundLoop;
+};
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+class CTraceFilterCollisionArrows : public CTraceFilterEntitiesOnly
+{
+public:
+ DECLARE_CLASS_NOBASE( CTraceFilterCollisionArrows );
+
+ CTraceFilterCollisionArrows( const IHandleEntity *passentity, const IHandleEntity *passentity2 )
+ : m_pPassEnt(passentity), m_pPassEnt2(passentity2)
+ {
+ }
+
+ virtual bool ShouldHitEntity( IHandleEntity *pHandleEntity, int contentsMask )
+ {
+ if ( !PassServerEntityFilter( pHandleEntity, m_pPassEnt ) )
+ return false;
+ CBaseEntity *pEntity = EntityFromEntityHandle( pHandleEntity );
+ if ( pEntity )
+ {
+ if ( pEntity == m_pPassEnt2 )
+ return false;
+ if ( pEntity->GetCollisionGroup() == TF_COLLISIONGROUP_GRENADES )
+ return false;
+ if ( pEntity->GetCollisionGroup() == TFCOLLISION_GROUP_ROCKETS )
+ return false;
+ if ( pEntity->GetCollisionGroup() == TFCOLLISION_GROUP_ROCKET_BUT_NOT_WITH_OTHER_ROCKETS )
+ return false;
+ if ( pEntity->GetCollisionGroup() == COLLISION_GROUP_DEBRIS )
+ return false;
+ if ( pEntity->GetCollisionGroup() == TFCOLLISION_GROUP_RESPAWNROOMS )
+ return false;
+ if ( pEntity->GetCollisionGroup() == COLLISION_GROUP_NONE )
+ return false;
+
+ return true;
+ }
+
+ return true;
+ }
+
+protected:
+ const IHandleEntity *m_pPassEnt;
+ const IHandleEntity *m_pPassEnt2;
+};
+
+#endif //TF_PROJECTILE_ARROW_H \ No newline at end of file