source-engine/game/shared/hl2/hl_gamemovement.h

130 lines
3.9 KiB
C
Raw Normal View History

2020-04-22 16:56:21 +00:00
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose: Special handling for hl2 usable ladders
//
//=============================================================================//
#include "gamemovement.h"
#include "func_ladder.h"
#if defined( CLIENT_DLL )
#include "c_basehlplayer.h"
#define CHL2_Player C_BaseHLPlayer
#else
#include "hl2_player.h"
#endif
struct LadderMove_t;
class CInfoLadderDismount;
struct NearbyDismount_t
{
CInfoLadderDismount *dismount;
float distSqr;
};
//-----------------------------------------------------------------------------
// Purpose: HL2 specific movement code
//-----------------------------------------------------------------------------
class CHL2GameMovement : public CGameMovement
{
typedef CGameMovement BaseClass;
public:
CHL2GameMovement();
// Overrides
virtual void FullLadderMove();
virtual bool LadderMove( void );
virtual bool OnLadder( trace_t &trace );
virtual int GetCheckInterval( IntervalType_t type );
virtual void SetGroundEntity( trace_t *pm );
virtual bool CanAccelerate( void );
private:
// See if we are pressing use near a ladder "mount" point and if so, latch us onto the ladder
bool CheckLadderAutoMount( CFuncLadder *ladder, const Vector& bestOrigin );
bool CheckLadderAutoMountCone( CFuncLadder *ladder, const Vector& bestOrigin, float maxAngleDelta, float maxDistToLadder );
bool CheckLadderAutoMountEndPoint(CFuncLadder *ladder, const Vector& bestOrigin );
bool LookingAtLadder( CFuncLadder *ladder );
// Are we forcing the user's position to a new spot
bool IsForceMoveActive();
// Start forcing player position
void StartForcedMove( bool mounting, float transit_speed, const Vector& goalpos, CFuncLadder *ladder );
// Returns false when finished
bool ContinueForcedMove();
// Given a list of nearby ladders, find the best ladder and the "mount" origin
void Findladder( float maxdist, CFuncLadder **ppLadder, Vector& ladderOrigin, const CFuncLadder *skipLadder );
// Debounce the +USE key
void SwallowUseKey();
// Returns true if the player will auto-exit the ladder via a dismount node
bool ExitLadderViaDismountNode( CFuncLadder *ladder, bool strict, bool useAlternate = false );
void GetSortedDismountNodeList( const Vector &org, float radius, CFuncLadder *ladder, CUtlRBTree< NearbyDismount_t, int >& list );
LadderMove_t *GetLadderMove();
CHL2_Player *GetHL2Player();
void SetLadder( CFuncLadder *ladder );
CFuncLadder *GetLadder();
};
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
inline CHL2_Player *CHL2GameMovement::GetHL2Player()
{
return static_cast< CHL2_Player * >( player );
}
//-----------------------------------------------------------------------------
// Purpose:
// Output : inline LadderMove*
//-----------------------------------------------------------------------------
inline LadderMove_t *CHL2GameMovement::GetLadderMove()
{
CHL2_Player *p = GetHL2Player();
if ( !p )
{
return NULL;
}
return p->GetLadderMove();
}
//-----------------------------------------------------------------------------
// Purpose:
// Input : *ladder -
//-----------------------------------------------------------------------------
inline void CHL2GameMovement::SetLadder( CFuncLadder *ladder )
{
CFuncLadder* oldLadder = GetLadder();
if ( !ladder && oldLadder )
{
oldLadder->PlayerGotOff( GetHL2Player() );
}
GetHL2Player()->m_HL2Local.m_hLadder.Set( ladder );
}
//-----------------------------------------------------------------------------
// Purpose:
// Output : CFuncLadder
//-----------------------------------------------------------------------------
inline CFuncLadder *CHL2GameMovement::GetLadder()
{
return static_cast<CFuncLadder*>( static_cast<CBaseEntity *>( GetHL2Player()->m_HL2Local.m_hLadder.Get() ) );
}