Counter Strike : Global Offensive Source Code
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.
 
 
 
 
 
 

171 lines
5.6 KiB

//========= Copyright © 1996-2005, Valve Corporation, All rights reserved. ============//
//
// Purpose: Special handling for Portal usable ladders
//
//=============================================================================//
#ifndef PORTAL_GAMEMOVEMENT_H
#define PORTAL_GAMEMOVEMENT_H
#include "cbase.h"
#include "hl_gamemovement.h"
#if defined( CLIENT_DLL )
#include "c_portal_player.h"
#else
#include "portal_player.h"
#endif
class CTrace_PlayerAABB_vs_Portals;
//-----------------------------------------------------------------------------
// Purpose: Portal specific movement code
//-----------------------------------------------------------------------------
class CPortalGameMovement : public CGameMovement
{
typedef CGameMovement BaseClass;
public:
CPortalGameMovement();
bool m_bInPortalEnv;
// Overrides
virtual void ProcessMovement( CBasePlayer *pPlayer, CMoveData *pMove );
virtual const Vector& GetPlayerMins( bool ducked ) const;
virtual const Vector& GetPlayerMaxs( bool ducked ) const;
virtual const Vector& GetPlayerViewOffset( bool ducked ) const;
virtual void SetupMovementBounds( CMoveData *pMove );
virtual bool CheckJumpButton( void );
Vector PortalFunnel( const Vector &wishdir );
// Traces the player bbox as it is swept from start to end
virtual void TracePlayerBBox( const Vector& start, const Vector& end, unsigned int fMask, int collisionGroup, CTrace_PlayerAABB_vs_Portals& pm );
virtual void TracePlayerBBox( const Vector& start, const Vector& end, unsigned int fMask, int collisionGroup, trace_t& pm );
// Tests the player position
virtual CBaseHandle TestPlayerPosition( const Vector& pos, int collisionGroup, trace_t& pm );
virtual int CheckStuck( void );
virtual void SetGroundEntity( trace_t *pm );
void HandlePortalling( void );
protected:
CPortal_Player *GetPortalPlayer() const;
bool IsInPortalFunnelVolume( const Vector& vPlayerToPortal, const CPortal_Base2D* pPortal, const float flExtentX, const float flExtentY ) const;
// Does most of the player movement logic.
// Returns with origin, angles, and velocity modified in place.
// were contacted during the move.
virtual void PlayerMove();
// Handles both ground friction and water friction
virtual void Friction();
virtual void TBeamMove();
virtual void AirMove();
virtual void AirAccelerate( Vector& wishdir, float wishspeed, float accel );
// Only used by players. Moves along the ground when player is a MOVETYPE_WALK.
virtual void WalkMove();
virtual void WaterMove();
// Try to keep a walking player on the ground when running down slopes etc
virtual void StayOnGround();
virtual void CheckWallImpact( Vector& primal_velocity );
// Handle MOVETYPE_WALK.
virtual void FullWalkMove();
// Implement this if you want to know when the player collides during OnPlayerMove
virtual void OnTryPlayerMoveCollision( trace_t &tr ) {}
virtual const Vector& GetPlayerMins() const; // uses local player
virtual const Vector& GetPlayerMaxs() const; // uses local player
// Decompoosed gravity
virtual void StartGravity();
virtual void FinishGravity();
// Apply normal ( undecomposed ) gravity
virtual void AddGravity();
// The basic solid body movement clip that slides along multiple planes
virtual int TryPlayerMove( Vector *pFirstDest = NULL, trace_t *pFirstTrace = NULL );
// Slide off of the impacting object
// returns the blocked flags:
// 0x01 == floor
// 0x02 == step / wall
virtual int ClipVelocity( Vector& in, Vector& normal, Vector& out, float overbounce );
// Determine if player is in water, on ground, etc.
virtual void CategorizePosition();
virtual void CheckParameters();
virtual void PlayerRoughLandingEffects( float fvol );
virtual void PlayerWallImpactEffects( float fvol, float normalVelocity );
virtual void PlayerCeilingImpactEffects( float fvol );
// Ducking
virtual void Duck();
virtual void FinishUnDuck();
virtual void FinishDuck();
virtual bool CanUnduck();
virtual void UpdateDuckJumpEyeOffset();
virtual bool CanUnDuckJump( trace_t &trace );
virtual void StartUnDuckJump();
virtual void FinishUnDuckJump( trace_t &trace );
virtual void SetDuckedEyeOffset( float duckFraction );
virtual void FixPlayerCrouchStuck( bool moveup );
virtual void CategorizeGroundSurface( trace_t &pm );
virtual void StepMove( Vector &vecDestination, trace_t &trace );
virtual bool GameHasLadders() const { return false; }
private:
virtual bool PlayerShouldFunnel( const CPortal_Base2D* pPortal, const Vector& vPlayerForward, const Vector& wishDir ) const;
void AirPortalFunnel( Vector& wishdir,
const Vector& vPlayerToFunnelPortal,
float flExtraFunnelForce,
float flTimeToPortal );
void GroundPortalFunnel( Vector& wishdir,
const Vector& vPlayerToPortalFunnel,
const Vector& vPortalNormal,
float flExtraFunnelForce,
float flTimeToPortal );
#if defined( CLIENT_DLL )
void ClientVerticalElevatorFixes( CBasePlayer *pPlayer, CMoveData *pMove );
#endif
// Stick is done by changing gravity direction because it's easier to think about that way.
// Gravity direction is always the negation of the player's stick normal.
Vector m_vGravityDirection;
Vector m_vMoveStartPosition; //where the player started before the movement code ran
};
//trace that has special understanding of how to handle portals
class CTrace_PlayerAABB_vs_Portals : public CGameTrace
{
public:
CTrace_PlayerAABB_vs_Portals( void );
bool HitPortalRamp( const Vector &vUp );
bool m_bContactedPortalTransitionRamp;
};
#endif //PORTAL_GAMEMOVEMENT_H