1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
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
|