L L4D2node

EnumerateLeavesAlongRay_R

0x00166fa0 · 394 bytes · __regparm3

_ZL25EnumerateLeavesAlongRay_RP7mnode_tRK5Ray_tffP22ISpatialLeafEnumeratori

Decompiled

undefined (6 params)

/* EnumerateLeavesAlongRay_R(mnode_t*, Ray_t const&, float, float, ISpatialLeafEnumerator*, int) */

undefined4 __regparm3
EnumerateLeavesAlongRay_R
          (mnode_t *param_1,Ray_t *param_2,float param_3,float param_4,
          ISpatialLeafEnumerator *param_5,int param_6)

{
  byte bVar1;
  float *pfVar2;
  char cVar3;
  int iVar4;
  uint uVar5;
  uint uVar6;
  undefined4 uVar7;
  float in_XMM0_Da;
  float in_XMM1_Da;
  float fVar8;
  float fVar9;
  float fVar10;
  ISpatialLeafEnumerator *in_stack_ffffffc8;
  int in_stack_ffffffcc;
  
  do {
    iVar4 = *(int *)param_1;
    if (iVar4 == 1) {
      return 1;
    }
    while( true ) {
      if (-1 < iVar4) {
        uVar7 = (*(code *)**(undefined4 **)param_3)
                          (param_3,(int)param_1 - *(int *)(DAT_003a172c + 0x10) >> 6,param_4);
        return uVar7;
      }
      pfVar2 = *(float **)(param_1 + 0x30);
      bVar1 = *(byte *)(pfVar2 + 4);
      if (bVar1 < 3) {
        fVar9 = *(float *)(param_2 + (uint)bVar1 * 4);
        fVar10 = *(float *)(param_2 + (uint)bVar1 * 4 + 0x10);
      }
      else {
        fVar9 = *(float *)(param_2 + 4) * pfVar2[1] + *(float *)param_2 * *pfVar2 +
                *(float *)(param_2 + 8) * pfVar2[2];
        fVar10 = pfVar2[1] * *(float *)(param_2 + 0x14) + *pfVar2 * *(float *)(param_2 + 0x10) +
                 pfVar2[2] * *(float *)(param_2 + 0x18);
      }
      fVar8 = fVar10 * in_XMM0_Da + (fVar9 - pfVar2[3]);
      fVar9 = fVar10 * in_XMM1_Da + (fVar9 - pfVar2[3]);
      uVar5 = (uint)(fVar8 < 0.0);
      uVar6 = (uint)(fVar9 < 0.0);
      if (uVar6 != uVar5) break;
      param_1 = *(mnode_t **)(param_1 + (uVar6 + 0xc) * 4 + 4);
      iVar4 = *(int *)param_1;
      if (iVar4 == 1) {
        return 1;
      }
    }
    fVar8 = fVar8 / (fVar8 - fVar9);
    in_XMM0_Da = (1.0 - fVar8) * in_XMM0_Da + fVar8 * in_XMM1_Da;
    cVar3 = EnumerateLeavesAlongRay_R
                      (*(mnode_t **)(param_1 + (uVar5 + 0xc) * 4 + 4),param_2,param_3,param_4,
                       in_stack_ffffffc8,in_stack_ffffffcc);
    if (cVar3 == '\0') {
      return 0;
    }
    param_1 = *(mnode_t **)(param_1 + ((uVar5 ^ 1) + 0xc) * 4 + 4);
  } while( true );
}

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)