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
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
|