diff options
| author | Jørgen P. Tjernø <[email protected]> | 2013-12-02 19:31:46 -0800 |
|---|---|---|
| committer | Jørgen P. Tjernø <[email protected]> | 2013-12-02 19:46:31 -0800 |
| commit | f56bb35301836e56582a575a75864392a0177875 (patch) | |
| tree | de61ddd39de3e7df52759711950b4c288592f0dc /sp/src/game/server/player.h | |
| parent | Mark some more files as text. (diff) | |
| download | source-sdk-2013-f56bb35301836e56582a575a75864392a0177875.tar.xz source-sdk-2013-f56bb35301836e56582a575a75864392a0177875.zip | |
Fix line endings. WHAMMY.
Diffstat (limited to 'sp/src/game/server/player.h')
| -rw-r--r-- | sp/src/game/server/player.h | 3098 |
1 files changed, 1549 insertions, 1549 deletions
diff --git a/sp/src/game/server/player.h b/sp/src/game/server/player.h index c1fa4f69..8cd1d0fa 100644 --- a/sp/src/game/server/player.h +++ b/sp/src/game/server/player.h @@ -1,1549 +1,1549 @@ -//========= Copyright Valve Corporation, All rights reserved. ============//
-//
-// Purpose:
-//
-//===========================================================================//
-
-#ifndef PLAYER_H
-#define PLAYER_H
-#ifdef _WIN32
-#pragma once
-#endif
-
-#include "basecombatcharacter.h"
-#include "usercmd.h"
-#include "playerlocaldata.h"
-#include "PlayerState.h"
-#include "game/server/iplayerinfo.h"
-#include "hintsystem.h"
-#include "SoundEmitterSystem/isoundemittersystembase.h"
-#include "util_shared.h"
-
-#if defined USES_ECON_ITEMS
-#include "game_item_schema.h"
-#include "econ_item_view.h"
-#endif
-
-// For queuing and processing usercmds
-class CCommandContext
-{
-public:
- CUtlVector< CUserCmd > cmds;
-
- int numcmds;
- int totalcmds;
- int dropped_packets;
- bool paused;
-};
-
-// Info about last 20 or so updates to the
-class CPlayerCmdInfo
-{
-public:
- CPlayerCmdInfo() :
- m_flTime( 0.0f ), m_nNumCmds( 0 ), m_nDroppedPackets( 0 )
- {
- }
-
- // realtime of sample
- float m_flTime;
- // # of CUserCmds in this update
- int m_nNumCmds;
- // # of dropped packets on the link
- int m_nDroppedPackets;
-};
-
-class CPlayerSimInfo
-{
-public:
- CPlayerSimInfo() :
- m_flTime( 0.0f ), m_nNumCmds( 0 ), m_nTicksCorrected( 0 ), m_flFinalSimulationTime( 0.0f ), m_flGameSimulationTime( 0.0f ), m_flServerFrameTime( 0.0f ), m_vecAbsOrigin( 0, 0, 0 )
- {
- }
-
- // realtime of sample
- float m_flTime;
- // # of CUserCmds in this update
- int m_nNumCmds;
- // If clock needed correction, # of ticks added/removed
- int m_nTicksCorrected; // +ve or -ve
- // player's m_flSimulationTime at end of frame
- float m_flFinalSimulationTime;
- float m_flGameSimulationTime;
- // estimate of server perf
- float m_flServerFrameTime;
- Vector m_vecAbsOrigin;
-};
-//-----------------------------------------------------------------------------
-// Forward declarations:
-//-----------------------------------------------------------------------------
-class CBaseCombatWeapon;
-class CBaseViewModel;
-class CTeam;
-class IPhysicsPlayerController;
-class IServerVehicle;
-class CUserCmd;
-class CFuncLadder;
-class CNavArea;
-class CHintSystem;
-class CAI_Expresser;
-
-#if defined USES_ECON_ITEMS
-class CEconWearable;
-#endif // USES_ECON_ITEMS
-
-// for step sounds
-struct surfacedata_t;
-
-// !!!set this bit on guns and stuff that should never respawn.
-#define SF_NORESPAWN ( 1 << 30 )
-
-//
-// Player PHYSICS FLAGS bits
-//
-enum PlayerPhysFlag_e
-{
- PFLAG_DIROVERRIDE = ( 1<<0 ), // override the player's directional control (trains, physics gun, etc.)
- PFLAG_DUCKING = ( 1<<1 ), // In the process of ducking, but totally squatted yet
- PFLAG_USING = ( 1<<2 ), // Using a continuous entity
- PFLAG_OBSERVER = ( 1<<3 ), // player is locked in stationary cam mode. Spectators can move, observers can't.
- PFLAG_VPHYSICS_MOTIONCONTROLLER = ( 1<<4 ), // player is physically attached to a motion controller
- PFLAG_GAMEPHYSICS_ROTPUSH = (1<<5), // game physics did a rotating push that we may want to override with vphysics
-
- // If you add another flag here check that you aren't
- // overwriting phys flags in the HL2 of TF2 player classes
-};
-
-//
-// generic player
-//
-//-----------------------------------------------------
-//This is Half-Life player entity
-//-----------------------------------------------------
-#define CSUITPLAYLIST 4 // max of 4 suit sentences queued up at any time
-#define SUIT_REPEAT_OK 0
-
-#define SUIT_NEXT_IN_30SEC 30
-#define SUIT_NEXT_IN_1MIN 60
-#define SUIT_NEXT_IN_5MIN 300
-#define SUIT_NEXT_IN_10MIN 600
-#define SUIT_NEXT_IN_30MIN 1800
-#define SUIT_NEXT_IN_1HOUR 3600
-
-#define CSUITNOREPEAT 32
-
-#define TEAM_NAME_LENGTH 16
-
-// constant items
-#define ITEM_HEALTHKIT 1
-#define ITEM_BATTERY 4
-
-#define AUTOAIM_2DEGREES 0.0348994967025
-#define AUTOAIM_5DEGREES 0.08715574274766
-#define AUTOAIM_8DEGREES 0.1391731009601
-#define AUTOAIM_10DEGREES 0.1736481776669
-#define AUTOAIM_20DEGREES 0.3490658503989
-
-// useful cosines
-#define DOT_1DEGREE 0.9998476951564
-#define DOT_2DEGREE 0.9993908270191
-#define DOT_3DEGREE 0.9986295347546
-#define DOT_4DEGREE 0.9975640502598
-#define DOT_5DEGREE 0.9961946980917
-#define DOT_6DEGREE 0.9945218953683
-#define DOT_7DEGREE 0.9925461516413
-#define DOT_8DEGREE 0.9902680687416
-#define DOT_9DEGREE 0.9876883405951
-#define DOT_10DEGREE 0.9848077530122
-#define DOT_15DEGREE 0.9659258262891
-#define DOT_20DEGREE 0.9396926207859
-#define DOT_25DEGREE 0.9063077870367
-#define DOT_30DEGREE 0.866025403784
-#define DOT_45DEGREE 0.707106781187
-enum
-{
- VPHYS_WALK = 0,
- VPHYS_CROUCH,
- VPHYS_NOCLIP,
-};
-
-
-enum PlayerConnectedState
-{
- PlayerConnected,
- PlayerDisconnecting,
- PlayerDisconnected,
-};
-
-extern bool gInitHUD;
-extern ConVar *sv_cheats;
-
-class CBasePlayer;
-class CPlayerInfo : public IBotController, public IPlayerInfo
-{
-public:
- CPlayerInfo () { m_pParent = NULL; }
- ~CPlayerInfo () {}
- void SetParent( CBasePlayer *parent ) { m_pParent = parent; }
-
- // IPlayerInfo interface
- virtual const char *GetName();
- virtual int GetUserID();
- virtual const char *GetNetworkIDString();
- virtual int GetTeamIndex();
- virtual void ChangeTeam( int iTeamNum );
- virtual int GetFragCount();
- virtual int GetDeathCount();
- virtual bool IsConnected();
- virtual int GetArmorValue();
-
- virtual bool IsHLTV();
- virtual bool IsReplay();
- virtual bool IsPlayer();
- virtual bool IsFakeClient();
- virtual bool IsDead();
- virtual bool IsInAVehicle();
- virtual bool IsObserver();
- virtual const Vector GetAbsOrigin();
- virtual const QAngle GetAbsAngles();
- virtual const Vector GetPlayerMins();
- virtual const Vector GetPlayerMaxs();
- virtual const char *GetWeaponName();
- virtual const char *GetModelName();
- virtual const int GetHealth();
- virtual const int GetMaxHealth();
-
- // bot specific functions
- virtual void SetAbsOrigin( Vector & vec );
- virtual void SetAbsAngles( QAngle & ang );
- virtual void RemoveAllItems( bool removeSuit );
- virtual void SetActiveWeapon( const char *WeaponName );
- virtual void SetLocalOrigin( const Vector& origin );
- virtual const Vector GetLocalOrigin( void );
- virtual void SetLocalAngles( const QAngle& angles );
- virtual const QAngle GetLocalAngles( void );
- virtual bool IsEFlagSet( int nEFlagMask );
-
- virtual void RunPlayerMove( CBotCmd *ucmd );
- virtual void SetLastUserCommand( const CBotCmd &cmd );
-
- virtual CBotCmd GetLastUserCommand();
-
-private:
- CBasePlayer *m_pParent;
-};
-
-
-class CBasePlayer : public CBaseCombatCharacter
-{
-public:
- DECLARE_CLASS( CBasePlayer, CBaseCombatCharacter );
-protected:
- // HACK FOR BOTS
- friend class CBotManager;
- static edict_t *s_PlayerEdict; // must be set before calling constructor
-public:
- DECLARE_DATADESC();
- DECLARE_SERVERCLASS();
-
- CBasePlayer();
- ~CBasePlayer();
-
- // IPlayerInfo passthrough (because we can't do multiple inheritance)
- IPlayerInfo *GetPlayerInfo() { return &m_PlayerInfo; }
- IBotController *GetBotController() { return &m_PlayerInfo; }
-
- virtual void SetModel( const char *szModelName );
- void SetBodyPitch( float flPitch );
-
- virtual void UpdateOnRemove( void );
-
- static CBasePlayer *CreatePlayer( const char *className, edict_t *ed );
-
- virtual void CreateViewModel( int viewmodelindex = 0 );
- CBaseViewModel *GetViewModel( int viewmodelindex = 0, bool bObserverOK = true );
- void HideViewModels( void );
- void DestroyViewModels( void );
-
- CPlayerState *PlayerData( void ) { return &pl; }
-
- int RequiredEdictIndex( void ) { return ENTINDEX(edict()); }
-
- void LockPlayerInPlace( void );
- void UnlockPlayer( void );
-
- virtual void DrawDebugGeometryOverlays(void);
-
- // Networking is about to update this entity, let it override and specify it's own pvs
- virtual void SetupVisibility( CBaseEntity *pViewEntity, unsigned char *pvs, int pvssize );
- virtual int UpdateTransmitState();
- virtual int ShouldTransmit( const CCheckTransmitInfo *pInfo );
-
- // Returns true if this player wants pPlayer to be moved back in time when this player runs usercmds.
- // Saves a lot of overhead on the server if we can cull out entities that don't need to lag compensate
- // (like team members, entities out of our PVS, etc).
- virtual bool WantsLagCompensationOnEntity( const CBasePlayer *pPlayer, const CUserCmd *pCmd, const CBitVec<MAX_EDICTS> *pEntityTransmitBits ) const;
-
- virtual void Spawn( void );
- virtual void Activate( void );
- virtual void SharedSpawn(); // Shared between client and server.
- virtual void ForceRespawn( void );
-
- virtual void InitialSpawn( void );
- virtual void InitHUD( void ) {}
- virtual void ShowViewPortPanel( const char * name, bool bShow = true, KeyValues *data = NULL );
-
- virtual void PlayerDeathThink( void );
-
- virtual void Jump( void );
- virtual void Duck( void );
-
- const char *GetTracerType( void );
- void MakeTracer( const Vector &vecTracerSrc, const trace_t &tr, int iTracerType );
- void DoImpactEffect( trace_t &tr, int nDamageType );
-
-#if !defined( NO_ENTITY_PREDICTION )
- void AddToPlayerSimulationList( CBaseEntity *other );
- void RemoveFromPlayerSimulationList( CBaseEntity *other );
- void SimulatePlayerSimulatedEntities( void );
- void ClearPlayerSimulationList( void );
-#endif
-
- // Physics simulation (player executes it's usercmd's here)
- virtual void PhysicsSimulate( void );
-
- // Forces processing of usercmds (e.g., even if game is paused, etc.)
- void ForceSimulation();
-
- virtual unsigned int PhysicsSolidMaskForEntity( void ) const;
-
- virtual void PreThink( void );
- virtual void PostThink( void );
- virtual int TakeHealth( float flHealth, int bitsDamageType );
- virtual void TraceAttack( const CTakeDamageInfo &info, const Vector &vecDir, trace_t *ptr, CDmgAccumulator *pAccumulator );
- bool ShouldTakeDamageInCommentaryMode( const CTakeDamageInfo &inputInfo );
- virtual int OnTakeDamage( const CTakeDamageInfo &info );
- virtual void DamageEffect(float flDamage, int fDamageType);
-
- virtual void OnDamagedByExplosion( const CTakeDamageInfo &info );
-
- void PauseBonusProgress( bool bPause = true );
- void SetBonusProgress( int iBonusProgress );
- void SetBonusChallenge( int iBonusChallenge );
-
- int GetBonusProgress() const { return m_iBonusProgress; }
- int GetBonusChallenge() const { return m_iBonusChallenge; }
-
- virtual Vector EyePosition( ); // position of eyes
- const QAngle &EyeAngles( );
- void EyePositionAndVectors( Vector *pPosition, Vector *pForward, Vector *pRight, Vector *pUp );
- virtual const QAngle &LocalEyeAngles(); // Direction of eyes
- void EyeVectors( Vector *pForward, Vector *pRight = NULL, Vector *pUp = NULL );
- void CacheVehicleView( void ); // Calculate and cache the position of the player in the vehicle
-
- // Sets the view angles
- void SnapEyeAngles( const QAngle &viewAngles );
-
- virtual QAngle BodyAngles();
- virtual Vector BodyTarget( const Vector &posSrc, bool bNoisy);
- virtual bool ShouldFadeOnDeath( void ) { return FALSE; }
-
- virtual const impactdamagetable_t &GetPhysicsImpactDamageTable();
- virtual int OnTakeDamage_Alive( const CTakeDamageInfo &info );
- virtual void Event_Killed( const CTakeDamageInfo &info );
- // Notifier that I've killed some other entity. (called from Victim's Event_Killed).
- virtual void Event_KilledOther( CBaseEntity *pVictim, const CTakeDamageInfo &info );
-
- virtual void Event_Dying( const CTakeDamageInfo &info );
-
- bool IsHLTV( void ) const { return pl.hltv; }
- bool IsReplay( void ) const { return pl.replay; }
- virtual bool IsPlayer( void ) const { return true; } // Spectators return TRUE for this, use IsObserver to separate cases
- virtual bool IsNetClient( void ) const { return true; } // Bots should return FALSE for this, they can't receive NET messages
- // Spectators should return TRUE for this
-
- virtual bool IsFakeClient( void ) const;
-
- // Get the client index (entindex-1).
- int GetClientIndex() { return ENTINDEX( edict() ) - 1; }
-
- // returns the player name
- const char * GetPlayerName() { return m_szNetname; }
- void SetPlayerName( const char *name );
-
- int GetUserID() { return engine->GetPlayerUserId( edict() ); }
- const char * GetNetworkIDString();
- virtual const Vector GetPlayerMins( void ) const; // uses local player
- virtual const Vector GetPlayerMaxs( void ) const; // uses local player
-
-
- void VelocityPunch( const Vector &vecForce );
- void ViewPunch( const QAngle &angleOffset );
- void ViewPunchReset( float tolerance = 0 );
- void ShowViewModel( bool bShow );
- void ShowCrosshair( bool bShow );
-
- // View model prediction setup
- void CalcView( Vector &eyeOrigin, QAngle &eyeAngles, float &zNear, float &zFar, float &fov );
-
- // Handle view smoothing when going up stairs
- void SmoothViewOnStairs( Vector& eyeOrigin );
- virtual float CalcRoll (const QAngle& angles, const Vector& velocity, float rollangle, float rollspeed);
- void CalcViewRoll( QAngle& eyeAngles );
-
- virtual int Save( ISave &save );
- virtual int Restore( IRestore &restore );
- virtual bool ShouldSavePhysics();
- virtual void OnRestore( void );
-
- virtual void PackDeadPlayerItems( void );
- virtual void RemoveAllItems( bool removeSuit );
- bool IsDead() const;
-#ifdef CSTRIKE_DLL
- virtual bool IsRunning( void ) const { return false; } // bot support under cstrike (AR)
-#endif
-
- bool HasPhysicsFlag( unsigned int flag ) { return (m_afPhysicsFlags & flag) != 0; }
-
- // Weapon stuff
- virtual Vector Weapon_ShootPosition( );
- virtual bool Weapon_CanUse( CBaseCombatWeapon *pWeapon );
- virtual void Weapon_Equip( CBaseCombatWeapon *pWeapon );
- virtual void Weapon_Drop( CBaseCombatWeapon *pWeapon, const Vector *pvecTarget /* = NULL */, const Vector *pVelocity /* = NULL */ );
- virtual bool Weapon_Switch( CBaseCombatWeapon *pWeapon, int viewmodelindex = 0 ); // Switch to given weapon if has ammo (false if failed)
- virtual void Weapon_SetLast( CBaseCombatWeapon *pWeapon );
- virtual bool Weapon_ShouldSetLast( CBaseCombatWeapon *pOldWeapon, CBaseCombatWeapon *pNewWeapon ) { return true; }
- virtual bool Weapon_ShouldSelectItem( CBaseCombatWeapon *pWeapon );
- void Weapon_DropSlot( int weaponSlot );
- CBaseCombatWeapon *Weapon_GetLast( void ) { return m_hLastWeapon.Get(); }
-
- virtual void OnMyWeaponFired( CBaseCombatWeapon *weapon ); // call this when this player fires a weapon to allow other systems to react
- virtual float GetTimeSinceWeaponFired( void ) const; // returns the time, in seconds, since this player fired a weapon
- virtual bool IsFiringWeapon( void ) const; // return true if this player is currently firing their weapon
-
- bool HasAnyAmmoOfType( int nAmmoIndex );
-
- // JOHN: sends custom messages if player HUD data has changed (eg health, ammo)
- virtual void UpdateClientData( void );
- void RumbleEffect( unsigned char index, unsigned char rumbleData, unsigned char rumbleFlags );
-
- // Player is moved across the transition by other means
- virtual int ObjectCaps( void ) { return BaseClass::ObjectCaps() & ~FCAP_ACROSS_TRANSITION; }
- virtual void Precache( void );
- bool IsOnLadder( void );
- virtual void ExitLadder() {}
- virtual surfacedata_t *GetLadderSurface( const Vector &origin );
-
- virtual void SetFlashlightEnabled( bool bState ) { };
- virtual int FlashlightIsOn( void ) { return false; }
- virtual void FlashlightTurnOn( void ) { };
- virtual void FlashlightTurnOff( void ) { };
- virtual bool IsIlluminatedByFlashlight( CBaseEntity *pEntity, float *flReturnDot ) {return false; }
-
- void UpdatePlayerSound ( void );
- virtual void UpdateStepSound( surfacedata_t *psurface, const Vector &vecOrigin, const Vector &vecVelocity );
- virtual void PlayStepSound( Vector &vecOrigin, surfacedata_t *psurface, float fvol, bool force );
- virtual const char *GetOverrideStepSound( const char *pszBaseStepSoundName ) { return pszBaseStepSoundName; }
- virtual void GetStepSoundVelocities( float *velwalk, float *velrun );
- virtual void SetStepSoundTime( stepsoundtimes_t iStepSoundTime, bool bWalking );
- virtual void DeathSound( const CTakeDamageInfo &info );
- virtual const char* GetSceneSoundToken( void ) { return ""; }
-
- virtual void OnEmitFootstepSound( const CSoundParameters& params, const Vector& vecOrigin, float fVolume ) {}
-
- Class_T Classify ( void );
- virtual void SetAnimation( PLAYER_ANIM playerAnim );
- void SetWeaponAnimType( const char *szExtention );
-
- // custom player functions
- virtual void ImpulseCommands( void );
- virtual void CheatImpulseCommands( int iImpulse );
- virtual bool ClientCommand( const CCommand &args );
-
- void NotifySinglePlayerGameEnding() { m_bSinglePlayerGameEnding = true; }
- bool IsSinglePlayerGameEnding() { return m_bSinglePlayerGameEnding == true; }
-
- bool HandleVoteCommands( const CCommand &args );
-
- // Observer functions
- virtual bool StartObserverMode(int mode); // true, if successful
- virtual void StopObserverMode( void ); // stop spectator mode
- virtual bool ModeWantsSpectatorGUI( int iMode ) { return true; }
- virtual bool SetObserverMode(int mode); // sets new observer mode, returns true if successful
- virtual int GetObserverMode( void ); // returns observer mode or OBS_NONE
- virtual bool SetObserverTarget(CBaseEntity * target);
- virtual void ObserverUse( bool bIsPressed ); // observer pressed use
- virtual CBaseEntity *GetObserverTarget( void ); // returns players targer or NULL
- virtual CBaseEntity *FindNextObserverTarget( bool bReverse ); // returns next/prev player to follow or NULL
- virtual int GetNextObserverSearchStartPoint( bool bReverse ); // Where we should start looping the player list in a FindNextObserverTarget call
- virtual bool IsValidObserverTarget(CBaseEntity * target); // true, if player is allowed to see this target
- virtual void CheckObserverSettings(); // checks, if target still valid (didn't die etc)
- virtual void JumptoPosition(const Vector &origin, const QAngle &angles);
- virtual void ForceObserverMode(int mode); // sets a temporary mode, force because of invalid targets
- virtual void ResetObserverMode(); // resets all observer related settings
- virtual void ValidateCurrentObserverTarget( void ); // Checks the current observer target, and moves on if it's not valid anymore
- virtual void AttemptToExitFreezeCam( void );
-
- virtual bool StartReplayMode( float fDelay, float fDuration, int iEntity );
- virtual void StopReplayMode();
- virtual int GetDelayTicks();
- virtual int GetReplayEntity();
-
- virtual void CreateCorpse( void ) { }
- virtual CBaseEntity *EntSelectSpawnPoint( void );
-
- // Vehicles
- virtual bool IsInAVehicle( void ) const;
- bool CanEnterVehicle( IServerVehicle *pVehicle, int nRole );
- virtual bool GetInVehicle( IServerVehicle *pVehicle, int nRole );
- virtual void LeaveVehicle( const Vector &vecExitPoint = vec3_origin, const QAngle &vecExitAngles = vec3_angle );
- int GetVehicleAnalogControlBias() { return m_iVehicleAnalogBias; }
- void SetVehicleAnalogControlBias( int bias ) { m_iVehicleAnalogBias = bias; }
-
- // override these for
- virtual void OnVehicleStart() {}
- virtual void OnVehicleEnd( Vector &playerDestPosition ) {}
- IServerVehicle *GetVehicle();
- CBaseEntity *GetVehicleEntity( void );
- bool UsingStandardWeaponsInVehicle( void );
-
- void AddPoints( int score, bool bAllowNegativeScore );
- void AddPointsToTeam( int score, bool bAllowNegativeScore );
- virtual bool BumpWeapon( CBaseCombatWeapon *pWeapon );
- bool RemovePlayerItem( CBaseCombatWeapon *pItem );
- CBaseEntity *HasNamedPlayerItem( const char *pszItemName );
- bool HasWeapons( void );// do I have ANY weapons?
- virtual void SelectLastItem(void);
- virtual void SelectItem( const char *pstr, int iSubType = 0 );
- void ItemPreFrame( void );
- virtual void ItemPostFrame( void );
- virtual CBaseEntity *GiveNamedItem( const char *szName, int iSubType = 0 );
- void EnableControl(bool fControl);
- virtual void CheckTrainUpdate( void );
- void AbortReload( void );
-
- void SendAmmoUpdate(void);
-
- void WaterMove( void );
- float GetWaterJumpTime() const;
- void SetWaterJumpTime( float flWaterJumpTime );
- float GetSwimSoundTime( void ) const;
- void SetSwimSoundTime( float flSwimSoundTime );
-
- virtual void SetPlayerUnderwater( bool state );
- void UpdateUnderwaterState( void );
- bool IsPlayerUnderwater( void ) { return m_bPlayerUnderwater; }
-
- virtual bool CanBreatheUnderwater() const { return false; }
- virtual void PlayerUse( void );
- virtual void PlayUseDenySound() {}
-
- virtual CBaseEntity *FindUseEntity( void );
- virtual bool IsUseableEntity( CBaseEntity *pEntity, unsigned int requiredCaps );
- bool ClearUseEntity();
- CBaseEntity *DoubleCheckUseNPC( CBaseEntity *pNPC, const Vector &vecSrc, const Vector &vecDir );
-
-
- // physics interactions
- // mass/size limit set to zero for none
- static bool CanPickupObject( CBaseEntity *pObject, float massLimit, float sizeLimit );
- virtual void PickupObject( CBaseEntity *pObject, bool bLimitMassAndSize = true ) {}
- virtual void ForceDropOfCarriedPhysObjects( CBaseEntity *pOnlyIfHoldindThis = NULL ) {}
- virtual float GetHeldObjectMass( IPhysicsObject *pHeldObject );
-
- void CheckSuitUpdate();
- void SetSuitUpdate(const char *name, int fgroup, int iNoRepeat);
- virtual void UpdateGeigerCounter( void );
- void CheckTimeBasedDamage( void );
-
- void ResetAutoaim( void );
-
- virtual Vector GetAutoaimVector( float flScale );
- virtual Vector GetAutoaimVector( float flScale, float flMaxDist );
- virtual void GetAutoaimVector( autoaim_params_t ¶ms );
-
- float GetAutoaimScore( const Vector &eyePosition, const Vector &viewDir, const Vector &vecTarget, CBaseEntity *pTarget, float fScale, CBaseCombatWeapon *pActiveWeapon );
- QAngle AutoaimDeflection( Vector &vecSrc, autoaim_params_t ¶ms );
- virtual bool ShouldAutoaim( void );
- void SetTargetInfo( Vector &vecSrc, float flDist );
-
- void SetViewEntity( CBaseEntity *pEntity );
- CBaseEntity *GetViewEntity( void ) { return m_hViewEntity; }
-
- virtual void ForceClientDllUpdate( void ); // Forces all client .dll specific data to be resent to client.
-
- void DeathMessage( CBaseEntity *pKiller );
-
- virtual void ProcessUsercmds( CUserCmd *cmds, int numcmds, int totalcmds,
- int dropped_packets, bool paused );
- bool IsUserCmdDataValid( CUserCmd *pCmd );
-
- void AvoidPhysicsProps( CUserCmd *pCmd );
-
- // Run a user command. The default implementation calls ::PlayerRunCommand. In TF, this controls a vehicle if
- // the player is in one.
- virtual void PlayerRunCommand(CUserCmd *ucmd, IMoveHelper *moveHelper);
- void RunNullCommand();
- CUserCmd * GetCurrentCommand( void ) { return m_pCurrentCommand; }
- float GetTimeSinceLastUserCommand( void ) { return ( !IsConnected() || IsFakeClient() || IsBot() ) ? 0.f : gpGlobals->curtime - m_flLastUserCommandTime; }
-
- // Team Handling
- virtual void ChangeTeam( int iTeamNum ) { ChangeTeam(iTeamNum,false, false); }
- virtual void ChangeTeam( int iTeamNum, bool bAutoTeam, bool bSilent );
-
- // say/sayteam allowed?
- virtual bool CanHearAndReadChatFrom( CBasePlayer *pPlayer ) { return true; }
- virtual bool CanSpeak( void ) { return true; }
-
- audioparams_t &GetAudioParams() { return m_Local.m_audio; }
-
- virtual void ModifyOrAppendPlayerCriteria( AI_CriteriaSet& set );
-
- const QAngle& GetPunchAngle();
- void SetPunchAngle( const QAngle &punchAngle );
-
- virtual void DoMuzzleFlash();
-
- const char *GetLastKnownPlaceName( void ) const { return m_szLastPlaceName; } // return the last nav place name the player occupied
-
- virtual void CheckChatText( char *p, int bufsize ) {}
-
- virtual void CreateRagdollEntity( void ) { return; }
-
- virtual void HandleAnimEvent( animevent_t *pEvent );
-
- virtual bool ShouldAnnounceAchievement( void ){ return true; }
-
-#if defined USES_ECON_ITEMS
- // Wearables
- virtual void EquipWearable( CEconWearable *pItem );
- virtual void RemoveWearable( CEconWearable *pItem );
- void PlayWearableAnimsForPlaybackEvent( wearableanimplayback_t iPlayback );
-#endif
-
-public:
- // Player Physics Shadow
- void SetupVPhysicsShadow( const Vector &vecAbsOrigin, const Vector &vecAbsVelocity, CPhysCollide *pStandModel, const char *pStandHullName, CPhysCollide *pCrouchModel, const char *pCrouchHullName );
- IPhysicsPlayerController* GetPhysicsController() { return m_pPhysicsController; }
- virtual void VPhysicsCollision( int index, gamevcollisionevent_t *pEvent );
- void VPhysicsUpdate( IPhysicsObject *pPhysics );
- virtual void VPhysicsShadowUpdate( IPhysicsObject *pPhysics );
- virtual bool IsFollowingPhysics( void ) { return false; }
- bool IsRideablePhysics( IPhysicsObject *pPhysics );
- IPhysicsObject *GetGroundVPhysics();
-
- virtual void Touch( CBaseEntity *pOther );
- void SetTouchedPhysics( bool bTouch );
- bool TouchedPhysics( void );
- Vector GetSmoothedVelocity( void );
-
- virtual void RefreshCollisionBounds( void );
- virtual void InitVCollision( const Vector &vecAbsOrigin, const Vector &vecAbsVelocity );
- virtual void VPhysicsDestroyObject();
- void SetVCollisionState( const Vector &vecAbsOrigin, const Vector &vecAbsVelocity, int collisionState );
- void PostThinkVPhysics( void );
- virtual void UpdatePhysicsShadowToCurrentPosition();
- void UpdatePhysicsShadowToPosition( const Vector &vecAbsOrigin );
- void UpdateVPhysicsPosition( const Vector &position, const Vector &velocity, float secondsToArrival );
-
- // Hint system
- virtual CHintSystem *Hints( void ) { return NULL; }
- bool ShouldShowHints( void ) { return Hints() ? Hints()->ShouldShowHints() : false; }
- void SetShowHints( bool bShowHints ) { if (Hints()) Hints()->SetShowHints( bShowHints ); }
- bool HintMessage( int hint, bool bForce = false ) { return Hints() ? Hints()->HintMessage( hint, bForce ) : false; }
- void HintMessage( const char *pMessage ) { if (Hints()) Hints()->HintMessage( pMessage ); }
- void StartHintTimer( int iHintID ) { if (Hints()) Hints()->StartHintTimer( iHintID ); }
- void StopHintTimer( int iHintID ) { if (Hints()) Hints()->StopHintTimer( iHintID ); }
- void RemoveHintTimer( int iHintID ) { if (Hints()) Hints()->RemoveHintTimer( iHintID ); }
-
- // Accessor methods
- int FragCount() const { return m_iFrags; }
- int DeathCount() const { return m_iDeaths;}
- bool IsConnected() const { return m_iConnected != PlayerDisconnected; }
- bool IsDisconnecting() const { return m_iConnected == PlayerDisconnecting; }
- bool IsSuitEquipped() const { return m_Local.m_bWearingSuit; }
- int ArmorValue() const { return m_ArmorValue; }
- bool HUDNeedsRestart() const { return m_fInitHUD; }
- float MaxSpeed() const { return m_flMaxspeed; }
- Activity GetActivity( ) const { return m_Activity; }
- inline void SetActivity( Activity eActivity ) { m_Activity = eActivity; }
- bool IsPlayerLockedInPlace() const { return m_iPlayerLocked != 0; }
- bool IsObserver() const { return (m_afPhysicsFlags & PFLAG_OBSERVER) != 0; }
- bool IsOnTarget() const { return m_fOnTarget; }
- float MuzzleFlashTime() const { return m_flFlashTime; }
- float PlayerDrownTime() const { return m_AirFinished; }
-
- int GetObserverMode() const { return m_iObserverMode; }
- CBaseEntity *GetObserverTarget() const { return m_hObserverTarget; }
-
- // Round gamerules
- virtual bool IsReadyToPlay( void ) { return true; }
- virtual bool IsReadyToSpawn( void ) { return true; }
- virtual bool ShouldGainInstantSpawn( void ) { return false; }
- virtual void ResetPerRoundStats( void ) { return; }
- void AllowInstantSpawn( void ) { m_bAllowInstantSpawn = true; }
-
- virtual void ResetScores( void ) { ResetFragCount(); ResetDeathCount(); }
- void ResetFragCount();
- void IncrementFragCount( int nCount );
-
- void ResetDeathCount();
- void IncrementDeathCount( int nCount );
-
- void SetArmorValue( int value );
- void IncrementArmorValue( int nCount, int nMaxValue = -1 );
-
- void SetConnected( PlayerConnectedState iConnected ) { m_iConnected = iConnected; }
- virtual void EquipSuit( bool bPlayEffects = true );
- virtual void RemoveSuit( void );
- void SetMaxSpeed( float flMaxSpeed ) { m_flMaxspeed = flMaxSpeed; }
-
- void NotifyNearbyRadiationSource( float flRange );
-
- void SetAnimationExtension( const char *pExtension );
-
- void SetAdditionalPVSOrigin( const Vector &vecOrigin );
- void SetCameraPVSOrigin( const Vector &vecOrigin );
- void SetMuzzleFlashTime( float flTime );
- void SetUseEntity( CBaseEntity *pUseEntity );
- CBaseEntity *GetUseEntity();
-
- virtual float GetPlayerMaxSpeed();
-
- // Used to set private physics flags PFLAG_*
- void SetPhysicsFlag( int nFlag, bool bSet );
-
- void AllowImmediateDecalPainting();
-
- // Suicide...
- virtual void CommitSuicide( bool bExplode = false, bool bForce = false );
- virtual void CommitSuicide( const Vector &vecForce, bool bExplode = false, bool bForce = false );
-
- // For debugging...
- void ForceOrigin( const Vector &vecOrigin );
-
- // Bot accessors...
- void SetTimeBase( float flTimeBase );
- float GetTimeBase() const;
- void SetLastUserCommand( const CUserCmd &cmd );
- const CUserCmd *GetLastUserCommand( void );
-
- virtual bool IsBot() const; // IMPORTANT: This returns true for ANY type of bot. If your game uses different, incompatible types of bots check your specific bot type before casting
- virtual bool IsBotOfType( int botType ) const; // return true if this player is a bot of the specific type (zero is invalid)
- virtual int GetBotType( void ) const; // return a unique int representing the type of bot instance this is
-
- bool IsPredictingWeapons( void ) const;
- int CurrentCommandNumber() const;
- const CUserCmd *GetCurrentUserCommand() const;
-
- int GetFOV( void ); // Get the current FOV value
- int GetDefaultFOV( void ) const; // Default FOV if not specified otherwise
- int GetFOVForNetworking( void ); // Get the current FOV used for network computations
- bool SetFOV( CBaseEntity *pRequester, int FOV, float zoomRate = 0.0f, int iZoomStart = 0 ); // Alters the base FOV of the player (must have a valid requester)
- void SetDefaultFOV( int FOV ); // Sets the base FOV if nothing else is affecting it by zooming
- CBaseEntity *GetFOVOwner( void ) { return m_hZoomOwner; }
- float GetFOVDistanceAdjustFactor(); // shared between client and server
- float GetFOVDistanceAdjustFactorForNetworking();
-
- int GetImpulse( void ) const { return m_nImpulse; }
-
- // Movement constraints
- void ActivateMovementConstraint( CBaseEntity *pEntity, const Vector &vecCenter, float flRadius, float flConstraintWidth, float flSpeedFactor );
- void DeactivateMovementConstraint( );
-
- // talk control
- void NotePlayerTalked() { m_fLastPlayerTalkTime = gpGlobals->curtime; }
- float LastTimePlayerTalked() { return m_fLastPlayerTalkTime; }
-
- void DisableButtons( int nButtons );
- void EnableButtons( int nButtons );
- void ForceButtons( int nButtons );
- void UnforceButtons( int nButtons );
-
- //---------------------------------
- // Inputs
- //---------------------------------
- void InputSetHealth( inputdata_t &inputdata );
- void InputSetHUDVisibility( inputdata_t &inputdata );
-
- surfacedata_t *GetSurfaceData( void ) { return m_pSurfaceData; }
- void SetLadderNormal( Vector vecLadderNormal ) { m_vecLadderNormal = vecLadderNormal; }
-
- // Here so that derived classes can use the expresser
- virtual CAI_Expresser *GetExpresser() { return NULL; };
-
-#if !defined(NO_STEAM)
- //----------------------------
- // Steam handling
- bool GetSteamID( CSteamID *pID );
- uint64 GetSteamIDAsUInt64( void );
-#endif
-
- float GetRemainingMovementTimeForUserCmdProcessing() const { return m_flMovementTimeForUserCmdProcessingRemaining; }
- float ConsumeMovementTimeForUserCmdProcessing( float flTimeNeeded )
- {
- if ( m_flMovementTimeForUserCmdProcessingRemaining <= 0.0f )
- {
- return 0.0f;
- }
- else if ( flTimeNeeded > m_flMovementTimeForUserCmdProcessingRemaining + FLT_EPSILON )
- {
- float flResult = m_flMovementTimeForUserCmdProcessingRemaining;
- m_flMovementTimeForUserCmdProcessingRemaining = 0.0f;
- return flResult;
- }
- else
- {
- m_flMovementTimeForUserCmdProcessingRemaining -= flTimeNeeded;
- if ( m_flMovementTimeForUserCmdProcessingRemaining < 0.0f )
- m_flMovementTimeForUserCmdProcessingRemaining = 0.0f;
- return flTimeNeeded;
- }
- }
-
-private:
- // How much of a movement time buffer can we process from this user?
- float m_flMovementTimeForUserCmdProcessingRemaining;
-
- // For queueing up CUserCmds and running them from PhysicsSimulate
- int GetCommandContextCount( void ) const;
- CCommandContext *GetCommandContext( int index );
- CCommandContext *AllocCommandContext( void );
- void RemoveCommandContext( int index );
- void RemoveAllCommandContexts( void );
- CCommandContext *RemoveAllCommandContextsExceptNewest( void );
- void ReplaceContextCommands( CCommandContext *ctx, CUserCmd *pCommands, int nCommands );
-
- int DetermineSimulationTicks( void );
- void AdjustPlayerTimeBase( int simulation_ticks );
-
-public:
-
-
-
- // Used by gamemovement to check if the entity is stuck.
- int m_StuckLast;
-
- // FIXME: Make these protected or private!
-
- // This player's data that should only be replicated to
- // the player and not to other players.
- CNetworkVarEmbedded( CPlayerLocalData, m_Local );
-
-#if defined USES_ECON_ITEMS
- CNetworkVarEmbedded( CAttributeList, m_AttributeList );
-#endif
-
- void InitFogController( void );
- void InputSetFogController( inputdata_t &inputdata );
-
- // Used by env_soundscape_triggerable to manage when the player is touching multiple
- // soundscape triggers simultaneously.
- // The one at the HEAD of the list is always the current soundscape for the player.
- CUtlVector<EHANDLE> m_hTriggerSoundscapeList;
-
- // Player data that's sometimes needed by the engine
- CNetworkVarEmbedded( CPlayerState, pl );
-
- IMPLEMENT_NETWORK_VAR_FOR_DERIVED( m_fFlags );
-
- IMPLEMENT_NETWORK_VAR_FOR_DERIVED( m_vecViewOffset );
- IMPLEMENT_NETWORK_VAR_FOR_DERIVED( m_flFriction );
- IMPLEMENT_NETWORK_VAR_FOR_DERIVED( m_iAmmo );
-
- IMPLEMENT_NETWORK_VAR_FOR_DERIVED( m_hGroundEntity );
-
- IMPLEMENT_NETWORK_VAR_FOR_DERIVED( m_lifeState );
- IMPLEMENT_NETWORK_VAR_FOR_DERIVED( m_iHealth );
- IMPLEMENT_NETWORK_VAR_FOR_DERIVED( m_vecBaseVelocity );
- IMPLEMENT_NETWORK_VAR_FOR_DERIVED( m_nNextThinkTick );
- IMPLEMENT_NETWORK_VAR_FOR_DERIVED( m_vecVelocity );
- IMPLEMENT_NETWORK_VAR_FOR_DERIVED( m_nWaterLevel );
-
- int m_nButtons;
- int m_afButtonPressed;
- int m_afButtonReleased;
- int m_afButtonLast;
- int m_afButtonDisabled; // A mask of input flags that are cleared automatically
- int m_afButtonForced; // These are forced onto the player's inputs
-
- CNetworkVar( bool, m_fOnTarget ); //Is the crosshair on a target?
-
- char m_szAnimExtension[32];
-
- int m_nUpdateRate; // user snapshot rate cl_updaterate
- float m_fLerpTime; // users cl_interp
- bool m_bLagCompensation; // user wants lag compenstation
- bool m_bPredictWeapons; // user has client side predicted weapons
-
- float GetDeathTime( void ) { return m_flDeathTime; }
-
- void ClearZoomOwner( void );
-
- void SetPreviouslyPredictedOrigin( const Vector &vecAbsOrigin );
- const Vector &GetPreviouslyPredictedOrigin() const;
- float GetFOVTime( void ){ return m_flFOVTime; }
-
- void AdjustDrownDmg( int nAmount );
-
-#if defined USES_ECON_ITEMS
- CEconWearable *GetWearable( int i ) { return m_hMyWearables[i]; }
- int GetNumWearables( void ) { return m_hMyWearables.Count(); }
-#endif
-
-private:
-
- Activity m_Activity;
-
-protected:
-
- void CalcPlayerView( Vector& eyeOrigin, QAngle& eyeAngles, float& fov );
- void CalcVehicleView( IServerVehicle *pVehicle, Vector& eyeOrigin, QAngle& eyeAngles,
- float& zNear, float& zFar, float& fov );
- void CalcObserverView( Vector& eyeOrigin, QAngle& eyeAngles, float& fov );
- void CalcViewModelView( const Vector& eyeOrigin, const QAngle& eyeAngles);
-
- // FIXME: Make these private! (tf_player uses them)
-
- // Secondary point to derive PVS from when zoomed in with binoculars/sniper rifle. The PVS is
- // a merge of the standing origin and this additional origin
- Vector m_vecAdditionalPVSOrigin;
- // Extra PVS origin if we are using a camera object
- Vector m_vecCameraPVSOrigin;
-
- CNetworkHandle( CBaseEntity, m_hUseEntity ); // the player is currently controlling this entity because of +USE latched, NULL if no entity
-
- int m_iTrain; // Train control position
-
- float m_iRespawnFrames; // used in PlayerDeathThink() to make sure players can always respawn
- unsigned int m_afPhysicsFlags; // physics flags - set when 'normal' physics should be revisited or overriden
-
- // Vehicles
- CNetworkHandle( CBaseEntity, m_hVehicle );
-
- int m_iVehicleAnalogBias;
-
- void UpdateButtonState( int nUserCmdButtonMask );
-
- bool m_bPauseBonusProgress;
- CNetworkVar( int, m_iBonusProgress );
- CNetworkVar( int, m_iBonusChallenge );
-
- int m_lastDamageAmount; // Last damage taken
-
- Vector m_DmgOrigin;
- float m_DmgTake;
- float m_DmgSave;
- int m_bitsDamageType; // what types of damage has player taken
- int m_bitsHUDDamage; // Damage bits for the current fame. These get sent to the hud via gmsgDamage
-
- CNetworkVar( float, m_flDeathTime ); // the time at which the player died (used in PlayerDeathThink())
- float m_flDeathAnimTime; // the time at which the player finished their death anim (used in PlayerDeathThink() and ShouldTransmit())
-
- CNetworkVar( int, m_iObserverMode ); // if in spectator mode != 0
- CNetworkVar( int, m_iFOV ); // field of view
- CNetworkVar( int, m_iDefaultFOV ); // default field of view
- CNetworkVar( int, m_iFOVStart ); // What our FOV started at
- CNetworkVar( float, m_flFOVTime ); // Time our FOV change started
-
- int m_iObserverLastMode; // last used observer mode
- CNetworkHandle( CBaseEntity, m_hObserverTarget ); // entity handle to m_iObserverTarget
- bool m_bForcedObserverMode; // true, player was forced by invalid targets to switch mode
-
- CNetworkHandle( CBaseEntity, m_hZoomOwner ); //This is a pointer to the entity currently controlling the player's zoom
- //Only this entity can change the zoom state once it has ownership
-
- float m_tbdPrev; // Time-based damage timer
- int m_idrowndmg; // track drowning damage taken
- int m_idrownrestored; // track drowning damage restored
- int m_nPoisonDmg; // track recoverable poison damage taken
- int m_nPoisonRestored; // track poison damage restored
- // NOTE: bits damage type appears to only be used for time-based damage
- BYTE m_rgbTimeBasedDamage[CDMG_TIMEBASED];
-
- // Player Physics Shadow
- int m_vphysicsCollisionState;
-
- virtual int SpawnArmorValue( void ) const { return 0; }
-
- float m_fNextSuicideTime; // the time after which the player can next use the suicide command
- int m_iSuicideCustomKillFlags;
-
- // Replay mode
- float m_fDelay; // replay delay in seconds
- float m_fReplayEnd; // time to stop replay mode
- int m_iReplayEntity; // follow this entity in replay
-
-private:
- void HandleFuncTrain();
-
-// DATA
-private:
- CUtlVector< CCommandContext > m_CommandContext;
- // Player Physics Shadow
-
-protected: //used to be private, but need access for portal mod (Dave Kircher)
- IPhysicsPlayerController *m_pPhysicsController;
- IPhysicsObject *m_pShadowStand;
- IPhysicsObject *m_pShadowCrouch;
- Vector m_oldOrigin;
- Vector m_vecSmoothedVelocity;
- bool m_touchedPhysObject;
- bool m_bPhysicsWasFrozen;
-
-private:
-
- int m_iPlayerSound;// the index of the sound list slot reserved for this player
- int m_iTargetVolume;// ideal sound volume.
-
- int m_rgItems[MAX_ITEMS];
-
- // these are time-sensitive things that we keep track of
- float m_flSwimTime; // how long player has been underwater
- float m_flDuckTime; // how long we've been ducking
- float m_flDuckJumpTime;
-
- float m_flSuitUpdate; // when to play next suit update
- int m_rgSuitPlayList[CSUITPLAYLIST];// next sentencenum to play for suit update
- int m_iSuitPlayNext; // next sentence slot for queue storage;
- int m_rgiSuitNoRepeat[CSUITNOREPEAT]; // suit sentence no repeat list
- float m_rgflSuitNoRepeatTime[CSUITNOREPEAT]; // how long to wait before allowing repeat
-
- float m_flgeigerRange; // range to nearest radiation source
- float m_flgeigerDelay; // delay per update of range msg to client
- int m_igeigerRangePrev;
-
- bool m_fInitHUD; // True when deferred HUD restart msg needs to be sent
- bool m_fGameHUDInitialized;
- bool m_fWeapon; // Set this to FALSE to force a reset of the current weapon HUD info
-
- int m_iUpdateTime; // stores the number of frame ticks before sending HUD update messages
- int m_iClientBattery; // the Battery currently known by the client. If this changes, send a new
-
- // Autoaim data
- QAngle m_vecAutoAim;
- int m_lastx, m_lasty; // These are the previous update's crosshair angles, DON"T SAVE/RESTORE
-
- int m_iFrags;
- int m_iDeaths;
-
- float m_flNextDecalTime;// next time this player can spray a decal
-
- // Team Handling
- // char m_szTeamName[TEAM_NAME_LENGTH];
-
- // Multiplayer handling
- PlayerConnectedState m_iConnected;
-
- // from edict_t
- // CBasePlayer doesn't send this but CCSPlayer does.
- CNetworkVarForDerived( int, m_ArmorValue );
- float m_AirFinished;
- float m_PainFinished;
-
- // player locking
- int m_iPlayerLocked;
-
-protected:
- // the player's personal view model
- typedef CHandle<CBaseViewModel> CBaseViewModelHandle;
- CNetworkArray( CBaseViewModelHandle, m_hViewModel, MAX_VIEWMODELS );
-
- // Last received usercmd (in case we drop a lot of packets )
- CUserCmd m_LastCmd;
- CUserCmd *m_pCurrentCommand;
-
- float m_flStepSoundTime; // time to check for next footstep sound
-
- bool m_bAllowInstantSpawn;
-
-#if defined USES_ECON_ITEMS
- // Wearables
- CUtlVector<CHandle<CEconWearable > > m_hMyWearables;
-#endif
-
-private:
-
-// Replicated to all clients
- CNetworkVar( float, m_flMaxspeed );
-
-// Not transmitted
- float m_flWaterJumpTime; // used to be called teleport_time
- Vector m_vecWaterJumpVel;
- int m_nImpulse;
- float m_flSwimSoundTime;
- Vector m_vecLadderNormal;
-
- float m_flFlashTime;
- int m_nDrownDmgRate; // Drowning damage in points per second without air.
-
- int m_nNumCrouches; // Number of times we've crouched (for hinting)
- bool m_bDuckToggled; // If true, the player is crouching via a toggle
-
-public:
- bool GetToggledDuckState( void ) { return m_bDuckToggled; }
- void ToggleDuck( void );
- float GetStickDist( void );
-
- float m_flForwardMove;
- float m_flSideMove;
- int m_nNumCrateHudHints;
-
-private:
-
- // Used in test code to teleport the player to random locations in the map.
- Vector m_vForcedOrigin;
- bool m_bForceOrigin;
-
- // Clients try to run on their own realtime clock, this is this client's clock
- CNetworkVar( int, m_nTickBase );
-
- bool m_bGamePaused;
- float m_fLastPlayerTalkTime;
-
- CNetworkVar( CBaseCombatWeaponHandle, m_hLastWeapon );
-
-#if !defined( NO_ENTITY_PREDICTION )
- CUtlVector< CHandle< CBaseEntity > > m_SimulatedByThisPlayer;
-#endif
-
- float m_flOldPlayerZ;
- float m_flOldPlayerViewOffsetZ;
-
- bool m_bPlayerUnderwater;
-
- EHANDLE m_hViewEntity;
-
- // Movement constraints
- CNetworkHandle( CBaseEntity, m_hConstraintEntity );
- CNetworkVector( m_vecConstraintCenter );
- CNetworkVar( float, m_flConstraintRadius );
- CNetworkVar( float, m_flConstraintWidth );
- CNetworkVar( float, m_flConstraintSpeedFactor );
-
- friend class CPlayerMove;
- friend class CPlayerClass;
-
- // Player name
- char m_szNetname[MAX_PLAYER_NAME_LENGTH];
-
-protected:
- // HACK FOR TF2 Prediction
- friend class CTFGameMovementRecon;
- friend class CGameMovement;
- friend class CTFGameMovement;
- friend class CHL1GameMovement;
- friend class CCSGameMovement;
- friend class CHL2GameMovement;
- friend class CDODGameMovement;
- friend class CPortalGameMovement;
-
- // Accessors for gamemovement
- bool IsDucked( void ) const { return m_Local.m_bDucked; }
- bool IsDucking( void ) const { return m_Local.m_bDucking; }
- float GetStepSize( void ) const { return m_Local.m_flStepSize; }
-
- CNetworkVar( float, m_flLaggedMovementValue );
-
- // These are generated while running usercmds, then given to UpdateVPhysicsPosition after running all queued commands.
- Vector m_vNewVPhysicsPosition;
- Vector m_vNewVPhysicsVelocity;
-
- Vector m_vecVehicleViewOrigin; // Used to store the calculated view of the player while riding in a vehicle
- QAngle m_vecVehicleViewAngles; // Vehicle angles
- float m_flVehicleViewFOV; // FOV of the vehicle driver
- int m_nVehicleViewSavedFrame; // Used to mark which frame was the last one the view was calculated for
-
- Vector m_vecPreviouslyPredictedOrigin; // Used to determine if non-gamemovement game code has teleported, or tweaked the player's origin
- int m_nBodyPitchPoseParam;
-
- CNetworkString( m_szLastPlaceName, MAX_PLACE_NAME_LENGTH );
-
- char m_szNetworkIDString[MAX_NETWORKID_LENGTH];
- CPlayerInfo m_PlayerInfo;
-
- // Texture names and surface data, used by CGameMovement
- int m_surfaceProps;
- surfacedata_t* m_pSurfaceData;
- float m_surfaceFriction;
- char m_chTextureType;
- char m_chPreviousTextureType; // Separate from m_chTextureType. This is cleared if the player's not on the ground.
-
- bool m_bSinglePlayerGameEnding;
-
-public:
-
- float GetLaggedMovementValue( void ){ return m_flLaggedMovementValue; }
- void SetLaggedMovementValue( float flValue ) { m_flLaggedMovementValue = flValue; }
-
- inline bool IsAutoKickDisabled( void ) const;
- inline void DisableAutoKick( bool disabled );
-
- void DumpPerfToRecipient( CBasePlayer *pRecipient, int nMaxRecords );
- // NVNT returns true if user has a haptic device
- virtual bool HasHaptics(){return m_bhasHaptics;}
- // NVNT sets weather a user should receive haptic device messages.
- virtual void SetHaptics(bool has) { m_bhasHaptics = has;}
-private:
- // NVNT member variable holding if this user is using a haptic device.
- bool m_bhasHaptics;
-
- bool m_autoKickDisabled;
-
- struct StepSoundCache_t
- {
- StepSoundCache_t() : m_usSoundNameIndex( 0 ) {}
- CSoundParameters m_SoundParameters;
- unsigned short m_usSoundNameIndex;
- };
- // One for left and one for right side of step
- StepSoundCache_t m_StepSoundCache[ 2 ];
-
- CUtlLinkedList< CPlayerSimInfo > m_vecPlayerSimInfo;
- CUtlLinkedList< CPlayerCmdInfo > m_vecPlayerCmdInfo;
-
- IntervalTimer m_weaponFiredTimer;
-
- // Store the last time we successfully processed a usercommand
- float m_flLastUserCommandTime;
-
-public:
- virtual unsigned int PlayerSolidMask( bool brushOnly = false ) const; // returns the solid mask for the given player, so bots can have a more-restrictive set
-
-};
-
-typedef CHandle<CBasePlayer> CBasePlayerHandle;
-
-EXTERN_SEND_TABLE(DT_BasePlayer)
-
-
-
-//-----------------------------------------------------------------------------
-// Inline methods
-//-----------------------------------------------------------------------------
-inline bool CBasePlayer::IsBotOfType( int botType ) const
-{
- // bot type of zero is invalid
- return ( GetBotType() != 0 ) && ( GetBotType() == botType );
-}
-
-inline int CBasePlayer::GetBotType( void ) const
-{
- return 0;
-}
-
-inline bool CBasePlayer::IsAutoKickDisabled( void ) const
-{
- return m_autoKickDisabled;
-}
-
-inline void CBasePlayer::DisableAutoKick( bool disabled )
-{
- m_autoKickDisabled = disabled;
-}
-
-inline void CBasePlayer::SetAdditionalPVSOrigin( const Vector &vecOrigin )
-{
- m_vecAdditionalPVSOrigin = vecOrigin;
-}
-
-inline void CBasePlayer::SetCameraPVSOrigin( const Vector &vecOrigin )
-{
- m_vecCameraPVSOrigin = vecOrigin;
-}
-
-inline void CBasePlayer::SetMuzzleFlashTime( float flTime )
-{
- m_flFlashTime = flTime;
-}
-
-inline void CBasePlayer::SetUseEntity( CBaseEntity *pUseEntity )
-{
- m_hUseEntity = pUseEntity;
-}
-
-inline CBaseEntity *CBasePlayer::GetUseEntity()
-{
- return m_hUseEntity;
-}
-
-// Bot accessors...
-inline void CBasePlayer::SetTimeBase( float flTimeBase )
-{
- m_nTickBase = TIME_TO_TICKS( flTimeBase );
-}
-
-inline void CBasePlayer::SetLastUserCommand( const CUserCmd &cmd )
-{
- m_LastCmd = cmd;
-}
-
-inline CUserCmd const *CBasePlayer::GetLastUserCommand( void )
-{
- return &m_LastCmd;
-}
-
-inline bool CBasePlayer::IsPredictingWeapons( void ) const
-{
- return m_bPredictWeapons;
-}
-
-inline int CBasePlayer::CurrentCommandNumber() const
-{
- Assert( m_pCurrentCommand );
- return m_pCurrentCommand->command_number;
-}
-
-inline const CUserCmd *CBasePlayer::GetCurrentUserCommand() const
-{
- Assert( m_pCurrentCommand );
- return m_pCurrentCommand;
-}
-
-inline IServerVehicle *CBasePlayer::GetVehicle()
-{
- CBaseEntity *pVehicleEnt = m_hVehicle.Get();
- return pVehicleEnt ? pVehicleEnt->GetServerVehicle() : NULL;
-}
-
-inline CBaseEntity *CBasePlayer::GetVehicleEntity()
-{
- return m_hVehicle.Get();
-}
-
-inline bool CBasePlayer::IsInAVehicle( void ) const
-{
- return ( NULL != m_hVehicle.Get() ) ? true : false;
-}
-
-inline void CBasePlayer::SetTouchedPhysics( bool bTouch )
-{
- m_touchedPhysObject = bTouch;
-}
-
-inline bool CBasePlayer::TouchedPhysics( void )
-{
- return m_touchedPhysObject;
-}
-
-inline void CBasePlayer::OnMyWeaponFired( CBaseCombatWeapon *weapon )
-{
- m_weaponFiredTimer.Start();
-}
-
-inline float CBasePlayer::GetTimeSinceWeaponFired( void ) const
-{
- return m_weaponFiredTimer.GetElapsedTime();
-}
-
-inline bool CBasePlayer::IsFiringWeapon( void ) const
-{
- return m_weaponFiredTimer.HasStarted() && m_weaponFiredTimer.IsLessThen( 1.0f );
-}
-
-
-
-//-----------------------------------------------------------------------------
-// Converts an entity to a player
-//-----------------------------------------------------------------------------
-inline CBasePlayer *ToBasePlayer( CBaseEntity *pEntity )
-{
- if ( !pEntity || !pEntity->IsPlayer() )
- return NULL;
-#if _DEBUG
- return dynamic_cast<CBasePlayer *>( pEntity );
-#else
- return static_cast<CBasePlayer *>( pEntity );
-#endif
-}
-
-inline const CBasePlayer *ToBasePlayer( const CBaseEntity *pEntity )
-{
- if ( !pEntity || !pEntity->IsPlayer() )
- return NULL;
-#if _DEBUG
- return dynamic_cast<const CBasePlayer *>( pEntity );
-#else
- return static_cast<const CBasePlayer *>( pEntity );
-#endif
-}
-
-
-//--------------------------------------------------------------------------------------------------------------
-/**
- * DEPRECATED: Use CollectPlayers() instead.
- * Iterate over all active players in the game, invoking functor on each.
- * If functor returns false, stop iteration and return false.
- */
-template < typename Functor >
-bool ForEachPlayer( Functor &func )
-{
- for( int i=1; i<=gpGlobals->maxClients; ++i )
- {
- CBasePlayer *player = static_cast<CBasePlayer *>( UTIL_PlayerByIndex( i ) );
-
- if (player == NULL)
- continue;
-
- if (FNullEnt( player->edict() ))
- continue;
-
- if (!player->IsPlayer())
- continue;
-
- if( !player->IsConnected() )
- continue;
-
- if (func( player ) == false)
- return false;
- }
-
- return true;
-}
-
-
-//-----------------------------------------------------------------------------------------------
-/**
- * The interface for an iterative player functor
- */
-class IPlayerFunctor
-{
-public:
- virtual void OnBeginIteration( void ) { } // invoked once before iteration begins
-
- virtual bool operator() ( CBasePlayer *player ) = 0;
-
- virtual void OnEndIteration( bool allElementsIterated ) { } // invoked once after iteration is complete whether successful or not
-};
-
-
-//--------------------------------------------------------------------------------------------------------------
-/**
- * DEPRECATED: Use CollectPlayers() instead.
- * Specialization of ForEachPlayer template for IPlayerFunctors
- */
-template <>
-inline bool ForEachPlayer( IPlayerFunctor &func )
-{
- func.OnBeginIteration();
-
- bool isComplete = true;
-
- for( int i=1; i<=gpGlobals->maxClients; ++i )
- {
- CBasePlayer *player = static_cast<CBasePlayer *>( UTIL_PlayerByIndex( i ) );
-
- if (player == NULL)
- continue;
-
- if (FNullEnt( player->edict() ))
- continue;
-
- if (!player->IsPlayer())
- continue;
-
- if( !player->IsConnected() )
- continue;
-
- if (func( player ) == false)
- {
- isComplete = false;
- break;
- }
- }
-
- func.OnEndIteration( isComplete );
-
- return isComplete;
-}
-
-//--------------------------------------------------------------------------------------------------------------
-//
-// Collect all valid, connected players into given vector.
-// Returns number of players collected.
-//
-#define COLLECT_ONLY_LIVING_PLAYERS true
-#define APPEND_PLAYERS true
-template < typename T >
-int CollectPlayers( CUtlVector< T * > *playerVector, int team = TEAM_ANY, bool isAlive = false, bool shouldAppend = false )
-{
- if ( !shouldAppend )
- {
- playerVector->RemoveAll();
- }
-
- for( int i=1; i<=gpGlobals->maxClients; ++i )
- {
- CBasePlayer *player = UTIL_PlayerByIndex( i );
-
- if ( player == NULL )
- continue;
-
- if ( FNullEnt( player->edict() ) )
- continue;
-
- if ( !player->IsPlayer() )
- continue;
-
- if ( !player->IsConnected() )
- continue;
-
- if ( team != TEAM_ANY && player->GetTeamNumber() != team )
- continue;
-
- if ( isAlive && !player->IsAlive() )
- continue;
-
- playerVector->AddToTail( assert_cast< T * >( player ) );
- }
-
- return playerVector->Count();
-}
-
-template < typename T >
-int CollectHumanPlayers( CUtlVector< T * > *playerVector, int team = TEAM_ANY, bool isAlive = false, bool shouldAppend = false )
-{
- if ( !shouldAppend )
- {
- playerVector->RemoveAll();
- }
-
- for( int i=1; i<=gpGlobals->maxClients; ++i )
- {
- CBasePlayer *player = UTIL_PlayerByIndex( i );
-
- if ( player == NULL )
- continue;
-
- if ( FNullEnt( player->edict() ) )
- continue;
-
- if ( !player->IsPlayer() )
- continue;
-
- if ( player->IsBot() )
- continue;
-
- if ( !player->IsConnected() )
- continue;
-
- if ( team != TEAM_ANY && player->GetTeamNumber() != team )
- continue;
-
- if ( isAlive && !player->IsAlive() )
- continue;
-
- playerVector->AddToTail( assert_cast< T * >( player ) );
- }
-
- return playerVector->Count();
-}
-
-enum
-{
- VEHICLE_ANALOG_BIAS_NONE = 0,
- VEHICLE_ANALOG_BIAS_FORWARD,
- VEHICLE_ANALOG_BIAS_REVERSE,
-};
-
-#endif // PLAYER_H
+//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +//===========================================================================// + +#ifndef PLAYER_H +#define PLAYER_H +#ifdef _WIN32 +#pragma once +#endif + +#include "basecombatcharacter.h" +#include "usercmd.h" +#include "playerlocaldata.h" +#include "PlayerState.h" +#include "game/server/iplayerinfo.h" +#include "hintsystem.h" +#include "SoundEmitterSystem/isoundemittersystembase.h" +#include "util_shared.h" + +#if defined USES_ECON_ITEMS +#include "game_item_schema.h" +#include "econ_item_view.h" +#endif + +// For queuing and processing usercmds +class CCommandContext +{ +public: + CUtlVector< CUserCmd > cmds; + + int numcmds; + int totalcmds; + int dropped_packets; + bool paused; +}; + +// Info about last 20 or so updates to the +class CPlayerCmdInfo +{ +public: + CPlayerCmdInfo() : + m_flTime( 0.0f ), m_nNumCmds( 0 ), m_nDroppedPackets( 0 ) + { + } + + // realtime of sample + float m_flTime; + // # of CUserCmds in this update + int m_nNumCmds; + // # of dropped packets on the link + int m_nDroppedPackets; +}; + +class CPlayerSimInfo +{ +public: + CPlayerSimInfo() : + m_flTime( 0.0f ), m_nNumCmds( 0 ), m_nTicksCorrected( 0 ), m_flFinalSimulationTime( 0.0f ), m_flGameSimulationTime( 0.0f ), m_flServerFrameTime( 0.0f ), m_vecAbsOrigin( 0, 0, 0 ) + { + } + + // realtime of sample + float m_flTime; + // # of CUserCmds in this update + int m_nNumCmds; + // If clock needed correction, # of ticks added/removed + int m_nTicksCorrected; // +ve or -ve + // player's m_flSimulationTime at end of frame + float m_flFinalSimulationTime; + float m_flGameSimulationTime; + // estimate of server perf + float m_flServerFrameTime; + Vector m_vecAbsOrigin; +}; +//----------------------------------------------------------------------------- +// Forward declarations: +//----------------------------------------------------------------------------- +class CBaseCombatWeapon; +class CBaseViewModel; +class CTeam; +class IPhysicsPlayerController; +class IServerVehicle; +class CUserCmd; +class CFuncLadder; +class CNavArea; +class CHintSystem; +class CAI_Expresser; + +#if defined USES_ECON_ITEMS +class CEconWearable; +#endif // USES_ECON_ITEMS + +// for step sounds +struct surfacedata_t; + +// !!!set this bit on guns and stuff that should never respawn. +#define SF_NORESPAWN ( 1 << 30 ) + +// +// Player PHYSICS FLAGS bits +// +enum PlayerPhysFlag_e +{ + PFLAG_DIROVERRIDE = ( 1<<0 ), // override the player's directional control (trains, physics gun, etc.) + PFLAG_DUCKING = ( 1<<1 ), // In the process of ducking, but totally squatted yet + PFLAG_USING = ( 1<<2 ), // Using a continuous entity + PFLAG_OBSERVER = ( 1<<3 ), // player is locked in stationary cam mode. Spectators can move, observers can't. + PFLAG_VPHYSICS_MOTIONCONTROLLER = ( 1<<4 ), // player is physically attached to a motion controller + PFLAG_GAMEPHYSICS_ROTPUSH = (1<<5), // game physics did a rotating push that we may want to override with vphysics + + // If you add another flag here check that you aren't + // overwriting phys flags in the HL2 of TF2 player classes +}; + +// +// generic player +// +//----------------------------------------------------- +//This is Half-Life player entity +//----------------------------------------------------- +#define CSUITPLAYLIST 4 // max of 4 suit sentences queued up at any time +#define SUIT_REPEAT_OK 0 + +#define SUIT_NEXT_IN_30SEC 30 +#define SUIT_NEXT_IN_1MIN 60 +#define SUIT_NEXT_IN_5MIN 300 +#define SUIT_NEXT_IN_10MIN 600 +#define SUIT_NEXT_IN_30MIN 1800 +#define SUIT_NEXT_IN_1HOUR 3600 + +#define CSUITNOREPEAT 32 + +#define TEAM_NAME_LENGTH 16 + +// constant items +#define ITEM_HEALTHKIT 1 +#define ITEM_BATTERY 4 + +#define AUTOAIM_2DEGREES 0.0348994967025 +#define AUTOAIM_5DEGREES 0.08715574274766 +#define AUTOAIM_8DEGREES 0.1391731009601 +#define AUTOAIM_10DEGREES 0.1736481776669 +#define AUTOAIM_20DEGREES 0.3490658503989 + +// useful cosines +#define DOT_1DEGREE 0.9998476951564 +#define DOT_2DEGREE 0.9993908270191 +#define DOT_3DEGREE 0.9986295347546 +#define DOT_4DEGREE 0.9975640502598 +#define DOT_5DEGREE 0.9961946980917 +#define DOT_6DEGREE 0.9945218953683 +#define DOT_7DEGREE 0.9925461516413 +#define DOT_8DEGREE 0.9902680687416 +#define DOT_9DEGREE 0.9876883405951 +#define DOT_10DEGREE 0.9848077530122 +#define DOT_15DEGREE 0.9659258262891 +#define DOT_20DEGREE 0.9396926207859 +#define DOT_25DEGREE 0.9063077870367 +#define DOT_30DEGREE 0.866025403784 +#define DOT_45DEGREE 0.707106781187 +enum +{ + VPHYS_WALK = 0, + VPHYS_CROUCH, + VPHYS_NOCLIP, +}; + + +enum PlayerConnectedState +{ + PlayerConnected, + PlayerDisconnecting, + PlayerDisconnected, +}; + +extern bool gInitHUD; +extern ConVar *sv_cheats; + +class CBasePlayer; +class CPlayerInfo : public IBotController, public IPlayerInfo +{ +public: + CPlayerInfo () { m_pParent = NULL; } + ~CPlayerInfo () {} + void SetParent( CBasePlayer *parent ) { m_pParent = parent; } + + // IPlayerInfo interface + virtual const char *GetName(); + virtual int GetUserID(); + virtual const char *GetNetworkIDString(); + virtual int GetTeamIndex(); + virtual void ChangeTeam( int iTeamNum ); + virtual int GetFragCount(); + virtual int GetDeathCount(); + virtual bool IsConnected(); + virtual int GetArmorValue(); + + virtual bool IsHLTV(); + virtual bool IsReplay(); + virtual bool IsPlayer(); + virtual bool IsFakeClient(); + virtual bool IsDead(); + virtual bool IsInAVehicle(); + virtual bool IsObserver(); + virtual const Vector GetAbsOrigin(); + virtual const QAngle GetAbsAngles(); + virtual const Vector GetPlayerMins(); + virtual const Vector GetPlayerMaxs(); + virtual const char *GetWeaponName(); + virtual const char *GetModelName(); + virtual const int GetHealth(); + virtual const int GetMaxHealth(); + + // bot specific functions + virtual void SetAbsOrigin( Vector & vec ); + virtual void SetAbsAngles( QAngle & ang ); + virtual void RemoveAllItems( bool removeSuit ); + virtual void SetActiveWeapon( const char *WeaponName ); + virtual void SetLocalOrigin( const Vector& origin ); + virtual const Vector GetLocalOrigin( void ); + virtual void SetLocalAngles( const QAngle& angles ); + virtual const QAngle GetLocalAngles( void ); + virtual bool IsEFlagSet( int nEFlagMask ); + + virtual void RunPlayerMove( CBotCmd *ucmd ); + virtual void SetLastUserCommand( const CBotCmd &cmd ); + + virtual CBotCmd GetLastUserCommand(); + +private: + CBasePlayer *m_pParent; +}; + + +class CBasePlayer : public CBaseCombatCharacter +{ +public: + DECLARE_CLASS( CBasePlayer, CBaseCombatCharacter ); +protected: + // HACK FOR BOTS + friend class CBotManager; + static edict_t *s_PlayerEdict; // must be set before calling constructor +public: + DECLARE_DATADESC(); + DECLARE_SERVERCLASS(); + + CBasePlayer(); + ~CBasePlayer(); + + // IPlayerInfo passthrough (because we can't do multiple inheritance) + IPlayerInfo *GetPlayerInfo() { return &m_PlayerInfo; } + IBotController *GetBotController() { return &m_PlayerInfo; } + + virtual void SetModel( const char *szModelName ); + void SetBodyPitch( float flPitch ); + + virtual void UpdateOnRemove( void ); + + static CBasePlayer *CreatePlayer( const char *className, edict_t *ed ); + + virtual void CreateViewModel( int viewmodelindex = 0 ); + CBaseViewModel *GetViewModel( int viewmodelindex = 0, bool bObserverOK = true ); + void HideViewModels( void ); + void DestroyViewModels( void ); + + CPlayerState *PlayerData( void ) { return &pl; } + + int RequiredEdictIndex( void ) { return ENTINDEX(edict()); } + + void LockPlayerInPlace( void ); + void UnlockPlayer( void ); + + virtual void DrawDebugGeometryOverlays(void); + + // Networking is about to update this entity, let it override and specify it's own pvs + virtual void SetupVisibility( CBaseEntity *pViewEntity, unsigned char *pvs, int pvssize ); + virtual int UpdateTransmitState(); + virtual int ShouldTransmit( const CCheckTransmitInfo *pInfo ); + + // Returns true if this player wants pPlayer to be moved back in time when this player runs usercmds. + // Saves a lot of overhead on the server if we can cull out entities that don't need to lag compensate + // (like team members, entities out of our PVS, etc). + virtual bool WantsLagCompensationOnEntity( const CBasePlayer *pPlayer, const CUserCmd *pCmd, const CBitVec<MAX_EDICTS> *pEntityTransmitBits ) const; + + virtual void Spawn( void ); + virtual void Activate( void ); + virtual void SharedSpawn(); // Shared between client and server. + virtual void ForceRespawn( void ); + + virtual void InitialSpawn( void ); + virtual void InitHUD( void ) {} + virtual void ShowViewPortPanel( const char * name, bool bShow = true, KeyValues *data = NULL ); + + virtual void PlayerDeathThink( void ); + + virtual void Jump( void ); + virtual void Duck( void ); + + const char *GetTracerType( void ); + void MakeTracer( const Vector &vecTracerSrc, const trace_t &tr, int iTracerType ); + void DoImpactEffect( trace_t &tr, int nDamageType ); + +#if !defined( NO_ENTITY_PREDICTION ) + void AddToPlayerSimulationList( CBaseEntity *other ); + void RemoveFromPlayerSimulationList( CBaseEntity *other ); + void SimulatePlayerSimulatedEntities( void ); + void ClearPlayerSimulationList( void ); +#endif + + // Physics simulation (player executes it's usercmd's here) + virtual void PhysicsSimulate( void ); + + // Forces processing of usercmds (e.g., even if game is paused, etc.) + void ForceSimulation(); + + virtual unsigned int PhysicsSolidMaskForEntity( void ) const; + + virtual void PreThink( void ); + virtual void PostThink( void ); + virtual int TakeHealth( float flHealth, int bitsDamageType ); + virtual void TraceAttack( const CTakeDamageInfo &info, const Vector &vecDir, trace_t *ptr, CDmgAccumulator *pAccumulator ); + bool ShouldTakeDamageInCommentaryMode( const CTakeDamageInfo &inputInfo ); + virtual int OnTakeDamage( const CTakeDamageInfo &info ); + virtual void DamageEffect(float flDamage, int fDamageType); + + virtual void OnDamagedByExplosion( const CTakeDamageInfo &info ); + + void PauseBonusProgress( bool bPause = true ); + void SetBonusProgress( int iBonusProgress ); + void SetBonusChallenge( int iBonusChallenge ); + + int GetBonusProgress() const { return m_iBonusProgress; } + int GetBonusChallenge() const { return m_iBonusChallenge; } + + virtual Vector EyePosition( ); // position of eyes + const QAngle &EyeAngles( ); + void EyePositionAndVectors( Vector *pPosition, Vector *pForward, Vector *pRight, Vector *pUp ); + virtual const QAngle &LocalEyeAngles(); // Direction of eyes + void EyeVectors( Vector *pForward, Vector *pRight = NULL, Vector *pUp = NULL ); + void CacheVehicleView( void ); // Calculate and cache the position of the player in the vehicle + + // Sets the view angles + void SnapEyeAngles( const QAngle &viewAngles ); + + virtual QAngle BodyAngles(); + virtual Vector BodyTarget( const Vector &posSrc, bool bNoisy); + virtual bool ShouldFadeOnDeath( void ) { return FALSE; } + + virtual const impactdamagetable_t &GetPhysicsImpactDamageTable(); + virtual int OnTakeDamage_Alive( const CTakeDamageInfo &info ); + virtual void Event_Killed( const CTakeDamageInfo &info ); + // Notifier that I've killed some other entity. (called from Victim's Event_Killed). + virtual void Event_KilledOther( CBaseEntity *pVictim, const CTakeDamageInfo &info ); + + virtual void Event_Dying( const CTakeDamageInfo &info ); + + bool IsHLTV( void ) const { return pl.hltv; } + bool IsReplay( void ) const { return pl.replay; } + virtual bool IsPlayer( void ) const { return true; } // Spectators return TRUE for this, use IsObserver to separate cases + virtual bool IsNetClient( void ) const { return true; } // Bots should return FALSE for this, they can't receive NET messages + // Spectators should return TRUE for this + + virtual bool IsFakeClient( void ) const; + + // Get the client index (entindex-1). + int GetClientIndex() { return ENTINDEX( edict() ) - 1; } + + // returns the player name + const char * GetPlayerName() { return m_szNetname; } + void SetPlayerName( const char *name ); + + int GetUserID() { return engine->GetPlayerUserId( edict() ); } + const char * GetNetworkIDString(); + virtual const Vector GetPlayerMins( void ) const; // uses local player + virtual const Vector GetPlayerMaxs( void ) const; // uses local player + + + void VelocityPunch( const Vector &vecForce ); + void ViewPunch( const QAngle &angleOffset ); + void ViewPunchReset( float tolerance = 0 ); + void ShowViewModel( bool bShow ); + void ShowCrosshair( bool bShow ); + + // View model prediction setup + void CalcView( Vector &eyeOrigin, QAngle &eyeAngles, float &zNear, float &zFar, float &fov ); + + // Handle view smoothing when going up stairs + void SmoothViewOnStairs( Vector& eyeOrigin ); + virtual float CalcRoll (const QAngle& angles, const Vector& velocity, float rollangle, float rollspeed); + void CalcViewRoll( QAngle& eyeAngles ); + + virtual int Save( ISave &save ); + virtual int Restore( IRestore &restore ); + virtual bool ShouldSavePhysics(); + virtual void OnRestore( void ); + + virtual void PackDeadPlayerItems( void ); + virtual void RemoveAllItems( bool removeSuit ); + bool IsDead() const; +#ifdef CSTRIKE_DLL + virtual bool IsRunning( void ) const { return false; } // bot support under cstrike (AR) +#endif + + bool HasPhysicsFlag( unsigned int flag ) { return (m_afPhysicsFlags & flag) != 0; } + + // Weapon stuff + virtual Vector Weapon_ShootPosition( ); + virtual bool Weapon_CanUse( CBaseCombatWeapon *pWeapon ); + virtual void Weapon_Equip( CBaseCombatWeapon *pWeapon ); + virtual void Weapon_Drop( CBaseCombatWeapon *pWeapon, const Vector *pvecTarget /* = NULL */, const Vector *pVelocity /* = NULL */ ); + virtual bool Weapon_Switch( CBaseCombatWeapon *pWeapon, int viewmodelindex = 0 ); // Switch to given weapon if has ammo (false if failed) + virtual void Weapon_SetLast( CBaseCombatWeapon *pWeapon ); + virtual bool Weapon_ShouldSetLast( CBaseCombatWeapon *pOldWeapon, CBaseCombatWeapon *pNewWeapon ) { return true; } + virtual bool Weapon_ShouldSelectItem( CBaseCombatWeapon *pWeapon ); + void Weapon_DropSlot( int weaponSlot ); + CBaseCombatWeapon *Weapon_GetLast( void ) { return m_hLastWeapon.Get(); } + + virtual void OnMyWeaponFired( CBaseCombatWeapon *weapon ); // call this when this player fires a weapon to allow other systems to react + virtual float GetTimeSinceWeaponFired( void ) const; // returns the time, in seconds, since this player fired a weapon + virtual bool IsFiringWeapon( void ) const; // return true if this player is currently firing their weapon + + bool HasAnyAmmoOfType( int nAmmoIndex ); + + // JOHN: sends custom messages if player HUD data has changed (eg health, ammo) + virtual void UpdateClientData( void ); + void RumbleEffect( unsigned char index, unsigned char rumbleData, unsigned char rumbleFlags ); + + // Player is moved across the transition by other means + virtual int ObjectCaps( void ) { return BaseClass::ObjectCaps() & ~FCAP_ACROSS_TRANSITION; } + virtual void Precache( void ); + bool IsOnLadder( void ); + virtual void ExitLadder() {} + virtual surfacedata_t *GetLadderSurface( const Vector &origin ); + + virtual void SetFlashlightEnabled( bool bState ) { }; + virtual int FlashlightIsOn( void ) { return false; } + virtual void FlashlightTurnOn( void ) { }; + virtual void FlashlightTurnOff( void ) { }; + virtual bool IsIlluminatedByFlashlight( CBaseEntity *pEntity, float *flReturnDot ) {return false; } + + void UpdatePlayerSound ( void ); + virtual void UpdateStepSound( surfacedata_t *psurface, const Vector &vecOrigin, const Vector &vecVelocity ); + virtual void PlayStepSound( Vector &vecOrigin, surfacedata_t *psurface, float fvol, bool force ); + virtual const char *GetOverrideStepSound( const char *pszBaseStepSoundName ) { return pszBaseStepSoundName; } + virtual void GetStepSoundVelocities( float *velwalk, float *velrun ); + virtual void SetStepSoundTime( stepsoundtimes_t iStepSoundTime, bool bWalking ); + virtual void DeathSound( const CTakeDamageInfo &info ); + virtual const char* GetSceneSoundToken( void ) { return ""; } + + virtual void OnEmitFootstepSound( const CSoundParameters& params, const Vector& vecOrigin, float fVolume ) {} + + Class_T Classify ( void ); + virtual void SetAnimation( PLAYER_ANIM playerAnim ); + void SetWeaponAnimType( const char *szExtention ); + + // custom player functions + virtual void ImpulseCommands( void ); + virtual void CheatImpulseCommands( int iImpulse ); + virtual bool ClientCommand( const CCommand &args ); + + void NotifySinglePlayerGameEnding() { m_bSinglePlayerGameEnding = true; } + bool IsSinglePlayerGameEnding() { return m_bSinglePlayerGameEnding == true; } + + bool HandleVoteCommands( const CCommand &args ); + + // Observer functions + virtual bool StartObserverMode(int mode); // true, if successful + virtual void StopObserverMode( void ); // stop spectator mode + virtual bool ModeWantsSpectatorGUI( int iMode ) { return true; } + virtual bool SetObserverMode(int mode); // sets new observer mode, returns true if successful + virtual int GetObserverMode( void ); // returns observer mode or OBS_NONE + virtual bool SetObserverTarget(CBaseEntity * target); + virtual void ObserverUse( bool bIsPressed ); // observer pressed use + virtual CBaseEntity *GetObserverTarget( void ); // returns players targer or NULL + virtual CBaseEntity *FindNextObserverTarget( bool bReverse ); // returns next/prev player to follow or NULL + virtual int GetNextObserverSearchStartPoint( bool bReverse ); // Where we should start looping the player list in a FindNextObserverTarget call + virtual bool IsValidObserverTarget(CBaseEntity * target); // true, if player is allowed to see this target + virtual void CheckObserverSettings(); // checks, if target still valid (didn't die etc) + virtual void JumptoPosition(const Vector &origin, const QAngle &angles); + virtual void ForceObserverMode(int mode); // sets a temporary mode, force because of invalid targets + virtual void ResetObserverMode(); // resets all observer related settings + virtual void ValidateCurrentObserverTarget( void ); // Checks the current observer target, and moves on if it's not valid anymore + virtual void AttemptToExitFreezeCam( void ); + + virtual bool StartReplayMode( float fDelay, float fDuration, int iEntity ); + virtual void StopReplayMode(); + virtual int GetDelayTicks(); + virtual int GetReplayEntity(); + + virtual void CreateCorpse( void ) { } + virtual CBaseEntity *EntSelectSpawnPoint( void ); + + // Vehicles + virtual bool IsInAVehicle( void ) const; + bool CanEnterVehicle( IServerVehicle *pVehicle, int nRole ); + virtual bool GetInVehicle( IServerVehicle *pVehicle, int nRole ); + virtual void LeaveVehicle( const Vector &vecExitPoint = vec3_origin, const QAngle &vecExitAngles = vec3_angle ); + int GetVehicleAnalogControlBias() { return m_iVehicleAnalogBias; } + void SetVehicleAnalogControlBias( int bias ) { m_iVehicleAnalogBias = bias; } + + // override these for + virtual void OnVehicleStart() {} + virtual void OnVehicleEnd( Vector &playerDestPosition ) {} + IServerVehicle *GetVehicle(); + CBaseEntity *GetVehicleEntity( void ); + bool UsingStandardWeaponsInVehicle( void ); + + void AddPoints( int score, bool bAllowNegativeScore ); + void AddPointsToTeam( int score, bool bAllowNegativeScore ); + virtual bool BumpWeapon( CBaseCombatWeapon *pWeapon ); + bool RemovePlayerItem( CBaseCombatWeapon *pItem ); + CBaseEntity *HasNamedPlayerItem( const char *pszItemName ); + bool HasWeapons( void );// do I have ANY weapons? + virtual void SelectLastItem(void); + virtual void SelectItem( const char *pstr, int iSubType = 0 ); + void ItemPreFrame( void ); + virtual void ItemPostFrame( void ); + virtual CBaseEntity *GiveNamedItem( const char *szName, int iSubType = 0 ); + void EnableControl(bool fControl); + virtual void CheckTrainUpdate( void ); + void AbortReload( void ); + + void SendAmmoUpdate(void); + + void WaterMove( void ); + float GetWaterJumpTime() const; + void SetWaterJumpTime( float flWaterJumpTime ); + float GetSwimSoundTime( void ) const; + void SetSwimSoundTime( float flSwimSoundTime ); + + virtual void SetPlayerUnderwater( bool state ); + void UpdateUnderwaterState( void ); + bool IsPlayerUnderwater( void ) { return m_bPlayerUnderwater; } + + virtual bool CanBreatheUnderwater() const { return false; } + virtual void PlayerUse( void ); + virtual void PlayUseDenySound() {} + + virtual CBaseEntity *FindUseEntity( void ); + virtual bool IsUseableEntity( CBaseEntity *pEntity, unsigned int requiredCaps ); + bool ClearUseEntity(); + CBaseEntity *DoubleCheckUseNPC( CBaseEntity *pNPC, const Vector &vecSrc, const Vector &vecDir ); + + + // physics interactions + // mass/size limit set to zero for none + static bool CanPickupObject( CBaseEntity *pObject, float massLimit, float sizeLimit ); + virtual void PickupObject( CBaseEntity *pObject, bool bLimitMassAndSize = true ) {} + virtual void ForceDropOfCarriedPhysObjects( CBaseEntity *pOnlyIfHoldindThis = NULL ) {} + virtual float GetHeldObjectMass( IPhysicsObject *pHeldObject ); + + void CheckSuitUpdate(); + void SetSuitUpdate(const char *name, int fgroup, int iNoRepeat); + virtual void UpdateGeigerCounter( void ); + void CheckTimeBasedDamage( void ); + + void ResetAutoaim( void ); + + virtual Vector GetAutoaimVector( float flScale ); + virtual Vector GetAutoaimVector( float flScale, float flMaxDist ); + virtual void GetAutoaimVector( autoaim_params_t ¶ms ); + + float GetAutoaimScore( const Vector &eyePosition, const Vector &viewDir, const Vector &vecTarget, CBaseEntity *pTarget, float fScale, CBaseCombatWeapon *pActiveWeapon ); + QAngle AutoaimDeflection( Vector &vecSrc, autoaim_params_t ¶ms ); + virtual bool ShouldAutoaim( void ); + void SetTargetInfo( Vector &vecSrc, float flDist ); + + void SetViewEntity( CBaseEntity *pEntity ); + CBaseEntity *GetViewEntity( void ) { return m_hViewEntity; } + + virtual void ForceClientDllUpdate( void ); // Forces all client .dll specific data to be resent to client. + + void DeathMessage( CBaseEntity *pKiller ); + + virtual void ProcessUsercmds( CUserCmd *cmds, int numcmds, int totalcmds, + int dropped_packets, bool paused ); + bool IsUserCmdDataValid( CUserCmd *pCmd ); + + void AvoidPhysicsProps( CUserCmd *pCmd ); + + // Run a user command. The default implementation calls ::PlayerRunCommand. In TF, this controls a vehicle if + // the player is in one. + virtual void PlayerRunCommand(CUserCmd *ucmd, IMoveHelper *moveHelper); + void RunNullCommand(); + CUserCmd * GetCurrentCommand( void ) { return m_pCurrentCommand; } + float GetTimeSinceLastUserCommand( void ) { return ( !IsConnected() || IsFakeClient() || IsBot() ) ? 0.f : gpGlobals->curtime - m_flLastUserCommandTime; } + + // Team Handling + virtual void ChangeTeam( int iTeamNum ) { ChangeTeam(iTeamNum,false, false); } + virtual void ChangeTeam( int iTeamNum, bool bAutoTeam, bool bSilent ); + + // say/sayteam allowed? + virtual bool CanHearAndReadChatFrom( CBasePlayer *pPlayer ) { return true; } + virtual bool CanSpeak( void ) { return true; } + + audioparams_t &GetAudioParams() { return m_Local.m_audio; } + + virtual void ModifyOrAppendPlayerCriteria( AI_CriteriaSet& set ); + + const QAngle& GetPunchAngle(); + void SetPunchAngle( const QAngle &punchAngle ); + + virtual void DoMuzzleFlash(); + + const char *GetLastKnownPlaceName( void ) const { return m_szLastPlaceName; } // return the last nav place name the player occupied + + virtual void CheckChatText( char *p, int bufsize ) {} + + virtual void CreateRagdollEntity( void ) { return; } + + virtual void HandleAnimEvent( animevent_t *pEvent ); + + virtual bool ShouldAnnounceAchievement( void ){ return true; } + +#if defined USES_ECON_ITEMS + // Wearables + virtual void EquipWearable( CEconWearable *pItem ); + virtual void RemoveWearable( CEconWearable *pItem ); + void PlayWearableAnimsForPlaybackEvent( wearableanimplayback_t iPlayback ); +#endif + +public: + // Player Physics Shadow + void SetupVPhysicsShadow( const Vector &vecAbsOrigin, const Vector &vecAbsVelocity, CPhysCollide *pStandModel, const char *pStandHullName, CPhysCollide *pCrouchModel, const char *pCrouchHullName ); + IPhysicsPlayerController* GetPhysicsController() { return m_pPhysicsController; } + virtual void VPhysicsCollision( int index, gamevcollisionevent_t *pEvent ); + void VPhysicsUpdate( IPhysicsObject *pPhysics ); + virtual void VPhysicsShadowUpdate( IPhysicsObject *pPhysics ); + virtual bool IsFollowingPhysics( void ) { return false; } + bool IsRideablePhysics( IPhysicsObject *pPhysics ); + IPhysicsObject *GetGroundVPhysics(); + + virtual void Touch( CBaseEntity *pOther ); + void SetTouchedPhysics( bool bTouch ); + bool TouchedPhysics( void ); + Vector GetSmoothedVelocity( void ); + + virtual void RefreshCollisionBounds( void ); + virtual void InitVCollision( const Vector &vecAbsOrigin, const Vector &vecAbsVelocity ); + virtual void VPhysicsDestroyObject(); + void SetVCollisionState( const Vector &vecAbsOrigin, const Vector &vecAbsVelocity, int collisionState ); + void PostThinkVPhysics( void ); + virtual void UpdatePhysicsShadowToCurrentPosition(); + void UpdatePhysicsShadowToPosition( const Vector &vecAbsOrigin ); + void UpdateVPhysicsPosition( const Vector &position, const Vector &velocity, float secondsToArrival ); + + // Hint system + virtual CHintSystem *Hints( void ) { return NULL; } + bool ShouldShowHints( void ) { return Hints() ? Hints()->ShouldShowHints() : false; } + void SetShowHints( bool bShowHints ) { if (Hints()) Hints()->SetShowHints( bShowHints ); } + bool HintMessage( int hint, bool bForce = false ) { return Hints() ? Hints()->HintMessage( hint, bForce ) : false; } + void HintMessage( const char *pMessage ) { if (Hints()) Hints()->HintMessage( pMessage ); } + void StartHintTimer( int iHintID ) { if (Hints()) Hints()->StartHintTimer( iHintID ); } + void StopHintTimer( int iHintID ) { if (Hints()) Hints()->StopHintTimer( iHintID ); } + void RemoveHintTimer( int iHintID ) { if (Hints()) Hints()->RemoveHintTimer( iHintID ); } + + // Accessor methods + int FragCount() const { return m_iFrags; } + int DeathCount() const { return m_iDeaths;} + bool IsConnected() const { return m_iConnected != PlayerDisconnected; } + bool IsDisconnecting() const { return m_iConnected == PlayerDisconnecting; } + bool IsSuitEquipped() const { return m_Local.m_bWearingSuit; } + int ArmorValue() const { return m_ArmorValue; } + bool HUDNeedsRestart() const { return m_fInitHUD; } + float MaxSpeed() const { return m_flMaxspeed; } + Activity GetActivity( ) const { return m_Activity; } + inline void SetActivity( Activity eActivity ) { m_Activity = eActivity; } + bool IsPlayerLockedInPlace() const { return m_iPlayerLocked != 0; } + bool IsObserver() const { return (m_afPhysicsFlags & PFLAG_OBSERVER) != 0; } + bool IsOnTarget() const { return m_fOnTarget; } + float MuzzleFlashTime() const { return m_flFlashTime; } + float PlayerDrownTime() const { return m_AirFinished; } + + int GetObserverMode() const { return m_iObserverMode; } + CBaseEntity *GetObserverTarget() const { return m_hObserverTarget; } + + // Round gamerules + virtual bool IsReadyToPlay( void ) { return true; } + virtual bool IsReadyToSpawn( void ) { return true; } + virtual bool ShouldGainInstantSpawn( void ) { return false; } + virtual void ResetPerRoundStats( void ) { return; } + void AllowInstantSpawn( void ) { m_bAllowInstantSpawn = true; } + + virtual void ResetScores( void ) { ResetFragCount(); ResetDeathCount(); } + void ResetFragCount(); + void IncrementFragCount( int nCount ); + + void ResetDeathCount(); + void IncrementDeathCount( int nCount ); + + void SetArmorValue( int value ); + void IncrementArmorValue( int nCount, int nMaxValue = -1 ); + + void SetConnected( PlayerConnectedState iConnected ) { m_iConnected = iConnected; } + virtual void EquipSuit( bool bPlayEffects = true ); + virtual void RemoveSuit( void ); + void SetMaxSpeed( float flMaxSpeed ) { m_flMaxspeed = flMaxSpeed; } + + void NotifyNearbyRadiationSource( float flRange ); + + void SetAnimationExtension( const char *pExtension ); + + void SetAdditionalPVSOrigin( const Vector &vecOrigin ); + void SetCameraPVSOrigin( const Vector &vecOrigin ); + void SetMuzzleFlashTime( float flTime ); + void SetUseEntity( CBaseEntity *pUseEntity ); + CBaseEntity *GetUseEntity(); + + virtual float GetPlayerMaxSpeed(); + + // Used to set private physics flags PFLAG_* + void SetPhysicsFlag( int nFlag, bool bSet ); + + void AllowImmediateDecalPainting(); + + // Suicide... + virtual void CommitSuicide( bool bExplode = false, bool bForce = false ); + virtual void CommitSuicide( const Vector &vecForce, bool bExplode = false, bool bForce = false ); + + // For debugging... + void ForceOrigin( const Vector &vecOrigin ); + + // Bot accessors... + void SetTimeBase( float flTimeBase ); + float GetTimeBase() const; + void SetLastUserCommand( const CUserCmd &cmd ); + const CUserCmd *GetLastUserCommand( void ); + + virtual bool IsBot() const; // IMPORTANT: This returns true for ANY type of bot. If your game uses different, incompatible types of bots check your specific bot type before casting + virtual bool IsBotOfType( int botType ) const; // return true if this player is a bot of the specific type (zero is invalid) + virtual int GetBotType( void ) const; // return a unique int representing the type of bot instance this is + + bool IsPredictingWeapons( void ) const; + int CurrentCommandNumber() const; + const CUserCmd *GetCurrentUserCommand() const; + + int GetFOV( void ); // Get the current FOV value + int GetDefaultFOV( void ) const; // Default FOV if not specified otherwise + int GetFOVForNetworking( void ); // Get the current FOV used for network computations + bool SetFOV( CBaseEntity *pRequester, int FOV, float zoomRate = 0.0f, int iZoomStart = 0 ); // Alters the base FOV of the player (must have a valid requester) + void SetDefaultFOV( int FOV ); // Sets the base FOV if nothing else is affecting it by zooming + CBaseEntity *GetFOVOwner( void ) { return m_hZoomOwner; } + float GetFOVDistanceAdjustFactor(); // shared between client and server + float GetFOVDistanceAdjustFactorForNetworking(); + + int GetImpulse( void ) const { return m_nImpulse; } + + // Movement constraints + void ActivateMovementConstraint( CBaseEntity *pEntity, const Vector &vecCenter, float flRadius, float flConstraintWidth, float flSpeedFactor ); + void DeactivateMovementConstraint( ); + + // talk control + void NotePlayerTalked() { m_fLastPlayerTalkTime = gpGlobals->curtime; } + float LastTimePlayerTalked() { return m_fLastPlayerTalkTime; } + + void DisableButtons( int nButtons ); + void EnableButtons( int nButtons ); + void ForceButtons( int nButtons ); + void UnforceButtons( int nButtons ); + + //--------------------------------- + // Inputs + //--------------------------------- + void InputSetHealth( inputdata_t &inputdata ); + void InputSetHUDVisibility( inputdata_t &inputdata ); + + surfacedata_t *GetSurfaceData( void ) { return m_pSurfaceData; } + void SetLadderNormal( Vector vecLadderNormal ) { m_vecLadderNormal = vecLadderNormal; } + + // Here so that derived classes can use the expresser + virtual CAI_Expresser *GetExpresser() { return NULL; }; + +#if !defined(NO_STEAM) + //---------------------------- + // Steam handling + bool GetSteamID( CSteamID *pID ); + uint64 GetSteamIDAsUInt64( void ); +#endif + + float GetRemainingMovementTimeForUserCmdProcessing() const { return m_flMovementTimeForUserCmdProcessingRemaining; } + float ConsumeMovementTimeForUserCmdProcessing( float flTimeNeeded ) + { + if ( m_flMovementTimeForUserCmdProcessingRemaining <= 0.0f ) + { + return 0.0f; + } + else if ( flTimeNeeded > m_flMovementTimeForUserCmdProcessingRemaining + FLT_EPSILON ) + { + float flResult = m_flMovementTimeForUserCmdProcessingRemaining; + m_flMovementTimeForUserCmdProcessingRemaining = 0.0f; + return flResult; + } + else + { + m_flMovementTimeForUserCmdProcessingRemaining -= flTimeNeeded; + if ( m_flMovementTimeForUserCmdProcessingRemaining < 0.0f ) + m_flMovementTimeForUserCmdProcessingRemaining = 0.0f; + return flTimeNeeded; + } + } + +private: + // How much of a movement time buffer can we process from this user? + float m_flMovementTimeForUserCmdProcessingRemaining; + + // For queueing up CUserCmds and running them from PhysicsSimulate + int GetCommandContextCount( void ) const; + CCommandContext *GetCommandContext( int index ); + CCommandContext *AllocCommandContext( void ); + void RemoveCommandContext( int index ); + void RemoveAllCommandContexts( void ); + CCommandContext *RemoveAllCommandContextsExceptNewest( void ); + void ReplaceContextCommands( CCommandContext *ctx, CUserCmd *pCommands, int nCommands ); + + int DetermineSimulationTicks( void ); + void AdjustPlayerTimeBase( int simulation_ticks ); + +public: + + + + // Used by gamemovement to check if the entity is stuck. + int m_StuckLast; + + // FIXME: Make these protected or private! + + // This player's data that should only be replicated to + // the player and not to other players. + CNetworkVarEmbedded( CPlayerLocalData, m_Local ); + +#if defined USES_ECON_ITEMS + CNetworkVarEmbedded( CAttributeList, m_AttributeList ); +#endif + + void InitFogController( void ); + void InputSetFogController( inputdata_t &inputdata ); + + // Used by env_soundscape_triggerable to manage when the player is touching multiple + // soundscape triggers simultaneously. + // The one at the HEAD of the list is always the current soundscape for the player. + CUtlVector<EHANDLE> m_hTriggerSoundscapeList; + + // Player data that's sometimes needed by the engine + CNetworkVarEmbedded( CPlayerState, pl ); + + IMPLEMENT_NETWORK_VAR_FOR_DERIVED( m_fFlags ); + + IMPLEMENT_NETWORK_VAR_FOR_DERIVED( m_vecViewOffset ); + IMPLEMENT_NETWORK_VAR_FOR_DERIVED( m_flFriction ); + IMPLEMENT_NETWORK_VAR_FOR_DERIVED( m_iAmmo ); + + IMPLEMENT_NETWORK_VAR_FOR_DERIVED( m_hGroundEntity ); + + IMPLEMENT_NETWORK_VAR_FOR_DERIVED( m_lifeState ); + IMPLEMENT_NETWORK_VAR_FOR_DERIVED( m_iHealth ); + IMPLEMENT_NETWORK_VAR_FOR_DERIVED( m_vecBaseVelocity ); + IMPLEMENT_NETWORK_VAR_FOR_DERIVED( m_nNextThinkTick ); + IMPLEMENT_NETWORK_VAR_FOR_DERIVED( m_vecVelocity ); + IMPLEMENT_NETWORK_VAR_FOR_DERIVED( m_nWaterLevel ); + + int m_nButtons; + int m_afButtonPressed; + int m_afButtonReleased; + int m_afButtonLast; + int m_afButtonDisabled; // A mask of input flags that are cleared automatically + int m_afButtonForced; // These are forced onto the player's inputs + + CNetworkVar( bool, m_fOnTarget ); //Is the crosshair on a target? + + char m_szAnimExtension[32]; + + int m_nUpdateRate; // user snapshot rate cl_updaterate + float m_fLerpTime; // users cl_interp + bool m_bLagCompensation; // user wants lag compenstation + bool m_bPredictWeapons; // user has client side predicted weapons + + float GetDeathTime( void ) { return m_flDeathTime; } + + void ClearZoomOwner( void ); + + void SetPreviouslyPredictedOrigin( const Vector &vecAbsOrigin ); + const Vector &GetPreviouslyPredictedOrigin() const; + float GetFOVTime( void ){ return m_flFOVTime; } + + void AdjustDrownDmg( int nAmount ); + +#if defined USES_ECON_ITEMS + CEconWearable *GetWearable( int i ) { return m_hMyWearables[i]; } + int GetNumWearables( void ) { return m_hMyWearables.Count(); } +#endif + +private: + + Activity m_Activity; + +protected: + + void CalcPlayerView( Vector& eyeOrigin, QAngle& eyeAngles, float& fov ); + void CalcVehicleView( IServerVehicle *pVehicle, Vector& eyeOrigin, QAngle& eyeAngles, + float& zNear, float& zFar, float& fov ); + void CalcObserverView( Vector& eyeOrigin, QAngle& eyeAngles, float& fov ); + void CalcViewModelView( const Vector& eyeOrigin, const QAngle& eyeAngles); + + // FIXME: Make these private! (tf_player uses them) + + // Secondary point to derive PVS from when zoomed in with binoculars/sniper rifle. The PVS is + // a merge of the standing origin and this additional origin + Vector m_vecAdditionalPVSOrigin; + // Extra PVS origin if we are using a camera object + Vector m_vecCameraPVSOrigin; + + CNetworkHandle( CBaseEntity, m_hUseEntity ); // the player is currently controlling this entity because of +USE latched, NULL if no entity + + int m_iTrain; // Train control position + + float m_iRespawnFrames; // used in PlayerDeathThink() to make sure players can always respawn + unsigned int m_afPhysicsFlags; // physics flags - set when 'normal' physics should be revisited or overriden + + // Vehicles + CNetworkHandle( CBaseEntity, m_hVehicle ); + + int m_iVehicleAnalogBias; + + void UpdateButtonState( int nUserCmdButtonMask ); + + bool m_bPauseBonusProgress; + CNetworkVar( int, m_iBonusProgress ); + CNetworkVar( int, m_iBonusChallenge ); + + int m_lastDamageAmount; // Last damage taken + + Vector m_DmgOrigin; + float m_DmgTake; + float m_DmgSave; + int m_bitsDamageType; // what types of damage has player taken + int m_bitsHUDDamage; // Damage bits for the current fame. These get sent to the hud via gmsgDamage + + CNetworkVar( float, m_flDeathTime ); // the time at which the player died (used in PlayerDeathThink()) + float m_flDeathAnimTime; // the time at which the player finished their death anim (used in PlayerDeathThink() and ShouldTransmit()) + + CNetworkVar( int, m_iObserverMode ); // if in spectator mode != 0 + CNetworkVar( int, m_iFOV ); // field of view + CNetworkVar( int, m_iDefaultFOV ); // default field of view + CNetworkVar( int, m_iFOVStart ); // What our FOV started at + CNetworkVar( float, m_flFOVTime ); // Time our FOV change started + + int m_iObserverLastMode; // last used observer mode + CNetworkHandle( CBaseEntity, m_hObserverTarget ); // entity handle to m_iObserverTarget + bool m_bForcedObserverMode; // true, player was forced by invalid targets to switch mode + + CNetworkHandle( CBaseEntity, m_hZoomOwner ); //This is a pointer to the entity currently controlling the player's zoom + //Only this entity can change the zoom state once it has ownership + + float m_tbdPrev; // Time-based damage timer + int m_idrowndmg; // track drowning damage taken + int m_idrownrestored; // track drowning damage restored + int m_nPoisonDmg; // track recoverable poison damage taken + int m_nPoisonRestored; // track poison damage restored + // NOTE: bits damage type appears to only be used for time-based damage + BYTE m_rgbTimeBasedDamage[CDMG_TIMEBASED]; + + // Player Physics Shadow + int m_vphysicsCollisionState; + + virtual int SpawnArmorValue( void ) const { return 0; } + + float m_fNextSuicideTime; // the time after which the player can next use the suicide command + int m_iSuicideCustomKillFlags; + + // Replay mode + float m_fDelay; // replay delay in seconds + float m_fReplayEnd; // time to stop replay mode + int m_iReplayEntity; // follow this entity in replay + +private: + void HandleFuncTrain(); + +// DATA +private: + CUtlVector< CCommandContext > m_CommandContext; + // Player Physics Shadow + +protected: //used to be private, but need access for portal mod (Dave Kircher) + IPhysicsPlayerController *m_pPhysicsController; + IPhysicsObject *m_pShadowStand; + IPhysicsObject *m_pShadowCrouch; + Vector m_oldOrigin; + Vector m_vecSmoothedVelocity; + bool m_touchedPhysObject; + bool m_bPhysicsWasFrozen; + +private: + + int m_iPlayerSound;// the index of the sound list slot reserved for this player + int m_iTargetVolume;// ideal sound volume. + + int m_rgItems[MAX_ITEMS]; + + // these are time-sensitive things that we keep track of + float m_flSwimTime; // how long player has been underwater + float m_flDuckTime; // how long we've been ducking + float m_flDuckJumpTime; + + float m_flSuitUpdate; // when to play next suit update + int m_rgSuitPlayList[CSUITPLAYLIST];// next sentencenum to play for suit update + int m_iSuitPlayNext; // next sentence slot for queue storage; + int m_rgiSuitNoRepeat[CSUITNOREPEAT]; // suit sentence no repeat list + float m_rgflSuitNoRepeatTime[CSUITNOREPEAT]; // how long to wait before allowing repeat + + float m_flgeigerRange; // range to nearest radiation source + float m_flgeigerDelay; // delay per update of range msg to client + int m_igeigerRangePrev; + + bool m_fInitHUD; // True when deferred HUD restart msg needs to be sent + bool m_fGameHUDInitialized; + bool m_fWeapon; // Set this to FALSE to force a reset of the current weapon HUD info + + int m_iUpdateTime; // stores the number of frame ticks before sending HUD update messages + int m_iClientBattery; // the Battery currently known by the client. If this changes, send a new + + // Autoaim data + QAngle m_vecAutoAim; + int m_lastx, m_lasty; // These are the previous update's crosshair angles, DON"T SAVE/RESTORE + + int m_iFrags; + int m_iDeaths; + + float m_flNextDecalTime;// next time this player can spray a decal + + // Team Handling + // char m_szTeamName[TEAM_NAME_LENGTH]; + + // Multiplayer handling + PlayerConnectedState m_iConnected; + + // from edict_t + // CBasePlayer doesn't send this but CCSPlayer does. + CNetworkVarForDerived( int, m_ArmorValue ); + float m_AirFinished; + float m_PainFinished; + + // player locking + int m_iPlayerLocked; + +protected: + // the player's personal view model + typedef CHandle<CBaseViewModel> CBaseViewModelHandle; + CNetworkArray( CBaseViewModelHandle, m_hViewModel, MAX_VIEWMODELS ); + + // Last received usercmd (in case we drop a lot of packets ) + CUserCmd m_LastCmd; + CUserCmd *m_pCurrentCommand; + + float m_flStepSoundTime; // time to check for next footstep sound + + bool m_bAllowInstantSpawn; + +#if defined USES_ECON_ITEMS + // Wearables + CUtlVector<CHandle<CEconWearable > > m_hMyWearables; +#endif + +private: + +// Replicated to all clients + CNetworkVar( float, m_flMaxspeed ); + +// Not transmitted + float m_flWaterJumpTime; // used to be called teleport_time + Vector m_vecWaterJumpVel; + int m_nImpulse; + float m_flSwimSoundTime; + Vector m_vecLadderNormal; + + float m_flFlashTime; + int m_nDrownDmgRate; // Drowning damage in points per second without air. + + int m_nNumCrouches; // Number of times we've crouched (for hinting) + bool m_bDuckToggled; // If true, the player is crouching via a toggle + +public: + bool GetToggledDuckState( void ) { return m_bDuckToggled; } + void ToggleDuck( void ); + float GetStickDist( void ); + + float m_flForwardMove; + float m_flSideMove; + int m_nNumCrateHudHints; + +private: + + // Used in test code to teleport the player to random locations in the map. + Vector m_vForcedOrigin; + bool m_bForceOrigin; + + // Clients try to run on their own realtime clock, this is this client's clock + CNetworkVar( int, m_nTickBase ); + + bool m_bGamePaused; + float m_fLastPlayerTalkTime; + + CNetworkVar( CBaseCombatWeaponHandle, m_hLastWeapon ); + +#if !defined( NO_ENTITY_PREDICTION ) + CUtlVector< CHandle< CBaseEntity > > m_SimulatedByThisPlayer; +#endif + + float m_flOldPlayerZ; + float m_flOldPlayerViewOffsetZ; + + bool m_bPlayerUnderwater; + + EHANDLE m_hViewEntity; + + // Movement constraints + CNetworkHandle( CBaseEntity, m_hConstraintEntity ); + CNetworkVector( m_vecConstraintCenter ); + CNetworkVar( float, m_flConstraintRadius ); + CNetworkVar( float, m_flConstraintWidth ); + CNetworkVar( float, m_flConstraintSpeedFactor ); + + friend class CPlayerMove; + friend class CPlayerClass; + + // Player name + char m_szNetname[MAX_PLAYER_NAME_LENGTH]; + +protected: + // HACK FOR TF2 Prediction + friend class CTFGameMovementRecon; + friend class CGameMovement; + friend class CTFGameMovement; + friend class CHL1GameMovement; + friend class CCSGameMovement; + friend class CHL2GameMovement; + friend class CDODGameMovement; + friend class CPortalGameMovement; + + // Accessors for gamemovement + bool IsDucked( void ) const { return m_Local.m_bDucked; } + bool IsDucking( void ) const { return m_Local.m_bDucking; } + float GetStepSize( void ) const { return m_Local.m_flStepSize; } + + CNetworkVar( float, m_flLaggedMovementValue ); + + // These are generated while running usercmds, then given to UpdateVPhysicsPosition after running all queued commands. + Vector m_vNewVPhysicsPosition; + Vector m_vNewVPhysicsVelocity; + + Vector m_vecVehicleViewOrigin; // Used to store the calculated view of the player while riding in a vehicle + QAngle m_vecVehicleViewAngles; // Vehicle angles + float m_flVehicleViewFOV; // FOV of the vehicle driver + int m_nVehicleViewSavedFrame; // Used to mark which frame was the last one the view was calculated for + + Vector m_vecPreviouslyPredictedOrigin; // Used to determine if non-gamemovement game code has teleported, or tweaked the player's origin + int m_nBodyPitchPoseParam; + + CNetworkString( m_szLastPlaceName, MAX_PLACE_NAME_LENGTH ); + + char m_szNetworkIDString[MAX_NETWORKID_LENGTH]; + CPlayerInfo m_PlayerInfo; + + // Texture names and surface data, used by CGameMovement + int m_surfaceProps; + surfacedata_t* m_pSurfaceData; + float m_surfaceFriction; + char m_chTextureType; + char m_chPreviousTextureType; // Separate from m_chTextureType. This is cleared if the player's not on the ground. + + bool m_bSinglePlayerGameEnding; + +public: + + float GetLaggedMovementValue( void ){ return m_flLaggedMovementValue; } + void SetLaggedMovementValue( float flValue ) { m_flLaggedMovementValue = flValue; } + + inline bool IsAutoKickDisabled( void ) const; + inline void DisableAutoKick( bool disabled ); + + void DumpPerfToRecipient( CBasePlayer *pRecipient, int nMaxRecords ); + // NVNT returns true if user has a haptic device + virtual bool HasHaptics(){return m_bhasHaptics;} + // NVNT sets weather a user should receive haptic device messages. + virtual void SetHaptics(bool has) { m_bhasHaptics = has;} +private: + // NVNT member variable holding if this user is using a haptic device. + bool m_bhasHaptics; + + bool m_autoKickDisabled; + + struct StepSoundCache_t + { + StepSoundCache_t() : m_usSoundNameIndex( 0 ) {} + CSoundParameters m_SoundParameters; + unsigned short m_usSoundNameIndex; + }; + // One for left and one for right side of step + StepSoundCache_t m_StepSoundCache[ 2 ]; + + CUtlLinkedList< CPlayerSimInfo > m_vecPlayerSimInfo; + CUtlLinkedList< CPlayerCmdInfo > m_vecPlayerCmdInfo; + + IntervalTimer m_weaponFiredTimer; + + // Store the last time we successfully processed a usercommand + float m_flLastUserCommandTime; + +public: + virtual unsigned int PlayerSolidMask( bool brushOnly = false ) const; // returns the solid mask for the given player, so bots can have a more-restrictive set + +}; + +typedef CHandle<CBasePlayer> CBasePlayerHandle; + +EXTERN_SEND_TABLE(DT_BasePlayer) + + + +//----------------------------------------------------------------------------- +// Inline methods +//----------------------------------------------------------------------------- +inline bool CBasePlayer::IsBotOfType( int botType ) const +{ + // bot type of zero is invalid + return ( GetBotType() != 0 ) && ( GetBotType() == botType ); +} + +inline int CBasePlayer::GetBotType( void ) const +{ + return 0; +} + +inline bool CBasePlayer::IsAutoKickDisabled( void ) const +{ + return m_autoKickDisabled; +} + +inline void CBasePlayer::DisableAutoKick( bool disabled ) +{ + m_autoKickDisabled = disabled; +} + +inline void CBasePlayer::SetAdditionalPVSOrigin( const Vector &vecOrigin ) +{ + m_vecAdditionalPVSOrigin = vecOrigin; +} + +inline void CBasePlayer::SetCameraPVSOrigin( const Vector &vecOrigin ) +{ + m_vecCameraPVSOrigin = vecOrigin; +} + +inline void CBasePlayer::SetMuzzleFlashTime( float flTime ) +{ + m_flFlashTime = flTime; +} + +inline void CBasePlayer::SetUseEntity( CBaseEntity *pUseEntity ) +{ + m_hUseEntity = pUseEntity; +} + +inline CBaseEntity *CBasePlayer::GetUseEntity() +{ + return m_hUseEntity; +} + +// Bot accessors... +inline void CBasePlayer::SetTimeBase( float flTimeBase ) +{ + m_nTickBase = TIME_TO_TICKS( flTimeBase ); +} + +inline void CBasePlayer::SetLastUserCommand( const CUserCmd &cmd ) +{ + m_LastCmd = cmd; +} + +inline CUserCmd const *CBasePlayer::GetLastUserCommand( void ) +{ + return &m_LastCmd; +} + +inline bool CBasePlayer::IsPredictingWeapons( void ) const +{ + return m_bPredictWeapons; +} + +inline int CBasePlayer::CurrentCommandNumber() const +{ + Assert( m_pCurrentCommand ); + return m_pCurrentCommand->command_number; +} + +inline const CUserCmd *CBasePlayer::GetCurrentUserCommand() const +{ + Assert( m_pCurrentCommand ); + return m_pCurrentCommand; +} + +inline IServerVehicle *CBasePlayer::GetVehicle() +{ + CBaseEntity *pVehicleEnt = m_hVehicle.Get(); + return pVehicleEnt ? pVehicleEnt->GetServerVehicle() : NULL; +} + +inline CBaseEntity *CBasePlayer::GetVehicleEntity() +{ + return m_hVehicle.Get(); +} + +inline bool CBasePlayer::IsInAVehicle( void ) const +{ + return ( NULL != m_hVehicle.Get() ) ? true : false; +} + +inline void CBasePlayer::SetTouchedPhysics( bool bTouch ) +{ + m_touchedPhysObject = bTouch; +} + +inline bool CBasePlayer::TouchedPhysics( void ) +{ + return m_touchedPhysObject; +} + +inline void CBasePlayer::OnMyWeaponFired( CBaseCombatWeapon *weapon ) +{ + m_weaponFiredTimer.Start(); +} + +inline float CBasePlayer::GetTimeSinceWeaponFired( void ) const +{ + return m_weaponFiredTimer.GetElapsedTime(); +} + +inline bool CBasePlayer::IsFiringWeapon( void ) const +{ + return m_weaponFiredTimer.HasStarted() && m_weaponFiredTimer.IsLessThen( 1.0f ); +} + + + +//----------------------------------------------------------------------------- +// Converts an entity to a player +//----------------------------------------------------------------------------- +inline CBasePlayer *ToBasePlayer( CBaseEntity *pEntity ) +{ + if ( !pEntity || !pEntity->IsPlayer() ) + return NULL; +#if _DEBUG + return dynamic_cast<CBasePlayer *>( pEntity ); +#else + return static_cast<CBasePlayer *>( pEntity ); +#endif +} + +inline const CBasePlayer *ToBasePlayer( const CBaseEntity *pEntity ) +{ + if ( !pEntity || !pEntity->IsPlayer() ) + return NULL; +#if _DEBUG + return dynamic_cast<const CBasePlayer *>( pEntity ); +#else + return static_cast<const CBasePlayer *>( pEntity ); +#endif +} + + +//-------------------------------------------------------------------------------------------------------------- +/** + * DEPRECATED: Use CollectPlayers() instead. + * Iterate over all active players in the game, invoking functor on each. + * If functor returns false, stop iteration and return false. + */ +template < typename Functor > +bool ForEachPlayer( Functor &func ) +{ + for( int i=1; i<=gpGlobals->maxClients; ++i ) + { + CBasePlayer *player = static_cast<CBasePlayer *>( UTIL_PlayerByIndex( i ) ); + + if (player == NULL) + continue; + + if (FNullEnt( player->edict() )) + continue; + + if (!player->IsPlayer()) + continue; + + if( !player->IsConnected() ) + continue; + + if (func( player ) == false) + return false; + } + + return true; +} + + +//----------------------------------------------------------------------------------------------- +/** + * The interface for an iterative player functor + */ +class IPlayerFunctor +{ +public: + virtual void OnBeginIteration( void ) { } // invoked once before iteration begins + + virtual bool operator() ( CBasePlayer *player ) = 0; + + virtual void OnEndIteration( bool allElementsIterated ) { } // invoked once after iteration is complete whether successful or not +}; + + +//-------------------------------------------------------------------------------------------------------------- +/** + * DEPRECATED: Use CollectPlayers() instead. + * Specialization of ForEachPlayer template for IPlayerFunctors + */ +template <> +inline bool ForEachPlayer( IPlayerFunctor &func ) +{ + func.OnBeginIteration(); + + bool isComplete = true; + + for( int i=1; i<=gpGlobals->maxClients; ++i ) + { + CBasePlayer *player = static_cast<CBasePlayer *>( UTIL_PlayerByIndex( i ) ); + + if (player == NULL) + continue; + + if (FNullEnt( player->edict() )) + continue; + + if (!player->IsPlayer()) + continue; + + if( !player->IsConnected() ) + continue; + + if (func( player ) == false) + { + isComplete = false; + break; + } + } + + func.OnEndIteration( isComplete ); + + return isComplete; +} + +//-------------------------------------------------------------------------------------------------------------- +// +// Collect all valid, connected players into given vector. +// Returns number of players collected. +// +#define COLLECT_ONLY_LIVING_PLAYERS true +#define APPEND_PLAYERS true +template < typename T > +int CollectPlayers( CUtlVector< T * > *playerVector, int team = TEAM_ANY, bool isAlive = false, bool shouldAppend = false ) +{ + if ( !shouldAppend ) + { + playerVector->RemoveAll(); + } + + for( int i=1; i<=gpGlobals->maxClients; ++i ) + { + CBasePlayer *player = UTIL_PlayerByIndex( i ); + + if ( player == NULL ) + continue; + + if ( FNullEnt( player->edict() ) ) + continue; + + if ( !player->IsPlayer() ) + continue; + + if ( !player->IsConnected() ) + continue; + + if ( team != TEAM_ANY && player->GetTeamNumber() != team ) + continue; + + if ( isAlive && !player->IsAlive() ) + continue; + + playerVector->AddToTail( assert_cast< T * >( player ) ); + } + + return playerVector->Count(); +} + +template < typename T > +int CollectHumanPlayers( CUtlVector< T * > *playerVector, int team = TEAM_ANY, bool isAlive = false, bool shouldAppend = false ) +{ + if ( !shouldAppend ) + { + playerVector->RemoveAll(); + } + + for( int i=1; i<=gpGlobals->maxClients; ++i ) + { + CBasePlayer *player = UTIL_PlayerByIndex( i ); + + if ( player == NULL ) + continue; + + if ( FNullEnt( player->edict() ) ) + continue; + + if ( !player->IsPlayer() ) + continue; + + if ( player->IsBot() ) + continue; + + if ( !player->IsConnected() ) + continue; + + if ( team != TEAM_ANY && player->GetTeamNumber() != team ) + continue; + + if ( isAlive && !player->IsAlive() ) + continue; + + playerVector->AddToTail( assert_cast< T * >( player ) ); + } + + return playerVector->Count(); +} + +enum +{ + VEHICLE_ANALOG_BIAS_NONE = 0, + VEHICLE_ANALOG_BIAS_FORWARD, + VEHICLE_ANALOG_BIAS_REVERSE, +}; + +#endif // PLAYER_H |