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.
251 lines
7.6 KiB
251 lines
7.6 KiB
5 years ago
|
//========= 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
|