aboutsummaryrefslogtreecommitdiff
path: root/sp/src/game/server/hl2/vehicle_crane.h
diff options
context:
space:
mode:
authorJoe Ludwig <[email protected]>2013-06-26 15:22:04 -0700
committerJoe Ludwig <[email protected]>2013-06-26 15:22:04 -0700
commit39ed87570bdb2f86969d4be821c94b722dc71179 (patch)
treeabc53757f75f40c80278e87650ea92808274aa59 /sp/src/game/server/hl2/vehicle_crane.h
downloadsource-sdk-2013-39ed87570bdb2f86969d4be821c94b722dc71179.tar.xz
source-sdk-2013-39ed87570bdb2f86969d4be821c94b722dc71179.zip
First version of the SOurce SDK 2013
Diffstat (limited to 'sp/src/game/server/hl2/vehicle_crane.h')
-rw-r--r--sp/src/game/server/hl2/vehicle_crane.h250
1 files changed, 250 insertions, 0 deletions
diff --git a/sp/src/game/server/hl2/vehicle_crane.h b/sp/src/game/server/hl2/vehicle_crane.h
new file mode 100644
index 00000000..d692c365
--- /dev/null
+++ b/sp/src/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