L L4D2node

CEngineTrace::GetBrushesInAABB

0x0015c910 · 1041 bytes · __thiscall

_ZN12CEngineTrace16GetBrushesInAABBERK6VectorS2_P10CUtlVectorIi10CUtlMemoryIiiEEi

Decompiled

undefined (5 params)

/* WARNING: Globals starting with '_' overlap smaller symbols at the same address */
/* CEngineTrace::GetBrushesInAABB(Vector const&, Vector const&, CUtlVector<int, CUtlMemory<int, int>
   >*, int) */

void __thiscall
CEngineTrace::GetBrushesInAABB
          (CEngineTrace *this,Vector *param_1,Vector *param_2,CUtlVector *param_3,int param_4)

{
  int *piVar1;
  uint *puVar2;
  ushort uVar3;
  undefined4 uVar4;
  int iVar5;
  CUtlVector *pCVar6;
  char cVar7;
  uint uVar8;
  uint uVar9;
  float *pfVar10;
  int iVar11;
  int *piVar12;
  int in_GS_OFFSET;
  undefined4 uStack_d0;
  int aiStack_cc [7];
  CUtlVector *local_b0;
  int local_ac;
  int local_a8;
  int local_a4;
  uint local_a0;
  uint local_98;
  int local_94 [5];
  float local_80 [21];
  undefined1 local_2c [12];
  int local_20;
  
  piVar12 = aiStack_cc;
  local_20 = *(int *)(in_GS_OFFSET + 0x14);
  local_b0 = param_3;
  if (param_3 != (CUtlVector *)0x0) {
    uVar8 = 0;
    pfVar10 = local_80 + 2;
    do {
      while ((uVar8 & 1) != 0) {
        pfVar10[-2] = *(float *)param_2;
        if ((uVar8 & 2) == 0) goto LAB_0015c987;
LAB_0015c953:
        pfVar10[-1] = *(float *)(param_2 + 4);
        if ((uVar8 & 4) == 0) goto LAB_0015c995;
LAB_0015c961:
        uVar8 = uVar8 + 1;
        *pfVar10 = *(float *)(param_2 + 8);
        pfVar10 = pfVar10 + 3;
        if (uVar8 == 8) goto LAB_0015c9aa;
      }
      pfVar10[-2] = *(float *)param_1;
      if ((uVar8 & 2) != 0) goto LAB_0015c953;
LAB_0015c987:
      pfVar10[-1] = *(float *)(param_1 + 4);
      if ((uVar8 & 4) != 0) goto LAB_0015c961;
LAB_0015c995:
      uVar8 = uVar8 + 1;
      *pfVar10 = *(float *)(param_1 + 8);
      pfVar10 = pfVar10 + 3;
    } while (uVar8 != 8);
LAB_0015c9aa:
    iVar5 = -((DAT_00394394 * 8 + 0xfU & 0xfffffff0) + 0x10);
    piVar12 = (int *)((int)aiStack_cc + iVar5);
    *(int *)((int)aiStack_cc + iVar5 + 0xc) = DAT_00394394 * 2;
    aiStack_cc[6] = (int)&local_b0 + iVar5;
    *(undefined4 *)((int)aiStack_cc + iVar5 + 0x10) = 0;
    *(Vector **)((int)aiStack_cc + iVar5 + 4) = param_2;
    *(Vector **)((int)aiStack_cc + iVar5) = param_1;
    *(int *)((int)aiStack_cc + iVar5 + 8) = aiStack_cc[6];
    *(undefined4 *)((int)&uStack_d0 + iVar5) = 0x15c9f3;
    aiStack_cc[5] =
         CM_BoxLeafnums(*(Vector **)((int)aiStack_cc + iVar5),
                        *(Vector **)((int)aiStack_cc + iVar5 + 4),
                        *(int **)((int)aiStack_cc + iVar5 + 8),
                        *(int *)((int)aiStack_cc + iVar5 + 0xc),
                        *(int **)((int)aiStack_cc + iVar5 + 0x10));
    iVar11 = DAT_003943c0;
    local_94[0] = 0;
    local_94[1] = 0;
    local_94[2] = 0;
    local_94[4] = 0;
    local_94[3] = 0;
    if (DAT_003943c0 != 0) {
      *(int *)((int)aiStack_cc + iVar5 + 4) = DAT_003943c0;
      *(int **)((int)aiStack_cc + iVar5) = local_94;
      *(undefined4 *)((int)&uStack_d0 + iVar5) = 0x15ccf8;
      CUtlVector<int,CUtlMemory<int,int>>::GrowVector
                (*(CUtlVector<int,CUtlMemory<int,int>> **)((int)aiStack_cc + iVar5),
                 *(int *)((int)aiStack_cc + iVar5 + 4));
      *(int *)((int)aiStack_cc + iVar5 + 8) = iVar11;
      *(undefined4 *)((int)aiStack_cc + iVar5 + 4) = 0;
      *(int **)((int)aiStack_cc + iVar5) = local_94;
      *(undefined4 *)((int)&uStack_d0 + iVar5) = 0x15cd12;
      CUtlVector<int,CUtlMemory<int,int>>::ShiftElementsRight
                (*(CUtlVector<int,CUtlMemory<int,int>> **)((int)aiStack_cc + iVar5),
                 *(int *)((int)aiStack_cc + iVar5 + 4),*(int *)((int)aiStack_cc + iVar5 + 8));
    }
    iVar11 = local_94[0];
    *(undefined4 *)((int)aiStack_cc + iVar5 + 4) = 0;
    *(int *)((int)aiStack_cc + iVar5 + 8) = DAT_003943c0 << 2;
    *(int *)((int)aiStack_cc + iVar5) = iVar11;
    *(undefined4 *)((int)&uStack_d0 + iVar5) = 0x15ca4f;
    memset(*(void **)((int)aiStack_cc + iVar5),*(int *)((int)aiStack_cc + iVar5 + 4),
           *(size_t *)((int)aiStack_cc + iVar5 + 8));
    local_ac = 0;
    if (aiStack_cc[5] != 0) {
      do {
        local_a8 = local_94[0];
        iVar11 = *(int *)(aiStack_cc[6] + local_ac * 4);
        if ((iVar11 < 0) || (DAT_0039439c <= iVar11)) {
          *(char **)((int)aiStack_cc + iVar5) = "Cannot load corrupted map.\n";
                    /* try { // try from 0015ca9e to 0015cd11 has its CatchHandler @ 0015cd28 */
          *(undefined4 *)((int)&uStack_d0 + iVar5) = 0x15caa3;
          Error();
        }
        local_a0 = 0;
        local_a4 = iVar11 * 0x10 + DAT_00394398;
        if (*(short *)(local_a4 + 10) != 0) {
          do {
            iVar11 = *(ushort *)(local_a4 + 8) + local_a0;
            if ((iVar11 < 0) || (DAT_003943b0 <= iVar11)) {
              *(char **)((int)aiStack_cc + iVar5) = "Cannot load corrupted map.\n";
              *(undefined4 *)((int)&uStack_d0 + iVar5) = 0x15cafe;
              Error();
            }
            uVar8 = (uint)*(ushort *)(DAT_003943ac + iVar11 * 2);
            local_98 = uVar8;
            if (DAT_003943c8 <= (int)uVar8) {
              *(char **)((int)aiStack_cc + iVar5) = "Cannot load corrupted map.\n";
              *(undefined4 *)((int)&uStack_d0 + iVar5) = 0x15cb23;
              Error();
            }
            piVar1 = (int *)(local_a8 + local_98 * 4);
            if (*piVar1 == 0) {
              puVar2 = (uint *)(DAT_003943c4 + uVar8 * 8);
              *piVar1 = 1;
              if ((param_4 & *puVar2) != 0) {
                if ((short)puVar2[1] == -1) {
                  uVar3 = *(ushort *)((int)puVar2 + 6);
                  if (DAT_00394378 <= (int)(uint)uVar3) {
                    *(char **)((int)aiStack_cc + iVar5) = "Cannot load corrupted map.\n";
                    *(undefined4 *)((int)&uStack_d0 + iVar5) = 0x15cce4;
                    Error();
                  }
                  iVar11 = (uint)uVar3 * 0x30 + _DAT_00394374;
                  *(float **)((int)aiStack_cc + iVar5 + 8) = local_80;
                  *(undefined1 **)((int)aiStack_cc + iVar5 + 0xc) = local_2c;
                  *(int *)((int)aiStack_cc + iVar5) = iVar11;
                  *(int *)((int)aiStack_cc + iVar5 + 4) = iVar11 + 0x10;
                  *(undefined4 *)((int)&uStack_d0 + iVar5) = 0x15cca5;
                  cVar7 = IsBoxIntersectingBox
                                    (*(Vector **)((int)aiStack_cc + iVar5),
                                     *(Vector **)((int)aiStack_cc + iVar5 + 4),
                                     *(Vector **)((int)aiStack_cc + iVar5 + 8),
                                     *(Vector **)((int)aiStack_cc + iVar5 + 0xc));
                  if (cVar7 == '\0') goto LAB_0015cbf0;
                }
                else {
                  uVar8 = 0;
                  if ((short)puVar2[1] != 0) {
                    do {
                      iVar11 = *(ushort *)((int)puVar2 + 6) + uVar8;
                      if ((iVar11 < 0) || (DAT_0039436c <= iVar11)) {
                        *(char **)((int)aiStack_cc + iVar5) = "Cannot load corrupted map.\n";
                        *(undefined4 *)((int)&uStack_d0 + iVar5) = 0x15cb9b;
                        Error();
                      }
                      pfVar10 = *(float **)(DAT_00394368 + iVar11 * 8);
                      uVar9 = (uint)*(byte *)((int)pfVar10 + 0x11);
                      if (0.0 < (*pfVar10 * local_80[uVar9 * 3] - pfVar10[3]) +
                                pfVar10[1] * local_80[uVar9 * 3 + 1] +
                                pfVar10[2] * local_80[uVar9 * 3 + 2]) {
                        if ((ushort)puVar2[1] != uVar8) goto LAB_0015cbf0;
                        break;
                      }
                      uVar8 = uVar8 + 1;
                    } while (uVar8 != (ushort)puVar2[1]);
                  }
                }
                pCVar6 = local_b0;
                *(uint **)((int)aiStack_cc + iVar5 + 8) = &local_98;
                uVar4 = *(undefined4 *)(pCVar6 + 0xc);
                *(CUtlVector **)((int)aiStack_cc + iVar5) = pCVar6;
                *(undefined4 *)((int)aiStack_cc + iVar5 + 4) = uVar4;
                *(undefined4 *)((int)&uStack_d0 + iVar5) = 0x15cccf;
                CUtlVector<int,CUtlMemory<int,int>>::InsertBefore
                          (*(CUtlVector<int,CUtlMemory<int,int>> **)((int)aiStack_cc + iVar5),
                           *(int *)((int)aiStack_cc + iVar5 + 4),
                           *(int **)((int)aiStack_cc + iVar5 + 8));
              }
            }
LAB_0015cbf0:
            local_a0 = local_a0 + 1;
          } while (local_a0 != *(ushort *)(local_a4 + 10));
        }
        local_ac = local_ac + 1;
      } while (aiStack_cc[5] != local_ac);
    }
    local_94[3] = 0;
    *(int **)((int)aiStack_cc + iVar5) = local_94;
    *(undefined4 *)((int)&uStack_d0 + iVar5) = 0x15cc3e;
    CUtlMemory<int,int>::Purge(*(CUtlMemory<int,int> **)((int)aiStack_cc + iVar5));
    local_94[4] = local_94[0];
    *(int **)((int)aiStack_cc + iVar5) = local_94;
    *(undefined4 *)((int)&uStack_d0 + iVar5) = 0x15cc55;
    CUtlMemory<int,int>::Purge(*(CUtlMemory<int,int> **)((int)aiStack_cc + iVar5));
  }
  if (local_20 != *(int *)(in_GS_OFFSET + 0x14)) {
                    /* WARNING: Subroutine does not return */
    *(undefined1 **)((int)piVar12 + -4) = &LAB_0015cd28;
    __stack_chk_fail();
  }
  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)