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 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.