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/vehicle_baseserver.h | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'game/server/vehicle_baseserver.h')
| -rw-r--r-- | game/server/vehicle_baseserver.h | 328 |
1 files changed, 328 insertions, 0 deletions
diff --git a/game/server/vehicle_baseserver.h b/game/server/vehicle_baseserver.h new file mode 100644 index 0000000..cdf1f75 --- /dev/null +++ b/game/server/vehicle_baseserver.h @@ -0,0 +1,328 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +//=============================================================================// + +#ifndef VEHICLE_BASESERVER_H +#define VEHICLE_BASESERVER_H +#ifdef _WIN32 +#pragma once +#endif + +#include "vehicle_sounds.h" +#include "entityblocker.h" + +class CSoundPatch; + +struct vbs_sound_update_t +{ + float flFrameTime; + float flCurrentSpeedFraction; + float flWorldSpaceSpeed; + bool bThrottleDown; + bool bReverse; + bool bTurbo; + bool bVehicleInWater; + bool bExitVehicle; + + void Defaults() + { + flFrameTime = gpGlobals->frametime; + flCurrentSpeedFraction = 0; + flWorldSpaceSpeed = 0; + bThrottleDown = false; + bReverse = false; + bTurbo = false; + bVehicleInWater = false; + bExitVehicle = false; + } +}; + +// ----------------------------------------- +// Information about the passenger in the car +// ----------------------------------------- +class CPassengerInfo +{ +public: + CPassengerInfo( void ) : m_nRole( -1 ), m_nSeat( -1 ), m_strRoleName( NULL_STRING ), m_strSeatName( NULL_STRING ) {} + + DECLARE_SIMPLE_DATADESC(); + + int GetSeat( void ) const { return m_nSeat; } + int GetRole( void ) const { return m_nRole; } + CBaseCombatCharacter *GetPassenger( void ) const { return m_hPassenger; } + +private: + int m_nRole; // Role (by index) + int m_nSeat; // Seat (by index) + string_t m_strRoleName; // Used in restoration for fix-up + string_t m_strSeatName; // Used in restoration for fix-up + CHandle<CBaseCombatCharacter> m_hPassenger; // Actual passenger + + friend class CBaseServerVehicle; +}; + +// ----------------------------------------- +// Seat transition information (animation and priority) +// ----------------------------------------- + +class CPassengerSeatTransition +{ +public: + CPassengerSeatTransition( void ) : m_strAnimationName( NULL_STRING ), m_nPriority( -1 ) {}; + + string_t GetAnimationName( void ) const { return m_strAnimationName; } + int GetPriority( void ) const { return m_nPriority; } + +private: + string_t m_strAnimationName; // Name of animation to play + int m_nPriority; // Priority of the transition + + friend class CBaseServerVehicle; +}; + +// ----------------------------------------- +// Seat in a vehicle (attachment and a collection of animations to reach it) +// ----------------------------------------- +class CPassengerSeat +{ +public: + CPassengerSeat( void ) : m_nAttachmentID( -1 ) {}; + int GetAttachmentID( void ) const { return m_nAttachmentID; } + +private: + string_t m_strSeatName; // Used for save/load fixup + int m_nAttachmentID; // Goal attachment + CUtlVector<CPassengerSeatTransition> m_EntryTransitions; // Entry information + CUtlVector<CPassengerSeatTransition> m_ExitTransitions; // Exit information + + friend class CBaseServerVehicle; +}; + +// ----------------------------------------- +// Passenger role information +// ----------------------------------------- +class CPassengerRole +{ +public: + CPassengerRole( void ) : m_strName( NULL_STRING ) {}; + string_t GetName( void ) const { return m_strName; } + +private: + string_t m_strName; // Name of the set + CUtlVector<CPassengerSeat> m_PassengerSeats; // Passenger info + + friend class CBaseServerVehicle; +}; + +//----------------------------------------------------------------------------- +// Purpose: Base class for drivable vehicle handling. Contain it in your +// drivable vehicle. +//----------------------------------------------------------------------------- +class CBaseServerVehicle : public IServerVehicle +{ +public: + DECLARE_SIMPLE_DATADESC(); + DECLARE_CLASS_NOBASE( CBaseServerVehicle ); + + CBaseServerVehicle( void ); + ~CBaseServerVehicle( void ); + + virtual void Precache( void ); + +// IVehicle +public: + virtual CBaseCombatCharacter *GetPassenger( int nRole = VEHICLE_ROLE_DRIVER ); + + virtual int GetPassengerRole( CBaseCombatCharacter *pPassenger ); + virtual void GetVehicleViewPosition( int nRole, Vector *pOrigin, QAngle *pAngles, float *pFOV = NULL ); + virtual bool IsPassengerUsingStandardWeapons( int nRole = VEHICLE_ROLE_DRIVER ) { return false; } + virtual void SetupMove( CBasePlayer *player, CUserCmd *ucmd, IMoveHelper *pHelper, CMoveData *move ); + virtual void ProcessMovement( CBasePlayer *pPlayer, CMoveData *pMoveData ); + virtual void FinishMove( CBasePlayer *player, CUserCmd *ucmd, CMoveData *move ); + virtual void ItemPostFrame( CBasePlayer *pPlayer ); + +// IServerVehicle +public: + virtual CBaseEntity *GetVehicleEnt( void ) { return m_pVehicle; } + virtual void SetPassenger( int nRole, CBaseCombatCharacter *pPassenger ); + virtual bool IsPassengerVisible( int nRole = VEHICLE_ROLE_DRIVER ) { return false; } + virtual bool IsPassengerDamagable( int nRole = VEHICLE_ROLE_DRIVER ) { return true; } + virtual bool PassengerShouldReceiveDamage( CTakeDamageInfo &info ); + + virtual bool IsVehicleUpright( void ) { return true; } + virtual bool IsPassengerEntering( void ) { Assert( 0 ); return false; } + virtual bool IsPassengerExiting( void ) { Assert( 0 ); return false; } + + virtual void HandlePassengerEntry( CBaseCombatCharacter *pPassenger, bool bAllowEntryOutsideZone = false ); + virtual bool HandlePassengerExit( CBaseCombatCharacter *pPassenger ); + + virtual void GetPassengerSeatPoint( int nRole, Vector *pPoint, QAngle *pAngles ); + virtual bool GetPassengerExitPoint( int nRole, Vector *pPoint, QAngle *pAngles ); + virtual Class_T ClassifyPassenger( CBaseCombatCharacter *pPassenger, Class_T defaultClassification ) { return defaultClassification; } + virtual float PassengerDamageModifier( const CTakeDamageInfo &info ) { return 1.0; } + virtual const vehicleparams_t *GetVehicleParams( void ) { return NULL; } + virtual bool IsVehicleBodyInWater( void ) { return false; } + virtual IPhysicsVehicleController *GetVehicleController() { return NULL; } + + // NPC Driving + virtual bool NPC_CanDrive( void ) { return true; } + virtual void NPC_SetDriver( CNPC_VehicleDriver *pDriver ) { return; } + virtual void NPC_DriveVehicle( void ) { return; } + virtual void NPC_ThrottleCenter( void ); + virtual void NPC_ThrottleReverse( void ); + virtual void NPC_ThrottleForward( void ); + virtual void NPC_Brake( void ); + virtual void NPC_TurnLeft( float flDegrees ); + virtual void NPC_TurnRight( float flDegrees ); + virtual void NPC_TurnCenter( void ); + virtual void NPC_PrimaryFire( void ); + virtual void NPC_SecondaryFire( void ); + virtual bool NPC_HasPrimaryWeapon( void ) { return false; } + virtual bool NPC_HasSecondaryWeapon( void ) { return false; } + virtual void NPC_AimPrimaryWeapon( Vector vecTarget ) { return; } + virtual void NPC_AimSecondaryWeapon( Vector vecTarget ) { return; } + + // Weapon handling + virtual void Weapon_PrimaryRanges( float *flMinRange, float *flMaxRange ); + virtual void Weapon_SecondaryRanges( float *flMinRange, float *flMaxRange ); + virtual float Weapon_PrimaryCanFireAt( void ); // Return the time at which this vehicle's primary weapon can fire again + virtual float Weapon_SecondaryCanFireAt( void ); // Return the time at which this vehicle's secondary weapon can fire again + + // ---------------------------------------------------------------------------- + // NPC passenger data + +public: + + bool NPC_AddPassenger( CBaseCombatCharacter *pPassenger, string_t strRoleName, int nSeat ); + bool NPC_RemovePassenger( CBaseCombatCharacter *pPassenger ); + virtual bool NPC_GetPassengerSeatPosition( CBaseCombatCharacter *pPassenger, Vector *vecResultPos, QAngle *vecResultAngle ); + virtual bool NPC_GetPassengerSeatPositionLocal( CBaseCombatCharacter *pPassenger, Vector *vecResultPos, QAngle *vecResultAngles ); + virtual int NPC_GetPassengerSeatAttachment( CBaseCombatCharacter *pPassenger ); + virtual int NPC_GetAvailableSeat( CBaseCombatCharacter *pPassenger, string_t strRoleName, VehicleSeatQuery_e nQueryType ); + bool NPC_HasAvailableSeat( string_t strRoleName ); + + + virtual const PassengerSeatAnims_t *NPC_GetPassengerSeatAnims( CBaseCombatCharacter *pPassenger, PassengerSeatAnimType_t nType ); + virtual CBaseCombatCharacter *NPC_GetPassengerInSeat( int nRoleID, int nSeatID ); + + Vector GetSavedViewOffset( void ) { return m_savedViewOffset; } + +private: + + // Vehicle entering/exiting + void ParseNPCRoles( KeyValues *pModelKeyValues ); + void ParseNPCPassengerSeat( KeyValues *pSetKeyValues, CPassengerSeat *pSeat ); + void ParseNPCSeatTransition( KeyValues *pTransitionKeyValues, CPassengerSeatTransition *pTransition ); + +protected: + + int FindRoleIndexByName( string_t strRoleName ); + int FindSeatIndexByName( int nRoleIndex, string_t strSeatName ); + int NPC_GetAvailableSeat_Any( CBaseCombatCharacter *pPassenger, int nRoleID ); + int NPC_GetAvailableSeat_Nearest( CBaseCombatCharacter *pPassenger, int nRoleID ); + + CPassengerRole *FindOrCreatePassengerRole( string_t strName, int *nIndex = NULL ); + + CUtlVector< CPassengerInfo > m_PassengerInfo; + CUtlVector< CPassengerRole > m_PassengerRoles; // Not save/restored + + // ---------------------------------------------------------------------------- + void ReloadScript(); // debug/tuning +public: + + void UseLegacyExitChecks( bool bState ) { m_bUseLegacyExitChecks = bState; } + void RestorePassengerInfo( void ); + + virtual CBaseEntity *GetDriver( void ); // Player Driving + virtual void ParseEntryExitAnims( void ); + void ParseExitAnim( KeyValues *pkvExitList, bool bEscapeExit ); + virtual bool CheckExitPoint( float yaw, int distance, Vector *pEndPoint ); + virtual int GetEntryAnimForPoint( const Vector &vecPoint ); + virtual int GetExitAnimToUse( Vector &vecEyeExitEndpoint, bool &bAllPointsBlocked ); + virtual void HandleEntryExitFinish( bool bExitAnimOn, bool bResetAnim ); + + virtual void SetVehicle( CBaseEntity *pVehicle ); + IDrivableVehicle *GetDrivableVehicle( void ); + + // Sound handling + bool Initialize( const char *pScriptName ); + virtual void SoundStart(); + virtual void SoundStartDisabled(); + virtual void SoundShutdown( float flFadeTime = 0.0 ); + virtual void SoundUpdate( vbs_sound_update_t ¶ms ); + virtual void PlaySound( vehiclesound iSound ); + virtual void StopSound( vehiclesound iSound ); + virtual void RecalculateSoundGear( vbs_sound_update_t ¶ms ); + void SetVehicleVolume( float flVolume ) { m_flVehicleVolume = clamp( flVolume, 0.0f, 1.0f ); } + + // Rumble + virtual void StartEngineRumble(); + virtual void StopEngineRumble(); + +public: + CBaseEntity *m_pVehicle; + IDrivableVehicle *m_pDrivableVehicle; + + // NPC Driving + int m_nNPCButtons; + int m_nPrevNPCButtons; + float m_flTurnDegrees; + + // Entry / Exit anims + struct entryanim_t + { + int iHitboxGroup; + char szAnimName[128]; + }; + CUtlVector< entryanim_t > m_EntryAnimations; + + struct exitanim_t + { + bool bUpright; + bool bEscapeExit; + char szAnimName[128]; + Vector vecExitPointLocal; // Point the animation leaves the player at when finished + QAngle vecExitAnglesLocal; + }; + + CUtlVector< exitanim_t > m_ExitAnimations; + bool m_bParsedAnimations; + bool m_bUseLegacyExitChecks; // HACK: Choreo vehicles use non-sensical setups to move the player, we need to poll their attachment point positions + int m_iCurrentExitAnim; + Vector m_vecCurrentExitEndPoint; + Vector m_savedViewOffset; + CHandle<CEntityBlocker> m_hExitBlocker; // Entity to prevent other entities blocking the player's exit point during the exit animation + + char m_chPreviousTextureType; + +// sound state + vehiclesounds_t m_vehicleSounds; +private: + float m_flVehicleVolume; + int m_iSoundGear; // The sound "gear" that we're currently in + float m_flSpeedPercentage; + + CSoundPatch *m_pStateSound; + CSoundPatch *m_pStateSoundFade; + sound_states m_soundState; + float m_soundStateStartTime; + float m_lastSpeed; + + void SoundState_OnNewState( sound_states lastState ); + void SoundState_Update( vbs_sound_update_t ¶ms ); + sound_states SoundState_ChooseState( vbs_sound_update_t ¶ms ); + void PlaySound( const char *pSound ); + void StopLoopingSound( float fadeTime = 0.25f ); + void PlayLoopingSound( const char *pSoundName ); + bool PlayCrashSound( float speed ); + bool CheckCrash( vbs_sound_update_t ¶ms ); + const char *StateSoundName( sound_states state ); + void InitSoundParams( vbs_sound_update_t ¶ms ); + void CacheEntryExitPoints( void ); + bool GetLocalAttachmentAtTime( int nQuerySequence, int nAttachmentIndex, float flCyclePoint, Vector *vecOriginOut, QAngle *vecAnglesOut ); + bool GetLocalAttachmentAtTime( const char *lpszAnimName, int nAttachmentIndex, float flCyclePoint, Vector *vecOriginOut, QAngle *vecAnglesOut ); +}; + +#endif // VEHICLE_BASESERVER_H |