This repository has been archived on 2024-06-13. You can view files and clone it, but cannot push or open issues or pull requests.
2020-08-04 13:13:01 -04:00

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