/*================================================================================

	[ZPSp] Extra Item: Weapons Pack

	Three buyable human weapons for the extra-items menu. Each gives the gun with
	a full magazine and a generous backpack supply.

		- Heavy Gunner  : M249 + 200 ammo
		- Magnum        : AWP  +  30 ammo
		- Akimbo Elites : Dual Berettas + 120 ammo

================================================================================*/

#include <amxmodx>
#include <fakemeta>
#include <engine>
#include <cstrike>
#include <zombie_plague_special>

#define PLUGIN_NAME	"[ZPSp] Extra Weapons Pack"
#define PLUGIN_VERSION	"1.0"
#define PLUGIN_AUTHOR	"Kimi Code"

#if !defined SF_NORESPAWN
	#define SF_NORESPAWN (1<<30)
#endif

new g_item_m249, g_item_awp, g_item_elite

public plugin_init()
{
	register_plugin(PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_AUTHOR)

	g_item_m249  = zp_register_extra_item("Heavy Gunner (M249)", 18, ZP_TEAM_HUMAN)
	g_item_awp   = zp_register_extra_item("Magnum (AWP)", 16, ZP_TEAM_HUMAN)
	g_item_elite = zp_register_extra_item("Akimbo Elites", 8, ZP_TEAM_HUMAN)
}

public zp_extra_item_selected(id, itemid)
{
	if(itemid != g_item_m249 && itemid != g_item_awp && itemid != g_item_elite)
		return PLUGIN_CONTINUE

	if(zp_get_user_zombie(id) || !is_user_alive(id))
		return ZP_PLUGIN_HANDLED	// can't use it -> refund

	if(itemid == g_item_m249)
	{
		give_weapon(id, "weapon_m249", CSW_M249, 200)
		client_print(id, print_chat, "[ZP] Heavy Gunner: M249 with 200 ammo.")
	}
	else if(itemid == g_item_awp)
	{
		give_weapon(id, "weapon_awp", CSW_AWP, 30)
		client_print(id, print_chat, "[ZP] Magnum: AWP with 30 ammo.")
	}
	else
	{
		give_weapon(id, "weapon_elite", CSW_ELITE, 120)
		client_print(id, print_chat, "[ZP] Akimbo Elites with 120 ammo.")
	}

	return PLUGIN_HANDLED
}

give_weapon(id, const weapon[], csw, bpammo)
{
	// Avoid stacking duplicates of the same gun.
	if(!find_ent_by_owner(-1, weapon, id))
		fm_give_item(id, weapon)

	cs_set_user_bpammo(id, csw, bpammo)
}

fm_give_item(id, const item[])
{
	new ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, item))
	if(!pev_valid(ent))
		return 0

	new Float:origin[3]
	pev(id, pev_origin, origin)
	set_pev(ent, pev_origin, origin)
	set_pev(ent, pev_spawnflags, pev(ent, pev_spawnflags) | SF_NORESPAWN)
	dllfunc(DLLFunc_Spawn, ent)

	new save = pev(ent, pev_solid)
	dllfunc(DLLFunc_Touch, ent, id)
	if(pev(ent, pev_solid) != save)
		return ent

	engfunc(EngFunc_RemoveEntity, ent)
	return 0
}
