This is for hooking every gun shot.
It hooks the practically exact moment when a bullet is fired. Shots are detected in a extremely short time.
You do not need to check if player is pressing button.
You do not need to check if weapon has clip bullets.
Much more accurate and reliable than FM_PlaybackEvent, which counts every round start as shooting and misses the first bullet fired when using bools. (...)
This shot hook detects every of the shots which go through walls, so when you shoot with weapons which shots are capable to go through walls, ALL the crossing sections are counted as shot.
The debugger will inform you when you are shooting (TRUE),
when you are not shooting (FALSE),
and how many shots you fired (SHOTS).
*Every shot crossing walls is counted/detected as one different shot.
*Every shotgun pellet is counted/detected as one different shot.
UPDATE!
PHP Code:
Apr 09, 2023
Now using FM_CmdEnd instead of CurWeapon to detect the shots in an even shorter period of time.
DEBUG VERSION
PHP Code:
#include <amxmodx>
#include <fakemeta>
#define valid(id) (id == clamp(id,1,33)) // Checks if the player is in the range of 1 to max players
#define NOSHOT (1<<0 | 1<<4 | 1<<6 | 1<<9 | 1<<25 | 1<<29) // (CSW_NONE | CSW_HEGRENADE | CSW_C4 | CSW_SMOKEGRENADE | CSW_FLASHBANG | CSW_KNIFE)
#define ALIVE is_user_alive
#define WEAPON get_user_weapon
#define m_flLastFired get_pdata_int(id,220)
#define GUN_FIRED (last_shot_b[id] != last_shot_a[id])
static last_shot_a[33],last_shot_b[33],bool:SHOOTING[33],shot_count;
public plugin_init() {
register_plugin("Shot Hook","1.0","WATCH_DOGS UNITED")
register_forward(FM_TraceLine,"fwTraceLine",1)
register_forward(FM_CmdEnd,"Refresh")
}
public Refresh(id) {
if(!valid(id))
return
last_shot_a[id] = m_flLastFired
}
public fwTraceLine(const Float:start[3],Float:dest[3],HIT_PARAM,id,ptr) {
if(!valid(id))
return
last_shot_b[id] = m_flLastFired
if(ALIVE(id) && !(NOSHOT & (1<<WEAPON(id))) && GUN_FIRED) {
// Gun fired
SHOOTING[id] = true
shot_count++
}
else
SHOOTING[id] = false
// REAL-TIME DEBUG
if(SHOOTING[id] == true)
client_print(id,print_chat,"TRUE")
else
client_print(id,print_chat,"FALSE")
client_print(id,print_chat,"SHOTS: %d",shot_count)
}
/*
public Your_Stuff(id) {
if(SHOOTING[id] == true) {
Make something
}
}
*/
SIMPLIFIED
PHP Code:
#include <amxmodx>
#include <fakemeta>
#define valid(id) (id == clamp(id,1,33))
#define NOSHOT (1<<0 | 1<<4 | 1<<6 | 1<<9 | 1<<25 | 1<<29)
static last_shot_a[33],last_shot_b[33],bool:SHOOTING[33];
public plugin_init() {
register_plugin("Shot Hook","1.0","WATCH_DOGS UNITED")
register_forward(FM_TraceLine,"fwTraceLine",1)
register_forward(FM_CmdEnd,"Refresh")
}
public Refresh(id) {
if(!valid(id))
return
last_shot_a[id] = get_pdata_int(id,220)
}
public fwTraceLine(const Float:start[3],Float:dest[3],HIT_PARAM,id,ptr) {
if(!valid(id))
return
last_shot_b[id] = get_pdata_int(id,220)
if(is_user_alive(id) && !(NOSHOT & (1<<get_user_weapon(id))) && last_shot_b[id] != last_shot_a[id]) {
// Gun fired
SHOOTING[id] = true
}
else
SHOOTING[id] = false
}
We will release the new version of Aim Realism plugin soon with this shot hook.
EDIT
Aim Realism v2.3.9 released.
https://gamebanana.com/mods/311932