diff options
Diffstat (limited to 'mp/src/game/server/npc_vehicledriver.h')
| -rw-r--r-- | mp/src/game/server/npc_vehicledriver.h | 394 |
1 files changed, 197 insertions, 197 deletions
diff --git a/mp/src/game/server/npc_vehicledriver.h b/mp/src/game/server/npc_vehicledriver.h index e444ca71..d59b4433 100644 --- a/mp/src/game/server/npc_vehicledriver.h +++ b/mp/src/game/server/npc_vehicledriver.h @@ -1,197 +1,197 @@ -//========= 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
+//========= 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 |