|
|
//========= 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
|