L L4D2node

CDispCollTree::SweepAABBTriIntersect

0x000cd1d0 · 1182 bytes · __thiscall

_ZN13CDispCollTree21SweepAABBTriIntersectERK5Ray_tRK6VectoriP12CDispCollTriP10CBaseTrace

Decompiled

undefined (6 params)

/* CDispCollTree::SweepAABBTriIntersect(Ray_t const&, Vector const&, int, CDispCollTri*,
   CBaseTrace*) */

void __thiscall
CDispCollTree::SweepAABBTriIntersect
          (CDispCollTree *this,Ray_t *param_1,Vector *param_2,int param_3,CDispCollTri *param_4,
          CBaseTrace *param_5)

{
  ushort *puVar1;
  float fVar2;
  char cVar3;
  bool bVar4;
  int iVar5;
  float fVar6;
  float fVar7;
  float fVar8;
  float fVar9;
  float fVar10;
  Vector *local_40;
  float local_34;
  float local_30;
  undefined4 local_2c;
  undefined4 local_28;
  undefined4 local_24;
  undefined4 local_20;
  
  local_30 = 1.0;
  local_34 = -99999.9;
  if (*(float *)(param_1 + 0x14) * *(float *)(param_4 + 0xc) +
      *(float *)(param_1 + 0x10) * *(float *)(param_4 + 8) +
      *(float *)(param_1 + 0x18) * *(float *)(param_4 + 0x10) <= 0.03125) {
    local_40 = (Vector *)
               (AxisPlanesXYZ(Ray_t_const&,CDispCollTri*,CDispCollHelper*)::g_ImpactNormalVecs +
               0x18);
    iVar5 = 2;
    do {
      fVar7 = *(float *)(param_1 + iVar5 * 4);
      fVar8 = *(float *)(param_1 + iVar5 * 4 + 0x30);
      fVar2 = *(float *)(param_1 + iVar5 * 4 + 0x10);
      fVar10 = *(float *)(*(int *)(this + 0x70) +
                          (*(ushort *)(param_4 + ((byte)param_4[iVar5 * 2 + 1] >> 1 & 3) * 2) &
                          0x1ff) * 0xc + iVar5 * 4);
      fVar6 = (fVar10 - fVar8) - fVar7;
      cVar3 = ResolveRayPlaneIntersect
                        (this,fVar6,fVar6 - fVar2,local_40,fVar10,(CDispCollHelper *)&local_34);
      if (cVar3 == '\0') {
        return;
      }
      fVar10 = *(float *)(*(int *)(this + 0x70) +
                          (*(ushort *)(param_4 + ((byte)param_4[iVar5 * 2 + 1] >> 3 & 3) * 2) &
                          0x1ff) * 0xc + iVar5 * 4);
      fVar7 = (fVar7 - fVar8) - fVar10;
      cVar3 = ResolveRayPlaneIntersect
                        (this,fVar7,fVar2 + fVar7,local_40 + 0x24,fVar10,
                         (CDispCollHelper *)&local_34);
      if (cVar3 == '\0') {
        return;
      }
      local_40 = local_40 + -0xc;
      iVar5 = iVar5 + -1;
    } while (iVar5 != -1);
    puVar1 = (ushort *)(*(int *)(this + 0xb0) + param_3 * 0x12);
    bVar4 = EdgeCrossAxis<0>(this,param_1,*puVar1,(CDispCollHelper *)&local_34);
    if (((((bVar4) &&
          (bVar4 = EdgeCrossAxis<0>(this,param_1,puVar1[1],(CDispCollHelper *)&local_34), bVar4)) &&
         (bVar4 = EdgeCrossAxis<0>(this,param_1,puVar1[2],(CDispCollHelper *)&local_34), bVar4)) &&
        (((bVar4 = EdgeCrossAxis<1>(this,param_1,puVar1[3],(CDispCollHelper *)&local_34), bVar4 &&
          (bVar4 = EdgeCrossAxis<1>(this,param_1,puVar1[4],(CDispCollHelper *)&local_34), bVar4)) &&
         ((bVar4 = EdgeCrossAxis<1>(this,param_1,puVar1[5],(CDispCollHelper *)&local_34), bVar4 &&
          ((bVar4 = EdgeCrossAxis<2>(this,param_1,puVar1[6],(CDispCollHelper *)&local_34), bVar4 &&
           (bVar4 = EdgeCrossAxis<2>(this,param_1,puVar1[7],(CDispCollHelper *)&local_34), bVar4))))
         )))) && (bVar4 = EdgeCrossAxis<2>(this,param_1,puVar1[8],(CDispCollHelper *)&local_34),
                 bVar4)) {
      fVar7 = *(float *)(param_4 + 8);
      fVar8 = *(float *)(param_1 + 0x30);
      if (0.0 <= fVar7) {
        fVar8 = -fVar8;
      }
      fVar2 = *(float *)(param_4 + 0xc);
      fVar10 = *(float *)(param_1 + 0x34);
      if (0.0 <= fVar2) {
        fVar10 = -fVar10;
      }
      fVar6 = *(float *)(param_4 + 0x10);
      fVar9 = *(float *)(param_1 + 0x38);
      if (0.0 <= fVar6) {
        fVar9 = -fVar9;
      }
      fVar8 = ((*(float *)(param_4 + 0x14) - fVar8 * fVar7) - fVar10 * fVar2) - fVar9 * fVar6;
      cVar3 = ResolveRayPlaneIntersect
                        (this,(fVar2 * *(float *)(param_1 + 4) + fVar7 * *(float *)param_1 +
                              fVar6 * *(float *)(param_1 + 8)) - fVar8,
                         ((*(float *)(param_1 + 0x14) + *(float *)(param_1 + 4)) * fVar2 +
                          (*(float *)(param_1 + 0x10) + *(float *)param_1) * fVar7 +
                         (*(float *)(param_1 + 8) + *(float *)(param_1 + 0x18)) * fVar6) - fVar8,
                         (Vector *)(param_4 + 8),*(float *)(param_4 + 0x14),
                         (CDispCollHelper *)&local_34);
      if (((cVar3 != '\0') &&
          (((local_34 < local_30 || (ABS(local_34 - local_30) < 0.001)) && (local_34 != -99999.9))))
         && (local_34 < *(float *)(param_5 + 0x2c))) {
        if (local_34 < 0.0) {
          local_34 = 0.0;
        }
        *(float *)(param_5 + 0x2c) = local_34;
        *(undefined4 *)(param_5 + 0x18) = local_2c;
        *(undefined4 *)(param_5 + 0x1c) = local_28;
        *(undefined4 *)(param_5 + 0x20) = local_24;
        *(undefined4 *)(param_5 + 0x24) = local_20;
        *(ushort *)(param_5 + 0x34) = *(ushort *)(param_4 + 6) >> 6 & 0x1f;
      }
    }
  }
  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)