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.
179 lines
3.8 KiB
179 lines
3.8 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
// $NoKeywords: $ |
|
//=============================================================================// |
|
|
|
#ifndef NPC_HYDRA_H |
|
#define NPC_HYDRA_H |
|
|
|
#if defined( _WIN32 ) |
|
#pragma once |
|
#endif |
|
|
|
#include "ai_basenpc.h" |
|
#include "soundenvelope.h" |
|
|
|
class CNPC_Hydra; |
|
|
|
//----------------------------------------------------------------------------- |
|
// CNPC_Hydra |
|
// |
|
//----------------------------------------------------------------------------- |
|
|
|
class HydraBone |
|
{ |
|
public: |
|
HydraBone( void ) |
|
{ |
|
vecPos = Vector( 0, 0, 0 ); |
|
vecDelta = Vector( 0, 0, 0 ); |
|
//vecBendDelta = Vector( 0, 0, 0 ); |
|
//vecGoalDelta = Vector( 0, 0, 0 ); |
|
//flBendTension = 0.0; |
|
flIdealLength = 1.0; |
|
flGoalInfluence = 0.0; |
|
bStuck = false; |
|
bOnFire = false; |
|
}; |
|
|
|
Vector vecPos; |
|
Vector vecDelta; |
|
//float flBendTension; |
|
float flIdealLength; |
|
bool bStuck; |
|
bool bOnFire; |
|
|
|
float flActualLength; |
|
//Vector vecBendDelta; |
|
//Vector vecGoalDelta; |
|
// float flAccumLength; |
|
|
|
Vector vecGoalPos; |
|
float flGoalInfluence; |
|
|
|
DECLARE_SIMPLE_DATADESC(); |
|
}; |
|
|
|
class CNPC_Hydra : public CAI_BaseNPC |
|
{ |
|
DECLARE_CLASS( CNPC_Hydra, CAI_BaseNPC ); |
|
DECLARE_SERVERCLASS(); |
|
DECLARE_DATADESC(); |
|
|
|
public: |
|
CNPC_Hydra() |
|
{ |
|
} |
|
|
|
void Spawn( void ); |
|
void Precache( void ); |
|
void Activate( void ); |
|
|
|
Class_T Classify( void ); |
|
|
|
void RunAI( void ); |
|
|
|
float MaxYawSpeed( void ); |
|
int TranslateSchedule( int scheduleType ); |
|
int SelectSchedule( void ); |
|
|
|
void PrescheduleThink( void ); |
|
|
|
void HandleAnimEvent( animevent_t *pEvent ); |
|
|
|
void StartTask( const Task_t *pTask ); |
|
void RunTask( const Task_t *pTask ); |
|
|
|
#define CHAIN_LINKS 32 |
|
|
|
CNetworkArray( Vector, m_vecChain, CHAIN_LINKS ); |
|
int m_activeChain; |
|
|
|
bool m_bHasStuckSegments; |
|
float m_flCurrentLength; |
|
|
|
Vector m_vecHeadGoal; |
|
float m_flHeadGoalInfluence; |
|
CNetworkVector( m_vecHeadDir ); |
|
|
|
CNetworkVar( float, m_flRelaxedLength ); |
|
|
|
Vector m_vecOutward; |
|
|
|
CUtlVector < HydraBone > m_body; |
|
|
|
float m_idealLength; |
|
float m_idealSegmentLength; |
|
|
|
Vector TestPosition( float t ); |
|
|
|
void CalcGoalForces( void ); |
|
void MoveBody( void ); |
|
|
|
void AdjustLength( void ); |
|
void CheckLength( void ); |
|
|
|
bool m_bExtendSoundActive; |
|
CSoundPatch *m_pExtendTentacleSound; |
|
|
|
void Nudge( CBaseEntity *pHitEntity, const Vector &vecContact, const Vector &vecSpeed ); |
|
void Stab( CBaseEntity *pHitEntity, const Vector &vecSpeed, trace_t &ptr ); |
|
void Kick( CBaseEntity *pHitEntity, const Vector &vecContact, const Vector &vecSpeed ); |
|
void Splash( const Vector &vecSplashPos ); |
|
|
|
// float FreeNeckLength( void ); |
|
|
|
virtual Vector EyePosition( void ); |
|
virtual const QAngle &EyeAngles( void ); |
|
|
|
virtual Vector BodyTarget( const Vector &posSrc, bool bNoisy) ; |
|
|
|
void AimHeadInTravelDirection( float flInfluence ); |
|
|
|
float m_seed; |
|
|
|
// -------------------------------- |
|
Vector m_vecTarget; |
|
Vector m_vecTargetDir; |
|
|
|
float m_flLastAdjustmentTime; |
|
float m_flTaskStartTime; |
|
float m_flTaskEndTime; |
|
|
|
float m_flLengthTime; // time of last successful length adjustment time |
|
|
|
// -------------------------------- |
|
|
|
bool ContractFromHead( void ); |
|
bool ContractBetweenStuckSegments( void ); |
|
bool ContractFromRoot( void ); |
|
|
|
int VirtualRoot( void ); |
|
|
|
bool AddNodeBefore( int iNode ); |
|
bool AddNodeAfter( int iNode ); |
|
|
|
bool GrowFromVirtualRoot( void ); |
|
bool GrowFromMostStretched( void ); |
|
|
|
void CalcRelaxedLength( void ); |
|
|
|
bool IsValidConnection( int iNode0, int iNode1 ); |
|
|
|
void AttachStabbedEntity( CBaseAnimating *pAnimating, Vector vecForce, trace_t &tr ); |
|
void UpdateStabbedEntity( void ); |
|
void DetachStabbedEntity( bool playSound ); |
|
void GetDesiredImpaledPosition( Vector *vecOrigin, QAngle *vecAngles ); |
|
|
|
bool m_bStabbedEntity; |
|
|
|
DEFINE_CUSTOM_AI; |
|
|
|
private: |
|
}; |
|
|
|
//----------------------------------------------------------------------------- |
|
|
|
#endif // NPC_HYDRA_H
|
|
|