ReGameDLL_CS/regamedll/game_shared/bot/nav_area.cpp
2015-08-20 17:24:18 +06:00

3045 lines
91 KiB
C++

#include "precompiled.h"
/*
* Globals initialization
*/
#ifndef HOOK_GAMEDLL
unsigned int CNavArea::m_nextID = 1;
unsigned int CNavArea::m_masterMarker = 1;
unsigned int HidingSpot::m_nextID = 1;
unsigned int HidingSpot::m_masterMarker = 0;
NavLadderList TheNavLadderList;
HidingSpotList TheHidingSpotList;
NavAreaList TheNavAreaList;
CNavAreaGrid TheNavAreaGrid;
CNavArea *CNavArea::m_openList = NULL;
bool CNavArea::m_isReset = false;
FILE_GLOBAL float lastDrawTimestamp = 0.0f;
FILE_GLOBAL NavAreaList goodSizedAreaList;
FILE_GLOBAL CNavArea *markedArea = NULL;
FILE_GLOBAL CNavArea *lastSelectedArea = NULL;
FILE_GLOBAL NavCornerType markedCorner = NUM_CORNERS;
FILE_GLOBAL bool isCreatingNavArea = false;
FILE_GLOBAL bool isAnchored = false;
FILE_GLOBAL Vector anchor;
FILE_GLOBAL bool isPlaceMode = false;
FILE_GLOBAL bool isPlacePainting = false;
FILE_GLOBAL float editTimestamp = 0.0f;
FILE_GLOBAL unsigned int BlockedID[ MAX_BLOCKED_AREAS ];
FILE_GLOBAL int BlockedIDCount = 0;
#else // HOOK_GAMEDLL
unsigned int IMPLEMENT_ARRAY_CLASS(CNavArea, m_nextID);
unsigned int IMPLEMENT_ARRAY_CLASS(CNavArea, m_masterMarker);
unsigned int IMPLEMENT_ARRAY_CLASS(HidingSpot, m_nextID);
unsigned int IMPLEMENT_ARRAY_CLASS(HidingSpot, m_masterMarker);
NavLadderList TheNavLadderList;
HidingSpotList TheHidingSpotList;
NavAreaList TheNavAreaList;
CNavAreaGrid TheNavAreaGrid;
CNavArea *IMPLEMENT_ARRAY_CLASS(CNavArea, m_openList);
bool IMPLEMENT_ARRAY_CLASS(CNavArea, m_isReset);
float lastDrawTimestamp;
NavAreaList goodSizedAreaList;
CNavArea *markedArea;
CNavArea *lastSelectedArea;
NavCornerType markedCorner;
bool isCreatingNavArea;
//bool isAnchored;
//Vector anchor;
//bool isPlaceMode;
bool isPlacePainting;
float editTimestamp;
unsigned int BlockedID[ MAX_BLOCKED_AREAS ];
int BlockedIDCount;
#endif // HOOK_GAMEDLL
/* <4c31b5> ../game_shared/bot/nav_area.cpp:63 */
NOXREF FILE_GLOBAL void buildGoodSizedList(void)
{
const float minSize = 200.0f;
NavAreaList::iterator iter;
for (iter = TheNavAreaList.begin(); iter != TheNavAreaList.end(); iter++)
{
CNavArea *area = *iter;
// skip the small areas
const Extent *extent = area->GetExtent();
if (extent->SizeX() < minSize || extent->SizeY() < minSize)
continue;
goodSizedAreaList.push_back( area );
}
}
/* <4c5551> ../game_shared/bot/nav_area.cpp:87 */
void DestroyHidingSpots(void)
{
// remove all hiding spot references from the nav areas
for (NavAreaList::iterator areaIter = TheNavAreaList.begin(); areaIter != TheNavAreaList.end(); areaIter++)
{
CNavArea *area = *areaIter;
area->m_hidingSpotList.clear();
}
IMPLEMENT_ARRAY_CLASS(HidingSpot, m_nextID) = 0;
// free all the HidingSpots
for (HidingSpotList::iterator iter = TheHidingSpotList.begin(); iter != TheHidingSpotList.end(); iter++)
delete *iter;
TheHidingSpotList.clear();
}
/* <4c578e> ../game_shared/bot/nav_area.cpp:109 */
NOBODY HidingSpot::HidingSpot(void)
{
// push_back(list<HidingSpot*, std::allocator<HidingSpot*>>::HidingSpot(// const value_type &__x); // 115
}
/* <4c588a> ../game_shared/bot/nav_area.cpp:121 */
NOBODY HidingSpot::HidingSpot(const Vector *pos, unsigned char flags)
{
// push_back(list<HidingSpot*, std::allocator<HidingSpot*>> *const this,
// const value_type &__x); // 127
}
/* <4c5994> ../game_shared/bot/nav_area.cpp:130 */
NOBODY void HidingSpot::Save(int fd, unsigned int version) const
{
}
/* <4c5bb0> ../game_shared/bot/nav_area.cpp:151 */
HidingSpot *GetHidingSpotByID(unsigned int id)
{
// {
// iterator iter; // 153
// {
// class HidingSpot *spot; // 155
// }
// operator++(_List_iterator<HidingSpot*> *const this); // 153
// }
}
/* <4c5c30> ../game_shared/bot/nav_area.cpp:169 */
NOBODY void CNavArea::Initialize(void)
{
// {
// int i; // 177
// }
}
/* <4c59dc> ../game_shared/bot/nav_area.cpp:137 */
NOBODY void HidingSpot::Load(SteamFile *file, unsigned int version)
{
// Read(SteamFile *const this,
// void *data,
// int length); // 139
// Read(SteamFile *const this,
// void *data,
// int length); // 140
// Read(SteamFile *const this,
// void *data,
// int length); // 141
}
/* <4c5c82> ../game_shared/bot/nav_area.cpp:198 */
NOBODY CNavArea::CNavArea(void)
{
// Initialize(CNavArea *const this); // 200
// list(list<HidingSpot*, std::allocator<HidingSpot*>> *const this); // 198
// list(list<SpotEncounter, std::allocator<SpotEncounter>> *const this); // 198
// list(list<NavConnect, std::allocator<NavConnect>> *const this); // 198
// list(list<CNavLadder*, std::allocator<CNavLadder*>> *const this); // 198
// list(list<CNavArea*, std::allocator<CNavArea*>> *const this); // 198
}
/* <4c5ed7> ../game_shared/bot/nav_area.cpp:207 */
NOBODY CNavArea::CNavArea(const Vector *corner, const Vector *otherCorner)
{
// list(list<HidingSpot*, std::allocator<HidingSpot*>> *const this); // 207
// list(list<SpotEncounter, std::allocator<SpotEncounter>> *const this); // 207
// list(list<NavConnect, std::allocator<NavConnect>> *const this); // 207
// list(list<CNavLadder*, std::allocator<CNavLadder*>> *const this); // 207
// list(list<CNavArea*, std::allocator<CNavArea*>> *const this); // 207
// Initialize(CNavArea *const this); // 209
}
/* <4c610d> ../game_shared/bot/nav_area.cpp:248 */
NOBODY CNavArea::CNavArea(const Vector *nwCorner, const Vector *neCorner, const Vector *seCorner, const Vector *swCorner)
{
// list(list<HidingSpot*, std::allocator<HidingSpot*>> *const this); // 248
// list(list<SpotEncounter, std::allocator<SpotEncounter>> *const this); // 248
// list(list<NavConnect, std::allocator<NavConnect>> *const this); // 248
// list(list<CNavLadder*, std::allocator<CNavLadder*>> *const this); // 248
// list(list<CNavArea*, std::allocator<CNavArea*>> *const this); // 248
// Initialize(CNavArea *const this); // 250
}
/* <4c63a4> ../game_shared/bot/nav_area.cpp:268 */
NOBODY CNavArea::CNavArea(CNavNode *nwNode, class CNavNode *neNode, class CNavNode *seNode, class CNavNode *swNode)
{
// list(list<HidingSpot*, std::allocator<HidingSpot*>> *const this); // 268
// list(list<SpotEncounter, std::allocator<SpotEncounter>> *const this); // 268
// list(list<NavConnect, std::allocator<NavConnect>> *const this); // 268
// list(list<CNavLadder*, std::allocator<CNavLadder*>> *const this); // 268
// list(list<CNavArea*, std::allocator<CNavArea*>> *const this); // 268
// Initialize(CNavArea *const this); // 270
// AssignNodes(CNavArea *const this,
// class CNavArea *area); // 288
}
/* <4d58d7> ../game_shared/bot/nav_area.cpp:295 */
NOBODY CNavArea::~CNavArea(void)
{
// if we are resetting the system, don't bother cleaning up - all areas are being destroyed
if (IMPLEMENT_ARRAY(m_isReset))
{
return;
}
// tell the other areas we are going away
//NavAreaList::iterator iter;
//for (iter = TheNavAreaList.begin(); iter != TheNavAreaList.end(); ++iter)
//{
// CNavArea *area = *iter;
// if (area == this)
// continue;
// area->OnDestroyNotify(this);
//}
//// unhook from ladders
//for (int i = 0; i < NUM_LADDER_DIRECTIONS; ++i)
//{
// for (NavLadderList::iterator liter = m_ladder[i].begin(); liter != m_ladder[i].end(); ++liter)
// {
// CNavLadder *ladder = *liter;
// ladder->OnDestroyNotify(this);
// }
//}
// remove the area from the grid
//TheNavAreaGrid.RemoveNavArea(this);
}
/* <4c67f0> ../game_shared/bot/nav_area.cpp:333 */
NOBODY void CNavArea::OnDestroyNotify(CNavArea *dead)
{
NavConnect con;
con.area = dead;
for(int d = 0; d < NUM_DIRECTIONS; ++d)
m_connect[ d ].remove(con);
m_overlapList.remove(dead);
}
/* <4c6b75> ../game_shared/bot/nav_area.cpp:347 */
NOBODY void CNavArea::ConnectTo(CNavArea *area, NavDirType dir)
{
// {
// union NavConnect con; // 354
// {
// iterator iter; // 350
// operator++(_List_iterator<NavConnect> *const this); // 350
// }
// push_back(list<NavConnect, std::allocator<NavConnect>> *const this,
// const value_type &__x); // 356
// }
}
/* <4c6cd3> ../game_shared/bot/nav_area.cpp:366 */
NOBODY void CNavArea::Disconnect(CNavArea *area)
{
// {
// union NavConnect connect; // 368
// {
// int dir; // 371
// remove(list<NavConnect, std::allocator<NavConnect>> *const this,
// const value_type &__value); // 372
// }
// }
}
/* <4d8fa5> ../game_shared/bot/nav_area.cpp:380 */
NOBODY void CNavArea::FinishMerge(CNavArea *adjArea)
{
// AssignNodes(CNavArea *const this,
// class CNavArea *area); // 394
// remove(list<CNavArea*, std::allocator<CNavArea*>> *const this,
// const value_type &__value); // 400
}
/* <4c6e85> ../game_shared/bot/nav_area.cpp:408 */
NOBODY void CNavArea::MergeAdjacentConnections(CNavArea *adjArea)
{
// {
// iterator iter; // 411
// int dir; // 412
// {
// union NavConnect connect; // 417
// ConnectTo(CNavArea *const this,
// class CNavArea *area,
// enum NavDirType dir); // 420
// }
// operator++(_List_iterator<NavConnect> *const this); // 415
// {
// union NavConnect connect; // 427
// remove(list<NavConnect, std::allocator<NavConnect>> *const this,
// const value_type &__value); // 430
// }
// {
// iterator areaIter; // 439
// {
// class CNavArea *area; // 441
// {
// bool connected; // 449
// {
// union NavConnect connect; // 464
// remove(list<NavConnect, std::allocator<NavConnect>> *const this,
// const value_type &__value); // 470
// remove(list<NavConnect, std::allocator<NavConnect>> *const this,
// const value_type &__value); // 466
// push_back(list<NavConnect, std::allocator<NavConnect>> *const this,
// const value_type &__x); // 474
// }
// operator++(_List_iterator<NavConnect> *const this); // 450
// {
// union NavConnect connect; // 452
// }
// }
// }
// operator++(_List_iterator<CNavArea*> *const this); // 439
// }
// }
}
/* <4c760a> ../game_shared/bot/nav_area.cpp:486 */
NOBODY void CNavArea::AssignNodes(CNavArea *area)
{
// {
// class CNavNode *horizLast; // 488
// {
// class CNavNode *vertNode; // 490
// {
// class CNavNode *horizNode; // 492
// AssignArea(CNavNode *const this,
// class CNavArea *area); // 494
// GetConnectedNode(const class CNavNode *const this,
// enum NavDirType dir); // 492
// }
// GetConnectedNode(const class CNavNode *const this,
// enum NavDirType dir); // 490
// GetConnectedNode(const class CNavNode *const this,
// enum NavDirType dir); // 497
// }
// }
}
/* <4d690e> ../game_shared/bot/nav_area.cpp:507 */
NOBODY bool CNavArea::SplitEdit(bool splitAlongX, float splitEdge, CNavArea **outAlpha, CNavArea **outBeta)
{
// {
// class CNavArea *alpha; // 509
// class CNavArea *beta; // 510
// ConnectTo(CNavArea *const this,
// class CNavArea *area,
// enum NavDirType dir); // 580
// SetAttributes(CNavArea *const this,
// unsigned char bits); // 588
// SetAttributes(CNavArea *const this,
// unsigned char bits); // 589
// SetPlace(CNavArea *const this,
// Place place); // 592
// SetPlace(CNavArea *const this,
// Place place); // 593
// remove(list<CNavArea*, std::allocator<CNavArea*>> *const this,
// const value_type &__value); // 603
// ConnectTo(CNavArea *const this,
// class CNavArea *area,
// enum NavDirType dir); // 543
// ConnectTo(CNavArea *const this,
// class CNavArea *area,
// enum NavDirType dir); // 544
// }
}
/* <4c7708> ../game_shared/bot/nav_area.cpp:615 */
NOBODY bool CNavArea::IsConnected(const CNavArea *area, NavDirType dir) const
{
// we are connected to ourself
if (area == this)
return true;
NavConnectList::const_iterator iter;
if (dir == NUM_DIRECTIONS)
{
// search all directions
for (int d = 0; d<NUM_DIRECTIONS; ++d)
{
for (iter = m_connect[ d ].begin(); iter != m_connect[ d ].end(); ++iter)
{
if (area == (*iter).area)
return true;
}
}
// check ladder connections
NavLadderList::const_iterator liter;
for (liter = m_ladder[ LADDER_UP ].begin(); liter != m_ladder[ LADDER_UP ].end(); ++liter)
{
CNavLadder *ladder = *liter;
if (ladder->m_topBehindArea == area || ladder->m_topForwardArea == area || ladder->m_topLeftArea == area || ladder->m_topRightArea == area)
return true;
}
for (liter = m_ladder[ LADDER_DOWN ].begin(); liter != m_ladder[ LADDER_DOWN ].end(); ++liter)
{
CNavLadder *ladder = *liter;
if (ladder->m_bottomArea == area)
return true;
}
}
else
{
// check specific direction
for (iter = m_connect[ dir ].begin(); iter != m_connect[ dir ].end(); ++iter)
{
if (area == (*iter).area)
return true;
}
}
return false;
}
/* <4c89fd> ../game_shared/bot/nav_area.cpp:674 */
NOBODY float CNavArea::ComputeHeightChange(const CNavArea *area)
{
// {
// float ourZ; // 676
// float areaZ; // 677
// }
}
/* <4c9e37> ../game_shared/bot/nav_area.cpp:687 */
NOBODY void CNavArea::FinishSplitEdit(CNavArea *newArea, NavDirType ignoreEdge)
{
// GetZ(const class CNavArea *const this,
// float x,
// float y); // 693
// GetZ(const class CNavArea *const this,
// float x,
// float y); // 694
// {
// int d; // 697
// {
// int count; // 702
// GetAdjacentCount(const class CNavArea *const this,
// enum NavDirType dir); // 702
// {
// int a; // 704
// {
// class CNavArea *adj; // 706
// ConnectTo(CNavArea *const this,
// class CNavArea *area,
// enum NavDirType dir); // 726
// GetAdjacentArea(const class CNavArea *const this,
// enum NavDirType dir,
// int i); // 706
// IsOverlappingY(const class CNavArea *const this,
// const class CNavArea *area); // 724
// OppositeDirection(NavDirType dir); // 729
// IsConnected(const class CNavArea *const this,
// const class CNavArea *area,
// enum NavDirType dir); // 729
// OppositeDirection(NavDirType dir); // 730
// ConnectTo(CNavArea *const this,
// class CNavArea *area,
// enum NavDirType dir); // 730
// IsOverlappingX(const class CNavArea *const this,
// const class CNavArea *area); // 712
// ConnectTo(CNavArea *const this,
// class CNavArea *area,
// enum NavDirType dir); // 714
// OppositeDirection(NavDirType dir); // 717
// IsConnected(const class CNavArea *const this,
// const class CNavArea *area,
// enum NavDirType dir); // 717
// OppositeDirection(NavDirType dir); // 718
// ConnectTo(CNavArea *const this,
// class CNavArea *area,
// enum NavDirType dir); // 718
// }
// }
// }
// }
// push_back(list<CNavArea*, std::allocator<CNavArea*>> *const this,
// const value_type &__x); // 737
}
/* <4c8b85> ../game_shared/bot/nav_area.cpp:745 */
NOBODY bool CNavArea::SpliceEdit(CNavArea *other)
{
// {
// class CNavArea *newArea; // 747
// Vector nw; // 748
// Vector ne; // 748
// Vector se; // 748
// Vector sw; // 748
// {
// float top; // 753
// float bottom; // 754
// ConnectTo(CNavArea *const this,
// class CNavArea *area,
// enum NavDirType dir); // 774
// ConnectTo(CNavArea *const this,
// class CNavArea *area,
// enum NavDirType dir); // 775
// ConnectTo(CNavArea *const this,
// class CNavArea *area,
// enum NavDirType dir); // 777
// ConnectTo(CNavArea *const this,
// class CNavArea *area,
// enum NavDirType dir); // 778
// }
// {
// float left; // 815
// float right; // 816
// ConnectTo(CNavArea *const this,
// class CNavArea *area,
// enum NavDirType dir); // 840
// ConnectTo(CNavArea *const this,
// class CNavArea *area,
// enum NavDirType dir); // 836
// ConnectTo(CNavArea *const this,
// class CNavArea *area,
// enum NavDirType dir); // 837
// ConnectTo(CNavArea *const this,
// class CNavArea *area,
// enum NavDirType dir); // 839
// }
// {
// float left; // 845
// float right; // 846
// }
// {
// float top; // 783
// float bottom; // 784
// ConnectTo(CNavArea *const this,
// class CNavArea *area,
// enum NavDirType dir); // 804
// ConnectTo(CNavArea *const this,
// class CNavArea *area,
// enum NavDirType dir); // 805
// ConnectTo(CNavArea *const this,
// class CNavArea *area,
// enum NavDirType dir); // 807
// ConnectTo(CNavArea *const this,
// class CNavArea *area,
// enum NavDirType dir); // 808
// }
// SetPlace(CNavArea *const this,
// Place place); // 886
// SetPlace(CNavArea *const this,
// Place place); // 898
// push_back(list<CNavArea*, std::allocator<CNavArea*>> *const this,
// const value_type &__x); // 901
// SetPlace(CNavArea *const this,
// Place place); // 896
// }
}
/* <4d72dd> ../game_shared/bot/nav_area.cpp:911 */
NOBODY bool CNavArea::MergeEdit(CNavArea *adj)
{
// {
// float const tolerance; // 917
// bool merge; // 918
// class Extent origExtent; // 930
// Extent(Extent *const this,
// const class Extent &const); // 930
// GetZ(const class CNavArea *const this,
// float x,
// float y); // 944
// GetZ(const class CNavArea *const this,
// float x,
// float y); // 949
// remove(list<CNavArea*, std::allocator<CNavArea*>> *const this,
// const value_type &__value); // 957
// GetZ(const class CNavArea *const this,
// float x,
// float y); // 946
// GetZ(const class CNavArea *const this,
// float x,
// float y); // 951
// }
}
/* <4c78a9> ../game_shared/bot/nav_area.cpp:964 */
void ApproachAreaAnalysisPrep(void)
{
// collect "good-sized" areas for computing approach areas
buildGoodSizedList();
}
/* <4c7a37> ../game_shared/bot/nav_area.cpp:971 */
void CleanupApproachAreaAnalysisPrep(void)
{
goodSizedAreaList.clear();
}
/* <4c7b18> ../game_shared/bot/nav_area.cpp:980 */
void DestroyLadders(void)
{
while (!TheNavLadderList.empty())
{
CNavLadder *ladder = TheNavLadderList.front();
TheNavLadderList.pop_front();
delete ladder;
}
}
void (*pDestroyNavigationMap)(void);
/* <4d6733> ../game_shared/bot/nav_area.cpp:994 */
void __declspec(naked) DestroyNavigationMap(void)
{
__asm
{
jmp pDestroyNavigationMap
}
//IMPLEMENT_ARRAY_CLASS(CNavArea, m_isReset) = true;
//// remove each element of the list and delete them
//while (!TheNavAreaList.empty())
//{
// CNavArea *area = TheNavAreaList.front();
// TheNavAreaList.pop_front();
// //delete area;//TODO: FIX ME stl m_connect
//}
////TheNavAreaList.clear();
//IMPLEMENT_ARRAY_CLASS(CNavArea, m_isReset) = false;
//// destroy ladder representations
//DestroyLadders();
//// destroy all hiding spots
//DestroyHidingSpots();
//// destroy navigation nodes created during map learning
//CNavNode *node, *next;
//for (node = IMPLEMENT_ARRAY_CLASS(CNavNode, m_list); node; node = next)
//{
// next = node->m_next;
// delete node;
//}
//IMPLEMENT_ARRAY_CLASS(CNavNode, m_list) = NULL;
//// reset the grid
//TheNavAreaGrid.Reset();
}
/* <4c7e9a> ../game_shared/bot/nav_area.cpp:1046 */
NOBODY void CNavArea::Strip(void)
{
// clear(list<SpotEncounter, std::allocator<SpotEncounter>> *const this); // 1049
}
/* <4c7c70> ../game_shared/bot/nav_area.cpp:1031 */
NOBODY void StripNavigationAreas(void)
{
// {
// iterator iter; // 1033
// {
// class CNavArea *area; // 1036
// Strip(CNavArea *const this); // 1038
// }
// operator++(_List_iterator<CNavArea*> *const this); // 1034
// }
}
/* <4d1b9c> ../game_shared/bot/nav_area.cpp:1057 */
NOBODY inline CNavArea *FindFirstAreaInDirection(const Vector *start, NavDirType dir, float range, float beneathLimit, CBaseEntity *traceIgnore, Vector *closePos)
{
// {
// class CNavArea *area; // 1059
// Vector pos; // 1061
// int end; // 1063
// {
// int i; // 1065
// {
// TraceResult result; // 1070
// }
// }
// }
}
/* <4c3de4> ../game_shared/bot/nav_area.cpp:1102 */
NOBODY inline bool testJumpDown(const Vector *fromPos, const Vector *toPos)
{
// {
// float dz; // 1104
// Vector from; // 1120
// Vector to; // 1121
// TraceResult result; // 1123
// }
}
/* <4d1b44> ../game_shared/bot/nav_area.cpp:1138 */
NOBODY inline CNavArea *findJumpDownArea(const Vector *fromPos, NavDirType dir)
{
// {
// Vector start; // 1140
// Vector toPos; // 1143
// class CNavArea *downArea; // 1144
// }
}
/* <4d1c46> ../game_shared/bot/nav_area.cpp:1157 */
NOBODY void ConnectGeneratedAreas(void)
{
// {
// iterator iter; // 1161
// {
// class CNavArea *area; // 1163
// class CNavNode *node; // 1169
// {
// class CNavNode *adj; // 1172
// {
// class CNavArea *downArea; // 1180
// findJumpDownArea(const Vector *fromPos,
// enum NavDirType dir); // 1180
// ConnectTo(CNavArea *const this,
// class CNavArea *area,
// enum NavDirType dir); // 1182
// }
// ConnectTo(CNavArea *const this,
// class CNavArea *area,
// enum NavDirType dir); // 1176
// GetConnectedNode(const class CNavNode *const this,
// enum NavDirType dir); // 1172
// }
// GetConnectedNode(const class CNavNode *const this,
// enum NavDirType dir); // 1170
// {
// class CNavNode *adj; // 1189
// ConnectTo(CNavArea *const this,
// class CNavArea *area,
// enum NavDirType dir); // 1193
// {
// class CNavArea *downArea; // 1197
// findJumpDownArea(const Vector *fromPos,
// enum NavDirType dir); // 1197
// ConnectTo(CNavArea *const this,
// class CNavArea *area,
// enum NavDirType dir); // 1199
// }
// GetConnectedNode(const class CNavNode *const this,
// enum NavDirType dir); // 1189
// }
// GetConnectedNode(const class CNavNode *const this,
// enum NavDirType dir); // 1187
// GetConnectedNode(const class CNavNode *const this,
// enum NavDirType dir); // 1207
// {
// class CNavNode *end; // 1210
// GetConnectedNode(const class CNavNode *const this,
// enum NavDirType dir); // 1210
// {
// class CNavNode *adj; // 1214
// ConnectTo(CNavArea *const this,
// class CNavArea *area,
// enum NavDirType dir); // 1218
// {
// class CNavArea *downArea; // 1222
// findJumpDownArea(const Vector *fromPos,
// enum NavDirType dir); // 1222
// ConnectTo(CNavArea *const this,
// class CNavArea *area,
// enum NavDirType dir); // 1224
// }
// GetConnectedNode(const class CNavNode *const this,
// enum NavDirType dir); // 1214
// }
// GetConnectedNode(const class CNavNode *const this,
// enum NavDirType dir); // 1212
// }
// GetConnectedNode(const class CNavNode *const this,
// enum NavDirType dir); // 1231
// {
// class CNavNode *end; // 1234
// GetConnectedNode(const class CNavNode *const this,
// enum NavDirType dir); // 1234
// {
// class CNavNode *adj; // 1237
// ConnectTo(CNavArea *const this,
// class CNavArea *area,
// enum NavDirType dir); // 1241
// {
// class CNavArea *downArea; // 1245
// findJumpDownArea(const Vector *fromPos,
// enum NavDirType dir); // 1245
// ConnectTo(CNavArea *const this,
// class CNavArea *area,
// enum NavDirType dir); // 1247
// }
// GetConnectedNode(const class CNavNode *const this,
// enum NavDirType dir); // 1237
// }
// GetConnectedNode(const class CNavNode *const this,
// enum NavDirType dir); // 1235
// }
// }
// operator++(_List_iterator<CNavArea*> *const this); // 1161
// }
}
/* <4d922b> ../game_shared/bot/nav_area.cpp:1259 */
NOBODY void MergeGeneratedAreas(void)
{
// {
// bool merged; // 1263
// {
// iterator iter; // 1269
// {
// class CNavArea *area; // 1271
// iterator citer; // 1274
// end(list<NavConnect, std::allocator<NavConnect>> *const this); // 1275
// operator++(_List_iterator<NavConnect> *const this); // 1275
// {
// class CNavArea *adjArea; // 1277
// }
// end(list<NavConnect, std::allocator<NavConnect>> *const this); // 1302
// operator++(_List_iterator<NavConnect> *const this); // 1302
// {
// class CNavArea *adjArea; // 1304
// }
// {
// class CNavArea *adjArea; // 1361
// }
// end(list<NavConnect, std::allocator<NavConnect>> *const this); // 1359
// operator++(_List_iterator<NavConnect> *const this); // 1359
// end(list<NavConnect, std::allocator<NavConnect>> *const this); // 1331
// operator++(_List_iterator<NavConnect> *const this); // 1331
// {
// class CNavArea *adjArea; // 1333
// }
// }
// operator++(_List_iterator<CNavArea*> *const this); // 1269
// }
// }
}
/* <4c342b> ../game_shared/bot/nav_area.cpp:1394 */
NOBODY inline bool IsAreaRoughlySquare(const class CNavArea *area)
{
// {
// float aspect; // 1396
// float const maxAspect; // 1398
// float const minAspect; // 1399
// }
}
/* <4d70f4> ../game_shared/bot/nav_area.cpp:1410 */
NOBODY void SplitX(CNavArea *area)
{
// {
// float split; // 1415
// float const epsilon; // 1421
// class CNavArea *alpha; // 1429
// class CNavArea *beta; // 1429
// IsAreaRoughlySquare(const class CNavArea *area); // 1412
// SnapToGrid(float *value); // 1419
// }
}
/* <4d6fe1> ../game_shared/bot/nav_area.cpp:1442 */
NOBODY void SplitY(CNavArea *area)
{
// {
// float split; // 1447
// float const epsilon; // 1453
// class CNavArea *alpha; // 1461
// class CNavArea *beta; // 1461
// IsAreaRoughlySquare(const class CNavArea *area); // 1444
// SnapToGrid(float *value); // 1451
// }
}
/* <4d7207> ../game_shared/bot/nav_area.cpp:1474 */
NOBODY void SquareUpAreas(void)
{
// {
// iterator iter; // 1476
// {
// class CNavArea *area; // 1480
// operator++(_List_iterator<CNavArea*> *const this); // 1481
// IsAreaRoughlySquare(const class CNavArea *area); // 1483
// }
// }
}
/* <4c8066> ../game_shared/bot/nav_area.cpp:1503 */
NOBODY bool TestArea(CNavNode *node, int width, int height)
{
// {
// Vector normal; // 1505
// float d; // 1506
// float const offPlaneTolerance; // 1508
// class CNavNode *vertNode; // 1510
// class CNavNode *horizNode; // 1510
// {
// int y; // 1513
// {
// int x; // 1517
// {
// float dist; // 1536
// DotProduct(Vector &a,
// const Vector &b); // 1536
// }
// GetConnectedNode(const class CNavNode *const this,
// enum NavDirType dir); // 1529
// }
// GetConnectedNode(const class CNavNode *const this,
// enum NavDirType dir); // 1542
// {
// float dist; // 1549
// DotProduct(Vector &a,
// const Vector &b); // 1549
// }
// }
// Vector(Vector *const this,
// const Vector &v); // 1505
// DotProduct(Vector &a,
// const Vector &b); // 1506
// {
// int x; // 1560
// {
// float dist; // 1567
// GetConnectedNode(const class CNavNode *const this,
// enum NavDirType dir); // 1562
// DotProduct(Vector &a,
// const Vector &b); // 1567
// }
// }
// }
}
/* <4c82ea> ../game_shared/bot/nav_area.cpp:1582 */
NOBODY int BuildArea(CNavNode *node, int width, int height)
{
// {
// class CNavNode *nwNode; // 1586
// class CNavNode *neNode; // 1587
// class CNavNode *swNode; // 1588
// class CNavNode *seNode; // 1589
// class CNavNode *vertNode; // 1591
// class CNavNode *horizNode; // 1592
// int coveredNodes; // 1594
// class CNavArea *area; // 1629
// {
// int y; // 1596
// {
// int x; // 1600
// Cover(CNavNode *const this); // 1602
// GetConnectedNode(const class CNavNode *const this,
// enum NavDirType dir); // 1605
// }
// GetConnectedNode(const class CNavNode *const this,
// enum NavDirType dir); // 1611
// }
// {
// int x; // 1617
// GetConnectedNode(const class CNavNode *const this,
// enum NavDirType dir); // 1619
// }
// push_back(list<CNavArea*, std::allocator<CNavArea*>> *const this,
// const value_type &__x); // 1630
// SetAttributes(CNavArea *const this,
// unsigned char bits); // 1633
// }
}
/* <4d3581> ../game_shared/bot/nav_area.cpp:1645 */
NOBODY void BuildLadders(void)
{
// {
// TraceResult result; // 1650
// class CBaseEntity *entity; // 1651
// DestroyLadders(void); // 1648
// edict(CBaseEntity *const this); // 1652
// FNullEnt(const edict_t *pent); // 1652
// {
// class CNavLadder *ladder; // 1654
// float xSize; // 1666
// float ySize; // 1667
// Vector along; // 1698
// float length; // 1699
// Vector on; // 1700
// Vector out; // 1700
// float const minLadderClearance; // 1701
// float const inc; // 1704
// float t; // 1705
// float const nearLadderRange; // 1746
// Vector center; // 1753
// float topZ; // 1813
// bool topAdjusted; // 1814
// class CNavArea *topAreaList; // 1815
// {
// Vector from; // 1685
// Vector to; // 1686
// operator+(const Vector *const this,
// const Vector &v); // 1685
// operator+(const Vector *const this,
// const Vector &v); // 1686
// }
// {
// Vector from; // 1672
// Vector to; // 1673
// operator+(const Vector *const this,
// const Vector &v); // 1672
// operator+(const Vector *const this,
// const Vector &v); // 1673
// }
// CNavLadder(CNavLadder *const this); // 1654
// operator-(const Vector *const this,
// const Vector &v); // 1698
// NormalizeInPlace(Vector *const this); // 1699
// AddDirectionVector(Vector *v,
// enum NavDirType dir,
// float amount); // 1711
// operator*(float fl,
// const Vector &v); // 1708
// operator+(const Vector *const this,
// const Vector &v); // 1708
// operator-(const Vector *const this,
// const Vector &v); // 1741
// Length(const Vector *const this); // 1741
// DirectionToVector2D(NavDirType dir,
// class Vector2D *v); // 1743
// operator+(const Vector *const this,
// const Vector &v); // 1753
// AddDirectionVector(Vector *v,
// enum NavDirType dir,
// float amount); // 1754
// AddLadderUp(CNavArea *const this,
// class CNavLadder *ladder); // 1764
// operator+(const Vector *const this,
// const Vector &v); // 1772
// AddDirectionVector(Vector *v,
// enum NavDirType dir,
// float amount); // 1773
// FindFirstAreaInDirection(const Vector *start,
// enum NavDirType dir,
// float range,
// float beneathLimit,
// class CBaseEntity *traceIgnore,
// Vector *closePos); // 1776
// FindFirstAreaInDirection(const Vector *start,
// enum NavDirType dir,
// float range,
// float beneathLimit,
// class CBaseEntity *traceIgnore,
// Vector *closePos); // 1781
// FindFirstAreaInDirection(const Vector *start,
// enum NavDirType dir,
// float range,
// float beneathLimit,
// class CBaseEntity *traceIgnore,
// Vector *closePos); // 1786
// FindFirstAreaInDirection(const Vector *start,
// enum NavDirType dir,
// float range,
// float beneathLimit,
// class CBaseEntity *traceIgnore,
// Vector *closePos); // 1791
// AddLadderDown(CNavArea *const this,
// class CNavLadder *ladder); // 1801
// AddLadderDown(CNavArea *const this,
// class CNavLadder *ladder); // 1804
// AddLadderDown(CNavArea *const this,
// class CNavLadder *ladder); // 1807
// AddLadderDown(CNavArea *const this,
// class CNavLadder *ladder); // 1810
// {
// int a; // 1821
// {
// class CNavArea *topArea; // 1823
// Vector close; // 1827
// }
// }
// {
// Vector bottomSpot; // 1846
// }
// push_back(list<CNavLadder*, std::allocator<CNavLadder*>> *const this,
// const value_type &__x); // 1853
// AddDirectionVector(Vector *v,
// enum NavDirType dir,
// float amount); // 1729
// operator*(float fl,
// const Vector &v); // 1726
// operator-(const Vector *const this,
// const Vector &v); // 1726
// }
// }
}
/* <4c85c3> ../game_shared/bot/nav_area.cpp:1864 */
NOBODY void MarkJumpAreas(void)
{
// {
// iterator iter; // 1866
// operator++(_List_iterator<CNavArea*> *const this); // 1866
// {
// class CNavArea *area; // 1868
// Vector u; // 1869
// Vector v; // 1869
// Vector normal; // 1880
// CrossProduct(Vector &a,
// const Vector &b); // 1880
// NormalizeInPlace(Vector *const this); // 1881
// }
// }
}
/* <4d943a> ../game_shared/bot/nav_area.cpp:1899 */
NOBODY void GenerateNavigationAreaMesh(void)
{
// {
// int tryWidth; // 1902
// int tryHeight; // 1903
// int uncoveredNodes; // 1904
// class Extent extent; // 1935
// iterator iter; // 1942
// {
// class CNavNode *node; // 1908
// GetFirst(void); // 1908
// {
// int covered; // 1915
// }
// }
// {
// class CNavArea *area; // 1945
// const class Extent *areaExtent; // 1946
// }
// operator++(_List_iterator<CNavArea*> *const this); // 1943
// Initialize(CNavAreaGrid *const this,
// float minX,
// float maxX,
// float minY,
// float maxY); // 1959
// operator++(_List_iterator<CNavArea*> *const this); // 1961
// }
}
/* <4c86fa> ../game_shared/bot/nav_area.cpp:1975 */
NOBODY bool CNavArea::IsOverlapping(const Vector *pos) const
{
if (pos->x >= m_extent.lo.x && pos->x <= m_extent.hi.x &&
pos->y >= m_extent.lo.y && pos->y <= m_extent.hi.y)
return true;
return false;
}
/* <4c8726> ../game_shared/bot/nav_area.cpp:1988 */
NOBODY bool CNavArea::IsOverlapping(const CNavArea *area) const
{
}
/* <4c8761> ../game_shared/bot/nav_area.cpp:2001 */
NOBODY bool CNavArea::IsOverlappingX(const CNavArea *area) const
{
}
/* <4c878d> ../game_shared/bot/nav_area.cpp:2013 */
NOBODY bool CNavArea::IsOverlappingY(const CNavArea *area) const
{
}
/* <4c8a66> ../game_shared/bot/nav_area.cpp:2025 */
NOBODY bool CNavArea::Contains(const Vector *pos) const
{
// {
// float ourZ; // 2032
// IsOverlapping(const class CNavArea *const this,
// const Vector *pos); // 2028
// {
// const_iterator iter; // 2038
// {
// const class CNavArea *area; // 2040
// float theirZ; // 2050
// IsOverlapping(const class CNavArea *const this,
// const Vector *pos); // 2047
// }
// end(const class list<CNavArea*, std::allocator<CNavArea*>> *const this); // 2038
// operator++(_List_const_iterator<CNavArea*> *const this); // 2038
// }
// }
}
/* <4c87b9> ../game_shared/bot/nav_area.cpp:2071 */
NOBODY bool CNavArea::IsCoplanar(const CNavArea *area) const
{
// {
// Vector u; // 2073
// Vector v; // 2073
// Vector normal; // 2084
// Vector otherNormal; // 2097
// float const tolerance; // 2101
// CrossProduct(Vector &a,
// const Vector &b); // 2084
// NormalizeInPlace(Vector *const this); // 2085
// CrossProduct(Vector &a,
// const Vector &b); // 2097
// NormalizeInPlace(Vector *const this); // 2098
// DotProduct(Vector &a,
// const Vector &b); // 2102
// }
}
/* <4c8963> ../game_shared/bot/nav_area.cpp:2114 */
//float (__fastcall *pGetZ__Vector)(const CNavArea *pthis, int i ,const Vector *pos);
float (*pGetZ__Vector)(const Vector *pos);
float __declspec(naked) CNavArea::GetZ(const Vector *pos) const
{
__asm
{
jmp pGetZ__Vector
}
UNTESTED
// Crash
/*
float dx = m_extent.hi.x - m_extent.lo.x;
float dy = m_extent.hi.y - m_extent.lo.y;
// guard against division by zero due to degenerate areas
if (dx == 0.0f || dy == 0.0f)
return m_neZ;
float u = (pos->x - m_extent.lo.x) / dx;
float v = (pos->y - m_extent.lo.y) / dy;
// clamp Z values to (x,y) volume
if (u < 0.0f)
u = 0.0f;
else if (u > 1.0f)
u = 1.0f;
if (v < 0.0f)
v = 0.0f;
else if (v > 1.0f)
v = 1.0f;
float northZ = m_extent.lo.z + u * (m_neZ - m_extent.lo.z);
float southZ = m_swZ + u * (m_extent.hi.z - m_swZ);
return northZ + v * (southZ - northZ);
*/
}
/* <4caa36> ../game_shared/bot/nav_area.cpp:2143 */
float CNavArea::GetZ(float x, float y) const
{
Vector pos(x, y, 0.0f);
return GetZ(&pos);
}
/* <4caab9> ../game_shared/bot/nav_area.cpp:2155 */
void CNavArea::GetClosestPointOnArea(const Vector *pos, Vector *close) const
{
const Extent *extent = GetExtent();
if (pos->x < extent->lo.x)
{
if (pos->y < extent->lo.y)
*close = extent->lo;
else if (pos->y > extent->hi.y)
{
close->x = extent->lo.x;
close->y = extent->hi.y;
}
else
{
close->x = extent->lo.x;
close->y = pos->y;
}
}
else if (pos->x > extent->hi.x)
{
if (pos->y < extent->lo.y)
{
close->x = extent->hi.x;
close->y = extent->lo.y;
}
else if (pos->y > extent->hi.y)
*close = extent->hi;
else
{
close->x = extent->hi.x;
close->y = pos->y;
}
}
else if (pos->y < extent->lo.y)
{
close->x = pos->x;
close->y = extent->lo.y;
}
else if (pos->y > extent->hi.y)
{
close->x = pos->x;
close->y = extent->hi.y;
}
else
*close = *pos;
close->z = GetZ(close);
}
/* <4cab19> ../game_shared/bot/nav_area.cpp:2224 */
NOBODY float CNavArea::GetDistanceSquaredToPoint(const Vector *pos) const
{
// {
// const class Extent *extent; // 2226
// {
// Vector d; // 2238
// }
// operator-(const Vector *const this,
// const Vector &v); // 2233
// {
// Vector d; // 2256
// LengthSquared(const Vector *const this); // 2260
// }
// operator-(const Vector *const this,
// const Vector &v); // 2265
// LengthSquared(const Vector *const this); // 2265
// {
// float d; // 2270
// }
// {
// float z; // 2289
// float d; // 2290
// }
// {
// float d; // 2283
// }
// {
// float d; // 2277
// }
// }
}
/* <4cacac> ../game_shared/bot/nav_area.cpp:2298 */
NOBODY CNavArea *CNavArea::GetRandomAdjacentArea(NavDirType dir) const
{
// {
// int count; // 2300
// int which; // 2301
// int i; // 2303
// const_iterator iter; // 2304
// size(const class list<NavConnect, std::allocator<NavConnect>> *const this); // 2300
// operator++(_List_const_iterator<NavConnect> *const this); // 2305
// }
}
/* <4cadd2> ../game_shared/bot/nav_area.cpp:2322 */
NOBODY void CNavArea::ComputePortal(const CNavArea *to, NavDirType dir, Vector *center, float *halfWidth) const
{
// {
// float left; // 2331
// float right; // 2332
// }
// {
// float top; // 2355
// float bottom; // 2356
// }
}
/* <4cb0d7> ../game_shared/bot/nav_area.cpp:2378 */
NOBODY void CNavArea::ComputeClosestPointInPortal(const CNavArea *to, NavDirType dir, const Vector *fromPos, Vector *closePos) const
{
// {
// float const margin; // 2380
// {
// float left; // 2389
// float right; // 2390
// float const leftMargin; // 2404
// float const rightMargin; // 2405
// }
// {
// float top; // 2423
// float bottom; // 2424
// float const topMargin; // 2438
// float const bottomMargin; // 2439
// }
// }
}
/* <4cae93> ../game_shared/bot/nav_area.cpp:2455 */
NOBODY bool CNavArea::IsEdge(NavDirType dir) const
{
// {
// const_iterator it; // 2457
// {
// union NavConnectconst connect; // 2459
// OppositeDirection(NavDirType dir); // 2461
// IsConnected(const class CNavArea *const this,
// const class CNavArea *area,
// enum NavDirType dir); // 2461
// }
// operator++(_List_const_iterator<NavConnect> *const this); // 2457
// }
}
/* <4cb1f5> ../game_shared/bot/nav_area.cpp:2473 */
NOBODY NavDirType CNavArea::ComputeDirection(Vector *point) const
{
// {
// Vector to; // 2491
// operator-(const Vector *const this,
// const Vector &v); // 2491
// }
}
/* <4cb26d> ../game_shared/bot/nav_area.cpp:2513 */
NOBODY void CNavArea::Draw(byte red, byte green, byte blue, int duration)
{
// {
// Vector nw; // 2515
// Vector ne; // 2515
// Vector sw; // 2515
// Vector se; // 2515
// float border; // 2531
// Vector(Vector *const this,
// const Vector &v); // 2541
// Vector(Vector *const this,
// const Vector &v); // 2541
// Vector(Vector *const this,
// const Vector &v); // 2542
// Vector(Vector *const this,
// const Vector &v); // 2542
// Vector(Vector *const this,
// const Vector &v); // 2543
// Vector(Vector *const this,
// const Vector &v); // 2543
// Vector(Vector *const this,
// const Vector &v); // 2544
// Vector(Vector *const this,
// const Vector &v); // 2544
// {
// float size; // 2557
// Vector up; // 2558
// Vector down; // 2559
// Vector left; // 2562
// Vector right; // 2563
// Vector(Vector *const this,
// const Vector &v); // 2560
// Vector(Vector *const this,
// const Vector &v); // 2560
// Vector(Vector *const this,
// const Vector &v); // 2564
// Vector(Vector *const this,
// const Vector &v); // 2564
// }
// {
// float size; // 2569
// Vector up; // 2570
// Vector down; // 2571
// Vector left; // 2572
// Vector right; // 2573
// Vector(Vector *const this,
// const Vector &v); // 2574
// Vector(Vector *const this,
// const Vector &v); // 2574
// Vector(Vector *const this,
// const Vector &v); // 2575
// Vector(Vector *const this,
// const Vector &v); // 2575
// Vector(Vector *const this,
// const Vector &v); // 2576
// Vector(Vector *const this,
// const Vector &v); // 2576
// Vector(Vector *const this,
// const Vector &v); // 2577
// Vector(Vector *const this,
// const Vector &v); // 2577
// }
// Vector(Vector *const this,
// const Vector &v); // 2551
// Vector(Vector *const this,
// const Vector &v); // 2551
// Vector(Vector *const this,
// const Vector &v); // 2552
// Vector(Vector *const this,
// const Vector &v); // 2552
// Vector(Vector *const this,
// const Vector &v); // 2547
// Vector(Vector *const this,
// const Vector &v); // 2547
// }
}
/* <4cb855> ../game_shared/bot/nav_area.cpp:2585 */
NOBODY void CNavArea::DrawMarkedCorner(NavCornerType corner, byte red, byte green, byte blue, int duration)
{
// {
// Vector nw; // 2587
// Vector ne; // 2587
// Vector sw; // 2587
// Vector se; // 2587
// float border; // 2603
// Vector(Vector *const this,
// const Vector &v); // 2625
// operator+(const Vector *const this,
// const Vector &v); // 2625
// Vector(Vector *const this,
// const Vector &v); // 2622
// operator+(const Vector *const this,
// const Vector &v); // 2622
// Vector(Vector *const this,
// const Vector &v); // 2619
// operator+(const Vector *const this,
// const Vector &v); // 2619
// Vector(Vector *const this,
// const Vector &v); // 2616
// operator+(const Vector *const this,
// const Vector &v); // 2616
// }
}
/* <4cbb32> ../game_shared/bot/nav_area.cpp:2634 */
NOBODY void CNavArea::AddToOpenList(void)
{
// {
// class CNavArea *area; // 2649
// class CNavArea *last; // 2649
// }
}
/* <4cbd73> ../game_shared/bot/nav_area.cpp:2685 */
NOBODY void CNavArea::UpdateOnOpenList(void)
{
// {
// class CNavArea *other; // 2692
// class CNavArea *before; // 2693
// class CNavArea *after; // 2694
// }
}
/* <4cbdbc> ../game_shared/bot/nav_area.cpp:2713 */
NOBODY void CNavArea::RemoveFromOpenList(void)
{
if (m_prevOpen)
m_prevOpen->m_nextOpen = m_nextOpen;
else
IMPLEMENT_ARRAY(m_openList) = m_nextOpen;
if (m_nextOpen)
m_nextOpen->m_prevOpen = m_prevOpen;
// zero is an invalid marker
m_openMarker = 0;
}
/* <4cbddf> ../game_shared/bot/nav_area.cpp:2731 */
NOBODY void CNavArea::ClearSearchLists(void)
{
CNavArea::MakeNewMarker();
IMPLEMENT_ARRAY(m_openList) = NULL;
}
/* <4cbe06> ../game_shared/bot/nav_area.cpp:2744 */
NOBODY const Vector *CNavArea::GetCorner(NavCornerType corner) const
{
// {
// Vector pos; // 2746
// }
// GetCorner(const class CNavArea *const this,
// enum NavCornerType corner); // 2744
}
/* <4cbe86> ../game_shared/bot/nav_area.cpp:2776 */
NOBODY bool CNavArea::IsHidingSpotCollision(const Vector *pos) const
{
// {
// float const collisionRange; // 2778
// {
// const_iterator iter; // 2780
// end(const class list<HidingSpot*, std::allocator<HidingSpot*>> *const this); // 2780
// {
// const class HidingSpot *spot; // 2782
// operator-(const Vector *const this,
// const Vector &v); // 2784
// IsLengthLessThan(const Vector *const this,
// float length); // 2784
// }
// operator++(_List_const_iterator<HidingSpot*> *const this); // 2780
// }
// }
}
/* <4c3aa2> ../game_shared/bot/nav_area.cpp:2792 */
NOBODY bool IsHidingSpotInCover(const Vector *spot)
{
// {
// int coverCount; // 2794
// TraceResult result; // 2795
// Vector from; // 2797
// Vector to; // 2800
// float const coverRange; // 2808
// float const inc; // 2809
// int const halfCover; // 2823
// {
// float angle; // 2811
// }
// }
}
/* <4cc054> ../game_shared/bot/nav_area.cpp:2834 */
NOBODY void CNavArea::ComputeHidingSpots(void)
{
// {
// class extent; // 2840
// int cornerCount; // 2846
// float const cornerSize; // 2850
// float offset; // 2928
// {
// int d; // 2853
// {
// bool isHoriz; // 2858
// {
// iterator iter; // 2860
// {
// union NavConnect connect; // 2862
// IsConnected(const class CNavArea *const this,
// const class CNavArea *area,
// enum NavDirType dir); // 2866
// }
// operator++(_List_iterator<NavConnect> *const this); // 2860
// }
// }
// }
// {
// Vector pos; // 2932
// GetCorner(const class CNavArea *const this,
// enum NavCornerType corner); // 2932
// operator+(const Vector *const this,
// const Vector &v); // 2932
// HidingSpot(HidingSpot *const this,
// const Vector *pos,
// unsigned char flags); // 2934
// push_back(list<HidingSpot*, std::allocator<HidingSpot*>> *const this,
// const value_type &__x); // 2934
// }
// {
// Vector pos; // 2939
// GetCorner(const class CNavArea *const this,
// enum NavCornerType corner); // 2939
// operator+(const Vector *const this,
// const Vector &v); // 2939
// push_back(list<HidingSpot*, std::allocator<HidingSpot*>> *const this,
// const value_type &__x); // 2941
// }
// {
// Vector pos; // 2946
// GetCorner(const class CNavArea *const this,
// enum NavCornerType corner); // 2946
// operator+(const Vector *const this,
// const Vector &v); // 2946
// push_back(list<HidingSpot*, std::allocator<HidingSpot*>> *const this,
// const value_type &__x); // 2948
// }
// {
// Vector pos; // 2953
// GetCorner(const class CNavArea *const this,
// enum NavCornerType corner); // 2953
// operator+(const Vector *const this,
// const Vector &v); // 2953
// IsHidingSpotCollision(const class CNavArea *const this,
// const Vector *pos); // 2954
// HidingSpot(HidingSpot *const this,
// const Vector *pos,
// unsigned char flags); // 2955
// push_back(list<HidingSpot*, std::allocator<HidingSpot*>> *const this,
// const value_type &__x); // 2955
// }
// }
}
/* <4cccaf> ../game_shared/bot/nav_area.cpp:2963 */
NOBODY void ClassifySniperSpot(HidingSpot *spot)
{
// {
// Vector eye; // 2965
// Vector walkable; // 2966
// TraceResult result; // 2967
// class Extent sniperExtent; // 2969
// float farthestRangeSq; // 2970
// float const minSniperRangeSq; // 2971
// bool found; // 2972
// operator+(const Vector *const this,
// const Vector &v); // 2965
// {
// iterator iter; // 2974
// {
// class CNavArea *area; // 2976
// const class Extent *extent; // 2978
// {
// float rangeSq; // 2995
// operator-(const Vector *const this,
// const Vector &v); // 2995
// LengthSquared(const Vector *const this); // 2995
// }
// }
// operator++(_List_iterator<CNavArea*> *const this); // 2974
// }
// {
// float snipableArea; // 3032
// float const minIdealSniperArea; // 3034
// float const longSniperRangeSq; // 3035
// Area(const class Extent *const this); // 3032
// SetFlags(HidingSpot *const this,
// unsigned char flags); // 3038
// SetFlags(HidingSpot *const this,
// unsigned char flags); // 3040
// }
// }
}
/* <4ccf19> ../game_shared/bot/nav_area.cpp:3049 */
NOBODY void CNavArea::ComputeSniperSpots(void)
{
// {
// iterator iter; // 3054
// end(list<HidingSpot*, std::allocator<HidingSpot*>> *const this); // 3054
// {
// class HidingSpot *spot; // 3056
// }
// operator++(_List_iterator<HidingSpot*> *const this); // 3054
// }
}
/* <4ccfbd> ../game_shared/bot/nav_area.cpp:3066 */
NOBODY SpotEncounter *CNavArea::GetSpotEncounter(const CNavArea *from, const CNavArea *to)
{
// {
// class SpotEncounter *e; // 3070
// {
// iterator iter; // 3072
// end(list<SpotEncounter, std::allocator<SpotEncounter>> *const this); // 3072
// operator++(_List_iterator<SpotEncounter> *const this); // 3072
// }
// }
}
/* <4cd0a5> ../game_shared/bot/nav_area.cpp:3088 */
NOBODY void CNavArea::AddSpotEncounters(const class CNavArea *from, NavDirType fromDir, const CNavArea *to, NavDirType toDir)
{
// {
// class SpotEncounter e; // 3090
// float halfWidth; // 3098
// float const eyeHeight; // 3102
// Vector dir; // 3107
// float length; // 3108
// float const stepSize; // 3113
// float const seeSpotRange; // 3114
// TraceResult result; // 3115
// Vector eye; // 3117
// Vector delta; // 3117
// class HidingSpot *spot; // 3118
// class SpotOrder spotOrder; // 3119
// bool done; // 3122
// SpotEncounter(SpotEncounter *const this); // 3090
// operator-(const Vector *const this,
// const Vector &v); // 3107
// NormalizeInPlace(Vector *const this); // 3108
// ChangeMasterMarker(void); // 3111
// {
// float along; // 3123
// {
// iterator iter; // 3136
// {
// const Vector *spotPos;// 3147
// float dot; // 3164
// IsLengthGreaterThan(const Vector *const this,
// float length); // 3154
// Vector(Vector *const this,
// float X,
// float Y,
// float Z); // 3158
// NormalizeInPlace(Vector *const this); // 3163
// DotProduct(Vector &a,
// const Vector &b); // 3164
// Mark(HidingSpot *const this); // 3179
// push_back(list<SpotOrder, std::allocator<SpotOrder>> *const this,
// const value_type &__x); // 3174
// }
// operator++(_List_iterator<HidingSpot*> *const this); // 3136
// }
// operator*(float fl,
// const Vector &v); // 3133
// operator+(const Vector *const this,
// const Vector &v); // 3133
// }
// push_back(list<SpotEncounter, std::allocator<SpotEncounter>> *const this,
// const value_type &__x); // 3184
// ~SpotEncounter(SpotEncounter *const this,
// int const __in_chrg); // 3090
// }
}
/* <4cd99c> ../game_shared/bot/nav_area.cpp:3192 */
NOBODY void CNavArea::ComputeSpotEncounters(void)
{
// clear(list<SpotEncounter, std::allocator<SpotEncounter>> *const this); // 3194
// {
// int fromDir; // 3200
// {
// iterator fromIter; // 3202
// {
// union NavConnect *fromCon; // 3204
// {
// int toDir; // 3207
// {
// iterator toIter; // 3209
// {
// union NavConnect *toCon; // 3211
// }
// operator++(_List_iterator<NavConnect> *const this); // 3209
// }
// }
// }
// operator++(_List_iterator<NavConnect> *const this); // 3202
// }
// }
}
/* <4cdca9> ../game_shared/bot/nav_area.cpp:3228 */
NOBODY void CNavArea::DecayDanger(void)
{
// {
// float const decayRate; // 3231
// {
// int i; // 3233
// {
// float deltaT; // 3235
// float decayAmount; // 3236
// }
// }
// }
}
/* <4cdd46> ../game_shared/bot/nav_area.cpp:3251 */
NOBODY void CNavArea::IncreaseDanger(int teamID, float amount)
{
// DecayDanger(CNavArea *const this); // 3254
}
/* <4cddc7> ../game_shared/bot/nav_area.cpp:3264 */
NOBODY float CNavArea::GetDanger(int teamID)
{
// DecayDanger(CNavArea *const this); // 3266
}
/* <4cde4b> ../game_shared/bot/nav_area.cpp:3274 */
NOBODY void IncreaseDangerNearby(int teamID, float amount, class CNavArea *startArea, const Vector *pos, float maxRadius)
{
// MakeNewMarker(void); // 3279
// ClearSearchLists(void); // 3280
// AddToOpenList(CNavArea *const this); // 3282
// SetTotalCost(CNavArea *const this,
// float value); // 3283
// IncreaseDanger(CNavArea *const this,
// int teamID,
// float amount); // 3285
// Mark(CNavArea *const this); // 3284
// {
// class CNavArea *area; // 3290
// PopOpenList(void); // 3290
// {
// int dir; // 3293
// {
// int count; // 3295
// GetAdjacentCount(const class CNavArea *const this,
// enum NavDirType dir); // 3295
// {
// int i; // 3296
// {
// class CNavArea *adjArea; // 3298
// GetAdjacentArea(const class CNavArea *const this,
// enum NavDirType dir,
// int i); // 3298
// {
// float cost; // 3303
// operator-(const Vector *const this,
// const Vector &v); // 3303
// Length(const Vector *const this); // 3303
// AddToOpenList(CNavArea *const this); // 3306
// SetTotalCost(CNavArea *const this,
// float value); // 3307
// Mark(CNavArea *const this); // 3308
// IncreaseDanger(CNavArea *const this,
// int teamID,
// float amount); // 3309
// }
// }
// }
// }
// }
// }
}
/* <4ce2c4> ../game_shared/bot/nav_area.cpp:3321 */
NOBODY void DrawDanger(void)
{
// {
// iterator iter; // 3323
// {
// class CNavArea *area; // 3325
// Vector center; // 3327
// Vector top; // 3328
// float danger; // 3331
// GetDanger(CNavArea *const this,
// int teamID); // 3331
// GetDanger(CNavArea *const this,
// int teamID); // 3340
// Vector(Vector *const this,
// const Vector &v); // 3346
// Vector(Vector *const this,
// const Vector &v); // 3346
// Vector(Vector *const this,
// const Vector &v); // 3327
// Vector(Vector *const this,
// const Vector &v); // 3337
// Vector(Vector *const this,
// const Vector &v); // 3337
// }
// operator++(_List_iterator<CNavArea*> *const this); // 3323
// }
}
/* <4ce523> ../game_shared/bot/nav_area.cpp:3356 */
NOBODY bool IsSpotOccupied(CBaseEntity *me, const Vector *pos)
{
// {
// float const closeRange; // 3358
// float range; // 3361
// class CBasePlayer *player; // 3362
// {
// class CHostage *hostage; // 3373
// GetClosestHostage(CHostageManager *const this,
// const Vector &pos,
// float *resultRange); // 3373
// }
// }
}
/* <4c118b> ../game_shared/bot/nav_area.cpp:3385 */
class CollectHidingSpotsFunctor
{
public:
CollectHidingSpotsFunctor(CBaseEntity *me, const Vector *origin, float range, unsigned char flags, Place place = UNDEFINED_PLACE, bool useCrouchAreas = true)
{
m_me = me;
m_count = 0;
m_origin = origin;
m_range = range;
m_flags = flags;
m_place = place;
m_useCrouchAreas = useCrouchAreas;
}
enum { MAX_SPOTS = 256 };
bool operator()(CNavArea *area)
{
if (m_place != UNDEFINED_PLACE && area->GetPlace() != m_place)
return true;
const HidingSpotList *list = area->GetHidingSpotList();
for (HidingSpotList::const_iterator iter = list->begin(); iter != list->end() && m_count < MAX_SPOTS; ++iter)
{
const HidingSpot *spot = *iter;
if (m_useCrouchAreas == false)
{
CNavArea *area = TheNavAreaGrid.GetNavArea(spot->GetPosition());
if (area && (area->GetAttributes() & NAV_CROUCH))
continue;
}
if (m_range > 0.0f)
{
if ((*spot->GetPosition() - *m_origin).IsLengthGreaterThan(m_range))
continue;
}
if (IsSpotOccupied(m_me, spot->GetPosition()))
{
continue;
}
if (m_flags & spot->GetFlags())
{
m_hidingSpot[m_count++] = spot->GetPosition();
}
}
if (m_count == MAX_SPOTS)
return false;
return true;
}
void RemoveSpot(int i)
{
if (m_count == 0)
return;
for (int j= i + 1; j < m_count; ++j)
m_hidingSpot[j-1] = m_hidingSpot[j];
--m_count;
}
CBaseEntity *m_me;
const Vector *m_origin;
float m_range;
const Vector *m_hidingSpot[MAX_SPOTS];
int m_count;
unsigned char m_flags;
Place m_place;
bool m_useCrouchAreas;
};
/* <4d1806> ../game_shared/bot/nav_area.cpp:3477 */
NOBODY const Vector *FindNearbyHidingSpot(CBaseEntity *me, const Vector *pos, class CNavArea *startArea, float maxRange, bool isSniper, bool useNearest)
{
// {
// class CollectHidingSpotsFunctor collector; // 3510
// int which; // 3535
// {
// class CollectHidingSpotsFunctor collector; // 3485
// CollectHidingSpotsFunctor(CollectHidingSpotsFunctor *const this,
// class CBaseEntity *me,
// const Vector *origin,
// float range,
// unsigned char flags,
// Place place,
// bool useCrouchAreas); // 3485
// SearchSurroundingAreas<CollectHidingSpotsFunctor>(CNavArea *startArea,
// const Vector *startPos,
// class CollectHidingSpotsFunctor &func,
// float maxRange); // 3486
// {
// int which; // 3490
// }
// {
// class CollectHidingSpotsFunctor collector; // 3496
// CollectHidingSpotsFunctor(CollectHidingSpotsFunctor *const this,
// class CBaseEntity *me,
// const Vector *origin,
// float range,
// unsigned char flags,
// Place place,
// bool useCrouchAreas); // 3496
// {
// int which; // 3501
// }
// }
// }
// CollectHidingSpotsFunctor(CollectHidingSpotsFunctor *const this,
// class CBaseEntity *me,
// const Vector *origin,
// float range,
// unsigned char flags,
// Place place,
// bool useCrouchAreas); // 3510
// SearchSurroundingAreas<CollectHidingSpotsFunctor>(CNavArea *startArea,
// const Vector *startPos,
// class CollectHidingSpotsFunctor &func,
// float maxRange); // 3511
// {
// const Vector *closest; // 3519
// float closeRangeSq; // 3520
// {
// int i; // 3521
// {
// float rangeSq; // 3523
// operator-(const Vector *const this,
// const Vector &v); // 3523
// LengthSquared(const Vector *const this); // 3523
// }
// }
// }
// }
}
/* <4c3feb> ../game_shared/bot/nav_area.cpp:3591 */
NOBODY bool IsCrossingLineOfFire(const Vector &start, const Vector &finish, CBaseEntity *ignore, int ignoreTeam)
{
for (int p = 1; p <= gpGlobals->maxClients; ++p)
{
CBasePlayer *player = static_cast<CBasePlayer *>(UTIL_PlayerByIndex(p));
if (!IsEntityValid(player))
continue;
if (player == ignore)
continue;
if (!player->IsAlive())
continue;
if (ignoreTeam && player->m_iTeam == ignoreTeam)
continue;
UTIL_MakeVectors(player->pev->v_angle + player->pev->punchangle);
const float longRange = 5000.0f;
Vector playerTarget = player->pev->origin + longRange * gpGlobals->v_forward;
Vector result;
if (IsIntersecting2D(start, finish, player->pev->origin, playerTarget, &result))
{
float loZ, hiZ;
if (start.z < finish.z)
{
loZ = start.z;
hiZ = finish.z;
}
else
{
loZ = finish.z;
hiZ = start.z;
}
if (result.z >= loZ && result.z <= hiZ + HumanHeight)
return true;
}
}
return false;
}
/* <4d031a> ../game_shared/bot/nav_area.cpp:3544 */
NOBODY const Vector *FindRandomHidingSpot(CBaseEntity *me, Place place, bool isSniper)
{
// {
// class CollectHidingSpotsFunctor collector; // 3574
// int which; // 3581
// {
// class CollectHidingSpotsFunctor collector; // 3549
// CollectHidingSpotsFunctor(CollectHidingSpotsFunctor *const this,
// class CBaseEntity *me,
// const Vector *origin,
// float range,
// unsigned char flags,
// Place place,
// bool useCrouchAreas); // 3549
// {
// class CollectHidingSpotsFunctor collector; // 3560
// CollectHidingSpotsFunctor(CollectHidingSpotsFunctor *const this,
// class CBaseEntity *me,
// const Vector *origin,
// float range,
// unsigned char flags,
// Place place,
// bool useCrouchAreas); // 3560
// {
// int which; // 3565
// }
// }
// {
// int which; // 3554
// }
// }
// CollectHidingSpotsFunctor(CollectHidingSpotsFunctor *const this,
// class CBaseEntity *me,
// const Vector *origin,
// float range,
// unsigned char flags,
// Place place,
// bool useCrouchAreas); // 3574
// }
}
const Vector *FindNearbyRetreatSpot(CBaseEntity *me, const Vector *start, CNavArea *startArea, float maxRange, int avoidTeam, bool useCrouchAreas)
{
if (startArea == NULL)
return NULL;
CollectHidingSpotsFunctor collector(me, start, maxRange, HidingSpot::IN_COVER, UNDEFINED_PLACE, useCrouchAreas);
SearchSurroundingAreas(startArea, start, collector, maxRange);
if (collector.m_count == 0)
return NULL;
for (int i = 0; i < collector.m_count; ++i)
{
if (IsCrossingLineOfFire(*start, *collector.m_hidingSpot[i], me))
{
collector.RemoveSpot(i);
--i;
continue;
}
if (avoidTeam)
{
float range;
if (UTIL_GetClosestPlayer(collector.m_hidingSpot[i], avoidTeam, &range))
{
const float dangerRange = 150.0f;
if (range < dangerRange)
{
collector.RemoveSpot(i);
--i;
continue;
}
}
}
}
if (collector.m_count <= 0)
return NULL;
int which = RANDOM_LONG(0, collector.m_count - 1);
return collector.m_hidingSpot[which];
}
/* <4ce934> ../game_shared/bot/nav_area.cpp:3707 */
NOBODY int CNavArea::GetPlayerCount(int teamID, CBasePlayer *ignore) const
{
// {
// int count; // 3709
// {
// int i; // 3711
// {
// class CBasePlayer *player; // 3713
// IsEntityValid(CBaseEntity *entity); // 3718
// }
// }
// }
}
/* <4cea33> ../game_shared/bot/nav_area.cpp:3749 */
CNavArea *GetMarkedArea(void)
{
return markedArea;
}
/* <4c2a8c> ../game_shared/bot/nav_area.cpp:3757 */
void EditNavAreasReset(void)
{
markedArea = NULL;
lastSelectedArea = NULL;
isCreatingNavArea = false;
isPlacePainting = false;
editTimestamp = 0.0f;
lastDrawTimestamp = 0.0f;
}
/* <4cea61> ../game_shared/bot/nav_area.cpp:3767 */
NOBODY void DrawHidingSpots(const class CNavArea *area)
{
// {
// const HidingSpotList *list; // 3769
// {
// const_iterator iter; // 3770
// {
// const class HidingSpot *spot; // 3772
// int r; // 3774
// int g; // 3774
// int b; // 3774
// HasGoodCover(const class HidingSpot *const this); // 3784
// operator+(const Vector *const this,
// const Vector &v); // 3793
// Vector(Vector *const this,
// const Vector &v); // 3793
// IsIdealSniperSpot(const class HidingSpot *const this); // 3776
// }
// end(const class list<HidingSpot*, std::allocator<HidingSpot*>> *const this); // 3770
// operator++(_List_const_iterator<HidingSpot*> *const this); // 3770
// }
// }
}
/* <4cebe7> ../game_shared/bot/nav_area.cpp:3802 */
NOBODY void CNavArea::DrawConnectedAreas(void)
{
// {
// class CBasePlayer *player; // 3804
// class CCSBotManager *ctrl; // 3808
// float const maxRange; // 3809
// int dirSet; // 3829
// int i; // 3830
// {
// int swapCount; // 3835
// {
// int swapI; // 3837
// int nextI; // 3838
// int tmp; // 3842
// }
// }
// {
// enum NavDirType dir; // 3850
// int count; // 3852
// GetAdjacentCount(const class CNavArea *const this,
// enum NavDirType dir); // 3852
// {
// int a; // 3854
// {
// class CNavArea *adj; // 3856
// GetAdjacentArea(const class CNavArea *const this,
// enum NavDirType dir,
// int i); // 3856
// {
// Vector from; // 3892
// Vector to; // 3892
// Vector hookPos; // 3893
// float halfWidth; // 3894
// float size; // 3895
// Vector drawTo; // 3921
// IsDegenerate(const class CNavArea *const this); // 3869
// {
// class IntervalTimer blink; // 3871
// bool blinkOn; // 3872
// GetElapsedTime(const class IntervalTimer *const this); // 3874
// Reset(IntervalTimer *const this); // 3876
// IntervalTimer(IntervalTimer *const this); // 3871
// }
// operator+(const Vector *const this,
// const Vector &v); // 3913
// operator+(const Vector *const this,
// const Vector &v); // 3914
// OppositeDirection(NavDirType dir); // 3924
// IsConnected(const class CNavArea *const this,
// const class CNavArea *area,
// enum NavDirType dir); // 3924
// Vector(Vector *const this,
// const Vector &v); // 3925
// Vector(Vector *const this,
// const Vector &v); // 3925
// Vector(Vector *const this,
// const Vector &v); // 3927
// Vector(Vector *const this,
// const Vector &v); // 3927
// operator+(const Vector *const this,
// const Vector &v); // 3909
// operator+(const Vector *const this,
// const Vector &v); // 3910
// operator+(const Vector *const this,
// const Vector &v); // 3905
// operator+(const Vector *const this,
// const Vector &v); // 3906
// operator+(const Vector *const this,
// const Vector &v); // 3901
// operator+(const Vector *const this,
// const Vector &v); // 3902
// }
// }
// }
// }
// }
}
/* <4cf2ee> ../game_shared/bot/nav_area.cpp:3937 */
NOBODY void CNavArea::RaiseCorner(NavCornerType corner, int amount)
{
}
/* <4c3570> ../game_shared/bot/nav_area.cpp:3976 */
class PlaceFloodFillFunctor
{
public:
PlaceFloodFillFunctor(CNavArea *area)
{
m_initialPlace = area->GetPlace();
}
bool operator()(CNavArea *area)
{
CCSBotManager *ctrl = static_cast<CCSBotManager *>(TheBots);
if (area->GetPlace() != m_initialPlace)
return false;
area->SetPlace(ctrl->GetNavPlace());
return true;
}
private:
unsigned int m_initialPlace;
};/* size: 4, cachelines: 1, members: 1 */
/* <4d76ef> ../game_shared/bot/nav_area.cpp:4002 */
NOBODY void EditNavAreas(NavEditCmdType cmd)
{
// {
// class CCSBotManager *ctrl; // 4004
// class CBasePlayer *player; // 4006
// float drawTimestamp; // 4011
// float const maxDrawRate; // 4012
// bool doDraw; // 4014
// float const maxRange; // 4026
// int beamTime; // 4028
// Vector dir; // 4098
// Vector from; // 4101
// Vector to; // 4102
// TraceResult result; // 4104
// {
// iterator iter; // 4033
// {
// class CNavLadder *ladder; // 4035
// float dx; // 4037
// float dy; // 4038
// Vector bottom; // 4045
// Vector top; // 4046
// Vector(Vector *const this,
// const Vector &v); // 4043
// Vector(Vector *const this,
// const Vector &v); // 4043
// AddDirectionVector(Vector *v,
// enum NavDirType dir,
// float amount); // 4048
// Vector(Vector *const this,
// const Vector &v); // 4046
// Vector(Vector *const this,
// const Vector &v); // 4045
// AddDirectionVector(Vector *v,
// enum NavDirType dir,
// float amount); // 4049
// Vector(Vector *const this,
// const Vector &v); // 4051
// Vector(Vector *const this,
// const Vector &v); // 4051
// operator+(const Vector *const this,
// const Vector &v); // 4054
// Vector(Vector *const this,
// const Vector &v); // 4054
// Vector(Vector *const this,
// const Vector &v); // 4057
// Vector(Vector *const this,
// const Vector &v); // 4057
// Vector(Vector *const this,
// const Vector &v); // 4060
// Vector(Vector *const this,
// const Vector &v); // 4060
// Vector(Vector *const this,
// const Vector &v); // 4063
// Vector(Vector *const this,
// const Vector &v); // 4063
// Vector(Vector *const this,
// const Vector &v); // 4066
// Vector(Vector *const this,
// const Vector &v); // 4066
// }
// operator++(_List_iterator<CNavLadder*> *const this); // 4033
// }
// {
// Vector ap; // 4072
// float halfWidth; // 4073
// {
// int i; // 4074
// {
// const class ApproachInfo *info; // 4076
// operator+(const Vector *const this,
// const Vector &v); // 4090
// operator+(const Vector *const this,
// const Vector &v); // 4090
// operator+(const Vector *const this,
// const Vector &v); // 4091
// operator+(const Vector *const this,
// const Vector &v); // 4091
// operator+(const Vector *const this,
// const Vector &v); // 4092
// operator+(const Vector *const this,
// const Vector &v); // 4092
// operator+(const Vector *const this,
// const Vector &v); // 4093
// operator+(const Vector *const this,
// const Vector &v); // 4093
// }
// GetApproachInfoCount(const class CNavArea *const this); // 4074
// }
// }
// UTIL_MakeVectorsPrivate(Vector &vecAngles,
// float *p_vForward,
// float *p_vRight,
// float *p_vUp); // 4099
// operator+(const Vector *const this,
// const Vector &v); // 4101
// operator*(float fl,
// const Vector &v); // 4102
// operator+(const Vector *const this,
// const Vector &v); // 4102
// {
// Vector cursor; // 4110
// float cursorSize; // 4111
// class CNavArea *area; // 4147
// Vector(Vector *const this,
// const Vector &v); // 4110
// {
// float z; // 4131
// Vector(Vector *const this,
// float X,
// float Y,
// float Z); // 4132
// Vector(Vector *const this,
// float X,
// float Y,
// float Z); // 4132
// Vector(Vector *const this,
// float X,
// float Y,
// float Z); // 4133
// Vector(Vector *const this,
// float X,
// float Y,
// float Z); // 4133
// Vector(Vector *const this,
// float X,
// float Y,
// float Z); // 4134
// Vector(Vector *const this,
// float X,
// float Y,
// float Z); // 4134
// Vector(Vector *const this,
// float X,
// float Y,
// float Z); // 4135
// Vector(Vector *const this,
// float X,
// float Y,
// float Z); // 4135
// }
// {
// char buffer; // 4156
// char attrib; // 4157
// char locName; // 4158
// {
// const char *name; // 4162
// }
// SetPlace(CNavArea *const this,
// Place place); // 4195
// }
// {
// const class Extent *extent; // 4260
// float yaw; // 4262
// float splitEdge; // 4269
// bool splitAlongX; // 4270
// {
// int corner; // 4506
// }
// {
// class CBasePlayer *pLocalPlayer; // 4440
// {
// Vector origin; // 4443
// operator+(const Vector *const this,
// const Vector &v); // 4443
// }
// }
// {
// iterator iter; // 4397
// operator++(_List_iterator<CNavArea*> *const this); // 4397
// {
// class CNavArea *area;// 4399
// }
// }
// {
// int connected; // 4414
// int totalUnnamedAreas; // 4420
// char buffer; // 4430
// GetAdjacentCount(const class CNavArea *const this,
// enum NavDirType dir); // 4415
// GetAdjacentCount(const class CNavArea *const this,
// enum NavDirType dir); // 4416
// GetAdjacentCount(const class CNavArea *const this,
// enum NavDirType dir); // 4417
// GetAdjacentCount(const class CNavArea *const this,
// enum NavDirType dir); // 4418
// {
// iterator iter; // 4421
// {
// class CNavArea *area; // 4423
// }
// operator++(_List_iterator<CNavArea*> *const this); // 4421
// }
// }
// {
// enum NavDirType dir; // 4456
// }
// {
// int connected; // 4376
// char buffer; // 4382
// GetAdjacentCount(const class CNavArea *const this,
// enum NavDirType dir); // 4377
// GetAdjacentCount(const class CNavArea *const this,
// enum NavDirType dir); // 4378
// GetAdjacentCount(const class CNavArea *const this,
// enum NavDirType dir); // 4379
// GetAdjacentCount(const class CNavArea *const this,
// enum NavDirType dir); // 4380
// }
// Vector(Vector *const this,
// const Vector &v); // 4302
// Vector(Vector *const this,
// const Vector &v); // 4302
// }
// {
// class PlaceFloodFillFunctor pff; // 4237
// SetNavPlace(CCSBotManager *const this,
// unsigned int place); // 4233
// PlaceFloodFillFunctor(PlaceFloodFillFunctor *const this,
// class CNavArea *area); // 4237
// SetPlace(CNavArea *const this,
// Place place); // 4226
// }
// {
// class CNavArea *newArea; // 4567
// push_back(list<CNavArea*, std::allocator<CNavArea*>> *const this,
// const value_type &__x); // 4568
// {
// const class Extent *extent; // 4575
// }
// }
// Vector(Vector *const this,
// const Vector &v); // 4115
// operator+(const Vector *const this,
// const Vector &v); // 4115
// operator+(const Vector *const this,
// const Vector &v); // 4116
// operator+(const Vector *const this,
// const Vector &v); // 4116
// operator+(const Vector *const this,
// const Vector &v); // 4117
// operator+(const Vector *const this,
// const Vector &v); // 4117
// }
// }
}
/* <4c3b30> ../game_shared/bot/nav_area.cpp:4635 */
bool GetGroundHeight(const Vector *pos, float *height, Vector *normal)
{
Vector to;
to.x = pos->x;
to.y = pos->y;
to.z = pos->z - 9999.9f;
float offset;
Vector from;
TraceResult result;
edict_t *ignore = NULL;
//float ground = 0.0f; // unused?
const float maxOffset = 100.0f;
const float inc = 10.0f;
#define MAX_GROUND_LAYERS 16
struct GroundLayerInfo
{
float ground;
Vector normal;
} layer[MAX_GROUND_LAYERS];
int layerCount = 0;
for (offset = 1.0f; offset < maxOffset; offset += inc)
{
from = *pos + Vector(0, 0, offset);
UTIL_TraceLine(from, to, ignore_monsters, dont_ignore_glass, ignore, &result);
if (result.pHit)
{
if (FClassnameIs(VARS(result.pHit), "func_door") || FClassnameIs(VARS(result.pHit), "func_door_rotating") || (FClassnameIs(VARS(result.pHit), "func_breakable") && VARS(result.pHit)->takedamage == DAMAGE_YES))
{
ignore = result.pHit;
continue;
}
}
if (!result.fStartSolid)
{
if (layerCount == 0 || result.vecEndPos.z > layer[layerCount - 1].ground)
{
layer[layerCount].ground = result.vecEndPos.z;
layer[layerCount].normal = result.vecPlaneNormal;
++layerCount;
if (layerCount == MAX_GROUND_LAYERS)
break;
}
}
}
if (layerCount == 0)
return false;
int i;
for (i = 0; i < layerCount - 1; ++i)
{
if (layer[i + 1].ground - layer[i].ground >= HalfHumanHeight)
break;
}
*height = layer[i].ground;
if (normal)
*normal = layer[i].normal;
return true;
}
/* <4cf4d2> ../game_shared/bot/nav_area.cpp:4724 */
NOBODY bool GetSimpleGroundHeight(const Vector *pos, float *height, Vector *normal)
{
// {
// Vector to; // 4726
// TraceResult result; // 4731
// }
}
/* <4c0912> ../game_shared/bot/nav_area.cpp:4757 */
class ApproachAreaCost
{
public:
float operator()(CNavArea *area, CNavArea *fromArea, const CNavLadder *ladder)
{
for (int i = 0; i < BlockedIDCount; ++i)
{
if (area->GetID() == BlockedID[i])
return -1.0f;
}
if (fromArea == NULL)
return 0.0f;
else
{
float dist;
if (ladder)
dist = ladder->m_length;
else
dist = (*area->GetCenter() - *fromArea->GetCenter()).Length();
float cost = dist + fromArea->GetCostSoFar();
return cost;
}
}
};
/* <4c4182> ../game_shared/bot/nav_area.cpp:4791 */
NOBODY inline bool IsAreaVisible(const Vector *pos, const CNavArea *area)
{
// {
// Vector corner; // 4793
// TraceResult result; // 4794
// {
// int c; // 4796
// }
// }
}
/* <4cf54c> ../game_shared/bot/nav_area.cpp:4817 */
NOBODY void CNavArea::ComputeApproachAreas(void)
{
// {
// Vector eye; // 4825
// class CNavArea *path; // 4836
// iterator iter; // 4843
// Vector(Vector *const this,
// const Vector &v); // 4825
// {
// class CNavArea *farArea; // 4846
// class ApproachAreaCost cost; // 4855
// IsAreaVisible(const Vector *pos,
// const class CNavArea *area); // 4851
// {
// int count; // 4867
// class CNavArea *area; // 4868
// int i; // 4876
// class ApproachAreaCost cost; // 4928
// {
// int block; // 4897
// int a; // 4905
// IsAreaVisible(const Vector *pos,
// const class CNavArea *area); // 4884
// }
// }
// }
// operator++(_List_iterator<CNavArea*> *const this); // 4844
// }
}
/* <4cf961> ../game_shared/bot/nav_area.cpp:4947 */
NOBODY CNavAreaGrid::CNavAreaGrid(void) : m_cellSize(300.0f)
{
m_grid = NULL;
Reset();
}
/* <4c4a70> ../game_shared/bot/nav_area.cpp:4953 */
NOBODY CNavAreaGrid::~CNavAreaGrid(void)
{
// ~list(list<CNavArea*, std::allocator<CNavArea*>>::~CNavAreaGrid(// int const __in_chrg); // 4955
}
/* <4cf837> ../game_shared/bot/nav_area.cpp:4962 */
void CNavAreaGrid::Reset(void)
{
if (m_grid)
{
// TODO: FIX ME
//delete[] m_grid;
}
m_grid = NULL;
m_gridSizeX = 0;
m_gridSizeY = 0;
// clear the hash table
for(int i = 0; i < HASH_TABLE_SIZE; i++)
m_hashTable[i] = NULL;
m_areaCount = 0;
// reset static vars
EditNavAreasReset();
}
/* <4cf984> ../game_shared/bot/nav_area.cpp:4983 */
NOBODY void CNavAreaGrid::Initialize(float minX, float maxX, float minY, float maxY)
{
// list(list<CNavArea*, std::allocator<CNavArea*>> *const this); // 4994
}
/* <4cfa20> ../game_shared/bot/nav_area.cpp:5000 */
NOBODY void CNavAreaGrid::AddNavArea(CNavArea *area)
{
// {
// const class Extent *extent; // 5003
// int loX; // 5005
// int loY; // 5006
// int hiX; // 5007
// int hiY; // 5008
// int key; // 5015
// WorldToGridX(const class CNavAreaGrid *const this,
// float wx); // 5005
// WorldToGridY(const class CNavAreaGrid *const this,
// float wy); // 5006
// WorldToGridX(const class CNavAreaGrid *const this,
// float wx); // 5007
// WorldToGridY(const class CNavAreaGrid *const this,
// float wy); // 5008
// {
// int y; // 5010
// {
// int x; // 5011
// push_back(list<CNavArea*, std::allocator<CNavArea*>> *const this,
// const value_type &__x); // 5012
// }
// }
// ComputeHashKey(const class CNavAreaGrid *const this,
// unsigned int id); // 5015
// }
}
/* <4cfc86> ../game_shared/bot/nav_area.cpp:5039 */
NOBODY void CNavAreaGrid::RemoveNavArea(CNavArea *area)
{
// add to grid
const Extent *extent = area->GetExtent();
int loX = WorldToGridX(extent->lo.x);
int loY = WorldToGridY(extent->lo.y);
int hiX = WorldToGridX(extent->hi.x);
int hiY = WorldToGridY(extent->hi.y);
for (int y = loY; y <= hiY; ++y)
{
for (int x = loX; x <= hiX; ++x)
{
m_grid[x + y * m_gridSizeX].remove(area);
}
}
// remove from hash table
int key = ComputeHashKey(area->GetID());
if (area->m_prevHash)
{
area->m_prevHash->m_nextHash = area->m_nextHash;
}
else
{
// area was at start of list
m_hashTable[key] = area->m_nextHash;
if (m_hashTable[key])
m_hashTable[key]->m_prevHash = NULL;
}
if (area->m_nextHash)
{
area->m_nextHash->m_prevHash = area->m_prevHash;
}
--m_areaCount;
}
CNavArea *(*pGetNavArea)(const Vector *pos, float beneathLimit);
/* <4cff5e> ../game_shared/bot/nav_area.cpp:5080 */
CNavArea __declspec(naked) *CNavAreaGrid::GetNavArea(const Vector *pos, float beneathLimit) const
{
__asm
{
jmp pGetNavArea
}
UNTESTED
//TODO: Crash NavAreaList::iterator iter = list->begin()
/*
if (m_grid == NULL)
return NULL;
int x = WorldToGridX(pos->x);
int y = WorldToGridY(pos->y);
NavAreaList *list = &m_grid[x + y * m_gridSizeX];
CNavArea *use = NULL;
float useZ = -100000000.0f;
Vector testPos = *pos + Vector(0, 0, 5);
if (list == NULL)
return NULL;
for (NavAreaList::iterator iter = list->begin(); iter != list->end(); ++iter)
{
CNavArea *area = *iter;
if (area->IsOverlapping(&testPos))
{
float z = area->GetZ(&testPos);
if (z > testPos.z)
continue;
if (z < pos->z - beneathLimit)
continue;
if (z > useZ)
{
use = area;
useZ = z;
}
}
}
return use;
*/
}
CNavArea *(*pGetNearestNavArea)(const Vector *pos, bool anyZ);
/* <4d33b4> ../game_shared/bot/nav_area.cpp:5133 */
NOBODY __declspec(naked) CNavArea *CNavAreaGrid::GetNearestNavArea(const Vector *pos, bool anyZ) const
{
__asm
{
jmp pGetNearestNavArea
}
//TODO: UNTESTED
// Result: Crashed TheNavAreaList.begin()
/* if (m_grid == NULL)
return NULL;
CNavArea *close = NULL;
float closeDistSq = 100000000.0f;
close = GetNavArea(pos);
if (close)
return close;
Vector source;
source.x = pos->x;
source.y = pos->y;
if (GetGroundHeight(pos, &source.z) == false)
return NULL;
source.z += HalfHumanHeight;
for (NavAreaList::iterator iter = TheNavAreaList.begin(); iter != TheNavAreaList.end(); ++iter)
{
CNavArea *area = *iter;
Vector areaPos;
area->GetClosestPointOnArea(&source, &areaPos);
float distSq = (areaPos - source).LengthSquared();
if (distSq < closeDistSq)
{
if (!anyZ)
{
TraceResult result;
UTIL_TraceLine( source, areaPos + Vector( 0, 0, HalfHumanHeight ), ignore_monsters, ignore_glass, NULL, &result );
if (result.flFraction != 1.0f)
continue;
}
closeDistSq = distSq;
close = area;
}
}
return close;
*/
}
/* <4d4778> ../game_shared/bot/nav_area.cpp:5191 */
NOBODY CNavArea *CNavAreaGrid::GetNavAreaByID(unsigned int id) const
{
// {
// int key; // 5196
// {
// class CNavArea *area; // 5198
// }
// ComputeHashKey(const class CNavAreaGrid *const this,
// unsigned int id); // 5196
// }
}
/* <4d4802> ../game_shared/bot/nav_area.cpp:5209 */
Place CNavAreaGrid::GetPlace(const Vector *pos) const
{
CNavArea *area = GetNearestNavArea(pos, true);
if (area)
return area->GetPlace();
return UNDEFINED_PLACE;
}