L L4D2node

TerrorNavMesh::ComputeDirectedFlowDistances

0x0097dd20 · 2856 bytes · __thiscall

_ZN13TerrorNavMesh28ComputeDirectedFlowDistancesEN13TerrorNavArea8FlowTypeEPS0_S2_

Decompiled

undefined (4 params)

/* TerrorNavMesh::ComputeDirectedFlowDistances(TerrorNavArea::FlowType, TerrorNavArea*,
   TerrorNavArea*) */

undefined4 __thiscall
TerrorNavMesh::ComputeDirectedFlowDistances
          (TerrorNavMesh *this,int param_2,CNavArea *param_3,CNavArea *param_4)

{
  float fVar1;
  CNavArea CVar2;
  CNavArea *pCVar3;
  undefined4 *puVar4;
  NavConnect *pNVar5;
  int iVar6;
  CNavArea *pCVar7;
  bool bVar8;
  char cVar9;
  int iVar10;
  int *piVar11;
  int iVar12;
  undefined4 uVar13;
  byte bVar14;
  uint uVar15;
  undefined *puVar16;
  CNavArea *pCVar17;
  int iVar18;
  int iVar19;
  CNavArea *pCVar20;
  bool bVar21;
  longdouble lVar22;
  float fVar23;
  float fVar24;
  float fVar25;
  float local_1a4;
  float local_194;
  float local_184;
  NavConnect *local_174 [16];
  undefined1 *local_134;
  undefined4 local_130;
  undefined4 local_12c;
  undefined4 local_128;
  undefined1 local_124 [256];
  int local_24;
  undefined1 *local_20;
  
  *(CNavArea **)(this + 0x600) = param_3;
  CNavArea::ClearSearchLists();
  pCVar17 = param_3;
  pCVar7 = param_4;
  if (param_2 != 1) {
    pCVar17 = param_4;
    pCVar7 = param_3;
  }
  iVar10 = param_2 + 0x54;
  *(undefined4 *)(pCVar17 + iVar10 * 4 + 4) = 0;
  CNavArea::AddToOpenList(pCVar17);
  local_24 = 0;
  local_130 = 0x40;
  local_12c = 0xffffffff;
  local_128 = 0;
  *(int *)(pCVar17 + 0x3c) = CNavArea::m_masterMarker;
  local_134 = local_124;
  bVar8 = false;
  local_1a4 = 1e+09;
  fVar25 = *(float *)(NavFlowMaxSurvivorClimbHeight._28_4_ + 0x2c);
  fVar1 = *(float *)(NavFlowMaxSurvivorDropHeight._28_4_ + 0x2c);
  local_20 = local_134;
  while (iVar12 = DAT_00fe6000, iVar19 = TheNavAreas, pCVar17 = CNavArea::m_openList,
        iVar18 = CNavArea::m_masterMarker, CNavArea::m_openList != (CNavArea *)0x0) {
                    /* try { // try from 0097de0c to 0097e88f has its CatchHandler @ 0097e895 */
    CNavArea::RemoveFromOpenList(CNavArea::m_openList);
    *(undefined4 *)(pCVar17 + 0x4c) = 0;
    *(undefined4 *)(pCVar17 + 0x48) = 0;
    if (((*(uint *)(pCVar17 + 0x54) & 0x70000) == 0) &&
       (cVar9 = CNavArea::IsBlocked(pCVar17,2,true), cVar9 == '\0')) {
      if (pCVar7 == pCVar17) {
        bVar8 = true;
        local_1a4 = *(float *)(pCVar7 + iVar10 * 4 + 4);
      }
      local_24 = 0;
      pCVar20 = pCVar17;
      if (param_2 == 1) {
        local_184 = 0.0;
        iVar18 = 0;
        do {
          piVar11 = *(int **)(pCVar20 + 0x114);
          if (0 < *piVar11) {
            iVar19 = 0;
            do {
              while ((*(byte *)(piVar11[iVar19 * 2 + 1] + 0x56) & 4) == 0) {
                local_174[0] = (NavConnect *)(piVar11 + iVar19 * 2 + 1);
                CUtlVector<NavConnect_const*,CUtlMemoryFixedGrowable<NavConnect_const*,64u,int>>::
                InsertBefore((CUtlVector<NavConnect_const*,CUtlMemoryFixedGrowable<NavConnect_const*,64u,int>>
                              *)&local_134,iVar18,local_174);
                piVar11 = *(int **)(pCVar20 + 0x114);
                iVar19 = iVar19 + 1;
                iVar18 = local_24;
                if (*piVar11 <= iVar19) goto LAB_0097e5c8;
              }
              iVar19 = iVar19 + 1;
            } while (iVar19 < *piVar11);
          }
LAB_0097e5c8:
          piVar11 = *(int **)(pCVar20 + 0x58);
          if (0 < *piVar11) {
            iVar19 = 0;
            do {
              while ((*(byte *)(piVar11[iVar19 * 2 + 1] + 0x56) & 4) == 0) {
                local_174[0] = (NavConnect *)(piVar11 + iVar19 * 2 + 1);
                CUtlVector<NavConnect_const*,CUtlMemoryFixedGrowable<NavConnect_const*,64u,int>>::
                InsertBefore((CUtlVector<NavConnect_const*,CUtlMemoryFixedGrowable<NavConnect_const*,64u,int>>
                              *)&local_134,iVar18,local_174);
                piVar11 = *(int **)(pCVar20 + 0x58);
                iVar19 = iVar19 + 1;
                iVar18 = local_24;
                if (*piVar11 <= iVar19) goto LAB_0097e61d;
              }
              iVar19 = iVar19 + 1;
            } while (iVar19 < *piVar11);
          }
LAB_0097e61d:
          local_184 = (float)((int)local_184 + 1);
          pCVar20 = pCVar20 + 4;
        } while (local_184 != 5.60519e-45);
      }
      else {
        do {
          piVar11 = *(int **)(pCVar20 + 0x114);
          iVar18 = 0;
          if (0 < *piVar11) {
            do {
              while ((*(byte *)(piVar11[iVar18 * 2 + 1] + 0x56) & 4) == 0) {
                local_174[0] = (NavConnect *)(piVar11 + iVar18 * 2 + 1);
                CUtlVector<NavConnect_const*,CUtlMemoryFixedGrowable<NavConnect_const*,64u,int>>::
                InsertBefore((CUtlVector<NavConnect_const*,CUtlMemoryFixedGrowable<NavConnect_const*,64u,int>>
                              *)&local_134,local_24,local_174);
                piVar11 = *(int **)(pCVar20 + 0x114);
                iVar18 = iVar18 + 1;
                if (*piVar11 <= iVar18) goto LAB_0097ded8;
              }
              iVar18 = iVar18 + 1;
            } while (iVar18 < *piVar11);
          }
LAB_0097ded8:
          piVar11 = *(int **)(pCVar20 + 0x58);
          iVar18 = 0;
          if (0 < *piVar11) {
            do {
              pCVar3 = (CNavArea *)piVar11[iVar18 * 2 + 1];
              cVar9 = CNavArea::IsConnected(pCVar3,pCVar17,4);
              if ((cVar9 != '\0') && (((byte)pCVar3[0x56] & 4) == 0)) {
                local_174[0] = (NavConnect *)(*(int *)(pCVar20 + 0x58) + 4 + iVar18 * 8);
                CUtlVector<NavConnect_const*,CUtlMemoryFixedGrowable<NavConnect_const*,64u,int>>::
                InsertBefore((CUtlVector<NavConnect_const*,CUtlMemoryFixedGrowable<NavConnect_const*,64u,int>>
                              *)&local_134,local_24,local_174);
              }
              piVar11 = *(int **)(pCVar20 + 0x58);
              iVar18 = iVar18 + 1;
            } while (iVar18 < *piVar11);
          }
          pCVar20 = pCVar20 + 4;
          iVar18 = local_24;
        } while (pCVar20 != pCVar17 + 0x10);
      }
      CVar2 = pCVar17[0x7c];
      bVar14 = (byte)CVar2 >> 4 & 3;
      if (bVar14 == 1) {
        local_184 = *(float *)(pCVar17 + 0x24);
        if ((byte)CVar2 >> 6 == 1) goto LAB_0097e667;
LAB_0097dfa6:
        if ((byte)CVar2 >> 6 == 2) {
          local_194 = *(float *)(pCVar17 + 0x18);
        }
        else if ((byte)CVar2 >> 6 == 0) {
          local_194 = *(float *)(pCVar17 + 0xc);
        }
        else {
          local_194 = *(float *)(pCVar17 + 0x28);
        }
      }
      else {
        if (bVar14 == 2) {
          local_184 = *(float *)(pCVar17 + 0x18);
        }
        else if (((byte)CVar2 >> 4 & 3) == 0) {
          local_184 = *(float *)(pCVar17 + 0xc);
        }
        else {
          local_184 = *(float *)(pCVar17 + 0x28);
        }
        if ((byte)CVar2 >> 6 != 1) goto LAB_0097dfa6;
LAB_0097e667:
        local_194 = *(float *)(pCVar17 + 0x24);
      }
      iVar19 = 0;
      if (0 < iVar18) {
        do {
          while( true ) {
            puVar4 = *(undefined4 **)(local_134 + iVar19 * 4);
            pCVar20 = (CNavArea *)*puVar4;
            if (param_2 != 0) break;
            CVar2 = pCVar20[0x7c];
            bVar14 = (byte)CVar2 >> 4 & 3;
            if (bVar14 == 1) {
              fVar24 = *(float *)(pCVar20 + 0x24);
              if ((byte)CVar2 >> 6 == 1) goto LAB_0097e34c;
LAB_0097e022:
              if ((byte)CVar2 >> 6 == 2) {
                fVar23 = *(float *)(pCVar20 + 0x18);
              }
              else if ((byte)CVar2 >> 6 == 0) {
                fVar23 = *(float *)(pCVar20 + 0xc);
              }
              else {
                fVar23 = *(float *)(pCVar20 + 0x28);
              }
            }
            else {
              if (bVar14 == 2) {
                fVar24 = *(float *)(pCVar20 + 0x18);
              }
              else if (((byte)CVar2 >> 4 & 3) == 0) {
                fVar24 = *(float *)(pCVar20 + 0xc);
              }
              else {
                fVar24 = *(float *)(pCVar20 + 0x28);
              }
              if ((byte)CVar2 >> 6 != 1) goto LAB_0097e022;
LAB_0097e34c:
              fVar23 = *(float *)(pCVar20 + 0x24);
            }
            if ((local_184 - fVar23 <= fVar25) && (fVar24 - local_194 <= fVar1)) break;
            if ((local_194 - fVar24 <= fVar25) && (fVar23 - local_184 <= fVar1)) {
              lVar22 = (longdouble)CNavArea::GetZDeltaAtEdgeToArea(pCVar20,pCVar17);
              if (((float)lVar22 <= fVar25) && (-(float)lVar22 <= fVar1)) break;
            }
LAB_0097e090:
            iVar19 = iVar19 + 1;
            if (local_24 <= iVar19) goto LAB_0097e110;
          }
          fVar24 = *(float *)(pCVar17 + iVar10 * 4 + 4) + (float)puVar4[1];
          if ((*(float *)(pCVar20 + param_2 * 4 + 0x154) <= fVar24) &&
             (0.0 <= *(float *)(pCVar20 + param_2 * 4 + 0x154))) goto LAB_0097e090;
          *(float *)(pCVar20 + param_2 * 4 + 0x154) = fVar24;
          bVar21 = *(int *)(pCVar20 + 0x50) == CNavArea::m_masterMarker;
          *(int *)(pCVar20 + 0x3c) = CNavArea::m_masterMarker;
          if (bVar21) goto LAB_0097e090;
          CNavArea::AddToOpenListTail(pCVar20);
          iVar19 = iVar19 + 1;
        } while (iVar19 < local_24);
      }
LAB_0097e110:
      iVar18 = 0;
      iVar19 = 0;
      piVar11 = *(int **)(pCVar17 + 0x68);
      if (0 < *piVar11) {
        do {
          while( true ) {
            iVar12 = piVar11[iVar18 + 1];
            uVar15 = *(uint *)(iVar12 + 0x38);
            if ((((uVar15 != 0xffffffff) &&
                 (puVar16 = g_pEntityList + (uVar15 & 0xfff) * 0x10,
                 puVar16 != (undefined *)0xfffffffc)) && (*(uint *)(puVar16 + 8) == uVar15 >> 0xc))
               && ((*(CBaseEntity **)(puVar16 + 4) != (CBaseEntity *)0x0 &&
                   (uVar15 = CBaseEntity::GetTeamNumber(*(CBaseEntity **)(puVar16 + 4)),
                   (uVar15 & 0xfffffffd) != 0)))) break;
            if (*(NavConnect **)(iVar12 + 0x24) == (NavConnect *)0x0) {
LAB_0097e146:
              if (*(NavConnect **)(iVar12 + 0x28) != (NavConnect *)0x0) {
                if (0xf < iVar19) goto LAB_0097e172;
                local_174[iVar19] = *(NavConnect **)(iVar12 + 0x28);
                iVar19 = iVar19 + 1;
              }
              if ((*(NavConnect **)(iVar12 + 0x2c) != (NavConnect *)0x0) && (iVar19 < 0x10)) {
                local_174[iVar19] = *(NavConnect **)(iVar12 + 0x2c);
                iVar19 = iVar19 + 1;
              }
            }
            else if (iVar19 < 0x10) {
              local_174[iVar19] = *(NavConnect **)(iVar12 + 0x24);
              iVar19 = iVar19 + 1;
              goto LAB_0097e146;
            }
LAB_0097e172:
            iVar18 = iVar18 + 1;
            piVar11 = *(int **)(pCVar17 + 0x68);
            if (*piVar11 <= iVar18) goto LAB_0097e1dc;
          }
          iVar18 = iVar18 + 1;
          piVar11 = *(int **)(pCVar17 + 0x68);
        } while (iVar18 < *piVar11);
      }
LAB_0097e1dc:
      iVar18 = 0;
      piVar11 = *(int **)(pCVar17 + 0x6c);
      if (0 < *piVar11) {
        do {
          while( true ) {
            iVar12 = piVar11[iVar18 + 1];
            uVar15 = *(uint *)(iVar12 + 0x38);
            if ((((uVar15 != 0xffffffff) &&
                 (puVar16 = g_pEntityList + (uVar15 & 0xfff) * 0x10,
                 puVar16 != (undefined *)0xfffffffc)) && (*(uint *)(puVar16 + 8) == uVar15 >> 0xc))
               && ((*(CBaseEntity **)(puVar16 + 4) != (CBaseEntity *)0x0 &&
                   (uVar15 = CBaseEntity::GetTeamNumber(*(CBaseEntity **)(puVar16 + 4)),
                   (uVar15 & 0xfffffffd) != 0)))) break;
            pNVar5 = *(NavConnect **)(iVar12 + 0x34);
            if ((pNVar5 != (NavConnect *)0x0) && (iVar19 < 0x10)) {
              local_174[iVar19] = pNVar5;
              iVar19 = iVar19 + 1;
            }
            iVar18 = iVar18 + 1;
            piVar11 = *(int **)(pCVar17 + 0x6c);
            if (*piVar11 <= iVar18) goto LAB_0097e268;
          }
          iVar18 = iVar18 + 1;
          piVar11 = *(int **)(pCVar17 + 0x6c);
        } while (iVar18 < *piVar11);
      }
LAB_0097e268:
      iVar18 = 0;
      while( true ) {
        if ((CNavArea::GetElevatorAreas()::empty == '\0') &&
           (iVar12 = __cxa_guard_acquire(&CNavArea::GetElevatorAreas()::empty), iVar12 != 0)) {
          if ((CUtlVectorUltraConservative<NavConnect,CUtlVectorUltraConservativeAllocator>::
               StaticData()::staticData == '\0') &&
             (iVar12 = __cxa_guard_acquire(&CUtlVectorUltraConservative<NavConnect,CUtlVectorUltraConservativeAllocator>
                                            ::StaticData()::staticData), iVar12 != 0)) {
            __cxa_guard_release(&CUtlVectorUltraConservative<NavConnect,CUtlVectorUltraConservativeAllocator>
                                 ::StaticData()::staticData);
          }
          CNavArea::GetElevatorAreas()::empty =
               &CUtlVectorUltraConservative<NavConnect,CUtlVectorUltraConservativeAllocator>::
                StaticData()::staticData;
          __cxa_guard_release(&CNavArea::GetElevatorAreas()::empty);
          __cxa_atexit(CUtlVectorUltraConservative<NavConnect,CUtlVectorUltraConservativeAllocator>
                       ::~CUtlVectorUltraConservative,&CNavArea::GetElevatorAreas()::empty,
                       &__dso_handle);
        }
        uVar15 = *(uint *)(pCVar17 + 0x54) & 0x40000000;
        pCVar20 = (CNavArea *)&CNavArea::GetElevatorAreas()::empty;
        if (uVar15 != 0) {
          pCVar20 = pCVar17 + 0x88;
        }
        if (**(int **)pCVar20 <= iVar18) break;
        if (CNavArea::GetElevatorAreas()::empty == '\0') {
          iVar12 = __cxa_guard_acquire(&CNavArea::GetElevatorAreas()::empty);
          if (iVar12 != 0) {
            if ((CUtlVectorUltraConservative<NavConnect,CUtlVectorUltraConservativeAllocator>::
                 StaticData()::staticData == '\0') &&
               (iVar12 = __cxa_guard_acquire(&CUtlVectorUltraConservative<NavConnect,CUtlVectorUltraConservativeAllocator>
                                              ::StaticData()::staticData), iVar12 != 0)) {
              __cxa_guard_release(&CUtlVectorUltraConservative<NavConnect,CUtlVectorUltraConservativeAllocator>
                                   ::StaticData()::staticData);
            }
            CNavArea::GetElevatorAreas()::empty =
                 &CUtlVectorUltraConservative<NavConnect,CUtlVectorUltraConservativeAllocator>::
                  StaticData()::staticData;
            __cxa_guard_release(&CNavArea::GetElevatorAreas()::empty);
            __cxa_atexit(CUtlVectorUltraConservative<NavConnect,CUtlVectorUltraConservativeAllocator>
                         ::~CUtlVectorUltraConservative,&CNavArea::GetElevatorAreas()::empty,
                         &__dso_handle);
          }
          uVar15 = *(uint *)(pCVar17 + 0x54) & 0x40000000;
        }
        pCVar20 = (CNavArea *)&CNavArea::GetElevatorAreas()::empty;
        if (uVar15 != 0) {
          pCVar20 = pCVar17 + 0x88;
        }
        pNVar5 = *(NavConnect **)(*(int *)pCVar20 + 4 + iVar18 * 8);
        if ((iVar19 < 0x10) && (pNVar5 != (NavConnect *)0x0)) {
          local_174[iVar19] = pNVar5;
          iVar19 = iVar19 + 1;
        }
        iVar18 = iVar18 + 1;
      }
      iVar18 = 0;
      if (iVar19 != 0) {
        do {
          pCVar20 = (CNavArea *)local_174[iVar18];
          fVar24 = SQRT((*(float *)(pCVar20 + 0x30) - *(float *)(pCVar17 + 0x30)) *
                        (*(float *)(pCVar20 + 0x30) - *(float *)(pCVar17 + 0x30)) +
                        (*(float *)(pCVar20 + 0x34) - *(float *)(pCVar17 + 0x34)) *
                        (*(float *)(pCVar20 + 0x34) - *(float *)(pCVar17 + 0x34)) +
                        (*(float *)(pCVar20 + 0x2c) - *(float *)(pCVar17 + 0x2c)) *
                        (*(float *)(pCVar20 + 0x2c) - *(float *)(pCVar17 + 0x2c))) +
                   *(float *)(pCVar17 + iVar10 * 4 + 4);
          if ((fVar24 < *(float *)(pCVar20 + param_2 * 4 + 0x154)) ||
             (*(float *)(pCVar20 + param_2 * 4 + 0x154) < 0.0)) {
            *(float *)(pCVar20 + param_2 * 4 + 0x154) = fVar24;
            bVar21 = *(int *)(pCVar20 + 0x50) != CNavArea::m_masterMarker;
            *(int *)(pCVar20 + 0x3c) = CNavArea::m_masterMarker;
            if (bVar21) {
              CNavArea::AddToOpenListTail(pCVar20);
            }
          }
          iVar18 = iVar18 + 1;
        } while (iVar18 != iVar19);
      }
    }
  }
  if (bVar8) {
    if ((param_2 == 0) && (0 < DAT_00fe6000)) {
      iVar10 = 0;
LAB_0097e727:
      do {
        iVar6 = *(int *)(iVar19 + iVar10 * 4);
        if (*(int *)(iVar6 + 0x3c) == iVar18) {
          fVar25 = local_1a4 - *(float *)(iVar6 + 0x154);
          *(float *)(iVar6 + 0x154) = fVar25;
          if (*(float *)(this + 0x5f4) <= fVar25 && fVar25 != *(float *)(this + 0x5f4)) {
            *(float *)(this + 0x5f4) = fVar25;
          }
          if ((*(float *)(this + 0x5f8) <= fVar25 && fVar25 != *(float *)(this + 0x5f8)) &&
             ((*(byte *)(iVar6 + 0x12d) & 8) == 0)) {
            iVar10 = iVar10 + 1;
            *(float *)(this + 0x5f8) = fVar25;
            if (iVar12 <= iVar10) break;
            goto LAB_0097e727;
          }
        }
        else {
          *(undefined4 *)(iVar6 + 0x154) = 0xc61c3c00;
        }
        iVar10 = iVar10 + 1;
      } while (iVar10 < iVar12);
    }
    uVar13 = 1;
  }
  else {
    ZombieDebugPrint(1,"Flow Error: Goal not reached...\n");
    if (param_2 == 1) {
      ZombieDebugPrint(2,"Started at start...");
    }
    else {
      ZombieDebugPrint(2,"Started at goal...");
    }
    ZombieDebugPrint(2,"Start %d(%f %f %f), End %d(%f %f %f)\n",*(undefined4 *)(param_3 + 0x8c),
                     (double)*(float *)(param_3 + 0x2c),(double)*(float *)(param_3 + 0x30),
                     (double)*(float *)(param_3 + 0x34),*(undefined4 *)(param_4 + 0x8c),
                     (double)*(float *)(param_4 + 0x2c),(double)*(float *)(param_4 + 0x30),
                     (double)*(float *)(param_4 + 0x34));
    uVar13 = 0;
  }
  local_24 = 0;
  CUtlMemory<NavConnect_const*,int>::Purge((CUtlMemory<NavConnect_const*,int> *)&local_134);
  local_20 = local_134;
  CUtlMemory<NavConnect_const*,int>::Purge((CUtlMemory<NavConnect_const*,int> *)&local_134);
  return uVar13;
}

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)