203 lines
8.0 KiB
C++
203 lines
8.0 KiB
C++
//========= Copyright Valve Corporation, All rights reserved. ============//
|
|
//
|
|
// Purpose:
|
|
//
|
|
//=============================================================================//
|
|
|
|
#ifndef AI_MOVEPROBE_H
|
|
#define AI_MOVEPROBE_H
|
|
|
|
#include "ai_component.h"
|
|
#include "ai_movetypes.h"
|
|
#include "ai_navtype.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
|