diff options
Diffstat (limited to 'game/server/ai_moveprobe.h')
| -rw-r--r-- | game/server/ai_moveprobe.h | 161 |
1 files changed, 161 insertions, 0 deletions
diff --git a/game/server/ai_moveprobe.h b/game/server/ai_moveprobe.h new file mode 100644 index 0000000..8bf1c7c --- /dev/null +++ b/game/server/ai_moveprobe.h @@ -0,0 +1,161 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +//=============================================================================// + +#ifndef AI_MOVEPROBE_H +#define AI_MOVEPROBE_H + +#include "ai_component.h" +#include "ai_navtype.h" +#include "ai_movetypes.h" + +#if defined( _WIN32 ) +#pragma once +#endif + +//----------------------------------------------------------------------------- +// Purpose: Set of basic tools for probing box movements through space. +// No moves actually take place +//----------------------------------------------------------------------------- + +enum AI_TestGroundMoveFlags_t +{ + AITGM_DEFAULT = 0, + AITGM_IGNORE_FLOOR = 0x01, + AITGM_IGNORE_INITIAL_STAND_POS = 0x02, + AITGM_2D = 0x04, + AITGM_DRAW_RESULTS = 0x08, +}; + +enum AI_MoveLimitFlags_t +{ + AIMLF_DEFAULT = 0, + AIMLF_2D = 0x01, + AIMLF_DRAW_RESULTS = 0x02, + AIMLF_IGNORE_TRANSIENTS = 0x04, + AIMLF_QUICK_REJECT = 0x08, +}; + +class CAI_MoveProbe : public CAI_Component +{ +public: + + CAI_MoveProbe( CAI_BaseNPC *pOuter ); + ~CAI_MoveProbe(); + + // ---------------------------------------------------- + // Queries & probes + // ---------------------------------------------------- + bool MoveLimit( Navigation_t navType, const Vector &vecStart, const Vector &vecEnd, unsigned int collisionMask, const CBaseEntity *pTarget, AIMoveTrace_t* pMove = NULL ); + bool MoveLimit( Navigation_t navType, const Vector &vecStart, const Vector &vecEnd, unsigned int collisionMask, const CBaseEntity *pTarget, float pctToCheckStandPositions, AIMoveTrace_t* pMove = NULL ); + bool MoveLimit( Navigation_t navType, const Vector &vecStart, const Vector &vecEnd, unsigned int collisionMask, const CBaseEntity *pTarget, float pctToCheckStandPositions, unsigned flags, AIMoveTrace_t* pMove = NULL ); + + bool CheckStandPosition( const Vector &vecStart, unsigned int collisionMask ) const; + bool FloorPoint( const Vector &vecStart, unsigned int collisionMask, float flStartZ, float flEndZ, Vector *pVecResult ) const; + + // -------------------------------- + // Tracing tools + // -------------------------------- + void TraceLine( const Vector &vecStart, const Vector &vecEnd, unsigned int mask, + bool bUseCollisionGroup, trace_t *pResult ) const; + + void TraceHull( const Vector &vecStart, const Vector &vecEnd, const Vector &hullMin, + const Vector &hullMax, unsigned int mask, + trace_t *ptr ) const; + + void TraceHull( const Vector &vecStart, const Vector &vecEnd, unsigned int mask, + trace_t *ptr ) const; + + // -------------------------------- + // Checks a ground-based movement + // -------------------------------- + bool TestGroundMove( const Vector &vecActualStart, const Vector &vecDesiredEnd, + unsigned int collisionMask, unsigned flags, AIMoveTrace_t *pMoveTrace ) const; + + bool TestGroundMove( const Vector &vecActualStart, const Vector &vecDesiredEnd, + unsigned int collisionMask, float pctToCheckStandPositions, unsigned flags, AIMoveTrace_t *pMoveTrace ) const; + + bool ShouldBrushBeIgnored( CBaseEntity *pEntity ); + + void ClearBlockingEntity() { m_hLastBlockingEnt = NULL; } + CBaseEntity * GetBlockingEntity() { return m_hLastBlockingEnt; } + +private: + struct CheckStepArgs_t + { + Vector vecStart; + Vector vecStepDir; + float stepSize; + float stepHeight; + float stepDownMultiplier; + float minStepLanding; + unsigned collisionMask; + StepGroundTest_t groundTest; + }; + + struct CheckStepResult_t + { + Vector endPoint; + Vector hitNormal; + bool fStartSolid; + CBaseEntity * pBlocker; + }; + + + bool CheckStep( const CheckStepArgs_t &args, CheckStepResult_t *pResult ) const; + void SetupCheckStepTraceListData( const CheckStepArgs_t &args ) const; + void ResetTraceListData() const { if ( m_pTraceListData ) const_cast<CAI_MoveProbe *>(this)->m_pTraceListData->Reset(); } + bool OldCheckStandPosition( const Vector &vecStart, unsigned int collisionMask ) const; + + // these check connections between positions in space, regardless of routes + void GroundMoveLimit( const Vector &vecStart, const Vector &vecEnd, unsigned int collisionMask, const CBaseEntity *pTarget, unsigned testGroundMoveFlags, float pctToCheckStandPositions, AIMoveTrace_t* pMoveTrace ) const; + void FlyMoveLimit( const Vector &vecStart, const Vector &vecEnd, unsigned int collisionMask, const CBaseEntity *pTarget, AIMoveTrace_t* pMoveTrace) const; + void JumpMoveLimit( const Vector &vecStart, const Vector &vecEnd, unsigned int collisionMask, const CBaseEntity *pTarget, AIMoveTrace_t* pMoveTrace) const; + void ClimbMoveLimit( const Vector &vecStart, const Vector &vecEnd, const CBaseEntity *pTarget, AIMoveTrace_t* pMoveTrace) const; + + // A floorPoint that is useful only in the contect of iterative movement + bool IterativeFloorPoint( const Vector &vecStart, unsigned int collisionMask, Vector *pVecResult ) const; + bool IterativeFloorPoint( const Vector &vecStart, unsigned int collisionMask, float flAddedStep, Vector *pVecResult ) const; + bool IsJumpLegal( const Vector &startPos, const Vector &apex, const Vector &endPos ) const; + +public: + Vector CalcJumpLaunchVelocity(const Vector &startPos, const Vector &endPos, float gravity, float *pminHeight, float maxHorzVelocity, Vector *vecApex ) const; +private: + + // Common services provided by CAI_BaseNPC, Convenience methods to simplify code + float StepHeight() const; + bool CanStandOn( CBaseEntity *pSurface ) const; + + bool m_bIgnoreTransientEntities; + + CTraceListData * m_pTraceListData; + + EHANDLE m_hLastBlockingEnt; + + DECLARE_SIMPLE_DATADESC(); +}; + +// ---------------------------------------------------------------------------- + +inline bool CAI_MoveProbe::MoveLimit( Navigation_t navType, const Vector &vecStart, const Vector &vecEnd, unsigned int collisionMask, const CBaseEntity *pTarget, float pctToCheckStandPositions, AIMoveTrace_t* pMove) +{ + return MoveLimit( navType, vecStart, vecEnd, collisionMask, pTarget, pctToCheckStandPositions, AIMLF_DEFAULT, pMove); +} + +// ------------------------------------ + +inline bool CAI_MoveProbe::MoveLimit( Navigation_t navType, const Vector &vecStart, const Vector &vecEnd, unsigned int collisionMask, const CBaseEntity *pTarget, AIMoveTrace_t* pMove) +{ + return MoveLimit( navType, vecStart, vecEnd, collisionMask, pTarget, 100.0f, AIMLF_DEFAULT, pMove); +} + +// ------------------------------------ + +inline bool CAI_MoveProbe::TestGroundMove( const Vector &vecActualStart, const Vector &vecDesiredEnd, unsigned int collisionMask, unsigned flags, AIMoveTrace_t *pMoveTrace ) const +{ + return TestGroundMove( vecActualStart, vecDesiredEnd, collisionMask, 100, flags, pMoveTrace ); // floor ignore flag will override 100% +} + +#endif // AI_MOVEPROBE_H |