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.
223 lines
8.1 KiB
223 lines
8.1 KiB
![]()
4 years ago
|
//========= Copyright Valve Corporation, All rights reserved. ============//
|
||
|
//
|
||
|
// Purpose:
|
||
|
//
|
||
|
// $NoKeywords: $
|
||
|
//
|
||
|
//===========================================================================//
|
||
|
#ifndef PORTAL_PLAYER_H
|
||
|
#define PORTAL_PLAYER_H
|
||
|
#pragma once
|
||
|
|
||
|
#include "portal_playeranimstate.h"
|
||
|
#include "c_basehlplayer.h"
|
||
|
#include "portal_player_shared.h"
|
||
|
#include "c_prop_portal.h"
|
||
|
#include "weapon_portalbase.h"
|
||
|
#include "c_func_liquidportal.h"
|
||
|
#include "colorcorrectionmgr.h"
|
||
|
|
||
|
//=============================================================================
|
||
|
// >> Portal_Player
|
||
|
//=============================================================================
|
||
|
class C_Portal_Player : public C_BaseHLPlayer
|
||
|
{
|
||
|
public:
|
||
|
DECLARE_CLASS( C_Portal_Player, C_BaseHLPlayer );
|
||
|
|
||
|
DECLARE_CLIENTCLASS();
|
||
|
DECLARE_PREDICTABLE();
|
||
|
DECLARE_INTERPOLATION();
|
||
|
|
||
|
|
||
|
C_Portal_Player();
|
||
|
~C_Portal_Player( void );
|
||
|
|
||
|
void ClientThink( void );
|
||
|
void FixTeleportationRoll( void );
|
||
|
|
||
|
static inline C_Portal_Player* GetLocalPortalPlayer()
|
||
|
{
|
||
|
return (C_Portal_Player*)C_BasePlayer::GetLocalPlayer();
|
||
|
}
|
||
|
|
||
|
static inline C_Portal_Player* GetLocalPlayer()
|
||
|
{
|
||
|
return (C_Portal_Player*)C_BasePlayer::GetLocalPlayer();
|
||
|
}
|
||
|
|
||
|
virtual const QAngle& GetRenderAngles();
|
||
|
|
||
|
virtual void UpdateClientSideAnimation();
|
||
|
void DoAnimationEvent( PlayerAnimEvent_t event, int nData );
|
||
|
|
||
|
virtual int DrawModel( int flags );
|
||
|
virtual void AddEntity( void );
|
||
|
|
||
|
QAngle GetAnimEyeAngles( void ) { return m_angEyeAngles; }
|
||
|
Vector GetAttackSpread( CBaseCombatWeapon *pWeapon, CBaseEntity *pTarget = NULL );
|
||
|
|
||
|
// Used by prediction, sets the view angles for the player
|
||
|
virtual void SetLocalViewAngles( const QAngle &viewAngles );
|
||
|
virtual void SetViewAngles( const QAngle &ang );
|
||
|
|
||
|
// Should this object cast shadows?
|
||
|
virtual ShadowType_t ShadowCastType( void );
|
||
|
virtual C_BaseAnimating* BecomeRagdollOnClient();
|
||
|
virtual bool ShouldDraw( void );
|
||
|
virtual const QAngle& EyeAngles();
|
||
|
virtual void OnPreDataChanged( DataUpdateType_t type );
|
||
|
virtual void OnDataChanged( DataUpdateType_t type );
|
||
|
bool DetectAndHandlePortalTeleportation( void ); //detects if the player has portalled and fixes views
|
||
|
virtual float GetFOV( void );
|
||
|
virtual CStudioHdr* OnNewModel( void );
|
||
|
virtual void TraceAttack( const CTakeDamageInfo &info, const Vector &vecDir, trace_t *ptr );
|
||
|
virtual void ItemPreFrame( void );
|
||
|
virtual void ItemPostFrame( void );
|
||
|
virtual float GetMinFOV() const { return 5.0f; }
|
||
|
virtual Vector GetAutoaimVector( float flDelta );
|
||
|
virtual bool ShouldReceiveProjectedTextures( int flags );
|
||
|
virtual void PostDataUpdate( DataUpdateType_t updateType );
|
||
|
virtual void GetStepSoundVelocities( float *velwalk, float *velrun );
|
||
|
virtual void PlayStepSound( Vector &vecOrigin, surfacedata_t *psurface, float fvol, bool force );
|
||
|
virtual void PreThink( void );
|
||
|
virtual void DoImpactEffect( trace_t &tr, int nDamageType );
|
||
|
|
||
|
virtual Vector EyePosition();
|
||
|
Vector EyeFootPosition( const QAngle &qEyeAngles );//interpolates between eyes and feet based on view angle roll
|
||
|
inline Vector EyeFootPosition( void ) { return EyeFootPosition( EyeAngles() ); };
|
||
|
void PlayerPortalled( C_Prop_Portal *pEnteredPortal );
|
||
|
|
||
|
virtual void CalcView( Vector &eyeOrigin, QAngle &eyeAngles, float &zNear, float &zFar, float &fov );
|
||
|
void CalcPortalView( Vector &eyeOrigin, QAngle &eyeAngles );
|
||
|
virtual void CalcViewModelView( const Vector& eyeOrigin, const QAngle& eyeAngles);
|
||
|
|
||
|
CBaseEntity* FindUseEntity( void );
|
||
|
CBaseEntity* FindUseEntityThroughPortal( void );
|
||
|
|
||
|
inline bool IsCloseToPortal( void ) //it's usually a good idea to turn on draw hacks when this is true
|
||
|
{
|
||
|
return ((PortalEyeInterpolation.m_bEyePositionIsInterpolating) || (m_hPortalEnvironment.Get() != NULL));
|
||
|
}
|
||
|
|
||
|
bool CanSprint( void );
|
||
|
void StartSprinting( void );
|
||
|
void StopSprinting( void );
|
||
|
void HandleSpeedChanges( void );
|
||
|
void UpdateLookAt( void );
|
||
|
void Initialize( void );
|
||
|
int GetIDTarget() const;
|
||
|
void UpdateIDTarget( void );
|
||
|
|
||
|
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; }
|
||
|
|
||
|
Activity TranslateActivity( Activity baseAct, bool *pRequired = NULL );
|
||
|
CWeaponPortalBase* GetActivePortalWeapon() const;
|
||
|
|
||
|
bool IsSuppressingCrosshair( void ) { return m_bSuppressingCrosshair; }
|
||
|
|
||
|
private:
|
||
|
|
||
|
C_Portal_Player( const C_Portal_Player & );
|
||
|
|
||
|
void UpdatePortalEyeInterpolation( void );
|
||
|
|
||
|
CPortalPlayerAnimState *m_PlayerAnimState;
|
||
|
|
||
|
QAngle m_angEyeAngles;
|
||
|
CInterpolatedVar< QAngle > m_iv_angEyeAngles;
|
||
|
|
||
|
virtual IRagdoll *GetRepresentativeRagdoll() const;
|
||
|
EHANDLE m_hRagdoll;
|
||
|
|
||
|
int m_headYawPoseParam;
|
||
|
int m_headPitchPoseParam;
|
||
|
float m_headYawMin;
|
||
|
float m_headYawMax;
|
||
|
float m_headPitchMin;
|
||
|
float m_headPitchMax;
|
||
|
bool m_bSuppressingCrosshair;
|
||
|
|
||
|
bool m_isInit;
|
||
|
Vector m_vLookAtTarget;
|
||
|
|
||
|
float m_flLastBodyYaw;
|
||
|
float m_flCurrentHeadYaw;
|
||
|
float m_flCurrentHeadPitch;
|
||
|
float m_flStartLookTime;
|
||
|
|
||
|
int m_iIDEntIndex;
|
||
|
|
||
|
CountdownTimer m_blinkTimer;
|
||
|
|
||
|
int m_iSpawnInterpCounter;
|
||
|
int m_iSpawnInterpCounterCache;
|
||
|
|
||
|
int m_iPlayerSoundType;
|
||
|
|
||
|
bool m_bHeldObjectOnOppositeSideOfPortal;
|
||
|
CProp_Portal *m_pHeldObjectPortal;
|
||
|
|
||
|
int m_iForceNoDrawInPortalSurface; //only valid for one frame, used to temp disable drawing of the player model in a surface because of freaky artifacts
|
||
|
|
||
|
struct PortalEyeInterpolation_t
|
||
|
{
|
||
|
bool m_bEyePositionIsInterpolating; //flagged when the eye position would have popped between two distinct positions and we're smoothing it over
|
||
|
Vector m_vEyePosition_Interpolated; //we'll be giving the interpolation a certain amount of instant movement per frame based on how much an uninterpolated eye would have moved
|
||
|
Vector m_vEyePosition_Uninterpolated; //can't have smooth movement without tracking where we just were
|
||
|
//bool m_bNeedToUpdateEyePosition;
|
||
|
//int m_iFrameLastUpdated;
|
||
|
|
||
|
int m_iTickLastUpdated;
|
||
|
float m_fTickInterpolationAmountLastUpdated;
|
||
|
bool m_bDisableFreeMovement; //used for one frame usually when error in free movement is likely to be high
|
||
|
bool m_bUpdatePosition_FreeMove;
|
||
|
|
||
|
PortalEyeInterpolation_t( void ) : m_iTickLastUpdated(0), m_fTickInterpolationAmountLastUpdated(0.0f), m_bDisableFreeMovement(false), m_bUpdatePosition_FreeMove(false) { };
|
||
|
} PortalEyeInterpolation;
|
||
|
|
||
|
struct PreDataChanged_Backup_t
|
||
|
{
|
||
|
CHandle<C_Prop_Portal> m_hPortalEnvironment;
|
||
|
CHandle<C_Func_LiquidPortal> m_hSurroundingLiquidPortal;
|
||
|
//Vector m_ptPlayerPosition;
|
||
|
QAngle m_qEyeAngles;
|
||
|
} PreDataChanged_Backup;
|
||
|
|
||
|
Vector m_ptEyePosition_LastCalcView;
|
||
|
QAngle m_qEyeAngles_LastCalcView; //we've got some VERY persistent single frame errors while teleporting, this will be updated every frame in CalcView() and will serve as a central source for fixed angles
|
||
|
C_Prop_Portal *m_pPortalEnvironment_LastCalcView;
|
||
|
|
||
|
ClientCCHandle_t m_CCDeathHandle; // handle to death cc effect
|
||
|
float m_flDeathCCWeight; // for fading in cc effect
|
||
|
|
||
|
bool m_bPortalledMessagePending; //Player portalled. It's easier to wait until we get a OnDataChanged() event or a CalcView() before we do anything about it. Otherwise bits and pieces can get undone
|
||
|
VMatrix m_PendingPortalMatrix;
|
||
|
|
||
|
public:
|
||
|
bool m_bPitchReorientation;
|
||
|
float m_fReorientationRate;
|
||
|
bool m_bEyePositionIsTransformedByPortal; //when the eye and body positions are not on the same side of a portal
|
||
|
|
||
|
CHandle<C_Prop_Portal> m_hPortalEnvironment; //a portal whose environment the player is currently in, should be invalid most of the time
|
||
|
CHandle<C_Func_LiquidPortal> m_hSurroundingLiquidPortal; //a liquid portal whose volume the player is standing in
|
||
|
};
|
||
|
|
||
|
inline C_Portal_Player *ToPortalPlayer( CBaseEntity *pEntity )
|
||
|
{
|
||
|
if ( !pEntity || !pEntity->IsPlayer() )
|
||
|
return NULL;
|
||
|
|
||
|
return dynamic_cast<C_Portal_Player*>( pEntity );
|
||
|
}
|
||
|
|
||
|
inline C_Portal_Player *GetPortalPlayer( void )
|
||
|
{
|
||
|
return static_cast<C_Portal_Player*>( C_BasePlayer::GetLocalPlayer() );
|
||
|
}
|
||
|
|
||
|
#endif //Portal_PLAYER_H
|