CCSGameRules::RadiusDamage
0x00436a40 · 1999 bytes · __thiscall
_ZN12CCSGameRules12RadiusDamageERK15CTakeDamageInfoRK6VectorfibP11CBaseEntity
Decompiled
undefined (7 params)
/* CCSGameRules::RadiusDamage(CTakeDamageInfo const&, Vector const&, float, int, bool, CBaseEntity*)
*/
void __thiscall
CCSGameRules::RadiusDamage
(CCSGameRules *this,CTakeDamageInfo *param_1,Vector *param_2,float param_3,int param_4,
bool param_5,CBaseEntity *param_6)
{
code *pcVar1;
int *piVar2;
float fVar3;
float fVar4;
float fVar5;
char cVar6;
CBaseEntity *pCVar7;
int iVar8;
int *piVar9;
longdouble lVar10;
float fVar11;
float fVar12;
float fVar13;
float fVar14;
int local_980;
float local_97c;
float local_978;
float local_960;
float local_95c;
float local_958;
float local_954;
float local_950;
float local_94c;
float local_948;
float local_944;
float local_940;
undefined1 local_93c [16];
float local_92c;
float local_928;
float local_924;
float local_91c;
float local_918;
float local_914;
undefined4 local_90c;
undefined4 local_908;
undefined4 local_904;
undefined4 local_8fc;
undefined4 local_8f8;
undefined4 local_8f4;
undefined4 local_8ec;
undefined1 local_8e8;
undefined1 local_8e7;
undefined1 local_8d8 [12];
undefined1 local_8cc [72];
float local_884;
float local_880;
float local_87c;
float local_878;
float local_874;
float local_870;
undefined4 local_86c;
undefined4 local_868;
undefined4 local_864;
undefined4 local_860;
undefined4 local_85c;
undefined4 local_858;
undefined4 local_854;
undefined4 local_850;
undefined4 local_84c;
float local_848;
undefined4 local_844;
undefined4 local_840;
uint local_83c;
undefined4 local_838;
undefined4 local_834;
undefined4 local_830;
float local_82c;
int local_828;
int local_824 [517];
local_960 = 0.0;
local_95c = 0.0;
local_958 = 0.0;
local_954 = *(float *)param_2;
local_950 = *(float *)(param_2 + 4);
if (param_3 == 0.0) {
local_97c = 1.0;
}
else {
local_97c = *(float *)(param_1 + 0x3c) / param_3;
}
local_94c = *(float *)(param_2 + 8) + 1.0;
CEntitySphereQuery::CEntitySphereQuery
((CEntitySphereQuery *)local_824,(Vector *)&local_954,param_3,0);
local_980 = 0;
local_978 = 1.0;
pCVar7 = (CBaseEntity *)CEntitySphereQuery::GetCurrentEntity((CEntitySphereQuery *)local_824);
piVar2 = (int *)&stack0xfffff654;
do {
if (pCVar7 == (CBaseEntity *)0x0) {
return;
}
piVar9 = piVar2;
if ((pCVar7 != param_6) && (pCVar7[0x105] != (CBaseEntity)0x0)) {
if (param_4 != 0) {
iVar8 = *(int *)pCVar7;
*piVar2 = (int)pCVar7;
pcVar1 = *(code **)(iVar8 + 0x100);
piVar2[-1] = 0x437123;
iVar8 = (*pcVar1)();
if (iVar8 == param_4) goto LAB_004370f0;
}
iVar8 = *(int *)pCVar7;
piVar2[1] = (int)pCVar7;
piVar2[3] = 1;
piVar2[2] = (int)&local_954;
*piVar2 = (int)&local_884;
pcVar1 = *(code **)(iVar8 + 0x244);
piVar2[-1] = 0x436b80;
(*pcVar1)();
fVar5 = local_87c;
fVar4 = local_880;
fVar3 = local_884;
if (!param_5) {
piVar2[1] = (int)pCVar7;
*piVar2 = (int)&local_954;
piVar2[-1] = (int)this;
piVar2[-2] = 0x437161;
lVar10 = (longdouble)
GetAmountOfEntityVisible
((CCSGameRules *)piVar2[-1],(Vector *)*piVar2,(CBaseEntity *)piVar2[1]);
local_978 = (float)lVar10;
piVar9 = piVar2 + -1;
if (local_978 <= 0.0) goto LAB_004370f0;
}
fVar12 = fVar4 - local_950;
fVar14 = fVar5 - local_94c;
fVar13 = fVar3 - local_954;
fVar11 = (*(float *)(param_1 + 0x3c) -
SQRT(fVar12 * fVar12 + fVar14 * fVar14 + fVar13 * fVar13) * local_97c) * local_978;
piVar9 = piVar2 + -1;
local_960 = fVar3;
local_95c = fVar4;
local_958 = fVar5;
if (0.0 < fVar11) {
local_884 = *(float *)param_1;
local_844 = *(undefined4 *)(param_1 + 0x40);
local_840 = *(undefined4 *)(param_1 + 0x44);
local_880 = *(float *)(param_1 + 4);
local_87c = *(float *)(param_1 + 8);
local_878 = *(float *)(param_1 + 0xc);
local_874 = *(float *)(param_1 + 0x10);
local_870 = *(float *)(param_1 + 0x14);
local_86c = *(undefined4 *)(param_1 + 0x18);
local_868 = *(undefined4 *)(param_1 + 0x1c);
local_864 = *(undefined4 *)(param_1 + 0x20);
local_860 = *(undefined4 *)(param_1 + 0x24);
local_85c = *(undefined4 *)(param_1 + 0x28);
local_858 = *(undefined4 *)(param_1 + 0x2c);
local_854 = *(undefined4 *)(param_1 + 0x30);
local_850 = *(undefined4 *)(param_1 + 0x34);
local_84c = *(undefined4 *)(param_1 + 0x38);
local_83c = *(uint *)(param_1 + 0x48);
local_838 = *(undefined4 *)(param_1 + 0x4c);
local_82c = param_3;
local_834 = *(undefined4 *)(param_1 + 0x50);
local_830 = *(undefined4 *)(param_1 + 0x54);
local_828 = *(int *)(param_1 + 0x5c);
piVar2[-1] = (int)&local_948;
piVar2[-2] = 0x436d39;
local_948 = fVar13;
local_944 = fVar12;
local_940 = fVar14;
local_848 = fVar11;
VectorNormalize((Vector *)piVar2[-1]);
if ((((vec3_origin == local_878) && (local_874 == DAT_01053d4c)) &&
(local_870 == DAT_01053d50)) ||
(((vec3_origin == local_884 && (local_880 == DAT_01053d4c)) &&
(local_87c == DAT_01053d50)))) {
iVar8 = *(int *)(phys_explosion_force._28_4_ + 0x2c);
piVar2[1] = (int)&local_954;
*piVar2 = (int)&local_948;
piVar2[2] = iVar8;
piVar2[-1] = (int)&local_884;
piVar2[-2] = 0x436da0;
CalculateExplosiveDamageForce
((CTakeDamageInfo *)piVar2[-1],(Vector *)*piVar2,(Vector *)piVar2[1],
(float)piVar2[2]);
}
else {
local_884 = SQRT(local_880 * local_880 + local_884 * local_884 + local_87c * local_87c);
local_880 = local_944 * local_884;
local_87c = local_940 * local_884;
local_884 = local_884 * local_948;
local_878 = local_954;
local_874 = local_950;
local_870 = local_94c;
}
iVar8 = *(int *)pCVar7;
piVar2[2] = 0;
piVar2[1] = (int)&local_954;
piVar2[-1] = (int)&local_92c;
*piVar2 = (int)pCVar7;
pcVar1 = *(code **)(iVar8 + 0x244);
piVar2[-2] = 0x436e8c;
(*pcVar1)();
local_91c = local_92c;
local_8f4 = 0;
piVar2[1] = 0;
piVar2[-2] = (int)local_93c;
local_918 = local_928 - local_950;
*piVar2 = 0;
local_914 = local_924 - local_94c;
piVar2[-1] = 0;
local_92c = local_954;
local_91c = local_91c - local_954;
local_928 = local_950;
local_924 = local_94c;
local_8f8 = 0;
local_8fc = 0;
local_8e8 = 1;
local_8ec = 0;
local_904 = 0;
local_908 = 0;
local_8e7 = local_918 * local_918 + local_914 * local_914 + local_91c * local_91c != 0.0;
local_90c = 0;
piVar2[-3] = 0x436f95;
CTraceFilterSimple::CTraceFilterSimple
((CTraceFilterSimple *)piVar2[-2],(IHandleEntity *)piVar2[-1],*piVar2,
(_func_bool_IHandleEntity_ptr_int *)piVar2[1]);
iVar8 = *enginetrace;
piVar2[2] = (int)local_8d8;
piVar2[-2] = (int)enginetrace;
*piVar2 = 0x46004003;
piVar2[1] = (int)local_93c;
piVar2[-1] = (int)&local_92c;
pcVar1 = *(code **)(iVar8 + 0x14);
piVar2[-3] = 0x436fc8;
(*pcVar1)();
if (*(int *)(r_visualizetraces._28_4_ + 0x30) != 0) {
piVar2[4] = -0x40800000;
piVar2[-1] = (int)local_8cc;
piVar2[3] = 1;
piVar2[2] = 0;
piVar2[1] = 0;
*piVar2 = 0xff;
piVar2[-2] = (int)local_8d8;
piVar2[-3] = 0x437014;
DebugDrawLine((Vector *)piVar2[-2],(Vector *)piVar2[-1],*piVar2,piVar2[1],piVar2[2],
SUB41(piVar2[3],0),(float)piVar2[4]);
}
piVar2[-2] = g_pGameRules;
piVar2[-3] = 0x437034;
local_828 = local_980;
cVar6 = CTerrorGameRules::IsCurrentRoundActive((CTerrorGameRules *)piVar2[-2]);
if (cVar6 == '\0') {
piVar2[-3] = 0x4371ec;
cVar6 = CTerrorGameRules::IsSurvivalMode();
if (cVar6 != '\0') {
local_884 = 0.0;
local_880 = 0.0;
local_87c = 0.0;
local_83c = local_83c | 0x800;
}
}
piVar2[-3] = 0x437041;
ClearMultiDamage();
piVar2[-2] = (int)pCVar7;
piVar2[1] = (int)local_8d8;
*piVar2 = (int)&local_948;
piVar2[-1] = (int)&local_884;
piVar2[-3] = 0x437067;
CBaseEntity::DispatchTraceAttack
((CTakeDamageInfo *)piVar2[-2],(Vector *)piVar2[-1],(CGameTrace *)*piVar2);
piVar2[-3] = 0x43706c;
ApplyMultiDamage();
if (*(int *)(radius_damage_show_hits._28_4_ + 0x30) != 0) {
piVar2[4] = 0x3f800000;
piVar2[3] = 1;
piVar2[2] = 0;
piVar2[1] = 0xff;
*piVar2 = 0;
piVar2[-1] = 0x41800000;
piVar2[-2] = (int)local_8cc;
piVar2[-3] = 0x4370b6;
NDebugOverlay::Cross3D
((Vector *)piVar2[-2],(float)piVar2[-1],*piVar2,piVar2[1],piVar2[2],
SUB41(piVar2[3],0),(float)piVar2[4]);
}
piVar2[-2] = (int)pCVar7;
piVar2[2] = (int)&local_948;
piVar2[1] = (int)&local_960;
*piVar2 = (int)&local_954;
piVar2[-1] = (int)&local_884;
piVar2[-3] = 0x4370e6;
CBaseEntity::TraceAttackToTriggers
((CBaseEntity *)piVar2[-2],(CTakeDamageInfo *)piVar2[-1],(Vector *)*piVar2,
(Vector *)piVar2[1],(Vector *)piVar2[2]);
piVar9 = piVar2 + -2;
local_980 = local_980 + 1;
}
}
LAB_004370f0:
local_824[0] = local_824[0] + 1;
*piVar9 = (int)local_824;
piVar9[-1] = 0x4370ff;
pCVar7 = (CBaseEntity *)CEntitySphereQuery::GetCurrentEntity((CEntitySphereQuery *)*piVar9);
piVar2 = piVar9;
} while( true );
}
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.