#include <amxmodx>
#include <amxmisc>
#include <cstrike>

#define BUY_BPAMMO "items/9mmclip1.wav"

new cvar_bpcost, cvar_admin
new g_msgAmmoPickup

new const PLUGIN_NAME[] = "BP Ammo"
new const PLUGIN_VERSION[] = "v0.4"
new const AUTHOR[] = "YKH =]"

// Admin
const ACCESS_FLAG = ADMIN_LEVEL_A

// Admin Amount of ammo to give when buying additional clips for weapons
new const MAXBPAMMO[] = { -1, 104, -1, 180, -1, 64, 1, 200, 180, -1, 240, 200, 200, 180, 180, 180, 200, 240,
			60, 240, 600, 64, 180, 240, 180, -1, 70, 180, 180, -1, 200 }

// Max BP ammo for weapons(player)
new const MAXBPAMMO2[] = { -1, 52, -1, 90, -1, 32, 1, 100, 90, -1, 120, 100, 100, 90, 90, 90, 100, 120,
			30, 120, 200, 32, 90, 120, 90, -1, 35, 90, 90, -1, 100 }

// Admin Amount of ammo to give when buying additional clips for weapons
new const BUYAMMO[] = { -1, 52, -1, 90, -1, 32, 1, 100, 90, -1, 120, 100, 100, 90, 90, 90, 100, 120,
			30, 120, 200, 32, 90, 120, 90, -1, 36, 90, 90, -1, 100 }

// Amount of ammo to give when buying additional clips for weapons
new const BUYAMMO2[] = { -1, 13, -1, 30, -1, 8, -1, 12, 30, -1, 30, 50, 12, 30, 30, 30, 12, 30,
			10, 30, 30, 8, 30, 30, 30, -1, 7, 30, 30, -1, 50 }

// Ammo IDs for weapons
new const AMMOID[] = { -1, 9, -1, 2, 12, 5, 14, 6, 4, 13, 10, 7, 6, 4, 4, 4, 6, 10,
			1, 10, 3, 5, 4, 10, 2, 11, 8, 4, 2, -1, 7 }


const PRIMARY_WEAPONS_BIT_SUM = (1<<CSW_SCOUT)|(1<<CSW_XM1014)|(1<<CSW_MAC10)|(1<<CSW_AUG)|(1<<CSW_UMP45)|(1<<CSW_SG550)|(1<<CSW_GALIL)|(1<<CSW_FAMAS)|(1<<CSW_AWP)|(1<<CSW_MP5NAVY)|(1<<CSW_M249)|(1<<CSW_M3)|(1<<CSW_M4A1)|(1<<CSW_TMP)|(1<<CSW_G3SG1)|(1<<CSW_SG552)|(1<<CSW_AK47)|(1<<CSW_P90)
const SECONDARY_WEAPONS_BIT_SUM = (1<<CSW_P228)|(1<<CSW_ELITE)|(1<<CSW_FIVESEVEN)|(1<<CSW_USP)|(1<<CSW_GLOCK18)|(1<<CSW_DEAGLE)

public plugin_init()
{
	register_plugin(PLUGIN_NAME, PLUGIN_VERSION, AUTHOR)
	register_event("HLTV", "event_round_start", "a", "1=0", "2=0")
	cvar_bpcost = register_cvar("bpammo_cost", "30")
	cvar_admin = register_cvar("bp_admin", "0")
	register_clcmd("buyammo1", "clcmd_buyammo1")
	register_clcmd("buyammo2", "clcmd_buyammo2")
	g_msgAmmoPickup = get_user_msgid("AmmoPickup")

	// Round Start display message
	set_task(1.0, "event_round_start")

}
public plugin_precache()
{
	precache_sound(BUY_BPAMMO);
}

public clcmd_buyammo1(id)
{
	// Not alive or infinite ammo setting enabled
	if (!is_user_alive(id) || !cs_get_user_buyzone(id))
		return PLUGIN_HANDLED;

	new money = cs_get_user_money(id)
	new cost = get_pcvar_num(cvar_bpcost)

	// Get user weapons
	static weapons[32], num, i, currentammo, weaponid
	num = 0 // reset passed weapons count (bugfix)
	get_user_weapons(id, weapons, num)

	// Not enoungh Money ?
	if (money < cost)
		return PLUGIN_HANDLED;
	
	// Loop through them and give the right ammo type
	for (i = 0; i < num; i++)
	{
		// Prevents re-indexing the array
		weaponid = weapons[i]
		
		if ((1<<weaponid) & PRIMARY_WEAPONS_BIT_SUM) // primary
		{
			// Get current ammo of the weapon
			currentammo = cs_get_user_bpammo(id, weaponid)

			if (get_pcvar_num(cvar_admin) == 1)
			{
				if (get_user_flags(id) & ACCESS_FLAG)
				{
					// Check if we are close to the BP ammo limit
					if (currentammo <= MAXBPAMMO[weaponid]-BUYAMMO[weaponid])
					{
						// Flash ammo in hud
						message_begin(MSG_ONE_UNRELIABLE, g_msgAmmoPickup, _, id)
						write_byte(AMMOID[weaponid]) // ammo id
						write_byte(BUYAMMO[weaponid]) // ammo amount
						message_end()
						
						// Increase BP ammo
						emit_sound(id, CHAN_VOICE, BUY_BPAMMO, 0.9, ATTN_STATIC, 0, PITCH_NORM)// Play sounds
						cs_set_user_bpammo(id, weaponid, currentammo + BUYAMMO[weaponid])
						cs_set_user_money(id, money - cost)
					}
					else
					{
						// Flash ammo in hud
						message_begin(MSG_ONE_UNRELIABLE, g_msgAmmoPickup, _, id)
						write_byte(AMMOID[weaponid]) // ammo id
						write_byte(MAXBPAMMO[weaponid]-currentammo) // ammo amount
						message_end()
						
						// Reached the limit
						cs_set_user_bpammo(id, weaponid, MAXBPAMMO[weaponid])
					}
				}	
				else
				{
					// Check if we are close to the BP ammo limit
					if (currentammo <= MAXBPAMMO2[weaponid]-BUYAMMO2[weaponid])
					{
						// Flash ammo in hud
						message_begin(MSG_ONE_UNRELIABLE, g_msgAmmoPickup, _, id)
						write_byte(AMMOID[weaponid]) // ammo id
						write_byte(BUYAMMO2[weaponid]) // ammo amount
						message_end()
						
						// Increase BP ammo
						emit_sound(id, CHAN_VOICE, BUY_BPAMMO, 0.9, ATTN_STATIC, 0, PITCH_NORM)// Play sounds
						cs_set_user_bpammo(id, weaponid, currentammo + BUYAMMO[weaponid])
						cs_set_user_money(id, money - cost)
					}
					else
					{
						// Flash ammo in hud
						message_begin(MSG_ONE_UNRELIABLE, g_msgAmmoPickup, _, id)
						write_byte(AMMOID[weaponid]) // ammo id
						write_byte(MAXBPAMMO2[weaponid]-currentammo) // ammo amount
						message_end()
						
						// Reached the limit
						cs_set_user_bpammo(id, weaponid, MAXBPAMMO2[weaponid])
					}
				}
			}
			else
			{
				// Check if we are close to the BP ammo limit
				if (currentammo <= MAXBPAMMO[weaponid]-BUYAMMO[weaponid])
				{
					// Flash ammo in hud
					message_begin(MSG_ONE_UNRELIABLE, g_msgAmmoPickup, _, id)
					write_byte(AMMOID[weaponid]) // ammo id
					write_byte(BUYAMMO[weaponid]) // ammo amount
					message_end()
					
					// Increase BP ammo
					emit_sound(id, CHAN_VOICE, BUY_BPAMMO, 0.9, ATTN_STATIC, 0, PITCH_NORM)// Play sounds
					cs_set_user_bpammo(id, weaponid, currentammo + BUYAMMO[weaponid])
					cs_set_user_money(id, money - cost)
				}
				else
				{
					// Flash ammo in hud
					message_begin(MSG_ONE_UNRELIABLE, g_msgAmmoPickup, _, id)
					write_byte(AMMOID[weaponid]) // ammo id
					write_byte(MAXBPAMMO[weaponid]-currentammo) // ammo amount
					message_end()
					
					// Reached the limit
					cs_set_user_bpammo(id, weaponid, MAXBPAMMO[weaponid])
				}
			}
		}
	}
	return PLUGIN_HANDLED;	
}
public clcmd_buyammo2(id)
{
	// Not alive or infinite ammo setting enabled
	if (!is_user_alive(id) || !cs_get_user_buyzone(id))
		return PLUGIN_HANDLED;

	new money = cs_get_user_money(id)
	new cost = get_pcvar_num(cvar_bpcost)

	// Get user weapons
	static weapons[32], num, i, currentammo, weaponid
	num = 0 // reset passed weapons count (bugfix)
	get_user_weapons(id, weapons, num)

	// Not enoungh Money ?
	if (money < cost)
		return PLUGIN_HANDLED;
	
	// Loop through them and give the right ammo type
	for (i = 0; i < num; i++)
	{
		// Prevents re-indexing the array
		weaponid = weapons[i]

		if ((1<<weaponid) & SECONDARY_WEAPONS_BIT_SUM) // secondary
		{
			// Get current ammo of the weapon
			currentammo = cs_get_user_bpammo(id, weaponid)

			if (get_pcvar_num(cvar_admin) == 1)
			{	
				if (get_user_flags(id) & ACCESS_FLAG)
				{
					// Check if we are close to the BP ammo limit
					if (currentammo <= MAXBPAMMO[weaponid]-BUYAMMO[weaponid])
					{
						// Flash ammo in hud
						message_begin(MSG_ONE_UNRELIABLE, g_msgAmmoPickup, _, id)
						write_byte(AMMOID[weaponid]) // ammo id
						write_byte(BUYAMMO[weaponid]) // ammo amount
						message_end()
						
						// Increase BP ammo
						emit_sound(id, CHAN_VOICE, BUY_BPAMMO, 0.9, ATTN_STATIC, 0, PITCH_NORM)// Play sounds
						cs_set_user_bpammo(id, weaponid, currentammo + BUYAMMO[weaponid])
						cs_set_user_money(id, money - cost)
					}
					else
					{
						// Flash ammo in hud
						message_begin(MSG_ONE_UNRELIABLE, g_msgAmmoPickup, _, id)
						write_byte(AMMOID[weaponid]) // ammo id
						write_byte(MAXBPAMMO[weaponid]-currentammo) // ammo amount
						message_end()
						
						// Reached the limit
						cs_set_user_bpammo(id, weaponid, MAXBPAMMO[weaponid])
					}
				}
				else
				{
					// Check if we are close to the BP ammo limit
					if (currentammo <= MAXBPAMMO2[weaponid]-BUYAMMO2[weaponid])
					{
						// Flash ammo in hud
						message_begin(MSG_ONE_UNRELIABLE, g_msgAmmoPickup, _, id)
						write_byte(AMMOID[weaponid]) // ammo id
						write_byte(BUYAMMO2[weaponid]) // ammo amount
						message_end()
						
						// Increase BP ammo
						emit_sound(id, CHAN_VOICE, BUY_BPAMMO, 0.9, ATTN_STATIC, 0, PITCH_NORM)// Play sounds
						cs_set_user_bpammo(id, weaponid, currentammo + BUYAMMO[weaponid])
						cs_set_user_money(id, money - cost)
					}
					else
					{
						// Flash ammo in hud
						message_begin(MSG_ONE_UNRELIABLE, g_msgAmmoPickup, _, id)
						write_byte(AMMOID[weaponid]) // ammo id
						write_byte(MAXBPAMMO2[weaponid]-currentammo) // ammo amount
						message_end()
						
						// Reached the limit
						cs_set_user_bpammo(id, weaponid, MAXBPAMMO2[weaponid])
					}
				}
			}
			else
			{
				// Check if we are close to the BP ammo limit
				if (currentammo <= MAXBPAMMO[weaponid]-BUYAMMO[weaponid])
				{
					// Flash ammo in hud
					message_begin(MSG_ONE_UNRELIABLE, g_msgAmmoPickup, _, id)
					write_byte(AMMOID[weaponid]) // ammo id
					write_byte(BUYAMMO[weaponid]) // ammo amount
					message_end()
					
					// Increase BP ammo
					emit_sound(id, CHAN_VOICE, BUY_BPAMMO, 0.9, ATTN_STATIC, 0, PITCH_NORM)// Play sounds
					cs_set_user_bpammo(id, weaponid, currentammo + BUYAMMO[weaponid])
					cs_set_user_money(id, money - cost)
				}
				else
				{
					// Flash ammo in hud
					message_begin(MSG_ONE_UNRELIABLE, g_msgAmmoPickup, _, id)
					write_byte(AMMOID[weaponid]) // ammo id
					write_byte(MAXBPAMMO[weaponid]-currentammo) // ammo amount
					message_end()
					
					// Reached the limit
					cs_set_user_bpammo(id, weaponid, MAXBPAMMO[weaponid])
				}
			}
		}
	}
	return PLUGIN_HANDLED;
}
public event_round_start()
{
	set_task(5.0, "welcome_msg")
}
public welcome_msg()
{
	// Show mod info
	client_print(0, print_chat, "[BP] **** %s %s by %s ****", PLUGIN_NAME, PLUGIN_VERSION, AUTHOR)
}
