L L4D2node

CNavMesh::RaiseAreasWithInternalObstacles

0x0072c920 · 1286 bytes · __thiscall

_ZN8CNavMesh31RaiseAreasWithInternalObstaclesEv

Decompiled

undefined (1 param)

/* CNavMesh::RaiseAreasWithInternalObstacles() */

void __thiscall CNavMesh::RaiseAreasWithInternalObstacles(CNavMesh *this)

{
  int iVar1;
  bool bVar2;
  int iVar3;
  Vector *pVVar4;
  int iVar5;
  int iVar6;
  float fVar7;
  undefined4 uVar8;
  float fVar9;
  undefined4 uVar10;
  undefined4 uVar11;
  float fVar12;
  float fVar13;
  float fVar14;
  CUtlMemory<CNavArea*,int> *local_90;
  int local_8c;
  int local_84;
  int local_80;
  CNavArea *local_74;
  float local_70;
  float local_6c;
  uint local_68;
  uint local_64;
  int local_60 [5];
  float local_4c [3];
  float local_40;
  float local_3c;
  float local_38;
  float local_34;
  float local_30;
  float local_2c;
  float local_28;
  float local_24;
  float local_20;
  
  local_60[0] = 0;
  local_60[1] = 0;
  local_60[2] = 0;
  local_60[3] = 0;
  local_60[4] = 0;
  if (0 < DAT_00fe6000) {
    local_84 = 0;
    do {
      local_74 = *(CNavArea **)(TheNavAreas + local_84 * 4);
      if ((*(float *)(local_74 + 0x10) - *(float *)(local_74 + 4) == 25.0) &&
         (*(float *)(local_74 + 0x14) - *(float *)(local_74 + 8) == 25.0)) {
        fVar14 = -3.4028235e+38;
        local_70 = 25.0;
        local_6c = 0.0;
        fVar13 = -3.4028235e+38;
        bVar2 = false;
        fVar12 = -3.4028235e+38;
        local_8c = 0;
        iVar6 = 0;
        do {
          local_4c[0] = -3.4028235e+38;
          fVar9 = 25.0;
          local_4c[1] = -3.4028235e+38;
          local_68 = iVar6 + 3U & 3;
          iVar3 = *(int *)(local_74 + local_68 * 4 + 0xec);
          local_64 = iVar6 + 2U & 3;
          iVar5 = 0;
          local_80 = 0;
          if (iVar3 == 0) goto LAB_0072ca52;
          do {
            iVar1 = iVar3 + iVar6 * 4;
            fVar7 = *(float *)(iVar1 + 0x28);
            if (18.0 < fVar7) {
              fVar7 = fVar7 + *(float *)(iVar3 + 8);
              local_80 = local_80 + 1;
              if (local_4c[iVar5] <= fVar7 && fVar7 != local_4c[iVar5]) {
                local_4c[iVar5] = fVar7;
              }
              fVar7 = *(float *)(iVar1 + 0x38);
              if (fVar7 <= fVar9) {
                fVar9 = fVar7;
              }
            }
LAB_0072ca52:
            if (iVar5 == 1) break;
            iVar5 = 1;
            iVar3 = *(int *)(local_74 + local_64 * 4 + 0xec);
          } while (iVar3 != 0);
          iVar3 = **(int **)(local_74 + iVar6 * 4 + 0x58);
          if (0 < iVar3) {
            iVar5 = 0;
            do {
              iVar1 = (*(int **)(local_74 + iVar6 * 4 + 0x58))[iVar5 * 2 + 1];
              if ((iVar1 != 0) && ((*(byte *)(iVar1 + 0x55) & 0x10) != 0)) {
                iVar3 = 1;
                bVar2 = true;
                goto LAB_0072caad;
              }
              iVar5 = iVar5 + 1;
            } while (iVar5 != iVar3);
          }
          iVar3 = 2;
LAB_0072caad:
          if (iVar3 <= local_80) {
            fVar7 = local_4c[1];
            if (local_4c[1] <= local_4c[0]) {
              fVar7 = local_4c[0];
            }
            if (fVar12 < fVar7) {
              fVar12 = fVar7;
              fVar13 = local_4c[1];
              fVar14 = local_4c[0];
              local_8c = iVar6;
              local_70 = fVar9;
              local_6c = fVar9;
            }
          }
          iVar6 = iVar6 + 1;
        } while (iVar6 != 4);
        if (-3.4028235e+38 < fVar12) {
          if (bVar2) {
            CUtlVector<CNavArea*,CUtlMemory<CNavArea*,int>>::InsertBefore
                      ((CUtlVector<CNavArea*,CUtlMemory<CNavArea*,int>> *)local_60,local_60[3],
                       &local_74);
          }
          else {
            iVar3 = 1;
            AdjustObstacleDistances(&local_70,&local_6c,25.0);
            iVar6 = 0;
            pVVar4 = (Vector *)local_4c;
            while (iVar6 != 3) {
              if (iVar6 == 1) {
                uVar8 = *(undefined4 *)(local_74 + 0x24);
                uVar10 = *(undefined4 *)(local_74 + 8);
                uVar11 = *(undefined4 *)(local_74 + 0x10);
                goto LAB_0072cc1d;
              }
              uVar11 = *(undefined4 *)(local_74 + 8);
              uVar10 = *(undefined4 *)(local_74 + 0xc);
              *(undefined4 *)pVVar4 = *(undefined4 *)(local_74 + 4);
              *(undefined4 *)(pVVar4 + 4) = uVar11;
              *(undefined4 *)(pVVar4 + 8) = uVar10;
              iVar6 = iVar3;
              if (iVar3 == 4) goto LAB_0072cc62;
              while( true ) {
                iVar3 = iVar6 + 1;
                pVVar4 = pVVar4 + 0xc;
                if (iVar6 != 2) break;
                uVar11 = *(undefined4 *)(local_74 + 0x10);
                uVar10 = *(undefined4 *)(local_74 + 0x14);
                uVar8 = *(undefined4 *)(local_74 + 0x18);
LAB_0072cc1d:
                *(undefined4 *)pVVar4 = uVar11;
                *(undefined4 *)(pVVar4 + 4) = uVar10;
                *(undefined4 *)(pVVar4 + 8) = uVar8;
                iVar6 = iVar3;
              }
            }
            local_28 = *(float *)(local_74 + 4);
            local_24 = *(float *)(local_74 + 0x14);
LAB_0072cc62:
            if (local_8c == 1) {
              local_34 = local_28 + local_6c;
              local_40 = local_4c[0] + local_6c;
LAB_0072cc98:
              local_4c[0] = local_40 - local_6c;
              local_28 = local_34 - local_6c;
              local_40 = local_40 - local_70;
              local_34 = local_34 - local_70;
              local_38 = fVar14;
              fVar14 = fVar13;
            }
            else {
              local_38 = fVar13;
              if (local_8c < 2) {
                if (local_8c == 0) {
                  local_4c[1] = local_24 - local_6c;
                  local_3c = local_30 - local_6c;
                  local_24 = local_24 - local_70;
                  local_30 = local_30 - local_70;
                }
              }
              else if (local_8c == 2) {
                local_24 = local_6c + local_4c[1];
                local_30 = local_6c + local_3c;
                local_3c = local_3c + local_70;
                local_4c[1] = local_4c[1] + local_70;
                local_38 = fVar14;
                fVar14 = fVar13;
              }
              else if (local_8c == 3) goto LAB_0072cc98;
            }
            local_4c[2] = fVar14;
            local_2c = local_38;
            local_20 = fVar14;
            CNavArea::Build(local_74,(Vector *)local_4c,(Vector *)&local_40,(Vector *)&local_34,
                            (Vector *)&local_28);
            CNavArea::RemoveOrthogonalConnections(local_74,local_8c);
            *(undefined4 *)(local_74 + 0xec) = 0;
            *(undefined4 *)(local_74 + 0xf0) = 0;
            *(undefined4 *)(local_74 + 0xf4) = 0;
            *(undefined4 *)(local_74 + 0xf8) = 0;
            *(uint *)(local_74 + 0x54) = *(uint *)(local_74 + 0x54) & 0xfffffffd | 0x6000;
          }
        }
      }
      local_84 = local_84 + 1;
    } while (local_84 < DAT_00fe6000);
    iVar6 = 0;
    if (0 < local_60[3]) {
      do {
                    /* try { // try from 0072cb35 to 0072cd19 has its CatchHandler @ 0072ce2e */
        (**(code **)(*(int *)this + 0x18))(this,*(undefined4 *)(local_60[0] + iVar6 * 4));
        iVar6 = iVar6 + 1;
      } while (iVar6 < local_60[3]);
    }
  }
  local_90 = (CUtlMemory<CNavArea*,int> *)local_60;
  local_60[3] = 0;
  CUtlMemory<CNavArea*,int>::Purge(local_90);
  local_60[4] = local_60[0];
  CUtlMemory<CNavArea*,int>::Purge(local_90);
  return;
}

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)