#include <amxmodx>
#include <cstrike>
#include <engine>
#include <fakemeta>
#include <hamsandwich>
new const PLUGIN[] = "Free Ammo & Vest"
new const VERSION[] = "1.5"
new const AUTHOR[] = "ConnorMcLeod, HamletEagle & hellmonja"
#define m_pNext 42
#define m_bNotKilled 113
#define m_rgpPlayerItems_Slot1 368
#define m_rgpPlayerItems_Slot2 369
const m_fInReload = 54
const m_pPlayer = 41
const m_iId = 43
const XoWeapon = 4
const m_flNextAttack = 83
const XoPlayer = 5
new g_bitFirstSpawn, g_bomb_site;
new cvar_free_vest, cvar_plugin_on, cvar_free_defuser, cvar_infinite_ammo;
new HamHook:HandleItemPostFrameHook[CSW_P90 + 1]
#define MarkUserFirstSpawn(%0) g_bitFirstSpawn |= 1<<(%0&31)
#define ClearUserFirstSpawn(%0) g_bitFirstSpawn &= ~(1<<(%0&31))
#define IsUserFirstSpawn(%0) ( g_bitFirstSpawn & 1<<(%0&31) )
new const WpnID[] =
{
CSW_P228,
CSW_AK47,
CSW_M4A1,
CSW_P90,
CSW_DEAGLE,
CSW_M249,
CSW_MP5NAVY,
CSW_AWP,
CSW_M3,
CSW_USP
}
new const Rounds[] =
{
52,
90,
90,
100,
35,
200,
120,
30,
32,
100
}
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)
RegisterHam(Ham_Spawn, "player", "Player_Spawn", true);
RegisterHam(Ham_Spawn, "player", "Ham_CBasePlayer_Spawn_Pre", 0);
register_event("StatusIcon", "OnPlayerEnterBuyzone", "be", "1=1", "2=buyzone");
cvar_plugin_on = register_cvar("fanv_plugin_on", "1");
cvar_free_vest = register_cvar("fanv_free_vest", "1");
cvar_free_defuser = register_cvar("fanv_free_defuser", "1");
cvar_infinite_ammo = register_cvar("fanv_infinite_ammo", "0");
new const WeaponsWithoutReload = (1 << CSW_M3) | (1 << CSW_XM1014) | (1 << CSW_KNIFE) | (1 << CSW_C4) | (1 << CSW_HEGRENADE) | (1 << CSW_FLASHBANG) | (1 << CSW_SMOKEGRENADE)
new const HookNames[][] =
{
"CBasePlayerWeapon_ItemPostFrame",
"CBasePlayerWeapon_ItemHolster",
"CBasePlayerWeapon_Reload"
}
new WeaponName[32]
for(new i = CSW_P228; i <= CSW_P90; i++)
{
if(WeaponsWithoutReload & (1 << i))
{
continue
}
get_weaponname(i, WeaponName, charsmax(WeaponName))
if(WeaponName[0] != EOS)
{
HandleItemPostFrameHook[i] = RegisterHam(Ham_Item_PostFrame, WeaponName, HookNames[0], false)
RegisterHam(Ham_Item_Holster , WeaponName, HookNames[1], false)
RegisterHam(Ham_Weapon_Reload, WeaponName, HookNames[2], true)
DisableHamForward(HandleItemPostFrameHook[i])
}
}
if (find_ent_by_class(-1, "func_bomb_target") > 0 || find_ent_by_class(-1, "info_bomb_target") > 0)
g_bomb_site = 1;
}
public client_connect(id)
{
MarkUserFirstSpawn(id)
}
public client_putinserver(id)
{
ClearUserFirstSpawn(id)
}
public Ham_CBasePlayer_Spawn_Pre( id )
{
if(get_pcvar_num(cvar_plugin_on) == 0)
return
if( !IsUserFirstSpawn(id) && get_pdata_int(id, m_bNotKilled, XoPlayer) )
{
new Float:flNextAttack = get_pdata_float(id, m_flNextAttack, XoPlayer)
set_pdata_float(id, m_flNextAttack, -0.001, XoPlayer)
for(new iPlayerItems=m_rgpPlayerItems_Slot1, iWeapon; iPlayerItems<=m_rgpPlayerItems_Slot2; iPlayerItems++)
{
iWeapon = get_pdata_cbase(id, iPlayerItems, XoPlayer)
while( pev_valid(iWeapon) )
{
set_pdata_int(iWeapon, m_fInReload, 1, XoWeapon)
ExecuteHamB(Ham_Item_PostFrame, iWeapon)
iWeapon = get_pdata_cbase(iWeapon, m_pNext, XoWeapon)
}
}
set_pdata_float(id, m_flNextAttack, flNextAttack, XoPlayer)
}
}
public CBasePlayerWeapon_Reload(WeaponEntity)
{
if(pev_valid(WeaponEntity))
{
if(get_pdata_int(WeaponEntity, m_fInReload, XoWeapon))
{
new WeaponIndex = get_pdata_int(WeaponEntity, m_iId, XoWeapon)
EnableHamForward(HandleItemPostFrameHook[WeaponIndex])
}
}
}
public CBasePlayerWeapon_ItemPostFrame(WeaponEntity)
{
if(pev_valid(WeaponEntity))
{
if(get_pdata_int(WeaponEntity, m_fInReload, XoWeapon))
{
new id = get_pdata_cbase(WeaponEntity, m_pPlayer, XoWeapon)
if(get_pdata_float(id, m_flNextAttack, XoPlayer) <= 0.0)
{
new WeaponIndex = get_pdata_int(WeaponEntity, m_iId, XoWeapon)
DisableHamForward(HandleItemPostFrameHook[WeaponIndex])
if(get_pcvar_num(cvar_infinite_ammo) == 1 || cs_get_user_buyzone(id))
set_task(0.1, "Player_Spawn", id);
else
return
}
}
}
}
public CBasePlayerWeapon_ItemHolster(WeaponEntity)
{
if(pev_valid(WeaponEntity))
{
if(get_pdata_int(WeaponEntity, m_fInReload, XoWeapon))
{
new WeaponIndex = get_pdata_int(WeaponEntity, m_iId, XoWeapon)
DisableHamForward(HandleItemPostFrameHook[WeaponIndex])
}
}
}
public Player_Spawn(id)
{
if(get_pcvar_num(cvar_plugin_on) == 0)
return
for(new i = 0; i <= sizeof WpnID -1; i++)
cs_set_user_bpammo(id, WpnID[i], Rounds[i]);
if(get_pcvar_num(cvar_free_vest) == 1)
cs_set_user_armor(id, 100, CS_ARMOR_VESTHELM);
if(get_pcvar_num(cvar_free_defuser) == 1 && g_bomb_site == 1 && get_user_team(id) == 2)
cs_set_user_defuse(id, 1);
}
public OnPlayerEnterBuyzone(id)
{
Player_Spawn(id);
}