//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: Player for HL1. // // $NoKeywords: $ //=============================================================================// #ifndef HL1_PLAYER_H #define HL1_PLAYER_H #pragma once #include "player.h" extern int TrainSpeed(int iSpeed, int iMax); extern void CopyToBodyQue( CBaseAnimating *pCorpse ); enum HL1PlayerPhysFlag_e { // 1 -- 5 are used by enum PlayerPhysFlag_e in player.h PFLAG_ONBARNACLE = ( 1<<6 ) // player is hangning from the barnalce }; class IPhysicsPlayerController; //============================================================================= //============================================================================= class CSuitPowerDevice { public: CSuitPowerDevice( int bitsID, float flDrainRate ) { m_bitsDeviceID = bitsID; m_flDrainRate = flDrainRate; } private: int m_bitsDeviceID; // tells what the device is. DEVICE_SPRINT, DEVICE_FLASHLIGHT, etc. BITMASK!!!!! float m_flDrainRate; // how quickly does this device deplete suit power? ( percent per second ) public: int GetDeviceID( void ) const { return m_bitsDeviceID; } float GetDeviceDrainRate( void ) const { return m_flDrainRate; } }; //============================================================================= // >> HL1_PLAYER //============================================================================= class CHL1_Player : public CBasePlayer { DECLARE_CLASS( CHL1_Player, CBasePlayer ); DECLARE_SERVERCLASS(); public: DECLARE_DATADESC(); CHL1_Player(); ~CHL1_Player( void ); static CHL1_Player *CreatePlayer( const char *className, edict_t *ed ) { CHL1_Player::s_PlayerEdict = ed; return (CHL1_Player*)CreateEntityByName( className ); } void CreateCorpse( void ) { CopyToBodyQue( this ); }; void Precache( void ); void Spawn(void); void Event_Killed( const CTakeDamageInfo &info ); void CheatImpulseCommands( int iImpulse ); void PlayerRunCommand( CUserCmd *ucmd, IMoveHelper *moveHelper ); void UpdateClientData( void ); void OnSave( IEntitySaveUtils *pUtils ); void CheckTimeBasedDamage( void ); // from cbasecombatcharacter void InitVCollision( const Vector &vecAbsOrigin, const Vector &vecAbsVelocity ); Class_T Classify ( void ); Class_T m_nControlClass; // Class when player is controlling another entity // from CBasePlayer void SetupVisibility( CBaseEntity *pViewEntity, unsigned char *pvs, int pvssize ); // Aiming heuristics accessors float GetIdleTime( void ) const { return ( m_flIdleTime - m_flMoveTime ); } float GetMoveTime( void ) const { return ( m_flMoveTime - m_flIdleTime ); } float GetLastDamageTime( void ) const { return m_flLastDamageTime; } bool IsDucking( void ) const { return !!( GetFlags() & FL_DUCKING ); } int OnTakeDamage( const CTakeDamageInfo &info ); int OnTakeDamage_Alive( const CTakeDamageInfo &info ); void FindMissTargets( void ); bool GetMissPosition( Vector *position ); void OnDamagedByExplosion( const CTakeDamageInfo &info ) { }; void PlayerPickupObject( CBasePlayer *pPlayer, CBaseEntity *pObject ); virtual void CreateViewModel( int index /*=0*/ ); virtual CBaseEntity *GiveNamedItem( const char *pszName, int iSubType = 0 ); virtual void OnRestore( void ); bool IsPullingObject() { return m_bIsPullingObject; } void StartPullingObject( CBaseEntity *pObject ); void StopPullingObject(); void UpdatePullingObject(); protected: void PreThink( void ); bool HandleInteraction(int interactionType, void *data, CBaseCombatCharacter* sourceEnt); private: Vector m_vecMissPositions[16]; int m_nNumMissPositions; // Aiming heuristics code float m_flIdleTime; //Amount of time we've been motionless float m_flMoveTime; //Amount of time we've been in motion float m_flLastDamageTime; //Last time we took damage float m_flTargetFindTime; EHANDLE m_hPullObject; IPhysicsConstraint *m_pPullConstraint; public: // Flashlight Device int FlashlightIsOn( void ); void FlashlightTurnOn( void ); void FlashlightTurnOff( void ); float m_flFlashLightTime; // Time until next battery draw/Recharge CNetworkVar( int, m_nFlashBattery ); // Flashlight Battery Draw // For gauss weapon // float m_flStartCharge; // float m_flAmmoStartCharge; // float m_flPlayAftershock; // float m_flNextAmmoBurn; // while charging, when to absorb another unit of player's ammo? CNetworkVar( float, m_flStartCharge ); CNetworkVar( float, m_flAmmoStartCharge ); CNetworkVar( float, m_flPlayAftershock ); CNetworkVar( float, m_flNextAmmoBurn ); // while charging, when to absorb another unit of player's ammo? CNetworkVar( bool, m_bHasLongJump ); CNetworkVar( bool, m_bIsPullingObject ); }; //----------------------------------------------------------------------------- // Converts an entity to a HL1 player //----------------------------------------------------------------------------- inline CHL1_Player *ToHL1Player( CBaseEntity *pEntity ) { if ( !pEntity || !pEntity->IsPlayer() ) return NULL; #if _DEBUG return dynamic_cast( pEntity ); #else return static_cast( pEntity ); #endif } #endif //HL1_PLAYER_H