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
|
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
//=============================================================================
#ifndef VEHICLE_JEEP_H
#define VEHICLE_JEEP_H
#ifdef _WIN32
#pragma once
#endif
#include "vehicle_base.h"
#define JEEP_WHEEL_COUNT 4
struct JeepWaterData_t
{
bool m_bWheelInWater[JEEP_WHEEL_COUNT];
bool m_bWheelWasInWater[JEEP_WHEEL_COUNT];
Vector m_vecWheelContactPoints[JEEP_WHEEL_COUNT];
float m_flNextRippleTime[JEEP_WHEEL_COUNT];
bool m_bBodyInWater;
bool m_bBodyWasInWater;
DECLARE_SIMPLE_DATADESC();
};
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
class CPropJeep : public CPropVehicleDriveable
{
public:
DECLARE_CLASS( CPropJeep, CPropVehicleDriveable );
DECLARE_SERVERCLASS();
DECLARE_DATADESC();
CPropJeep( void );
// CPropVehicle
virtual void ProcessMovement( CBasePlayer *pPlayer, CMoveData *pMoveData );
virtual void DriveVehicle( float flFrameTime, CUserCmd *ucmd, int iButtonsDown, int iButtonsReleased );
virtual void SetupMove( CBasePlayer *player, CUserCmd *ucmd, IMoveHelper *pHelper, CMoveData *move );
virtual void Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value );
virtual void DampenEyePosition( Vector &vecVehicleEyePos, QAngle &vecVehicleEyeAngles );
virtual bool AllowBlockedExit( CBasePlayer *pPlayer, int nRole ) { return false; }
virtual bool CanExitVehicle( CBaseEntity *pEntity );
virtual bool IsVehicleBodyInWater() { return m_WaterData.m_bBodyInWater; }
// Passengers do not directly receive damage from blasts or radiation damage
virtual bool PassengerShouldReceiveDamage( CTakeDamageInfo &info )
{
if ( GetServerVehicle() && GetServerVehicle()->IsPassengerExiting() )
return false;
if ( info.GetDamageType() & DMG_VEHICLE )
return true;
return (info.GetDamageType() & (DMG_RADIATION|DMG_BLAST) ) == 0;
}
// CBaseEntity
void Think(void);
void Precache( void );
void Spawn( void );
void Activate( void );
virtual void CreateServerVehicle( void );
virtual Vector BodyTarget( const Vector &posSrc, bool bNoisy = true );
virtual void TraceAttack( const CTakeDamageInfo &info, const Vector &vecDir, trace_t *ptr, CDmgAccumulator *pAccumulator );
virtual int OnTakeDamage( const CTakeDamageInfo &info );
virtual float PassengerDamageModifier( const CTakeDamageInfo &info );
virtual void EnterVehicle( CBaseCombatCharacter *pPassenger );
virtual void ExitVehicle( int nRole );
void AimGunAt( Vector *endPos, float flInterval );
bool TauCannonHasBeenCutOff( void ) { return m_bGunHasBeenCutOff; }
// NPC Driving
bool NPC_HasPrimaryWeapon( void ) { return true; }
void NPC_AimPrimaryWeapon( Vector vecTarget );
const char *GetTracerType( void ) { return "AR2Tracer"; }
void DoImpactEffect( trace_t &tr, int nDamageType );
bool HeadlightIsOn( void ) { return m_bHeadlightIsOn; }
void HeadlightTurnOn( void ) { m_bHeadlightIsOn = true; }
void HeadlightTurnOff( void ) { m_bHeadlightIsOn = false; }
private:
void FireCannon( void );
void ChargeCannon( void );
void FireChargedCannon( void );
void DrawBeam( const Vector &startPos, const Vector &endPos, float width );
void StopChargeSound( void );
void GetCannonAim( Vector *resultDir );
void InitWaterData( void );
void CheckWaterLevel( void );
void CreateSplash( const Vector &vecPosition );
void CreateRipple( const Vector &vecPosition );
void CreateDangerSounds( void );
void ComputePDControllerCoefficients( float *pCoefficientsOut, float flFrequency, float flDampening, float flDeltaTime );
void DampenForwardMotion( Vector &vecVehicleEyePos, QAngle &vecVehicleEyeAngles, float flFrameTime );
void DampenUpMotion( Vector &vecVehicleEyePos, QAngle &vecVehicleEyeAngles, float flFrameTime );
void JeepSeagullThink( void );
void SpawnPerchedSeagull( void );
void AddSeagullPoop( const Vector &vecOrigin );
void InputShowHudHint( inputdata_t &inputdata );
void InputStartRemoveTauCannon( inputdata_t &inputdata );
void InputFinishRemoveTauCannon( inputdata_t &inputdata );
protected:
virtual void HandleWater( void );
bool CheckWater( void );
bool m_bGunHasBeenCutOff;
float m_flDangerSoundTime;
int m_nBulletType;
bool m_bCannonCharging;
float m_flCannonTime;
float m_flCannonChargeStartTime;
Vector m_vecGunOrigin;
CSoundPatch *m_sndCannonCharge;
int m_nSpinPos;
float m_aimYaw;
float m_aimPitch;
float m_throttleDisableTime;
float m_flAmmoCrateCloseTime;
// handbrake after the fact to keep vehicles from rolling
float m_flHandbrakeTime;
bool m_bInitialHandbrake;
float m_flOverturnedTime;
Vector m_vecLastEyePos;
Vector m_vecLastEyeTarget;
Vector m_vecEyeSpeed;
Vector m_vecTargetSpeed;
JeepWaterData_t m_WaterData;
int m_iNumberOfEntries;
int m_nAmmoType;
// Seagull perching
float m_flPlayerExitedTime; // Time at which the player last left this vehicle
float m_flLastSawPlayerAt; // Time at which we last saw the player
EHANDLE m_hLastPlayerInVehicle;
EHANDLE m_hSeagull;
bool m_bHasPoop;
CNetworkVar( bool, m_bHeadlightIsOn );
};
#endif // VEHICLE_JEEP_H
|