didn't worked in my Windows machine, so... using VTable Dumper
i've tried DHooking CBasePlayer::OnMyWeaponFired
myself for the first time, and it worked perfectly as a replacement for it.
What's it's functionality?
OnMyWeaponFired is a function called when you... shot your weapon/fire your melee, as the name says...
It can also be used as a replacement for CalcAttackIsCritical if you just want to know when a player shoot
Might make a plugin with a forward for it someday, but for now...
Here's the example code:
#pragma semicolon 1
#pragma newdecls required
public void OnPluginStart()
Handle config = LoadGameConfigFile("tf2.onmyweaponfired");
int offset = GameConfGetOffset(config, "CBasePlayer::OnMyWeaponFired");
if (offset == -1)
SetFailState("Missing offset for CBasePlayer::OnMyWeaponFired");
Hook_OnMyWeaponFired = DHookCreate(offset, HookType_Entity, ReturnType_Void, ThisPointer_CBaseEntity, OnMyWeaponFired);
for (int i = 1 ; i <= MaxClients ; i++)
public void OnClientPutInServer(int client)
DHookEntity(Hook_OnMyWeaponFired, true, client);
public MRESReturn OnMyWeaponFired(int client, Handle hReturn, Handle hParams)
if(client < 1 || client > MaxClients || !IsValidEntity(client) || !IsPlayerAlive(client))
// Your code here
// You can also use GetEntProp(client, Prop_Send, "m_hActiveWeapon") for getting the weapon the player shoot with
NOTE: I were in a Windows machine and don't have a Linux one, so i didn't tested the Linux offset, but it should be working
NOTE 2: You're going to need DHooks
for getting this working
Gamedata file download: