You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
197 lines
5.6 KiB
197 lines
5.6 KiB
//========= 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
|
|
|