CTerrorGameRules::PopulateDeathEvent
0x00503040 · 1877 bytes · __thiscall
_ZN16CTerrorGameRules18PopulateDeathEventEP9KeyValuesPK11CBaseEntityPK20CBaseCombatCharacterRK15CTakeDamageInfo
Decompiled
undefined (5 params)
/* CTerrorGameRules::PopulateDeathEvent(KeyValues*, CBaseEntity const*, CBaseCombatCharacter const*,
CTakeDamageInfo const&) */
void __thiscall
CTerrorGameRules::PopulateDeathEvent
(CTerrorGameRules *this,KeyValues *param_1,CBaseEntity *param_2,
CBaseCombatCharacter *param_3,CTakeDamageInfo *param_4)
{
char cVar1;
int iVar2;
int *piVar3;
float *pfVar4;
uint uVar5;
undefined4 uVar6;
undefined *puVar7;
char *pcVar8;
CBaseEntity *this_00;
CBaseCombatCharacter *pCVar9;
char *pcVar10;
char *pcVar11;
undefined1 uVar12;
undefined1 uVar13;
bool bVar14;
byte bVar15;
byte local_35;
CBaseCombatCharacter *local_34;
CBaseEntity *local_2c;
CBaseCombatCharacter *local_28;
bVar15 = 0;
local_28 = param_3;
if ((param_2 == (CBaseEntity *)0x0) ||
(cVar1 = (**(code **)(*(int *)param_2 + 0x16c))(param_2), cVar1 == '\0')) {
local_2c = (CBaseEntity *)0x0;
}
else {
local_2c = param_2;
}
if ((param_3 == (CBaseCombatCharacter *)0x0) ||
(cVar1 = (**(code **)(*(int *)param_3 + 0x16c))(param_3), cVar1 == '\0')) {
local_28 = (CBaseCombatCharacter *)0x0;
}
pCVar9 = (CBaseCombatCharacter *)0x0;
uVar5 = *(uint *)(param_4 + 0x30);
if (((uVar5 != 0xffffffff) &&
(puVar7 = g_pEntityList + (uVar5 & 0xfff) * 0x10, puVar7 != (undefined *)0xfffffffc)) &&
(*(uint *)(puVar7 + 8) == uVar5 >> 0xc)) {
pCVar9 = *(CBaseCombatCharacter **)(puVar7 + 4);
}
uVar5 = *(uint *)(param_4 + 0x34);
if (uVar5 == 0xffffffff) {
return;
}
puVar7 = g_pEntityList + (uVar5 & 0xfff) * 0x10;
if (puVar7 == (undefined *)0xfffffffc) {
return;
}
if (*(uint *)(puVar7 + 8) != uVar5 >> 0xc) {
return;
}
local_34 = *(CBaseCombatCharacter **)(puVar7 + 4);
if (local_34 == (CBaseCombatCharacter *)0x0) {
return;
}
iVar2 = (**(code **)(*(int *)local_34 + 0x100))(local_34);
if (iVar2 == 1) {
iVar2 = (**(code **)(*engine + 0x40))(engine,*(undefined4 *)(local_34 + 0x30));
KeyValues::SetInt(param_1,"attacker",iVar2);
local_35 = (byte)((uint)*(undefined4 *)(param_4 + 0x48) >> 0x1e) & 1;
if (pCVar9 == (CBaseCombatCharacter *)0x0) {
LAB_00503800:
pcVar8 = "world";
}
else {
if (pCVar9 == local_34) {
iVar2 = CBaseCombatCharacter::GetActiveWeapon(local_34);
if (iVar2 == 0) goto LAB_00503800;
iVar2 = CBaseCombatCharacter::GetActiveWeapon(local_34);
pcVar8 = *(char **)(iVar2 + 0x7c);
}
else {
cVar1 = (**(code **)(*(int *)pCVar9 + 0x16c))(pCVar9);
if (cVar1 != '\0') {
cVar1 = (**(code **)(*(int *)pCVar9 + 0x16c))(pCVar9);
this_00 = (CBaseEntity *)0x0;
if (cVar1 != '\0') {
this_00 = (CBaseEntity *)pCVar9;
}
iVar2 = CBaseEntity::GetTeamNumber(this_00);
if ((iVar2 == 3) && (iVar2 = (**(code **)(*(int *)this_00 + 0x544))(this_00), iVar2 == 2))
{
pcVar8 = "boomer";
goto LAB_00503639;
}
}
pcVar8 = *(char **)(pCVar9 + 0x7c);
}
if (pcVar8 != (char *)0x0) {
iVar2 = 7;
uVar13 = false;
pcVar10 = pcVar8;
pcVar11 = "weapon_";
do {
if (iVar2 == 0) break;
iVar2 = iVar2 + -1;
uVar13 = *pcVar10 == *pcVar11;
pcVar10 = pcVar10 + (uint)bVar15 * -2 + 1;
pcVar11 = pcVar11 + (uint)bVar15 * -2 + 1;
} while ((bool)uVar13);
uVar12 = 0;
goto joined_r0x0050327e;
}
pcVar8 = "";
}
LAB_00503639:
uVar12 = 1;
LAB_005031c0:
iVar2 = 5;
pcVar10 = pcVar8;
pcVar11 = "func_";
do {
if (iVar2 == 0) break;
iVar2 = iVar2 + -1;
uVar12 = *pcVar10 == *pcVar11;
pcVar10 = pcVar10 + (uint)bVar15 * -2 + 1;
pcVar11 = pcVar11 + (uint)bVar15 * -2 + 1;
} while ((bool)uVar12);
if ((bool)uVar12) {
pcVar8 = pcVar8 + 5;
goto LAB_00503287;
}
iVar2 = 9;
bVar14 = false;
pcVar10 = pcVar8;
pcVar11 = "pipe_bomb";
do {
if (iVar2 == 0) break;
iVar2 = iVar2 + -1;
bVar14 = *pcVar10 == *pcVar11;
pcVar10 = pcVar10 + (uint)bVar15 * -2 + 1;
pcVar11 = pcVar11 + (uint)bVar15 * -2 + 1;
} while (bVar14);
if (!bVar14) goto LAB_00503287;
pcVar8 = "pipe_bomb";
LAB_0050328f:
iVar2 = _V_stricmp(pcVar8,"pistol");
if (iVar2 == 0) goto LAB_005032a9;
}
else {
if (pCVar9 == (CBaseCombatCharacter *)0x0) {
return;
}
pcVar8 = *(char **)(pCVar9 + 0x7c);
if (pcVar8 == (char *)0x0) {
pcVar8 = "";
}
KeyValues::SetInt(param_1,"attacker",0);
if (*(int *)(local_34 + 0x30) == 0) {
iVar2 = 0;
uVar12 = true;
}
else {
iVar2 = *(int *)(local_34 + 0x30) - *(int *)(gpGlobals + 0x58) >> 4;
uVar12 = iVar2 == 0;
}
KeyValues::SetInt(param_1,"attackerentid",iVar2);
local_34 = (CBaseCombatCharacter *)0x0;
local_35 = 0;
iVar2 = 7;
pcVar10 = pcVar8;
pcVar11 = "weapon_";
do {
uVar13 = uVar12;
if (iVar2 == 0) break;
iVar2 = iVar2 + -1;
uVar12 = *pcVar10 == *pcVar11;
pcVar10 = pcVar10 + (uint)bVar15 * -2 + 1;
pcVar11 = pcVar11 + (uint)bVar15 * -2 + 1;
uVar13 = uVar12;
} while ((bool)uVar12);
joined_r0x0050327e:
if (!(bool)uVar13) goto LAB_005031c0;
pcVar8 = pcVar8 + 7;
LAB_00503287:
if (pcVar8 != "pistol") goto LAB_0050328f;
LAB_005032a9:
if (((local_34 != (CBaseCombatCharacter *)0x0) &&
(piVar3 = (int *)CTerrorPlayer::GetActiveTerrorWeapon((CTerrorPlayer *)local_34),
piVar3 != (int *)0x0)) && (cVar1 = (**(code **)(*piVar3 + 0x674))(piVar3), cVar1 != '\0')) {
pcVar8 = "dual_pistols";
}
}
KeyValues::SetString(param_1,"weapon",pcVar8);
if (local_35 == 0) {
KeyValues::SetInt(param_1,"headshot",0);
KeyValues::SetInt(param_1,"type",*(int *)(param_4 + 0x48));
iVar2 = 7;
}
else {
KeyValues::SetInt(param_1,"headshot",1);
KeyValues::SetInt(param_1,"type",*(int *)(param_4 + 0x48));
iVar2 = 8;
}
KeyValues::SetInt(param_1,"priority",iVar2);
if (local_28 != (CBaseCombatCharacter *)0x0) {
KeyValues::SetInt(param_1,"abort",(uint)(byte)local_28[0x3376]);
}
pfVar4 = (float *)(**(code **)(*(int *)param_3 + 0x288))(param_3);
KeyValues::SetFloat(param_1,"victim_x",*pfVar4);
iVar2 = (**(code **)(*(int *)param_3 + 0x288))(param_3);
KeyValues::SetFloat(param_1,"victim_y",*(float *)(iVar2 + 4));
iVar2 = (**(code **)(*(int *)param_3 + 0x288))(param_3);
KeyValues::SetFloat(param_1,"victim_z",*(float *)(iVar2 + 8));
KeyValues::SetString(param_1,"victimname","");
uVar5 = 1;
if (local_2c != (CBaseEntity *)0x0) {
uVar5 = (**(code **)(*(int *)local_2c + 0x778))(local_2c);
uVar5 = uVar5 & 0xff;
}
KeyValues::SetInt(param_1,"attackerisbot",uVar5);
if ((param_2 == (CBaseEntity *)0x0) || (iVar2 = CBaseEntity::GetTeamNumber(param_2), iVar2 != 3))
goto LAB_00503446;
if (local_2c == (CBaseEntity *)0x0) {
piVar3 = (int *)__dynamic_cast(param_2,&CBaseEntity::typeinfo,&Infected::typeinfo,0);
if (piVar3 != (int *)0x0) {
uVar6 = (**(code **)(*piVar3 + 0x544))(piVar3);
goto LAB_005035d5;
}
switchD_005035de_caseD_0:
KeyValues::SetString(param_1,"attackername","Infected");
}
else {
uVar6 = (**(code **)(*(int *)local_2c + 0x544))(local_2c);
LAB_005035d5:
switch(uVar6) {
default:
goto switchD_005035de_caseD_0;
case 1:
KeyValues::SetString(param_1,"attackername","Smoker");
break;
case 2:
KeyValues::SetString(param_1,"attackername","Boomer");
break;
case 3:
KeyValues::SetString(param_1,"attackername","Hunter");
break;
case 4:
KeyValues::SetString(param_1,"attackername","Spitter");
break;
case 5:
KeyValues::SetString(param_1,"attackername","Jockey");
break;
case 6:
KeyValues::SetString(param_1,"attackername","Charger");
break;
case 7:
KeyValues::SetString(param_1,"attackername","Witch");
break;
case 8:
KeyValues::SetString(param_1,"attackername","Tank");
}
}
LAB_00503446:
iVar2 = CBaseEntity::GetTeamNumber((CBaseEntity *)param_3);
if (iVar2 != 3) {
return;
}
if (local_28 == (CBaseCombatCharacter *)0x0) {
KeyValues::SetInt(param_1,"victimisbot",1);
piVar3 = (int *)__dynamic_cast(param_3,&CBaseCombatCharacter::typeinfo,&Infected::typeinfo,0);
if (piVar3 != (int *)0x0) {
uVar6 = (**(code **)(*piVar3 + 0x544))(piVar3);
goto LAB_00503497;
}
switchD_005034a0_caseD_0:
param_2 = (CBaseEntity *)0xc7bdad;
}
else {
uVar6 = (**(code **)(*(int *)local_28 + 0x544))(local_28);
uVar5 = (**(code **)(*(int *)local_28 + 0x778))(local_28);
KeyValues::SetInt(param_1,"victimisbot",uVar5 & 0xff);
LAB_00503497:
switch(uVar6) {
default:
goto switchD_005034a0_caseD_0;
case 1:
param_2 = (CBaseEntity *)0xd340d3;
break;
case 2:
param_2 = (CBaseEntity *)0xd00ab8;
break;
case 3:
param_2 = (CBaseEntity *)0xd30013;
break;
case 4:
param_2 = (CBaseEntity *)0xd36293;
break;
case 5:
param_2 = (CBaseEntity *)0xd320f3;
break;
case 6:
param_2 = (CBaseEntity *)0xd2ddc3;
break;
case 7:
param_2 = (CBaseEntity *)0xd27028;
break;
case 8:
param_2 = (CBaseEntity *)0xcfb55e;
}
}
KeyValues::SetString(param_1,"victimname",(char *)param_2);
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.