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/server/hl2/npc_headcrab.h | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'game/server/hl2/npc_headcrab.h')
| -rw-r--r-- | game/server/hl2/npc_headcrab.h | 296 |
1 files changed, 296 insertions, 0 deletions
diff --git a/game/server/hl2/npc_headcrab.h b/game/server/hl2/npc_headcrab.h new file mode 100644 index 0000000..daf79b4 --- /dev/null +++ b/game/server/hl2/npc_headcrab.h @@ -0,0 +1,296 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: Defines the headcrab, a tiny, jumpy alien parasite. +// +//=============================================================================// + +#ifndef NPC_HEADCRAB_H +#define NPC_HEADCRAB_H +#ifdef _WIN32 +#pragma once +#endif + +#include "ai_squadslot.h" +#include "ai_basenpc.h" +#include "soundent.h" + + + +abstract_class CBaseHeadcrab : public CAI_BaseNPC +{ + DECLARE_CLASS( CBaseHeadcrab, CAI_BaseNPC ); + +public: + void Spawn( void ); + void Precache( void ); + void RunTask( const Task_t *pTask ); + void StartTask( const Task_t *pTask ); + + void OnChangeActivity( Activity NewActivity ); + + bool IsFirmlyOnGround(); + void MoveOrigin( const Vector &vecDelta ); + void ThrowAt( const Vector &vecPos ); + void ThrowThink( void ); + virtual void JumpAttack( bool bRandomJump, const Vector &vecPos = vec3_origin, bool bThrown = false ); + void JumpToBurrowHint( CAI_Hint *pHint ); + + bool HasHeadroom(); + void LeapTouch ( CBaseEntity *pOther ); + virtual void TouchDamage( CBaseEntity *pOther ); + bool CorpseGib( const CTakeDamageInfo &info ); + void Touch( CBaseEntity *pOther ); + Vector BodyTarget( const Vector &posSrc, bool bNoisy = true ); + float GetAutoAimRadius(); + void TraceAttack( const CTakeDamageInfo &info, const Vector &vecDir, trace_t *ptr, CDmgAccumulator *pAccumulator ); + void Ignite( float flFlameLifetime, bool bNPCOnly = true, float flSize = 0.0f, bool bCalledByLevelDesigner = false ); + + float MaxYawSpeed( void ); + void GatherConditions( void ); + void PrescheduleThink( void ); + Class_T Classify( void ); + void HandleAnimEvent( animevent_t *pEvent ); + int RangeAttack1Conditions ( float flDot, float flDist ); + int OnTakeDamage_Alive( const CTakeDamageInfo &info ); + void ClampRagdollForce( const Vector &vecForceIn, Vector *vecForceOut ); + void Event_Killed( const CTakeDamageInfo &info ); + void BuildScheduleTestBits( void ); + bool FValidateHintType( CAI_Hint *pHint ); + + bool IsJumping( void ) { return m_bMidJump; } + + virtual void BiteSound( void ) = 0; + virtual void AttackSound( void ) {}; + virtual void ImpactSound( void ) {}; + virtual void TelegraphSound( void ) {}; + + virtual int SelectSchedule( void ); + virtual int SelectFailSchedule( int failedSchedule, int failedTask, AI_TaskFailureCode_t taskFailCode ); + virtual int TranslateSchedule( int scheduleType ); + + virtual float GetReactionDelay( CBaseEntity *pEnemy ) { return 0.0; } + + bool HandleInteraction(int interactionType, void *data, CBaseCombatCharacter* sourceEnt); + + void CrawlFromCanister(); + + virtual bool AllowedToIgnite( void ) { return true; } + + virtual bool CanBeAnEnemyOf( CBaseEntity *pEnemy ); + + bool IsHangingFromCeiling( void ) + { +#ifdef HL2_EPISODIC + return m_bHangingFromCeiling; +#else + return false; +#endif + } + + virtual void PlayerHasIlluminatedNPC( CBasePlayer *pPlayer, float flDot ); + + void DropFromCeiling( void ); + + DEFINE_CUSTOM_AI; + DECLARE_DATADESC(); + +protected: + void HeadcrabInit(); + + void Leap( const Vector &vecVel ); + + void GrabHintNode( CAI_Hint *pHint ); + bool FindBurrow( const Vector &origin, float distance, bool excludeNear ); + bool ValidBurrowPoint( const Vector &point ); + void ClearBurrowPoint( const Vector &origin ); + void Burrow( void ); + void Unburrow( void ); + void SetBurrowed( bool bBurrowed ); + void JumpFromCanister(); + + // Begins the climb from the canister + void BeginClimbFromCanister(); + + void InputBurrow( inputdata_t &inputdata ); + void InputBurrowImmediate( inputdata_t &inputdata ); + void InputUnburrow( inputdata_t &inputdata ); + + void InputStartHangingFromCeiling( inputdata_t &inputdata ); + void InputDropFromCeiling( inputdata_t &inputdata ); + + int CalcDamageInfo( CTakeDamageInfo *pInfo ); + void CreateDust( bool placeDecal = true ); + + // Eliminates roll + pitch potentially in the headcrab at canister jump time + void EliminateRollAndPitch(); + + float InnateRange1MinRange( void ); + float InnateRange1MaxRange( void ); + +protected: + int m_nGibCount; + float m_flTimeDrown; + Vector m_vecCommittedJumpPos; // The position of our enemy when we locked in our jump attack. + + float m_flNextNPCThink; + float m_flIgnoreWorldCollisionTime; + + bool m_bCommittedToJump; // Whether we have 'locked in' to jump at our enemy. + bool m_bCrawlFromCanister; + bool m_bStartBurrowed; + bool m_bBurrowed; + bool m_bHidden; + bool m_bMidJump; + bool m_bAttackFailed; // whether we ran into a wall during a jump. + + float m_flBurrowTime; + int m_nContext; // for FValidateHintType context + int m_nJumpFromCanisterDir; + + bool m_bHangingFromCeiling; + float m_flIlluminatedTime; +}; + + +//========================================================= +//========================================================= +// The ever popular chubby classic headcrab +//========================================================= +//========================================================= +class CHeadcrab : public CBaseHeadcrab +{ + DECLARE_CLASS( CHeadcrab, CBaseHeadcrab ); + +public: + void Precache( void ); + void Spawn( void ); + + float MaxYawSpeed( void ); + Activity NPC_TranslateActivity( Activity eNewActivity ); + + void BiteSound( void ); + void PainSound( const CTakeDamageInfo &info ); + void DeathSound( const CTakeDamageInfo &info ); + void IdleSound( void ); + void AlertSound( void ); + void AttackSound( void ); + void TelegraphSound( void ); +}; + +//========================================================= +//========================================================= +// The spindly, fast headcrab +//========================================================= +//========================================================= +class CFastHeadcrab : public CBaseHeadcrab +{ + DECLARE_DATADESC(); +public: + DECLARE_CLASS( CFastHeadcrab, CBaseHeadcrab ); + + void Precache( void ); + void Spawn( void ); + bool QuerySeeEntity(CBaseEntity *pSightEnt, bool bOnlyHateOrFearIfNPC = false); + + float MaxYawSpeed( void ); + + void PrescheduleThink( void ); + void RunTask( const Task_t *pTask ); + void StartTask( const Task_t *pTask ); + + int SelectSchedule( void ); + int TranslateSchedule( int scheduleType ); + + int m_iRunMode; + float m_flRealGroundSpeed; + float m_flSlowRunTime; + float m_flPauseTime; + Vector m_vecJumpVel; + + void BiteSound( void ); + void PainSound( const CTakeDamageInfo &info ); + void DeathSound( const CTakeDamageInfo &info ); + void IdleSound( void ); + void AlertSound( void ); + void AttackSound( void ); + + enum SquadSlot_t + { + SQUAD_SLOT_ENGAGE1 = LAST_SHARED_SQUADSLOT, + SQUAD_SLOT_ENGAGE2, + SQUAD_SLOT_ENGAGE3, + SQUAD_SLOT_ENGAGE4, + }; + + DEFINE_CUSTOM_AI; +}; + + +//========================================================= +//========================================================= +// Treacherous black headcrab +//========================================================= +//========================================================= +class CBlackHeadcrab : public CBaseHeadcrab +{ + DECLARE_CLASS( CBlackHeadcrab, CBaseHeadcrab ); + +public: + void Eject( const QAngle &vecAngles, float flVelocityScale, CBaseEntity *pEnemy ); + void EjectTouch( CBaseEntity *pOther ); + + // + // CBaseHeadcrab implementation. + // + void TouchDamage( CBaseEntity *pOther ); + void BiteSound( void ); + void AttackSound( void ); + + // + // CAI_BaseNPC implementation. + // + virtual void PrescheduleThink( void ); + virtual void BuildScheduleTestBits( void ); + virtual int SelectSchedule( void ); + virtual int TranslateSchedule( int scheduleType ); + + virtual Activity NPC_TranslateActivity( Activity eNewActivity ); + virtual void HandleAnimEvent( animevent_t *pEvent ); + virtual float MaxYawSpeed( void ); + + virtual int GetSoundInterests( void ) { return (BaseClass::GetSoundInterests() | SOUND_DANGER | SOUND_BULLET_IMPACT); } + + bool IsHeavyDamage( const CTakeDamageInfo &info ); + + virtual void PainSound( const CTakeDamageInfo &info ); + virtual void DeathSound( const CTakeDamageInfo &info ); + virtual void IdleSound( void ); + virtual void AlertSound( void ); + virtual void ImpactSound( void ); + virtual void TelegraphSound( void ); +#if HL2_EPISODIC + virtual bool FInViewCone( CBaseEntity *pEntity ); +#endif + + // + // CBaseEntity implementation. + // + virtual void Precache( void ); + virtual void Spawn( void ); + + DEFINE_CUSTOM_AI; + DECLARE_DATADESC(); + +private: + + + void JumpFlinch( const Vector *pvecAwayFromPos ); + void Panic( float flDuration ); + + bool m_bPanicState; + float m_flPanicStopTime; + float m_flNextHopTime; // Keeps us from hopping too often due to damage. +}; + + +#endif // NPC_HEADCRAB_H |