aboutsummaryrefslogtreecommitdiff
path: root/sp/src/game/server/hl2/cbasehelicopter.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/cbasehelicopter.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/cbasehelicopter.h')
-rw-r--r--sp/src/game/server/hl2/cbasehelicopter.h294
1 files changed, 294 insertions, 0 deletions
diff --git a/sp/src/game/server/hl2/cbasehelicopter.h b/sp/src/game/server/hl2/cbasehelicopter.h
new file mode 100644
index 00000000..7a636cb2
--- /dev/null
+++ b/sp/src/game/server/hl2/cbasehelicopter.h
@@ -0,0 +1,294 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose: Base class for helicopters & helicopter-type vehicles
+//
+// $NoKeywords: $
+//=============================================================================//
+
+#ifndef CBASEHELICOPTER_H
+#define CBASEHELICOPTER_H
+
+#ifdef _WIN32
+#pragma once
+#endif
+
+#include "ai_basenpc.h"
+#include "ai_trackpather.h"
+
+
+//---------------------------------------------------------
+// Helicopter flags
+//---------------------------------------------------------
+enum HelicopterFlags_t
+{
+ BITS_HELICOPTER_GUN_ON = 0x00000001, // Gun is on and aiming
+ BITS_HELICOPTER_MISSILE_ON = 0x00000002, // Missile turrets are on and aiming
+};
+
+
+//---------------------------------------------------------
+//---------------------------------------------------------
+#define SF_NOWRECKAGE 0x08
+#define SF_NOROTORWASH 0x20
+#define SF_AWAITINPUT 0x40
+
+//---------------------------------------------------------
+//---------------------------------------------------------
+// Pathing data
+#define BASECHOPPER_LEAD_DISTANCE 800.0f
+#define BASECHOPPER_MIN_CHASE_DIST_DIFF 128.0f // Distance threshold used to determine when a target has moved enough to update our navigation to it
+#define BASECHOPPER_AVOID_DIST 256.0f
+
+#define BASECHOPPER_MAX_SPEED 400.0f
+#define BASECHOPPER_MAX_FIRING_SPEED 250.0f
+#define BASECHOPPER_MIN_ROCKET_DIST 1000.0f
+#define BASECHOPPER_MAX_GUN_DIST 2000.0f
+
+//---------------------------------------------------------
+// Physics rotor pushing
+#define BASECHOPPER_WASH_RADIUS 256
+#define BASECHOPPER_WASH_PUSH_MIN 30 // Initial force * their mass applied to objects in the wash
+#define BASECHOPPER_WASH_PUSH_MAX 40 // Maximum force * their mass applied to objects in the wash
+#define BASECHOPPER_WASH_RAMP_TIME 1.0 // Time it takes to ramp from the initial to the max force on an object in the wash (at the center of the wash)
+#define BASECHOPPER_WASH_MAX_MASS 300 // Don't attempt to push anything over this mass
+#define BASECHOPPER_WASH_MAX_OBJECTS 6 // Maximum number of objects the wash will push at once
+
+// Wash physics pushing
+struct washentity_t
+{
+ DECLARE_DATADESC();
+
+ EHANDLE hEntity;
+ float flWashStartTime;
+};
+
+#define BASECHOPPER_WASH_ALTITUDE 1024.0f
+
+//=========================================================
+//=========================================================
+
+class CBaseHelicopter : public CAI_TrackPather
+{
+public:
+ DECLARE_CLASS( CBaseHelicopter, CAI_TrackPather );
+
+ DECLARE_DATADESC();
+ DECLARE_SERVERCLASS();
+
+ CBaseHelicopter( void );
+
+ void Spawn( void );
+ void Precache( void );
+ virtual void UpdateOnRemove();
+
+ void Event_Killed( const CTakeDamageInfo &info );
+ void StopLoopingSounds();
+
+ int BloodColor( void ) { return DONT_BLEED; }
+ void GibMonster( void );
+
+ Class_T Classify ( void ) { return CLASS_COMBINE; }
+
+ void CallDyingThink( void ) { DyingThink(); }
+
+ bool HasEnemy( void ) { return GetEnemy() != NULL; }
+ virtual void GatherEnemyConditions( CBaseEntity *pEnemy );
+ virtual bool ChooseEnemy( void );
+ virtual void HelicopterPostThink( void ) { };
+ virtual void FlyTouch( CBaseEntity *pOther );
+ virtual void CrashTouch( CBaseEntity *pOther );
+ virtual void HelicopterThink( void );
+ virtual void DyingThink( void );
+ virtual void NullThink( void );
+ virtual void Startup ( void );
+
+ virtual void Flight( void );
+
+ virtual void ShowDamage( void ) {};
+
+ void UpdatePlayerDopplerShift( void );
+
+ virtual void Hunt( void );
+
+ virtual bool IsCrashing( void ) { return m_lifeState != LIFE_ALIVE; }
+ virtual float GetAcceleration( void ) { return 5; }
+
+ virtual void ApplySidewaysDrag( const Vector &vecRight );
+ virtual void ApplyGeneralDrag( void );
+
+ void TraceAttack( const CTakeDamageInfo &info, const Vector &vecDir, trace_t *ptr, CDmgAccumulator *pAccumulator );
+
+ virtual bool FireGun( void );
+
+ virtual float GetRotorVolume( void );
+ virtual void InitializeRotorSound( void );
+ virtual void UpdateRotorSoundPitch( int iPitch );
+
+ virtual void AimRocketGun(void) {};
+ virtual void FireRocket( Vector vLaunchPos, Vector vLaunchDir ) {};
+
+ virtual bool GetTrackPatherTarget( Vector *pPos );
+ virtual CBaseEntity *GetTrackPatherTargetEnt();
+
+ void DrawDebugGeometryOverlays(void);
+
+ // Rotor washes
+ virtual void DrawRotorWash( float flAltitude, const Vector &vecRotorOrigin );
+ void DoRotorPhysicsPush( const Vector &vecRotorOrigin, float flAltitude );
+ bool DoWashPush( washentity_t *pWash, const Vector &vecWashOrigin );
+ void StopRotorWash( void );
+
+ // Purpose: Marks the entity for deletion
+ void InputKill( inputdata_t &inputdata );
+ void DelayedKillThink( );
+
+ virtual void SetTransmit( CCheckTransmitInfo *pInfo, bool bAlways );
+
+ // Helicopters never burn
+ virtual void Ignite( float flFlameLifetime, bool bNPCOnly, float flSize, bool bCalledByLevelDesigner ) { return; }
+
+
+protected:
+ void HelicopterMove( );
+
+ // Updates the enemy
+ void UpdateEnemy();
+
+ // Override the desired position if your derived helicopter is doing something special
+ virtual void UpdateDesiredPosition( void );
+
+ // Updates the facing direction
+ virtual void UpdateFacingDirection();
+
+ // Fire weapons
+ void FireWeapons();
+
+ // Computes the actual position to fly to
+ void ComputeActualTargetPosition( float flSpeed, float flTime, float flPerpDist, Vector *pDest, bool bApplyNoise = true );
+
+ // Gets the max speed of the helicopter
+ virtual float GetMaxSpeed();
+ virtual float GetMaxSpeedFiring();
+
+ // Updates the enemy
+ virtual float EnemySearchDistance( );
+
+ // Rotor wash think
+ void RotorWashThink( void );
+
+ // Purpose: Push an airboat in our wash
+ void DoWashPushOnAirboat( CBaseEntity *pAirboat, const Vector &vecWashToAirboat, float flWashAmount );
+
+ // Updates the rotor wash volume
+ virtual void UpdateRotorWashVolume();
+
+ // Rotor sound
+ void InputEnableRotorSound( inputdata_t &inputdata );
+ void InputDisableRotorSound( inputdata_t &inputdata );
+
+protected:
+ CSoundPatch *m_pRotorSound; // Rotor loop played when the player can see the helicopter
+ CSoundPatch *m_pRotorBlast; // Sound played when the helicopter's pushing around physics objects
+
+ float m_flForce;
+ int m_fHelicopterFlags;
+
+ Vector m_vecDesiredFaceDir;
+
+ float m_flLastSeen;
+ float m_flPrevSeen;
+
+ int m_iSoundState; // don't save this
+
+ Vector m_vecTargetPosition;
+
+ float m_flMaxSpeed; // Maximum speed of the helicopter.
+ float m_flMaxSpeedFiring; // Maximum speed of the helicopter whilst firing guns.
+
+ float m_flGoalSpeed; // Goal speed
+ float m_flInitialSpeed;
+
+ float m_flRandomOffsetTime;
+ Vector m_vecRandomOffset;
+ float m_flRotorWashEntitySearchTime;
+ bool m_bSuppressSound;
+
+ EHANDLE m_hRotorWash; // Attached rotorwash entity
+
+ // Inputs
+ void InputActivate( inputdata_t &inputdata );
+
+ // Inputs
+ void InputGunOn( inputdata_t &inputdata );
+ void InputGunOff( inputdata_t &inputdata );
+ void InputMissileOn( inputdata_t &inputdata );
+ void InputMissileOff( inputdata_t &inputdata );
+ void InputEnableRotorWash( inputdata_t &inputdata );
+ void InputDisableRotorWash( inputdata_t &inputdata );
+ void InputMoveTopSpeed( inputdata_t &inputdata ); // Causes the helicopter to immediately accelerate to its desired velocity
+ void InputMoveSpecifiedSpeed( inputdata_t &inputdata );
+ void InputSetAngles( inputdata_t &inputdata ); // Sets the angles of the helicopter
+
+protected:
+ // Custom conservative collision volumes
+ Vector m_cullBoxMins;
+ Vector m_cullBoxMaxs;
+
+ // Wash physics pushing
+ CUtlVector< washentity_t > m_hEntitiesPushedByWash;
+
+ void SetStartupTime( float time ) { m_flStartupTime = time; }
+private:
+ CNetworkVar( float, m_flStartupTime );
+};
+
+//-----------------------------------------------------------------------------
+// This entity is used to create little force spheres that the helicopter
+// should avoid.
+//-----------------------------------------------------------------------------
+class CAvoidSphere : public CBaseEntity
+{
+ DECLARE_DATADESC();
+
+public:
+ DECLARE_CLASS( CAvoidSphere, CBaseEntity );
+
+ void Init( float flRadius );
+ virtual void Activate();
+ virtual void UpdateOnRemove();
+
+ static void ComputeAvoidanceForces( CBaseEntity *pEntity, float flEntityRadius, float flAvoidTime, Vector *pVecAvoidForce );
+
+private:
+ typedef CHandle<CAvoidSphere> AvoidSphereHandle_t;
+
+ float m_flRadius;
+
+ static CUtlVector< AvoidSphereHandle_t > s_AvoidSpheres;
+};
+
+
+//-----------------------------------------------------------------------------
+// This entity is used to create little force boxes that the helicopter
+// should avoid.
+//-----------------------------------------------------------------------------
+class CAvoidBox : public CBaseEntity
+{
+ DECLARE_DATADESC();
+
+public:
+ DECLARE_CLASS( CAvoidBox, CBaseEntity );
+
+ virtual void Spawn( );
+ virtual void Activate();
+ virtual void UpdateOnRemove();
+
+ static void ComputeAvoidanceForces( CBaseEntity *pEntity, float flEntityRadius, float flAvoidTime, Vector *pVecAvoidForce );
+
+private:
+ typedef CHandle<CAvoidBox> AvoidBoxHandle_t;
+ static CUtlVector< AvoidBoxHandle_t > s_AvoidBoxes;
+};
+
+
+#endif // CBASEHELICOPTER_H