L L4D2node

IsRayIntersectingOBB

0x0058d360 · 2000 bytes · __cdecl

_Z20IsRayIntersectingOBBRK5Ray_tRK6VectorRK6QAngleS4_S4_

Decompiled

undefined (5 params)

/* IsRayIntersectingOBB(Ray_t const&, Vector const&, QAngle const&, Vector const&, Vector const&) */

uint IsRayIntersectingOBB
               (Ray_t *param_1,Vector *param_2,QAngle *param_3,Vector *param_4,Vector *param_5)

{
  float fVar1;
  float fVar2;
  float fVar3;
  char cVar4;
  uint uVar5;
  float fVar6;
  float fVar7;
  float fVar8;
  float fVar9;
  float fVar10;
  float fVar11;
  float fVar12;
  matrix3x4_t *pmVar13;
  float local_ec;
  float local_e8;
  float local_e4;
  float local_e0;
  float local_dc;
  float local_d8;
  float local_d4;
  float local_d0;
  float local_cc;
  float local_c8;
  float local_c4;
  float local_c0;
  float local_bc;
  float local_b8;
  float local_b4;
  undefined1 local_b0 [20];
  float local_9c;
  float local_98;
  float local_94;
  float local_6c;
  float local_68;
  float local_64;
  float local_60;
  float local_5c;
  float local_58;
  float local_54;
  float local_50;
  float local_4c;
  float local_48;
  float local_44;
  float local_40;
  undefined4 local_3c;
  undefined4 local_38;
  undefined4 local_34;
  Ray_t local_28;
  Ray_t local_27;
  
  if (((vec3_angle == *(float *)param_3) && (DAT_01053d40 == *(float *)(param_3 + 4))) &&
     (DAT_01053d44 == *(float *)(param_3 + 8))) {
    local_9c = *(float *)param_4 + *(float *)param_2;
    local_98 = *(float *)(param_4 + 4) + *(float *)(param_2 + 4);
    local_94 = *(float *)(param_4 + 8) + *(float *)(param_2 + 8);
    local_6c = *(float *)param_2 + *(float *)param_5;
    local_68 = *(float *)(param_2 + 4) + *(float *)(param_5 + 4);
    local_64 = *(float *)(param_2 + 8) + *(float *)(param_5 + 8);
    uVar5 = IsBoxIntersectingRay((Vector *)&local_9c,(Vector *)&local_6c,param_1,0.0);
    return uVar5;
  }
  if (param_1[0x44] != (Ray_t)0x0) {
    AngleIMatrix(param_3,param_2,(matrix3x4_t *)&local_9c);
    VectorTransform((float *)param_1,(matrix3x4_t *)&local_9c,&local_6c);
    VectorRotate((float *)(param_1 + 0x10),(matrix3x4_t *)&local_9c,&local_5c);
    local_28 = param_1[0x44];
    local_44 = (float)DAT_01053d50;
    local_27 = param_1[0x45];
    local_4c = (float)vec3_origin;
    local_48 = (float)DAT_01053d4c;
    local_3c = vec3_origin;
    local_38 = DAT_01053d4c;
    local_34 = DAT_01053d50;
    uVar5 = IsBoxIntersectingRay(param_4,param_5,(Ray_t *)&local_6c,0.0);
    return uVar5;
  }
  if (param_1[0x45] != (Ray_t)0x0) {
    ComputeCenterMatrix(param_2,param_3,param_4,param_5,(matrix3x4_t *)&local_6c);
    local_e8 = -(*(float *)(param_1 + 0x14) * 0.5 + *(float *)(param_1 + 4));
    local_e4 = -(*(float *)(param_1 + 0x18) * 0.5 + *(float *)(param_1 + 8));
    local_ec = -(*(float *)(param_1 + 0x10) * 0.5 + *(float *)param_1);
    SetIdentityMatrix((matrix3x4_t *)&local_9c);
    pmVar13 = (matrix3x4_t *)&local_9c;
    MatrixSetColumn((Vector *)&local_ec,3,(matrix3x4_t *)&local_9c);
    local_e0 = ABS(*(float *)(param_1 + 0x10)) * 0.5 + *(float *)(param_1 + 0x30);
    local_d0 = (*(float *)(param_5 + 4) - *(float *)(param_4 + 4)) * 0.5;
    local_dc = ABS(*(float *)(param_1 + 0x14)) * 0.5 + *(float *)(param_1 + 0x34);
    local_d8 = ABS(*(float *)(param_1 + 0x18)) * 0.5 + *(float *)(param_1 + 0x38);
    local_cc = (*(float *)(param_5 + 8) - *(float *)(param_4 + 8)) * 0.5;
    local_d4 = (*(float *)param_5 - *(float *)param_4) * 0.5;
    cVar4 = ComputeSeparatingPlane
                      ((matrix3x4_t *)&local_9c,(matrix3x4_t *)&local_6c,(Vector *)&local_e0,
                       (Vector *)&local_d4,(float)local_b0,(cplane_t *)pmVar13);
    uVar5 = 0;
    if (cVar4 == '\0') {
      local_c8 = *(float *)(param_1 + 0x10);
      local_c4 = *(float *)(param_1 + 0x14);
      local_c0 = *(float *)(param_1 + 0x18);
      VectorNormalize((Vector *)&local_c8);
      fVar9 = local_60 - *(float *)param_1;
      fVar10 = local_50 - *(float *)(param_1 + 4);
      fVar12 = local_40 - *(float *)(param_1 + 8);
      VectorIRotate(&local_c8,(matrix3x4_t *)&local_6c,&local_bc);
      fVar7 = local_c4 * local_4c - local_c0 * local_5c;
      fVar6 = local_5c * local_c8 - local_6c * local_c4;
      fVar1 = *(float *)(param_1 + 0x30);
      fVar8 = local_c0 * local_6c - local_4c * local_c8;
      fVar2 = *(float *)(param_1 + 0x34);
      fVar3 = *(float *)(param_1 + 0x38);
      if (((uint)ABS(fVar8 * fVar10 + fVar7 * fVar9 + fVar6 * fVar12) <=
           (uint)(ABS(local_b8) * local_cc + local_d0 * ABS(local_b4) + ABS(fVar1 * fVar7) +
                  ABS(fVar2 * fVar8) + ABS(fVar3 * fVar6))) &&
         (fVar8 = local_c4 * local_48 - local_c0 * local_58,
         fVar6 = local_c0 * local_68 - local_48 * local_c8,
         fVar7 = local_58 * local_c8 - local_68 * local_c4,
         (uint)ABS(fVar6 * fVar10 + fVar8 * fVar9 + fVar7 * fVar12) <=
         (uint)(local_cc * ABS(local_bc) + ABS(local_b4) * local_d4 + ABS(fVar1 * fVar8) +
                ABS(fVar2 * fVar6) + ABS(fVar3 * fVar7)))) {
        fVar11 = local_c4 * local_44 - local_c0 * local_54;
        fVar7 = local_c0 * local_64 - local_44 * local_c8;
        fVar8 = local_c8 * local_54 - local_c4 * local_64;
        fVar6 = ABS(fVar7 * fVar10 + fVar9 * fVar11 + fVar8 * fVar12);
        uVar5 = CONCAT31((int3)((uint)fVar6 >> 8),
                         (uint)fVar6 <=
                         (uint)(ABS(local_bc) * local_d0 + ABS(local_b8) * local_d4 +
                                ABS(fVar1 * fVar11) + ABS(fVar2 * fVar7) + ABS(fVar3 * fVar8)));
      }
    }
    return uVar5;
  }
  local_94 = (float)(*(uint *)(param_1 + 0x38) ^ 0x80000000);
  local_98 = (float)(*(uint *)(param_1 + 0x34) ^ 0x80000000);
  local_9c = (float)(*(uint *)(param_1 + 0x30) ^ 0x80000000);
  uVar5 = ComputeSeparatingPlane
                    ((Vector *)param_1,(QAngle *)&vec3_angle,(Vector *)&local_9c,
                     (Vector *)(param_1 + 0x30),param_2,param_3,param_4,param_5,0.0,
                     (cplane_t *)&local_6c);
  return uVar5 ^ 1;
}

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)