|
|
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose: Player for HL2.
//
// $NoKeywords: $
//=============================================================================//
#ifndef HL2_PLAYER_H
#define HL2_PLAYER_H
#pragma once
#include "player.h"
#include "hl2_playerlocaldata.h"
#include "simtimer.h"
#include "soundenvelope.h"
class CAI_Squad; class CPropCombineBall;
extern int TrainSpeed(int iSpeed, int iMax); extern void CopyToBodyQue( CBaseAnimating *pCorpse );
#define ARMOR_DECAY_TIME 3.5f
enum HL2PlayerPhysFlag_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 CLogicPlayerProxy;
struct commandgoal_t { Vector m_vecGoalLocation; CBaseEntity *m_pGoalEntity; };
// Time between checks to determine whether NPCs are illuminated by the flashlight
#define FLASHLIGHT_NPC_CHECK_INTERVAL 0.4
//----------------------------------------------------
// Definitions for weapon slots
//----------------------------------------------------
#define WEAPON_MELEE_SLOT 0
#define WEAPON_SECONDARY_SLOT 1
#define WEAPON_PRIMARY_SLOT 2
#define WEAPON_EXPLOSIVE_SLOT 3
#define WEAPON_TOOL_SLOT 4
//=============================================================================
//=============================================================================
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 { if( g_pGameRules->GetSkillLevel() == SKILL_EASY && hl2_episodic.GetBool() && !(GetDeviceID()&bits_SUIT_DEVICE_SPRINT) ) return m_flDrainRate * 0.5f; else return m_flDrainRate; } };
//=============================================================================
// >> HL2_PLAYER
//=============================================================================
class CHL2_Player : public CBasePlayer { public: DECLARE_CLASS( CHL2_Player, CBasePlayer );
CHL2_Player(); ~CHL2_Player( void ); static CHL2_Player *CreatePlayer( const char *className, edict_t *ed ) { CHL2_Player::s_PlayerEdict = ed; return (CHL2_Player*)CreateEntityByName( className ); }
DECLARE_SERVERCLASS(); DECLARE_DATADESC();
virtual void CreateCorpse( void ) { CopyToBodyQue( this ); };
virtual void Precache( void ); virtual void Spawn(void); virtual void Activate( void ); virtual void CheatImpulseCommands( int iImpulse ); virtual void PlayerRunCommand( CUserCmd *ucmd, IMoveHelper *moveHelper); virtual void PlayerUse ( void ); virtual void SuspendUse( float flDuration ) { m_flTimeUseSuspended = gpGlobals->curtime + flDuration; } virtual void UpdateClientData( void ); virtual void OnRestore(); virtual void StopLoopingSounds( void ); virtual void Splash( void ); virtual void ModifyOrAppendPlayerCriteria( AI_CriteriaSet& set );
void DrawDebugGeometryOverlays(void);
virtual Vector EyeDirection2D( void ); virtual Vector EyeDirection3D( void );
virtual void CommanderMode();
virtual bool ClientCommand( const CCommand &args );
// from cbasecombatcharacter
void InitVCollision( const Vector &vecAbsOrigin, const Vector &vecAbsVelocity ); WeaponProficiency_t CalcWeaponProficiency( CBaseCombatWeapon *pWeapon );
Class_T Classify ( void );
// from CBasePlayer
virtual void SetupVisibility( CBaseEntity *pViewEntity, unsigned char *pvs, int pvssize );
// Suit Power Interface
void SuitPower_Update( void ); bool SuitPower_Drain( float flPower ); // consume some of the suit's power.
void SuitPower_Charge( float flPower ); // add suit power.
void SuitPower_SetCharge( float flPower ) { m_HL2Local.m_flSuitPower = flPower; } void SuitPower_Initialize( void ); bool SuitPower_IsDeviceActive( const CSuitPowerDevice &device ); bool SuitPower_AddDevice( const CSuitPowerDevice &device ); bool SuitPower_RemoveDevice( const CSuitPowerDevice &device ); bool SuitPower_ShouldRecharge( void ); float SuitPower_GetCurrentPercentage( void ) { return m_HL2Local.m_flSuitPower; } void SetFlashlightEnabled( bool bState );
// Apply a battery
bool ApplyBattery( float powerMultiplier = 1.0 );
// Commander Mode for controller NPCs
enum CommanderCommand_t { CC_NONE, CC_TOGGLE, CC_FOLLOW, CC_SEND, };
void CommanderUpdate(); void CommanderExecute( CommanderCommand_t command = CC_TOGGLE ); bool CommanderFindGoal( commandgoal_t *pGoal ); void NotifyFriendsOfDamage( CBaseEntity *pAttackerEntity ); CAI_BaseNPC *GetSquadCommandRepresentative(); int GetNumSquadCommandables(); int GetNumSquadCommandableMedics();
// Locator
void UpdateLocatorPosition( const Vector &vecPosition );
// Sprint Device
void StartAutoSprint( void ); void StartSprinting( void ); void StopSprinting( void ); void InitSprinting( void ); bool IsSprinting( void ) { return m_fIsSprinting; } bool CanSprint( void ); void EnableSprint( bool bEnable);
bool CanZoom( CBaseEntity *pRequester ); void ToggleZoom(void); void StartZooming( void ); void StopZooming( void ); bool IsZooming( void ); void CheckSuitZoom( void );
// Walking
void StartWalking( void ); void StopWalking( void ); bool IsWalking( void ) { return m_fIsWalking; }
// Aiming heuristics accessors
virtual float GetIdleTime( void ) const { return ( m_flIdleTime - m_flMoveTime ); } virtual float GetMoveTime( void ) const { return ( m_flMoveTime - m_flIdleTime ); } virtual float GetLastDamageTime( void ) const { return m_flLastDamageTime; } virtual bool IsDucking( void ) const { return !!( GetFlags() & FL_DUCKING ); }
virtual bool PassesDamageFilter( const CTakeDamageInfo &info ); void InputIgnoreFallDamage( inputdata_t &inputdata ); void InputIgnoreFallDamageWithoutReset( inputdata_t &inputdata ); void InputEnableFlashlight( inputdata_t &inputdata ); void InputDisableFlashlight( inputdata_t &inputdata );
const impactdamagetable_t &GetPhysicsImpactDamageTable(); virtual int OnTakeDamage( const CTakeDamageInfo &info ); virtual int OnTakeDamage_Alive( const CTakeDamageInfo &info ); virtual void OnDamagedByExplosion( const CTakeDamageInfo &info ); bool ShouldShootMissTarget( CBaseCombatCharacter *pAttacker );
void CombineBallSocketed( CPropCombineBall *pCombineBall );
virtual void Event_KilledOther( CBaseEntity *pVictim, const CTakeDamageInfo &info );
virtual void GetAutoaimVector( autoaim_params_t ¶ms ); bool ShouldKeepLockedAutoaimTarget( EHANDLE hLockedTarget );
void SetLocatorTargetEntity( CBaseEntity *pEntity ) { m_hLocatorTargetEntity.Set( pEntity ); }
virtual int GiveAmmo( int nCount, int nAmmoIndex, bool bSuppressSound); virtual bool BumpWeapon( CBaseCombatWeapon *pWeapon ); virtual bool Weapon_CanUse( CBaseCombatWeapon *pWeapon ); virtual void Weapon_Equip( CBaseCombatWeapon *pWeapon ); virtual bool Weapon_Lower( void ); virtual bool Weapon_Ready( void ); virtual bool Weapon_Switch( CBaseCombatWeapon *pWeapon, int viewmodelindex = 0 ); virtual bool Weapon_CanSwitchTo( CBaseCombatWeapon *pWeapon );
void FirePlayerProxyOutput( const char *pszOutputName, variant_t variant, CBaseEntity *pActivator, CBaseEntity *pCaller );
CLogicPlayerProxy *GetPlayerProxy( void );
// Flashlight Device
void CheckFlashlight( void ); int FlashlightIsOn( void ); void FlashlightTurnOn( void ); void FlashlightTurnOff( void ); bool IsIlluminatedByFlashlight( CBaseEntity *pEntity, float *flReturnDot ); void SetFlashlightPowerDrainScale( float flScale ) { m_flFlashlightPowerDrainScale = flScale; }
// Underwater breather device
virtual void SetPlayerUnderwater( bool state ); virtual bool CanBreatheUnderwater() const { return m_HL2Local.m_flSuitPower > 0.0f; }
// physics interactions
virtual void PickupObject( CBaseEntity *pObject, bool bLimitMassAndSize ); virtual bool IsHoldingEntity( CBaseEntity *pEnt ); virtual void ForceDropOfCarriedPhysObjects( CBaseEntity *pOnlyIfHoldindThis ); virtual float GetHeldObjectMass( IPhysicsObject *pHeldObject );
virtual bool IsFollowingPhysics( void ) { return (m_afPhysicsFlags & PFLAG_ONBARNACLE) > 0; } void InputForceDropPhysObjects( inputdata_t &data );
virtual void Event_Killed( const CTakeDamageInfo &info ); void NotifyScriptsOfDeath( void );
// override the test for getting hit
virtual bool TestHitboxes( const Ray_t &ray, unsigned int fContentsMask, trace_t& tr );
LadderMove_t *GetLadderMove() { return &m_HL2Local.m_LadderMove; } virtual void ExitLadder(); virtual surfacedata_t *GetLadderSurface( const Vector &origin );
virtual void EquipSuit( bool bPlayEffects = true ); virtual void RemoveSuit( void ); void HandleAdmireGlovesAnimation( void ); void StartAdmireGlovesAnimation( void ); void HandleSpeedChanges( void );
void SetControlClass( Class_T controlClass ) { m_nControlClass = controlClass; } void StartWaterDeathSounds( void ); void StopWaterDeathSounds( void );
bool IsWeaponLowered( void ) { return m_HL2Local.m_bWeaponLowered; } void HandleArmorReduction( void ); void StartArmorReduction( void ) { m_flArmorReductionTime = gpGlobals->curtime + ARMOR_DECAY_TIME; m_iArmorReductionFrom = ArmorValue(); }
void MissedAR2AltFire();
inline void EnableCappedPhysicsDamage(); inline void DisableCappedPhysicsDamage();
// HUD HINTS
void DisplayLadderHudHint();
CSoundPatch *m_sndLeeches; CSoundPatch *m_sndWaterSplashes;
protected: virtual void PreThink( void ); virtual void PostThink( void ); virtual bool HandleInteraction(int interactionType, void *data, CBaseCombatCharacter* sourceEnt);
virtual void UpdateWeaponPosture( void );
virtual void ItemPostFrame(); virtual void PlayUseDenySound();
private: bool CommanderExecuteOne( CAI_BaseNPC *pNpc, const commandgoal_t &goal, CAI_BaseNPC **Allies, int numAllies );
void OnSquadMemberKilled( inputdata_t &data );
Class_T m_nControlClass; // Class when player is controlling another entity
// This player's HL2 specific data that should only be replicated to
// the player and not to other players.
CNetworkVarEmbedded( CHL2PlayerLocalData, m_HL2Local );
float m_flTimeAllSuitDevicesOff;
bool m_bSprintEnabled; // Used to disable sprint temporarily
bool m_bIsAutoSprinting; // A proxy for holding down the sprint key.
float m_fAutoSprintMinTime; // Minimum time to maintain autosprint regardless of player speed.
CNetworkVar( bool, m_fIsSprinting ); CNetworkVarForDerived( bool, m_fIsWalking );
protected: // Jeep: Portal_Player needs access to this variable to overload PlayerUse for picking up objects through portals
bool m_bPlayUseDenySound; // Signaled by PlayerUse, but can be unset by HL2 ladder code...
private:
CAI_Squad * m_pPlayerAISquad; CSimpleSimTimer m_CommanderUpdateTimer; float m_RealTimeLastSquadCommand; CommanderCommand_t m_QueuedCommand;
Vector m_vecMissPositions[16]; int m_nNumMissPositions;
float m_flTimeIgnoreFallDamage; bool m_bIgnoreFallDamageResetAfterImpact;
// Suit power fields
float m_flSuitPowerLoad; // net suit power drain (total of all device's drainrates)
float m_flAdmireGlovesAnimTime;
float m_flNextFlashlightCheckTime; float m_flFlashlightPowerDrainScale;
// 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_hPlayerProxy;
bool m_bFlashlightDisabled; bool m_bUseCappedPhysicsDamageTable; float m_flArmorReductionTime; int m_iArmorReductionFrom;
float m_flTimeUseSuspended;
CSimpleSimTimer m_LowerWeaponTimer; CSimpleSimTimer m_AutoaimTimer;
EHANDLE m_hLockedAutoAimEntity;
EHANDLE m_hLocatorTargetEntity; // The entity that's being tracked by the suit locator.
float m_flTimeNextLadderHint; // Next time we're eligible to display a HUD hint about a ladder.
friend class CHL2GameMovement; };
//-----------------------------------------------------------------------------
// FIXME: find a better way to do this
// Switches us to a physics damage table that caps the max damage.
//-----------------------------------------------------------------------------
void CHL2_Player::EnableCappedPhysicsDamage() { m_bUseCappedPhysicsDamageTable = true; }
void CHL2_Player::DisableCappedPhysicsDamage() { m_bUseCappedPhysicsDamageTable = false; }
#endif //HL2_PLAYER_H
|