This repository has been archived on 2024-06-13. You can view files and clone it, but cannot push or open issues or pull requests.
2020-08-04 13:13:01 -04:00

128 lines
4.2 KiB
C++

//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose: Special handling for hl2 usable ladders
//
//=============================================================================//
#include "func_ladder.h"
#include "gamemovement.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()));
}