L L4D2node

CFuncNavBlocker::BlockNav

0x00717670 · 815 bytes · __thiscall

_ZN15CFuncNavBlocker8BlockNavEv

Decompiled

undefined (1 param)

/* CFuncNavBlocker::BlockNav() */

void __thiscall CFuncNavBlocker::BlockNav(CFuncNavBlocker *this)

{
  int *piVar1;
  CNavArea *this_00;
  int iVar2;
  int iVar3;
  int iVar4;
  float fVar5;
  int local_64;
  int local_60;
  int local_5c;
  int local_58;
  int local_50;
  float local_4c;
  float local_48;
  float local_44;
  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;
  
  if (*(int *)(this + 0x45c) == -1) {
    this[0x458] = (CFuncNavBlocker)0x1;
    this[0x459] = (CFuncNavBlocker)0x1;
  }
  else {
    this[*(int *)(this + 0x45c) % 2 + 0x458] = (CFuncNavBlocker)0x1;
  }
  (**(code **)(*(int *)(this + 0x194) + 0x3c))(this + 0x194,&local_4c,&local_40);
  iVar2 = TheNavMesh;
  if (*(int *)(TheNavMesh + 0x18) != 0) {
    if ((CNavMesh::ForAllAreasOverlappingExtent<CFuncNavBlocker>(CFuncNavBlocker&,Extent_const&)::
         searchMarker == '\0') &&
       (iVar3 = __cxa_guard_acquire(&CNavMesh::
                                     ForAllAreasOverlappingExtent<CFuncNavBlocker>(CFuncNavBlocker&,Extent_const&)
                                     ::searchMarker), iVar3 != 0)) {
                    /* try { // try from 00717939 to 0071793d has its CatchHandler @ 007179a0 */
      CNavMesh::ForAllAreasOverlappingExtent<CFuncNavBlocker>(CFuncNavBlocker&,Extent_const&)::
      searchMarker = RandomInt(0,0x100000);
      __cxa_guard_release(&CNavMesh::
                           ForAllAreasOverlappingExtent<CFuncNavBlocker>(CFuncNavBlocker&,Extent_const&)
                           ::searchMarker);
    }
    iVar3 = CNavMesh::ForAllAreasOverlappingExtent<CFuncNavBlocker>(CFuncNavBlocker&,Extent_const&)
            ::searchMarker + 1;
    if (CNavMesh::ForAllAreasOverlappingExtent<CFuncNavBlocker>(CFuncNavBlocker&,Extent_const&)::
        searchMarker + 1 == 0) {
      iVar3 = CNavMesh::
              ForAllAreasOverlappingExtent<CFuncNavBlocker>(CFuncNavBlocker&,Extent_const&)::
              searchMarker + 2;
    }
    CNavMesh::ForAllAreasOverlappingExtent<CFuncNavBlocker>(CFuncNavBlocker&,Extent_const&)::
    searchMarker = iVar3;
    fVar5 = 1.0 / *(float *)(iVar2 + 0x20);
    iVar3 = (int)((local_4c - *(float *)(iVar2 + 0x2c)) * fVar5);
    if (iVar3 < 0) {
      local_58 = 0;
    }
    else {
      local_58 = *(int *)(iVar2 + 0x24) + -1;
      if (iVar3 < *(int *)(iVar2 + 0x24)) {
        local_58 = iVar3;
      }
    }
    iVar3 = (int)((local_40 - *(float *)(iVar2 + 0x2c)) * fVar5);
    if (iVar3 < 0) {
      local_60 = 0;
    }
    else {
      local_60 = *(int *)(iVar2 + 0x24) + -1;
      if (iVar3 < *(int *)(iVar2 + 0x24)) {
        local_60 = iVar3;
      }
    }
    iVar3 = (int)((local_48 - *(float *)(iVar2 + 0x30)) * fVar5);
    if (iVar3 < 0) {
      local_64 = 0;
    }
    else {
      local_64 = *(int *)(iVar2 + 0x28) + -1;
      if (iVar3 < *(int *)(iVar2 + 0x28)) {
        local_64 = iVar3;
      }
    }
    iVar3 = (int)((local_3c - *(float *)(iVar2 + 0x30)) * fVar5);
    if (iVar3 < 0) {
      local_5c = 0;
    }
    else {
      local_5c = *(int *)(iVar2 + 0x28) + -1;
      if (iVar3 < *(int *)(iVar2 + 0x28)) {
        local_5c = iVar3;
      }
    }
    for (; local_58 <= local_60; local_58 = local_58 + 1) {
      if (local_64 <= local_5c) {
        iVar3 = local_64 * *(int *)(iVar2 + 0x24) + local_58;
        if (*(int *)(iVar2 + 0x18) <= iVar3) {
LAB_007178ce:
          if (9 < CNavMesh::
                  ForAllAreasOverlappingExtent<CFuncNavBlocker>(CFuncNavBlocker&,Extent_const&)::
                  __executeCount) {
            return;
          }
          CNavMesh::ForAllAreasOverlappingExtent<CFuncNavBlocker>(CFuncNavBlocker&,Extent_const&)::
          __executeCount =
               CNavMesh::
               ForAllAreasOverlappingExtent<CFuncNavBlocker>(CFuncNavBlocker&,Extent_const&)::
               __executeCount + 1;
          Warning("** Walked off of the CNavMesh::m_grid in ForAllAreasOverlappingExtent()\n");
          return;
        }
        local_50 = local_64;
        while( true ) {
          iVar4 = 0;
          piVar1 = (int *)(*(int *)(iVar2 + 0xc) + iVar3 * 0x14);
          if (0 < piVar1[3]) {
            do {
              this_00 = *(CNavArea **)(*piVar1 + iVar4 * 4);
              if (*(int *)(this_00 + 0x74) !=
                  CNavMesh::
                  ForAllAreasOverlappingExtent<CFuncNavBlocker>(CFuncNavBlocker&,Extent_const&)::
                  searchMarker) {
                *(int *)(this_00 + 0x74) =
                     CNavMesh::
                     ForAllAreasOverlappingExtent<CFuncNavBlocker>(CFuncNavBlocker&,Extent_const&)::
                     searchMarker;
                CNavArea::GetExtent(this_00,(Extent *)&local_34);
                if ((((local_4c <= local_28) && (local_34 <= local_40)) && (local_48 <= local_24))
                   && (((local_30 <= local_3c && (local_44 <= local_20)) && (local_2c <= local_38)))
                   ) {
                  CNavArea::MarkAsBlocked(this_00,*(int *)(this + 0x45c),(CBaseEntity *)this,true);
                }
              }
              iVar4 = iVar4 + 1;
            } while (iVar4 < piVar1[3]);
          }
          local_50 = local_50 + 1;
          if (local_5c < local_50) break;
          iVar3 = local_50 * *(int *)(iVar2 + 0x24) + local_58;
          if (*(int *)(iVar2 + 0x18) <= iVar3) goto LAB_007178ce;
        }
      }
    }
  }
  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)