L L4D2node

CNavArea::ConnectElevator

0x006faf70 · 1241 bytes · __thiscall

_ZN8CNavArea15ConnectElevatorEP13CFuncElevatorR6Extent

Decompiled

undefined (3 params)

/* CNavArea::ConnectElevator(CFuncElevator*, Extent&) */

void __thiscall CNavArea::ConnectElevator(CNavArea *this,CFuncElevator *param_1,Extent *param_2)

{
  float *pfVar1;
  size_t __size;
  int iVar2;
  int iVar3;
  int iVar4;
  int *piVar5;
  int iVar6;
  undefined1 *puVar7;
  void *pvVar8;
  undefined4 *puVar9;
  int iVar10;
  float fVar11;
  double dVar12;
  float fVar13;
  double dVar14;
  float fVar15;
  
  *(undefined4 *)(this + 0x84) = 0;
  puVar9 = *(undefined4 **)(this + 0x88);
  *(uint *)(this + 0x54) = *(uint *)(this + 0x54) & 0xbfffffff;
  if ((CUtlVectorUltraConservative<NavConnect,CUtlVectorUltraConservativeAllocator>::StaticData()::
       staticData == '\0') &&
     (iVar4 = __cxa_guard_acquire(&CUtlVectorUltraConservative<NavConnect,CUtlVectorUltraConservativeAllocator>
                                   ::StaticData()::staticData), iVar4 != 0)) {
    __cxa_guard_release(&CUtlVectorUltraConservative<NavConnect,CUtlVectorUltraConservativeAllocator>
                         ::StaticData()::staticData);
  }
  if (puVar9 != &CUtlVectorUltraConservative<NavConnect,CUtlVectorUltraConservativeAllocator>::
                 StaticData()::staticData) {
    free(*(void **)(this + 0x88));
    if ((CUtlVectorUltraConservative<NavConnect,CUtlVectorUltraConservativeAllocator>::StaticData()
         ::staticData == '\0') &&
       (iVar4 = __cxa_guard_acquire(&CUtlVectorUltraConservative<NavConnect,CUtlVectorUltraConservativeAllocator>
                                     ::StaticData()::staticData), iVar4 != 0)) {
      __cxa_guard_release(&CUtlVectorUltraConservative<NavConnect,CUtlVectorUltraConservativeAllocator>
                           ::StaticData()::staticData);
    }
    *(undefined4 **)(this + 0x88) =
         &CUtlVectorUltraConservative<NavConnect,CUtlVectorUltraConservativeAllocator>::StaticData()
          ::staticData;
  }
  if (0 < *(int *)(param_1 + 0x54c)) {
    iVar4 = 0;
    iVar10 = 0;
    do {
      if ((*(float *)(this + 0x34) <= *(float *)(*(int *)(param_1 + 0x540) + iVar4) + 30.0) &&
         (*(float *)(*(int *)(param_1 + 0x540) + iVar4) - 30.0 <= *(float *)(this + 0x34))) {
        if (*(int *)(this + 0x84) != 0) {
          Warning();
          return;
        }
        *(uint *)(this + 0x54) = *(uint *)(this + 0x54) | 0x40000000;
        *(CFuncElevator **)(this + 0x84) = param_1;
        if (*(int *)(param_1 + 0x54c) < 1) {
          return;
        }
        iVar4 = 0;
        goto LAB_006fb0d8;
      }
      iVar10 = iVar10 + 1;
      iVar4 = iVar4 + 0xc;
    } while (iVar10 != *(int *)(param_1 + 0x54c));
  }
  return;
LAB_006fb0d8:
  if (iVar10 != iVar4) {
    pfVar1 = (float *)(*(int *)(param_1 + 0x540) + iVar4 * 0xc);
    if (0 < DAT_00fe6000) {
      fVar11 = 0.0;
      iVar3 = 0;
      piVar5 = TheNavAreas;
      do {
        iVar2 = *piVar5;
        if ((((*(float *)param_2 < *(float *)(iVar2 + 0x10)) &&
             (*(float *)(iVar2 + 4) < *(float *)(param_2 + 0xc))) &&
            (fVar15 = *(float *)(iVar2 + 0x14),
            *(float *)(param_2 + 4) <= fVar15 && fVar15 != *(float *)(param_2 + 4))) &&
           (*(float *)(iVar2 + 8) < *(float *)(param_2 + 0x10))) {
          fVar13 = *pfVar1;
          if (((*(float *)(iVar2 + 0x34) <= fVar13 + 30.0) &&
              (fVar13 - 30.0 <= *(float *)(iVar2 + 0x34))) &&
             (fVar15 = (fVar15 - *(float *)(iVar2 + 8)) *
                       (*(float *)(iVar2 + 0x10) - *(float *)(iVar2 + 4)), fVar11 < fVar15)) {
            fVar11 = fVar15;
            iVar3 = iVar2;
          }
        }
        piVar5 = piVar5 + 1;
      } while (piVar5 != TheNavAreas + DAT_00fe6000);
      if (iVar3 != 0) {
        fVar13 = *(float *)(iVar3 + 0x2c) - *(float *)(this + 0x2c);
        fVar11 = *(float *)(iVar3 + 0x30) - *(float *)(this + 0x30);
        piVar5 = *(int **)(this + 0x88);
        fVar15 = *(float *)(iVar3 + 0x34) - *(float *)(this + 0x34);
        iVar2 = *piVar5;
        if ((CUtlVectorUltraConservative<NavConnect,CUtlVectorUltraConservativeAllocator>::
             StaticData()::staticData == '\0') &&
           (iVar6 = __cxa_guard_acquire(&CUtlVectorUltraConservative<NavConnect,CUtlVectorUltraConservativeAllocator>
                                         ::StaticData()::staticData), iVar6 != 0)) {
          __cxa_guard_release(&CUtlVectorUltraConservative<NavConnect,CUtlVectorUltraConservativeAllocator>
                               ::StaticData()::staticData);
        }
        if (piVar5 == &CUtlVectorUltraConservative<NavConnect,CUtlVectorUltraConservativeAllocator>
                       ::StaticData()::staticData) {
          puVar9 = malloc((iVar2 + 1) * 8 + 4);
          *(undefined4 **)(this + 0x88) = puVar9;
          *puVar9 = 0;
          pvVar8 = *(void **)(this + 0x88);
        }
        else {
          __size = (iVar2 + 1) * 8 + 4;
          iVar6 = malloc_usable_size(*(undefined4 *)(this + 0x88));
          if (iVar6 < (int)__size) {
            pvVar8 = realloc(*(void **)(this + 0x88),__size);
            *(void **)(this + 0x88) = pvVar8;
          }
          else {
            pvVar8 = *(void **)(this + 0x88);
          }
        }
        *(float *)((int)pvVar8 + iVar2 * 8 + 8) =
             SQRT(fVar11 * fVar11 + fVar13 * fVar13 + fVar15 * fVar15);
        *(int *)((int)pvVar8 + iVar2 * 8 + 4) = iVar3;
        **(int **)(this + 0x88) = **(int **)(this + 0x88) + 1;
        goto LAB_006fb26b;
      }
    }
    if (((byte)param_1[0x14d] & 8) == 0) {
      dVar14 = (double)*(float *)(param_1 + 0x2e8);
LAB_006fb2a6:
      dVar12 = (double)*(float *)(param_1 + 0x2e4);
    }
    else {
      CBaseEntity::CalcAbsolutePosition((CBaseEntity *)param_1);
      dVar14 = (double)*(float *)(param_1 + 0x2e8);
      if (((byte)param_1[0x14d] & 8) == 0) goto LAB_006fb2a6;
      CBaseEntity::CalcAbsolutePosition((CBaseEntity *)param_1);
      dVar12 = (double)*(float *)(param_1 + 0x2e4);
      if (((byte)param_1[0x14d] & 8) != 0) {
        CBaseEntity::CalcAbsolutePosition((CBaseEntity *)param_1);
      }
    }
    puVar7 = (undefined1 *)pfVar1[1];
    if (puVar7 == (undefined1 *)0x0) {
      puVar7 = &DAT_00d539c2;
    }
    Warning("Floor %d (\'%s\') of elevator at ( %3.2f, %3.2f, %3.2f ) has no matching navigation areas\n"
            ,iVar4,puVar7,(double)*(float *)(param_1 + 0x2e0),dVar12,dVar14);
  }
LAB_006fb26b:
  iVar4 = iVar4 + 1;
  if (*(int *)(param_1 + 0x54c) <= iVar4) {
    return;
  }
  goto LAB_006fb0d8;
}

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)