L L4D2node

TerrorNavMesh::PostCustomAnalysis

0x00982670 · 2148 bytes · __thiscall

_ZN13TerrorNavMesh18PostCustomAnalysisEv

Decompiled

undefined (1 param)

/* TerrorNavMesh::PostCustomAnalysis() */

void __thiscall TerrorNavMesh::PostCustomAnalysis(TerrorNavMesh *this)

{
  TerrorNavArea *this_00;
  char cVar1;
  int iVar2;
  int *piVar3;
  int *piVar4;
  CNavArea *pCVar5;
  int iVar6;
  int iVar7;
  CBaseEntity *pCVar8;
  int iVar9;
  int iVar10;
  TerrorNavArea *pTVar11;
  CSurvivorRescue *this_01;
  TerrorNavArea *pTVar12;
  float fVar13;
  int local_7c;
  int local_78;
  int local_74;
  int local_70;
  CBaseEntity *local_6c;
  TerrorNavArea *local_68;
  int local_64;
  TerrorNavArea *local_60;
  float local_5c;
  float local_58;
  float local_54;
  float local_50;
  float local_4c;
  float local_48;
  int *local_44;
  float local_40;
  float local_3c;
  float local_38;
  int *local_34;
  float local_30 [8];
  
  iVar9 = DAT_00fe6000;
  if (DAT_00fe6000 < 1) {
    local_74 = 999999999;
    local_78 = 0;
    local_70 = 0;
  }
  else {
    local_7c = 0;
    local_74 = 999999999;
    local_78 = 0;
    local_70 = 0;
    do {
      this_00 = (TerrorNavArea *)TheNavAreas[local_7c];
      iVar10 = *(int *)(this_00 + 0x13c);
      local_70 = local_70 + iVar10;
      if (iVar10 < local_74) {
        local_74 = iVar10;
      }
      if (iVar10 <= local_78) {
        iVar10 = local_78;
      }
      if (this_00[0x144] == (TerrorNavArea)0x0) {
        pTVar12 = (TerrorNavArea *)0x0;
        local_44 = (int *)0x0;
        local_40 = 0.0;
        local_3c = 0.0;
        local_38 = 0.0;
        local_68 = this_00;
        do {
          piVar3 = *(int **)(local_68 + 0x58);
          iVar9 = *piVar3;
          if (0 < iVar9) {
            iVar7 = 0;
            iVar6 = iVar9;
            do {
              if (iVar6 < 1) {
LAB_00982743:
                local_60 = (TerrorNavArea *)0x0;
                pTVar11 = pTRam00000130;
                if (pTRam00000130 == (TerrorNavArea *)0x0) goto LAB_00982757;
LAB_00982752:
                local_60 = pTVar11;
                if (this_00 != pTVar11) goto LAB_00982757;
              }
              else {
                iVar2 = 0;
                if (iVar7 != 0) {
                  do {
                    iVar2 = iVar2 + 1;
                    if (iVar2 == iVar6) goto LAB_00982743;
                  } while (iVar2 != iVar7);
                }
                local_60 = (TerrorNavArea *)piVar3[iVar2 * 2 + 1];
                pTVar11 = *(TerrorNavArea **)(local_60 + 0x130);
                if (*(TerrorNavArea **)(local_60 + 0x130) != (TerrorNavArea *)0x0)
                goto LAB_00982752;
LAB_00982757:
                    /* try { // try from 00982764 to 009827f3 has its CatchHandler @ 00982b9b */
                piVar3 = (int *)TerrorNavArea::ComputeVisibilityDelta(this_00,local_60);
                if (pTVar12 == (TerrorNavArea *)0x0) {
                  iVar6 = piVar3[2];
                }
                else {
                  iVar6 = piVar3[2];
                  if ((int)local_3c <= iVar6) goto LAB_00982787;
                }
                local_3c = 0.0;
                pTVar12 = local_60;
                if (iVar6 != 0) {
                  local_3c = 0.0;
                  CUtlVector<TerrorNavArea::AreaBindInfo,CUtlMemoryConservative<TerrorNavArea::AreaBindInfo>>
                  ::GrowVector((CUtlVector<TerrorNavArea::AreaBindInfo,CUtlMemoryConservative<TerrorNavArea::AreaBindInfo>>
                                *)&local_44,iVar6);
                  CUtlVector<TerrorNavArea::AreaBindInfo,CUtlMemoryConservative<TerrorNavArea::AreaBindInfo>>
                  ::ShiftElementsRight
                            ((CUtlVector<TerrorNavArea::AreaBindInfo,CUtlMemoryConservative<TerrorNavArea::AreaBindInfo>>
                              *)&local_44,0,iVar6);
                  if (0 < iVar6) {
                    iVar2 = 0;
                    do {
                      if ((undefined2 *)((int)local_44 + iVar2) != (undefined2 *)0x0) {
                        *(undefined2 *)((int)local_44 + iVar2) = 0;
                      }
                      iVar2 = iVar2 + 2;
                    } while (iVar2 != iVar6 * 2);
                    iVar2 = 0;
                    do {
                      *(undefined2 *)((int)local_44 + iVar2) = *(undefined2 *)(*piVar3 + iVar2);
                      iVar2 = iVar2 + 2;
                    } while (iVar2 != iVar6 * 2);
                  }
                }
              }
LAB_00982787:
              iVar7 = iVar7 + 1;
              if (iVar7 == iVar9) break;
              piVar3 = *(int **)(local_68 + 0x58);
              iVar6 = *piVar3;
            } while( true );
          }
          fVar13 = local_3c;
          local_68 = local_68 + 4;
        } while (local_68 != this_00 + 0x10);
        if (((pTVar12 == (TerrorNavArea *)0x0) ||
            (*(int *)(NavMaxVisDeltaListLength._28_4_ + 0x30) < (int)local_3c)) ||
           (this_00 == pTVar12)) {
          *(undefined4 *)(this_00 + 0x130) = 0;
        }
        else {
          *(TerrorNavArea **)(this_00 + 0x130) = pTVar12;
          *(undefined4 *)(this_00 + 0x13c) = 0;
          if (local_3c != 0.0) {
            CUtlVector<TerrorNavArea::AreaBindInfo,CUtlMemoryConservative<TerrorNavArea::AreaBindInfo>>
            ::GrowVector((CUtlVector<TerrorNavArea::AreaBindInfo,CUtlMemoryConservative<TerrorNavArea::AreaBindInfo>>
                          *)(this_00 + 0x134),(int)local_3c);
                    /* try { // try from 00982b28 to 00982b2c has its CatchHandler @ 00982b9b */
            CUtlVector<TerrorNavArea::AreaBindInfo,CUtlMemoryConservative<TerrorNavArea::AreaBindInfo>>
            ::ShiftElementsRight
                      ((CUtlVector<TerrorNavArea::AreaBindInfo,CUtlMemoryConservative<TerrorNavArea::AreaBindInfo>>
                        *)(this_00 + 0x134),0,(int)fVar13);
            if (0 < (int)fVar13) {
              iVar9 = *(int *)(this_00 + 0x134);
              iVar6 = 0;
              do {
                if ((undefined2 *)(iVar9 + iVar6) != (undefined2 *)0x0) {
                  *(undefined2 *)(iVar9 + iVar6) = 0;
                  iVar9 = *(int *)(this_00 + 0x134);
                }
                iVar6 = iVar6 + 2;
              } while (iVar6 != (int)fVar13 * 2);
              iVar6 = 0;
              while( true ) {
                *(undefined2 *)(iVar9 + iVar6) = *(undefined2 *)((int)local_44 + iVar6);
                iVar6 = iVar6 + 2;
                if ((int)fVar13 * 2 == iVar6) break;
                iVar9 = *(int *)(this_00 + 0x134);
              }
            }
          }
          pTVar12[0x144] = (TerrorNavArea)0x1;
        }
        local_3c = 0.0;
        free(local_44);
        iVar9 = DAT_00fe6000;
      }
      local_7c = local_7c + 1;
      local_78 = iVar10;
    } while (local_7c < iVar9);
  }
  if (iVar9 != 0) {
    local_70 = local_70 / iVar9;
  }
  pCVar8 = (CBaseEntity *)0x0;
  Msg("NavMesh Visibility List Lengths:  min = %d, avg = %d, max = %d\n",local_74,local_70,local_78)
  ;
  while (pCVar8 = (CBaseEntity *)
                  CGlobalEntityList::FindEntityByClassname
                            ((CGlobalEntityList *)gEntList,pCVar8,"func_nav_attribute_region"),
        pCVar8 != (CBaseEntity *)0x0) {
    local_44 = (int *)0x0;
    local_38 = -NAN;
    local_34 = (int *)0x0;
    (**(code **)(*(int *)pCVar8 + 0xb4))(pCVar8,"ApplyNavAttributes",0,0,&local_44,0);
  }
  pCVar8 = (CBaseEntity *)0x0;
  while (pCVar8 = (CBaseEntity *)
                  CGlobalEntityList::FindEntityByClassname
                            ((CGlobalEntityList *)gEntList,pCVar8,"point_nav_attribute_region"),
        pCVar8 != (CBaseEntity *)0x0) {
    local_44 = (int *)0x0;
    local_38 = -NAN;
    local_34 = (int *)0x0;
    (**(code **)(*(int *)pCVar8 + 0xb4))(pCVar8,"ApplyNavAttributes",0,0,&local_44,0);
  }
  piVar3 = TheNavAreas + DAT_00fe6000;
  piVar4 = TheNavAreas;
  if (0 < DAT_00fe6000) {
    do {
      iVar9 = *piVar4;
      piVar4 = piVar4 + 1;
      *(uint *)(iVar9 + 300) = *(uint *)(iVar9 + 300) & 0xfffeffff;
    } while (piVar4 != piVar3);
  }
  this_01 = (CSurvivorRescue *)0x0;
  while (this_01 = (CSurvivorRescue *)
                   CGlobalEntityList::FindEntityByClassname
                             ((CGlobalEntityList *)gEntList,(CBaseEntity *)this_01,
                              "info_survivor_rescue"), this_01 != (CSurvivorRescue *)0x0) {
    local_44 = (int *)0x0;
    local_40 = 0.0;
    local_3c = 0.0;
    local_38 = 0.0;
    local_34 = (int *)0x0;
    local_30[0] = 0.0;
    local_30[1] = 0.0;
    local_30[2] = 0.0;
    local_30[3] = 0.0;
    local_30[4] = 0.0;
                    /* try { // try from 00982a5c to 00982a8b has its CatchHandler @ 00982bb7 */
    pCVar5 = (CNavArea *)CSurvivorRescue::GetRescueNavArea(this_01);
    SearchSurroundingAreas<RescueAreaCollector>
              (pCVar5,(Vector *)(pCVar5 + 0x2c),(RescueAreaCollector *)&local_44,300.0,0,-1);
    if (0 < (int)local_38) {
      piVar3 = local_44;
      do {
        iVar9 = *piVar3;
        piVar3 = piVar3 + 1;
        *(uint *)(iVar9 + 300) = *(uint *)(iVar9 + 300) | 0x10000;
      } while (piVar3 != local_44 + (int)local_38);
    }
    local_30[3] = 0.0;
    CUtlMemory<CBasePropDoor*,int>::Purge((CUtlMemory<CBasePropDoor*,int> *)local_30);
    local_30[4] = local_30[0];
    CUtlMemory<CBasePropDoor*,int>::Purge((CUtlMemory<CBasePropDoor*,int> *)local_30);
    local_38 = 0.0;
    CUtlMemory<TerrorNavArea*,int>::Purge((CUtlMemory<TerrorNavArea*,int> *)&local_44);
    local_34 = local_44;
    CUtlMemory<TerrorNavArea*,int>::Purge((CUtlMemory<TerrorNavArea*,int> *)&local_44);
  }
  iVar9 = 0;
  if (0 < DAT_00fe6000) {
    do {
      pCVar5 = (CNavArea *)TheNavAreas[iVar9];
      cVar1 = CNavArea::HasNodes(pCVar5);
      if (cVar1 != '\0') {
        *(uint *)(pCVar5 + 300) = *(uint *)(pCVar5 + 300) & 0xfffeffff;
      }
      iVar9 = iVar9 + 1;
      CUtlVector<TerrorNavArea::AreaBindInfo,CUtlMemoryConservative<TerrorNavArea::AreaBindInfo>>::
      Sort((CUtlVector<TerrorNavArea::AreaBindInfo,CUtlMemoryConservative<TerrorNavArea::AreaBindInfo>>
            *)(pCVar5 + 0x134),AreaSortFunc);
    } while (iVar9 < DAT_00fe6000);
  }
  local_6c = (CBaseEntity *)0x0;
  do {
    do {
      do {
        local_6c = (CBaseEntity *)
                   CGlobalEntityList::FindEntityByClassname
                             ((CGlobalEntityList *)gEntList,local_6c,"info_changelevel");
        if (local_6c == (CBaseEntity *)0x0) {
          return;
        }
        CCollisionProperty::CollisionAABBToWorldAABB
                  ((CCollisionProperty *)(local_6c + 0x194),(Vector *)(local_6c + 0x19c),
                   (Vector *)(local_6c + 0x1a8),(Vector *)&local_5c,(Vector *)&local_50);
      } while (*(int *)(this + 0x18) == 0);
      if ((CNavMesh::ForAllAreasOverlappingExtent<CheckpointSetter>(CheckpointSetter&,Extent_const&)
           ::searchMarker == '\0') &&
         (iVar9 = __cxa_guard_acquire(&CNavMesh::
                                       ForAllAreasOverlappingExtent<CheckpointSetter>(CheckpointSetter&,Extent_const&)
                                       ::searchMarker), iVar9 != 0)) {
                    /* try { // try from 00982f0b to 00982f0f has its CatchHandler @ 00982f6b */
        CNavMesh::ForAllAreasOverlappingExtent<CheckpointSetter>(CheckpointSetter&,Extent_const&)::
        searchMarker = RandomInt(0,0x100000);
        __cxa_guard_release(&CNavMesh::
                             ForAllAreasOverlappingExtent<CheckpointSetter>(CheckpointSetter&,Extent_const&)
                             ::searchMarker);
      }
      iVar9 = CNavMesh::
              ForAllAreasOverlappingExtent<CheckpointSetter>(CheckpointSetter&,Extent_const&)::
              searchMarker + 1;
      if (CNavMesh::ForAllAreasOverlappingExtent<CheckpointSetter>(CheckpointSetter&,Extent_const&)
          ::searchMarker + 1 == 0) {
        iVar9 = CNavMesh::
                ForAllAreasOverlappingExtent<CheckpointSetter>(CheckpointSetter&,Extent_const&)::
                searchMarker + 2;
      }
      CNavMesh::ForAllAreasOverlappingExtent<CheckpointSetter>(CheckpointSetter&,Extent_const&)::
      searchMarker = iVar9;
      fVar13 = 1.0 / *(float *)(this + 0x20);
      iVar9 = (int)((local_5c - *(float *)(this + 0x2c)) * fVar13);
      if (iVar9 < 0) {
        local_64 = 0;
      }
      else {
        local_64 = *(int *)(this + 0x24) + -1;
        if (iVar9 < *(int *)(this + 0x24)) {
          local_64 = iVar9;
        }
      }
      iVar9 = (int)((local_50 - *(float *)(this + 0x2c)) * fVar13);
      if (iVar9 < 0) {
        local_70 = 0;
      }
      else {
        local_70 = *(int *)(this + 0x24) + -1;
        if (iVar9 < *(int *)(this + 0x24)) {
          local_70 = iVar9;
        }
      }
      iVar9 = (int)((local_58 - *(float *)(this + 0x30)) * fVar13);
      if (iVar9 < 0) {
        local_74 = 0;
      }
      else {
        local_74 = *(int *)(this + 0x28) + -1;
        if (iVar9 < *(int *)(this + 0x28)) {
          local_74 = iVar9;
        }
      }
      iVar9 = (int)((local_4c - *(float *)(this + 0x30)) * fVar13);
      if (iVar9 < 0) {
        local_68 = (TerrorNavArea *)0x0;
      }
      else {
        local_68 = (TerrorNavArea *)(*(int *)(this + 0x28) + -1);
        if (iVar9 < *(int *)(this + 0x28)) {
          local_68 = (TerrorNavArea *)iVar9;
        }
      }
    } while (local_70 < local_64);
    do {
      if (local_74 <= (int)local_68) {
        iVar9 = local_74 * *(int *)(this + 0x24) + local_64;
        if (*(int *)(this + 0x18) <= iVar9) {
LAB_00982e82:
          if (CNavMesh::
              ForAllAreasOverlappingExtent<CheckpointSetter>(CheckpointSetter&,Extent_const&)::
              __executeCount < 10) {
            CNavMesh::
            ForAllAreasOverlappingExtent<CheckpointSetter>(CheckpointSetter&,Extent_const&)::
            __executeCount =
                 CNavMesh::
                 ForAllAreasOverlappingExtent<CheckpointSetter>(CheckpointSetter&,Extent_const&)::
                 __executeCount + 1;
            Warning("** Walked off of the CNavMesh::m_grid in ForAllAreasOverlappingExtent()\n");
          }
          break;
        }
        local_60 = (TerrorNavArea *)local_74;
        while( true ) {
          iVar10 = 0;
          piVar3 = (int *)(*(int *)(this + 0xc) + iVar9 * 0x14);
          if (0 < piVar3[3]) {
            do {
              pCVar5 = *(CNavArea **)(*piVar3 + iVar10 * 4);
              if (*(int *)(pCVar5 + 0x74) !=
                  CNavMesh::
                  ForAllAreasOverlappingExtent<CheckpointSetter>(CheckpointSetter&,Extent_const&)::
                  searchMarker) {
                *(int *)(pCVar5 + 0x74) =
                     CNavMesh::
                     ForAllAreasOverlappingExtent<CheckpointSetter>(CheckpointSetter&,Extent_const&)
                     ::searchMarker;
                CNavArea::GetExtent(pCVar5,(Extent *)&local_44);
                if ((((local_5c <= local_38) && ((float)local_44 <= local_50)) &&
                    ((local_58 <= (float)local_34 &&
                     (((local_40 <= local_4c && (local_54 <= local_30[0])) && (local_3c <= local_48)
                      ))))) && (cVar1 = CNavArea::HasNodes(pCVar5), cVar1 != '\0')) {
                  *(uint *)(pCVar5 + 300) = *(uint *)(pCVar5 + 300) | 0x800;
                }
              }
              iVar10 = iVar10 + 1;
            } while (iVar10 < piVar3[3]);
          }
          local_60 = (TerrorNavArea *)((int)local_60 + 1);
          if ((int)local_68 < (int)local_60) break;
          iVar9 = (int)local_60 * *(int *)(this + 0x24) + local_64;
          if (*(int *)(this + 0x18) <= iVar9) goto LAB_00982e82;
        }
      }
      local_64 = local_64 + 1;
    } while (local_64 <= local_70);
  } while( true );
}

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)