L L4D2node

CNavMesh::FixCornerOnCornerAreas

0x0072a110 · 1997 bytes · __thiscall

_ZN8CNavMesh22FixCornerOnCornerAreasEv

Decompiled

undefined (1 param)

/* CNavMesh::FixCornerOnCornerAreas() */

void __thiscall CNavMesh::FixCornerOnCornerAreas(CNavMesh *this)

{
  uint uVar1;
  CNavArea *pCVar2;
  bool bVar3;
  char cVar4;
  CNavArea *pCVar5;
  int iVar6;
  undefined4 uVar7;
  CNavArea *pCVar8;
  uint uVar9;
  uint uVar10;
  bool bVar11;
  float fVar12;
  float fVar13;
  float fVar14;
  float local_144;
  float local_140;
  uint local_12c;
  int local_128;
  float local_124;
  float local_120;
  CNavArea *local_110;
  uint local_10c;
  uint local_108;
  uint local_104;
  uint local_100;
  float local_fc;
  float local_f8;
  float local_f4;
  float local_f0;
  float local_ec;
  float local_e8;
  Vector local_e4 [12];
  Vector local_d8 [12];
  Vector local_cc [12];
  Vector local_c0 [12];
  undefined **local_b4 [4];
  undefined4 local_a4;
  float local_a0;
  float local_9c;
  float local_98;
  float local_94;
  float local_90;
  float local_8c;
  float local_88;
  float local_84;
  float local_80;
  float local_7c;
  float local_78;
  float local_74;
  CGameTrace local_70 [12];
  float local_64;
  float local_60;
  float local_5c;
  
  local_128 = 0;
  if (0 < DAT_00fe6000) {
    do {
      uVar10 = 0;
      pCVar2 = *(CNavArea **)(TheNavAreas + local_128 * 4);
      pCVar8 = pCVar2;
      do {
        local_10c = uVar10 + 3 & 3;
        if ((((**(int **)(pCVar2 + local_10c * 4 + 0x58) < 1) && (**(int **)(pCVar8 + 0x58) < 1)) &&
            (**(int **)(pCVar2 + local_10c * 4 + 0x114) < 1)) && (**(int **)(pCVar8 + 0x114) < 1)) {
          if (uVar10 == 2) {
            local_fc = *(float *)(pCVar2 + 0x10);
            local_f8 = *(float *)(pCVar2 + 0x14);
            local_f4 = *(float *)(pCVar2 + 0x18);
          }
          else if (uVar10 == 3) {
            local_fc = *(float *)(pCVar2 + 4);
            local_f8 = *(float *)(pCVar2 + 0x14);
            local_f4 = *(float *)(pCVar2 + 0x28);
          }
          else if (uVar10 == 1) {
            local_f8 = *(float *)(pCVar2 + 8);
            local_fc = *(float *)(pCVar2 + 0x10);
            local_f4 = *(float *)(pCVar2 + 0x24);
          }
          else {
            local_fc = *(float *)(pCVar2 + 4);
            local_f8 = *(float *)(pCVar2 + 8);
            local_f4 = *(float *)(pCVar2 + 0xc);
          }
          local_12c = *(uint *)(CSWTCH_1516 + local_10c * 4);
          local_100 = (&CSWTCH_1518)[uVar10];
          uVar1 = uVar10 + 2 & 3;
          iVar6 = local_10c - 1;
          bVar3 = false;
          bVar11 = false;
          uVar9 = local_10c;
          local_108 = uVar10;
          local_104 = local_12c;
          if (local_10c == 1) goto LAB_0072a370;
LAB_0072a27e:
          if (bVar11 || SBORROW4(uVar9,1) != iVar6 < 0) {
            if (uVar9 == 0) {
              local_124 = 0.0;
              local_120 = -12.5;
              goto LAB_0072a2b1;
            }
          }
          else {
            if (uVar9 == 2) {
              local_124 = 0.0;
              local_120 = 12.5;
              goto LAB_0072a2b1;
            }
            if (uVar9 == 3) {
              local_120 = 0.0;
              local_124 = -12.5;
              goto LAB_0072a2b1;
            }
          }
          local_120 = local_120 * 12.5;
          local_124 = local_124 * 12.5;
LAB_0072a2b1:
          do {
            local_e8 = local_f4;
            local_f0 = local_fc + local_124;
            local_ec = local_f8 + local_120;
            pCVar5 = (CNavArea *)GetNavArea(this,(Vector *)&local_f0,120.0);
            if ((pCVar5 != (CNavArea *)0x0) &&
               (cVar4 = TraceAdjacentNode(0,(Vector *)&local_fc,(Vector *)&local_f0,local_70,18.0),
               cVar4 != '\0')) {
              if (uVar1 == 2) {
                fVar12 = *(float *)(pCVar5 + 0x10);
                fVar13 = *(float *)(pCVar5 + 0x14);
                fVar14 = *(float *)(pCVar5 + 0x18);
              }
              else if (uVar1 == 3) {
                fVar12 = *(float *)(pCVar5 + 4);
                fVar13 = *(float *)(pCVar5 + 0x14);
                fVar14 = *(float *)(pCVar5 + 0x28);
              }
              else if (uVar1 == 1) {
                fVar12 = *(float *)(pCVar5 + 0x10);
                fVar13 = *(float *)(pCVar5 + 8);
                fVar14 = *(float *)(pCVar5 + 0x24);
              }
              else {
                fVar12 = *(float *)(pCVar5 + 4);
                fVar13 = *(float *)(pCVar5 + 8);
                fVar14 = *(float *)(pCVar5 + 0xc);
              }
              if (((fVar12 == local_fc) && (fVar13 == local_f8)) && (local_f4 == fVar14)) {
                if (local_12c == 1) {
                  local_140 = 0.0;
                  local_144 = 12.5;
                }
                else if ((int)local_12c < 2) {
                  if (local_12c == 0) {
                    local_140 = -12.5;
                    local_144 = 0.0;
                  }
                  else {
LAB_0072a8b6:
                    local_140 = local_140 * 12.5;
                    local_144 = local_144 * 12.5;
                  }
                }
                else if (local_12c == 2) {
                  local_140 = 12.5;
                  local_144 = 0.0;
                }
                else {
                  if (local_12c != 3) goto LAB_0072a8b6;
                  local_140 = 0.0;
                  local_144 = -12.5;
                }
                local_94 = local_124 + fVar12;
                local_7c = fVar12 + local_144;
                local_90 = local_120 + fVar13;
                local_a0 = local_144 + local_94;
                local_78 = fVar13 + local_140;
                local_98 = local_f4;
                local_9c = local_140 + local_90;
                local_8c = local_f4;
                local_80 = local_f4;
                local_74 = local_f4;
                local_88 = fVar12;
                local_84 = fVar13;
                CTraceFilterSimple::CTraceFilterSimple
                          ((CTraceFilterSimple *)local_b4,(IHandleEntity *)0x0,0,
                           (_func_bool_IHandleEntity_ptr_int *)0x0);
                local_b4[0] = &PTR_ShouldHitEntity_00ca1b68;
                local_a4 = 0xf;
                cVar4 = TraceAdjacentNode(0,(Vector *)&local_94,(Vector *)&local_a0,local_70,18.0);
                if (((cVar4 != '\0') &&
                    (cVar4 = TraceAdjacentNode(0,(Vector *)&local_7c,(Vector *)&local_a0,local_70,
                                               18.0), cVar4 != '\0')) &&
                   (iVar6 = GetNavArea(this,(Vector *)&local_a0,120.0), iVar6 == 0)) {
                  local_a0 = local_64;
                  local_9c = local_60;
                  local_98 = local_5c;
                  local_110 = (CNavArea *)(**(code **)(*(int *)this + 0x14))(this);
                  ClassifyCorners((Vector *)&local_a0,local_e4,local_d8,local_cc,local_c0);
                  CNavArea::Build(local_110,local_e4,local_d8,local_cc,local_c0);
                  uVar7 = CUtlVector<CNavArea*,CUtlMemory<CNavArea*,int>>::InsertBefore
                                    ((CUtlVector<CNavArea*,CUtlMemory<CNavArea*,int>> *)&TheNavAreas
                                     ,DAT_00fe6000,&local_110);
                  *(undefined4 *)(local_110 + 0x90) = uVar7;
                  AddNavArea(this,local_110);
                  *(undefined4 *)(local_110 + 0x54) = *(undefined4 *)(pCVar2 + 0x54);
                  CNavArea::ConnectTo(pCVar2,local_110,uVar9);
                  uVar7 = 0;
                  if (uVar9 < 4) {
                    uVar7 = (&CSWTCH_1514)[uVar9];
                  }
                  CNavArea::ConnectTo(local_110,pCVar2,uVar7);
                  CNavArea::ConnectTo(pCVar5,local_110,local_12c);
                  uVar7 = 0;
                  if (local_12c < 4) {
                    uVar7 = (&CSWTCH_1514)[local_12c];
                  }
                  CNavArea::ConnectTo(local_110,pCVar5,uVar7);
                }
              }
            }
            if (bVar3) break;
            bVar3 = true;
            iVar6 = local_108 - 1;
            bVar11 = iVar6 == 0;
            local_12c = local_100;
            uVar9 = local_108;
            if (!bVar11) goto LAB_0072a27e;
LAB_0072a370:
            local_120 = 0.0;
            local_124 = 12.5;
          } while( true );
        }
        uVar10 = uVar10 + 1;
        pCVar8 = pCVar8 + 4;
      } while (uVar10 != 4);
      local_128 = local_128 + 1;
    } while (local_128 < DAT_00fe6000);
  }
  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)