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.
nekohook/modules/source2013/sdk/game/server/npc_vehicledriver.h
2020-08-04 13:13:01 -04:00

196 lines
6.1 KiB
C++

//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose: NPC that drives vehicles
//
//=============================================================================//
#ifndef NPC_VEHICLEDRIVER_H
#define NPC_VEHICLEDRIVER_H
#ifdef _WIN32
#pragma once
#endif
#include "ai_basenpc.h"
class CPropVehicleDriveable;
//------------------------------------
// Spawnflags
//------------------------------------
#define SF_VEHICLEDRIVER_INACTIVE (1 << 16)
//=========================================================
// Custom schedules
//=========================================================
enum {
SCHED_VEHICLEDRIVER_INACTIVE = LAST_SHARED_SCHEDULE,
SCHED_VEHICLEDRIVER_COMBAT_WAIT,
SCHED_VEHICLEDRIVER_DRIVE_PATH,
LAST_VEHICLEDRIVER_SCHED,
};
//=========================================================
// Custom tasks
//=========================================================
enum {
TASK_VEHICLEDRIVER_GET_PATH = LAST_SHARED_TASK,
LAST_VEHICLEDRIVER_TASK,
};
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
class CVehicleWaypoint {
public:
CVehicleWaypoint(Vector &pPrevPoint, Vector &pCurPoint, Vector &pNextPoint,
Vector &pNextNextPoint) {
splinePoints[0] = pPrevPoint;
splinePoints[1] = pCurPoint;
splinePoints[2] = pNextPoint;
splinePoints[3] = pNextNextPoint;
RecalculateSpline();
}
void RecalculateSpline(void) {
planeWaypoint.normal = (splinePoints[2] - splinePoints[1]);
VectorNormalize(planeWaypoint.normal);
planeWaypoint.type = PLANE_ANYZ;
planeWaypoint.dist = DotProduct(planeWaypoint.normal, splinePoints[2]);
planeWaypoint.signbits = SignbitsForPlane(&planeWaypoint);
// TODO: Use the vehicle's absbox
iInitialPlaneSide = BoxOnPlaneSide(-Vector(32, 32, 32),
Vector(32, 32, 32), &planeWaypoint);
// Hackily calculate a length for the spline. Subdivide & measure.
flSplineLength = 0;
Vector vecPrev = splinePoints[1];
const int iDivs = 10;
for (int i = 1; i <= iDivs; i++) {
Vector vecCurr;
float flT = (float)i / (float)iDivs;
Catmull_Rom_Spline(splinePoints[0], splinePoints[1],
splinePoints[2], splinePoints[3], flT, vecCurr);
flSplineLength += (vecCurr - vecPrev).Length();
vecPrev = vecCurr;
}
}
Vector GetPointAt(float flT) {
Vector vecCurr(0, 0, 0);
Catmull_Rom_Spline(splinePoints[0], splinePoints[1], splinePoints[2],
splinePoints[3], flT, vecCurr);
return vecCurr;
}
Vector GetTangentAt(float flT) {
Vector vecCurr(0, 0, 0);
Catmull_Rom_Spline_Tangent(splinePoints[0], splinePoints[1],
splinePoints[2], splinePoints[3], flT,
vecCurr);
return vecCurr;
}
float GetLength(void) { return flSplineLength; }
public:
int iInitialPlaneSide;
float flSplineLength;
Vector splinePoints[4];
cplane_t planeWaypoint;
};
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
class CNPC_VehicleDriver : public CAI_BaseNPC {
DECLARE_CLASS(CNPC_VehicleDriver, CAI_BaseNPC);
public:
DECLARE_DATADESC();
DEFINE_CUSTOM_AI;
CNPC_VehicleDriver(void);
~CNPC_VehicleDriver(void);
virtual void Spawn(void);
virtual void Precache(void);
virtual void Activate(void);
virtual void OnRestore();
virtual void UpdateOnRemove(void);
// AI
void UpdateEfficiency(bool bInPVS) {
SetEfficiency((GetSleepState() != AISS_AWAKE) ? AIE_DORMANT
: AIE_NORMAL);
SetMoveEfficiency(AIME_NORMAL);
}
virtual void PrescheduleThink(void);
virtual int TranslateSchedule(int scheduleType);
virtual int SelectSchedule(void);
virtual void StartTask(const Task_t *pTask);
virtual void RunTask(const Task_t *pTask);
virtual void GatherEnemyConditions(CBaseEntity *pEnemy);
virtual int RangeAttack1Conditions(float flDot, float flDist);
virtual int RangeAttack2Conditions(float flDot, float flDist);
// Driving
virtual void DriveVehicle(void);
virtual bool OverrideMove(float flInterval);
bool OverridePathMove(float flInterval);
void CalculatePostPoints(void);
bool WaypointReached(void);
float GetDefaultNavGoalTolerance();
void RecalculateSpeeds(void);
void ClearWaypoints(void);
void CheckForTeleport(void);
int BloodColor(void) { return DONT_BLEED; }
#ifdef HL2_DLL
Class_T Classify(void) { return CLASS_METROPOLICE; }
#else
Class_T Classify(void) { return CLASS_NONE; }
#endif
Disposition_t IRelationType(CBaseEntity *pTarget);
// Inputs
void InputSetDriversMaxSpeed(inputdata_t &inputdata);
void InputSetDriversMinSpeed(inputdata_t &inputdata);
void InputStartForward(inputdata_t &inputdata);
void InputStop(inputdata_t &inputdata);
void InputStartFiring(inputdata_t &inputdata);
void InputStopFiring(inputdata_t &inputdata);
void InputGotoPathCorner(inputdata_t &inputdata);
public:
string_t m_iszVehicleName;
IServerVehicle *m_pVehicleInterface;
EHANDLE m_hVehicleEntity;
// Path driving
CVehicleWaypoint *m_Waypoints[2];
CVehicleWaypoint *m_pCurrentWaypoint;
CVehicleWaypoint *m_pNextWaypoint;
Vector m_vecDesiredVelocity;
Vector m_vecDesiredPosition;
Vector m_vecPrevPoint;
Vector m_vecPrevPrevPoint;
Vector m_vecPostPoint;
Vector m_vecPostPostPoint;
float m_flDistanceAlongSpline;
float m_flDriversMaxSpeed;
float m_flDriversMinSpeed;
// Speed
float m_flMaxSpeed; // Maximum speed this driver will go
float m_flGoalSpeed; // Desired speed
float m_flInitialSpeed;
float m_flSteering;
};
#endif // NPC_VEHICLEDRIVER_H