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.
250 lines
7.6 KiB
250 lines
7.6 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
// $NoKeywords: $ |
|
// |
|
//=============================================================================// |
|
// |
|
// Purpose: |
|
// |
|
//============================================================================= |
|
|
|
#ifndef VEHICLE_CRANE_H |
|
#define VEHICLE_CRANE_H |
|
#ifdef _WIN32 |
|
#pragma once |
|
#endif |
|
|
|
#include "physobj.h" |
|
#include "rope.h" |
|
#include "rope_shared.h" |
|
#include "physics_bone_follower.h" |
|
|
|
#define CRANE_EXTENSION_RATE_MAX 0.01 |
|
#define CRANE_TURN_RATE_MAX 1.2 |
|
#define MAXIMUM_CRANE_PICKUP_MASS 10000 |
|
#define MINIMUM_CRANE_PICKUP_MASS 500 |
|
|
|
#define MAX_CRANE_FLAT_REACH 1400.0 |
|
#define MIN_CRANE_FLAT_REACH 700.0 |
|
#define CRANE_EXTENSION_ACCEL 0.006 |
|
#define CRANE_EXTENSION_DECEL 0.02 |
|
#define CRANE_TURN_ACCEL 0.2 |
|
#define CRANE_DECEL 0.5 |
|
|
|
#define CRANE_SLOWRAISE_TIME 5.0 |
|
|
|
// Turning stats |
|
enum |
|
{ |
|
TURNING_NOT, |
|
TURNING_LEFT, |
|
TURNING_RIGHT, |
|
}; |
|
|
|
class CPropCrane; |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: This is the entity we attach to the tip of the crane and dangle the cable from |
|
//----------------------------------------------------------------------------- |
|
class CCraneTip : public CBaseAnimating |
|
{ |
|
DECLARE_CLASS( CCraneTip, CBaseAnimating ); |
|
public: |
|
DECLARE_DATADESC(); |
|
|
|
~CCraneTip( void ) |
|
{ |
|
if ( m_pSpring ) |
|
{ |
|
physenv->DestroySpring( m_pSpring ); |
|
} |
|
} |
|
|
|
void Spawn( void ); |
|
void Precache( void ); |
|
|
|
bool CreateConstraint( CBaseAnimating *pMagnet, IPhysicsConstraintGroup *pGroup ); |
|
static CCraneTip *Create( CBaseAnimating *pCraneMagnet, IPhysicsConstraintGroup *pGroup, const Vector &vecOrigin, const QAngle &vecAngles ); |
|
|
|
public: |
|
IPhysicsSpring *m_pSpring; |
|
}; |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Crane vehicle server |
|
//----------------------------------------------------------------------------- |
|
class CCraneServerVehicle : public CBaseServerVehicle |
|
{ |
|
typedef CBaseServerVehicle BaseClass; |
|
// IServerVehicle |
|
public: |
|
void GetVehicleViewPosition( int nRole, Vector *pAbsOrigin, QAngle *pAbsAngles, float *pFOV = NULL ); |
|
|
|
// NPC Driving |
|
void NPC_SetDriver( CNPC_VehicleDriver *pDriver ); |
|
void NPC_DriveVehicle( void ); |
|
|
|
virtual bool IsPassengerEntering( void ) { return false; } // NOTE: This mimics the scenario HL2 would have seen |
|
virtual bool IsPassengerExiting( void ) { return false; } |
|
|
|
protected: |
|
CPropCrane *GetCrane( void ); |
|
}; |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
class CPropCrane : public CBaseProp, public IDrivableVehicle |
|
{ |
|
DECLARE_CLASS( CPropCrane, CBaseProp ); |
|
public: |
|
DECLARE_DATADESC(); |
|
DECLARE_SERVERCLASS(); |
|
|
|
CPropCrane( void ) |
|
{ |
|
m_ServerVehicle.SetVehicle( this ); |
|
} |
|
|
|
~CPropCrane( void ) |
|
{ |
|
physenv->DestroyConstraintGroup( m_pConstraintGroup ); |
|
} |
|
|
|
// CBaseEntity |
|
virtual void Precache( void ); |
|
void Spawn( void ); |
|
void Activate( void ); |
|
void UpdateOnRemove( void ); |
|
bool CreateVPhysics( void ); |
|
void InitCraneSpeeds( void ); |
|
void Think(void); |
|
virtual int ObjectCaps( void ) { return BaseClass::ObjectCaps() | FCAP_IMPULSE_USE; }; |
|
virtual void Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ); |
|
virtual void DrawDebugGeometryOverlays( void ); |
|
|
|
virtual bool PassengerShouldReceiveDamage( CTakeDamageInfo &info ) |
|
{ |
|
if ( info.GetDamageType() & DMG_VEHICLE ) |
|
return true; |
|
|
|
return (info.GetDamageType() & (DMG_RADIATION|DMG_BLAST) ) == 0; |
|
} |
|
|
|
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 ); |
|
|
|
void PlayerControlInit( CBasePlayer *pPlayer ); |
|
void PlayerControlShutdown( void ); |
|
void ResetUseKey( CBasePlayer *pPlayer ); |
|
|
|
void DriveCrane( int iDriverButtons, int iButtonsPressed, float flNPCSteering = 0.0 ); |
|
void RunCraneMovement( float flTime ); |
|
|
|
void TurnMagnetOn( void ); |
|
void TurnMagnetOff( void ); |
|
const Vector &GetCraneTipPosition( void ); |
|
float GetExtensionRate( void ) { return m_flExtensionRate; } |
|
float GetTurnRate( void ) { return m_flTurn; } |
|
float GetMaxTurnRate( void ) { return m_flMaxTurnSpeed; } |
|
CPhysMagnet *GetMagnet( void ) { return m_hCraneMagnet; } |
|
float GetTotalMassOnCrane( void ) { return m_hCraneMagnet->GetTotalMassAttachedObjects(); } |
|
bool IsDropping( void ) { return m_bDropping; } |
|
|
|
// Inputs |
|
void InputLock( inputdata_t &inputdata ); |
|
void InputUnlock( inputdata_t &inputdata ); |
|
void InputForcePlayerIn( inputdata_t &inputdata ); |
|
|
|
// Crane handling |
|
void GetCraneTipPosition( Vector *vecOrigin, QAngle *vecAngles ); |
|
void RecalculateCraneTip( void ); |
|
void GetVectors(Vector* pForward, Vector* pRight, Vector* pUp) const; |
|
|
|
void SetNPCDriver( CNPC_VehicleDriver *pDriver ); |
|
|
|
// IDrivableVehicle |
|
public: |
|
virtual CBaseEntity *GetDriver( void ); |
|
virtual void ItemPostFrame( CBasePlayer *pPlayer ); |
|
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; } |
|
|
|
// If this is a vehicle, returns the vehicle interface |
|
virtual IServerVehicle *GetServerVehicle() { return &m_ServerVehicle; } |
|
|
|
protected: |
|
// Contained IServerVehicle |
|
CCraneServerVehicle m_ServerVehicle; |
|
// Contained Bone Follower manager |
|
CBoneFollowerManager m_BoneFollowerManager; |
|
|
|
private: |
|
|
|
CNetworkHandle( CBasePlayer, m_hPlayer ); |
|
CNetworkVar( bool, m_bMagnetOn ); |
|
|
|
// NPC Driving |
|
CHandle<CNPC_VehicleDriver> m_hNPCDriver; |
|
int m_nNPCButtons; |
|
|
|
// Entering / Exiting |
|
bool m_bLocked; |
|
CNetworkVar( bool, m_bEnterAnimOn ); |
|
CNetworkVar( bool, m_bExitAnimOn ); |
|
CNetworkVector( m_vecEyeExitEndpoint ); |
|
COutputEvent m_playerOn; |
|
COutputEvent m_playerOff; |
|
|
|
// Turning |
|
int m_iTurning; |
|
bool m_bStartSoundAtCrossover; |
|
float m_flTurn; |
|
|
|
// Crane arm extension / retraction |
|
bool m_bExtending; |
|
float m_flExtension; |
|
float m_flExtensionRate; |
|
|
|
// Magnet movement |
|
bool m_bDropping; |
|
float m_flNextDangerSoundTime; |
|
float m_flNextCreakSound; |
|
float m_flNextDropAllowedTime; |
|
float m_flSlowRaiseTime; |
|
|
|
// Speeds |
|
float m_flMaxExtensionSpeed; |
|
float m_flMaxTurnSpeed; |
|
float m_flExtensionAccel; |
|
float m_flExtensionDecel; |
|
float m_flTurnAccel; |
|
float m_flTurnDecel; |
|
|
|
// Cable Tip & Magnet |
|
string_t m_iszMagnetName; |
|
CHandle<CPhysMagnet> m_hCraneMagnet; |
|
CHandle<CCraneTip> m_hCraneTip; |
|
CHandle<CRopeKeyframe> m_hRope; |
|
IPhysicsConstraintGroup *m_pConstraintGroup; |
|
|
|
// Vehicle script filename |
|
string_t m_vehicleScript; |
|
}; |
|
|
|
#endif // VEHICLE_CRANE_H
|
|
|