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.
273 lines
9.3 KiB
273 lines
9.3 KiB
5 years ago
|
//========= Copyright Valve Corporation, All rights reserved. ============//
|
||
|
//
|
||
|
// Purpose: A base vehicle class
|
||
|
//
|
||
|
//=============================================================================//
|
||
|
|
||
|
#ifndef BASETFVEHICLE_H
|
||
|
#define BASETFVEHICLE_H
|
||
|
|
||
|
#ifdef _WIN32
|
||
|
#pragma once
|
||
|
#endif
|
||
|
|
||
|
#include "basetfplayer_shared.h"
|
||
|
#include "baseobject_shared.h"
|
||
|
#include "tf_obj_basedrivergun_shared.h"
|
||
|
|
||
|
#if defined( CLIENT_DLL )
|
||
|
#include "iclientvehicle.h"
|
||
|
#else
|
||
|
#include "IServerVehicle.h"
|
||
|
#endif
|
||
|
|
||
|
|
||
|
class CMoveData;
|
||
|
class CUserCmd;
|
||
|
class CBasePlayer;
|
||
|
|
||
|
#if defined( CLIENT_DLL )
|
||
|
#define CBaseTFVehicle C_BaseTFVehicle
|
||
|
#endif
|
||
|
|
||
|
class CBaseTFVehicle;
|
||
|
class CBaseObjectDriverGun;
|
||
|
|
||
|
struct VehicleBaseMoveData_t
|
||
|
{
|
||
|
CBaseTFVehicle *m_pVehicle;
|
||
|
};
|
||
|
|
||
|
// ------------------------------------------------------------------------ //
|
||
|
// The base class that all vehicles in tf2 will derive from
|
||
|
// ------------------------------------------------------------------------ //
|
||
|
#if defined( CLIENT_DLL )
|
||
|
class CBaseTFVehicle : public CBaseObject, public IClientVehicle
|
||
|
#else
|
||
|
class CBaseTFVehicle : public CBaseObject, public IServerVehicle
|
||
|
#endif
|
||
|
{
|
||
|
DECLARE_CLASS( CBaseTFVehicle, CBaseObject );
|
||
|
|
||
|
public:
|
||
|
|
||
|
DECLARE_NETWORKCLASS();
|
||
|
DECLARE_PREDICTABLE();
|
||
|
|
||
|
CBaseTFVehicle();
|
||
|
|
||
|
#if !defined (CLIENT_DLL)
|
||
|
// CBaseEntity overrides
|
||
|
virtual void FinishedBuilding( void );
|
||
|
virtual void DestroyObject( );
|
||
|
virtual void Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value );
|
||
|
virtual bool UseAttachedItem( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value );
|
||
|
virtual void GetVectors(Vector* pForward, Vector* pRight, Vector* pUp) const;
|
||
|
|
||
|
virtual bool ClientCommand( CBaseTFPlayer *pPlayer, const CCommand &args );
|
||
|
|
||
|
// IVehicle overrides
|
||
|
virtual IServerVehicle* GetServerVehicle() { return this; }
|
||
|
|
||
|
virtual CBaseEntity* GetVehicleEnt();
|
||
|
|
||
|
// Get and set the current driver.
|
||
|
virtual void SetPassenger( int nRole, CBasePlayer *pEnt );
|
||
|
|
||
|
// Where do we get out of the vehicle?
|
||
|
virtual bool GetPassengerExitPoint( int nRole, Vector *pExitPoint, QAngle *pAngles );
|
||
|
|
||
|
virtual Class_T ClassifyPassenger( CBasePlayer *pPassenger, Class_T defaultClassification ) { return defaultClassification; }
|
||
|
virtual float DamageModifier ( CTakeDamageInfo &info ) { return 1.0; }
|
||
|
virtual const vehicleparams_t *GetVehicleParams( void ) { return NULL; }
|
||
|
|
||
|
virtual bool IsVehicleUpright( void ) { return true; }
|
||
|
virtual bool IsPassengerEntering( void ) { Assert( 0 ); return true; }
|
||
|
virtual bool IsPassengerExiting( void ) { Assert( 0 ); return true; }
|
||
|
|
||
|
// NPC Driving
|
||
|
virtual bool NPC_CanDrive( void ) { return true; }
|
||
|
virtual void NPC_SetDriver( CNPC_VehicleDriver *pDriver ) { return; }
|
||
|
virtual void NPC_DriveVehicle( void ) { return; }
|
||
|
virtual void NPC_ThrottleCenter( void ) { return; }
|
||
|
virtual void NPC_ThrottleReverse( void ) { return; }
|
||
|
virtual void NPC_ThrottleForward( void ) { return; }
|
||
|
virtual void NPC_Brake( void ) { return; }
|
||
|
virtual void NPC_TurnLeft( float flDegrees ) { return; }
|
||
|
virtual void NPC_TurnRight( float flDegrees ) { return; }
|
||
|
virtual void NPC_TurnCenter( void ) { return; }
|
||
|
virtual void NPC_PrimaryFire( void ) { return; }
|
||
|
virtual void NPC_SecondaryFire( void ) { return; }
|
||
|
virtual bool NPC_HasPrimaryWeapon( void ) { return false; }
|
||
|
virtual bool NPC_HasSecondaryWeapon( void ) { return false; }
|
||
|
virtual void NPC_AimPrimaryWeapon( Vector vecTarget ) { return; }
|
||
|
virtual void NPC_AimSecondaryWeapon( Vector vecTarget ) { return; }
|
||
|
|
||
|
// Weapon handling
|
||
|
virtual void Weapon_PrimaryRanges( float *flMinRange, float *flMaxRange ) { *flMinRange = 0; *flMaxRange = 0; }
|
||
|
virtual void Weapon_SecondaryRanges( float *flMinRange, float *flMaxRange ) { *flMinRange = 0; *flMaxRange = 0; }
|
||
|
virtual float Weapon_PrimaryCanFireAt( void ) { return gpGlobals->curtime; } // Return the time at which this vehicle's primary weapon can fire again
|
||
|
virtual float Weapon_SecondaryCanFireAt( void ) { return gpGlobals->curtime; } // Return the time at which this vehicle's secondary weapon can fire again
|
||
|
|
||
|
// Vehicles dont want to attach to anything they're built upon
|
||
|
virtual bool ShouldAttachToParent( void ) { return false; }
|
||
|
|
||
|
virtual bool MustNotBeBuiltInConstructionYard( void ) const { return false; }
|
||
|
|
||
|
// Purpose: Try to board the vehicle
|
||
|
void AttemptToBoardVehicle( CBaseTFPlayer *pPlayer );
|
||
|
|
||
|
// Figure out which role of a parent vehicle this vehicle is sitting in..
|
||
|
int GetParentVehicleRole();
|
||
|
|
||
|
// Purpose:
|
||
|
void GetPassengerExitPoint( CBasePlayer *pPlayer, int nRole, Vector *pAbsPosition, QAngle *pAbsAngles );
|
||
|
int GetEntryAnimForPoint( const Vector &vecPoint );
|
||
|
int GetExitAnimToUse( Vector &vecEyeExitEndpoint, bool &bAllPointsBlocked );
|
||
|
void HandleEntryExitFinish( bool bExitAnimOn, bool bResetAnim );
|
||
|
void HandlePassengerEntry( CBasePlayer *pPlayer, bool bAllowEntryOutsideZone = false );
|
||
|
bool HandlePassengerExit( CBasePlayer *pPlayer );
|
||
|
|
||
|
// Deterioration
|
||
|
void VehicleDeteriorationThink( void );
|
||
|
void VehiclePassengerThink( void );
|
||
|
|
||
|
#endif
|
||
|
|
||
|
bool IsReadyToDrive( void );
|
||
|
|
||
|
virtual bool IsAVehicle( void ) { return true; }
|
||
|
|
||
|
// Get a position in *local space* inside the vehicle for the player to start at
|
||
|
virtual void GetPassengerStartPoint( int nRole, Vector *pPoint, QAngle *pAngles );
|
||
|
|
||
|
#if defined( CLIENT_DLL )
|
||
|
// C_BaseEntity overrides
|
||
|
virtual IClientVehicle* GetClientVehicle() { return this; }
|
||
|
|
||
|
virtual C_BaseEntity *GetVehicleEnt();
|
||
|
|
||
|
virtual void ClientThink();
|
||
|
|
||
|
// Fills in the unperterbed view position for a particular role.
|
||
|
|
||
|
// Prediction
|
||
|
virtual bool ShouldPredict( void );
|
||
|
virtual bool IsPredicted( void ) const { return true; }
|
||
|
|
||
|
// IClientVehicle
|
||
|
|
||
|
// Called at time player enters vehicle
|
||
|
virtual void GetVehicleFOV( float &flFOV ) { return; }
|
||
|
virtual void DrawHudElements( void );
|
||
|
|
||
|
// Get the angles that a player in the specified role should be using for visuals
|
||
|
virtual QAngle GetPassengerAngles( QAngle angCurrent, int nRole );
|
||
|
|
||
|
// Allows the vehicle to restrict view angles
|
||
|
virtual void UpdateViewAngles( C_BasePlayer *pLocalPlayer, CUserCmd *pCmd ) {}
|
||
|
virtual void GetVehicleClipPlanes( float &flZNear, float &flZFar ) const {}
|
||
|
|
||
|
bool IsBoostable( void ) { return m_bBoostUpgrade; }
|
||
|
|
||
|
// Hud
|
||
|
virtual void DrawHudBoostData( void );
|
||
|
virtual void SetupCrosshair( void );
|
||
|
|
||
|
#endif
|
||
|
|
||
|
int LocateEntryPoint( CBaseTFPlayer *pPlayer, float* fBest2dDistanceSqr= NULL );
|
||
|
|
||
|
// This lets the object decide whether or not it wants to use the ThirdPersonCameraOrigin attachment for its view.
|
||
|
// The manned guns use first-person when they're on the ground and third-person when they're in a vehicle.
|
||
|
virtual bool ShouldUseThirdPersonVehicleView();
|
||
|
virtual void GetVehicleViewPosition( int nRole, Vector *pOrigin, QAngle *pAngles, float *pFOV = NULL );
|
||
|
virtual bool GetRoleViewPosition( int nRole, Vector *pVehicleEyeOrigin, QAngle *pVehicleEyeAngles );
|
||
|
virtual bool GetRoleAbsViewPosition( int nRole, Vector *pAbsVehicleEyeOrigin, QAngle *pAbsVehicleEyeAngles );
|
||
|
|
||
|
// Can a given passenger take damage?
|
||
|
virtual bool IsPassengerDamagable( int nRole ) { return (nRole != VEHICLE_DRIVER); }
|
||
|
|
||
|
|
||
|
virtual void Spawn();
|
||
|
virtual void SetupMove( CBasePlayer *player, CUserCmd *ucmd, IMoveHelper *pHelper, CMoveData *move );
|
||
|
virtual void ProcessMovement( CBasePlayer *pPlayer, CMoveData *pMove ) {}
|
||
|
virtual void FinishMove( CBasePlayer *player, CUserCmd *ucmd, CMoveData *move );
|
||
|
virtual void ItemPostFrame( CBasePlayer *pPassenger );
|
||
|
|
||
|
virtual CBasePlayer* GetPassenger( int nRole = VEHICLE_DRIVER );
|
||
|
virtual int GetPassengerRole( CBasePlayer *pEnt );
|
||
|
|
||
|
// Does the player use his normal weapons while in this mode?
|
||
|
virtual bool IsPassengerUsingStandardWeapons( int nRole = VEHICLE_DRIVER ) { return false; }
|
||
|
|
||
|
virtual Vector GetSoundEmissionOrigin() const;
|
||
|
|
||
|
// Returns the driver as a tfplayer pointer
|
||
|
CBaseTFPlayer *GetDriverPlayer();
|
||
|
|
||
|
int GetMaxPassengerCount() const;
|
||
|
int GetPassengerCount() const;
|
||
|
|
||
|
// Is a particular player in the vehicle?
|
||
|
bool IsPlayerInVehicle( CBaseTFPlayer *pPlayer );
|
||
|
|
||
|
void ResetDeteriorationTime( void );
|
||
|
|
||
|
// Driver controlled guns
|
||
|
void SetDriverGun( CBaseObjectDriverGun *pGun );
|
||
|
void VehicleDriverGunThink( void );
|
||
|
|
||
|
protected:
|
||
|
enum
|
||
|
{
|
||
|
MAX_PASSENGERS = 4,
|
||
|
MAX_PASSENGER_BITS = 3
|
||
|
};
|
||
|
|
||
|
// Can we get into the vehicle?
|
||
|
virtual bool CanGetInVehicle( CBaseTFPlayer *pPlayer );
|
||
|
|
||
|
// Here's where we deal with weapons
|
||
|
virtual void OnItemPostFrame( CBaseTFPlayer *pDriver );
|
||
|
|
||
|
// Specify the number of roles we can have
|
||
|
void SetMaxPassengerCount( int nMaxPassengers );
|
||
|
|
||
|
bool IsValidExitPoint( int nRole, Vector *pExitPoint, QAngle *pAngles );
|
||
|
int GetEmptyRole( void );
|
||
|
|
||
|
private:
|
||
|
#if !defined (CLIENT_DLL)
|
||
|
// Get the parent vehicle of this vehicle..
|
||
|
CBaseTFVehicle *GetParentVehicle();
|
||
|
|
||
|
// Get a position in *world space* inside the vehicle for the player to exit at
|
||
|
void GetInitialPassengerExitPoint( int nRole, Vector *pAbsPoint, QAngle *pAbsAngles );
|
||
|
|
||
|
// Figure out which role of a vehicle a child vehicle is sitting in..
|
||
|
int GetChildVehicleRole( CBaseTFVehicle *pChild );
|
||
|
#endif
|
||
|
|
||
|
private:
|
||
|
typedef CHandle<CBaseTFPlayer> CPlayerHandle;
|
||
|
CNetworkArray( CPlayerHandle, m_hPassengers, MAX_PASSENGERS );
|
||
|
CNetworkVar( int, m_nMaxPassengers );
|
||
|
|
||
|
// Driver controlled gun
|
||
|
CNetworkHandle( CBaseObjectDriverGun, m_hDriverGun );
|
||
|
|
||
|
#if defined( CLIENT_DLL )
|
||
|
|
||
|
CHudTexture *m_pIconDefaultCrosshair;
|
||
|
|
||
|
bool m_bBoostUpgrade;
|
||
|
int m_nBoostTimeLeft;
|
||
|
|
||
|
private:
|
||
|
CBaseTFVehicle( const CBaseTFVehicle & ); // not defined, not accessible
|
||
|
#endif
|
||
|
};
|
||
|
|
||
|
#endif // BASETFVEHICLE_H
|