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 intoaddons/sourcemod/gamedata/<your_plugin>.txt
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.
Signatures + Functions block. The plugin uses
DHookCreateFromConf - DHooks reads return type, this-type,
calling convention, and argument types straight from the gamedata. Less
boilerplate in the plugin, types travel with the gamedata.
Type inference is best-effort from the C signature - sanity-check the DHooks types before shipping.