L L4D2node

CNavArea::FinishSplitEdit

0x00704890 · 1477 bytes · __thiscall

_ZN8CNavArea15FinishSplitEditEPS_10NavDirType

Decompiled

undefined (3 params)

/* CNavArea::FinishSplitEdit(CNavArea*, NavDirType) */

void __thiscall CNavArea::FinishSplitEdit(CNavArea *this,CNavArea *param_1,int param_3)

{
  float fVar1;
  float fVar2;
  float fVar3;
  float fVar4;
  float fVar5;
  float *pfVar6;
  float *pfVar7;
  char cVar8;
  int iVar9;
  int *piVar10;
  undefined4 uVar11;
  float *pfVar12;
  CNavArea *pCVar13;
  int iVar14;
  int iVar15;
  int iVar16;
  int iVar17;
  longdouble lVar18;
  longdouble lVar19;
  int local_2c;
  CNavArea *local_20;
  
  (**(code **)(*(int *)param_1 + 0x78))(param_1,this,0);
  pCVar13 = param_1;
  fVar1 = *(float *)(param_1 + 4);
  fVar2 = *(float *)(param_1 + 0x10);
  fVar3 = *(float *)(param_1 + 0x14);
  fVar4 = *(float *)(param_1 + 8);
  fVar5 = *(float *)(param_1 + 0x18);
  *(float *)(param_1 + 0x2c) = (fVar1 + fVar2) * 0.5;
  *(float *)(param_1 + 0x30) = (fVar3 + fVar4) * 0.5;
  *(float *)(param_1 + 0x34) = (fVar5 + *(float *)(param_1 + 0xc)) * 0.5;
  lVar18 = (longdouble)GetZ(this,fVar2,fVar4);
  *(float *)(pCVar13 + 0x24) = (float)lVar18;
  lVar19 = (longdouble)GetZ(this,fVar1,fVar3);
  *(float *)(pCVar13 + 0x28) = (float)lVar19;
  if ((*(float *)(this + 0x10) - *(float *)(this + 4) <= 0.0) ||
     (*(float *)(this + 0x14) - *(float *)(this + 8) <= 0.0)) {
    *(int *)(pCVar13 + 0x20) = 0;
    *(int *)(pCVar13 + 0x1c) = 0;
  }
  else {
    *(float *)(pCVar13 + 0x1c) = 1.0 / (fVar2 - fVar1);
    *(float *)(pCVar13 + 0x20) = 1.0 / (fVar3 - fVar4);
  }
  if ((0.05 <= ABS((float)lVar18 - fVar5)) || (0.05 <= ABS(*(float *)(pCVar13 + 0x28) - fVar5))) {
    *(uint *)(pCVar13 + 0x54) = *(uint *)(pCVar13 + 0x54) & 0xdfffffff;
  }
  else {
    *(uint *)(pCVar13 + 0x54) = *(uint *)(pCVar13 + 0x54) | 0x20000000;
  }
  iVar16 = 0;
  local_2c = param_3;
  local_20 = this;
  do {
    if (param_3 != iVar16) {
      piVar10 = *(int **)(local_20 + 0x58);
      iVar15 = *piVar10;
      if (0 < iVar15) {
        iVar17 = 0;
        iVar14 = iVar15;
        do {
          if (iVar14 < 1) {
LAB_00704a82:
            pCVar13 = (CNavArea *)0x0;
          }
          else {
            iVar9 = 0;
            if (iVar17 != 0) {
              do {
                iVar9 = iVar9 + 1;
                if (iVar9 == iVar14) goto LAB_00704a82;
              } while (iVar9 != iVar17);
            }
            pCVar13 = (CNavArea *)piVar10[iVar9 * 2 + 1];
          }
          if (iVar16 == 1) {
LAB_00704aa2:
            if ((*(float *)(param_1 + 0x14) < *(float *)(pCVar13 + 8) ||
                 *(float *)(param_1 + 0x14) == *(float *)(pCVar13 + 8)) ||
               (*(float *)(pCVar13 + 0x14) < *(float *)(param_1 + 8) ||
                *(float *)(pCVar13 + 0x14) == *(float *)(param_1 + 8))) goto LAB_00704b08;
LAB_00704abb:
            ConnectTo(param_1,pCVar13,iVar16);
            uVar11 = (&CSWTCH_1821)[iVar16];
            cVar8 = IsConnected(pCVar13,this,uVar11);
            if (cVar8 != '\0') {
              ConnectTo(pCVar13,param_1,uVar11);
            }
          }
          else if (iVar16 < 2) {
            if (iVar16 == 0) goto LAB_00704bd0;
          }
          else if (iVar16 == 2) {
LAB_00704bd0:
            if ((*(float *)(pCVar13 + 4) <= *(float *)(param_1 + 0x10) &&
                 *(float *)(param_1 + 0x10) != *(float *)(pCVar13 + 4)) &&
               (*(float *)(param_1 + 4) <= *(float *)(pCVar13 + 0x10) &&
                *(float *)(pCVar13 + 0x10) != *(float *)(param_1 + 4))) goto LAB_00704abb;
          }
          else if (iVar16 == 3) goto LAB_00704aa2;
LAB_00704b08:
          iVar14 = 0;
          piVar10 = *(int **)(local_20 + 0x114);
          if (0 < *piVar10) {
            do {
              while (pCVar13 = (CNavArea *)piVar10[iVar14 * 2 + 1], iVar16 == 1) {
LAB_00704b2a:
                if ((*(float *)(param_1 + 0x14) < *(float *)(pCVar13 + 8) ||
                     *(float *)(param_1 + 0x14) == *(float *)(pCVar13 + 8)) ||
                   (*(float *)(pCVar13 + 0x14) < *(float *)(param_1 + 8) ||
                    *(float *)(pCVar13 + 0x14) == *(float *)(param_1 + 8))) goto LAB_00704b68;
LAB_00704b43:
                ConnectTo(pCVar13,param_1,(&CSWTCH_1821)[iVar16]);
                piVar10 = *(int **)(local_20 + 0x114);
LAB_00704b68:
                iVar14 = iVar14 + 1;
                if (*piVar10 <= iVar14) goto LAB_00704ba0;
              }
              if (1 < iVar16) {
                if (iVar16 == 2) goto LAB_00704b7e;
                if (iVar16 == 3) goto LAB_00704b2a;
                goto LAB_00704b68;
              }
              if (iVar16 != 0) goto LAB_00704b68;
LAB_00704b7e:
              if (*(float *)(param_1 + 0x10) < *(float *)(pCVar13 + 4) ||
                  *(float *)(param_1 + 0x10) == *(float *)(pCVar13 + 4)) goto LAB_00704b68;
              if (*(float *)(param_1 + 4) <= *(float *)(pCVar13 + 0x10) &&
                  *(float *)(pCVar13 + 0x10) != *(float *)(param_1 + 4)) goto LAB_00704b43;
              iVar14 = iVar14 + 1;
            } while (iVar14 < *piVar10);
          }
LAB_00704ba0:
          iVar17 = iVar17 + 1;
          if (iVar17 == iVar15) break;
          piVar10 = *(int **)(local_20 + 0x58);
          iVar14 = *piVar10;
        } while( true );
      }
    }
    local_20 = local_20 + 4;
    iVar16 = iVar16 + 1;
  } while (iVar16 != 4);
  uVar11 = CUtlVector<CNavArea*,CUtlMemory<CNavArea*,int>>::InsertBefore
                     ((CUtlVector<CNavArea*,CUtlMemory<CNavArea*,int>> *)&TheNavAreas,DAT_00fe6000,
                      &param_1);
  *(undefined4 *)(param_1 + 0x90) = uVar11;
  CNavMesh::AddNavArea(TheNavMesh,param_1);
  iVar16 = 0;
  while (*(int *)(this + iVar16 * 4 + 0xec) == 0) {
    iVar16 = iVar16 + 1;
    if (iVar16 == 4) {
      ComputeMinMaxCornerZ(param_1);
      return;
    }
  }
  pfVar6 = *(float **)(this + 0xec);
  *(float **)(param_1 + 0xec) = pfVar6;
  pfVar12 = *(float **)(this + 0xf0);
  *(float **)(param_1 + 0xf0) = pfVar12;
  *(undefined4 *)(param_1 + 0xf4) = *(undefined4 *)(this + 0xf4);
  pfVar7 = *(float **)(this + 0xf8);
  *(float **)(param_1 + 0xf8) = pfVar7;
  if (param_3 == 1) {
    iVar15 = 3;
    iVar16 = 2;
    goto LAB_00704cfb;
  }
  pfVar12 = pfVar6;
  if (param_3 < 2) {
    iVar16 = 1;
    iVar15 = 2;
    if (param_3 == 0) goto LAB_00704cfb;
  }
  else {
    if (param_3 == 2) {
      local_2c = 3;
      iVar16 = 2;
      iVar15 = 0;
      pfVar12 = pfVar7;
      goto LAB_00704cfb;
    }
    if (param_3 == 3) {
      local_2c = 0;
      iVar16 = 3;
      iVar15 = 1;
      goto LAB_00704cfb;
    }
  }
  iVar16 = 4;
  iVar15 = 4;
  local_2c = 4;
  pfVar12 = *(float **)(param_1 + 0xfc);
LAB_00704cfb:
  fVar1 = *(float *)(param_1 + 4);
  fVar2 = *(float *)(param_1 + 0x10);
  fVar3 = *(float *)(param_1 + 8);
  fVar4 = *(float *)(param_1 + 0x14);
  while ((((*pfVar12 + 12.5 < fVar1 || (fVar2 < *pfVar12 - 12.5)) || (pfVar12[1] + 12.5 < fVar3)) ||
         (fVar4 < pfVar12[1] - 12.5))) {
    *(float *)(param_1 + local_2c * 4 + 0xec) = pfVar12[iVar15 + 6];
    *(undefined4 *)(param_1 + iVar16 * 4 + 0xec) =
         *(undefined4 *)(*(int *)(param_1 + iVar16 * 4 + 0xec) + 8 + (iVar15 + 4) * 4);
    pfVar12 = *(float **)(param_1 + local_2c * 4 + 0xec);
  }
  iVar15 = *(int *)(param_1 + 0xec);
  iVar16 = *(int *)(param_1 + 0xf8);
  iVar14 = *(int *)(param_1 + 0xf0);
  iVar17 = iVar16;
  if (iVar15 != iVar16) {
    do {
      iVar17 = iVar15;
      if (iVar14 != iVar15) {
        do {
          *(CNavArea **)(iVar17 + 0x74) = param_1;
          piVar10 = (int *)(iVar17 + 0x1c);
          iVar17 = *piVar10;
        } while (iVar14 != *piVar10);
        iVar16 = *(int *)(param_1 + 0xf8);
      }
      iVar15 = *(int *)(iVar15 + 0x20);
      iVar14 = *(int *)(iVar14 + 0x20);
    } while (iVar15 != iVar16);
    iVar14 = *(int *)(param_1 + 0xf0);
    iVar17 = *(int *)(param_1 + 0xec);
  }
  *(undefined4 *)(param_1 + 0x24) = *(undefined4 *)(iVar14 + 8);
  *(undefined4 *)(param_1 + 0xc) = *(undefined4 *)(iVar17 + 8);
  *(undefined4 *)(param_1 + 0x28) = *(undefined4 *)(iVar16 + 8);
  *(undefined4 *)(param_1 + 0x18) = *(undefined4 *)(*(int *)(param_1 + 0xf4) + 8);
  ComputeMinMaxCornerZ(param_1);
  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)