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.
296 lines
8.3 KiB
296 lines
8.3 KiB
//========= 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
|
|
|