CNavMesh::Load
0x0071c9e0 · 4465 bytes · __thiscall
_ZN8CNavMesh4LoadEv
Decompiled
undefined (1 param)
/* WARNING: Globals starting with '_' overlap smaller symbols at the same address */
/* CNavMesh::Load() */
int __thiscall CNavMesh::Load(CNavMesh *this)
{
ushort uVar1;
ushort uVar2;
int *piVar3;
char cVar4;
void *pvVar5;
undefined4 uVar6;
uint *puVar7;
int *piVar8;
uint uVar9;
ushort *puVar10;
CNavArea **ppCVar11;
undefined4 *puVar12;
int iVar13;
int iVar14;
char *pcVar15;
CNavArea *pCVar16;
int in_GS_OFFSET;
CNavMesh CVar17;
undefined4 local_1d8;
int local_1d4;
uint local_1d0;
float local_1cc;
float local_1c8;
float local_1c4;
CNavArea *local_1c0;
bool local_1b3;
char local_1b2;
char local_1b1;
ushort local_1b0;
ushort local_1ae;
undefined2 local_1ac;
undefined2 local_1aa;
int local_1a8;
int local_1a4;
uint local_1a0;
undefined4 local_19c;
int local_198;
int local_194;
CNavArea *local_190;
undefined4 local_18c;
undefined4 local_188;
undefined4 local_184;
undefined4 local_180;
uint local_17c;
undefined4 local_178;
undefined4 local_174;
float local_170;
float local_16c;
float local_164;
float local_160;
int local_158 [3];
int local_14c;
char local_144;
byte local_143;
int local_138;
byte local_124;
char acStack_121 [257];
int local_20;
piVar3 = mdlcache;
local_20 = *(int *)(in_GS_OFFSET + 0x14);
(**(code **)(*mdlcache + 0x68))(mdlcache);
/* try { // try from 0071ca14 to 0071ca7e has its CatchHandler @ 0071dba2 */
(**(code **)(*(int *)this + 0x20))(this);
DAT_00fe6b50 = 0;
DAT_00fe6b58 = 0;
CNavVectorNoEditAllocator::Reset();
CNavArea::m_nextID = 1;
pvVar5 = (void *)GetCachedOrLoadNavData(this,&local_1a8,&local_1b3);
if (pvVar5 == (void *)0x0) {
iVar13 = 1;
free(*(void **)(this + 0x5d8));
*(undefined4 *)(this + 0x5d8) = 0;
goto LAB_0071cb1c;
}
CUtlBuffer::CUtlBuffer((CUtlBuffer *)local_158,pvVar5,local_1a8,8);
/* try { // try from 0071ca94 to 0071caf6 has its CatchHandler @ 0071db82 */
CUtlBuffer::SeekPut((CUtlBuffer *)local_158,0,local_1a8);
if ((local_143 & 1) == 0) {
cVar4 = CUtlBuffer::CheckGet((CUtlBuffer *)local_158,4);
if (cVar4 != '\0') {
if ((local_124 & 1) == 0) {
iVar13 = *(int *)(local_158[0] + (local_14c - local_138));
}
else {
piVar8 = (int *)((local_14c - local_138) + local_158[0]);
if (piVar8 == (int *)0x0) {
piVar8 = &local_1a4;
}
local_18c = local_1a4;
local_18c = CONCAT31((int3)((uint)local_1a4 >> 8),*(undefined1 *)((int)piVar8 + 3));
local_18c._2_2_ = (undefined2)((uint)local_1a4 >> 0x10);
local_18c._0_2_ =
CONCAT11(*(undefined1 *)((int)piVar8 + 2),*(undefined1 *)((int)piVar8 + 3));
local_18c._3_1_ = (undefined1)((uint)local_1a4 >> 0x18);
local_18c._0_3_ = CONCAT12(*(undefined1 *)((int)piVar8 + 1),(undefined2)local_18c);
local_18c = CONCAT13((char)*piVar8,(undefined3)local_18c);
_V_memcpy(&local_1a4,&local_18c,4);
iVar13 = local_1a4;
}
local_14c = local_14c + 4;
goto LAB_0071cad0;
}
LAB_0071cad9:
uVar6 = CUtlString::Get((CUtlString *)(this + 0x5dc));
Msg("Invalid navigation file \'%s\'.\n",uVar6);
LAB_0071caf7:
iVar13 = 2;
free(*(void **)(this + 0x5d8));
*(undefined4 *)(this + 0x5d8) = 0;
}
else {
local_1a4 = 0;
CUtlBuffer::Scanf((CUtlBuffer *)local_158,"%u",&local_1a4);
iVar13 = local_1a4;
LAB_0071cad0:
if ((local_144 != '\0') || (iVar13 != -0x1120532)) goto LAB_0071cad9;
if ((local_143 & 1) == 0) {
cVar4 = CUtlBuffer::CheckGet((CUtlBuffer *)local_158,4);
if (cVar4 != '\0') {
if ((local_124 & 1) == 0) {
local_1d0 = *(uint *)(local_158[0] + (local_14c - local_138));
}
else {
puVar7 = (uint *)((local_14c - local_138) + local_158[0]);
if (puVar7 == (uint *)0x0) {
puVar7 = &local_1a0;
}
local_188 = local_1a0;
local_188 = CONCAT31((int3)(local_1a0 >> 8),*(undefined1 *)((int)puVar7 + 3));
local_188._2_2_ = (undefined2)(local_1a0 >> 0x10);
local_188._0_2_ =
CONCAT11(*(undefined1 *)((int)puVar7 + 2),*(undefined1 *)((int)puVar7 + 3));
local_188._3_1_ = (undefined1)(local_1a0 >> 0x18);
local_188._0_3_ = CONCAT12(*(undefined1 *)((int)puVar7 + 1),(undefined2)local_188);
local_188 = CONCAT13((char)*puVar7,(undefined3)local_188);
_V_memcpy(&local_1a0,&local_188,4);
local_1d0 = local_1a0;
}
local_14c = local_14c + 4;
goto LAB_0071cb94;
}
if (local_144 != '\0') goto LAB_0071ce30;
local_1d0 = 0;
LAB_0071cbc8:
this[0x4e] = (CNavMesh)0x0;
local_1d8 = 0;
LAB_0071cbd6:
(**(code **)(*(int *)this + 0x44))(this,(CUtlBuffer *)local_158,local_1d8);
if ((local_143 & 1) == 0) {
cVar4 = CUtlBuffer::CheckGet((CUtlBuffer *)local_158,4);
if (cVar4 == '\0') goto LAB_0071caf7;
if ((local_124 & 1) == 0) {
local_1d4 = *(int *)(local_158[0] + (local_14c - local_138));
}
else {
piVar8 = (int *)((local_14c - local_138) + local_158[0]);
if (piVar8 == (int *)0x0) {
piVar8 = &local_194;
}
local_178 = local_194;
local_178 = CONCAT31((int3)((uint)local_194 >> 8),*(undefined1 *)((int)piVar8 + 3));
local_178._2_2_ = (undefined2)((uint)local_194 >> 0x10);
local_178._0_2_ =
CONCAT11(*(undefined1 *)((int)piVar8 + 2),*(undefined1 *)((int)piVar8 + 3));
local_178._3_1_ = (undefined1)((uint)local_194 >> 0x18);
local_178._0_3_ = CONCAT12(*(undefined1 *)((int)piVar8 + 1),(undefined2)local_178);
local_178 = CONCAT13((char)*piVar8,(undefined3)local_178);
_V_memcpy(&local_194,&local_178,4);
local_1d4 = local_194;
}
local_14c = local_14c + 4;
}
else {
local_194 = 0;
CUtlBuffer::Scanf((CUtlBuffer *)local_158,"%u",&local_194);
local_1d4 = local_194;
}
if (local_1d4 != 0) {
if ((DAT_00fe5ff8 < local_1d4) && (-1 < DAT_00fe5ffc)) {
DAT_00fe5ff8 = local_1d4;
if (TheNavAreas == (void *)0x0) {
TheNavAreas = malloc(local_1d4 << 2);
}
else {
TheNavAreas = realloc(TheNavAreas,local_1d4 * 4);
}
}
_DAT_00fe6004 = TheNavAreas;
(**(code **)(*(int *)TheNavMesh + 0x10))(TheNavMesh,local_1d4);
iVar14 = 0;
local_1cc = 1e+10;
local_1c4 = 1e+10;
local_1c0 = (CNavArea *)0xd01502f9;
local_1c8 = -1e+10;
do {
local_174 = (CNavLadder *)(**(code **)(*(int *)TheNavMesh + 0x14))(TheNavMesh);
iVar13 = (**(code **)(*(int *)local_174 + 0x34))
(local_174,(CUtlBuffer *)local_158,local_1d0,local_1d8);
if (iVar13 != 0) goto LAB_0071cb14;
uVar6 = CUtlVector<CNavArea*,CUtlMemory<CNavArea*,int>>::InsertBefore
((CUtlVector<CNavArea*,CUtlMemory<CNavArea*,int>> *)&TheNavAreas,
DAT_00fe6000,(CNavArea **)&local_174);
*(undefined4 *)(local_174 + 0x90) = uVar6;
CNavArea::GetExtent((CNavArea *)local_174,(Extent *)&local_170);
iVar14 = iVar14 + 1;
if (local_170 <= local_1cc) {
local_1cc = local_170;
}
if (local_16c <= local_1c4) {
local_1c4 = local_16c;
}
if ((float)local_1c0 <= local_164) {
local_1c0 = (CNavArea *)local_164;
}
if (local_1c8 <= local_160) {
local_1c8 = local_160;
}
} while (iVar14 != local_1d4);
AllocateGrid(this,local_1cc,(float)local_1c0,local_1c4,local_1c8);
iVar13 = 0;
if (0 < DAT_00fe6000) {
do {
AddNavArea(this,*(CNavArea **)((int)TheNavAreas + iVar13 * 4));
iVar13 = iVar13 + 1;
} while (iVar13 < DAT_00fe6000);
}
if (local_1d0 < 6) {
BuildLadders(this);
}
else {
if ((local_143 & 1) == 0) {
cVar4 = CUtlBuffer::CheckGet((CUtlBuffer *)local_158,4);
if (cVar4 == '\0') {
local_1c0 = (CNavArea *)0x0;
}
else {
if ((local_124 & 1) == 0) {
local_1c0 = *(CNavArea **)(local_158[0] + (local_14c - local_138));
}
else {
ppCVar11 = (CNavArea **)((local_14c - local_138) + local_158[0]);
if (ppCVar11 == (CNavArea **)0x0) {
ppCVar11 = &local_190;
}
local_174 = (CNavLadder *)local_190;
local_174 = (CNavLadder *)
CONCAT31((int3)((uint)local_190 >> 8),*(undefined1 *)((int)ppCVar11 + 3)
);
local_174._2_2_ = (undefined2)((uint)local_190 >> 0x10);
local_174._0_2_ =
CONCAT11(*(undefined1 *)((int)ppCVar11 + 2),*(undefined1 *)((int)ppCVar11 + 3))
;
local_174._3_1_ = (undefined1)((uint)local_190 >> 0x18);
local_174._0_3_ = CONCAT12(*(undefined1 *)((int)ppCVar11 + 1),(undefined2)local_174)
;
local_174 = (CNavLadder *)CONCAT13(*(undefined1 *)ppCVar11,(undefined3)local_174);
_V_memcpy(&local_190,&local_174,4);
local_1c0 = local_190;
}
local_14c = local_14c + 4;
}
}
else {
local_190 = (CNavArea *)0x0;
CUtlBuffer::Scanf((CUtlBuffer *)local_158,"%u",&local_190);
local_1c0 = local_190;
}
if ((*(int *)(this + 0x514) < (int)local_1c0) && (-1 < *(int *)(this + 0x518))) {
*(CNavArea **)(this + 0x514) = local_1c0;
if (*(void **)(this + 0x510) == (void *)0x0) {
pvVar5 = malloc((int)local_1c0 << 2);
*(void **)(this + 0x510) = pvVar5;
}
else {
pvVar5 = realloc(*(void **)(this + 0x510),(int)local_1c0 * 4);
*(void **)(this + 0x510) = pvVar5;
}
}
else {
pvVar5 = *(void **)(this + 0x510);
}
*(void **)(this + 0x520) = pvVar5;
pCVar16 = (CNavArea *)0x0;
if (local_1c0 != (CNavArea *)0x0) {
do {
local_174 = ::operator_new(0x54);
*(undefined ***)local_174 = &PTR_GetScriptDesc_00ca56d8;
iVar13 = CNavLadder::m_nextID;
*(undefined4 *)(local_174 + 0x38) = 0xffffffff;
*(undefined4 *)(local_174 + 0x24) = 0;
*(undefined4 *)(local_174 + 0x2c) = 0;
*(undefined4 *)(local_174 + 0x28) = 0;
CNavLadder::m_nextID = CNavLadder::m_nextID + 1;
*(undefined4 *)(local_174 + 0x30) = 0;
*(undefined4 *)(local_174 + 0x34) = 0;
*(int *)(local_174 + 0x4c) = iVar13;
*(undefined4 *)(local_174 + 0x50) = 0;
CNavLadder::Load(local_174,(CUtlBuffer *)local_158,local_1d0);
CUtlVector<CNavLadder*,CUtlMemory<CNavLadder*,int>>::InsertBefore
((CUtlVector<CNavLadder*,CUtlMemory<CNavLadder*,int>> *)(this + 0x510),
*(int *)(this + 0x51c),(CNavLadder **)&local_174);
pCVar16 = pCVar16 + 1;
} while (pCVar16 != local_1c0);
}
}
MarkStairAreas();
(**(code **)(*(int *)this + 0x3c))(this,(CUtlBuffer *)local_158,local_1d8);
iVar13 = (**(code **)(*(int *)this + 0x2c))(this,local_1d0);
if (TheNavMesh[0x4e] == (CNavMesh)0x0) {
Warning("The nav mesh needs a full nav_analyze\n");
}
goto LAB_0071cb14;
}
goto LAB_0071caf7;
}
local_1a0 = 0;
/* try { // try from 0071cb83 to 0071dad4 has its CatchHandler @ 0071db82 */
CUtlBuffer::Scanf((CUtlBuffer *)local_158,"%u",&local_1a0);
local_1d0 = local_1a0;
LAB_0071cb94:
if ((local_144 == '\0') && (local_1d0 < 0x11)) {
if (local_1d0 < 10) {
if (local_1d0 < 4) goto LAB_0071cbc8;
local_1d8 = 0;
LAB_0071d02c:
if ((local_143 & 1) == 0) {
cVar4 = CUtlBuffer::CheckGet((CUtlBuffer *)local_158,4);
if (cVar4 == '\0') {
iVar13 = 0;
}
else {
if ((local_124 & 1) == 0) {
iVar13 = *(int *)(local_158[0] + (local_14c - local_138));
}
else {
piVar8 = (int *)((local_14c - local_138) + local_158[0]);
if (piVar8 == (int *)0x0) {
piVar8 = &local_198;
}
local_180 = local_198;
local_180 = CONCAT31((int3)((uint)local_198 >> 8),*(undefined1 *)((int)piVar8 + 3));
local_180._2_2_ = (undefined2)((uint)local_198 >> 0x10);
local_180._0_2_ =
CONCAT11(*(undefined1 *)((int)piVar8 + 2),*(undefined1 *)((int)piVar8 + 3));
local_180._3_1_ = (undefined1)((uint)local_198 >> 0x18);
local_180._0_3_ = CONCAT12(*(undefined1 *)((int)piVar8 + 1),(undefined2)local_180);
local_180 = CONCAT13((char)*piVar8,(undefined3)local_180);
_V_memcpy(&local_198,&local_180,4);
iVar13 = local_198;
}
local_14c = local_14c + 4;
}
}
else {
local_198 = 0;
CUtlBuffer::Scanf((CUtlBuffer *)local_158,"%u",&local_198);
iVar13 = local_198;
}
iVar14 = GetBspFilename();
if (iVar14 != 0) {
iVar14 = (**(code **)(*(int *)(filesystem + 4) + 0x1c))(filesystem + 4,iVar14,0);
if (iVar14 == iVar13) {
if (local_1d0 < 0x10) {
LAB_0071d0a4:
pcVar15 =
"The Navigation Mesh was built with an old server dll - reanalyze the mesh!\n";
goto LAB_0071d0a9;
}
LAB_0071d0df:
if ((local_143 & 1) == 0) {
cVar4 = CUtlBuffer::CheckGet((CUtlBuffer *)local_158,1);
CVar17 = (CNavMesh)0x0;
if (cVar4 != '\0') {
CVar17 = (CNavMesh)(*(char *)(local_158[0] + (local_14c - local_138)) != '\0');
local_14c = local_14c + 1;
}
}
else {
local_1b2 = '\0';
CUtlBuffer::Scanf((CUtlBuffer *)local_158,"%u",&local_1b2);
CVar17 = (CNavMesh)(local_1b2 != '\0');
}
this[0x4e] = CVar17;
}
else {
if (local_1d0 < 0x10) goto LAB_0071d0a4;
pcVar15 = "The Navigation Mesh was built using a different version of this map.\n";
LAB_0071d0a9:
cVar4 = (**(code **)(*engine + 8))(engine);
if (cVar4 == '\0') {
DevWarning("%s",pcVar15);
}
else {
DevMsg("%s");
}
this[0x4d] = (CNavMesh)0x1;
if (0xd < local_1d0) goto LAB_0071d0df;
this[0x4e] = (CNavMesh)0x0;
if (local_1d0 < 5) goto LAB_0071cbd6;
}
if ((local_143 & 1) == 0) {
cVar4 = CUtlBuffer::CheckGet((CUtlBuffer *)local_158,2);
if (cVar4 != '\0') {
if ((local_124 & 1) == 0) {
uVar2 = *(ushort *)(local_158[0] + (local_14c - local_138));
}
else {
puVar10 = (ushort *)((local_14c - local_138) + local_158[0]);
if (puVar10 == (ushort *)0x0) {
puVar10 = &local_1b0;
}
local_1ac = local_1b0;
local_1ac = CONCAT11((char)(local_1b0 >> 8),*(undefined1 *)((int)puVar10 + 1));
local_1ac = CONCAT11((char)*puVar10,*(undefined1 *)((int)puVar10 + 1));
_V_memcpy(&local_1b0,&local_1ac,2);
uVar2 = local_1b0;
}
local_14c = local_14c + 2;
goto LAB_0071d151;
}
DAT_00fe6b50 = 0;
}
else {
local_1b0 = 0;
CUtlBuffer::Scanf((CUtlBuffer *)local_158,"%u",&local_1b0);
uVar2 = local_1b0;
LAB_0071d151:
DAT_00fe6b50 = 0;
if (uVar2 != 0) {
local_1c0 = (CNavArea *)0x1;
do {
if ((local_143 & 1) == 0) {
cVar4 = CUtlBuffer::CheckGet((CUtlBuffer *)local_158,2);
if (cVar4 == '\0') goto LAB_0071cbd6;
if ((local_124 & 1) == 0) {
uVar1 = *(ushort *)(local_158[0] + (local_14c - local_138));
}
else {
puVar10 = (ushort *)((local_14c - local_138) + local_158[0]);
if (puVar10 == (ushort *)0x0) {
puVar10 = &local_1ae;
}
local_1aa = local_1ae;
local_1aa = CONCAT11((char)(local_1ae >> 8),*(undefined1 *)((int)puVar10 + 1));
local_1aa = CONCAT11((char)*puVar10,*(undefined1 *)((int)puVar10 + 1));
_V_memcpy(&local_1ae,&local_1aa,2);
uVar1 = local_1ae;
}
local_14c = local_14c + 2;
}
else {
local_1ae = 0;
CUtlBuffer::Scanf((CUtlBuffer *)local_158,"%u",&local_1ae);
uVar1 = local_1ae;
}
uVar9 = 0x100;
if (uVar1 < 0x100) {
if (uVar1 == 0) goto LAB_0071cbd6;
uVar9 = (uint)uVar1;
}
CUtlBuffer::Get((CUtlBuffer *)local_158,acStack_121 + 1,uVar9);
acStack_121[uVar9] = '\0';
uVar9 = NameToPlace(TheNavMesh,acStack_121 + 1);
if (uVar9 == 0) {
Warning("Warning: NavMesh place %s is undefined?\n",acStack_121 + 1);
local_17c = 0;
DAT_00fe6b58 = 1;
}
else {
local_17c = uVar9;
if (DAT_00fe6b50 < 1) {
LAB_0071d238:
CUtlVector<unsigned_int,CUtlMemory<unsigned_int,int>>::InsertBefore
((CUtlVector<unsigned_int,CUtlMemory<unsigned_int,int>> *)
&placeDirectory,DAT_00fe6b50,&local_17c);
}
else if (uVar9 != *placeDirectory) {
iVar13 = 0;
do {
iVar13 = iVar13 + 1;
if (iVar13 == DAT_00fe6b50) goto LAB_0071d238;
} while (uVar9 != placeDirectory[iVar13]);
if (iVar13 < 0) goto LAB_0071d238;
}
}
local_1c0 = (CNavArea *)((int)local_1c0 + 1);
} while (local_1c0 != (CNavArea *)(uVar2 + 1));
}
}
if (0xb < (int)local_1d0) {
if ((local_143 & 1) == 0) {
cVar4 = CUtlBuffer::CheckGet((CUtlBuffer *)local_158,1);
DAT_00fe6b58 = 0;
if (cVar4 != '\0') {
DAT_00fe6b58 = *(char *)(local_158[0] + (local_14c - local_138)) != '\0';
local_14c = local_14c + 1;
}
}
else {
local_1b1 = '\0';
CUtlBuffer::Scanf((CUtlBuffer *)local_158,"%u",&local_1b1);
DAT_00fe6b58 = local_1b1 != '\0';
}
}
goto LAB_0071cbd6;
}
}
else {
if ((local_143 & 1) == 0) {
cVar4 = CUtlBuffer::CheckGet((CUtlBuffer *)local_158,4);
if (cVar4 == '\0') {
local_1d8 = 0;
}
else {
if ((local_124 & 1) == 0) {
local_1d8 = *(undefined4 *)(local_158[0] + (local_14c - local_138));
}
else {
puVar12 = (undefined4 *)((local_14c - local_138) + local_158[0]);
if (puVar12 == (undefined4 *)0x0) {
puVar12 = &local_19c;
}
local_184 = local_19c;
local_184 = CONCAT31((int3)((uint)local_19c >> 8),*(undefined1 *)((int)puVar12 + 3));
local_184._2_2_ = (undefined2)((uint)local_19c >> 0x10);
local_184._0_2_ =
CONCAT11(*(undefined1 *)((int)puVar12 + 2),*(undefined1 *)((int)puVar12 + 3));
local_184._3_1_ = (undefined1)((uint)local_19c >> 0x18);
local_184._0_3_ = CONCAT12(*(undefined1 *)((int)puVar12 + 1),(undefined2)local_184);
local_184 = CONCAT13(*(undefined1 *)puVar12,(undefined3)local_184);
_V_memcpy(&local_19c,&local_184,4);
local_1d8 = local_19c;
}
local_14c = local_14c + 4;
}
}
else {
local_19c = 0;
CUtlBuffer::Scanf((CUtlBuffer *)local_158,"%u",&local_19c);
local_1d8 = local_19c;
}
if (local_144 == '\0') goto LAB_0071d02c;
Msg("Error reading sub-version number.\n");
}
goto LAB_0071caf7;
}
LAB_0071ce30:
Msg("Unknown navigation file version.\n");
iVar13 = 3;
free(*(void **)(this + 0x5d8));
*(undefined4 *)(this + 0x5d8) = 0;
}
LAB_0071cb14:
CUtlMemory<unsigned_char,int>::Purge((CUtlMemory<unsigned_char,int> *)local_158);
LAB_0071cb1c:
(**(code **)(*piVar3 + 0x6c))(piVar3);
if (local_20 == *(int *)(in_GS_OFFSET + 0x14)) {
return iVar13;
}
/* WARNING: Subroutine does not return */
__stack_chk_fail();
}
SourceMod gamedata
paste intoaddons/sourcemod/gamedata/<your_plugin>.txt
used as the SourceMod key — change to fit your plugin's convention
SourceMod library name (server / engine / matchmaking)
Just a Signatures{} block, ready to drop into a gamedata
file. Wire it up in your plugin however you like - SDKCall, DHooks,
raw memory ops, or anything else.
Signatures + Functions block. The plugin uses
DHookCreateFromConf - DHooks reads return type, this-type,
calling convention, and argument types straight from the gamedata. Less
boilerplate in the plugin, types travel with the gamedata.
Gamedata KeyValues
DHooks plugin example
Type inference is best-effort from the C signature - sanity-check the DHooks types before shipping.