L L4D2node

CEngineTrace::GetCollidableFromDisplacementsInAABB

0x00158ae0 · 1236 bytes · __thiscall

_ZN12CEngineTrace36GetCollidableFromDisplacementsInAABBERK6VectorS2_

Decompiled

undefined (3 params)

/* CEngineTrace::GetCollidableFromDisplacementsInAABB(Vector const&, Vector const&) */

undefined4 __thiscall
CEngineTrace::GetCollidableFromDisplacementsInAABB
          (CEngineTrace *this,Vector *param_1,Vector *param_2)

{
  int *piVar1;
  undefined4 *puVar2;
  ushort uVar3;
  short sVar4;
  code *pcVar5;
  int iVar6;
  undefined4 uVar7;
  char cVar8;
  int iVar9;
  int iVar10;
  uint uVar11;
  undefined4 uVar12;
  uint uVar13;
  uint uVar14;
  int in_GS_OFFSET;
  int aiStack_18d0 [8];
  undefined1 auStack_18b0 [8];
  int local_18a8;
  int local_18a4;
  int local_18a0;
  undefined1 *local_189c;
  int local_1898;
  Vector *local_1894;
  undefined4 local_1890;
  int local_188c;
  int local_1888;
  int local_1884;
  uint local_1880;
  Vector *local_187c;
  Vector *local_1878;
  int local_1874;
  int local_1870;
  int local_1860;
  undefined4 local_185c;
  undefined4 local_1858;
  undefined4 local_1854;
  undefined4 local_1850;
  undefined4 local_184c;
  undefined4 local_1848;
  undefined4 local_1844;
  undefined4 local_1840;
  undefined4 local_183c;
  int local_1838;
  int local_1834;
  int local_1830;
  int local_182c;
  ushort local_1820 [3072];
  int local_20;
  
  local_1894 = param_1;
  local_1878 = param_2;
  local_20 = *(int *)(in_GS_OFFSET + 0x14);
  iVar6 = -((DAT_00394394 * 4 + 0xfU & 0xfffffff0) + 0x10);
  *(int *)((int)aiStack_18d0 + iVar6 + 0x10) = DAT_00394394;
  local_189c = auStack_18b0 + iVar6;
  *(Vector **)((int)aiStack_18d0 + iVar6 + 4) = param_1;
  *(undefined4 *)((int)aiStack_18d0 + iVar6 + 0x14) = 0;
  *(Vector **)((int)aiStack_18d0 + iVar6 + 8) = param_2;
  *(undefined1 **)((int)aiStack_18d0 + iVar6 + 0xc) = local_189c;
  *(undefined4 *)((int)aiStack_18d0 + iVar6) = 0x158b55;
  iVar9 = CM_BoxLeafnums(*(Vector **)((int)aiStack_18d0 + iVar6 + 4),
                         *(Vector **)((int)aiStack_18d0 + iVar6 + 8),
                         *(int **)((int)aiStack_18d0 + iVar6 + 0xc),
                         *(int *)((int)aiStack_18d0 + iVar6 + 0x10),
                         *(int **)((int)aiStack_18d0 + iVar6 + 0x14));
  iVar10 = *physcollision;
  local_18a8 = iVar9;
  *(int **)((int)aiStack_18d0 + iVar6 + 4) = physcollision;
  pcVar5 = *(code **)(iVar10 + 0x2c);
  *(undefined4 *)((int)aiStack_18d0 + iVar6) = 0x158b6a;
  local_1890 = (*pcVar5)();
  *(undefined4 *)((int)aiStack_18d0 + iVar6) = 0x158b75;
  local_1860 = BeginTrace();
  local_1884 = *(int *)(local_1860 + 0x150 + *(int *)(local_1860 + 0x11c) * 0x14);
  local_1888 = *(int *)(local_1860 + 0x120 + *(int *)(local_1860 + 0x11c) * 4);
  if (0 < iVar9) {
    local_18a4 = 0;
    local_18a0 = 0;
    do {
      iVar10 = *(int *)(local_189c + local_18a4 * 4);
      if ((iVar10 < 0) || (DAT_0039439c <= iVar10)) {
        *(char **)((int)aiStack_18d0 + iVar6 + 4) = "Cannot load corrupted map.\n";
        *(undefined4 *)((int)aiStack_18d0 + iVar6) = 0x158be1;
        Error();
      }
      iVar10 = iVar10 * 0x10 + DAT_00394398;
      uVar3 = *(ushort *)(iVar10 + 0xe);
      if (uVar3 != 0) {
        local_1874 = 0;
        local_1880 = (uint)*(ushort *)(iVar10 + 0xc);
        local_1870 = local_1880 * 2;
        local_188c = (uVar3 + local_1880) * 2;
        do {
          if (DAT_003943d4 <= (int)(local_1874 + local_1880)) {
            *(char **)((int)aiStack_18d0 + iVar6 + 4) = "Cannot load corrupted map.\n";
            *(undefined4 *)((int)aiStack_18d0 + iVar6) = 0x158c68;
            Error();
          }
          iVar10 = (uint)*(ushort *)(DAT_003943d0 + local_1870) * 0xf4 + g_pDispCollTrees;
          piVar1 = (int *)(local_1884 + *(int *)(iVar10 + 0x10) * 4);
          if (local_1888 != *piVar1) {
            *piVar1 = local_1888;
            *(int *)((int)aiStack_18d0 + iVar6 + 0x10) = iVar10 + 0x14;
            *(int *)((int)aiStack_18d0 + iVar6 + 0xc) = iVar10 + 4;
            *(Vector **)((int)aiStack_18d0 + iVar6 + 8) = local_1878;
            *(Vector **)((int)aiStack_18d0 + iVar6 + 4) = local_1894;
            *(undefined4 *)((int)aiStack_18d0 + iVar6) = 0x158cc1;
            cVar8 = IsBoxIntersectingBox
                              (*(Vector **)((int)aiStack_18d0 + iVar6 + 4),
                               *(Vector **)((int)aiStack_18d0 + iVar6 + 8),
                               *(Vector **)((int)aiStack_18d0 + iVar6 + 0xc),
                               *(Vector **)((int)aiStack_18d0 + iVar6 + 0x10));
            if (cVar8 != '\0') {
              *(int *)((int)aiStack_18d0 + iVar6 + 4) = iVar10;
              *(int **)((int)aiStack_18d0 + iVar6 + 8) = &local_1838;
              *(undefined4 *)((int)aiStack_18d0 + iVar6) = 0x158cdb;
              CDispCollTree::GetVirtualMeshList
                        (*(CDispCollTree **)((int)aiStack_18d0 + iVar6 + 4),
                         *(virtualmeshlist_t **)((int)aiStack_18d0 + iVar6 + 8));
              local_18a0 = local_18a0 + local_1830;
              if (local_18a0 < 0x10000) {
                if (local_1834 < 1) goto LAB_00158c28;
                if (local_1834 < 3) {
LAB_00158f80:
                  *(int **)((int)aiStack_18d0 + iVar6 + 4) = &local_1860;
                  *(undefined4 *)((int)aiStack_18d0 + iVar6) = 0x158f8e;
                  EndTrace(*(TraceInfo_t ***)((int)aiStack_18d0 + iVar6 + 4));
                  uVar12 = local_1890;
                  iVar10 = *physcollision;
                  *(int **)((int)aiStack_18d0 + iVar6 + 4) = physcollision;
                  *(undefined4 *)((int)aiStack_18d0 + iVar6 + 8) = uVar12;
                  pcVar5 = *(code **)(iVar10 + 0x30);
                  *(undefined4 *)((int)aiStack_18d0 + iVar6) = 0x158fa5;
                  (*pcVar5)();
                }
                else {
                  uVar11 = (uint)local_1820[0];
                  uVar14 = (uint)local_1820[1];
                  uVar13 = (uint)local_1820[2];
                  if ((((int)uVar11 < local_182c) && ((int)uVar14 < local_182c)) &&
                     ((int)uVar13 < local_182c)) {
                    local_1898 = iVar10;
                    local_187c = local_1894;
                    iVar10 = 0;
                    do {
                      puVar2 = (undefined4 *)(local_1838 + uVar11 * 0xc);
                      local_185c = *puVar2;
                      local_1858 = puVar2[1];
                      local_1854 = puVar2[2];
                      puVar2 = (undefined4 *)(local_1838 + uVar14 * 0xc);
                      local_1850 = *puVar2;
                      local_184c = puVar2[1];
                      local_1848 = puVar2[2];
                      puVar2 = (undefined4 *)(local_1838 + uVar13 * 0xc);
                      local_1844 = *puVar2;
                      local_1840 = puVar2[1];
                      local_183c = puVar2[2];
                      *(Vector **)((int)aiStack_18d0 + iVar6 + 0xc) = local_1878;
                      *(Vector **)((int)aiStack_18d0 + iVar6 + 8) = local_187c;
                      *(undefined4 **)((int)aiStack_18d0 + iVar6 + 4) = &local_185c;
                      *(undefined4 *)((int)aiStack_18d0 + iVar6) = 0x158e7d;
                      cVar8 = IsPointInBox(*(Vector **)((int)aiStack_18d0 + iVar6 + 4),
                                           *(Vector **)((int)aiStack_18d0 + iVar6 + 8),
                                           *(Vector **)((int)aiStack_18d0 + iVar6 + 0xc));
                      if (cVar8 == '\0') {
                        *(Vector **)((int)aiStack_18d0 + iVar6 + 0xc) = local_1878;
                        *(Vector **)((int)aiStack_18d0 + iVar6 + 8) = local_187c;
                        *(undefined4 **)((int)aiStack_18d0 + iVar6 + 4) = &local_1850;
                        *(undefined4 *)((int)aiStack_18d0 + iVar6) = 0x158ea7;
                        cVar8 = IsPointInBox(*(Vector **)((int)aiStack_18d0 + iVar6 + 4),
                                             *(Vector **)((int)aiStack_18d0 + iVar6 + 8),
                                             *(Vector **)((int)aiStack_18d0 + iVar6 + 0xc));
                        if (cVar8 != '\0') goto LAB_00158d60;
                        *(Vector **)((int)aiStack_18d0 + iVar6 + 0xc) = local_1878;
                        *(Vector **)((int)aiStack_18d0 + iVar6 + 8) = local_187c;
                        *(undefined4 **)((int)aiStack_18d0 + iVar6 + 4) = &local_1844;
                        *(undefined4 *)((int)aiStack_18d0 + iVar6) = 0x158ed1;
                        cVar8 = IsPointInBox(*(Vector **)((int)aiStack_18d0 + iVar6 + 4),
                                             *(Vector **)((int)aiStack_18d0 + iVar6 + 8),
                                             *(Vector **)((int)aiStack_18d0 + iVar6 + 0xc));
                        if (cVar8 != '\0') goto LAB_00158d60;
                      }
                      else {
LAB_00158d60:
                        uVar12 = local_1890;
                        sVar4 = *(short *)(local_1898 + 0x6c);
                        iVar9 = *physcollision;
                        *(undefined4 **)((int)aiStack_18d0 + iVar6 + 0x14) = &local_1844;
                        *(undefined4 **)((int)aiStack_18d0 + iVar6 + 0xc) = &local_185c;
                        *(undefined4 *)((int)aiStack_18d0 + iVar6 + 8) = uVar12;
                        *(int *)((int)aiStack_18d0 + iVar6 + 0x18) = (int)sVar4;
                        *(undefined4 **)((int)aiStack_18d0 + iVar6 + 0x10) = &local_1850;
                        *(int **)((int)aiStack_18d0 + iVar6 + 4) = physcollision;
                        pcVar5 = *(code **)(iVar9 + 0x34);
                        *(undefined4 *)((int)aiStack_18d0 + iVar6) = 0x158da3;
                        (*pcVar5)();
                      }
                      iVar9 = iVar10 + 3;
                      if (local_1834 <= iVar9) goto LAB_00158c28;
                      if (local_1834 <= iVar10 + 5) goto LAB_00158f80;
                      uVar11 = (uint)local_1820[iVar9];
                      uVar14 = (uint)local_1820[iVar10 + 4];
                      uVar13 = (uint)local_1820[iVar10 + 5];
                      if (((local_182c <= (int)uVar11) || (local_182c <= (int)uVar14)) ||
                         (iVar10 = iVar9, local_182c <= (int)uVar13)) break;
                    } while( true );
                  }
                  *(int **)((int)aiStack_18d0 + iVar6 + 4) = &local_1860;
                  *(undefined4 *)((int)aiStack_18d0 + iVar6) = 0x158eee;
                  EndTrace(*(TraceInfo_t ***)((int)aiStack_18d0 + iVar6 + 4));
                  uVar12 = local_1890;
                  iVar10 = *physcollision;
                  *(int **)((int)aiStack_18d0 + iVar6 + 4) = physcollision;
                  *(undefined4 *)((int)aiStack_18d0 + iVar6 + 8) = uVar12;
                  pcVar5 = *(code **)(iVar10 + 0x30);
                  *(undefined4 *)((int)aiStack_18d0 + iVar6) = 0x158f05;
                  (*pcVar5)();
                }
              }
              else {
                *(int **)((int)aiStack_18d0 + iVar6 + 4) = &local_1860;
                *(undefined4 *)((int)aiStack_18d0 + iVar6) = 0x158fb8;
                EndTrace(*(TraceInfo_t ***)((int)aiStack_18d0 + iVar6 + 4));
              }
              uVar12 = 0;
              goto LAB_00158f07;
            }
          }
LAB_00158c28:
          local_1870 = local_1870 + 2;
          local_1874 = local_1874 + 1;
        } while (local_1870 != local_188c);
      }
      local_18a4 = local_18a4 + 1;
    } while (local_18a4 != local_18a8);
  }
  *(int **)((int)aiStack_18d0 + iVar6 + 4) = &local_1860;
  *(undefined4 *)((int)aiStack_18d0 + iVar6) = 0x158f47;
  EndTrace(*(TraceInfo_t ***)((int)aiStack_18d0 + iVar6 + 4));
  uVar7 = local_1890;
  iVar10 = *physcollision;
  *(undefined4 *)((int)aiStack_18d0 + iVar6 + 0xc) = 0;
  *(undefined4 *)((int)aiStack_18d0 + iVar6 + 8) = uVar7;
  *(int **)((int)aiStack_18d0 + iVar6 + 4) = physcollision;
  pcVar5 = *(code **)(iVar10 + 0x38);
  *(undefined4 *)((int)aiStack_18d0 + iVar6) = 0x158f66;
  uVar12 = (*pcVar5)();
  iVar10 = *physcollision;
  *(undefined4 *)((int)aiStack_18d0 + iVar6 + 8) = uVar7;
  *(int **)((int)aiStack_18d0 + iVar6 + 4) = physcollision;
  pcVar5 = *(code **)(iVar10 + 0x30);
  *(undefined4 *)((int)aiStack_18d0 + iVar6) = 0x158f7a;
  (*pcVar5)();
LAB_00158f07:
  if (local_20 != *(int *)(in_GS_OFFSET + 0x14)) {
                    /* WARNING: Subroutine does not return */
    *(undefined **)((int)aiStack_18d0 + iVar6) = &UNK_00158fc2;
    __stack_chk_fail();
  }
  return uVar12;
}

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)