L L4D2node

CM_ClipBoxToBrush<true>

0x0011ee80 · 865 bytes · __cdecl

_Z17CM_ClipBoxToBrushILb1EEvP11TraceInfo_tPK8cbrush_t

Decompiled

void (2 params)

/* void CM_ClipBoxToBrush<true>(TraceInfo_t*, cbrush_t const*) */

void CM_ClipBoxToBrush<true>(TraceInfo_t *param_1,cbrush_t *param_2)

{
  undefined4 *puVar1;
  ushort uVar2;
  ushort uVar3;
  undefined4 uVar4;
  int iVar5;
  float *pfVar6;
  cbrush_t *pcVar7;
  undefined *puVar8;
  bool bVar9;
  bool bVar10;
  undefined4 *puVar11;
  undefined **ppuVar12;
  float fVar13;
  float fVar14;
  float fVar15;
  float fVar16;
  undefined4 *local_24;
  float local_20;
  
  uVar2 = *(ushort *)(param_2 + 4);
  if (uVar2 == 0xffff) {
    pcVar7 = *(cbrush_t **)(param_1 + 0x104);
    uVar2 = *(ushort *)(param_2 + 6);
    if (*(int *)(pcVar7 + 0x78) <= (int)(uint)uVar2) {
      Error("Cannot load corrupted map.\n");
    }
    IntersectRayWithBoxBrush
              ((TraceInfo_t *)((uint)uVar2 * 0x30 + *(int *)(pcVar7 + 0x74)),pcVar7,
               (cboxbrush_t *)param_1);
    return;
  }
  if (uVar2 == 0) {
    return;
  }
  uVar4 = *(undefined4 *)param_2;
  uVar3 = *(ushort *)(param_2 + 6);
  iVar5 = *(int *)(param_1 + 0x104);
  if (*(int *)(iVar5 + 0x6c) <= (int)(uint)uVar3) {
    Error("Cannot load corrupted map.\n");
    uVar2 = *(ushort *)(param_2 + 4);
  }
  puVar11 = (undefined4 *)(*(int *)(iVar5 + 0x68) + (uint)uVar3 * 8);
  puVar1 = puVar11 + (uint)uVar2 * 2;
  if (puVar11 < puVar1) {
    bVar10 = false;
    bVar9 = false;
    local_24 = (undefined4 *)0x0;
    fVar16 = 1.0;
    local_20 = -99999.0;
    do {
      while( true ) {
        pfVar6 = (float *)*puVar11;
        if (*(short *)((int)puVar11 + 6) == 0) break;
LAB_0011ef20:
        puVar11 = puVar11 + 2;
        if (puVar1 <= puVar11) goto LAB_0011efdb;
      }
      fVar13 = (*(float *)param_1 * *pfVar6 - pfVar6[3]) + *(float *)(param_1 + 4) * pfVar6[1] +
               *(float *)(param_1 + 8) * pfVar6[2];
      fVar15 = (pfVar6[1] * *(float *)(param_1 + 0x10) + *pfVar6 * *(float *)(param_1 + 0xc) +
               pfVar6[2] * *(float *)(param_1 + 0x14)) - pfVar6[3];
      if (fVar13 <= 0.0) {
        if (fVar15 <= 0.0) goto LAB_0011ef20;
        bVar10 = true;
      }
      else {
        if (0.0 < fVar15) {
          return;
        }
        bVar9 = true;
      }
      if (fVar15 < fVar13) {
        fVar14 = fVar13 - 0.03125;
        if (fVar14 <= 0.0) {
          fVar14 = 0.0;
        }
        fVar14 = fVar14 / (fVar13 - fVar15);
        if (local_20 < fVar14) {
          local_24 = puVar11;
          local_20 = fVar14;
        }
        goto LAB_0011ef20;
      }
      puVar11 = puVar11 + 2;
      fVar13 = (fVar13 + 0.03125) / (fVar13 - fVar15);
      if (fVar13 <= fVar16) {
        fVar16 = fVar13;
      }
    } while (puVar11 < puVar1);
LAB_0011efdb:
    if ((bVar9) && (*(float *)(param_1 + 0x8c) - local_20 <= 0.0)) {
      if (fVar16 <= local_20) {
        return;
      }
      if (local_20 <= -99999.0) {
        return;
      }
      if (*(float *)(param_1 + 0x80) <= local_20) {
        return;
      }
      fVar16 = 0.0;
      if (0.0 <= local_20) {
        fVar16 = local_20;
      }
      *(undefined4 *)(param_1 + 0x114) = 0;
      iVar5 = *(int *)(param_1 + 0x104);
      *(float *)(param_1 + 0x80) = fVar16;
      puVar11 = (undefined4 *)*local_24;
      *(undefined4 *)(param_1 + 0x6c) = *puVar11;
      *(undefined4 *)(param_1 + 0x70) = puVar11[1];
      *(undefined4 *)(param_1 + 0x74) = puVar11[2];
      *(undefined4 *)(param_1 + 0x78) = puVar11[3];
      param_1[0x7c] = *(TraceInfo_t *)(puVar11 + 4);
      param_1[0x7d] = *(TraceInfo_t *)((int)puVar11 + 0x11);
      *(undefined2 *)(param_1 + 0x7e) = *(undefined2 *)((int)puVar11 + 0x12);
      ppuVar12 = &CCollisionBSPData::nullsurface;
      uVar2 = *(ushort *)(local_24 + 1);
      if (uVar2 != 0xffff) {
        if (*(int *)(iVar5 + 0x250) <= (int)(uint)uVar2) {
          Error("Cannot load corrupted map.\n");
        }
        ppuVar12 = (undefined **)(*(int *)(iVar5 + 0x24c) + (uint)uVar2 * 8);
      }
      puVar8 = *ppuVar12;
      *(undefined **)(param_1 + 0x94) = ppuVar12[1];
      *(undefined **)(param_1 + 0x90) = puVar8;
      *(undefined4 *)(param_1 + 0x84) = uVar4;
      return;
    }
    param_1[0x8b] = (TraceInfo_t)0x1;
    *(undefined4 *)(param_1 + 0x84) = uVar4;
    if (bVar10) {
      if (fVar16 == 1.0) {
        return;
      }
      if (fVar16 < *(float *)(param_1 + 0x8c) || fVar16 == *(float *)(param_1 + 0x8c)) {
        return;
      }
      *(float *)(param_1 + 0x8c) = fVar16;
      if (fVar16 < *(float *)(param_1 + 0x80)) {
        return;
      }
      *(undefined4 *)(param_1 + 0x80) = 0x3f800000;
      uVar4 = DAT_00340c94;
      *(undefined **)(param_1 + 0x90) = CCollisionBSPData::nullsurface;
      *(undefined4 *)(param_1 + 0x94) = uVar4;
      return;
    }
  }
  else {
    param_1[0x8b] = (TraceInfo_t)0x1;
    *(undefined4 *)(param_1 + 0x84) = uVar4;
  }
  param_1[0x8a] = (TraceInfo_t)0x1;
  *(undefined4 *)(param_1 + 0x80) = 0;
  *(undefined4 *)(param_1 + 0x8c) = 0x3f800000;
  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)