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
162
163
164
165
166
167
168
169
|
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
// $NoKeywords: $
//=============================================================================//
#ifndef AI_SENSES_H
#define AI_SENSES_H
#include "tier1/utlvector.h"
#include "tier1/utlmap.h"
#include "simtimer.h"
#include "ai_component.h"
#include "soundent.h"
#if defined( _WIN32 )
#pragma once
#endif
class CBaseEntity;
class CSound;
//-------------------------------------
DECLARE_POINTER_HANDLE( AISightIter_t );
DECLARE_POINTER_HANDLE( AISoundIter_t );
// GetFirstSeenEntity can take these as optional parameters to search for
// a specific type of entity.
enum seentype_t
{
SEEN_ALL = -1, // Default
SEEN_HIGH_PRIORITY = 0,
SEEN_NPCS,
SEEN_MISC
};
#define SENSING_FLAGS_NONE 0x00000000
#define SENSING_FLAGS_DONT_LOOK 0x00000001 // Effectively makes the NPC blind
#define SENSING_FLAGS_DONT_LISTEN 0x00000002 // Effectively makes the NPC deaf
//-----------------------------------------------------------------------------
// class CAI_ScriptConditions
//
// Purpose:
//-----------------------------------------------------------------------------
class CAI_Senses : public CAI_Component
{
public:
CAI_Senses()
: m_LookDist(2048),
m_LastLookDist(-1),
m_TimeLastLook(-1),
m_iAudibleList(0),
m_TimeLastLookHighPriority( -1 ),
m_TimeLastLookNPCs( -1 ),
m_TimeLastLookMisc( -1 )
{
m_SeenArrays[0] = &m_SeenHighPriority;
m_SeenArrays[1] = &m_SeenNPCs;
m_SeenArrays[2] = &m_SeenMisc;
m_iSensingFlags = SENSING_FLAGS_NONE;
}
float GetDistLook() const { return m_LookDist; }
void SetDistLook( float flDistLook ) { m_LookDist = flDistLook; }
void PerformSensing();
void Listen( void );
void Look( int iDistance );// basic sight function for npcs
bool ShouldSeeEntity( CBaseEntity *pEntity ); // logical query
bool CanSeeEntity( CBaseEntity *pSightEnt ); // more expensive cone & raycast test
#ifdef PORTAL
bool CanSeeEntityThroughPortal( const CProp_Portal *pPortal, CBaseEntity *pSightEnt ); // more expensive cone & raycast test
#endif
bool DidSeeEntity( CBaseEntity *pSightEnt ) const; // a less expensive query that looks at cached results from recent conditionsa gathering
CBaseEntity * GetFirstSeenEntity( AISightIter_t *pIter, seentype_t iSeenType = SEEN_ALL ) const;
CBaseEntity * GetNextSeenEntity( AISightIter_t *pIter ) const;
CSound * GetFirstHeardSound( AISoundIter_t *pIter );
CSound * GetNextHeardSound( AISoundIter_t *pIter );
CSound * GetClosestSound( bool fScent = false, int validTypes = ALL_SOUNDS | ALL_SCENTS, bool bUsePriority = true );
bool CanHearSound( CSound *pSound );
//---------------------------------
float GetTimeLastUpdate( CBaseEntity *pEntity );
//---------------------------------
void AddSensingFlags( int iFlags ) { m_iSensingFlags |= iFlags; }
void RemoveSensingFlags( int iFlags ) { m_iSensingFlags &= ~iFlags; }
bool HasSensingFlags( int iFlags ) { return (m_iSensingFlags & iFlags) == iFlags; }
DECLARE_SIMPLE_DATADESC();
private:
int GetAudibleList() const { return m_iAudibleList; }
bool WaitingUntilSeen( CBaseEntity *pSightEnt );
void BeginGather();
void NoteSeenEntity( CBaseEntity *pSightEnt );
void EndGather( int nSeen, CUtlVector<EHANDLE> *pResult );
bool Look( CBaseEntity *pSightEnt );
#ifdef PORTAL
bool LookThroughPortal( const CProp_Portal *pPortal, CBaseEntity *pSightEnt );
#endif
int LookForHighPriorityEntities( int iDistance );
int LookForNPCs( int iDistance );
int LookForObjects( int iDistance );
bool SeeEntity( CBaseEntity *pEntity );
float m_LookDist; // distance npc sees (Default 2048)
float m_LastLookDist;
float m_TimeLastLook;
int m_iAudibleList; // first index of a linked list of sounds that the npc can hear.
CUtlVector<EHANDLE> m_SeenHighPriority;
CUtlVector<EHANDLE> m_SeenNPCs;
CUtlVector<EHANDLE> m_SeenMisc;
CUtlVector<EHANDLE> *m_SeenArrays[3];
float m_TimeLastLookHighPriority;
float m_TimeLastLookNPCs;
float m_TimeLastLookMisc;
int m_iSensingFlags;
};
//-----------------------------------------------------------------------------
class CAI_SensedObjectsManager : public IEntityListener
{
public:
void Init();
void Term();
CBaseEntity * GetFirst( int *pIter );
CBaseEntity * GetNext( int *pIter );
virtual void AddEntity( CBaseEntity *pEntity );
private:
virtual void OnEntitySpawned( CBaseEntity *pEntity );
virtual void OnEntityDeleted( CBaseEntity *pEntity );
CUtlVector<EHANDLE> m_SensedObjects;
};
extern CAI_SensedObjectsManager g_AI_SensedObjectsManager;
//-----------------------------------------------------------------------------
#endif // AI_SENSES_H
|