/*
Name: [ZP] Addon: Bonus Box
Author: PomanoB & STRELOK
Version 1.0

Based on [ZP] DM Item's by PomanoB
*/

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

#define PLUGIN "[ZP] Addon: Bonus Box"
#define VERSION "1.0"
#define AUTHOR "PomanoB & Accelerator"

#define OFFSET_FLASH_AMMO 387
#define OFFSET_HE_AMMO 388
#define OFFSET_SMOKE_AMMO 389

new const item_class_name[] = "dm_item"

new g_models[][] = {"models/zombie_plague/presents.mdl"}

public plugin_precache()
{
	for (new i = 0; i < sizeof g_models; i++)
		precache_model(g_models[i])	
}

public plugin_init()
{
	register_plugin(PLUGIN, VERSION, AUTHOR)
	
	register_forward(FM_Touch, "fwd_Touch")
	
	register_event("HLTV", "round_start", "a", "1=0", "2=0")
	
	RegisterHam(Ham_Killed, "player", "fw_PlayerKilled")
	
	register_dictionary("bonus_box.txt")
}

public fwd_Touch(toucher, touched)
{
	if (!is_user_alive(toucher) || !pev_valid(touched))
		return FMRES_IGNORED
	
	new classname[32]	
	pev(touched, pev_classname, classname, 31)
	if (!equal(classname, item_class_name))
		return FMRES_IGNORED
	
	
	
	give_item(toucher)
	set_pev(touched, pev_effects, EF_NODRAW)
	set_pev(touched, pev_solid, SOLID_NOT)
	
	return FMRES_IGNORED
	
}

public fw_PlayerKilled(victim, attacker, shouldgib)
{
	if (!is_user_connected(attacker) || !is_user_connected(victim) || attacker == victim || !attacker)
		return HAM_IGNORED
	
	
	new random = random_num(0, 8)
	
	if (random == 1 || random == 4 || random == 6)
	{
		new origin[3]
		get_user_origin(victim, origin, 0)
		
		addItem(origin)
	}
	
	return HAM_IGNORED
}

public removeEntity(ent)
{
	if (pev_valid(ent))
		engfunc(EngFunc_RemoveEntity, ent)
}

public addItem(origin[3])
{
	new ent = fm_create_entity("info_target")
	set_pev(ent, pev_classname, item_class_name)
	
	engfunc(EngFunc_SetModel,ent, g_models[random_num(0, sizeof g_models - 1)])

	set_pev(ent,pev_mins,Float:{-10.0,-10.0,0.0})
	set_pev(ent,pev_maxs,Float:{10.0,10.0,25.0})
	set_pev(ent,pev_size,Float:{-10.0,-10.0,0.0,10.0,10.0,25.0})
	engfunc(EngFunc_SetSize,ent,Float:{-10.0,-10.0,0.0},Float:{10.0,10.0,25.0})

	set_pev(ent,pev_solid,SOLID_BBOX)
	set_pev(ent,pev_movetype,MOVETYPE_FLY)
	
	new Float:fOrigin[3]
	IVecFVec(origin, fOrigin)
	set_pev(ent, pev_origin, fOrigin)
	
	set_pev(ent,pev_renderfx,kRenderFxGlowShell)
	switch(random_num(1,4))
	{
		case 1: set_pev(ent,pev_rendercolor,Float:{0.0,0.0,255.0})
		case 2: set_pev(ent,pev_rendercolor,Float:{0.0,255.0,0.0})
		case 3: set_pev(ent,pev_rendercolor,Float:{255.0,0.0,0.0})
		case 4: set_pev(ent,pev_rendercolor,Float:{255.0,255.0,255.0})
	}
}

public give_item(id)
{
	new zombie 
	zombie = zp_get_user_zombie(id)
	
	new i = random_num(0, (zombie ? 5 : 13))
	switch (i)
	{
		case 0:
			if (zombie)
			{
				if (!zp_get_user_last_zombie(id) && !zp_is_survivor_round() && !zp_is_swarm_round())
				{
					zp_disinfect_user(id)
					ChatColor(id, "!g[ZP]!y %L", LANG_PLAYER, "ITEM_DM_ANTIDOT")
				}
				else
					ChatColor(id, "!g[ZP]!y %L", LANG_PLAYER, "ITEM_DM_NO")	
			}
			else
			{
				if (!zp_get_user_last_human(id) && !zp_is_survivor_round() && !zp_is_swarm_round())
				{
					zp_infect_user(id)
					ChatColor(id, "!g[ZP]!y %L", LANG_PLAYER, "ITEM_DM_INFECT")
				}
				else
					ChatColor(id, "!g[ZP]!y %L", LANG_PLAYER, "ITEM_DM_NO")
			}
			
		case 1:
		{
			fm_set_user_health(id, get_user_health(id) + (zombie ? 500 : 50))
			ChatColor(id, "!g[ZP]!y %L", LANG_PLAYER, "ITEM_DM_HEALTH_UP")
		}
		case 2:
		{
			fm_set_user_health(id, get_user_health(id) - (zombie ? 250 : 25))
			ChatColor(id, "!g[ZP]!y %L", LANG_PLAYER, "ITEM_DM_HEALTH_DOWN")
		}
		case 3:
		{
			zp_set_user_ammo_packs(id, zp_get_user_ammo_packs(id) + random_num(1, 5))
			ChatColor(id, "!g[ZP]!y %L", LANG_PLAYER, "ITEM_DM_AMMOPACKS_UP")
		}
		case 4:
		{
			zp_set_user_ammo_packs(id, zp_get_user_ammo_packs(id) - random_num(1, 5))
			ChatColor(id, "!g[ZP]!y %L", LANG_PLAYER, "ITEM_DM_AMMOPACKS_DOWN")
		}
		case 5:
		{
			fm_set_user_gravity(id, 0.5)
			ChatColor(id, "!g[ZP]!y %L", LANG_PLAYER, "ITEM_DM_GRAVITY")
		}
		case 6:
		{
			if (!zp_get_user_nightvision(id))
			{
				zp_set_user_nightvision(id, 1)
				ChatColor(id, "!g[ZP]!y %L", LANG_PLAYER, "ITEM_DM_NIGHTVISION")
			}
			else
				ChatColor(id, "!g[ZP]!y %L", LANG_PLAYER, "ITEM_DM_NO")
		}
		case 7:
		{
			fm_set_user_armor(id, get_user_armor(id) + 100)
			ChatColor(id, "!g[ZP]!y %L", LANG_PLAYER, "ITEM_DM_ARMOR_UP")
		}
		case 8:
		{
			fm_set_user_armor(id, get_user_armor(id) - 100)
			ChatColor(id, "!g[ZP]!y %L", LANG_PLAYER, "ITEM_DM_ARMOR_DOWN")
		}
		case 9:
		{
			set_pev(id, pev_effects, pev(id, pev_effects) | EF_BRIGHTLIGHT)
			ChatColor(id, "!g[ZP]!y %L", LANG_PLAYER, "ITEM_DM_BRIGHTLIGHT")
		}
		case 10:
		{
			fm_give_item(id, "weapon_flashbang")
			fm_give_item(id, "weapon_smokegrenade")
			fm_give_item(id, "weapon_hegrenade")
			
			set_pdata_int(id, OFFSET_FLASH_AMMO, 3)
			set_pdata_int(id, OFFSET_HE_AMMO, 3)
			set_pdata_int(id, OFFSET_SMOKE_AMMO, 3)
			
			ChatColor(id, "!g[ZP]!y %L", LANG_PLAYER, "ITEM_DM_GRENADES")
		}
		case 11:
		{
			if (!user_has_weapon(id, CSW_SG550))
			{
				fm_give_item(id, "weapon_sg550")
				ExecuteHamB(Ham_GiveAmmo, id, 30, "556nato", 90)
				
				ChatColor(id, "!g[ZP]!y %L", LANG_PLAYER, "ITEM_DM_SG550")
			}
			else
				ChatColor(id, "!g[ZP]!y %L", LANG_PLAYER, "ITEM_DM_NO")
		}
		case 12:
		{
			if (!user_has_weapon(id, CSW_G3SG1))
			{
				fm_give_item(id, "weapon_g3sg1")
				ExecuteHamB(Ham_GiveAmmo, id, 30, "762nato", 20)
				
				ChatColor(id, "!g[ZP]!y %L", LANG_PLAYER, "ITEM_DM_G3SG1")
			}
			else
				ChatColor(id, "!g[ZP]!y %L", LANG_PLAYER, "ITEM_DM_NO")
		}
		case 13:
		{
			if (!user_has_weapon(id, CSW_M249))
			{
				fm_give_item(id, "weapon_m249")
				ExecuteHamB(Ham_GiveAmmo, id, 100, "9mm", 200)
				
				ChatColor(id, "!g[ZP]!y %L", LANG_PLAYER, "ITEM_DM_M249")
			}
			else
				ChatColor(id, "!g[ZP]!y %L", LANG_PLAYER, "ITEM_DM_NO")
		}
		case 14:
		{
			if (!user_has_weapon(id, CSW_AWP))
			{
				fm_give_item(id, "weapon_awp")
				ExecuteHamB(Ham_GiveAmmo, id, 10, "338magnum", 30)
				
				ChatColor(id, "!g[ZP]!y %L", LANG_PLAYER, "ITEM_DM_AWP")
			}
			else
				ChatColor(id, "!g[ZP]!y %L", LANG_PLAYER, "ITEM_DM_NO")
		}
	}
}

public round_start()
{
	new ent = FM_NULLENT
	static string_class[] = "classname"
	while ((ent = engfunc(EngFunc_FindEntityByString, ent, string_class, item_class_name))) 
		set_pev(ent, pev_flags, FL_KILLME)
}

// Stock: ChatColor!
stock ChatColor(const id, const input[], any:...)
{
	new count = 1, players[32]
	static msg[191]
	vformat(msg, 190, input, 3)
	
	replace_all(msg, 190, "!g", "^4") // Green Color
	replace_all(msg, 190, "!y", "^1") // Default Color
	replace_all(msg, 190, "!team", "^3") // Team Color
	replace_all(msg, 190, "!team2", "^0") // Team2 Color
	
	if (id) players[0] = id; else get_players(players, count, "ch")
	{
		for (new i = 0; i < count; i++)
		{
			if (is_user_connected(players[i]))
			{
				message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("SayText"), _, players[i])
				write_byte(players[i]);
				write_string(msg);
				message_end();
			}
		}
	}
}