MountedGunFire
0x0054f8f0 · 1809 bytes · __cdecl
_Z14MountedGunFireP13CTerrorPlayerP15CPropMountedGunRK6VectorS5_S5_fb
Decompiled
undefined (7 params)
/* MountedGunFire(CTerrorPlayer*, CPropMountedGun*, Vector const&, Vector const&, Vector const&,
float, bool) */
void MountedGunFire(CTerrorPlayer *param_1,CPropMountedGun *param_2,Vector *param_3,Vector *param_4,
Vector *param_5,float param_6,bool param_7)
{
float fVar1;
uint uVar2;
char cVar3;
undefined4 uVar4;
CAmmoDef *pCVar5;
int iVar6;
int iVar7;
undefined *puVar8;
IHandleEntity *local_1b0;
undefined **local_1a0 [4];
undefined4 local_190 [3];
undefined4 local_184;
undefined4 local_180;
undefined4 local_17c;
undefined4 local_178;
undefined4 local_174;
float local_16c;
float local_168;
float local_164;
undefined4 local_15c;
undefined4 local_158;
undefined4 local_154;
undefined4 local_14c;
undefined4 local_148;
undefined4 local_144;
undefined4 local_13c;
undefined1 local_138;
undefined1 local_137;
undefined4 local_12c;
undefined4 local_128;
undefined4 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;
undefined4 local_d0;
undefined4 local_cc;
undefined4 local_c8;
undefined4 local_c4;
undefined4 local_c0;
undefined4 local_bc;
CBaseEntity *local_84;
undefined4 local_7c;
undefined4 local_78;
undefined4 local_74;
int local_28;
if (param_2[0x15dd] == (CPropMountedGun)0x0) {
CBaseEntity::EmitSound((CBaseEntity *)param_1,"50cal.fire",0.0,(float *)0x0);
uVar4 = (**(code **)(*(int *)param_1 + 0x288))(param_1);
UTIL_ScreenShake(uVar4,0x3f800000,0x3f000000,0x3e99999a,0x42f00000,0,0,0);
CTraceFilterSimpleList::CTraceFilterSimpleList((CTraceFilterSimpleList *)local_1a0,0);
/* try { // try from 0054f9c1 to 0054ffe8 has its CatchHandler @ 00550018 */
CTraceFilterSimpleList::AddEntityToIgnore
((CTraceFilterSimpleList *)local_1a0,(IHandleEntity *)param_2);
local_13c = 0;
local_138 = 0;
local_14c = 0x40400000;
local_148 = 0x40400000;
local_16c = *(float *)param_5 * 16384.0;
local_144 = 0x40400000;
local_168 = *(float *)(param_5 + 4) * 16384.0;
local_15c = 0;
local_164 = *(float *)(param_5 + 8) * 16384.0;
local_158 = 0;
local_154 = 0;
local_17c = *(undefined4 *)param_4;
local_178 = *(undefined4 *)(param_4 + 4);
local_174 = *(undefined4 *)(param_4 + 8);
local_137 = local_168 * local_168 + local_16c * local_16c + local_164 * local_164 != 0.0;
(**(code **)(*enginetrace + 0x14))
(enginetrace,&local_17c,0x46004003,(CTraceFilterSimpleList *)local_1a0,&local_d0);
if (*(int *)(r_visualizetraces._28_4_ + 0x30) != 0) {
DebugDrawLine((Vector *)&local_d0,(Vector *)&local_c4,0xff,0xff,0,true,-1.0);
}
DispatchParticleEffect
("weapon_muzzle_flash_50cal",5,param_2,*(undefined4 *)(param_2 + 0x1664),0,0xffffffff)
;
DispatchParticleEffect
("weapon_shell_casing_50cal",4,param_2,*(undefined4 *)(param_2 + 0x1660),0,0xffffffff)
;
if (local_84 != (CBaseEntity *)0x0) {
cVar3 = (**(code **)(*(int *)local_84 + 0x16c))(local_84);
if (cVar3 != '\0') {
iVar6 = CBaseEntity::GetTeamNumber(local_84);
cVar3 = IsASurvivorTeam(iVar6);
if (cVar3 != '\0') {
local_1b0 = (IHandleEntity *)local_84;
if ((local_84 == (CBaseEntity *)0x0) ||
(cVar3 = (**(code **)(*(int *)local_84 + 0x16c))(local_84), cVar3 == '\0')) {
local_1b0 = (IHandleEntity *)0x0;
}
uVar2 = *(uint *)(local_1b0 + 0x3e68);
if (((((((uVar2 != 0xffffffff) &&
(puVar8 = g_pEntityList + (uVar2 & 0xfff) * 0x10,
puVar8 != (undefined *)0xfffffffc)) && (*(uint *)(puVar8 + 8) == uVar2 >> 0xc)) &&
(*(int *)(puVar8 + 4) != 0)) ||
(((uVar2 = *(uint *)(local_1b0 + 0x3e48), uVar2 != 0xffffffff &&
(puVar8 = g_pEntityList + (uVar2 & 0xfff) * 0x10, puVar8 != (undefined *)0xfffffffc
)) && ((*(uint *)(puVar8 + 8) == uVar2 >> 0xc && (*(int *)(puVar8 + 4) != 0))))))
|| (((uVar2 = *(uint *)(local_1b0 + 0x33c4), uVar2 != 0xffffffff &&
(puVar8 = g_pEntityList + (uVar2 & 0xfff) * 0x10,
puVar8 != (undefined *)0xfffffffc)) &&
((*(uint *)(puVar8 + 8) == uVar2 >> 0xc && (*(int *)(puVar8 + 4) != 0)))))) ||
((((uVar2 = *(uint *)(local_1b0 + 0x3ee0), uVar2 != 0xffffffff &&
(puVar8 = g_pEntityList + (uVar2 & 0xfff) * 0x10, puVar8 != (undefined *)0xfffffffc)
) && (*(uint *)(puVar8 + 8) == uVar2 >> 0xc)) && (*(int *)(puVar8 + 4) != 0)))) {
CTraceFilterSimpleList::AddEntityToIgnore((CTraceFilterSimpleList *)local_1a0,local_1b0)
;
local_ec = 0;
local_e8 = 0;
local_fc = 0x40400000;
local_f8 = 0x40400000;
local_11c = *(float *)param_5 * 16384.0;
local_f4 = 0x40400000;
local_118 = *(float *)(param_5 + 4) * 16384.0;
local_10c = 0;
local_114 = *(float *)(param_5 + 8) * 16384.0;
local_108 = 0;
local_104 = 0;
local_12c = *(undefined4 *)param_4;
local_128 = *(undefined4 *)(param_4 + 4);
local_124 = *(undefined4 *)(param_4 + 8);
local_e7 = local_118 * local_118 + local_11c * local_11c + local_114 * local_114 != 0.0;
(**(code **)(*enginetrace + 0x14))
(enginetrace,&local_12c,0x46004003,(CTraceFilterSimpleList *)local_1a0,
(Vector *)&local_d0);
if (*(int *)(r_visualizetraces._28_4_ + 0x30) != 0) {
DebugDrawLine((Vector *)&local_d0,(Vector *)&local_c4,0xff,0xff,0,true,-1.0);
}
}
}
}
UTIL_ImpactTrace((CGameTrace *)&local_d0,-0x7ffffffe,(char *)0x0);
local_7c = 0;
local_78 = 0;
local_74 = 0;
DispatchParticleEffect
("weapon_tracers_50cal",local_d0,local_cc,local_c8,local_c4,local_c0,local_bc,0,0,0,
0,0,0xffffffff);
ClearMultiDamage();
pCVar5 = (CAmmoDef *)GetAmmoDef();
iVar6 = CAmmoDef::Index(pCVar5,"AMMO_TYPE_MINIGUN");
fVar1 = *(float *)(ZombieHealth._28_4_ + 0x2c);
pCVar5 = (CAmmoDef *)GetAmmoDef();
iVar7 = CAmmoDef::DamageType(pCVar5,iVar6);
CTakeDamageInfo::CTakeDamageInfo
((CTakeDamageInfo *)&local_7c,(CBaseEntity *)param_2,(CBaseEntity *)param_1,fVar1,
iVar7,0);
CalculateBulletDamageForce((CTakeDamageInfo *)&local_7c,iVar6,param_5,(Vector *)&local_c4,1.0)
;
local_28 = iVar6;
CBaseEntity::DispatchTraceAttack
((CTakeDamageInfo *)local_84,(Vector *)&local_7c,(CGameTrace *)param_5);
ApplyMultiDamage();
}
local_1a0[0] = &PTR_ShouldHitEntity_00c54590;
local_184 = 0;
CUtlMemory<IHandleEntity*,int>::Purge((CUtlMemory<IHandleEntity*,int> *)local_190);
local_180 = local_190[0];
CUtlMemory<IHandleEntity*,int>::Purge((CUtlMemory<IHandleEntity*,int> *)local_190);
return;
}
CBaseEntity::EmitSound((CBaseEntity *)param_1,"Default.ClipEmpty_Rifle",0.0,(float *)0x0);
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.