source-engine/game/server/hl2/vehicle_crane.h

251 lines
7.6 KiB
C
Raw Normal View History

2020-04-22 16:56:21 +00:00
//========= 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