#pragma semicolon 1
#include <amxmodx>
#include <hamsandwich>
#include <reapi>
new Float:usp_silencer_time[2];
new Float:m4a1_silencer_time[2];
public plugin_init()
{
register_plugin("Real Silencer State (Like CS:GO)", "1.2.0", "fl0wer");
new const silencerWeapons[][] = { "weapon_usp", "weapon_m4a1" };
for (new i = 0; i < sizeof(silencerWeapons); i++)
{
RegisterHam(Ham_Item_Holster, silencerWeapons[i], "@CBasePlayerWeapon_Holster_Post", true);
RegisterHam(Ham_Weapon_SecondaryAttack, silencerWeapons[i], "@CBasePlayerWeapon_SecondaryAttack_Post", true);
}
bind_pcvar_float(
create_cvar(
"usp_silencer_attach_time", "2.5", _,
"USP silencer attach time. (Original: 3.13, Default: 2.5)",
true, 0.0),
usp_silencer_time[0]
);
bind_pcvar_float(
create_cvar(
"usp_silencer_detach_time", "2.0", _,
"USP silencer detach time. (Original: 3.13, Default: 2.5)",
true, 0.0
),
usp_silencer_time[1]
);
bind_pcvar_float(
create_cvar(
"m4a1_silencer_attach_time", "1.4", _,
"M4A1 silencer attach time. (Original: 2.0, Default: 1.4)",
true, 0.0
),
m4a1_silencer_time[0]
);
bind_pcvar_float(
create_cvar(
"m4a1_silencer_detach_time", "1.0", _,
"M4A1 silencer detach time. (Original: 2.0, Default: 1.0)",
true, 0.0
),
m4a1_silencer_time[1]
);
}
@CBasePlayerWeapon_Holster_Post(id)
{
new player = get_member(id, m_pPlayer);
if (get_member(player, m_bOwnsShield))
{
return;
}
new Float:silencerChangeTime = Float:get_member(id, m_Weapon_fBurstSpread);
if (!silencerChangeTime)
{
return;
}
if (silencerChangeTime < get_gametime())
{
return;
}
new WeaponState:cancelWeaponState;
switch (get_member(id, m_iId))
{
case WEAPON_USP:
{
cancelWeaponState = WPNSTATE_USP_SILENCED;
}
case WEAPON_M4A1:
{
cancelWeaponState = WPNSTATE_M4A1_SILENCED;
}
default:
{
return;
}
}
set_member(id, m_Weapon_iWeaponState, get_member(id, m_Weapon_iWeaponState) ^ cancelWeaponState);
set_member(id, m_Weapon_fBurstSpread, 0.0);
set_member(id, m_Weapon_flNextPrimaryAttack, 0.0);
set_member(id, m_Weapon_flNextSecondaryAttack, 0.0);
}
@CBasePlayerWeapon_SecondaryAttack_Post(id)
{
new player = get_member(id, m_pPlayer);
if (get_member(player, m_bOwnsShield))
{
return;
}
new WeaponState:weaponState = get_member(id, m_Weapon_iWeaponState);
new Float:nextSilencerStateTime;
switch (get_member(id, m_iId))
{
case WEAPON_USP:
{
nextSilencerStateTime = usp_silencer_time[weaponState ? 0 : 1];
}
case WEAPON_M4A1:
{
nextSilencerStateTime = m4a1_silencer_time[weaponState ? 0 : 1];
}
default:
{
return;
}
}
set_member(id, m_Weapon_fBurstSpread, get_gametime() + nextSilencerStateTime);
}