Modified source engine (2017) developed by valve and leaked in 2020. Not for commercial purporses
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.

216 lines
7.2 KiB

5 years ago
//========= 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