L L4D2node

CVoxelTree::EnumerateElementsAlongRay_ExtrudedRay

0x001e1490 · 2139 bytes · __thiscall

_ZN10CVoxelTree37EnumerateElementsAlongRay_ExtrudedRayEiRK5Ray_tRK6VectorS5_P20IPartitionEnumerator

Decompiled

undefined (6 params)

/* CVoxelTree::EnumerateElementsAlongRay_ExtrudedRay(int, Ray_t const&, Vector const&, Vector
   const&, IPartitionEnumerator*) */

bool __thiscall
CVoxelTree::EnumerateElementsAlongRay_ExtrudedRay
          (CVoxelTree *this,int param_1,Ray_t *param_2,Vector *param_3,Vector *param_4,
          IPartitionEnumerator *param_5)

{
  float *pfVar1;
  CVoxelHash *this_00;
  bool bVar2;
  char cVar3;
  int *piVar4;
  int iVar5;
  int iVar6;
  byte bVar7;
  int iVar8;
  uint uVar9;
  uint uVar10;
  uint uVar11;
  float fVar12;
  float fVar13;
  uint local_1bc;
  uint local_1a0;
  uint local_19c;
  uint local_18c;
  int local_188;
  int *local_180;
  float local_178;
  float local_174;
  float local_170;
  float local_16c;
  float local_168;
  float local_164;
  int local_160 [3];
  float local_154 [6];
  float local_13c [3];
  int aiStack_130 [6];
  int aiStack_118 [3];
  int local_10c [6];
  int local_f4 [6];
  int local_dc [6];
  int local_c4 [6];
  undefined4 local_ac;
  CUtlHashFast<int,CUtlHashFastNoHash> local_a8 [72];
  undefined4 local_60;
  undefined4 local_5c;
  undefined4 uStack_58;
  undefined4 uStack_54;
  undefined4 uStack_50;
  undefined4 local_4c;
  undefined4 uStack_48;
  undefined4 uStack_44;
  undefined4 uStack_40;
  undefined4 local_3c;
  undefined4 uStack_38;
  undefined4 uStack_34;
  undefined4 uStack_30;
  undefined4 local_2c;
  undefined4 uStack_28;
  undefined4 uStack_24;
  undefined4 uStack_20;
  
  local_170 = *(float *)(param_2 + 8) - *(float *)(param_2 + 0x38);
  local_16c = *(float *)param_2 + *(float *)(param_2 + 0x30);
  local_178 = *(float *)param_2 - *(float *)(param_2 + 0x30);
  local_174 = *(float *)(param_2 + 4) - *(float *)(param_2 + 0x34);
  local_164 = *(float *)(param_2 + 8) + *(float *)(param_2 + 0x38);
  pfVar1 = *(float **)(this + 8);
  local_168 = *(float *)(param_2 + 4) + *(float *)(param_2 + 0x34);
  bVar7 = SUB41(pfVar1[0x413],0) * '\x02' + 8;
  local_10c[0] = (int)(local_178 - *pfVar1) >> (bVar7 & 0x1f);
  local_10c[1] = (int)(local_174 - pfVar1[1]) >> (bVar7 & 0x1f);
  local_10c[2] = (int)(local_170 - pfVar1[2]) >> (bVar7 & 0x1f);
  local_10c[3] = (int)(local_16c - *pfVar1) >> (bVar7 & 0x1f);
  local_10c[4] = (int)(local_168 - pfVar1[1]) >> (bVar7 & 0x1f);
  local_10c[5] = (int)(local_164 - pfVar1[2]) >> (bVar7 & 0x1f);
  CUtlHashFast<int,CUtlHashFastNoHash>::CUtlHashFast(local_a8);
  piVar4 = (int *)___tls_get_addr();
  local_ac = *(undefined4 *)(this + *piVar4 * 4 + 0x3c);
  local_60 = *(undefined4 *)(this + 0x38);
  local_5c = *(undefined4 *)param_2;
  uStack_58 = *(undefined4 *)(param_2 + 4);
  uStack_54 = *(undefined4 *)(param_2 + 8);
  uStack_50 = *(undefined4 *)(param_2 + 0xc);
  local_4c = *(undefined4 *)(param_2 + 0x10);
  uStack_48 = *(undefined4 *)(param_2 + 0x14);
  uStack_44 = *(undefined4 *)(param_2 + 0x18);
  uStack_40 = *(undefined4 *)(param_2 + 0x1c);
  local_3c = *(undefined4 *)param_3;
  uStack_38 = *(undefined4 *)(param_3 + 4);
  uStack_34 = *(undefined4 *)(param_3 + 8);
  uStack_30 = *(undefined4 *)(param_3 + 0xc);
  local_2c = *(undefined4 *)(param_2 + 0x30);
  uStack_28 = *(undefined4 *)(param_2 + 0x34);
  uStack_24 = *(undefined4 *)(param_2 + 0x38);
  uStack_20 = *(undefined4 *)(param_2 + 0x3c);
  local_180 = aiStack_130 + 0xc;
  local_188 = 0;
  if (0 < *(int *)(this + 4)) {
    do {
      bVar7 = (char)local_188 * '\x02';
      local_1a0 = local_10c[0] >> (bVar7 & 0x1f);
      local_180[-3] = local_1a0;
      local_180[-2] = local_10c[1] >> (bVar7 & 0x1f);
      local_180[-1] = local_10c[2] >> (bVar7 & 0x1f);
      *local_180 = local_10c[3] >> (bVar7 & 0x1f);
      local_180[1] = local_10c[4] >> (bVar7 & 0x1f);
      local_180[2] = local_10c[5] >> (bVar7 & 0x1f);
      if ((int)local_1a0 <= *local_180) {
        local_1bc = local_1a0 & 0xffff;
        do {
          local_1bc = local_1bc & 0xffff07ff;
          local_18c = local_180[-2];
          local_19c = local_18c & 0xffff;
          uVar10 = local_1bc;
          if ((int)local_18c <= local_180[1]) {
            do {
              local_19c = local_19c & 0xffff07ff;
              uVar10 = uVar10 & 0xffc007ff | local_19c << 0xb;
              uVar11 = local_180[-1];
              uVar9 = uVar11;
              if ((int)uVar11 <= local_180[2]) {
                do {
                  uVar10 = uVar10 & 0x3fffff | (uVar9 & 0xffff03ff) << 0x16;
                    /* try { // try from 001e175e to 001e1cb1 has its CatchHandler @ 001e1d07 */
                  bVar2 = CVoxelHash::EnumerateElementsInVoxel<CIntersectSweptBox>
                                    ((CVoxelHash *)(local_188 * 0x1050 + *(int *)(this + 8)),uVar10,
                                     &local_ac,param_1,param_5);
                  if (!bVar2) goto LAB_001e1767;
                  uVar9 = (uVar9 & 0xffff03ff) + 1;
                  uVar11 = uVar11 + 1;
                } while ((int)uVar11 <= local_180[2]);
              }
              local_18c = local_18c + 1;
              local_19c = (uint)(ushort)((short)local_19c + 1);
            } while ((int)local_18c <= local_180[1]);
          }
          local_1a0 = local_1a0 + 1;
          local_1bc = (uint)(ushort)((short)local_1bc + 1);
        } while ((int)local_1a0 <= *local_180);
      }
      local_188 = local_188 + 1;
      local_180 = local_180 + 6;
    } while (local_188 < *(int *)(this + 4));
  }
  this_00 = *(CVoxelHash **)(this + 8);
  bVar7 = (char)*(undefined4 *)(this_00 + 0x104c) * '\x02' + 8;
  if ((((((int)((*(float *)param_4 - *(float *)(param_2 + 0x30)) - *(float *)this_00) >>
          (bVar7 & 0x1f) < local_10c[0]) ||
        ((int)((*(float *)(param_4 + 4) - *(float *)(param_2 + 0x34)) - *(float *)(this_00 + 4)) >>
         (bVar7 & 0x1f) < local_10c[1])) ||
       ((int)((*(float *)(param_4 + 8) - *(float *)(param_2 + 0x38)) - *(float *)(this_00 + 8)) >>
        (bVar7 & 0x1f) < local_10c[2])) ||
      ((local_10c[3] <
        (int)((*(float *)param_4 + *(float *)(param_2 + 0x30)) - *(float *)this_00) >>
        (bVar7 & 0x1f) ||
       (local_10c[4] <
        (int)((*(float *)(param_4 + 4) + *(float *)(param_2 + 0x34)) - *(float *)(this_00 + 4)) >>
        (bVar7 & 0x1f))))) ||
     (local_10c[5] <
      (int)((*(float *)(param_4 + 8) + *(float *)(param_2 + 0x38)) - *(float *)(this_00 + 8)) >>
      (bVar7 & 0x1f))) {
    CVoxelHash::LeafListExtrudedRaySetup
              (this_00,param_2,param_3,(Vector *)&local_178,(Vector *)&local_16c,aiStack_130 + 9,
               aiStack_130 + 0xc,local_160,local_154 + 3,local_154,local_154 + 6);
    iVar5 = 0;
    do {
      iVar6 = iVar5 + (uint)(0 < local_160[iVar5]) * 3;
      aiStack_130[iVar5] = local_f4[iVar6];
      iVar8 = local_c4[iVar6];
      aiStack_130[iVar5 + 3] = local_dc[iVar6];
      aiStack_130[iVar5 + 6] = iVar8;
      iVar5 = iVar5 + 1;
    } while (iVar5 != 3);
LAB_001e19b0:
    if (local_154[0] < 1.0) goto LAB_001e19e3;
LAB_001e19d5:
    if ((local_154[1] < 1.0) || (local_154[2] < 1.0)) {
LAB_001e19e3:
      if (local_154[1] <= local_154[0]) goto LAB_001e1aa8;
      do {
        if (local_154[2] <= local_154[0]) goto LAB_001e1cf0;
        iVar5 = 0;
        fVar13 = local_154[0];
LAB_001e19fb:
        if (local_154[4] <= local_154[3]) {
          if (local_154[5] <= local_154[4]) goto LAB_001e1cc8;
          iVar6 = 1;
          fVar12 = local_154[4];
        }
        else if (local_154[5] <= local_154[3]) {
LAB_001e1cc8:
          iVar6 = 2;
          fVar12 = local_154[5];
        }
        else {
          iVar6 = 0;
          fVar12 = local_154[3];
        }
        if (fVar13 <= fVar12) {
          local_154[iVar5] = fVar13 + local_154[iVar5 + 6];
          uVar10 = (uint)(0 < local_160[iVar5]);
          iVar6 = iVar5 + uVar10 * 3;
          iVar8 = local_160[iVar5] + aiStack_130[iVar6 + 9];
          aiStack_130[iVar6 + 9] = iVar8;
          local_f4[iVar6] = iVar8 >> 2;
          local_c4[iVar6] = iVar8 >> 6;
          local_dc[iVar6] = iVar8 >> 4;
          cVar3 = CVoxelHash::EnumerateElementsAlongRay_ExtrudedRaySlice
                            (*(CVoxelHash **)(this + 8),param_1,param_5,
                             (CIntersectSweptBox *)&local_ac,aiStack_130 + 9,aiStack_130 + 0xc,iVar5
                             ,local_160);
          if (cVar3 != '\0') {
            if (aiStack_130[iVar5] != aiStack_130[uVar10 * 3 + iVar5 + 0xf]) {
              aiStack_130[iVar5] = aiStack_130[uVar10 * 3 + iVar5 + 0xf];
              cVar3 = CVoxelHash::EnumerateElementsAlongRay_ExtrudedRaySlice
                                ((CVoxelHash *)(*(int *)(this + 8) + 0x1050),param_1,param_5,
                                 (CIntersectSweptBox *)&local_ac,local_f4,local_f4 + 3,iVar5,
                                 local_160);
              if (cVar3 == '\0') goto LAB_001e1cba;
            }
            if (aiStack_130[iVar5 + 3] != aiStack_130[uVar10 * 3 + iVar5 + 0x15]) {
              aiStack_130[iVar5 + 3] = aiStack_130[uVar10 * 3 + iVar5 + 0x15];
              cVar3 = CVoxelHash::EnumerateElementsAlongRay_ExtrudedRaySlice
                                ((CVoxelHash *)(*(int *)(this + 8) + 0x20a0),param_1,param_5,
                                 (CIntersectSweptBox *)&local_ac,local_dc,local_dc + 3,iVar5,
                                 local_160);
              if (cVar3 == '\0') goto LAB_001e1cba;
            }
            if (aiStack_130[iVar5 + 6] == aiStack_130[uVar10 * 3 + iVar5 + 0x1b]) goto LAB_001e19b0;
            aiStack_130[iVar5 + 6] = aiStack_130[uVar10 * 3 + iVar5 + 0x1b];
            cVar3 = CVoxelHash::EnumerateElementsAlongRay_ExtrudedRaySlice
                              ((CVoxelHash *)(*(int *)(this + 8) + 0x30f0),param_1,param_5,
                               (CIntersectSweptBox *)&local_ac,local_c4,local_c4 + 3,iVar5,local_160
                              );
            if (cVar3 != '\0') goto LAB_001e19b0;
          }
LAB_001e1cba:
          bVar2 = false;
          goto LAB_001e1767;
        }
        iVar5 = local_160[iVar6];
        local_154[iVar6 + 3] = fVar12 + local_154[iVar6 + 6];
        iVar6 = iVar6 + (uint)(iVar5 < 1) * 3;
        iVar5 = iVar5 + aiStack_130[iVar6 + 9];
        aiStack_130[iVar6 + 9] = iVar5;
        local_f4[iVar6] = iVar5 >> 2;
        local_c4[iVar6] = iVar5 >> 6;
        local_dc[iVar6] = iVar5 >> 4;
        if (1.0 <= local_154[0]) goto LAB_001e19d5;
      } while (local_154[0] < local_154[1]);
LAB_001e1aa8:
      if (local_154[2] <= local_154[1]) {
LAB_001e1cf0:
        iVar5 = 2;
        fVar13 = local_154[2];
      }
      else {
        iVar5 = 1;
        fVar13 = local_154[1];
      }
      goto LAB_001e19fb;
    }
  }
  bVar2 = true;
LAB_001e1767:
  CUtlHashFast<int,CUtlHashFastNoHash>::~CUtlHashFast(local_a8);
  return bVar2;
}

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)