// Copyright © 2024 Vaqtincha
/**■■■■■■■■■■■■■■■■■■■■■■■■■■■■ CONFIG START ■■■■■■■■■■■■■■■■■■■■■■■■■■■■*/
const G3SG1_MAX_CLIP = 12 // патроны в магазине (def 20)
const Float:G3SG1_DAMAGE = 65.0 // базовый урон (def 80.0)
const Float:G3SG1_RELOAD_TIME = 4.7 // время перезарядки (def 3.5)
const Float:G3SG1_CYCLETIME = 0.36 // скорострельность (def 0.25)
const Float:G3SG1_ADD_SPREAD_UNZOOM = 0.032 // добавить спрей при стрельбе без зума (def 0.025 + G3SG1_ADD_SPREAD_UNZOOM)
const SG550_MAX_CLIP = 20 // патроны в магазине (def 30)
const Float:SG550_DAMAGE = 55.0 // базовый урон (def 70.0)
const Float:SG550_RELOAD_TIME = 3.7 // время перезарядки (def 3.35)
const Float:SG550_CYCLETIME = 0.29 // скорострельность (def 0.25)
const Float:SG550_ADD_SPREAD_UNZOOM = 0.035 // добавить спрей при стрельбе без зума (def 0.025 + SG550_ADD_SPREAD_UNZOOM)
const Float:AWP_RELOAD_TIME = 2.9 // время перезарядки (def 2.5)
const Float:AWP_SWITCH_TIME = 0.8 // время доставание (def 1.45)
const Float:AWP_SPREAD_FLY_UNZOOM = 0.1 // спрей при стрельбе в прыжке без зума (def 0.85 + 0.08)
const Float:AWP_SPREAD_FLY_ZOOM = 0.03 // спрей при стрельбе в прыжке c зумом (def 0.85)
const AWP_MAX_CLIP = 5 // патроны в магазине (def 10)
const Float:SCOUT_MAX_SPEED = 240.0 // скорость передвижения (def 260.0)
const Float:SCOUT_SPREAD_FLY_UNZOOM = 0.035 // спрей при стрельбе в прыжке без зума (def 0.2 + 0.025)
const Float:SCOUT_SPREAD_FLY_ZOOM = 0.01 // спрей при стрельбе в прыжке c зумом (def 0.2)
const Float:SCOUT_SWITCH_TIME = 0.75 // время доставание (def 1.45)
/**■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ CONFIG END ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■*/
register_plugin("Sniper Balance", PLUGIN_VERSION, "Vaqtincha")
RegisterHookChain(RG_CBaseEntity_FireBullets3, "CBaseEntity_FireBullets3", .post = false)
RegisterHookChain(RG_CBasePlayerWeapon_DefaultReload, "CBasePlayerWeapon_DefaultReload", .post = false)
RegisterHam(Ham_CS_Item_GetMaxSpeed, "weapon_scout", "CBasePlayerItem_scoutGetMaxSpeed", .Post = false)
RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_g3sg1", "CBasePlayerWeapon_g3sg1PrimAttack", .Post = true)
RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_sg550", "CBasePlayerWeapon_sg550PrimAttack", .Post = true)
RegisterHam(Ham_Spawn, "weapon_g3sg1", "CBasePlayerItem_g3sg1Spawn", .Post = true)
RegisterHam(Ham_Spawn, "weapon_sg550", "CBasePlayerItem_sg550Spawn", .Post = true)
RegisterHam(Ham_Spawn, "weapon_awp", "CBasePlayerItem_awpSpawn", .Post = true)
RegisterHam(Ham_Item_Deploy, "weapon_awp", "CBasePlayerItem_awpDeploy", .Post = true)
RegisterHam(Ham_Item_Deploy, "weapon_scout", "CBasePlayerItem_scoutDeploy", .Post = true)
public CBasePlayerItem_awpDeploy(const pItem)
SetDelay(get_member(pItem, m_pPlayer), pItem, AWP_SWITCH_TIME)
public CBasePlayerItem_scoutDeploy(const pItem)
SetDelay(get_member(pItem, m_pPlayer), pItem, SCOUT_SWITCH_TIME)
public CBasePlayerItem_awpSpawn(const pItem)
rg_set_iteminfo(pItem, ItemInfo_iMaxClip, AWP_MAX_CLIP)
public CBasePlayerItem_sg550Spawn(const pItem)
rg_set_iteminfo(pItem, ItemInfo_iMaxClip, SG550_MAX_CLIP)
set_member(pItem, m_Weapon_flBaseDamage, SG550_DAMAGE)
public CBasePlayerWeapon_sg550PrimAttack(const pWeapon)
if (!is_nullent(pWeapon))
set_member(pWeapon, m_Weapon_flNextPrimaryAttack, SG550_CYCLETIME)
set_member(pWeapon, m_Weapon_flNextSecondaryAttack, SG550_CYCLETIME)
public CBasePlayerItem_g3sg1Spawn(const pItem)
rg_set_iteminfo(pItem, ItemInfo_iMaxClip, G3SG1_MAX_CLIP)
set_member(pItem, m_Weapon_flBaseDamage, G3SG1_DAMAGE)
public CBasePlayerWeapon_g3sg1PrimAttack(const pWeapon)
if (!is_nullent(pWeapon))
set_member(pWeapon, m_Weapon_flNextPrimaryAttack, G3SG1_CYCLETIME)
set_member(pWeapon, m_Weapon_flNextSecondaryAttack, G3SG1_CYCLETIME)
public CBasePlayerItem_scoutGetMaxSpeed(const pItem)
new pPlayer = get_member(pItem, m_pPlayer)
if (IsPlayer(pPlayer) && get_member(pPlayer, m_iFOV) == DEFAULT_FOV)
SetHamReturnFloat(SCOUT_MAX_SPEED)
public CBasePlayerWeapon_DefaultReload(const pWeapon, iClipSize, iAnim, Float:fDelay)
if (!is_nullent(pWeapon))
switch (get_member(pWeapon, m_iId))
case WEAPON_G3SG1: SetHookChainArg(4, ATYPE_FLOAT, G3SG1_RELOAD_TIME)
case WEAPON_SG550: SetHookChainArg(4, ATYPE_FLOAT, SG550_RELOAD_TIME)
case WEAPON_AWP: SetHookChainArg(4, ATYPE_FLOAT, AWP_RELOAD_TIME)
public CBaseEntity_FireBullets3(const pPlayer, Float:vecSrc[3], Float:vecDirShooting[3],
Float:fSpread, Float:flDistance, iPenetration, Bullet:iBulletType, iDamage, Float:flRangeModifier, pevAttacker, bool:bPistol, shared_rand)
new pActiveItem = get_member(pPlayer, m_pActiveItem)
if (is_nullent(pActiveItem))
switch (get_member(pActiveItem, m_iId))
if (get_member(pPlayer, m_iFOV) == DEFAULT_FOV)
SetHookChainArg(4, ATYPE_FLOAT, fSpread + G3SG1_ADD_SPREAD_UNZOOM) // 0.025 + add
if (get_member(pPlayer, m_iFOV) == DEFAULT_FOV)
SetHookChainArg(4, ATYPE_FLOAT, fSpread + SG550_ADD_SPREAD_UNZOOM) // 0.025 + add
if (!(get_entvar(pPlayer, var_flags) & FL_ONGROUND)) // jump | fly
SetHookChainArg(4, ATYPE_FLOAT, (get_member(pPlayer, m_iLastZoom) == DEFAULT_FOV) ? AWP_SPREAD_FLY_UNZOOM : AWP_SPREAD_FLY_ZOOM)
if (!(get_entvar(pPlayer, var_flags) & FL_ONGROUND)) // jump | fly
SetHookChainArg(4, ATYPE_FLOAT, (get_member(pPlayer, m_iLastZoom) == DEFAULT_FOV) ? SCOUT_SPREAD_FLY_UNZOOM : SCOUT_SPREAD_FLY_ZOOM)
SetDelay(const pPlayer, const pItem, const Float:flDelay)
set_member(pItem, m_Weapon_flNextPrimaryAttack, flDelay)
set_member(pItem, m_Weapon_flNextSecondaryAttack, flDelay)
set_member(pPlayer, m_flNextAttack, flDelay)