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