L L4D2node

RayHasFullyContainedIntersectionWithQuad

0x000ca640 · 2287 bytes · __cdecl

_Z40RayHasFullyContainedIntersectionWithQuadRK5Ray_tRK6VectorfS4_S4_fS4_f

Decompiled

undefined (8 params)

/* WARNING: Removing unreachable block (ram,0x000caac0) */
/* WARNING: Removing unreachable block (ram,0x000caaf3) */
/* WARNING: Removing unreachable block (ram,0x000caafd) */
/* WARNING: Removing unreachable block (ram,0x000cab3b) */
/* WARNING: Removing unreachable block (ram,0x000cacd0) */
/* WARNING: Removing unreachable block (ram,0x000cab51) */
/* WARNING: Removing unreachable block (ram,0x000cab5b) */
/* WARNING: Removing unreachable block (ram,0x000caae8) */
/* RayHasFullyContainedIntersectionWithQuad(Ray_t const&, Vector const&, float, Vector const&,
   Vector const&, float, Vector const&, float) */

undefined4
RayHasFullyContainedIntersectionWithQuad
          (Ray_t *param_1,Vector *param_2,float param_3,Vector *param_4,Vector *param_5,
          float param_6,Vector *param_7,float param_8)

{
  int iVar1;
  bool bVar2;
  float *pfVar3;
  float *pfVar4;
  int iVar5;
  uint uVar6;
  int iVar7;
  uint uVar8;
  float fVar9;
  float fVar10;
  float fVar11;
  float fVar12;
  float fVar13;
  float fVar14;
  int local_308;
  uint local_2e4;
  float local_2d4 [16];
  int local_294 [8];
  int aiStack_274 [8];
  float local_254 [48];
  float local_194 [97];
  
  if (param_1[0x44] == (Ray_t)0x0) {
    pfVar4 = local_254;
    uVar6 = 0;
    local_254[0] = *(float *)param_1 - *(float *)(param_1 + 0x30);
    local_254[3] = local_254[0];
    local_254[1] = *(float *)(param_1 + 4) - *(float *)(param_1 + 0x34);
    local_254[6] = local_254[0];
    local_254[7] = *(float *)(param_1 + 0x34) + *(float *)(param_1 + 4);
    local_254[9] = local_254[0];
    local_254[2] = *(float *)(param_1 + 8) - *(float *)(param_1 + 0x38);
    local_254[5] = *(float *)(param_1 + 0x38) + *(float *)(param_1 + 8);
    local_254[0xc] = *(float *)param_1 + *(float *)(param_1 + 0x30);
    local_254[10] = local_254[7];
    local_254[8] = local_254[5];
    local_254[0x11] = local_254[5];
    local_254[0x13] = local_254[7];
    local_254[0x14] = local_254[5];
    local_254[0x16] = local_254[7];
    local_254[4] = local_254[1];
    local_254[0xb] = local_254[2];
    local_254[0xd] = local_254[1];
    local_254[0xe] = local_254[2];
    local_254[0xf] = local_254[0xc];
    local_254[0x10] = local_254[1];
    local_254[0x12] = local_254[0xc];
    local_254[0x15] = local_254[0xc];
    local_254[0x17] = local_254[2];
    local_2e4 = 0;
    fVar9 = *(float *)param_2;
    fVar12 = *(float *)(param_2 + 4);
    fVar11 = *(float *)(param_2 + 8);
    iVar5 = 0;
    do {
      while (fVar10 = ((*pfVar4 * fVar9 + pfVar4[1] * fVar12) - param_3) + pfVar4[2] * fVar11,
            local_2d4[iVar5] = fVar10, fVar10 <= 0.0) {
        local_294[iVar5] = 2;
        iVar5 = iVar5 + 1;
        uVar6 = uVar6 | 2;
        pfVar4 = pfVar4 + 3;
        if (iVar5 == 8) goto LAB_000ca8ee;
      }
      local_294[iVar5] = 1;
      iVar5 = iVar5 + 1;
      uVar6 = uVar6 | 1;
      pfVar4 = pfVar4 + 3;
    } while (iVar5 != 8);
LAB_000ca8ee:
    if (param_1[0x45] != (Ray_t)0x0) {
      fVar13 = *(float *)(param_1 + 0x14);
      fVar10 = *(float *)(param_1 + 0x10);
      fVar14 = *(float *)(param_1 + 0x18);
      pfVar4 = local_254;
      do {
        pfVar3 = pfVar4 + 3;
        pfVar4[0x19] = pfVar4[1] + fVar13;
        pfVar4[0x1a] = pfVar4[2] + fVar14;
        pfVar4[0x18] = *pfVar4 + fVar10;
        pfVar4 = pfVar3;
      } while (pfVar3 != local_254 + 0x18);
      pfVar4 = local_254;
      iVar5 = 0;
      do {
        while (fVar10 = ((pfVar4[0x18] * fVar9 + pfVar4[0x19] * fVar12) - param_3) +
                        pfVar4[0x1a] * fVar11, local_2d4[iVar5 + 8] = fVar10, fVar10 <= 0.0) {
          aiStack_274[iVar5] = 2;
          iVar5 = iVar5 + 1;
          local_2e4 = local_2e4 | 2;
          pfVar4 = pfVar4 + 3;
          if (iVar5 == 8) goto LAB_000caa27;
        }
        aiStack_274[iVar5] = 1;
        iVar5 = iVar5 + 1;
        local_2e4 = local_2e4 | 1;
        pfVar4 = pfVar4 + 3;
      } while (iVar5 != 8);
LAB_000caa27:
      uVar6 = local_2e4 | uVar6;
    }
    if (uVar6 != 3) {
      return 0;
    }
    local_308 = 0;
    bVar2 = false;
    while (!bVar2) {
      bVar2 = true;
    }
    if (param_1[0x45] != (Ray_t)0x0) {
      iVar7 = 0;
      iVar5 = local_308;
      do {
        iVar1 = local_294[iVar7];
        local_308 = iVar5;
        if (iVar1 != aiStack_274[iVar7]) {
          uVar6 = (uint)(iVar1 == 1);
          uVar8 = (uint)(iVar1 != 1);
          fVar9 = local_254[iVar7 * 3 + uVar6 * 0x18 + 2];
          fVar14 = 1.0 / (local_2d4[iVar7 + uVar8 * 8] - local_2d4[iVar7 + uVar6 * 8]);
          local_308 = iVar5 + 1;
          fVar13 = local_2d4[iVar7 + uVar8 * 8] * fVar14;
          fVar14 = -local_2d4[iVar7 + uVar6 * 8] * fVar14;
          fVar12 = local_254[iVar7 * 3 + uVar6 * 0x18];
          fVar11 = local_254[uVar8 * 0x18 + iVar7 * 3 + 2];
          fVar10 = local_254[uVar8 * 0x18 + iVar7 * 3];
          local_194[iVar5 * 3 + 1] =
               local_254[uVar8 * 0x18 + iVar7 * 3 + 1] * fVar14 +
               local_254[iVar7 * 3 + uVar6 * 0x18 + 1] * fVar13;
          local_194[iVar5 * 3 + 2] = fVar11 * fVar14 + fVar9 * fVar13;
          local_194[iVar5 * 3] = fVar14 * fVar10 + fVar13 * fVar12;
        }
        iVar7 = iVar7 + 1;
        iVar5 = local_308;
      } while (iVar7 != 8);
    }
    if (local_308 == 0) {
      return 1;
    }
  }
  else {
    if (param_1[0x45] == (Ray_t)0x0) {
      if (1e-06 <= ABS((*(float *)(param_2 + 4) * *(float *)(param_1 + 4) +
                        *(float *)param_2 * *(float *)param_1 +
                       *(float *)(param_2 + 8) * *(float *)(param_1 + 8)) - param_3)) {
        return 0;
      }
      local_194[0] = *(float *)param_1;
      local_194[1] = *(float *)(param_1 + 4);
      local_194[2] = *(float *)(param_1 + 8);
    }
    else {
      local_254[0] = *(float *)param_1;
      local_254[1] = *(float *)(param_1 + 4);
      local_254[2] = *(float *)(param_1 + 8);
      local_254[3] = *(float *)(param_1 + 0x10) + local_254[0];
      local_254[4] = *(float *)(param_1 + 0x14) + local_254[1];
      local_254[5] = *(float *)(param_1 + 0x18) + local_254[2];
      fVar9 = (local_254[0] * *(float *)param_2 + local_254[1] * *(float *)(param_2 + 4) +
              local_254[2] * *(float *)(param_2 + 8)) - param_3;
      fVar12 = ((*(float *)(param_1 + 0x14) + local_254[1]) * *(float *)(param_2 + 4) +
                (*(float *)(param_1 + 0x10) + local_254[0]) * *(float *)param_2 +
               (*(float *)(param_1 + 0x18) + local_254[2]) * *(float *)(param_2 + 8)) - param_3;
      if (fVar9 <= 0.0) {
        if (fVar12 < 0.0) {
          return 0;
        }
        iVar7 = 0;
        iVar5 = 1;
        fVar11 = fVar12;
      }
      else {
        if (0.0 < fVar12) {
          return 0;
        }
        iVar7 = 1;
        iVar5 = 0;
        fVar11 = fVar9;
        fVar9 = fVar12;
      }
      fVar12 = 1.0 / (fVar11 - fVar9);
      fVar9 = fVar9 * fVar12;
      fVar12 = fVar12 * fVar11;
      local_194[1] = local_254[iVar7 * 3 + 1] * fVar12 - local_254[iVar5 * 3 + 1] * fVar9;
      local_194[2] = local_254[iVar7 * 3 + 2] * fVar12 - local_254[iVar5 * 3 + 2] * fVar9;
      local_194[0] = fVar12 * local_254[iVar7 * 3] - fVar9 * local_254[iVar5 * 3];
    }
    local_308 = 1;
  }
  iVar5 = 0;
  pfVar4 = local_194;
  while( true ) {
    if (param_6 < ABS(*(float *)(param_5 + 4) * (pfVar4[1] - *(float *)(param_4 + 4)) +
                      *(float *)param_5 * (*pfVar4 - *(float *)param_4) +
                      *(float *)(param_5 + 8) * (pfVar4[2] - *(float *)(param_4 + 8)))) {
      return 0;
    }
    if (param_8 < ABS((pfVar4[1] - *(float *)(param_4 + 4)) * *(float *)(param_7 + 4) +
                      (*pfVar4 - *(float *)param_4) * *(float *)param_7 +
                      (pfVar4[2] - *(float *)(param_4 + 8)) * *(float *)(param_7 + 8))) break;
    iVar5 = iVar5 + 1;
    pfVar4 = pfVar4 + 3;
    if (local_308 == iVar5) {
      return 1;
    }
  }
  return 0;
}

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)