summaryrefslogtreecommitdiff
path: root/game/client/portal/c_portal_player.h
diff options
context:
space:
mode:
authorFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
committerFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
commit3bf9df6b2785fa6d951086978a3e66f49427166a (patch)
tree2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /game/client/portal/c_portal_player.h
downloadarchived-source-engine-2018-hl2-src-master.tar.xz
archived-source-engine-2018-hl2-src-master.zip
Diffstat (limited to 'game/client/portal/c_portal_player.h')
-rw-r--r--game/client/portal/c_portal_player.h222
1 files changed, 222 insertions, 0 deletions
diff --git a/game/client/portal/c_portal_player.h b/game/client/portal/c_portal_player.h
new file mode 100644
index 0000000..52819ac
--- /dev/null
+++ b/game/client/portal/c_portal_player.h
@@ -0,0 +1,222 @@
+//========= 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