L L4D2node

CM_RecursiveHullCheckImpl<true>

0x0011c3b0 · 898 bytes · __regparm3

_Z25CM_RecursiveHullCheckImplILb1EEvP11TraceInfo_tiffRK6VectorS4_

Decompiled

void (6 params)

/* void CM_RecursiveHullCheckImpl<true>(TraceInfo_t*, int, float, float, Vector const&, Vector
   const&) */

void __regparm3
CM_RecursiveHullCheckImpl<true>
          (TraceInfo_t *param_1,int param_2,float param_3,float param_4,Vector *param_5,
          Vector *param_6)

{
  undefined4 *puVar1;
  float *pfVar2;
  int iVar3;
  uint uVar4;
  float in_XMM0_Da;
  float in_XMM1_Da;
  float fVar5;
  float fVar6;
  float fVar7;
  float fVar8;
  Vector *in_stack_ffffffa8;
  Vector *in_stack_ffffffac;
  int local_44;
  float local_28;
  float local_24;
  float local_20;
  
  if (in_XMM0_Da < *(float *)(param_1 + 0x80)) {
    if (-1 < param_2) {
      do {
        while( true ) {
          puVar1 = (undefined4 *)(**(int **)(param_1 + 0x104) + param_2 * 0xc);
          pfVar2 = (float *)*puVar1;
          uVar4 = (uint)*(byte *)(pfVar2 + 4);
          fVar6 = pfVar2[3];
          if (*(byte *)(pfVar2 + 4) < 3) break;
          fVar5 = (*(float *)param_3 * *pfVar2 - fVar6) + *(float *)((int)param_3 + 4) * pfVar2[1] +
                  *(float *)((int)param_3 + 8) * pfVar2[2];
          fVar7 = (pfVar2[1] * *(float *)((int)param_4 + 4) + *pfVar2 * *(float *)param_4 +
                  pfVar2[2] * *(float *)((int)param_4 + 8)) - fVar6;
          fVar8 = 0.0;
          fVar6 = 0.0;
          if (0.0 < fVar7) goto LAB_0011c418;
LAB_0011c494:
          if ((-fVar6 <= fVar5) || (-fVar6 <= fVar7)) {
            if (fVar7 <= fVar5) {
              if (fVar5 <= fVar7) {
                fVar8 = 0.0;
                iVar3 = 0;
                fVar7 = 1.0;
                local_44 = 1;
              }
              else {
                local_44 = 1;
                iVar3 = 0;
                fVar7 = 1.0 / (fVar5 - fVar7);
                fVar8 = ((fVar5 - fVar6) + -0.03125) * fVar7;
                fVar7 = (fVar5 + fVar6 + 0.03125) * fVar7;
                if (fVar8 <= 0.0) {
                  fVar8 = 0.0;
                }
                if (fVar7 <= 0.0) {
                  fVar7 = 0.0;
                }
                if (1.0 <= fVar8) {
                  fVar8 = 1.0;
                }
                if (1.0 <= fVar7) {
                  fVar7 = 1.0;
                }
              }
            }
            else {
              local_44 = 0;
              iVar3 = 1;
              fVar7 = 1.0 / (fVar5 - fVar7);
              fVar8 = (fVar5 + fVar6 + 0.03125) * fVar7;
              fVar7 = ((fVar5 - fVar6) + -0.03125) * fVar7;
              if (fVar8 <= 0.0) {
                fVar8 = 0.0;
              }
              if (fVar7 <= 0.0) {
                fVar7 = 0.0;
              }
              if (1.0 <= fVar8) {
                fVar8 = 1.0;
              }
              if (1.0 <= fVar7) {
                fVar7 = 1.0;
              }
            }
            local_28 = (*(float *)param_4 - *(float *)param_3) * fVar7 + *(float *)param_3;
            local_24 = (*(float *)((int)param_4 + 4) - *(float *)((int)param_3 + 4)) * fVar7 +
                       *(float *)((int)param_3 + 4);
            local_20 = (*(float *)((int)param_4 + 8) - *(float *)((int)param_3 + 8)) * fVar7 +
                       *(float *)((int)param_3 + 8);
            CM_RecursiveHullCheckImpl<true>
                      (param_1,puVar1[iVar3 + 1],param_3,(float)&local_28,in_stack_ffffffa8,
                       in_stack_ffffffac);
            local_28 = (*(float *)param_4 - *(float *)param_3) * fVar8 + *(float *)param_3;
            local_24 = (*(float *)((int)param_4 + 4) - *(float *)((int)param_3 + 4)) * fVar8 +
                       *(float *)((int)param_3 + 4);
            local_20 = (*(float *)((int)param_4 + 8) - *(float *)((int)param_3 + 8)) * fVar8 +
                       *(float *)((int)param_3 + 8);
            CM_RecursiveHullCheckImpl<true>
                      (param_1,puVar1[local_44 + 1],(float)&local_28,param_4,in_stack_ffffffa8,
                       in_stack_ffffffac);
            return;
          }
          param_2 = puVar1[2];
          if (param_2 < 0) goto LAB_0011c4af;
        }
        fVar7 = *(float *)((int)param_4 + uVar4 * 4) - fVar6;
        fVar8 = *(float *)(param_1 + uVar4 * 4 + 0x30);
        fVar5 = *(float *)((int)param_3 + uVar4 * 4) - fVar6;
        fVar6 = fVar8;
        if (fVar7 <= fVar8) goto LAB_0011c494;
LAB_0011c418:
        fVar6 = fVar8;
        if (fVar5 <= fVar8) goto LAB_0011c494;
        param_2 = puVar1[1];
      } while (-1 < param_2);
    }
LAB_0011c4af:
    CM_TraceToLeaf<true>(param_1,~param_2,in_XMM0_Da,in_XMM1_Da);
  }
  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)