L L4D2node

CNavMesh::GetNavAreasInRadius

0x007427e0 · 1166 bytes · __thiscall

_ZN8CNavMesh19GetNavAreasInRadiusERK6VectorfP9HSCRIPT__

Decompiled

undefined (4 params)

/* CNavMesh::GetNavAreasInRadius(Vector const&, float, HSCRIPT__*) */

void __thiscall
CNavMesh::GetNavAreasInRadius(CNavMesh *this,Vector *param_1,float param_2,HSCRIPT__ *param_3)

{
  int *piVar1;
  CNavArea *pCVar2;
  code *pcVar3;
  int iVar4;
  int iVar5;
  int iVar6;
  int iVar7;
  int iVar8;
  int iVar9;
  int iVar10;
  int iVar11;
  int in_GS_OFFSET;
  float fVar12;
  int local_16c;
  CNavArea *local_154;
  void *local_150 [2];
  undefined2 local_148;
  ushort local_146;
  char local_144;
  int *local_140;
  undefined4 local_13c;
  undefined4 local_138;
  int local_134;
  int *local_130;
  CFmtStrN<256> local_12c [5];
  undefined1 local_127 [263];
  int local_20;
  
  iVar11 = TheNavMesh;
  local_20 = *(int *)(in_GS_OFFSET + 0x14);
  if (param_3 != (HSCRIPT__ *)0x0) {
    local_140 = (int *)0x0;
    local_13c = 0;
    local_138 = 0;
    local_134 = 0;
    local_130 = (int *)0x0;
    local_144 = '\0';
    if ((ForAllAreasInRadius<NavAreaCollector>(NavAreaCollector&,Vector_const&,float)::searchMarker
         == '\0') &&
       (iVar5 = __cxa_guard_acquire(&ForAllAreasInRadius<NavAreaCollector>(NavAreaCollector&,Vector_const&,float)
                                     ::searchMarker), iVar5 != 0)) {
                    /* try { // try from 00742c63 to 00742c67 has its CatchHandler @ 00742c8c */
      ForAllAreasInRadius<NavAreaCollector>(NavAreaCollector&,Vector_const&,float)::searchMarker =
           RandomInt(0,0x100000);
      __cxa_guard_release(&ForAllAreasInRadius<NavAreaCollector>(NavAreaCollector&,Vector_const&,float)
                           ::searchMarker);
    }
    iVar5 = ForAllAreasInRadius<NavAreaCollector>(NavAreaCollector&,Vector_const&,float)::
            searchMarker + 1;
    if (ForAllAreasInRadius<NavAreaCollector>(NavAreaCollector&,Vector_const&,float)::searchMarker +
        1 == 0) {
      iVar5 = ForAllAreasInRadius<NavAreaCollector>(NavAreaCollector&,Vector_const&,float)::
              searchMarker + 2;
    }
    ForAllAreasInRadius<NavAreaCollector>(NavAreaCollector&,Vector_const&,float)::searchMarker =
         iVar5;
    fVar12 = 1.0 / *(float *)(iVar11 + 0x20);
    iVar5 = (int)((*(float *)param_1 - *(float *)(iVar11 + 0x2c)) * fVar12);
    if (iVar5 < 0) {
      iVar5 = 0;
    }
    else if (*(int *)(iVar11 + 0x24) <= iVar5) {
      iVar5 = *(int *)(iVar11 + 0x24) + -1;
    }
    iVar9 = (int)((*(float *)(param_1 + 4) - *(float *)(iVar11 + 0x30)) * fVar12);
    if (iVar9 < 0) {
      iVar9 = 0;
    }
    else if (*(int *)(iVar11 + 0x28) <= iVar9) {
      iVar9 = *(int *)(iVar11 + 0x28) + -1;
    }
    iVar7 = (int)(fVar12 * param_2);
    if ((float)iVar7 < fVar12 * param_2) {
      iVar7 = iVar7 + 1;
    }
    if (param_2 == 0.0) {
      iVar7 = *(int *)(iVar11 + 0x28);
      if (*(int *)(iVar11 + 0x28) < *(int *)(iVar11 + 0x24)) {
        iVar7 = *(int *)(iVar11 + 0x24);
      }
    }
    local_16c = local_134;
    for (iVar6 = iVar5 - iVar7; iVar6 <= iVar5 + iVar7; iVar6 = iVar6 + 1) {
      if ((-1 < iVar6) && (iVar4 = iVar9 - iVar7, iVar6 < *(int *)(iVar11 + 0x24))) {
        for (; iVar4 <= iVar7 + iVar9; iVar4 = iVar4 + 1) {
          if (((-1 < iVar4) && (iVar4 < *(int *)(iVar11 + 0x28))) &&
             (piVar1 = (int *)(*(int *)(iVar11 + 0xc) +
                              (iVar4 * *(int *)(iVar11 + 0x24) + iVar6) * 0x14), 0 < piVar1[3])) {
            iVar10 = 0;
LAB_007429f4:
            do {
              pCVar2 = *(CNavArea **)(*piVar1 + iVar10 * 4);
              if ((*(int *)(pCVar2 + 0x74) !=
                   ForAllAreasInRadius<NavAreaCollector>(NavAreaCollector&,Vector_const&,float)::
                   searchMarker) &&
                 ((*(int *)(pCVar2 + 0x74) =
                        ForAllAreasInRadius<NavAreaCollector>(NavAreaCollector&,Vector_const&,float)
                        ::searchMarker,
                  (*(float *)(pCVar2 + 0x30) - *(float *)(param_1 + 4)) *
                  (*(float *)(pCVar2 + 0x30) - *(float *)(param_1 + 4)) +
                  (*(float *)(pCVar2 + 0x2c) - *(float *)param_1) *
                  (*(float *)(pCVar2 + 0x2c) - *(float *)param_1) +
                  (*(float *)(pCVar2 + 0x34) - *(float *)(param_1 + 8)) *
                  (*(float *)(pCVar2 + 0x34) - *(float *)(param_1 + 8)) <= param_2 * param_2 ||
                  (param_2 * param_2 == 0.0)))) {
                local_154 = pCVar2;
                if ((local_144 == '\0') || (local_16c < 1)) {
LAB_00742a96:
                    /* try { // try from 00742ab3 to 00742b27 has its CatchHandler @ 00742cbc */
                  CUtlVector<CNavArea*,CUtlMemory<CNavArea*,int>>::InsertBefore
                            ((CUtlVector<CNavArea*,CUtlMemory<CNavArea*,int>> *)&local_140,local_16c
                             ,&local_154);
                  iVar10 = iVar10 + 1;
                  local_16c = local_134;
                  if (piVar1[3] <= iVar10) break;
                  goto LAB_007429f4;
                }
                if (pCVar2 != (CNavArea *)*local_140) {
                  iVar8 = 0;
                  do {
                    iVar8 = iVar8 + 1;
                    if (iVar8 == local_16c) goto LAB_00742a96;
                  } while (pCVar2 != (CNavArea *)local_140[iVar8]);
                  if (iVar8 < 0) goto LAB_00742a96;
                }
              }
              iVar10 = iVar10 + 1;
            } while (iVar10 < piVar1[3]);
          }
        }
      }
    }
    iVar11 = 0;
    if (0 < local_16c) {
      do {
        pcVar3 = *(code **)(*g_pScriptVM + 0x78);
        if ((TerrorNavArea *)local_140[iVar11] == (TerrorNavArea *)0x0) {
          local_150[0] = (void *)0x0;
        }
        else {
          local_150[0] = (void *)TerrorNavArea::GetScriptInstance
                                           ((TerrorNavArea *)local_140[iVar11]);
        }
        local_148 = 0x20;
        local_146 = 0;
                    /* try { // try from 00742b5e to 00742b84 has its CatchHandler @ 00742cc0 */
        CFmtStrN<256>::CFmtStrN(local_12c,"area%i",iVar11);
        (*pcVar3)(g_pScriptVM,param_3,local_127,local_150);
        if ((local_146 & 1) != 0) {
          free(local_150[0]);
        }
        iVar11 = iVar11 + 1;
      } while (iVar11 < local_134);
    }
    local_134 = 0;
    CUtlMemory<CNavArea*,int>::Purge((CUtlMemory<CNavArea*,int> *)&local_140);
    local_130 = local_140;
    CUtlMemory<CNavArea*,int>::Purge((CUtlMemory<CNavArea*,int> *)&local_140);
  }
  if (local_20 == *(int *)(in_GS_OFFSET + 0x14)) {
    return;
  }
                    /* 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)