L L4D2node

IsLineOfSightBetweenTwoEntitiesClear

0x0049d760 · 794 bytes · __cdecl

_Z36IsLineOfSightBetweenTwoEntitiesClearP11CBaseEntity19EEntityOffsetMode_tS0_S1_S0_ijPFbP13IHandleEntityiEfb

Decompiled

undefined (10 params)

/* IsLineOfSightBetweenTwoEntitiesClear(CBaseEntity*, EEntityOffsetMode_t, CBaseEntity*,
   EEntityOffsetMode_t, CBaseEntity*, int, unsigned int, bool (*)(IHandleEntity*, int), float, bool)
    */

QueryCacheEntry_t
IsLineOfSightBetweenTwoEntitiesClear
          (int *param_1,undefined4 param_2,int *param_3,undefined4 param_4,int *param_5,
          undefined4 param_6,int param_7,undefined4 param_8,int param_9,char param_10)

{
  int iVar1;
  char cVar2;
  int *piVar3;
  undefined4 *puVar4;
  int iVar5;
  int *piVar6;
  QueryCacheEntry_t *pQVar7;
  int iVar8;
  int iVar9;
  int iVar10;
  QueryCacheEntry_t *pQVar11;
  int local_74;
  int local_70;
  int local_6c [9];
  int local_48 [3];
  undefined4 local_3c;
  undefined4 local_38;
  undefined4 local_34;
  int local_30;
  uint local_2c;
  undefined4 local_28;
  undefined4 local_24;
  int local_20;
  
  local_48[0] = -1;
  local_48[1] = 0xffffffff;
  local_48[2] = 0xffffffff;
  local_74 = 3 - (uint)(param_10 == '\0');
  if (param_1 != (int *)0x0) {
    piVar3 = (int *)(**(code **)(*param_1 + 0xc))(param_1);
    local_48[0] = *piVar3;
  }
  if (param_3 == (int *)0x0) {
    local_48[1] = 0xffffffff;
  }
  else {
    puVar4 = (undefined4 *)(**(code **)(*param_3 + 0xc))(param_3);
    local_48[1] = *puVar4;
  }
  if (param_5 == (int *)0x0) {
    local_48[2] = 0xffffffff;
    iVar10 = 2;
    local_34 = 3;
    local_3c = param_2;
    local_38 = param_4;
    local_30 = param_7;
  }
  else {
    iVar10 = 3;
    puVar4 = (undefined4 *)(**(code **)(*param_5 + 0xc))(param_5);
    local_34 = 3;
    local_48[2] = *puVar4;
    local_3c = param_2;
    local_38 = param_4;
    local_30 = param_7;
  }
  iVar9 = local_74;
  local_34 = 3;
  local_20 = param_9;
  local_28 = param_6;
  local_24 = param_8;
  iVar5 = 0;
  iVar8 = local_74;
  do {
    piVar3 = local_48 + iVar5;
    iVar5 = iVar5 + 1;
    iVar8 = (int)&local_3c + iVar8 + *piVar3;
  } while (iVar5 < iVar10);
  s_nNumCacheQueries = s_nNumCacheQueries + 1;
  local_2c = iVar8 + param_7 + param_9 & 0x7ff;
  pQVar7 = (QueryCacheEntry_t *)(&s_HashChains)[local_2c];
  local_70 = iVar10;
  iVar8 = s_nReplaceCtr;
  pQVar11 = s_VictimList;
  local_3c = param_2;
  local_38 = param_4;
  local_30 = param_7;
  while( true ) {
    s_nReplaceCtr = iVar8;
    s_VictimList = pQVar11;
    if (pQVar7 == (QueryCacheEntry_t *)0x0) {
      if (pQVar11 == (QueryCacheEntry_t *)0x0) {
        s_nReplaceCtr = 0x3ff;
        if (-1 < iVar8 + -1) {
          s_nReplaceCtr = iVar8 + -1;
        }
        pQVar11 = (QueryCacheEntry_t *)(&s_QCache + iVar8 * 0x1a);
        if (*(int *)(&DAT_00f816e8 + iVar8 * 0x68) != 0) {
          iVar5 = *(int *)(iVar8 * 0x68 + 0xf81730);
          if ((undefined4 *)(&DAT_00f816e4)[iVar8 * 0x1a] == (undefined4 *)0x0) {
            if (pQVar11 == (QueryCacheEntry_t *)(&s_HashChains)[iVar5]) {
              iVar1 = (&s_QCache)[iVar8 * 0x1a];
              (&s_HashChains)[iVar5] = iVar1;
              if (iVar1 != 0) {
                *(undefined4 *)(iVar1 + 4) = 0;
                iVar10 = local_70;
              }
            }
          }
          else {
            *(undefined4 *)(&DAT_00f816e4)[iVar8 * 0x1a] = (&s_QCache)[iVar8 * 0x1a];
            iVar9 = local_74;
            iVar10 = local_70;
            if ((&s_QCache)[iVar8 * 0x1a] != 0) {
              *(undefined4 *)((&s_QCache)[iVar8 * 0x1a] + 4) = (&DAT_00f816e4)[iVar8 * 0x1a];
            }
          }
          (&DAT_00f816e4)[iVar8 * 0x1a] = 0;
          (&s_QCache)[iVar8 * 0x1a] = 0;
        }
      }
      else {
        s_VictimList = *(QueryCacheEntry_t **)pQVar11;
        if (s_VictimList != (QueryCacheEntry_t *)0x0) {
          *(undefined4 *)(s_VictimList + 4) = 0;
          iVar10 = local_70;
        }
      }
      *(int *)(pQVar11 + 0xc) = iVar10;
      *(int *)(pQVar11 + 8) = iVar9;
      piVar3 = local_6c;
      pQVar7 = pQVar11 + 0x10;
      do {
        piVar6 = piVar3 + 3;
        *(int *)pQVar7 = *piVar3;
        *(int *)(pQVar7 + 4) = piVar3[1];
        *(int *)(pQVar7 + 8) = piVar3[2];
        piVar3 = piVar6;
        pQVar7 = pQVar7 + 0xc;
      } while (piVar6 != local_48);
      *(int *)(pQVar11 + 0x34) = local_48[0];
      *(int *)(pQVar11 + 0x38) = local_48[1];
      *(int *)(pQVar11 + 0x3c) = local_48[2];
      *(undefined4 *)(pQVar11 + 0x40) = local_3c;
      *(undefined4 *)(pQVar11 + 0x44) = local_38;
      *(undefined4 *)(pQVar11 + 0x48) = local_34;
      *(int *)(pQVar11 + 0x4c) = local_30;
      *(uint *)(pQVar11 + 0x50) = local_2c;
      *(undefined4 *)(pQVar11 + 0x54) = local_28;
      *(int *)(pQVar11 + 0x5c) = local_20;
      *(undefined4 *)(pQVar11 + 0x58) = local_24;
      *(undefined4 *)pQVar11 = (&s_HashChains)[local_2c];
      if ((&s_HashChains)[local_2c] != 0) {
        *(QueryCacheEntry_t **)((&s_HashChains)[local_2c] + 4) = pQVar11;
      }
      *(undefined4 *)(pQVar11 + 4) = 0;
      (&s_HashChains)[local_2c] = pQVar11;
      pQVar11[0x65] = (QueryCacheEntry_t)0x0;
      QueryCacheEntry_t::IssueQuery(pQVar11);
      pQVar11[100] = (QueryCacheEntry_t)0x1;
      return pQVar11[0x66];
    }
    cVar2 = QueryCacheKey_t::Matches((QueryCacheKey_t *)(pQVar7 + 8),(QueryCacheKey_t *)&local_74);
    if (cVar2 != '\0') break;
    pQVar7 = *(QueryCacheEntry_t **)pQVar7;
    iVar8 = s_nReplaceCtr;
    pQVar11 = s_VictimList;
  }
  if ((*(int *)(sv_disable_querycache._28_4_ + 0x30) == 0) &&
     (*(float *)(gpGlobals + 0xc) - *(float *)(pQVar7 + 0x60) < *(float *)(pQVar7 + 0x5c))) {
    if (pQVar7[0x65] != (QueryCacheEntry_t)0x0) {
      s_SuccessfulSpeculatives = s_SuccessfulSpeculatives + 1;
    }
    pQVar7[100] = (QueryCacheEntry_t)0x1;
    return pQVar7[0x66];
  }
  pQVar7[0x65] = (QueryCacheEntry_t)0x0;
  QueryCacheEntry_t::IssueQuery(pQVar7);
  pQVar7[100] = (QueryCacheEntry_t)0x1;
  return pQVar7[0x66];
}

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)