You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
254 lines
8.3 KiB
254 lines
8.3 KiB
5 years ago
|
//========= Copyright Valve Corporation, All rights reserved. ============//
|
||
|
//
|
||
|
// Purpose:
|
||
|
//
|
||
|
// $NoKeywords: $
|
||
|
//
|
||
|
//=============================================================================//
|
||
|
#ifndef PORTAL_PLAYER_H
|
||
|
#define PORTAL_PLAYER_H
|
||
|
#pragma once
|
||
|
|
||
|
class CPortal_Player;
|
||
|
|
||
|
#include "player.h"
|
||
|
#include "portal_playeranimstate.h"
|
||
|
#include "hl2_playerlocaldata.h"
|
||
|
#include "hl2_player.h"
|
||
|
#include "simtimer.h"
|
||
|
#include "soundenvelope.h"
|
||
|
#include "portal_player_shared.h"
|
||
|
#include "prop_portal.h"
|
||
|
#include "weapon_portalbase.h"
|
||
|
#include "in_buttons.h"
|
||
|
#include "func_liquidportal.h"
|
||
|
#include "ai_speech.h" // For expresser host
|
||
|
|
||
|
struct PortalPlayerStatistics_t
|
||
|
{
|
||
|
int iNumPortalsPlaced;
|
||
|
int iNumStepsTaken;
|
||
|
float fNumSecondsTaken;
|
||
|
};
|
||
|
|
||
|
//=============================================================================
|
||
|
// >> Portal_Player
|
||
|
//=============================================================================
|
||
|
class CPortal_Player : public CAI_ExpresserHost<CHL2_Player>
|
||
|
{
|
||
|
public:
|
||
|
DECLARE_CLASS( CPortal_Player, CHL2_Player );
|
||
|
|
||
|
CPortal_Player();
|
||
|
~CPortal_Player( void );
|
||
|
|
||
|
static CPortal_Player *CreatePlayer( const char *className, edict_t *ed )
|
||
|
{
|
||
|
CPortal_Player::s_PlayerEdict = ed;
|
||
|
return (CPortal_Player*)CreateEntityByName( className );
|
||
|
}
|
||
|
|
||
|
DECLARE_SERVERCLASS();
|
||
|
DECLARE_DATADESC();
|
||
|
|
||
|
virtual void Precache( void );
|
||
|
virtual void CreateSounds( void );
|
||
|
virtual void StopLoopingSounds( void );
|
||
|
virtual void Spawn( void );
|
||
|
virtual void OnRestore( void );
|
||
|
virtual void Activate( void );
|
||
|
|
||
|
virtual void NotifySystemEvent( CBaseEntity *pNotify, notify_system_event_t eventType, const notify_system_event_params_t ¶ms );
|
||
|
|
||
|
virtual void PostThink( void );
|
||
|
virtual void PreThink( void );
|
||
|
virtual void PlayerDeathThink( void );
|
||
|
|
||
|
void UpdatePortalPlaneSounds( void );
|
||
|
void UpdateWooshSounds( void );
|
||
|
|
||
|
Activity TranslateActivity( Activity ActToTranslate, bool *pRequired = NULL );
|
||
|
virtual void Teleport( const Vector *newPosition, const QAngle *newAngles, const Vector *newVelocity );
|
||
|
|
||
|
Activity TranslateTeamActivity( Activity ActToTranslate );
|
||
|
|
||
|
virtual void SetAnimation( PLAYER_ANIM playerAnim );
|
||
|
|
||
|
virtual CAI_Expresser* GetExpresser( void );
|
||
|
|
||
|
virtual void PlayerRunCommand(CUserCmd *ucmd, IMoveHelper *moveHelper);
|
||
|
|
||
|
virtual bool ClientCommand( const CCommand &args );
|
||
|
virtual void CreateViewModel( int viewmodelindex = 0 );
|
||
|
virtual bool BecomeRagdollOnClient( const Vector &force );
|
||
|
virtual int OnTakeDamage( const CTakeDamageInfo &inputInfo );
|
||
|
virtual int OnTakeDamage_Alive( const CTakeDamageInfo &info );
|
||
|
virtual bool WantsLagCompensationOnEntity( const CBasePlayer *pPlayer, const CUserCmd *pCmd, const CBitVec<MAX_EDICTS> *pEntityTransmitBits ) const;
|
||
|
virtual void FireBullets ( const FireBulletsInfo_t &info );
|
||
|
virtual bool Weapon_Switch( CBaseCombatWeapon *pWeapon, int viewmodelindex = 0);
|
||
|
virtual bool BumpWeapon( CBaseCombatWeapon *pWeapon );
|
||
|
virtual void ShutdownUseEntity( void );
|
||
|
|
||
|
virtual const Vector& WorldSpaceCenter( ) const;
|
||
|
|
||
|
virtual void VPhysicsShadowUpdate( IPhysicsObject *pPhysics );
|
||
|
|
||
|
//virtual bool StartReplayMode( float fDelay, float fDuration, int iEntity );
|
||
|
//virtual void StopReplayMode();
|
||
|
virtual void Event_Killed( const CTakeDamageInfo &info );
|
||
|
virtual void Jump( void );
|
||
|
|
||
|
bool UseFoundEntity( CBaseEntity *pUseEntity );
|
||
|
CBaseEntity* FindUseEntity( void );
|
||
|
CBaseEntity* FindUseEntityThroughPortal( void );
|
||
|
|
||
|
virtual void PlayerUse( void );
|
||
|
//virtual bool StartObserverMode( int mode );
|
||
|
virtual void GetStepSoundVelocities( float *velwalk, float *velrun );
|
||
|
virtual void PlayStepSound( Vector &vecOrigin, surfacedata_t *psurface, float fvol, bool force );
|
||
|
virtual void UpdateOnRemove( void );
|
||
|
|
||
|
virtual void SetupVisibility( CBaseEntity *pViewEntity, unsigned char *pvs, int pvssize );
|
||
|
virtual void UpdatePortalViewAreaBits( unsigned char *pvs, int pvssize );
|
||
|
|
||
|
bool ValidatePlayerModel( const char *pModel );
|
||
|
|
||
|
QAngle GetAnimEyeAngles( void ) { return m_angEyeAngles.Get(); }
|
||
|
|
||
|
Vector GetAttackSpread( CBaseCombatWeapon *pWeapon, CBaseEntity *pTarget = NULL );
|
||
|
|
||
|
void CheatImpulseCommands( int iImpulse );
|
||
|
void CreateRagdollEntity( const CTakeDamageInfo &info );
|
||
|
void GiveAllItems( void );
|
||
|
void GiveDefaultItems( void );
|
||
|
|
||
|
void NoteWeaponFired( void );
|
||
|
|
||
|
void ResetAnimation( void );
|
||
|
|
||
|
void SetPlayerModel( void );
|
||
|
|
||
|
void UpdateExpression ( void );
|
||
|
void ClearExpression ( void );
|
||
|
|
||
|
int GetPlayerModelType( void ) { return m_iPlayerSoundType; }
|
||
|
|
||
|
void ForceDuckThisFrame( void );
|
||
|
void UnDuck ( void );
|
||
|
inline void ForceJumpThisFrame( void ) { ForceButtons( IN_JUMP ); }
|
||
|
|
||
|
void DoAnimationEvent( PlayerAnimEvent_t event, int nData );
|
||
|
void SetupBones( matrix3x4_t *pBoneToWorld, int boneMask );
|
||
|
|
||
|
// physics interactions
|
||
|
virtual void PickupObject(CBaseEntity *pObject, bool bLimitMassAndSize );
|
||
|
virtual void ForceDropOfCarriedPhysObjects( CBaseEntity *pOnlyIfHoldingThis );
|
||
|
|
||
|
void ToggleHeldObjectOnOppositeSideOfPortal( void ) { m_bHeldObjectOnOppositeSideOfPortal = !m_bHeldObjectOnOppositeSideOfPortal; }
|
||
|
void SetHeldObjectOnOppositeSideOfPortal( bool p_bHeldObjectOnOppositeSideOfPortal ) { m_bHeldObjectOnOppositeSideOfPortal = p_bHeldObjectOnOppositeSideOfPortal; }
|
||
|
bool IsHeldObjectOnOppositeSideOfPortal( void ) { return m_bHeldObjectOnOppositeSideOfPortal; }
|
||
|
CProp_Portal *GetHeldObjectPortal( void ) { return m_pHeldObjectPortal; }
|
||
|
void SetHeldObjectPortal( CProp_Portal *pPortal ) { m_pHeldObjectPortal = pPortal; }
|
||
|
|
||
|
void SetStuckOnPortalCollisionObject( void ) { m_bStuckOnPortalCollisionObject = true; }
|
||
|
|
||
|
CWeaponPortalBase* GetActivePortalWeapon() const;
|
||
|
|
||
|
void IncrementPortalsPlaced( void );
|
||
|
void IncrementStepsTaken( void );
|
||
|
void UpdateSecondsTaken( void );
|
||
|
void ResetThisLevelStats( void );
|
||
|
int NumPortalsPlaced( void ) const { return m_StatsThisLevel.iNumPortalsPlaced; }
|
||
|
int NumStepsTaken( void ) const { return m_StatsThisLevel.iNumStepsTaken; }
|
||
|
float NumSecondsTaken( void ) const { return m_StatsThisLevel.fNumSecondsTaken; }
|
||
|
|
||
|
void SetNeuroToxinDamageTime( float fCountdownSeconds ) { m_fNeuroToxinDamageTime = gpGlobals->curtime + fCountdownSeconds; }
|
||
|
|
||
|
void IncNumCamerasDetatched( void ) { ++m_iNumCamerasDetatched; }
|
||
|
int GetNumCamerasDetatched( void ) const { return m_iNumCamerasDetatched; }
|
||
|
|
||
|
Vector m_vecTotalBulletForce; //Accumulator for bullet force in a single frame
|
||
|
|
||
|
bool m_bSilentDropAndPickup;
|
||
|
|
||
|
// Tracks our ragdoll entity.
|
||
|
CNetworkHandle( CBaseEntity, m_hRagdoll ); // networked entity handle
|
||
|
|
||
|
void SuppressCrosshair( bool bState ) { m_bSuppressingCrosshair = bState; }
|
||
|
|
||
|
private:
|
||
|
|
||
|
virtual CAI_Expresser* CreateExpresser( void );
|
||
|
|
||
|
CSoundPatch *m_pWooshSound;
|
||
|
|
||
|
CNetworkQAngle( m_angEyeAngles );
|
||
|
|
||
|
CPortalPlayerAnimState* m_PlayerAnimState;
|
||
|
|
||
|
int m_iLastWeaponFireUsercmd;
|
||
|
CNetworkVar( int, m_iSpawnInterpCounter );
|
||
|
CNetworkVar( int, m_iPlayerSoundType );
|
||
|
CNetworkVar( bool, m_bSuppressingCrosshair );
|
||
|
|
||
|
CNetworkVar( bool, m_bHeldObjectOnOppositeSideOfPortal );
|
||
|
CNetworkHandle( CProp_Portal, m_pHeldObjectPortal ); // networked entity handle
|
||
|
|
||
|
bool m_bIntersectingPortalPlane;
|
||
|
bool m_bStuckOnPortalCollisionObject;
|
||
|
|
||
|
float m_fTimeLastHurt;
|
||
|
bool m_bIsRegenerating; // Is the player currently regaining health
|
||
|
|
||
|
float m_fNeuroToxinDamageTime;
|
||
|
|
||
|
PortalPlayerStatistics_t m_StatsThisLevel;
|
||
|
float m_fTimeLastNumSecondsUpdate;
|
||
|
|
||
|
int m_iNumCamerasDetatched;
|
||
|
|
||
|
QAngle m_qPrePortalledViewAngles;
|
||
|
bool m_bFixEyeAnglesFromPortalling;
|
||
|
VMatrix m_matLastPortalled;
|
||
|
CAI_Expresser *m_pExpresser;
|
||
|
string_t m_iszExpressionScene;
|
||
|
EHANDLE m_hExpressionSceneEnt;
|
||
|
float m_flExpressionLoopTime;
|
||
|
|
||
|
|
||
|
|
||
|
mutable Vector m_vWorldSpaceCenterHolder; //WorldSpaceCenter() returns a reference, need an actual value somewhere
|
||
|
|
||
|
|
||
|
|
||
|
public:
|
||
|
|
||
|
CNetworkVar( bool, m_bPitchReorientation );
|
||
|
CNetworkHandle( CProp_Portal, m_hPortalEnvironment ); //if the player is in a portal environment, this is the associated portal
|
||
|
CNetworkHandle( CFunc_LiquidPortal, m_hSurroundingLiquidPortal ); //if the player is standing in a liquid portal, this will point to it
|
||
|
|
||
|
friend class CProp_Portal;
|
||
|
|
||
|
|
||
|
#ifdef PORTAL_MP
|
||
|
public:
|
||
|
virtual CBaseEntity* EntSelectSpawnPoint( void );
|
||
|
void PickTeam( void );
|
||
|
#endif
|
||
|
};
|
||
|
|
||
|
inline CPortal_Player *ToPortalPlayer( CBaseEntity *pEntity )
|
||
|
{
|
||
|
if ( !pEntity || !pEntity->IsPlayer() )
|
||
|
return NULL;
|
||
|
|
||
|
return dynamic_cast<CPortal_Player*>( pEntity );
|
||
|
}
|
||
|
|
||
|
inline CPortal_Player *GetPortalPlayer( int iPlayerIndex )
|
||
|
{
|
||
|
return static_cast<CPortal_Player*>( UTIL_PlayerByIndex( iPlayerIndex ) );
|
||
|
}
|
||
|
|
||
|
#endif //PORTAL_PLAYER_H
|