1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
|
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
// $NoKeywords: $
//=============================================================================//
#ifndef VEHICLE_BASE_H
#define VEHICLE_BASE_H
#ifdef _WIN32
#pragma once
#endif
#include "vphysics/vehicles.h"
#include "iservervehicle.h"
#include "fourwheelvehiclephysics.h"
#include "props.h"
#include "vehicle_sounds.h"
#include "phys_controller.h"
#include "entityblocker.h"
#include "vehicle_baseserver.h"
#include "vehicle_viewblend_shared.h"
class CNPC_VehicleDriver;
class CFourWheelVehiclePhysics;
class CPropVehicleDriveable;
class CSoundPatch;
// the tires are considered to be skidding if they have sliding velocity of 10 in/s or more
const float DEFAULT_SKID_THRESHOLD = 10.0f;
//-----------------------------------------------------------------------------
// Purpose: Four wheel physics vehicle server vehicle
//-----------------------------------------------------------------------------
class CFourWheelServerVehicle : public CBaseServerVehicle
{
DECLARE_CLASS( CFourWheelServerVehicle, CBaseServerVehicle );
// IServerVehicle
public:
virtual ~CFourWheelServerVehicle( void )
{
}
CFourWheelServerVehicle( void );
virtual bool IsVehicleUpright( void );
virtual bool IsVehicleBodyInWater( void );
virtual void GetVehicleViewPosition( int nRole, Vector *pOrigin, QAngle *pAngles, float *pFOV = NULL );
IPhysicsVehicleController *GetVehicleController();
const vehicleparams_t *GetVehicleParams( void );
const vehicle_controlparams_t *GetVehicleControlParams( void );
const vehicle_operatingparams_t *GetVehicleOperatingParams( void );
// NPC Driving
void NPC_SetDriver( CNPC_VehicleDriver *pDriver );
void NPC_DriveVehicle( void );
CPropVehicleDriveable *GetFourWheelVehicle( void );
bool GetWheelContactPoint( int nWheelIndex, Vector &vecPos );
public:
virtual void SetVehicle( CBaseEntity *pVehicle );
void InitViewSmoothing( const Vector &vecStartOrigin, const QAngle &vecStartAngles );
bool IsPassengerEntering( void );
bool IsPassengerExiting( void );
DECLARE_SIMPLE_DATADESC();
private:
CFourWheelVehiclePhysics *GetFourWheelVehiclePhysics( void );
ViewSmoothingData_t m_ViewSmoothing;
};
//-----------------------------------------------------------------------------
// Purpose: Base class for four wheel physics vehicles
//-----------------------------------------------------------------------------
class CPropVehicle : public CBaseProp, public CDefaultPlayerPickupVPhysics
{
DECLARE_CLASS( CPropVehicle, CBaseProp );
public:
CPropVehicle();
virtual ~CPropVehicle();
void SetVehicleType( unsigned int nVehicleType ) { m_nVehicleType = nVehicleType; }
unsigned int GetVehicleType( void ) { return m_nVehicleType; }
// CBaseEntity
void Spawn( void );
virtual int Restore( IRestore &restore );
void VPhysicsUpdate( IPhysicsObject *pPhysics );
void DrawDebugGeometryOverlays();
int DrawDebugTextOverlays();
void Teleport( const Vector *newPosition, const QAngle *newAngles, const Vector *newVelocity );
virtual void Think( void );
CFourWheelVehiclePhysics *GetPhysics( void ) { return &m_VehiclePhysics; }
CBasePlayer *HasPhysicsAttacker( float dt );
void OnPhysGunPickup( CBasePlayer *pPhysGunUser, PhysGunPickup_t reason );
Vector GetSmoothedVelocity( void ); //Save and update our smoothed velocity for prediction
virtual void DampenEyePosition( Vector &vecVehicleEyePos, QAngle &vecVehicleEyeAngles ) {}
// Inputs
void InputThrottle( inputdata_t &inputdata );
void InputSteering( inputdata_t &inputdata );
void InputAction( inputdata_t &inputdata );
void InputHandBrakeOn( inputdata_t &inputdata );
void InputHandBrakeOff( inputdata_t &inputdata );
DECLARE_DATADESC();
#ifdef HL2_EPISODIC
void AddPhysicsChild( CBaseEntity *pChild );
void RemovePhysicsChild( CBaseEntity *pChild );
#endif //HL2_EPISODIC
protected:
// engine sounds
void SoundInit();
void SoundShutdown();
void SoundUpdate( const vehicle_operatingparams_t ¶ms, const vehicleparams_t &vehicle );
void CalcWheelData( vehicleparams_t &vehicle );
void ResetControls();
// Upright strength of the controller (angular limit)
virtual float GetUprightStrength( void ) { return 8.0f; }
virtual float GetUprightTime( void ) { return 5.0f; }
protected:
CFourWheelVehiclePhysics m_VehiclePhysics;
unsigned int m_nVehicleType;
string_t m_vehicleScript;
#ifdef HL2_EPISODIC
CUtlVector<EHANDLE> m_hPhysicsChildren; // List of entities who wish to get physics callbacks from the vehicle
#endif //HL2_EPISODIC
private:
Vector m_vecSmoothedVelocity;
CHandle<CBasePlayer> m_hPhysicsAttacker;
float m_flLastPhysicsInfluenceTime;
};
//=============================================================================
// NPC Passenger Carrier interface
class INPCPassengerCarrier
{
public:
virtual bool NPC_CanEnterVehicle( CAI_BaseNPC *pPassenger, bool bCompanion ) = 0;
virtual bool NPC_CanExitVehicle( CAI_BaseNPC *pPassenger, bool bCompanion ) = 0;
virtual bool NPC_AddPassenger( CAI_BaseNPC *pPassenger, string_t strRoleName, int nSeatID ) = 0;
virtual bool NPC_RemovePassenger( CAI_BaseNPC *pPassenger ) = 0;
virtual void NPC_FinishedEnterVehicle( CAI_BaseNPC *pPassenger, bool bCompanion ) = 0;
virtual void NPC_FinishedExitVehicle( CAI_BaseNPC *pPassenger, bool bCompanion ) = 0;
};
//-----------------------------------------------------------------------------
// Purpose: Drivable four wheel physics vehicles
//-----------------------------------------------------------------------------
class CPropVehicleDriveable : public CPropVehicle, public IDrivableVehicle, public INPCPassengerCarrier
{
DECLARE_CLASS( CPropVehicleDriveable, CPropVehicle );
DECLARE_SERVERCLASS();
DECLARE_DATADESC();
public:
CPropVehicleDriveable( void );
~CPropVehicleDriveable( void );
virtual void Precache( void );
virtual void Spawn( void );
virtual int Restore( IRestore &restore );
virtual void OnRestore();
virtual void CreateServerVehicle( void );
virtual int ObjectCaps( void ) { return BaseClass::ObjectCaps() | FCAP_IMPULSE_USE; };
virtual void GetVectors(Vector* pForward, Vector* pRight, Vector* pUp) const;
virtual void VehicleAngleVectors( const QAngle &angles, Vector *pForward, Vector *pRight, Vector *pUp );
virtual void Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value );
virtual void Think( void );
virtual void TraceAttack( const CTakeDamageInfo &info, const Vector &vecDir, trace_t *ptr, CDmgAccumulator *pAccumulator );
virtual void Event_KilledOther( CBaseEntity *pVictim, const CTakeDamageInfo &info );
// Vehicle handling
virtual void VPhysicsCollision( int index, gamevcollisionevent_t *pEvent );
virtual int VPhysicsGetObjectList( IPhysicsObject **pList, int listMax );
// Inputs
void InputLock( inputdata_t &inputdata );
void InputUnlock( inputdata_t &inputdata );
void InputTurnOn( inputdata_t &inputdata );
void InputTurnOff( inputdata_t &inputdata );
// Locals
void ResetUseKey( CBasePlayer *pPlayer );
// Driving
void DriveVehicle( CBasePlayer *pPlayer, CUserCmd *ucmd ); // Player driving entrypoint
virtual void DriveVehicle( float flFrameTime, CUserCmd *ucmd, int iButtonsDown, int iButtonsReleased ); // Driving Button handling
virtual bool IsOverturned( void );
virtual bool IsVehicleBodyInWater( void ) { return false; }
// Engine handling
void StartEngine( void );
void StopEngine( void );
bool IsEngineOn( void );
// IDrivableVehicle
public:
virtual CBaseEntity *GetDriver( void );
virtual void ItemPostFrame( CBasePlayer *pPlayer ) { return; }
virtual void SetupMove( CBasePlayer *player, CUserCmd *ucmd, IMoveHelper *pHelper, CMoveData *move );
virtual void ProcessMovement( CBasePlayer *pPlayer, CMoveData *pMoveData ) { return; }
virtual void FinishMove( CBasePlayer *player, CUserCmd *ucmd, CMoveData *move ) { return; }
virtual bool CanEnterVehicle( CBaseEntity *pEntity );
virtual bool CanExitVehicle( CBaseEntity *pEntity );
virtual void SetVehicleEntryAnim( bool bOn ) { m_bEnterAnimOn = bOn; }
virtual void SetVehicleExitAnim( bool bOn, Vector vecEyeExitEndpoint ) { m_bExitAnimOn = bOn; if ( bOn ) m_vecEyeExitEndpoint = vecEyeExitEndpoint; }
virtual void EnterVehicle( CBaseCombatCharacter *pPassenger );
virtual bool AllowBlockedExit( CBaseCombatCharacter *pPassenger, int nRole ) { return true; }
virtual bool AllowMidairExit( CBaseCombatCharacter *pPassenger, int nRole ) { return false; }
virtual void PreExitVehicle( CBaseCombatCharacter *pPassenger, int nRole ) {}
virtual void ExitVehicle( int nRole );
virtual string_t GetVehicleScriptName() { return m_vehicleScript; }
virtual bool PassengerShouldReceiveDamage( CTakeDamageInfo &info ) { return true; }
// If this is a vehicle, returns the vehicle interface
virtual IServerVehicle *GetServerVehicle() { return m_pServerVehicle; }
protected:
virtual bool ShouldThink() { return ( GetDriver() != NULL ); }
inline bool HasGun();
void DestroyServerVehicle();
// Contained IServerVehicle
CFourWheelServerVehicle *m_pServerVehicle;
COutputEvent m_playerOn;
COutputEvent m_playerOff;
COutputEvent m_pressedAttack;
COutputEvent m_pressedAttack2;
COutputFloat m_attackaxis;
COutputFloat m_attack2axis;
CNetworkHandle( CBasePlayer, m_hPlayer );
public:
CNetworkVar( int, m_nSpeed );
CNetworkVar( int, m_nRPM );
CNetworkVar( float, m_flThrottle );
CNetworkVar( int, m_nBoostTimeLeft );
CNetworkVar( int, m_nHasBoost );
CNetworkVector( m_vecEyeExitEndpoint );
CNetworkVector( m_vecGunCrosshair );
CNetworkVar( bool, m_bUnableToFire );
CNetworkVar( bool, m_bHasGun );
CNetworkVar( bool, m_nScannerDisabledWeapons );
CNetworkVar( bool, m_nScannerDisabledVehicle );
// NPC Driver
CHandle<CNPC_VehicleDriver> m_hNPCDriver;
EHANDLE m_hKeepUpright;
// --------------------------------
// NPC Passengers
public:
virtual bool NPC_CanEnterVehicle( CAI_BaseNPC *pPassenger, bool bCompanion );
virtual bool NPC_CanExitVehicle( CAI_BaseNPC *pPassenger, bool bCompanion );
virtual bool NPC_AddPassenger( CAI_BaseNPC *pPassenger, string_t strRoleName, int nSeatID );
virtual bool NPC_RemovePassenger( CAI_BaseNPC *pPassenger );
virtual void NPC_FinishedEnterVehicle( CAI_BaseNPC *pPassenger, bool bCompanion ) {}
virtual void NPC_FinishedExitVehicle( CAI_BaseNPC *pPassenger, bool bCompanion ) {}
// NPC Passengers
// --------------------------------
bool IsEnterAnimOn( void ) { return m_bEnterAnimOn; }
bool IsExitAnimOn( void ) { return m_bExitAnimOn; }
const Vector &GetEyeExitEndpoint( void ) { return m_vecEyeExitEndpoint; }
protected:
// Entering / Exiting
bool m_bEngineLocked; // Mapmaker override on whether the vehicle's allowed to be turned on/off
bool m_bLocked;
float m_flMinimumSpeedToEnterExit;
CNetworkVar( bool, m_bEnterAnimOn );
CNetworkVar( bool, m_bExitAnimOn );
// Used to turn the keepupright off after a short time
float m_flTurnOffKeepUpright;
float m_flNoImpactDamageTime;
};
inline bool CPropVehicleDriveable::HasGun()
{
return m_bHasGun;
}
#endif // VEHICLE_BASE_H
|