L L4D2node

CEngineTrace::TraceRayAgainstLeafAndEntityList

0x0015be20 · 2083 bytes · __thiscall

_ZN12CEngineTrace32TraceRayAgainstLeafAndEntityListERK5Ray_tP14ITraceListDatajP12ITraceFilterP10CGameTrace

Decompiled

undefined (6 params)

/* WARNING: Globals starting with '_' overlap smaller symbols at the same address */
/* CEngineTrace::TraceRayAgainstLeafAndEntityList(Ray_t const&, ITraceListData*, unsigned int,
   ITraceFilter*, CGameTrace*) */

void __thiscall
CEngineTrace::TraceRayAgainstLeafAndEntityList
          (CEngineTrace *this,Ray_t *param_1,ITraceListData *param_2,uint param_3,
          ITraceFilter *param_4,CGameTrace *param_5)

{
  undefined4 *puVar1;
  float fVar2;
  float fVar3;
  float fVar4;
  float fVar5;
  float fVar6;
  float fVar7;
  int *piVar8;
  char cVar9;
  int iVar10;
  CTraceListData *pCVar11;
  int iVar12;
  undefined4 uVar13;
  undefined **ppuVar14;
  int iVar15;
  Ray_t *pRVar16;
  Ray_t *pRVar17;
  byte bVar18;
  undefined **local_118;
  undefined4 local_114;
  undefined4 local_110;
  undefined4 local_108;
  undefined4 local_104;
  int local_100;
  float local_fc;
  float local_f8;
  float local_f4;
  float local_f0;
  float local_ec;
  float local_e8;
  Vector local_e4 [12];
  Vector local_d8 [12];
  Ray_t local_cc [16];
  float local_bc;
  float local_b8;
  float local_b4;
  CGameTrace local_70 [96];
  
  bVar18 = 0;
  local_114 = 0;
  local_110 = 0;
  if (_exit == 0) {
    local_100 = 0;
  }
  else {
    (**(code **)(_exit + 0x50))
              (_exit,&local_114,0,0,0,0,"/data/src/engine/./enginetrace.cpp",0x680,
               &TraceRayAgainstLeafAndEntityList(Ray_t_const&,ITraceListData*,unsigned_int,ITraceFilter*,CGameTrace*)
                ::tm_fmt,"(%s)%s","Unaccounted","TraceRayAgainstLeafAndEntityList");
    local_100 = _exit;
  }
  iVar12 = _DAT_0040b9d4;
  local_108 = local_114;
  local_104 = local_110;
                    /* try { // try from 0015beed to 0015bef1 has its CatchHandler @ 0015c67a */
  if (((_DAT_0040b028 != 0) || (DAT_0040b02c == '\0')) &&
     (iVar10 = ThreadGetCurrentId(), iVar12 == iVar10)) {
    if ((char *)*_DAT_0040b030 != "TraceRayAgainstLeafAndEntityList") {
                    /* try { // try from 0015c4c8 to 0015c4d9 has its CatchHandler @ 0015c67a */
      _DAT_0040b030 =
           (int *)CVProfNode::GetSubNode((char *)_DAT_0040b030,0x2aec90,&DAT_00000001,0x2a054b);
    }
    CVProfNode::EnterScope();
    DAT_0040b02c = '\0';
  }
  pCVar11 = (CTraceListData *)(param_2 + -4);
  if (param_2 == (ITraceListData *)0x0) {
    pCVar11 = (CTraceListData *)0x0;
  }
  ComputeRayBounds(param_1,(Vector *)&local_fc,(Vector *)&local_f0);
  if ((((*(float *)(pCVar11 + 0x534) < local_f0) || (local_fc < *(float *)(pCVar11 + 0x528))) ||
      ((*(float *)(pCVar11 + 0x538) < local_ec ||
       ((local_f8 < *(float *)(pCVar11 + 0x52c) || (*(float *)(pCVar11 + 0x53c) < local_e8)))))) ||
     (local_f4 < *(float *)(pCVar11 + 0x530))) {
                    /* try { // try from 0015bf73 to 0015bf75 has its CatchHandler @ 0015c692 */
    (**(code **)(*(int *)this + 0x14))(this,param_1,param_3,param_4,param_5);
LAB_0015bf76:
    iVar12 = _DAT_0040b9d4;
    if (((DAT_0040b02c == '\0') || (_DAT_0040b028 != 0)) &&
       (iVar10 = ThreadGetCurrentId(), iVar12 == iVar10)) {
      cVar9 = CVProfNode::ExitScope();
      if (cVar9 != '\0') {
        _DAT_0040b030 = (int *)_DAT_0040b030[0x19];
      }
      DAT_0040b02c = _DAT_0040b030 == (int *)0x40b034;
    }
    if (local_100 != 0) {
      (**(code **)(local_100 + 0x54))(local_100,local_108,local_104,0,0,0);
    }
  }
  else {
    local_118 = &PTR_ShouldHitEntity_002aef28;
    if (param_4 == (ITraceFilter *)0x0) {
      param_4 = (ITraceFilter *)&local_118;
      ppuVar14 = &PTR_ShouldHitEntity_002aef28;
    }
    else {
      ppuVar14 = *(undefined ***)param_4;
    }
                    /* try { // try from 0015c054 to 0015c32d has its CatchHandler @ 0015c692 */
    iVar12 = (*(code *)ppuVar14[1])(param_4);
    if (iVar12 == 2) {
      CM_ClearTrace(param_5);
      fVar2 = *(float *)(param_1 + 0x20);
      fVar3 = *(float *)param_1;
      *(float *)param_5 = fVar2 + fVar3;
      fVar4 = *(float *)(param_1 + 0x24);
      fVar5 = *(float *)(param_1 + 4);
      *(float *)(param_5 + 4) = fVar4 + fVar5;
      fVar6 = *(float *)(param_1 + 0x28);
      fVar7 = *(float *)(param_1 + 8);
      *(float *)(param_5 + 8) = fVar6 + fVar7;
      *(float *)(param_5 + 0xc) = fVar2 + fVar3 + *(float *)(param_1 + 0x10);
      *(float *)(param_5 + 0x10) = fVar4 + fVar5 + *(float *)(param_1 + 0x14);
      *(float *)(param_5 + 0x14) = fVar6 + fVar7 + *(float *)(param_1 + 0x18);
    }
    else {
      uVar13 = (**(code **)(*(int *)this + 100))(this);
      CM_BoxTraceAgainstLeafList(param_1,pCVar11,param_3,param_5);
      (**(code **)(*(int *)this + 0x68))(this,uVar13,param_5);
      if ((*(float *)(param_5 + 0x2c) == 0.0) ||
         (iVar12 = (**(code **)(*(int *)param_4 + 4))(param_4), iVar12 == 1)) goto LAB_0015bf76;
    }
    fVar2 = *(float *)(param_5 + 0x2c);
    pRVar16 = param_1;
    pRVar17 = local_cc;
    for (iVar12 = 0x14; iVar12 != 0; iVar12 = iVar12 + -1) {
      *(undefined4 *)pRVar17 = *(undefined4 *)pRVar16;
      pRVar16 = pRVar16 + (uint)bVar18 * -8 + 4;
      pRVar17 = pRVar17 + ((uint)bVar18 * -2 + 1) * 4;
    }
    if (fVar2 == 0.0) {
      local_bc = 0.0;
      local_b8 = 0.0;
      local_b4 = 0.0;
      *(undefined4 *)(param_5 + 0x38) = 0x3f800000;
      *(undefined4 *)(param_5 + 0x2c) = 0x3f800000;
    }
    else {
      local_b4 = local_b4 * fVar2;
      local_b8 = local_b8 * fVar2;
      local_bc = local_bc * fVar2;
      *(undefined4 *)(param_5 + 0x2c) = 0x3f800000;
      *(float *)(param_5 + 0x38) = *(float *)(param_5 + 0x38) / fVar2;
    }
    iVar12 = (**(code **)(*(int *)param_4 + 4))(param_4);
    iVar10 = (**(code **)(*(int *)param_4 + 4))(param_4);
    if (((iVar12 != 2) && (iVar12 = *(int *)(pCVar11 + 0x520), 0 < iVar12)) &&
       (param_5[0x36] == (CGameTrace)0x0)) {
      iVar15 = 0;
      do {
        puVar1 = (undefined4 *)(*(int *)(pCVar11 + 0x310) + iVar15 * 8);
        piVar8 = (int *)puVar1[1];
        if ((iVar10 != 3) ||
           (cVar9 = (*(code *)**(undefined4 **)param_4)(param_4,*puVar1,param_3), cVar9 != '\0')) {
          (**(code **)(*piVar8 + 0x3c))(piVar8,local_e4,local_d8);
          cVar9 = IsBoxIntersectingRay(local_e4,local_d8,local_cc,0.03125);
          if (cVar9 != '\0') {
                    /* try { // try from 0015c51d to 0015c5ba has its CatchHandler @ 0015c692 */
            (**(code **)(*(int *)this + 0x10))(this,local_cc,param_3,piVar8,local_70);
            ClipTraceToTrace(this,local_70,param_5);
          }
        }
      } while ((iVar15 + 1 != iVar12) && (iVar15 = iVar15 + 1, param_5[0x36] == (CGameTrace)0x0));
    }
    iVar12 = *(int *)(pCVar11 + 0x308);
    if ((0 < iVar12) && (param_5[0x36] == (CGameTrace)0x0)) {
      iVar10 = 0;
      do {
        puVar1 = (undefined4 *)(*(int *)(pCVar11 + 0xf8) + iVar10 * 8);
        piVar8 = (int *)puVar1[1];
        cVar9 = (*(code *)**(undefined4 **)param_4)(param_4,*puVar1,param_3);
        if (cVar9 != '\0') {
          (**(code **)(*piVar8 + 0x3c))(piVar8,local_e4,local_d8);
          cVar9 = IsBoxIntersectingRay(local_e4,local_d8,local_cc,0.03125);
          if (cVar9 != '\0') {
            (**(code **)(*(int *)this + 0x10))(this,local_cc,param_3,piVar8,local_70);
            ClipTraceToTrace(this,local_70,param_5);
          }
        }
      } while ((iVar10 + 1 != iVar12) && (iVar10 = iVar10 + 1, param_5[0x36] == (CGameTrace)0x0));
    }
    *(float *)(param_5 + 0x2c) = *(float *)(param_5 + 0x2c) * fVar2;
    *(float *)(param_5 + 0x38) = *(float *)(param_5 + 0x38) * fVar2;
    if (param_1[0x44] == (Ray_t)0x0) {
      *(float *)param_5 = *(float *)(param_1 + 0x20) + *(float *)param_1;
      *(float *)(param_5 + 4) = *(float *)(param_1 + 0x24) + *(float *)(param_1 + 4);
      *(float *)(param_5 + 8) = *(float *)(param_1 + 0x28) + *(float *)(param_1 + 8);
      *(undefined4 *)(param_5 + 0x38) = 0;
    }
    iVar12 = _DAT_0040b9d4;
    if (((DAT_0040b02c == '\0') || (_DAT_0040b028 != 0)) &&
       (iVar10 = ThreadGetCurrentId(), iVar12 == iVar10)) {
      cVar9 = CVProfNode::ExitScope();
      if (cVar9 != '\0') {
        _DAT_0040b030 = (int *)_DAT_0040b030[0x19];
      }
      DAT_0040b02c = _DAT_0040b030 == (int *)0x40b034;
    }
    if (local_100 != 0) {
      (**(code **)(local_100 + 0x54))(local_100,local_108,local_104,0,0,0);
      return;
    }
  }
  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)