mirror of
https://github.com/Gigaslav/HL2Overcharged.git
synced 2026-09-04 11:44:45 +03:00
324 lines
8.9 KiB
C++
324 lines
8.9 KiB
C++
//=================== Half-Life 2: Short Stories Mod 2009 =====================//
|
|
//
|
|
// Purpose: Alien Controllers from HL1 now in updated form
|
|
//
|
|
//=============================================================================//
|
|
|
|
|
|
#ifndef NPC_ALIENCONTROLLER
|
|
#define NPC_ALIENCONTROLLER
|
|
|
|
#include "cbase.h"
|
|
#include "npc_talker.h"
|
|
#include "ai_basenpc.h"
|
|
#include "IEffects.h"
|
|
#include "sprite.h"
|
|
//#include "ai_basenpc_physicsflyer.h"
|
|
#include "ai_basenpc.h"
|
|
#include "ai_basenpc.h"
|
|
#include "ai_behavior.h"
|
|
#include "ai_behavior_lead.h"
|
|
#include "ai_behavior_standoff.h"
|
|
#include "ai_behavior_assault.h"
|
|
|
|
//#define CONTROLLER_PATH_FINDING_DEBUG_MESSAGES
|
|
//#define CONTROLLER_MOVE_DEBUG_MESSAGES 1
|
|
#define HLSS_CONTROLLER_TELEKINESIS 1 // Light Kill : Enable telekinesis for Alien Controller
|
|
//----------------------------------------------------------------
|
|
// PHYS OBJECTS
|
|
//----------------------------------------------------------------
|
|
|
|
#define ALIENCONTROLLER_MAX_PHYSOBJ_MASS 490
|
|
#define ALIENCONTROLLER_MIN_PHYSOBJ_MASS 30
|
|
#define ALIENCONTROLLER_PLAYER_MAX_SWAT_DIST 1536
|
|
#define ALIENCONTROLLER_PHYSOBJ_PULLDIST 1024
|
|
#define ALIENCONTROLLER_PHYSOBJ_MOVE_TO_DIST 900
|
|
#define ALIENCONTROLLER_SWAT_DELAY 5
|
|
#define ALIENCONTROLLER_FARTHEST_PHYSICS_OBJECT 1024 //40.0*12.0 //40.0*12.0
|
|
#define ALIENCONTROLLER_PHYSICS_SEARCH_DEPTH 100
|
|
|
|
#define ALIENCONTROLLER_CATCH_DISTANCE 48
|
|
#define ALIENCONTROLLER_MOVE_UP_DISTANCE 24
|
|
#define ALIENCONTROLLER_PULL_VELOCITY_MOD 0.1f
|
|
#define ALIENCONTROLLER_PULL_ANGULARIMP_MOD 0.8f
|
|
#define ALIENCONTROLLER_PULL_TO_GUN_VEL_MOD 2.0f
|
|
|
|
#define ALIENCONTROLLER_CANCEL_OBJECT 20
|
|
|
|
//----------------------------------------------------------------
|
|
// TELEKINESIS
|
|
//----------------------------------------------------------------
|
|
|
|
#define ALIENCONTROLLER_NUMBER_OF_TELEKINESIS_OBJECTS 3
|
|
|
|
#define ALIENCONTROLLER_TELEKINESIS_INITIAL_DELAY 2.0f
|
|
#define ALIENCONTROLLER_TELEKINESIS_DELAY 1.5f
|
|
#define ALIENCONTROLLER_TELEKINESIS_INITIAL_CANCEL_DELAY 10.0f
|
|
#define ALIENCONTROLLER_TELEKINESIS_CANCEL_DELAY 7.0f
|
|
|
|
#define ALIENCONTROLLER_TELEKINESIS_NO_BEST_OBJECT_DELAY 0.3f
|
|
|
|
#define ALIENCONTROLLER_TELEKINESIS_SCAN_DELAY 10.0f
|
|
#define ALIENCONTROLLER_TELEKINESIS_INITIAL_SCAN_DELAY 3.0f
|
|
|
|
#define ALIENCONTROLLER_TELEKINESIS_PULL_VECTOR Vector(0,0,64)
|
|
|
|
#define ALIENCONTROLLER_TELEKINESIS_MAX_HEIGHT 256
|
|
#define ALIENCONTROLLER_TELEKINESIS_MIN_HEIGHT 64
|
|
|
|
#define ALIENCONTROLLER_HULL_MINS Vector( -16, -16, 0 )
|
|
#define ALIENCONTROLLER_HULL_MAXS Vector( 16, 16, 70 )
|
|
|
|
|
|
//----------------------------------------------------------------
|
|
// MOVEMENT
|
|
//----------------------------------------------------------------
|
|
|
|
#define ALIENCONTROLLER_FACE_ENEMY_DISTANCE 512.0f
|
|
#define ALIENCONTROLLER_XY_DISTANCE_NOT_FACING 8.0f
|
|
#define ALIENCONTROLLER_Z_DISTANCE_NOT_FACING 4.0f
|
|
#define ALIENCONTROLLER_XY_DISTANCE_FACING 4.0f
|
|
#define ALIENCONTROLLER_Z_DISTANCE_FACING 2.0f
|
|
|
|
#define CONTROLLER_BODY_CENTER_Z 35
|
|
#define CONTROLLER_BODY_CENTER Vector(0,0,CONTROLLER_BODY_CENTER_Z) //-35
|
|
|
|
//----------------------------------------------------------------
|
|
// PARTICLE MESSAGES
|
|
//----------------------------------------------------------------
|
|
|
|
#define MESSAGE_START_FIREBALL 0
|
|
#define MESSAGE_STOP_FIREBALL 1
|
|
#define MESSAGE_START_BEAM 2
|
|
#define MESSAGE_STOP_BEAM 3
|
|
#define MESSAGE_STOP_ALL 4
|
|
|
|
|
|
//----------------------------------------------------------------
|
|
|
|
#define ALIENCONTROLLER_OVERRIDE_SCHEDULE_CHANGE_FUNCTIONS_TO_FIX_GOAL_FROM_CLEARING 1
|
|
|
|
class CNPC_AlienController : public CAI_PlayerAlly
|
|
{
|
|
DECLARE_CLASS( CNPC_AlienController, CAI_PlayerAlly );
|
|
|
|
public:
|
|
CNPC_AlienController();
|
|
|
|
Class_T Classify( void ) { return( CLASS_ALIENCONTROLLER ); }
|
|
|
|
unsigned int PhysicsSolidMaskForEntity() { return (CONTENTS_TEAM1 | BaseClass::PhysicsSolidMaskForEntity()); }
|
|
|
|
void DeathSound( const CTakeDamageInfo &info ) ;
|
|
void PainSound( const CTakeDamageInfo &info );
|
|
void AlertSound( void );
|
|
void AttackSound( void );
|
|
void IdleSound( void );
|
|
|
|
void Precache(void);
|
|
|
|
void Spawn(void);
|
|
|
|
bool CanBecomeRagdoll(const CTakeDamageInfo &info);//OVR
|
|
Activity GetDeathActivity();//OVR
|
|
|
|
void Activate();
|
|
|
|
void OnRestore();
|
|
int OnTakeDamage_Alive(const CTakeDamageInfo &info);
|
|
void PrescheduleThink( void );
|
|
|
|
#ifdef ALIENCONTROLLER_OVERRIDE_SCHEDULE_CHANGE_FUNCTIONS_TO_FIX_GOAL_FROM_CLEARING
|
|
virtual void OnScheduleChange ( void );
|
|
virtual void SetSchedule( CAI_Schedule *pNewSchedule, bool DontClearGoal = false );
|
|
#endif
|
|
|
|
bool ControllerReachedPoint(Vector vecOrigin);
|
|
|
|
//virtual bool FVisible( CBaseEntity *pEntity, int traceMask, CBaseEntity **ppBlocker );
|
|
|
|
virtual float GetReactionDelay( CBaseEntity *pEnemy ) { return 0.0; }
|
|
|
|
virtual float MaxYawSpeed( void ) { return 100.0f; }
|
|
|
|
virtual void UpdateEfficiency( bool bInPVS );
|
|
|
|
virtual void HandleAnimEvent( animevent_t *pEvent );
|
|
virtual int GetSoundInterests( void );
|
|
virtual int SelectSchedule( void );
|
|
virtual void StartTask( const Task_t *pTask );
|
|
virtual void RunTask( const Task_t *pTask );
|
|
|
|
virtual Activity NPC_TranslateActivity( Activity baseAct );
|
|
virtual int TranslateSchedule( int scheduleType );
|
|
|
|
virtual bool OverrideMove(float flInterval);
|
|
virtual bool OverrideMoveFacing( const AILocalMoveGoal_t &move, float flInterval );
|
|
bool Probe( const Vector &vecMoveDir, float flSpeed, Vector &vecDeflect );
|
|
bool ControllerProgressFlyPath();
|
|
|
|
int RangeAttack1Conditions( float flDot, float flDist );
|
|
int MeleeAttack1Conditions( float flDot, float flDist );
|
|
|
|
void Event_Killed( const CTakeDamageInfo &info );
|
|
|
|
virtual float InnateRange1MaxRange();
|
|
virtual float InnateRange1MinRange();
|
|
|
|
Disposition_t IRelationType( CBaseEntity *pTarget );
|
|
|
|
//Controller custom
|
|
|
|
void ShootFireBall();
|
|
|
|
void ParticleMessages(int message);
|
|
|
|
#ifdef HLSS_USE_COMBINE_BALL_DEFENSE
|
|
void CombineBallCheck();
|
|
#endif
|
|
|
|
Vector GetPreferredAttackPoint(CBaseEntity *moveTarget);
|
|
void ControllerFly(float flInterval, Vector vMoveTargetPos, Vector vTargetPos );
|
|
void ControllerLand(float flInterval );
|
|
float CheckLandingSpace(Vector origin);
|
|
|
|
// Pulling and throwing physics objects
|
|
|
|
int GetSwatActivity( void );
|
|
|
|
#ifdef HLSS_CONTROLLER_TELEKINESIS
|
|
void NPCThink(void); //for physobject pull
|
|
|
|
virtual void BuildScheduleTestBits( void );
|
|
void GatherConditions( void );
|
|
bool FindNearestPhysicsObjects( int iMaxMass );
|
|
|
|
bool ThrowObject( void );
|
|
void CancelObject( void );
|
|
void PullObjects();
|
|
void StartObjectSounds();
|
|
#endif
|
|
|
|
void UpdateHead( void );
|
|
|
|
|
|
// Inputs
|
|
void InputEnableLanding( inputdata_t &inputdata );
|
|
void InputDisableLanding( inputdata_t &inputdata );
|
|
|
|
void InputStopScriptingAndGesture( inputdata_t &inputdata );
|
|
|
|
private:
|
|
|
|
//FIREBALL
|
|
|
|
int m_iFireBallAttachment;
|
|
int m_iLeftHandAttachment;
|
|
int m_iBrainsAttachment;
|
|
|
|
CNetworkVar( bool, m_bFireballEffects );
|
|
|
|
EHANDLE m_hFireBallTarget;
|
|
|
|
int m_iLastOffsetAngle;
|
|
float m_fLastOffsetSwithcTime;
|
|
float m_flPreferredHeight;
|
|
Vector m_vecPreferedAttackPoint;
|
|
float m_flNextPreferredAttackTime;
|
|
|
|
float m_flNextAttackTime;
|
|
int m_iNumberOfAttacks;
|
|
|
|
//SOUNDS:
|
|
float m_flNextPainSoundTime;
|
|
|
|
//TELEKINESIS:
|
|
#ifdef HLSS_CONTROLLER_TELEKINESIS
|
|
CNetworkArray( EHANDLE, m_hPhysicsEnt, ALIENCONTROLLER_NUMBER_OF_TELEKINESIS_OBJECTS );
|
|
|
|
Vector m_vecPhysicsEntOrigin[ALIENCONTROLLER_NUMBER_OF_TELEKINESIS_OBJECTS];
|
|
int m_iNumberOfPhysiscsEnts;
|
|
|
|
float m_flNextTelekinesisCancel;
|
|
float m_flNextTelekinesisThrow;
|
|
float m_flNextTelekinesisScan;
|
|
#endif
|
|
|
|
bool m_bIsFlying;
|
|
bool m_bIsLanding;
|
|
bool m_bCanLand;
|
|
float m_flNextLandingTime;
|
|
//int m_iNodeToLand;
|
|
Vector m_vecLandPosition;
|
|
|
|
#ifdef HLSS_USE_COMBINE_BALL_DEFENSE
|
|
float m_flNextCombineBallScan;
|
|
EHANDLE m_hCombineBall;
|
|
#endif
|
|
|
|
//TERO: hint node releated shit
|
|
Vector m_vOldGoal;
|
|
// Vector m_vLastFlyPosition;
|
|
|
|
// -------------------------------------------------------
|
|
|
|
//OUTPUTS:
|
|
COutputEvent m_OnLand;
|
|
COutputEvent m_OnLiftOff;
|
|
|
|
// -------------------------------------------------------
|
|
|
|
bool CheckLanding();
|
|
void Land(bool bIsFlying);
|
|
void Claw();
|
|
|
|
private:
|
|
|
|
|
|
DEFINE_CUSTOM_AI;
|
|
|
|
|
|
// Custom interrupt conditions
|
|
enum
|
|
{
|
|
COND_ALIENCONTROLLER_CAN_SHOOT_FIREBALL = BaseClass::NEXT_CONDITION,
|
|
#ifdef HLSS_CONTROLLER_TELEKINESIS
|
|
COND_ALIENCONTROLLER_CAN_PHYS_ATTACK,
|
|
#endif
|
|
COND_ALIENCONTROLLER_SHOULD_LAND,
|
|
COND_ALIENCONTROLLER_FLY_BLOCKED,
|
|
};
|
|
|
|
// Custom schedules
|
|
enum
|
|
{
|
|
SCHED_ALIENCONTROLLER_LEVITATE = BaseClass::NEXT_SCHEDULE,
|
|
SCHED_ALIENCONTROLLER_SHOOT_FIREBALL,
|
|
SCHED_ALIENCONTROLLER_FIREBALL_EXTINGUISH,
|
|
SCHED_ALIENCONTROLLER_LAND,
|
|
SCHED_ALIENCONTROLLER_PRESS_ATTACK,
|
|
|
|
#ifdef HLSS_CONTROLLER_TELEKINESIS
|
|
SCHED_ALIENCONTROLLER_TELEKINESIS,
|
|
#endif
|
|
};
|
|
|
|
|
|
// Custom tasks
|
|
enum
|
|
{
|
|
TASK_ALIENCONTROLLER_FIREBALL_EXTINGUISH = BaseClass::NEXT_TASK,
|
|
TASK_ALIENCONTROLLER_LAND,
|
|
|
|
#ifdef HLSS_CONTROLLER_TELEKINESIS
|
|
TASK_ALIENCONTROLLER_TELEKINESIS,
|
|
#endif
|
|
};
|
|
|
|
|
|
DECLARE_SERVERCLASS();
|
|
DECLARE_DATADESC();
|
|
};
|
|
|
|
|
|
#endif //NPC_ALIENCONTROLLER
|