diff options
| author | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
|---|---|---|
| committer | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
| commit | 3bf9df6b2785fa6d951086978a3e66f49427166a (patch) | |
| tree | 2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /game/server/hl2/vehicle_crane.h | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'game/server/hl2/vehicle_crane.h')
| -rw-r--r-- | game/server/hl2/vehicle_crane.h | 250 |
1 files changed, 250 insertions, 0 deletions
diff --git a/game/server/hl2/vehicle_crane.h b/game/server/hl2/vehicle_crane.h new file mode 100644 index 0000000..57d25e8 --- /dev/null +++ b/game/server/hl2/vehicle_crane.h @@ -0,0 +1,250 @@ +//========= 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 |