/* (c) Copyright 2009 by Rube
*
*	--------------------------------------
*	---- Jailbreak Last Request ----------
*	--------------------------------------
*	---------- Author: rube --------------
*	--------------------------------------
*		About the plugin:
*	This plugin allows the last terrorist access a menu to challenge a duel 
*	(typing / lr or !Lr ) the counter-terrorist that he want.
*	--------------------------------------
*		Credits:
*	- Emp` (New AMXX Menu System)
*	- MouseSplash! (Ideas and test)
*	- cikjam (how to optimize my submenu all in one)
*	- Ganz (test)
*	--------------------------------------
*	-v1.6: Optimized duel's menu ( all in one) and set glow with fun
*	-v1.5: Added teleport for every single duel (only map some1s_jailbreak)
*	-v1.4: Added ML.
*	-V1.3: Block the menu until the TE kills the CT that he challenge.
*	-v1.2: Add shot for shot on deagle duel.
*	-V1.1: Unable touch weapons during the duel.
* 	-V1.0: First release.
*/

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

#define PLUGIN "Jailbreak Last Request"
#define VERSION "1.6"
#define AUTHOR "rube"

/*================================================================================
	Variables | bools | Cvars		
=================================================================================*/

new g_maxPlayers, g_msgSayText, beacon_sprite

new cvar_granadas_bpammo, cvar_scout_bpammo, cvar_effect

new bool:touch_weapons[33], bool:once[33], bool:player_challenged[33], bool:duel_active,
bool:knife_duel[33] ,bool:deagle_duel[33], bool:grenade_duel[33], bool:scout_duel[33]

new tag[] = "[JailBreak]"

/*================================================================================
	Init n' precache		
=================================================================================*/

public plugin_precache() 
{	
	beacon_sprite = precache_model("sprites/shockwave.spr")
}

public plugin_init()
{
	register_plugin(PLUGIN, VERSION, AUTHOR)
	
	register_event("HLTV", "event_round_start", "a", "1=0", "2=0")
	
	RegisterHam(Ham_Touch, "weaponbox", "fw_touch_weapon")
	RegisterHam(Ham_Touch, "armoury_entity", "fw_touch_weapon")
	RegisterHam(Ham_Touch, "weapon_shield", "fw_touch_weapon")
	RegisterHam(Ham_Spawn, "player", "fw_player_respawn", 1)
	RegisterHam(Ham_Killed, "player", "fw_player_killed")	
		
	register_forward(FM_CmdStart,"fw_cmdstart",1)
	
	// Comando de jugador - Client commands
	register_clcmd("say /lr", "duel_menu")
	register_clcmd("say !lr", "duel_menu")
	register_clcmd("say_team /lr", "duel_menu")
	register_clcmd("say_team !lr", "duel_menu")
	
	// Cvars
	cvar_granadas_bpammo = register_cvar("jb_grenade_bpammo","10") // amount bpammo grenade | cantidad de granadas
	cvar_scout_bpammo = register_cvar("jb_scout_bpammo", "10") // amount bpammo scout | cantidad de balas pa' la scout
	cvar_effect = register_cvar("jb_effect", "2") // 0 = glow , 1 = beacon, 2 = glow n' beacon
	
	g_maxPlayers = get_maxplayers()
	
	g_msgSayText = get_user_msgid("SayText")
	
	register_dictionary("jailbreak_last_request.txt")
}

/*================================================================================
	Round Start				
=================================================================================*/

public event_round_start()
{
	duel_active = false
}
		
/*================================================================================
	forwards				
=================================================================================*/

public fw_player_respawn(id)
{
	if(!is_user_alive(id) || !cs_get_user_team(id))
		return
	  
	set_user_rendering(id)
	remove_task(id)
	touch_weapons[id] = false 
	once[id] = false 
	knife_duel[id] = false
	deagle_duel[id] = false
	grenade_duel[id] = false
	scout_duel[id] = false	
	player_challenged[id] = false
}

public fw_touch_weapon(weapon, id)
{
	if (!is_user_connected(id))
		return HAM_IGNORED;
	
	new players[32], pnum, tempid;
	get_players(players, pnum, "a");
	for( new i; i<pnum; i++ )
	{        
		tempid = players[i];
	}
	
	if (touch_weapons[id] || touch_weapons[tempid])
		return HAM_SUPERCEDE;
	
	return HAM_IGNORED;
}


public fw_cmdstart(player,uc_handle,random_seed)
{
	if(deagle_duel[player])
	{
		cs_set_user_bpammo(player, CSW_DEAGLE, 1)
	}
}

public fw_player_killed(victim, attacker, shouldgib)
{
	new name[32]
	get_user_name(attacker, name, 31)
			
	if(duel_active)
	{
		if(cs_get_user_team(victim) == CS_TEAM_CT && player_challenged[victim])
		{
			knife_duel[attacker] = false
			deagle_duel[attacker] = false
			grenade_duel[attacker] = false
			scout_duel[attacker] = false
			once[attacker] = false
			strip_user_weapons(attacker)
			give_item(attacker, "weapon_knife")
			set_user_rendering(attacker)
			duel_menu(attacker)
		}
		else if(cs_get_user_team(victim) == CS_TEAM_CT && !player_challenged[victim])
		{
			set_task(0.4, "kill_player", attacker)
			set_hudmessage( 0, 255, 0, -1.0, 0.40, 2, 5.0, 8.0, 0.0, 0.0, 10)
			show_hudmessage(0, "%L", LANG_PLAYER,"DUEL_DOWN", name)
				
		}
	}
	remove_task(attacker)
	remove_task(victim)
}

public kill_player(id)
{
	user_kill(id)
}

/*================================================================================
	Main Menu				
=================================================================================*/

public duel_menu(id)
{	
	if(!is_user_alive(id))
		return PLUGIN_HANDLED
	
	if (!once[id])
	{
		if(cs_get_user_team(id) == CS_TEAM_T)
		{
			new cts[32], ts[32], ctsnum, tsnum 
	
			for (new id=1; id <= g_maxPlayers; id++)
			{
				if (!is_user_connected(id) || !is_user_alive(id)) 
				{ 
					continue 
				} 
	
				if (cs_get_user_team(id) == CS_TEAM_T) 
				{ 
					ts[tsnum++] = id
				} 
				else if (cs_get_user_team(id) == CS_TEAM_CT) 
				{ 
					cts[ctsnum++] = id
				} 
			} 
			if (tsnum == 1 && ctsnum >= 1) 
			{  
			
				static opcion[64]
	
				formatex(opcion, charsmax(opcion),"\y%L:", id, "CHOOSE_DUEL")
				new iMenu = menu_create(opcion, "sub_duel_menu")
	
				formatex(opcion, charsmax(opcion),"\w%L", id, "DUEL_1")
				menu_additem(iMenu, opcion, "1")	
	
				formatex(opcion, charsmax(opcion),"\w%L", id, "DUEL_2")
				menu_additem(iMenu, opcion, "2")
			
				formatex(opcion, charsmax(opcion),"\w%L", id, "DUEL_3")
				menu_additem(iMenu, opcion, "3")	
	
				formatex(opcion, charsmax(opcion),"\w%L", id, "DUEL_4")
				menu_additem(iMenu, opcion, "4")
			

				menu_setprop(iMenu, MPROP_EXIT, MEXIT_ALL)
				menu_display(id, iMenu, 0)
						
			}
			else if	(tsnum == 1 && ctsnum < 1)
			{
				ChatColor(id, "%L", LANG_PLAYER,"NOT_CTS", tag) 
			}
			else if	(tsnum > 1)
			{
				ChatColor(id, "%L", LANG_PLAYER,"ONLY_LAST", tag)
			}
		}
		else
		{
			ChatColor(id, "%L", LANG_PLAYER,"ONLY_TTS", tag) 
		}
	}
	else
	{
		ChatColor(id, "%L", LANG_PLAYER,"KILL_CHALLENGED", tag) 
	}
	return PLUGIN_HANDLED
}

public sub_duel_menu(id, menu, item)
{
	
	if (item == MENU_EXIT)
	{
		menu_destroy(menu)
		return PLUGIN_HANDLED
	}
	
	new Data[6], Name[64]
	new Access, Callback
	
	menu_item_getinfo(menu, item, Access, Data,5, Name, 63, Callback)
	
	new Key = str_to_num(Data)
	
	switch (Key)
	{
		case 1:
		{	
			knife_duel[id] = true
			choose_enemy(id)
		}
		case 2: 
		{
			deagle_duel[id] = true
			choose_enemy(id)
		}
		case 3: 
		{
			grenade_duel[id] = true
			choose_enemy(id)
		}
		case 4: 
		{
			scout_duel[id] = true
			choose_enemy(id)
		}
	}
	
	menu_destroy(menu)	
	return PLUGIN_HANDLED
}

/*================================================================================
	Menu of challenges				
=================================================================================*/

public choose_enemy(id)
{
	static opcion[64]
	
	formatex(opcion, charsmax(opcion),"\y%L:", id, "CHOOSE_ENEMY")
	new iMenu = menu_create(opcion, "sub_choose_enemy")
	
	new players[32], pnum, tempid
	new szName[32], szTempid[10]
	
	get_players(players, pnum, "a")
	
	for( new i; i<pnum; i++ )
	{
		tempid = players[i]
		
		if (cs_get_user_team(tempid) != CS_TEAM_CT)
		{
			continue
		}
		
		get_user_name(tempid, szName, 31)
		num_to_str(tempid, szTempid, 9)
		menu_additem(iMenu, szName, szTempid, 0)
	}
	
	menu_display(id, iMenu)
	return PLUGIN_HANDLED
}

public sub_choose_enemy(id, menu, item)
{
	if( item == MENU_EXIT )
	{
		menu_destroy(menu)
		return PLUGIN_HANDLED
	}
	
	new Data[6], Name[64]
	new Access, Callback
	menu_item_getinfo(menu, item, Access, Data,5, Name, 63, Callback)
	
	new tempid = str_to_num(Data)
	
	new mapname[32], challenger[32], challenged[32], ct_origin[3], te_origin[3]

	get_mapname(mapname,31)
	get_user_name(id, challenger, 31)
	get_user_name(tempid, challenged, 31)
	
	// strip weapons
	strip_user_weapons(id)
	strip_user_weapons(tempid)
	
	// health
	set_user_health(id, 100)
	set_user_health(tempid, 100)
	
	// effects
	switch (get_pcvar_num(cvar_effect))
	{
		case 0: // glow
		{
			set_user_rendering(id, kRenderFxGlowShell, 250, 0, 0, kRenderNormal, 20)	
			set_user_rendering(tempid, kRenderFxGlowShell, 0, 0, 250, kRenderNormal, 20)
		}
		case 1: // beacon
		{
			set_task(1.0, "beacon", id)
			set_task(1.0, "beacon", tempid)
		}
		case 2: // glow n' beacon
		{
			set_user_rendering(id, kRenderFxGlowShell, 250, 0, 0, kRenderNormal, 20)	
			set_task(1.0, "beacon", id)
			set_user_rendering(tempid, kRenderFxGlowShell, 0, 0, 250, kRenderNormal, 20)
			set_task(1.0, "beacon", tempid)
		}
	}
	
	// player challenged
	player_challenged[tempid] = true
	
	// lr menu once until he kills the player challenged
	once[id] = true 
	
	// unable pick up weapon (only the 2 players on duel)
	touch_weapons[id] = true
	touch_weapons[tempid] = true
			
	if(knife_duel[id])
	{
		give_item(id, "weapon_knife")
		give_item(tempid, "weapon_knife")
				
		if(equali(mapname,"some1s_jailbreak"))
		{
			ct_origin[0] = -759, ct_origin[1] = 1047, ct_origin[2] = 100
			te_origin[0] = -585, te_origin[1] = 867, te_origin[2] = 100
			set_user_origin(id,te_origin)
			set_user_origin(tempid,ct_origin)
		}
		
		set_hudmessage( 0, 255, 0, -1.0, 0.40, 2, 5.0, 8.0, 0.0, 0.0, 10)
		show_hudmessage(0, "%L",LANG_PLAYER,"KNIFE_DUEL", challenger, challenged)
		
	}
	else if(deagle_duel[id])
	{
		deagle_duel[tempid] = true
		
		cs_set_weapon_ammo(give_item(id, "weapon_deagle"), 1)
		cs_set_weapon_ammo(give_item(tempid, "weapon_deagle"), 1)
		
		if(equali(mapname,"some1s_jailbreak"))
		{
			ct_origin[0] = -1352, ct_origin[1] = 271, ct_origin[2] = 38
			te_origin[0] = -1338, te_origin[1] = -782, te_origin[2] = 38
			set_user_origin(id,te_origin)
			set_user_origin(tempid,ct_origin)
		}
		
		set_hudmessage( 0, 255, 0, -1.0, 0.40, 2, 5.0, 8.0, 0.0, 0.0, 10)
		show_hudmessage(0, "%L", LANG_PLAYER,"DEAGLE_DUEL", challenger, challenged)
	}
	else if(grenade_duel[id])
	{
		give_item(id, "weapon_hegrenade")
		give_item(tempid, "weapon_hegrenade")
		cs_set_user_bpammo(id, CSW_HEGRENADE,get_pcvar_num(cvar_granadas_bpammo))		
		cs_set_user_bpammo(tempid, CSW_HEGRENADE,get_pcvar_num(cvar_granadas_bpammo))
		
		if(equali(mapname,"some1s_jailbreak"))
		{
			ct_origin[0] = -1756, ct_origin[1] = -2526, ct_origin[2] = 36
			te_origin[0] = -3020, te_origin[1] = -2529, te_origin[2] = 36
			set_user_origin(id,te_origin)
			set_user_origin(tempid,ct_origin)
		}
		
		set_hudmessage( 0, 255, 0, -1.0, 0.40, 2, 5.0, 8.0, 0.0, 0.0, 10)
		show_hudmessage(0, "%L", LANG_PLAYER,"GRENADE_DUEL", challenger, challenged)
	}
	else if(scout_duel[id])
	{
		give_item(id, "weapon_scout")
		give_item(tempid, "weapon_scout")
		cs_set_user_bpammo(id, CSW_SCOUT, get_pcvar_num(cvar_scout_bpammo))
		cs_set_user_bpammo(tempid, CSW_SCOUT, get_pcvar_num(cvar_scout_bpammo))
		
		if(equali(mapname,"some1s_jailbreak"))
		{
			ct_origin[0] = -2898, ct_origin[1] = -2040, ct_origin[2] = 37
			te_origin[0] = -2908, te_origin[1] = 905, te_origin[2] = 37
			set_user_origin(id,te_origin)
			set_user_origin(tempid,ct_origin)
		}
		
		set_hudmessage( 0, 255, 0, -1.0, 0.40, 2, 5.0, 8.0, 0.0, 0.0, 10)
		show_hudmessage(0, "%L", LANG_PLAYER,"SCOUT_DUEL", challenger, challenged)
	}
	
	duel_active = true
	
	menu_destroy(menu)
	return PLUGIN_HANDLED
}

public beacon(id)
{
	if(cs_get_user_team(id) == CS_TEAM_CT)
	{
		static origin[3]
		get_user_origin(id, origin)
		message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
		write_byte(TE_BEAMCYLINDER)	// TE id
		write_coord(origin[0])	 	// x
		write_coord(origin[1])		// y
		write_coord(origin[2]-20)	// z
		write_coord(origin[0])    	// x axis
		write_coord(origin[1])    	// y axis
		write_coord(origin[2]+200)	// z axis
		write_short(beacon_sprite)	// sprite
		write_byte(0)			// startframe   
		write_byte(1)			// framerate   
		write_byte(6)			// life
		write_byte(2)  			// width
		write_byte(1)   			// noise    
		write_byte(0)  			// red  
		write_byte(0)   			// green 
		write_byte(250) 		// blue
		write_byte(200)			// brightness
		write_byte(0)			// speed
		message_end()
	}
	else
	{
		static origin[3]
		get_user_origin(id, origin)
		message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
		write_byte(TE_BEAMCYLINDER)	// TE id
		write_coord(origin[0])	 	// x
		write_coord(origin[1])		// y
		write_coord(origin[2]-20)	// z
		write_coord(origin[0])    	// x axis
		write_coord(origin[1])    	// y axis
		write_coord(origin[2]+200)	// z axis
		write_short(beacon_sprite)	// sprite
		write_byte(0)			// startframe   
		write_byte(1)			// framerate   
		write_byte(6)			// life
		write_byte(2)  			// width
		write_byte(1)   			// noise    
		write_byte(250)			// red  
		write_byte(0)   			// green 
		write_byte(0) 			// blue
		write_byte(200)			// brightness
		write_byte(0)			// speed
		message_end()
	}
	set_task(1.0, "beacon", id)
		
}

/*================================================================================
	Stocks					
=================================================================================*/

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
	
	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, g_msgSayText, _, players[i])
			write_byte(players[i])
			write_string(msg)
			message_end()
		}
	}
}
