178 lines
4.0 KiB
C++
178 lines
4.0 KiB
C++
//========= 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
|