L L4D2node

CNavMesh::CreateObstacleTopAreaIfNecessary

0x00729790 · 2075 bytes · __thiscall

_ZN8CNavMesh32CreateObstacleTopAreaIfNecessaryEP8CNavAreaS1_10NavDirTypeb

Decompiled

undefined (5 params)

/* CNavMesh::CreateObstacleTopAreaIfNecessary(CNavArea*, CNavArea*, NavDirType, bool) */

undefined4 __thiscall
CNavMesh::CreateObstacleTopAreaIfNecessary
          (CNavMesh *this,CNavArea *param_1,CNavArea *param_2,uint param_4,char param_5)

{
  Vector *pVVar1;
  Vector *pVVar2;
  char cVar3;
  undefined4 uVar4;
  Vector *pVVar5;
  undefined4 uVar6;
  int iVar7;
  longdouble lVar8;
  float fVar9;
  float fVar10;
  float fVar11;
  float fVar12;
  float fVar13;
  float fVar14;
  float fVar15;
  float fVar16;
  float local_74;
  float local_70;
  float local_68;
  float local_64;
  float local_60;
  CNavArea *local_5c;
  float local_58;
  float local_54;
  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;
  
  local_64 = 0.0;
  local_68 = 25.0;
  CNavArea::ComputePortal(param_1,param_2,param_4,&local_58,&local_60);
  fVar15 = 0.0;
  if (local_60 <= 0.0) {
    return 0;
  }
  iVar7 = (int)(param_4 + 1) % 4;
  pVVar5 = *(Vector **)(param_1 + param_4 * 4 + 0xec);
  pVVar1 = *(Vector **)(param_1 + iVar7 * 4 + 0xec);
  if (pVVar5 == (Vector *)0x0) {
    return 0;
  }
  local_74 = 0.0;
  local_70 = 0.0;
  fVar16 = 3.4028235e+38;
  fVar11 = fVar15;
  fVar14 = fVar15;
  fVar9 = fVar15;
  do {
    if ((*(float *)(pVVar5 + 4) - local_54) * (*(float *)(pVVar5 + 4) - local_54) +
        (*(float *)pVVar5 - local_58) * (*(float *)pVVar5 - local_58) <
        (local_60 + 1.0) * (local_60 + 1.0)) {
      fVar10 = *(float *)(pVVar5 + param_4 * 4 + 0x38);
      fVar12 = *(float *)(pVVar5 + param_4 * 4 + 0x48);
      if (param_5 == '\0') {
        fVar9 = *(float *)(pVVar5 + 8);
        fVar11 = *(float *)(pVVar5 + param_4 * 4 + 0x28);
      }
      else {
        cVar3 = CNavArea::Contains(param_2,pVVar5);
        if (cVar3 == '\0') {
          pVVar2 = *(Vector **)(pVVar5 + param_4 * 4 + 0x18);
          fVar9 = *(float *)(pVVar5 + 8);
          fVar11 = fVar15;
          if ((pVVar2 != (Vector *)0x0) && (fVar13 = *(float *)(pVVar2 + 8) - fVar9, 18.0 < fVar13))
          {
            cVar3 = CNavArea::Contains(param_2,pVVar2);
            if (((cVar3 != '\0') &&
                (lVar8 = (longdouble)CNavArea::GetZ(param_2,*(float *)pVVar2,*(float *)(pVVar2 + 4))
                , ABS(*(float *)(pVVar2 + 8) - (float)lVar8) < 2.0)) ||
               ((pVVar2 = *(Vector **)(pVVar2 + param_4 * 4 + 0x18), pVVar2 == (Vector *)0x0 ||
                (cVar3 = CNavArea::Contains(param_2,pVVar2), cVar3 == '\0')))) goto LAB_00729d70;
            fVar9 = *(float *)(pVVar5 + 8);
            if (ABS(fVar9 - *(float *)(pVVar2 + 8)) <= 18.0) {
              fVar12 = 30.0;
              fVar10 = 20.0;
              fVar11 = fVar13;
            }
          }
        }
        else {
LAB_00729d70:
          fVar9 = *(float *)(pVVar5 + 8);
          fVar11 = fVar15;
        }
      }
      if (fVar11 <= fVar16) {
        fVar16 = fVar11;
      }
      if (local_68 <= fVar10) {
        fVar10 = local_68;
      }
      if (fVar12 <= local_64) {
        fVar12 = local_64;
      }
      if (fVar14 <= fVar11) {
        fVar14 = fVar11;
      }
      local_68 = fVar10;
      local_64 = fVar12;
      if (local_70 == 0.0) {
        local_74 = fVar9;
        local_70 = fVar11;
      }
    }
  } while ((pVVar5 != pVVar1) &&
          (pVVar5 = *(Vector **)(pVVar5 + iVar7 * 4 + 0x18), pVVar5 != (Vector *)0x0));
  uVar6 = CONCAT31((int3)((uint)pVVar5 >> 8),18.0 < fVar16 && 18.0 < fVar14);
  if (18.0 >= fVar16 || 18.0 >= fVar14) {
    return 0;
  }
  if ((fVar11 < fVar14) && (local_70 < fVar14)) {
    fVar11 = fVar14;
    local_70 = fVar14;
  }
  fVar15 = fVar11;
  fVar14 = fVar9;
  if (param_4 - 2 < 2) {
    fVar15 = local_70;
    fVar14 = local_74;
    local_74 = fVar9;
    local_70 = fVar11;
  }
  fVar9 = 25.0;
  if (param_5 != '\0') {
    fVar9 = 50.0;
  }
  AdjustObstacleDistances(&local_68,&local_64,fVar9);
  fVar9 = (local_64 - local_68) * 0.5;
  fVar11 = local_68 + fVar9;
  if (param_4 == 1) {
    local_58 = fVar11 + local_58;
LAB_00729a57:
    local_38 = fVar15 + fVar14;
    local_4c = local_58 - fVar9;
    local_40 = local_58 + fVar9;
    local_44 = local_70 + local_74;
    local_48 = local_54 - local_60;
    local_30 = local_54 + local_60;
    local_3c = local_48;
    local_34 = local_40;
    local_2c = local_38;
    local_28 = local_4c;
    local_24 = local_30;
    local_20 = local_44;
  }
  else {
    if ((int)param_4 < 2) {
      if (param_4 == 0) {
        local_54 = local_54 - fVar11;
      }
      else {
LAB_00729e90:
        if (param_4 == 1) goto LAB_00729a57;
        if ((int)param_4 < 2) {
          if (param_4 != 0) goto LAB_00729abe;
        }
        else if (param_4 != 2) {
          if (param_4 != 3) goto LAB_00729abe;
          goto LAB_00729a57;
        }
      }
    }
    else {
      if (param_4 != 2) {
        if (param_4 != 3) goto LAB_00729e90;
        local_58 = local_58 - fVar11;
        goto LAB_00729a57;
      }
      local_54 = fVar11 + local_54;
    }
    local_38 = fVar15 + fVar14;
    local_48 = local_54 - fVar9;
    local_30 = local_54 + fVar9;
    local_44 = local_70 + local_74;
    local_4c = local_58 - local_60;
    local_40 = local_58 + local_60;
    local_3c = local_48;
    local_34 = local_40;
    local_2c = local_38;
    local_28 = local_4c;
    local_24 = local_30;
    local_20 = local_44;
  }
LAB_00729abe:
  local_5c = (CNavArea *)(**(code **)(*(int *)this + 0x14))(this);
  CNavArea::Build(local_5c,(Vector *)&local_4c,(Vector *)&local_40,(Vector *)&local_34,
                  (Vector *)&local_28);
  uVar4 = CUtlVector<CNavArea*,CUtlMemory<CNavArea*,int>>::InsertBefore
                    ((CUtlVector<CNavArea*,CUtlMemory<CNavArea*,int>> *)&TheNavAreas,DAT_00fe6000,
                     &local_5c);
  *(undefined4 *)(local_5c + 0x90) = uVar4;
  AddNavArea(this,local_5c);
  Msg("Created new fencetop area %d(%x) between %d(%x) and %d(%x)\n",
      *(undefined4 *)(local_5c + 0x8c),*(undefined4 *)(local_5c + 0x90),
      *(undefined4 *)(param_1 + 0x8c),*(undefined4 *)(param_1 + 0x90),
      *(undefined4 *)(param_2 + 0x8c),*(undefined4 *)(param_2 + 0x90));
  *(undefined4 *)(local_5c + 0x54) = *(undefined4 *)(param_1 + 0x54);
  *(uint *)(local_5c + 0x54) = *(uint *)(param_1 + 0x54) | 0x6000;
  CNavArea::Disconnect(param_1,param_2);
  CNavArea::ConnectTo(param_1,local_5c,param_4);
  if (param_4 < 4) {
    uVar4 = (&CSWTCH_1514)[param_4];
    CNavArea::ConnectTo(local_5c,param_1,uVar4);
    CNavArea::ConnectTo(local_5c,param_2,param_4);
  }
  else {
    uVar4 = 0;
    CNavArea::ConnectTo(local_5c,param_1,0);
    CNavArea::ConnectTo(local_5c,param_2,param_4);
  }
  cVar3 = CNavArea::IsConnected(param_2,param_1,uVar4);
  if (cVar3 != '\0') {
    CNavArea::Disconnect(param_2,param_1);
    uVar4 = 0;
    if (param_4 < 4) {
      uVar4 = (&CSWTCH_1514)[param_4];
    }
    CNavArea::ConnectTo(param_2,local_5c,uVar4);
    return uVar6;
  }
  return uVar6;
}

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)