// Порядковый номер анимации броска
new const g_GrenadeClassNames[][] = {
new const Float:g_VelocityMultiplier[] = {
new g_HandleThrowType[MAX_CLIENTS + 1];
new Float:g_flLastAttack[MAX_CLIENTS + 1];
register_plugin("[ReAPI] Pop Grenades", "2.3", "EFFx & HamletEagle & Minni Mouse");
for(new i; i < sizeof(g_GrenadeClassNames); i++) {
RegisterHam(Ham_Weapon_SecondaryAttack, g_GrenadeClassNames[i], "Weapon_SecAttack_Pre", .Post = false);
RegisterHookChain(RG_CBasePlayer_ThrowGrenade, "Player_ThrowGrenade_Pre", .post = false);
public Weapon_SecAttack_Pre(pWeapon) {
if(get_member_game(m_bFreezePeriod)) {
if(is_nullent(pWeapon)) {
static pPlayer, Float:flCurTime;
pPlayer = get_member(pWeapon, m_pPlayer);
flCurTime = get_gametime();
if(g_flLastAttack[pPlayer] > flCurTime) {
g_HandleThrowType[pPlayer] = (get_entvar(pPlayer, var_button) & IN_ATTACK) ? medium : slower;
ExecuteHamB(Ham_Weapon_PrimaryAttack, pWeapon);
g_flLastAttack[pPlayer] = flCurTime + 1.5;
public Player_ThrowGrenade_Pre(pPlayer, grenade, Float:vecSrc[3], Float:vecThrow[3], Float:time, usEvent) {
if(is_nullent(grenade)) {
new Float:flMultiplier = g_VelocityMultiplier[g_HandleThrowType[pPlayer]];
vecThrow[0] *= flMultiplier;
vecThrow[1] *= flMultiplier;
vecThrow[2] *= flMultiplier;
set_entvar(grenade, var_velocity, vecThrow);
if(g_HandleThrowType[pPlayer] == slower) {
rg_send_grenade_anim(pPlayer, ANIM_NUM);
g_HandleThrowType[pPlayer] = normal;
stock rg_send_grenade_anim(const pPlayer, const iAnimation) {
set_entvar(pPlayer, var_weaponanim, iAnimation);
message_begin(MSG_ONE, SVC_WEAPONANIM, .player = pPlayer);