L L4D2node

TraceToStudio

0x00b94a40 · 1541 bytes · __cdecl

_Z13TraceToStudioP20IPhysicsSurfacePropsRK5Ray_tP10CStudioHdrP18mstudiohitboxset_tPP11matrix3x4_tiRK6VectorfR10CGameTrace

Decompiled

undefined (9 params)

/* TraceToStudio(IPhysicsSurfaceProps*, Ray_t const&, CStudioHdr*, mstudiohitboxset_t*,
   matrix3x4_t**, int, Vector const&, float, CGameTrace&) */

Ray_t TraceToStudio(IPhysicsSurfaceProps *param_1,Ray_t *param_2,CStudioHdr *param_3,
                   mstudiohitboxset_t *param_4,matrix3x4_t **param_5,int param_6,Vector *param_7,
                   float param_8,CGameTrace *param_9)

{
  mstudiobbox_t *pmVar1;
  undefined4 uVar2;
  matrix3x4_t *pmVar3;
  int iVar4;
  Ray_t RVar5;
  int iVar6;
  int iVar7;
  float fVar8;
  float fVar9;
  float fVar10;
  float fVar11;
  float fVar12;
  float fVar13;
  int local_c8;
  int local_c4;
  float local_b4;
  float local_b0;
  float local_ac;
  float local_a8;
  float local_a4;
  float local_a0;
  float local_9c;
  float local_98;
  float local_94;
  float local_8c;
  float local_88;
  float local_84;
  float local_7c;
  float local_78;
  float local_74;
  float local_6c;
  float local_68;
  float local_64;
  float local_5c;
  float local_58;
  float local_54;
  undefined4 local_4c;
  undefined4 local_48;
  undefined4 local_44;
  undefined4 local_3c;
  undefined4 local_38;
  undefined4 local_34;
  undefined4 local_2c;
  undefined1 local_28;
  undefined1 local_27;
  
  RVar5 = param_2[0x44];
  if (RVar5 == (Ray_t)0x0) {
    RVar5 = (Ray_t)SweepBoxToStudio(param_1,param_2,param_3,param_4,param_5,param_6,param_9);
    return RVar5;
  }
  param_9[0x37] = (CGameTrace)0x0;
  *(undefined4 *)(param_9 + 0x2c) = 0x3f800000;
  if ((param_3[100] == (CStudioHdr)0x0) && (param_8 == 1.0)) {
    if ((param_6 & *(uint *)(*(int *)param_3 + 0x14c)) == 0) {
      return (Ray_t)0x0;
    }
    if (*(int *)(param_4 + 4) < 1) {
      return (Ray_t)0x0;
    }
    iVar6 = 0;
    local_c4 = -1;
    iVar7 = -1;
    do {
      local_c8 = ClipRayToHitbox(param_2,(mstudiobbox_t *)
                                         (param_4 + iVar6 * 0x44 + *(int *)(param_4 + 8)),
                                 param_5[*(int *)(param_4 + iVar6 * 0x44 + *(int *)(param_4 + 8))],
                                 param_9 + 0x2c);
      iVar4 = iVar6;
      if (local_c8 < 0) {
        local_c8 = iVar7;
        iVar4 = local_c4;
      }
      local_c4 = iVar4;
      iVar6 = iVar6 + 1;
      iVar7 = local_c8;
    } while (iVar6 < *(int *)(param_4 + 4));
  }
  else {
    if (*(int *)(param_4 + 4) < 1) {
      return (Ray_t)0x0;
    }
    fVar8 = 1.0 / param_8;
    iVar7 = 0;
    local_c8 = -1;
    local_c4 = -1;
    do {
      pmVar1 = (mstudiobbox_t *)(param_4 + iVar7 * 0x44 + *(int *)(param_4 + 8));
      if ((param_6 &
          *(uint *)(*(int *)param_3 + 0xb4 +
                   *(int *)pmVar1 * 0xd8 + *(int *)(*(int *)param_3 + 0xa0))) != 0) {
        if ((1.0000001 < param_8) || (param_8 < 0.9999999)) {
          MatrixCopy(param_5[*(int *)pmVar1],(matrix3x4_t *)&local_9c);
          MatrixGetColumn((matrix3x4_t *)&local_9c,3,(Vector *)&local_b4);
          local_a4 = (local_b0 - *(float *)(param_7 + 4)) * fVar8 + *(float *)(param_7 + 4);
          local_a0 = (local_ac - *(float *)(param_7 + 8)) * fVar8 + *(float *)(param_7 + 8);
          local_a8 = (local_b4 - *(float *)param_7) * fVar8 + *(float *)param_7;
          MatrixSetColumn((Vector *)&local_a8,3,(matrix3x4_t *)&local_9c);
          local_9c = local_9c * fVar8;
          local_5c = *(float *)(param_2 + 0x10) * fVar8;
          local_98 = local_98 * fVar8;
          local_58 = *(float *)(param_2 + 0x14) * fVar8;
          local_6c = (*(float *)param_2 - *(float *)param_7) * fVar8 + *(float *)param_7;
          local_94 = local_94 * fVar8;
          local_8c = local_8c * fVar8;
          local_88 = local_88 * fVar8;
          local_84 = local_84 * fVar8;
          local_7c = local_7c * fVar8;
          local_78 = local_78 * fVar8;
          local_74 = local_74 * fVar8;
          local_68 = (*(float *)(param_2 + 4) - *(float *)(param_7 + 4)) * fVar8 +
                     *(float *)(param_7 + 4);
          local_64 = (*(float *)(param_2 + 8) - *(float *)(param_7 + 8)) * fVar8 +
                     *(float *)(param_7 + 8);
          local_54 = *(float *)(param_2 + 0x18) * fVar8;
          local_27 = local_58 * local_58 + local_5c * local_5c + local_54 * local_54 != 0.0;
          local_34 = 0;
          local_38 = 0;
          local_3c = 0;
          local_2c = 0;
          local_28 = 1;
          local_44 = 0;
          local_48 = 0;
          local_4c = 0;
          iVar6 = ClipRayToHitbox((Ray_t *)&local_6c,pmVar1,(matrix3x4_t *)&local_9c,param_9 + 0x2c)
          ;
        }
        else {
          iVar6 = ClipRayToHitbox(param_2,pmVar1,param_5[*(int *)pmVar1],param_9 + 0x2c);
        }
        if (-1 < iVar6) {
          local_c8 = iVar6;
          local_c4 = iVar7;
        }
      }
      iVar7 = iVar7 + 1;
    } while (iVar7 < *(int *)(param_4 + 4));
  }
  if (local_c4 == -1) {
    return (Ray_t)0x0;
  }
  iVar7 = *(int *)(param_4 + 8);
  fVar8 = *(float *)(param_9 + 0x2c);
  fVar10 = *(float *)(param_2 + 0x10) * fVar8 + *(float *)param_2;
  *(float *)(param_9 + 0xc) = fVar10;
  fVar11 = *(float *)(param_2 + 0x14) * fVar8 + *(float *)(param_2 + 4);
  *(float *)(param_9 + 0x10) = fVar11;
  fVar8 = fVar8 * *(float *)(param_2 + 0x18) + *(float *)(param_2 + 8);
  *(float *)(param_9 + 0x14) = fVar8;
  uVar2 = *(undefined4 *)(param_4 + *(int *)(param_4 + 8) + local_c4 * 0x44 + 4);
  *(int *)(param_9 + 0x50) = local_c4;
  *(undefined4 *)(param_9 + 0x44) = uVar2;
  iVar6 = *(int *)(param_4 + iVar7 + local_c4 * 0x44) * 0xd8 + *(int *)(*(int *)param_3 + 0xa0) +
          *(int *)param_3;
  *(uint *)(param_9 + 0x30) = *(uint *)(iVar6 + 0xb4) | 0x40000000;
  uVar2 = *(undefined4 *)(iVar6 + 0xac);
  *(undefined **)(param_9 + 0x3c) = &DAT_00c5994b;
  *(short *)(param_9 + 0x48) = (short)uVar2;
  *(undefined2 *)(param_9 + 0x42) = 0x8000;
  *(short *)(param_9 + 0x40) = (short)*(undefined4 *)(iVar6 + 0xb8);
  pmVar3 = param_5[*(int *)(param_4 + iVar7 + local_c4 * 0x44)];
  if (local_c8 < 3) {
    fVar12 = -*(float *)(pmVar3 + local_c8 * 4);
    *(float *)(param_9 + 0x18) = fVar12;
    fVar9 = -*(float *)(pmVar3 + local_c8 * 4 + 0x10);
    *(float *)(param_9 + 0x1c) = fVar9;
    fVar13 = -*(float *)(pmVar3 + local_c8 * 4 + 0x20);
    *(float *)(param_9 + 0x20) = fVar13;
  }
  else {
    fVar12 = *(float *)(pmVar3 + (local_c8 + -3) * 4);
    iVar7 = (local_c8 + -3) * 4;
    *(float *)(param_9 + 0x18) = fVar12;
    fVar9 = *(float *)(pmVar3 + iVar7 + 0x10);
    *(float *)(param_9 + 0x1c) = fVar9;
    fVar13 = *(float *)(pmVar3 + iVar7 + 0x20);
    *(float *)(param_9 + 0x20) = fVar13;
  }
  param_9[0x28] = (CGameTrace)0x3;
  *(float *)(param_9 + 0x24) = fVar9 * fVar11 + fVar10 * fVar12 + fVar8 * fVar13;
  return RVar5;
}

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)