L L4D2node

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 into addons/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.



        

        

          

Type inference is best-effort from the C signature - sanity-check the DHooks types before shipping.

Return-type handling cheatsheet (DHookReturn)