L L4D2node

SelectAreasWithNonWalkableConnections

0x0098e0a0 · 4550 bytes · __regparm3

_ZL37SelectAreasWithNonWalkableConnectionsP16NavAreaCollector

Decompiled

undefined (1 param)

/* SelectAreasWithNonWalkableConnections(NavAreaCollector*) */

void __regparm3 SelectAreasWithNonWalkableConnections(NavAreaCollector *param_1)

{
  int iVar1;
  CNavArea *pCVar2;
  CNavArea *pCVar3;
  float fVar4;
  char cVar5;
  int iVar6;
  CNavArea **ppCVar7;
  int iVar8;
  int iVar9;
  int *piVar10;
  float fVar11;
  float fVar12;
  float fVar13;
  Vector *pVVar14;
  float fVar15;
  CTraceFilterSimple *this;
  CTraceFilterSimple *pCVar16;
  Vector *pVVar17;
  float in_stack_fffffdc8;
  int local_22c;
  byte local_221;
  CUtlMemory<CNavArea*,int> *local_220;
  CNavArea *local_214;
  int local_210;
  byte local_20c;
  int local_1f0;
  CBaseEntity *local_1ec;
  undefined1 local_1e8 [4];
  CNavArea *local_1e4;
  CNavArea *local_1e0;
  CNavArea *local_1dc;
  float local_1d8;
  float local_1d4;
  float local_1d0;
  float local_1cc;
  float local_1c8;
  float local_1c4;
  float local_1c0;
  float local_1bc;
  float local_1b8;
  float local_1b4;
  float local_1b0;
  float local_1ac;
  int local_1a8 [5];
  int *local_194;
  undefined4 local_190;
  undefined4 local_18c;
  int local_188;
  int *local_184;
  undefined **local_180 [4];
  undefined4 local_170;
  float local_16c;
  float local_168;
  float local_164;
  float local_15c;
  float local_158;
  float local_154;
  float local_14c;
  float local_148;
  float local_144;
  float local_13c;
  float local_138;
  float local_134;
  undefined4 local_12c;
  undefined1 local_128;
  undefined1 local_127;
  float local_11c;
  float local_118;
  float local_114;
  float local_10c;
  float local_108;
  undefined4 local_104;
  float local_fc;
  float local_f8;
  float local_f4;
  float local_ec;
  float local_e8;
  float local_e4;
  undefined4 local_dc;
  undefined1 local_d8;
  undefined1 local_d7;
  float local_cc;
  float local_c8;
  float local_c4;
  float local_c0;
  float local_bc;
  float local_b8;
  float local_b4;
  float local_ac;
  float local_a8;
  float local_a4;
  float local_9c;
  float local_98;
  float local_94;
  undefined4 local_8c;
  undefined1 local_88;
  undefined1 local_87;
  CNavArea *local_70;
  float local_6c;
  float local_68;
  float local_64;
  float local_60;
  float local_5c;
  float local_44;
  char local_39;
  
  local_1a8[0] = 0;
  iVar1 = *(int *)(param_1 + 0x10);
  local_1a8[1] = 0;
  local_1a8[2] = 0;
  local_1a8[3] = 0;
  local_1a8[4] = 0;
  local_1ec = (CBaseEntity *)0x0;
  while (local_1ec = (CBaseEntity *)
                     CGlobalEntityList::FindEntityByClassname
                               ((CGlobalEntityList *)gEntList,local_1ec,"func_nav_blocker"),
        local_1ec != (CBaseEntity *)0x0) {
                    /* try { // try from 0098e11f to 0098e141 has its CatchHandler @ 0098e82c */
    CUtlVector<CBaseEntity*,CUtlMemory<CBaseEntity*,int>>::InsertBefore
              ((CUtlVector<CBaseEntity*,CUtlMemory<CBaseEntity*,int>> *)local_1a8,local_1a8[3],
               &local_1ec);
  }
  local_194 = (int *)0x0;
  local_190 = 0;
  local_18c = 0;
  local_188 = 0;
  local_184 = (int *)0x0;
  local_1ec = (CBaseEntity *)0x0;
  if (DAT_00fe6000 < 1) {
    local_1d0 = 17.5;
    local_1d8 = WalkableTraceMaxs;
    local_1d4 = DAT_0101692c;
  }
  else {
    local_1f0 = 0;
    do {
      pCVar2 = *(CNavArea **)(TheNavAreas + local_1f0 * 4);
                    /* try { // try from 0098e1d3 to 0098e7c3 has its CatchHandler @ 0098e8a6 */
      if ((*(int *)(pCVar2 + 0x70) < *(int *)(gpGlobals + 0x18)) &&
         (cVar5 = CNavArea::IsBlocked(pCVar2,-1,false), cVar5 == '\0')) {
        CNavArea::GetExtent(pCVar2,(Extent *)&local_cc);
        iVar9 = 0;
        if (0 < local_1a8[3]) {
          do {
            iVar6 = *(int *)(local_1a8[0] + iVar9 * 4);
            (**(code **)(*(int *)(iVar6 + 0x194) + 0x3c))(iVar6 + 0x194,&local_70,&local_64);
            local_64 = local_64 + 100.0;
            local_70 = (CNavArea *)((float)local_70 - 100.0);
            local_6c = local_6c - 100.0;
            local_68 = local_68 - 100.0;
            local_60 = local_60 + 100.0;
            local_5c = local_5c + 100.0;
            if (((((local_cc <= local_64) && ((float)local_70 <= local_c0)) &&
                 (local_c8 <= local_60)) && ((local_6c <= local_bc && (local_c4 <= local_5c)))) &&
               (local_68 <= local_b8)) goto LAB_0098e2fb;
            iVar9 = iVar9 + 1;
          } while (iVar9 < local_1a8[3]);
        }
        if ((*(uint *)(pCVar2 + 0x54) & 0x30000) != 0) goto LAB_0098e2fb;
      }
      else {
LAB_0098e2fb:
        local_70 = pCVar2;
        CUtlVector<CNavArea*,CUtlMemory<CNavArea*,int>>::InsertBefore
                  ((CUtlVector<CNavArea*,CUtlMemory<CNavArea*,int>> *)&local_194,local_188,&local_70
                  );
      }
      local_1f0 = local_1f0 + 1;
    } while (local_1f0 < DAT_00fe6000);
    local_1d0 = 17.5;
    local_1d8 = WalkableTraceMaxs;
    local_1d4 = DAT_0101692c;
    if (0 < DAT_00fe6000) {
      local_22c = 0;
      do {
        pCVar2 = *(CNavArea **)(TheNavAreas + local_22c * 4);
        if (s_testNavID < 1) {
          local_221 = IsAreaTestable(pCVar2);
        }
        else {
          local_221 = s_testNavID == *(int *)(pCVar2 + 0x8c);
        }
        if (local_221 != 0) {
          if (local_188 < 1) {
LAB_0098e3d2:
            local_20c = 0;
          }
          else if (pCVar2 == (CNavArea *)*local_194) {
            local_20c = local_221;
          }
          else {
            iVar9 = 0;
            do {
              iVar9 = iVar9 + 1;
              if (iVar9 == local_188) goto LAB_0098e3d2;
            } while (pCVar2 != (CNavArea *)local_194[iVar9]);
            local_20c = (byte)~(byte)((uint)iVar9 >> 0x18) >> 7;
          }
          local_210 = 0;
          local_214 = pCVar2 + 0x58;
          do {
            if ((local_214 != (CNavArea *)0x0) && (piVar10 = *(int **)local_214, 0 < *piVar10)) {
              iVar9 = 0;
              do {
                pCVar3 = (CNavArea *)piVar10[iVar9 * 2 + 1];
                if (pCVar3 != (CNavArea *)0x0) {
                  if (local_188 < 1) {
LAB_0098e450:
                    local_1f0._0_1_ = 0;
                  }
                  else {
                    if (pCVar3 == (CNavArea *)*local_194) {
                      local_1f0._0_1_ = local_221;
                    }
                    else {
                      iVar6 = 0;
                      do {
                        iVar6 = iVar6 + 1;
                        if (iVar6 == local_188) goto LAB_0098e450;
                      } while (pCVar3 != (CNavArea *)local_194[iVar6]);
                      local_1f0._0_1_ = (byte)~(byte)((uint)iVar6 >> 0x18) >> 7;
                    }
                    if (((byte)local_1f0 != 0) && (local_20c != 0)) goto LAB_0098e7e8;
                  }
                  this = (CTraceFilterSimple *)local_180;
                  CTraceFilterSimple::CTraceFilterSimple
                            (this,(IHandleEntity *)0x0,8,(_func_bool_IHandleEntity_ptr_int *)0x0);
                  local_180[0] = &PTR_ShouldHitEntity_00ca1b68;
                  local_170 = 0xf;
                  if (local_20c == 0) {
                    local_1c0 = *(float *)(pCVar2 + 0x2c);
                    local_1bc = *(float *)(pCVar2 + 0x30);
                    local_1b8 = *(float *)(pCVar2 + 0x34) + 18.0;
                    /* try { // try from 0098ea5a to 0098f0e6 has its CatchHandler @ 0098e8a6 */
                    CNavArea::ComputePortal(pCVar2,pCVar3,local_210,&local_1cc,local_1e8);
                    local_1b4 = local_1cc;
                    local_1b0 = local_1c8;
                    local_1ac = local_1c4 + 18.0;
                    iVar6 = *(int *)(CSWTCH_1258 + local_210 * 4);
                    if (iVar6 == 1) {
                      local_1b4 = local_1cc + local_1d8;
                    }
                    else if (iVar6 < 2) {
                      if (iVar6 == 0) {
                        local_1b0 = local_1c8 - local_1d8;
                      }
                    }
                    else if (iVar6 == 2) {
                      local_1b0 = local_1c8 + local_1d8;
                    }
                    else if (iVar6 == 3) {
                      local_1b4 = local_1cc - local_1d8;
                    }
                    local_12c = 0;
                    local_15c = local_1b4 - local_1c0;
                    local_158 = local_1b0 - local_1bc;
                    local_154 = local_1ac - local_1b8;
                    local_13c = (local_1d8 - WalkableTraceMins) * 0.5;
                    local_14c = (local_1d8 + WalkableTraceMins) * 0.5;
                    local_127 = local_158 * local_158 + local_15c * local_15c +
                                local_154 * local_154 != 0.0;
                    local_138 = (local_1d4 - DAT_01016938) * 0.5;
                    local_16c = local_1c0 + local_14c;
                    local_14c = -local_14c;
                    local_134 = (local_1d0 - DAT_0101693c) * 0.5;
                    local_148 = (local_1d4 + DAT_01016938) * 0.5;
                    local_144 = (local_1d0 + DAT_0101693c) * 0.5;
                    local_168 = local_1bc + local_148;
                    local_148 = -local_148;
                    local_128 = local_138 * local_138 + local_13c * local_13c +
                                local_134 * local_134 < 1e-06;
                    local_164 = local_1b8 + local_144;
                    local_144 = -local_144;
                    pVVar14 = (Vector *)&local_16c;
                    fVar15 = 2.29743e-41;
                    pCVar16 = this;
                    pVVar17 = (Vector *)&local_70;
                    (**(code **)(*enginetrace + 0x14))(enginetrace);
                    if (*(int *)(r_visualizetraces._28_4_ + 0x30) != 0) {
                      pVVar14 = (Vector *)&local_64;
                      in_stack_fffffdc8 = 1.4013e-45;
                      pVVar17 = (Vector *)0x0;
                      pCVar16 = (CTraceFilterSimple *)0xff;
                      fVar15 = 3.57331e-43;
                      DebugDrawLine((Vector *)&local_70,pVVar14,0xff,0xff,0,true,-1.0);
                    }
                    DrawTroubleSweptHull
                              (pCVar2,(Vector *)&local_1c0,(Vector *)&local_1b4,(Vector *)&local_1d8
                               ,pVVar14,fVar15,(float)pCVar16,(float)pVVar17,in_stack_fffffdc8);
                    if ((local_39 != '\0') || (local_44 < 1.0)) {
                      local_1e4 = pCVar2;
                      if (*param_1 == (NavAreaCollector)0x0) {
                        iVar6 = *(int *)(param_1 + 0x10);
                      }
                      else {
                        iVar6 = *(int *)(param_1 + 0x10);
                        if (0 < iVar6) {
                          if (pCVar2 != (CNavArea *)**(int **)(param_1 + 4)) {
                            iVar8 = 0;
                            do {
                              iVar8 = iVar8 + 1;
                              if (iVar8 == iVar6) goto LAB_0098f15e;
                            } while (pCVar2 != (CNavArea *)(*(int **)(param_1 + 4))[iVar8]);
                            if (iVar8 < 0) goto LAB_0098f15e;
                          }
                          goto LAB_0098e49e;
                        }
                      }
LAB_0098f15e:
                      ppCVar7 = &local_1e4;
LAB_0098f057:
                      CUtlVector<CNavArea*,CUtlMemory<CNavArea*,int>>::InsertBefore
                                ((CUtlVector<CNavArea*,CUtlMemory<CNavArea*,int>> *)(param_1 + 4),
                                 iVar6,ppCVar7);
                    }
                    else {
                      CNavArea::ComputePortal(pCVar3,pCVar2,iVar6,&local_cc,local_1e8);
                      fVar4 = local_1b0;
                      fVar15 = local_1b4;
                      if (local_c4 + 18.0 < local_1c4) {
                        local_1c0 = local_1b4;
                        local_1bc = local_1b0;
                        local_1b8 = local_1ac;
                        if (local_210 == 2) {
                          fVar11 = local_1b0 + 32.0;
LAB_0098edd7:
                          local_108 = fVar11 - local_1b0;
                          fVar13 = 0.0;
                          local_10c = 0.0;
                          fVar12 = local_108 * local_108;
                          local_1b0 = fVar11;
                        }
                        else {
                          if (local_210 == 3) {
                            fVar11 = local_1b4 - 32.0;
                          }
                          else {
                            if (local_210 != 1) {
                              fVar11 = local_1b0 - 32.0;
                              goto LAB_0098edd7;
                            }
                            fVar11 = local_1b4 + 32.0;
                          }
                          local_10c = fVar11 - local_1b4;
                          fVar12 = 0.0;
                          local_108 = 0.0;
                          fVar13 = local_10c * local_10c;
                          local_1b4 = fVar11;
                        }
                        local_d7 = fVar12 + fVar13 != 0.0;
                        local_104 = 0;
                        local_dc = 0;
                        local_e4 = (local_1d0 - DAT_0101693c) * 0.5;
                        local_e8 = (local_1d4 - DAT_01016938) * 0.5;
                        local_ec = (local_1d8 - WalkableTraceMins) * 0.5;
                        local_f8 = (local_1d4 + DAT_01016938) * 0.5;
                        local_fc = (local_1d8 + WalkableTraceMins) * 0.5;
                        local_f4 = (local_1d0 + DAT_0101693c) * 0.5;
                        local_118 = fVar4 + local_f8;
                        local_f8 = -local_f8;
                        local_11c = fVar15 + local_fc;
                        local_fc = -local_fc;
                        local_114 = local_1ac + local_f4;
                        local_f4 = -local_f4;
                        local_d8 = local_e4 * local_e4 + local_ec * local_ec + local_e8 * local_e8 <
                                   1e-06;
                        pVVar14 = (Vector *)&local_11c;
                        fVar15 = 2.29743e-41;
                        pCVar16 = this;
                        pVVar17 = (Vector *)&local_70;
                        (**(code **)(*enginetrace + 0x14))(enginetrace);
                        if (*(int *)(r_visualizetraces._28_4_ + 0x30) != 0) {
                          pVVar14 = (Vector *)&local_64;
                          in_stack_fffffdc8 = 1.4013e-45;
                          pVVar17 = (Vector *)0x0;
                          pCVar16 = (CTraceFilterSimple *)0xff;
                          fVar15 = 3.57331e-43;
                          DebugDrawLine((Vector *)&local_70,pVVar14,0xff,0xff,0,true,-1.0);
                        }
                        DrawTroubleSweptHull
                                  (pCVar2,(Vector *)&local_1c0,(Vector *)&local_1b4,
                                   (Vector *)&local_1d8,pVVar14,fVar15,(float)pCVar16,(float)pVVar17
                                   ,in_stack_fffffdc8);
                        if ((local_39 != '\0') || (local_44 < 1.0)) {
                          local_1e0 = pCVar2;
                          if (*param_1 == (NavAreaCollector)0x0) {
                            iVar6 = *(int *)(param_1 + 0x10);
                          }
                          else {
                            iVar6 = *(int *)(param_1 + 0x10);
                            if (0 < iVar6) {
                              if (pCVar2 != (CNavArea *)**(int **)(param_1 + 4)) {
                                iVar8 = 0;
                                do {
                                  iVar8 = iVar8 + 1;
                                  if (iVar8 == iVar6) goto LAB_0098f051;
                                } while (pCVar2 != (CNavArea *)(*(int **)(param_1 + 4))[iVar8]);
                                if (iVar8 < 0) goto LAB_0098f051;
                              }
                              goto LAB_0098e49e;
                            }
                          }
LAB_0098f051:
                          ppCVar7 = &local_1e0;
                          goto LAB_0098f057;
                        }
                      }
                    }
                  }
LAB_0098e49e:
                  if (((byte)local_1f0 == 0) &&
                     (*(int *)(nav_trouble_walkable_backtrace._28_4_ + 0x30) != 0)) {
                    local_16c = *(float *)(pCVar3 + 0x2c);
                    local_168 = *(float *)(pCVar3 + 0x30);
                    local_164 = *(float *)(pCVar3 + 0x34) + 18.0;
                    CNavArea::ComputePortal
                              (pCVar3,pCVar2,*(undefined4 *)(CSWTCH_1258 + local_210 * 4),&local_1cc
                               ,local_1e8);
                    local_11c = local_1cc;
                    local_118 = local_1c8;
                    local_114 = local_1c4 + 18.0;
                    if (local_210 == 2) {
                      local_118 = local_1c8 + local_1d8;
                    }
                    else if (local_210 == 3) {
                      local_11c = local_1cc - local_1d8;
                    }
                    else if (local_210 == 1) {
                      local_11c = local_1cc + local_1d8;
                    }
                    else {
                      local_118 = local_1c8 - local_1d8;
                    }
                    local_8c = 0;
                    local_b8 = local_118 - local_168;
                    local_bc = local_11c - local_16c;
                    local_b4 = local_114 - local_164;
                    local_87 = local_b8 * local_b8 + local_bc * local_bc + local_b4 * local_b4 !=
                               0.0;
                    local_98 = (local_1d4 - DAT_01016938) * 0.5;
                    local_94 = (local_1d0 - DAT_0101693c) * 0.5;
                    local_9c = (local_1d8 - WalkableTraceMins) * 0.5;
                    local_a8 = (local_1d4 + DAT_01016938) * 0.5;
                    local_ac = (local_1d8 + WalkableTraceMins) * 0.5;
                    local_a4 = (local_1d0 + DAT_0101693c) * 0.5;
                    local_c8 = local_168 + local_a8;
                    local_a8 = -local_a8;
                    local_cc = local_16c + local_ac;
                    local_ac = -local_ac;
                    local_c4 = local_164 + local_a4;
                    local_88 = local_94 * local_94 + local_98 * local_98 + local_9c * local_9c <
                               1e-06;
                    local_a4 = -local_a4;
                    pVVar14 = (Vector *)&local_cc;
                    fVar15 = 2.29743e-41;
                    pVVar17 = (Vector *)&local_70;
                    (**(code **)(*enginetrace + 0x14))(enginetrace);
                    if (*(int *)(r_visualizetraces._28_4_ + 0x30) != 0) {
                      pVVar14 = (Vector *)&local_64;
                      in_stack_fffffdc8 = 1.4013e-45;
                      pVVar17 = (Vector *)0x0;
                      this = (CTraceFilterSimple *)0xff;
                      fVar15 = 3.57331e-43;
                      DebugDrawLine((Vector *)&local_70,pVVar14,0xff,0xff,0,true,-1.0);
                    }
                    DrawTroubleSweptHull
                              (pCVar2,(Vector *)&local_16c,(Vector *)&local_11c,(Vector *)&local_1d8
                               ,pVVar14,fVar15,(float)this,(float)pVVar17,in_stack_fffffdc8);
                    if ((local_39 != '\0') || (local_44 < 1.0)) {
                      local_1dc = pCVar2;
                      if (*param_1 == (NavAreaCollector)0x0) {
                        iVar6 = *(int *)(param_1 + 0x10);
                      }
                      else {
                        iVar6 = *(int *)(param_1 + 0x10);
                        if (0 < iVar6) {
                          if (pCVar2 != (CNavArea *)**(int **)(param_1 + 4)) {
                            iVar8 = 0;
                            do {
                              iVar8 = iVar8 + 1;
                              if (iVar8 == iVar6) goto LAB_0098f0c8;
                            } while (pCVar2 != (CNavArea *)(*(int **)(param_1 + 4))[iVar8]);
                            if (iVar8 < 0) goto LAB_0098f0c8;
                          }
                          goto LAB_0098e7e0;
                        }
                      }
LAB_0098f0c8:
                      CUtlVector<CNavArea*,CUtlMemory<CNavArea*,int>>::InsertBefore
                                ((CUtlVector<CNavArea*,CUtlMemory<CNavArea*,int>> *)(param_1 + 4),
                                 iVar6,&local_1dc);
                    }
                  }
LAB_0098e7e0:
                  piVar10 = *(int **)local_214;
                }
LAB_0098e7e8:
                iVar9 = iVar9 + 1;
              } while (iVar9 < *piVar10);
            }
            local_210 = local_210 + 1;
            local_214 = local_214 + 4;
          } while (local_210 != 4);
        }
        local_22c = local_22c + 1;
      } while (local_22c < DAT_00fe6000);
    }
  }
  local_220 = (CUtlMemory<CNavArea*,int> *)&local_194;
  local_188 = 0;
  CUtlMemory<CNavArea*,int>::Purge(local_220);
  local_184 = local_194;
  CUtlMemory<CNavArea*,int>::Purge(local_220);
  local_1a8[3] = 0;
  CUtlMemory<CBaseEntity*,int>::Purge((CUtlMemory<CBaseEntity*,int> *)local_1a8);
  local_1a8[4] = local_1a8[0];
  CUtlMemory<CBaseEntity*,int>::Purge((CUtlMemory<CBaseEntity*,int> *)local_1a8);
  if (iVar1 < *(int *)(param_1 + 0x10)) {
    Warning("%s found %d areas\n","Areas with non-walkable connections check",
            *(int *)(param_1 + 0x10) - iVar1);
  }
  else {
    Msg("%s passed\n","Areas with non-walkable connections check");
  }
  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)