#include <amxmodx>
#include <amxmisc>
#include <zombieplague>
#include <fun>
#include <fakemeta>
#include <hamsandwich>

new const INI_FILE[] = "zp_item_menu.ini"

#define ITEM_FLAG ADMIN_LEVEL_A

enum
{
	SECTION_NONE = 0,
	SECTION_ITEM_HUMAN,
	SECTION_ITEM_ZOMBIE
}

new g_block[33], g_block2[33], g_block3[33]
new g_Name[30][128], g_Todo[128][128], g_Counter, g_Menu
new g_Name2[30][128], g_Todo2[128][128], g_Counter2

public plugin_init() 
{
	register_plugin("[ZP] Vip Menu", "1.0", "")
	
	register_clcmd("zp_vip_menu", "zp_item")

	load_zp_item_menu()
}

public zp_item(id)
{
	if(!(get_user_flags(id) & ITEM_FLAG) || !is_user_alive(id))
	{
		return;
	}

	new item_menu = menu_create("\y[ZP] Vip menu:", "item_handled")

	if(!is_user_alive(id) && zp_get_user_zombie(id))
		menu_additem(item_menu, "\dВзять броню ( +150 )", "1", 0)
	else
		menu_additem(item_menu, "\wВзять броню ( +150 )", "1", 0)

	if(!is_user_alive(id) && g_block[id])
		menu_additem(item_menu, "\dВзять аммо ( +500 ) \r( 1 раз за карту )", "2", 0)
	else
		menu_additem(item_menu, "\wВзять аммо ( +500 )", "2", 0)

	if(!is_user_alive(id) && g_block2[id])
		menu_additem(item_menu, "\dВзять немезиду \r( 1 раз за карту )", "3", 0)
	else
		menu_additem(item_menu, "\wВзять немезиду", "3", 0)

	if(!is_user_alive(id) && g_block3[id] && zp_get_user_zombie(id))
		menu_additem(item_menu, "\dВзять выжившего \r( 1 раз за карту )", "4", 0)
	else
		menu_additem(item_menu, "\wВзять выжившего", "4", 0)

	if(!is_user_alive(id))
		menu_additem(item_menu, "\dМеню вещей", "5", 0)
	else
		menu_additem(item_menu, "\wМеню вещей", "5", 0)

	menu_setprop(item_menu, MPROP_EXIT, MEXIT_ALL)

	menu_display(id, item_menu, 0)
}

public item_handled(id, item_menu, item)
{
	if(item == MENU_EXIT)
	{
		menu_destroy(item_menu)
		
		return PLUGIN_HANDLED
	}

	new s_Data[6], s_Name[64], i_Access, i_Callback

	menu_item_getinfo(item_menu, item, i_Access, s_Data, charsmax(s_Data), s_Name, charsmax(s_Name), i_Callback)

	new i_Key = str_to_num(s_Data)

	switch(i_Key)
	{
		case 1:
		{
			if(!(get_user_flags(id) & ITEM_FLAG))
			{
			        print(id, "!g[ZP]!y У тебя нет прав на это !")
				return PLUGIN_HANDLED
			}

			print(id, "!g[ZP]!y Ты взял себе !g200 !tБрони")
			set_user_armor(id, get_user_armor(id) + 200)
			menu_destroy(item_menu)
			return PLUGIN_HANDLED
		}
		case 2:
		{
			if(!(get_user_flags(id) & ITEM_FLAG))
			{
				print(id, "!g[ZP]!y У тебя нет прав на это !")
				return PLUGIN_HANDLED
			}
			if(g_block[id])
			{
				print(id, "!g[ZP]!y Брать !t500 аммо !yможно только 1 раз за !gкарту")
				return PLUGIN_HANDLED
			}
			
			g_block[id] = 1

			print(id, "!g[ZP]!y Ты взял себе !g500 аммо")
			zp_set_user_ammo_packs(id, zp_get_user_ammo_packs(id) + 500)
			menu_destroy(item_menu)
			return PLUGIN_HANDLED
		}
		case 3:
		{
			if(!(get_user_flags(id) & ITEM_FLAG))
			{
			        print(id, "!g[ZP]!y У тебя нет прав на это !")
				return PLUGIN_HANDLED
			}
			if(g_block2[id])
			{
				print(id, "!g[ZP]!y Чтобы взять !tНемезиду !yможно только 1 раз за !gкарту")
				return PLUGIN_HANDLED
			}

			g_block2[id] = 1

			print(id, "!g[ZP]!y Ты взял себе !tНемезиду !y!")
			zp_make_user_nemesis(id)
			menu_destroy(item_menu)
			return PLUGIN_HANDLED
		}
		case 4:
		{
			if(!(get_user_flags(id) & ITEM_FLAG))
			{
			        print(id, "!g[ZP]!y У тебя нет прав на это !")
				return PLUGIN_HANDLED
			}
			if(g_block3[id])
			{
				print(id, "!g[ZP]!y Чтобы взять !tВыжившего !yможно только 1 раз за !gкарту")
				return PLUGIN_HANDLED
			}

			g_block3[id] = 1

			print(id, "!g[ZP]!y Ты взял себе !tВыжившего !y!")
			zp_make_user_survivor(id)
			menu_destroy(item_menu)
			return PLUGIN_HANDLED
		}
		case 5:	zp_item_menu(id)
	}
	menu_destroy(item_menu)
	return PLUGIN_HANDLED
}

public zp_item_menu(id)
{
	new buildmenu[1024];

	if(zp_get_user_zombie(id))
		formatex(buildmenu, charsmax(buildmenu), "[ZP] Item Menu \r[Zombie]:")
	else
		formatex(buildmenu, charsmax(buildmenu), "[ZP] Item Menu \r[Human]:")

	g_Menu = menu_create(buildmenu, "weapon_menu_handler")

	if(zp_get_user_zombie(id))
	{
		for(new item = 0; item < g_Counter2; item++)
		{
			formatex(buildmenu, charsmax(buildmenu), "%s", g_Name2[item])
	
			menu_additem(g_Menu, buildmenu)
		}
	}
	else
	{
		for(new item = 0; item < g_Counter; item++)
		{
			formatex(buildmenu, charsmax(buildmenu), "%s", g_Name[item])
	
			menu_additem(g_Menu, buildmenu)
		}
	}

	menu_setprop(g_Menu, MPROP_NUMBER_COLOR, "\r");
	formatex(buildmenu, charsmax(buildmenu), "Назад")
	menu_setprop(g_Menu, MPROP_BACKNAME, buildmenu)
	formatex(buildmenu, charsmax(buildmenu), "Вперед")
	menu_setprop(g_Menu, MPROP_NEXTNAME, buildmenu)
	formatex(buildmenu, charsmax(buildmenu), "Выход")
	menu_setprop(g_Menu, MPROP_EXITNAME, buildmenu)

	menu_display(id, g_Menu, 0)
}

public weapon_menu_handler(id, menu, item)
{
	if(zp_get_user_zombie(id))
		zp_force_buy_extra_item(id, zp_get_extra_item_id(g_Todo2[item]), 1)
	else
		zp_force_buy_extra_item(id, zp_get_extra_item_id(g_Todo[item]), 1)
}

load_zp_item_menu()
{
	new filepath[100], linedata[1024], key[64], value[960], section

	get_configsdir(filepath, charsmax(filepath))
	formatex(filepath, charsmax(filepath), "%s/%s", filepath, INI_FILE)

	if (!file_exists(filepath))
	{
		new error[100]
		formatex(error, charsmax(error), "Cannot load customization file %s!", filepath)
		set_fail_state(error)
		return;
	}

	new file = fopen(filepath,"rt")
		
	while (!feof(file))
	{
		fgets(file, linedata, charsmax(linedata))

		replace(linedata, charsmax(linedata), "^n", "")

		// Blank line or comment
		if (!linedata[0] || linedata[0] == ';' || linedata[0] == '}' || linedata[0] == '[' || linedata[0] == ' ') continue;
		
		// New section starting
		if (linedata[0] == '{')
		{
			section++
			continue;
		}
		
		strtok(linedata, key, charsmax(key), value, charsmax(value), '"')

		// Trim spaces
		trim(key)
		trim(value)
		
		switch (section)
		{
			case SECTION_ITEM_HUMAN:
			{
				parse(linedata, g_Name[g_Counter], 127, g_Todo[g_Counter], 9)

				g_Counter++
			}

			case SECTION_ITEM_ZOMBIE:
			{
				parse(linedata, g_Name2[g_Counter2], 127, g_Todo2[g_Counter2], 9)

				g_Counter2++
			}
		}
	}
}

stock print(const id, const input[], any:...)
{
	new iCount = 1, itemlayers[32]
	
	static szMsg[191]
	vformat(szMsg, charsmax(szMsg), input, 3)
	
	replace_all(szMsg, 190, "!g", "^4") // green txt
	replace_all(szMsg, 190, "!y", "^1") // orange txt
	replace_all(szMsg, 190, "!t", "^3") // team txt
	replace_all(szMsg, 190, "^x00", "^0") // team txt
	
	if(id) itemlayers[0] = id
	else get_players(itemlayers, iCount, "ch")
		
	for (new i = 0; i < iCount; i++)
	{
		if (is_user_connected(itemlayers[i]))
		{
			message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("SayText"), _, itemlayers[i])
			write_byte(itemlayers[i])
			write_string(szMsg)
			message_end()
		}
	}
}