AddMultiDamage
0x004c8160 · 1007 bytes · __cdecl
_Z14AddMultiDamageRK15CTakeDamageInfoP11CBaseEntity
Decompiled
undefined (2 params)
/* WARNING: Globals starting with '_' overlap smaller symbols at the same address */
/* AddMultiDamage(CTakeDamageInfo const&, CBaseEntity*) */
void AddMultiDamage(CTakeDamageInfo *param_1,CBaseEntity *param_2)
{
char cVar1;
uint uVar2;
int iVar3;
undefined *puVar4;
CBaseEntity *pCVar5;
float fVar6;
float fVar7;
float fVar8;
CBaseEntity *local_24;
CBaseEntity *local_20;
if (param_2 == (CBaseEntity *)0x0) {
return;
}
if ((((_DAT_00f9e2e0 == 0xffffffff) ||
(puVar4 = g_pEntityList + (_DAT_00f9e2e0 & 0xfff) * 0x10, puVar4 == (undefined *)0xfffffffc))
|| (*(uint *)(puVar4 + 8) != _DAT_00f9e2e0 >> 0xc)) ||
(param_2 != *(CBaseEntity **)(puVar4 + 4))) {
ApplyMultiDamage();
local_20 = (CBaseEntity *)0x0;
uVar2 = *(uint *)(param_1 + 0x38);
if (((uVar2 == 0xffffffff) ||
(puVar4 = g_pEntityList + (uVar2 & 0xfff) * 0x10, puVar4 == (undefined *)0xfffffffc)) ||
(*(uint *)(puVar4 + 8) != uVar2 >> 0xc)) {
uVar2 = *(uint *)(param_1 + 0x34);
if (uVar2 != 0xffffffff) goto LAB_004c81fc;
LAB_004c821c:
local_24 = (CBaseEntity *)0x0;
uVar2 = *(uint *)(param_1 + 0x30);
}
else {
local_20 = *(CBaseEntity **)(puVar4 + 4);
uVar2 = *(uint *)(param_1 + 0x34);
if (uVar2 == 0xffffffff) goto LAB_004c821c;
LAB_004c81fc:
puVar4 = g_pEntityList + (uVar2 & 0xfff) * 0x10;
if ((puVar4 == (undefined *)0xfffffffc) || (*(uint *)(puVar4 + 8) != uVar2 >> 0xc))
goto LAB_004c821c;
local_24 = *(CBaseEntity **)(puVar4 + 4);
uVar2 = *(uint *)(param_1 + 0x30);
}
pCVar5 = (CBaseEntity *)0x0;
if (uVar2 != 0xffffffff) {
pCVar5 = (CBaseEntity *)0x0;
puVar4 = g_pEntityList + (uVar2 & 0xfff) * 0x10;
if ((puVar4 != (undefined *)0xfffffffc) && (*(uint *)(puVar4 + 8) == uVar2 >> 0xc)) {
pCVar5 = *(CBaseEntity **)(puVar4 + 4);
}
}
CMultiDamage::Init((CMultiDamage *)&g_MultiDamage,param_2,pCVar5,local_24,local_20,
(Vector *)&vec3_origin,(Vector *)&vec3_origin,(Vector *)&vec3_origin,0.0,
*(int *)(param_1 + 0x48),*(int *)(param_1 + 0x4c));
}
_DAT_00f9e2c8 = _DAT_00f9e2c8 | *(uint *)(param_1 + 0x48);
_DAT_00f9e2bc = *(float *)(param_1 + 0x3c) + _DAT_00f9e2bc;
DAT_00f9e284 = *(float *)(param_1 + 4) + DAT_00f9e284;
DAT_00f9e288 = *(float *)(param_1 + 8) + DAT_00f9e288;
g_MultiDamage = *(float *)param_1 + g_MultiDamage;
DAT_00f9e290 = *(float *)(param_1 + 0x10);
DAT_00f9e294 = *(float *)(param_1 + 0x14);
DAT_00f9e28c = *(float *)(param_1 + 0xc);
_DAT_00f9e2a8 = *(undefined4 *)(param_1 + 0x28);
_DAT_00f9e2a4 = *(undefined4 *)(param_1 + 0x24);
_DAT_00f9e2ac = *(undefined4 *)(param_1 + 0x2c);
_DAT_00f9e2a0 = *(undefined4 *)(param_1 + 0x20);
_DAT_00f9e298 = *(undefined4 *)(param_1 + 0x18);
_DAT_00f9e29c = *(undefined4 *)(param_1 + 0x1c);
fVar6 = *(float *)(param_1 + 0x40);
if (*(float *)(param_1 + 0x40) <= _DAT_00f9e2c0) {
fVar6 = _DAT_00f9e2c0;
}
_DAT_00f9e2d4 = *(undefined4 *)(param_1 + 0x54);
_DAT_00f9e2c0 = fVar6;
cVar1 = (**(code **)(*g_pGameRules + 0x50))(g_pGameRules,*(undefined4 *)(param_1 + 0x48));
fVar6 = vec3_origin;
if (cVar1 != '\0') {
return;
}
if (_DAT_00f9e2c8 == 0) {
return;
}
if (((g_MultiDamage == vec3_origin) && (DAT_00f9e284 == DAT_01053d4c)) &&
(DAT_00f9e288 == DAT_01053d50)) {
if (9 < AddMultiDamage(CTakeDamageInfo_const&,CBaseEntity*)::warningCount + 1) {
AddMultiDamage(CTakeDamageInfo_const&,CBaseEntity*)::warningCount =
AddMultiDamage(CTakeDamageInfo_const&,CBaseEntity*)::warningCount + 1;
return;
}
LAB_004c8480:
AddMultiDamage(CTakeDamageInfo_const&,CBaseEntity*)::warningCount =
AddMultiDamage(CTakeDamageInfo_const&,CBaseEntity*)::warningCount + 1;
iVar3 = AddMultiDamage(CTakeDamageInfo_const&,CBaseEntity*)::warningCount;
if (DAT_00f9e288 == DAT_01053d50) {
Warning("AddMultiDamage: g_MultiDamage.GetDamageForce() == vec3_origin\n");
iVar3 = AddMultiDamage(CTakeDamageInfo_const&,CBaseEntity*)::warningCount;
}
}
else {
if (vec3_origin != DAT_00f9e28c) {
return;
}
if (DAT_01053d4c != DAT_00f9e290) {
return;
}
if (DAT_01053d50 != DAT_00f9e294) {
return;
}
iVar3 = AddMultiDamage(CTakeDamageInfo_const&,CBaseEntity*)::warningCount + 1;
if (9 < iVar3) {
AddMultiDamage(CTakeDamageInfo_const&,CBaseEntity*)::warningCount = iVar3;
return;
}
fVar7 = DAT_01053d4c;
fVar8 = DAT_01053d50;
if (g_MultiDamage != vec3_origin) goto LAB_004c8520;
if (DAT_01053d4c == DAT_00f9e284) goto LAB_004c8480;
}
AddMultiDamage(CTakeDamageInfo_const&,CBaseEntity*)::warningCount = iVar3;
fVar7 = DAT_00f9e290;
fVar8 = DAT_00f9e294;
iVar3 = AddMultiDamage(CTakeDamageInfo_const&,CBaseEntity*)::warningCount;
if (fVar6 != DAT_00f9e28c) {
return;
}
LAB_004c8520:
AddMultiDamage(CTakeDamageInfo_const&,CBaseEntity*)::warningCount = iVar3;
if ((fVar7 == DAT_01053d4c) && (fVar8 == DAT_01053d50)) {
Warning();
return;
}
return;
}
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.