aboutsummaryrefslogtreecommitdiff
path: root/sp/src/game/server/hl2/hl2_player.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/hl2_player.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/hl2_player.h')
-rw-r--r--sp/src/game/server/hl2/hl2_player.h384
1 files changed, 384 insertions, 0 deletions
diff --git a/sp/src/game/server/hl2/hl2_player.h b/sp/src/game/server/hl2/hl2_player.h
new file mode 100644
index 00000000..18553824
--- /dev/null
+++ b/sp/src/game/server/hl2/hl2_player.h
@@ -0,0 +1,384 @@
+//========= 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 &params );
+ 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