CVomit::FindVomitTarget
0x004e4560 · 1202 bytes · __thiscall
_ZNK6CVomit15FindVomitTargetEv
Decompiled
undefined (1 param)
/* CVomit::FindVomitTarget() const */
CBaseEntity * __thiscall CVomit::FindVomitTarget(CVomit *this)
{
float fVar1;
uint uVar2;
CBasePlayer *this_00;
code *pcVar3;
int *piVar4;
char cVar5;
int iVar6;
undefined *puVar7;
CBaseEntity *pCVar8;
undefined4 *puVar9;
float fVar10;
float local_174;
float local_170;
float local_16c;
float local_168;
float local_164;
float local_160;
CTraceFilterSimple local_15c [16];
float local_14c;
float local_148;
float local_144;
CTraceFilterSimple local_13c [16];
float local_12c;
float local_128;
float local_124;
float local_11c;
float local_118;
float local_114;
undefined4 local_10c;
undefined4 local_108;
undefined4 local_104;
undefined4 local_fc;
undefined4 local_f8;
undefined4 local_f4;
undefined4 local_ec;
undefined1 local_e8;
undefined1 local_e7;
Vector local_d0 [12];
Vector local_c4 [64];
CBaseEntity *local_84;
float local_7c;
float local_78;
float local_74;
Vector local_70 [4];
float local_6c;
float local_68;
float local_64;
undefined4 local_5c;
undefined4 local_58;
undefined4 local_54;
float local_50;
undefined4 local_4c;
undefined4 local_48;
undefined4 local_44;
undefined4 local_3c;
undefined1 local_38;
undefined1 local_37;
CBaseEntity *local_30;
uVar2 = *(uint *)(this + 0x44c);
if ((((uVar2 == 0xffffffff) ||
(puVar7 = g_pEntityList + (uVar2 & 0xfff) * 0x10, puVar7 == (undefined *)0xfffffffc)) ||
(*(uint *)(puVar7 + 8) != uVar2 >> 0xc)) ||
(this_00 = *(CBasePlayer **)(puVar7 + 4), this_00 == (CBasePlayer *)0x0)) {
return (CBaseEntity *)0x0;
}
fVar1 = *(float *)(ZombieVomitRange._28_4_ + 0x2c);
fVar10 = fVar1 + 40.0;
(**(code **)(*(int *)this_00 + 0x234))();
CBasePlayer::EyeVectors(this_00,(Vector *)&local_168,(Vector *)0x0,(Vector *)0x0);
piVar4 = mdlcache;
(**(code **)(*mdlcache + 0x68))();
local_6c = local_168 * fVar1;
local_68 = local_164 * fVar1;
local_64 = fVar1 * local_160;
local_44 = 0;
local_48 = 0;
local_4c = 0;
local_3c = 0;
local_38 = 1;
local_54 = 0;
local_58 = 0;
local_5c = 0;
local_37 = local_68 * local_68 + local_6c * local_6c + local_64 * local_64 != 0.0;
local_7c = local_174;
local_78 = local_170;
local_74 = local_16c;
/* try { // try from 004e46f2 to 004e49e0 has its CatchHandler @ 004e4a24 */
CTraceFilterSimple::CTraceFilterSimple
((CTraceFilterSimple *)&local_14c,(IHandleEntity *)this_00,0,
(_func_bool_IHandleEntity_ptr_int *)0x0);
(**(code **)(*enginetrace + 0x14))();
if (*(int *)(r_visualizetraces._28_4_ + 0x30) != 0) {
DebugDrawLine(local_d0,local_c4,0xff,0,0,true,-1.0);
}
CTraceFilterSimple::CTraceFilterSimple
(local_15c,(IHandleEntity *)this_00,0,(_func_bool_IHandleEntity_ptr_int *)0x0);
local_78 = local_164 * fVar10 + local_170;
local_74 = local_160 * fVar10 + local_16c;
local_7c = fVar10 * local_168 + local_174;
UTIL_ClipTraceToPlayers
((Vector *)&local_174,(Vector *)&local_7c,0x46004003,(ITraceFilter *)local_15c,
(CGameTrace *)local_d0);
if (((local_84 != (CBaseEntity *)0x0) &&
(cVar5 = (**(code **)(*(int *)local_84 + 0x16c))(), cVar5 != '\0')) &&
((local_84 != (CBaseEntity *)0x0 &&
(cVar5 = (**(code **)(*(int *)local_84 + 0x16c))(), cVar5 != '\0')))) {
iVar6 = CBaseEntity::GetTeamNumber(local_84);
cVar5 = IsASurvivorTeam(iVar6);
if (cVar5 != '\0') {
(**(code **)(*(int *)local_84 + 0x234))();
local_11c = local_14c - local_174;
local_114 = local_144 - local_16c;
local_f4 = 0;
local_f8 = 0;
local_118 = local_148 - local_170;
local_fc = 0;
local_ec = 0;
local_e8 = 1;
local_104 = 0;
local_108 = 0;
local_12c = local_174;
local_10c = 0;
local_128 = local_170;
local_e7 = local_11c * local_11c + local_114 * local_114 + local_118 * local_118 != 0.0;
local_124 = local_16c;
CTraceFilterSimple::CTraceFilterSimple
(local_13c,(IHandleEntity *)this_00,0,(_func_bool_IHandleEntity_ptr_int *)0x0);
(**(code **)(*enginetrace + 0x14))();
if (*(int *)(r_visualizetraces._28_4_ + 0x30) != 0) {
DebugDrawLine((Vector *)&local_7c,local_70,0xff,0,0,true,-1.0);
}
pCVar8 = local_84;
puVar9 = (undefined4 *)&stack0xfffffe4c;
if ((local_50 != 1.0) && (puVar9 = (undefined4 *)&stack0xfffffe4c, local_84 != local_30)) {
pCVar8 = (CBaseEntity *)0x0;
puVar9 = (undefined4 *)&stack0xfffffe4c;
}
goto LAB_004e4a00;
}
}
pCVar8 = (CBaseEntity *)0x0;
puVar9 = (undefined4 *)&stack0xfffffe50;
LAB_004e4a00:
iVar6 = *piVar4;
*puVar9 = piVar4;
pcVar3 = *(code **)(iVar6 + 0x6c);
puVar9[-1] = 0x4e4a08;
(*pcVar3)();
return pCVar8;
}
SourceMod gamedata
paste intoaddons/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.
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.
Gamedata KeyValues
DHooks plugin example
Type inference is best-effort from the C signature - sanity-check the DHooks types before shipping.