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.
297 lines
8.3 KiB
297 lines
8.3 KiB
![]()
4 years ago
|
//========= 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
|