L L4D2node

CC_KDTreeTest

0x00b29ac0 · 4745 bytes · __cdecl

_Z13CC_KDTreeTestRK8CCommand

Decompiled

undefined (1 param)

/* WARNING: Globals starting with '_' overlap smaller symbols at the same address */
/* CC_KDTreeTest(CCommand const&) */

void CC_KDTreeTest(CCommand *param_1)

{
  float fVar1;
  longdouble lVar2;
  longdouble lVar3;
  char cVar4;
  int iVar5;
  float *pfVar6;
  float *pfVar7;
  int iVar8;
  float *pfVar9;
  long lVar10;
  ushort in_FPUStatusWord;
  longdouble lVar11;
  longdouble lVar12;
  double dVar13;
  double dVar14;
  double dVar15;
  int iVar16;
  undefined4 uVar17;
  undefined4 uVar18;
  undefined4 uVar19;
  CBaseEntity *local_fb04;
  int local_fac4;
  undefined **local_fab4;
  undefined ***local_fab0;
  float local_faa8;
  float local_faa4;
  float local_faa0;
  undefined **local_fa9c;
  undefined ***local_fa98;
  int local_fa94;
  undefined **local_fa90;
  undefined ***local_fa8c;
  int local_fa88;
  undefined4 local_fa84;
  int local_fa80;
  undefined **local_fa7c;
  float *local_fa78;
  undefined4 local_fa74;
  undefined4 local_fa70;
  int local_fa6c;
  float local_ea7c;
  float local_ea78;
  float local_ea74;
  float local_ea6c;
  float local_ea68;
  float local_ea64;
  float local_ea5c;
  float local_ea58;
  float local_ea54;
  float local_ea4c;
  float local_ea48;
  float local_ea44;
  undefined4 local_ea3c;
  undefined1 local_ea38;
  undefined1 local_ea37;
  float local_754c [3];
  Vector local_7540 [9988];
  float local_4e3c [5003];
  
  Msg("Testing kd-tree entity queries.");
  local_fb04 = (CBaseEntity *)0x0;
  if (*(int *)(gpGlobals + 0x14) < 2) {
    local_fb04 = (CBaseEntity *)UTIL_PlayerByIndex(1);
  }
  if (((byte)local_fb04[0x14d] & 8) != 0) {
    CBaseEntity::CalcAbsolutePosition(local_fb04);
  }
  local_faa8 = *(float *)(local_fb04 + 0x2e0);
  local_faa4 = *(float *)(local_fb04 + 0x2e4);
  local_faa0 = *(float *)(local_fb04 + 0x2e8);
  if (CC_KDTreeTest(CCommand_const&)::bFirst != '\0') {
    iVar16 = 0;
    pfVar7 = operator_new__(30000);
    dVar15 = 0.0;
    dVar14 = 0.0;
    dVar13 = 0.0;
    CC_KDTreeTest(CCommand_const&)::vecTargets = pfVar7;
    do {
      dVar13 = dVar13 + 307807.5;
      do {
        dVar13 = dVar13 - (dVar13 / 128.0) * 128.0;
      } while ((in_FPUStatusWord & 0x400) != 0);
      dVar14 = dVar14 + 191900.0;
      dVar13 = ABS(dVar13);
      do {
        dVar14 = dVar14 - (dVar14 / 6.2831854820251465) * 6.2831854820251465;
      } while ((in_FPUStatusWord & 0x400) != 0);
      dVar15 = dVar15 + 4994975.0;
      dVar14 = ABS(dVar14);
      do {
        dVar15 = dVar15 - (dVar15 / 3.1415927410125732) * 3.1415927410125732;
      } while ((in_FPUStatusWord & 0x400) != 0);
      dVar15 = ABS(dVar15);
      lVar2 = (longdouble)fcos((longdouble)(float)dVar14);
      lVar11 = (longdouble)fsin((longdouble)(float)dVar14);
      lVar3 = (longdouble)fcos((longdouble)(float)dVar15);
      lVar12 = (longdouble)fsin((longdouble)(float)dVar15);
      pfVar7 = (float *)((int)pfVar7 + iVar16);
      local_754c[0] = (float)((double)(float)lVar2 * (double)(float)lVar12 * dVar13);
      *pfVar7 = local_754c[0];
      local_754c[0] = local_754c[0] - local_faa8;
      pfVar7[2] = (float)((double)(float)lVar3 * dVar13);
      local_754c[1] = (float)((double)(float)lVar11 * (double)(float)lVar12 * dVar13);
      pfVar7[1] = local_754c[1];
      local_754c[1] = local_754c[1] - local_faa4;
      local_754c[2] = (float)((double)(float)lVar3 * dVar13) - local_faa0;
      VectorNormalize((Vector *)local_754c);
      pfVar7 = CC_KDTreeTest(CCommand_const&)::vecTargets;
      pfVar9 = (float *)((int)CC_KDTreeTest(CCommand_const&)::vecTargets + iVar16);
      iVar16 = iVar16 + 0xc;
      pfVar9[1] = local_754c[1] * 1024.0 + local_faa4;
      pfVar9[2] = local_754c[2] * 1024.0 + local_faa0;
      *pfVar9 = local_754c[0] * 1024.0 + local_faa8;
    } while (iVar16 != 30000);
    CC_KDTreeTest(CCommand_const&)::bFirst = '\0';
  }
  lVar10 = 0;
  if (1 < *(int *)param_1) {
    lVar10 = strtol(*(char **)(param_1 + 0x40c),(char **)0x0,10);
  }
  vtune(1);
  _DAT_0105d154 = _DAT_0105d1e4;
  if (DAT_0105d158 == '\0') {
    CVProfNode::Resume();
  }
  _DAT_0105d154 = _DAT_0105d154 + 1;
  if (_DAT_0105d154 == 1) {
    CVProfNode::EnterScope();
  }
  iVar16 = 0x105d160;
  CVProfNode::Reset();
  _DAT_0105d1dc = 0;
  if (_DAT_0105d154 != 0) {
    _DAT_0105d1dc = 1;
    CVProfNode::ExitScope();
    CVProfNode::MarkFrame();
    iVar16 = 0x105d160;
    CVProfNode::EnterScope();
  }
  if (lVar10 == 1) {
    local_fa9c = (undefined **)0x0;
    local_fa98 = (undefined ***)0x0;
    if (___atan2f_finite == 0) {
      local_fa88 = 0;
    }
    else {
      iVar16 = ___atan2f_finite;
      (**(code **)(___atan2f_finite + 0x50))
                (___atan2f_finite,&local_fa9c,0,0,0,0,"/data/src/game/server/util.cpp",0xc87,
                 &CC_KDTreeTest(CCommand_const&)::tm_fmt,"(%s)%s","Unaccounted","TraceTotal");
      local_fa88 = ___atan2f_finite;
    }
    iVar5 = _DAT_0105db00;
    local_fa90 = local_fa9c;
    local_fa8c = local_fa98;
                    /* try { // try from 00b2a551 to 00b2a555 has its CatchHandler @ 00b2adb0 */
    if (((_DAT_0105d154 != 0) || (DAT_0105d158 == '\0')) &&
       (iVar16 = ThreadGetCurrentId(iVar16), iVar5 == iVar16)) {
      if ((char *)*_DAT_0105d15c != "TraceTotal") {
                    /* try { // try from 00b2ab8a to 00b2ab9b has its CatchHandler @ 00b2adb0 */
        _DAT_0105d15c =
             (int *)CVProfNode::GetSubNode((char *)_DAT_0105d15c,0xd48670,(char *)0x1,0xbfafa1);
      }
      CVProfNode::EnterScope();
      DAT_0105d158 = '\0';
    }
    iVar16 = 0;
    do {
                    /* try { // try from 00b2a56a to 00b2a7a4 has its CatchHandler @ 00b2adb2 */
      iVar5 = (**(code **)(*g_pGameRules + 0x7c))(g_pGameRules);
      iVar8 = (**(code **)(*g_pGameRules + 0x7c))(g_pGameRules);
      pfVar7 = (float *)((int)CC_KDTreeTest(CCommand_const&)::vecTargets + iVar16);
      local_ea6c = *pfVar7 - local_faa8;
      local_ea68 = pfVar7[1] - local_faa4;
      local_ea3c = 0;
      local_ea64 = pfVar7[2] - local_faa0;
      local_ea37 = local_ea68 * local_ea68 + local_ea6c * local_ea6c + local_ea64 * local_ea64 !=
                   0.0;
      local_ea4c = (*(float *)(iVar5 + 0x18) - *(float *)(iVar8 + 0xc)) * 0.5;
      local_ea48 = (*(float *)(iVar5 + 0x1c) - *(float *)(iVar8 + 0x10)) * 0.5;
      local_ea44 = (*(float *)(iVar5 + 0x20) - *(float *)(iVar8 + 0x14)) * 0.5;
      local_ea38 = local_ea4c * local_ea4c + local_ea48 * local_ea48 + local_ea44 * local_ea44 <
                   1e-06;
      local_ea5c = (*(float *)(iVar5 + 0x18) + *(float *)(iVar8 + 0xc)) * 0.5;
      local_ea7c = local_faa8 + local_ea5c;
      local_ea58 = (*(float *)(iVar5 + 0x1c) + *(float *)(iVar8 + 0x10)) * 0.5;
      local_ea5c = -local_ea5c;
      local_ea78 = local_faa4 + local_ea58;
      local_ea58 = -local_ea58;
      local_ea54 = (*(float *)(iVar5 + 0x20) + *(float *)(iVar8 + 0x14)) * 0.5;
      local_ea74 = local_faa0 + local_ea54;
      local_ea54 = -local_ea54;
      CTraceFilterSimple::CTraceFilterSimple
                ((CTraceFilterSimple *)&local_fa7c,(IHandleEntity *)local_fb04,0,
                 (_func_bool_IHandleEntity_ptr_int *)0x0);
      (**(code **)(*enginetrace + 0x14))
                (enginetrace,&local_ea7c,0x200400b,(CTraceFilterSimple *)&local_fa7c,
                 (Vector *)local_754c);
      if (*(int *)(r_visualizetraces._28_4_ + 0x30) != 0) {
        DebugDrawLine((Vector *)local_754c,local_7540,0xff,0xff,0,true,-1.0);
      }
      iVar5 = _DAT_0105db00;
      iVar16 = iVar16 + 0xc;
    } while (iVar16 != 30000);
    if (((DAT_0105d158 == '\0') || (_DAT_0105d154 != 0)) &&
       (iVar16 = ThreadGetCurrentId(), iVar5 == iVar16)) {
      cVar4 = CVProfNode::ExitScope();
      if (cVar4 != '\0') {
        _DAT_0105d15c = (int *)_DAT_0105d15c[0x19];
      }
      DAT_0105d158 = _DAT_0105d15c == (int *)0x105d160;
    }
    if (local_fa88 != 0) {
      (**(code **)(local_fa88 + 0x54))(local_fa88,local_fa90,local_fa8c,0,0,0);
    }
  }
  else if (lVar10 < 2) {
    if (lVar10 == 0) {
      local_fa9c = (undefined **)0x0;
      local_fa98 = (undefined ***)0x0;
      if (___atan2f_finite == 0) {
        local_fa88 = 0;
      }
      else {
        iVar16 = ___atan2f_finite;
        (**(code **)(___atan2f_finite + 0x50))
                  (___atan2f_finite,&local_fa9c,0,0,0,0,"/data/src/game/server/util.cpp",0xc7c,
                   &CC_KDTreeTest(CCommand_const&)::tm_fmt,"(%s)%s","Unaccounted","TraceTotal");
        local_fa88 = ___atan2f_finite;
      }
      iVar5 = _DAT_0105db00;
      local_fa90 = local_fa9c;
      local_fa8c = local_fa98;
                    /* try { // try from 00b2a262 to 00b2a266 has its CatchHandler @ 00b2ad72 */
      if (((_DAT_0105d154 != 0) || (DAT_0105d158 == '\0')) &&
         (iVar16 = ThreadGetCurrentId(iVar16), iVar5 == iVar16)) {
        if ((char *)*_DAT_0105d15c != "TraceTotal") {
                    /* try { // try from 00b2ad30 to 00b2ad41 has its CatchHandler @ 00b2ad72 */
          _DAT_0105d15c =
               (int *)CVProfNode::GetSubNode((char *)_DAT_0105d15c,0xd48670,(char *)0x1,0xbfafa1);
        }
        CVProfNode::EnterScope();
        DAT_0105d158 = '\0';
      }
      iVar16 = 0;
      do {
        pfVar7 = (float *)((int)CC_KDTreeTest(CCommand_const&)::vecTargets + iVar16);
        local_ea6c = *pfVar7 - local_faa8;
        local_ea68 = pfVar7[1] - local_faa4;
        local_ea64 = pfVar7[2] - local_faa0;
        local_ea44 = 0.0;
        local_ea48 = 0.0;
        local_ea4c = 0.0;
        local_ea3c = 0;
        local_ea38 = 1;
        local_ea54 = 0.0;
        local_ea58 = 0.0;
        local_ea7c = local_faa8;
        local_ea5c = 0.0;
        local_ea78 = local_faa4;
        local_ea37 = local_ea64 * local_ea64 + local_ea6c * local_ea6c + local_ea68 * local_ea68 !=
                     0.0;
        local_ea74 = local_faa0;
                    /* try { // try from 00b2a372 to 00b2a3e3 has its CatchHandler @ 00b2ad4e */
        CTraceFilterSimple::CTraceFilterSimple
                  ((CTraceFilterSimple *)&local_fa7c,(IHandleEntity *)0x0,0,
                   (_func_bool_IHandleEntity_ptr_int *)0x0);
        (**(code **)(*enginetrace + 0x14))
                  (enginetrace,&local_ea7c,0x400b,(CTraceFilterSimple *)&local_fa7c,
                   (Vector *)local_754c);
        if (*(int *)(r_visualizetraces._28_4_ + 0x30) != 0) {
          DebugDrawLine((Vector *)local_754c,local_7540,0xff,0,0,true,-1.0);
        }
        iVar5 = _DAT_0105db00;
        iVar16 = iVar16 + 0xc;
      } while (iVar16 != 30000);
      if (((DAT_0105d158 == '\0') || (_DAT_0105d154 != 0)) &&
         (iVar16 = ThreadGetCurrentId(), iVar5 == iVar16)) {
        cVar4 = CVProfNode::ExitScope();
        if (cVar4 != '\0') {
          _DAT_0105d15c = (int *)_DAT_0105d15c[0x19];
        }
        DAT_0105d158 = _DAT_0105d15c == (int *)0x105d160;
      }
      if (local_fa88 != 0) {
        (**(code **)(local_fa88 + 0x54))(local_fa88,local_fa90,local_fa8c,0,0,0);
      }
    }
  }
  else if (lVar10 == 2) {
    pfVar7 = &local_ea7c;
    pfVar6 = CC_KDTreeTest(CCommand_const&)::vecTargets + 2;
    pfVar9 = local_754c;
    do {
      *pfVar7 = local_faa8;
      iVar16 = 3;
      pfVar7[1] = local_faa4;
      pfVar7[2] = local_faa0;
      *pfVar9 = local_faa8;
      pfVar9[1] = local_faa4;
      pfVar9[2] = local_faa0;
      do {
        if (pfVar6[-2] < *pfVar7) {
          *pfVar7 = pfVar6[-2];
        }
        if (pfVar6[-1] < pfVar7[1]) {
          pfVar7[1] = pfVar6[-1];
        }
        if (*pfVar6 < pfVar7[2]) {
          pfVar7[2] = *pfVar6;
        }
        fVar1 = pfVar6[-2];
        if (*pfVar9 <= fVar1 && fVar1 != *pfVar9) {
          *pfVar9 = fVar1;
        }
        fVar1 = pfVar6[-1];
        if (pfVar9[1] <= fVar1 && fVar1 != pfVar9[1]) {
          pfVar9[1] = fVar1;
        }
        fVar1 = *pfVar6;
        if (pfVar9[2] <= fVar1 && fVar1 != pfVar9[2]) {
          pfVar9[2] = fVar1;
        }
        iVar16 = iVar16 + -1;
      } while (iVar16 != 0);
      pfVar7 = pfVar7 + 3;
      pfVar9 = pfVar9 + 3;
      pfVar6 = pfVar6 + 3;
    } while (pfVar7 != local_754c);
    local_fab4 = (undefined **)0x0;
    local_fab0 = (undefined ***)0x0;
    if (___atan2f_finite == 0) {
      local_fa94 = 0;
    }
    else {
      (**(code **)(___atan2f_finite + 0x50))
                (___atan2f_finite,&local_fab4,0,0,0,0,"/data/src/game/server/util.cpp",0xca6,
                 &CC_KDTreeTest(CCommand_const&)::tm_fmt,"(%s)%s","Unaccounted","TraceTotal");
      local_fa94 = ___atan2f_finite;
    }
    iVar16 = _DAT_0105db00;
    local_fa9c = local_fab4;
    local_fa98 = local_fab0;
                    /* try { // try from 00b2a037 to 00b2a03b has its CatchHandler @ 00b2adac */
    if (((_DAT_0105d154 != 0) || (DAT_0105d158 == '\0')) &&
       (iVar5 = ThreadGetCurrentId(), iVar16 == iVar5)) {
      if ((char *)*_DAT_0105d15c != "TraceTotal") {
                    /* try { // try from 00b2ac36 to 00b2ac47 has its CatchHandler @ 00b2adac */
        _DAT_0105d15c =
             (int *)CVProfNode::GetSubNode((char *)_DAT_0105d15c,0xd48670,(char *)0x1,0xbfafa1);
      }
      CVProfNode::EnterScope();
      DAT_0105d158 = '\0';
    }
    iVar16 = 0;
    iVar5 = 0;
    do {
      local_fa90 = &PTR_EnumElement_00d48ce8;
      local_fa88 = 0x400;
      local_fa84 = 0;
      local_fa80 = 0;
                    /* try { // try from 00b2a0c5 to 00b2a0f4 has its CatchHandler @ 00b2ad88 */
      local_fa8c = &local_fa7c;
      (**(code **)(*partition + 0x38))
                (partition,0x10,(int)&local_ea7c + iVar5,(int)local_754c + iVar5,0,&local_fa90);
      iVar5 = iVar5 + 0xc;
      iVar16 = iVar16 + local_fa80;
    } while (iVar5 != 30000);
    Msg("Count = %d\n",iVar16);
    iVar16 = _DAT_0105db00;
    if (((DAT_0105d158 == '\0') || (_DAT_0105d154 != 0)) &&
       (iVar5 = ThreadGetCurrentId(), iVar16 == iVar5)) {
      cVar4 = CVProfNode::ExitScope();
      if (cVar4 != '\0') {
        _DAT_0105d15c = (int *)_DAT_0105d15c[0x19];
      }
      DAT_0105d158 = _DAT_0105d15c == (int *)0x105d160;
    }
    if (local_fa94 != 0) {
      (**(code **)(local_fa94 + 0x54))(local_fa94,local_fa9c,local_fa98,0,0,0);
    }
  }
  else if (lVar10 == 3) {
    pfVar7 = CC_KDTreeTest(CCommand_const&)::vecTargets;
    pfVar9 = local_754c;
    do {
      pfVar6 = pfVar9 + 1;
      *pfVar9 = SQRT((*pfVar7 - local_faa8) * (*pfVar7 - local_faa8) +
                     (pfVar7[2] - local_faa0) * (pfVar7[2] - local_faa0) +
                     (pfVar7[1] - local_faa4) * (pfVar7[1] - local_faa4)) * 0.5;
      pfVar7 = pfVar7 + 3;
      pfVar9 = pfVar6;
    } while (pfVar6 != local_4e3c);
    local_fa9c = (undefined **)0x0;
    local_fa98 = (undefined ***)0x0;
    if (___atan2f_finite == 0) {
      local_fa88 = 0;
    }
    else {
      (**(code **)(___atan2f_finite + 0x50))
                (___atan2f_finite,&local_fa9c,0,0,0,0,"/data/src/game/server/util.cpp",0xcc0,
                 &CC_KDTreeTest(CCommand_const&)::tm_fmt,"(%s)%s","Unaccounted","TraceTotal");
      local_fa88 = ___atan2f_finite;
    }
    iVar16 = _DAT_0105db00;
    local_fa90 = local_fa9c;
    local_fa8c = local_fa98;
                    /* try { // try from 00b29d23 to 00b29d27 has its CatchHandler @ 00b2ad86 */
    if (((_DAT_0105d154 != 0) || (DAT_0105d158 == '\0')) &&
       (iVar5 = ThreadGetCurrentId(), iVar16 == iVar5)) {
      if ((char *)*_DAT_0105d15c != "TraceTotal") {
                    /* try { // try from 00b2acb3 to 00b2acc4 has its CatchHandler @ 00b2ad86 */
        _DAT_0105d15c =
             (int *)CVProfNode::GetSubNode((char *)_DAT_0105d15c,0xd48670,(char *)0x1,0xbfafa1);
      }
      CVProfNode::EnterScope();
      DAT_0105d158 = '\0';
    }
    local_fac4 = 0;
    pfVar7 = local_754c;
    do {
      local_fa78 = &local_ea7c;
      local_fa7c = &PTR_EnumElement_00d48ce8;
      local_fa74 = 0x400;
      local_fa70 = 0;
      local_fa6c = 0;
                    /* try { // try from 00b29db6 to 00b29de1 has its CatchHandler @ 00b2ad76 */
      (**(code **)(*partition + 0x3c))(partition,0x10,&local_faa8,*pfVar7,0,&local_fa7c);
      pfVar7 = pfVar7 + 1;
      local_fac4 = local_fac4 + local_fa6c;
    } while (local_4e3c != pfVar7);
    Msg("Count = %d\n",local_fac4);
    iVar16 = _DAT_0105db00;
    if (((DAT_0105d158 == '\0') || (_DAT_0105d154 != 0)) &&
       (iVar5 = ThreadGetCurrentId(), iVar16 == iVar5)) {
      cVar4 = CVProfNode::ExitScope();
      if (cVar4 != '\0') {
        _DAT_0105d15c = (int *)_DAT_0105d15c[0x19];
      }
      DAT_0105d158 = _DAT_0105d15c == (int *)0x105d160;
    }
    if (local_fa88 != 0) {
      (**(code **)(local_fa88 + 0x54))(local_fa88,local_fa90,local_fa8c,0,0,0);
    }
  }
  iVar16 = _DAT_0105d154;
  if (_DAT_0105d154 != 0) {
    _DAT_0105d1dc = _DAT_0105d1dc + 1;
    CVProfNode::ExitScope();
    CVProfNode::MarkFrame();
    CVProfNode::EnterScope();
    iVar16 = _DAT_0105d154;
  }
  _DAT_0105d154 = 0;
  _DAT_0105d1e4 = iVar16;
  if (DAT_0105d158 == '\0') {
    CVProfNode::Pause();
  }
  uVar19 = 0xffffffff;
  uVar18 = 0;
  uVar17 = 0xfffffdfb;
  CVProfile::OutputReport(0x105c148,(char *)0xfffffdfb,0);
  vtune(0,uVar17,uVar18,uVar19);
  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)