#include <amxmodx>
#include <fakemeta>
#include <hamsandwich>
 
new const KNIFE_VERSION[] = "2.2"
new const KNIFE_FILE[] = "addons/amxmodx/configs/knifes.ini"
 
#define	KNIFE_NAME 	0
#define	KNIFE_P_MODEL 	1
#define	KNIFE_V_MODEL 	2
#define KNIFE_ACCESS	12
 
new const g_TypeList[][] = { "NAME", "P_MODEL", "V_MODEL", "DEPLOY", "HIT1", "HIT2", "HIT3", "HIT4",\
	"HITWALL", "SLASH1", "SLASH2", "STAB", "ACCESS" }
 
new const g_Default_Knife[][] = { "Default", "models/p_knife.mdl", "models/v_knife.mdl", "weapons/knife_deploy1.wav",\
	"weapons/knife_hit1.wav", "weapons/knife_hit2.wav", "weapons/knife_hit3.wav", "weapons/knife_hit4.wav",\
	"weapons/knife_hitwall1.wav", "weapons/knife_slash1.wav", "weapons/knife_slash2.wav",\
	"weapons/knife_stab.wav", "" }
 
new Array:gx_InfoData[13]
new Array:gx_InfoCommands
new g_PlrModelNum[33]
 
new bool:g_bIsAlive[33]
 
#define	m_pPlayer	41
#define IsValidPlr(%1) ( 1 <= %1 <= g_iMaxPlayers )
 
new g_cvar_menu_drop, g_cvar_enable, g_cvar_menuname[64], g_cvar_no4you[32], g_cvar_current[32]
new g_iMaxPlayers
 
public plugin_precache() 
{
	register_plugin("Knife Selector", KNIFE_VERSION, "ReymonARG")
	register_cvar("knife_selector", KNIFE_VERSION, FCVAR_SPONLY | FCVAR_SERVER)
	g_iMaxPlayers = get_maxplayers()
 
	static i
	for( i = 0; i < 13; i++)
	{
		gx_InfoData[i] = ArrayCreate(128, 1)
	}
	gx_InfoCommands = ArrayCreate(32, 1)
 
	load_knifes_list()
 
	register_clcmd("say", "Hook_Say")
	register_clcmd("say_team", "Hook_Say")
 
	RegisterHam(Ham_Item_Deploy, "weapon_knife", "weapon_change", 1)
	RegisterHam(Ham_CS_Item_CanDrop, "weapon_knife", "weapon_drop", 1)
	RegisterHam(Ham_Spawn, "player", "fw_Spawn_post", 1)
	RegisterHam(Ham_Killed, "player", "fw_Killed_post", 1)
	register_forward(FM_EmitSound, "fw_EmitSound")
	register_forward(FM_ClientPutInServer, "fw_ClientPutInServer")
	register_forward(FM_ClientDisconnect, "fw_Killed_post")
}
 
/*==================================================================================================
 [Stock`s & Some Func`s <!-- s:D --><img src=\"{SMILIES_PATH}/icon_e_biggrin.gif\" alt=\":D\" title=\"nagyon boldog\" /><!-- s:D -->]
==================================================================================================*/
stock load_knifes_list()
{
	static StrData[150], StrLeft[32], StrRight[128], i, InfoNum, len, len2
	static f, bool:IsInSettings; IsInSettings = true
 
	if( !(f = fopen(KNIFE_FILE, "rt") ) )
		return set_fail_state("Plugin can´t Found Knife File")
 
	for( i = 0; i < 13; i++)
		ArrayPushString(gx_InfoData[i], g_Default_Knife[i])
 
	while( !feof(f) )
	{
		fgets(f, StrData, 149)
		if( StrData[0] == '/' && StrData[1] == '/' || StrData[0] == ';' || StrData[0] == ' ' || StrData[0] == '^n') continue
		replace(StrData, 149, "^n", "")
 
		if( StrData[0] != '[' && IsInSettings )
		{
			strtok(StrData, StrLeft, 31, StrRight, 127, '=')
			trim(StrLeft); trim(StrRight)
 
			if( equali(StrLeft, "ENABLE") )
			{
				g_cvar_enable = str_to_num(StrRight)
			}
			else if( equali(StrLeft, "MENU_IN_DROP") )
			{
				g_cvar_menu_drop = str_to_num(StrRight)
			}
			else if( equali(StrLeft, "MENU_NAME") )
			{
				copy(g_cvar_menuname, 63, StrRight)
				remove_quotes(g_cvar_no4you)
				replace_menu_colors(g_cvar_menuname, 63)
			}
			else if( equali(StrLeft, "NO_FOR_YOU") )
			{
				copy(g_cvar_no4you, 31, StrRight)
				remove_quotes(g_cvar_no4you)
				replace_menu_colors(g_cvar_no4you, 31)
			}
			else if( equali(StrLeft, "CURRENT") )
			{
				copy(g_cvar_current, 31, StrRight)
				remove_quotes(g_cvar_current)
				replace_menu_colors(g_cvar_current, 31)
			}
			else if( equali(StrLeft, "COMMANDS") )
			{
				while( StrRight[0] != 0 && strtok(StrRight, StrLeft, 31, StrRight, 127, ',') )
				{
					trim(StrLeft); trim(StrRight); remove_quotes(StrLeft)
					ArrayPushString(gx_InfoCommands, StrLeft)
				}
			}
 
			continue
		}
		else if( StrData[0] == '[' && StrData[1] == '/' && IsInSettings )
		{
			IsInSettings = false
		}
		else if( !IsInSettings )
		{
			if( StrData[0] == '[' )
			{
				len = ArraySize(gx_InfoData[KNIFE_NAME])
				for( i = 1; i < 13; i++)
				{
					len2 = ArraySize(gx_InfoData[i] )
					while( len > len2 )
					{
						ArrayPushCell(gx_InfoData[i], 0)
						len2++
					}
					while( len < len2 )
					{
						ArrayDeleteItem(gx_InfoData[i], --len2)
					}
				}
 
				replace(StrData, 149, "]", "")
				ArrayPushString(gx_InfoData[0], StrData[1])
 
				continue
			}
			else
			{
				strtok(StrData, StrLeft, 31, StrRight, 127, '=')
				trim(StrLeft); trim(StrRight); remove_quotes(StrRight)
 
				InfoNum = search_array_num(StrLeft)
				if( InfoNum != -1 )
				{
					ArrayPushString(gx_InfoData[InfoNum], StrRight)
				}
 
				continue
			}
		}
	}
 
	len = ArraySize(gx_InfoData[KNIFE_NAME])
	for( i = 1; i < 13; i++)
	{
		len2 = ArraySize(gx_InfoData[i] )
		while( len > len2 )
		{
			ArrayPushCell(gx_InfoData[i], 0)
			len2++
		}
		while( len < len2 )
		{
			ArrayDeleteItem(gx_InfoData[i], --len2)
		}
	}
 
	precache_knifes()
	return len
}
 
stock search_array_num( const StrData[] )
{
	static i
	for( i = 1; i < sizeof(g_TypeList); i++)
	{
		if( equali(g_TypeList[i], StrData) )
			return i
	}
 
	return -1
}
 
stock precache_knifes()
{
	static i, j, R, StrData[128], len; len = ArraySize(gx_InfoData[KNIFE_NAME])
 
	for( i = 0; i < len; i++)
	{
		for( j = 1; j < 12; j++)
		{
			ArrayGetString(gx_InfoData[j], i, StrData, 127)
			if( StrData[0] )
			{
				R = knifes_file_exists(j, StrData)
				if( R != -1 )
				{
					engfunc(R, StrData)
				}
				else
				{
					ArraySetCell(gx_InfoData[j], i, 0)
				}
			}
		}
 
		ArrayGetString(gx_InfoData[KNIFE_ACCESS], i, StrData, 127)
		ArraySetCell(gx_InfoData[KNIFE_ACCESS], i, read_flags(StrData))
	}
 
	return 1
}
 
stock knifes_file_exists(const num, const DIR[])
{
	static R, Buffer[135]
	if( num != KNIFE_V_MODEL && num != KNIFE_P_MODEL )
	{
		formatex(Buffer, 134, "sound/")
		R = EngFunc_PrecacheSound
	}
	else
	{
		Buffer[0] = '^0' // Reset Because is a static
		R = EngFunc_PrecacheModel
	}
	add(Buffer, 134, DIR)
 
	if( file_exists(Buffer) )
		return R
 
	return -1
}
 
stock knifes_set_models(id)
{
	static StrData[128]
 
	ArrayGetString(gx_InfoData[KNIFE_P_MODEL], g_PlrModelNum[id], StrData, 127)
	set_pev(id, pev_weaponmodel2, StrData[0] ? StrData : g_Default_Knife[KNIFE_P_MODEL])
 
	ArrayGetString(gx_InfoData[KNIFE_V_MODEL], g_PlrModelNum[id], StrData, 127)
	set_pev(id, pev_viewmodel2, StrData[0] ? StrData : g_Default_Knife[KNIFE_V_MODEL])
 
	return 1
}
 
stock replace_menu_colors(string[], len)
{
	replace_all(string, len, "!r", "\r")
	replace_all(string, len, "!y", "\y")
	replace_all(string, len, "!w", "\w")
	replace_all(string, len, "!d", "\d")
 
	return 1
}
 
/*==================================================================================================
 [ForWard`s CallBack`s <!-- s:D --><img src=\"{SMILIES_PATH}/icon_e_biggrin.gif\" alt=\":D\" title=\"nagyon boldog\" /><!-- s:D -->]
==================================================================================================*/
public weapon_change( iEnt )
{
	if( !pev_valid(iEnt) )
		return HAM_IGNORED
 
	static id; id = get_pdata_cbase(iEnt, m_pPlayer, 4)
	knifes_set_models(id)
 
	return HAM_IGNORED
}
 
public weapon_drop( iEnt )
{
	if( !pev_valid(iEnt) || !g_cvar_menu_drop || !g_cvar_enable )
		return HAM_IGNORED
 
	static id; id = get_pdata_cbase(iEnt, m_pPlayer, 4)
 
	main_menu(id)
 
	return HAM_IGNORED
}
 
public fw_Spawn_post( id )
{
	g_bIsAlive[id] = true
}
 
public fw_Killed_post( id )
{
	g_bIsAlive[id] = false
}
 
public fw_ClientPutInServer( id )
{
	g_PlrModelNum[id] = 0
}
 
public fw_EmitSound(iEnt, iChannel, const Sound[] )
{
	if( !IsValidPlr(iEnt) || !g_bIsAlive[iEnt] || ( iChannel != 1 && iChannel != 3 ) )
		return FMRES_IGNORED
 
	static i, StrData[128]
	for( i = 3; i < 13; i++ )
	{
		if( equali(g_Default_Knife[i], Sound) )
		{
			ArrayGetString(gx_InfoData[i], g_PlrModelNum[iEnt], StrData, 127)
			if( StrData[0] )
			{
				engfunc(EngFunc_EmitSound, iEnt, CHAN_WEAPON, StrData, 1.0, ATTN_NORM, 0, PITCH_NORM)
				return FMRES_SUPERCEDE
			}
			else
			{
				return FMRES_IGNORED
			}
		}
	}
 
	return FMRES_IGNORED
}
 
public Hook_Say( id )
{
	static i, StrData[32], StrSay[32], len
	read_args(StrSay, 31); len = ArraySize(gx_InfoCommands)
	remove_quotes(StrSay)
 
	for( i = 0; i < len; i++)
	{
		ArrayGetString(gx_InfoCommands, i, StrData, 31)
 
		if( equali(StrData, StrSay) )
		{
			main_menu(id)
			return PLUGIN_HANDLED
		}
	}
 
	return PLUGIN_CONTINUE
}	
 
/*==================================================================================================
 [Menu Settings Part <!-- s:D --><img src=\"{SMILIES_PATH}/icon_e_biggrin.gif\" alt=\":D\" title=\"nagyon boldog\" /><!-- s:D -->]
==================================================================================================*/
stock main_menu(id, page=0)
{
	if( !g_cvar_enable )
		return PLUGIN_HANDLED
 
	static menu; menu = menu_create(g_cvar_menuname, "main_menu_func")
 
	static i, StrData[64], len, PlrFlags, Flags
	len = ArraySize(gx_InfoData[KNIFE_NAME]); PlrFlags = get_user_frags(id)
	for( i = 0; i < len; i++)
	{
		ArrayGetString(gx_InfoData[KNIFE_NAME], i, StrData, 63)
		Flags = ArrayGetCell(gx_InfoData[KNIFE_ACCESS], i)
		if( !(PlrFlags & Flags) && Flags )
		{
			format(StrData, 63, "\d%s \R%s", StrData, g_cvar_no4you)
		}
		else if( i == g_PlrModelNum[id] )
		{
			format(StrData, 63, "\d%s \R%s", StrData, g_cvar_current)
		}
 
		menu_additem(menu, StrData)
	}
 
	menu_display(id, menu, page)
 
	return PLUGIN_HANDLED
}
 
/*==================================================================================================
 [Menu Exec Settings Part <!-- s:D --><img src=\"{SMILIES_PATH}/icon_e_biggrin.gif\" alt=\":D\" title=\"nagyon boldog\" /><!-- s:D -->]
==================================================================================================*/
public main_menu_func(id, menu, item)
{
	if( item == MENU_EXIT )
	{
		return PLUGIN_HANDLED
	}
 
	static Flags
	Flags = ArrayGetCell(gx_InfoData[KNIFE_ACCESS], item)
 
	if( (get_user_frags(id) & Flags || !Flags) && item != g_PlrModelNum[id] )
	{
		g_PlrModelNum[id] = item
	}
	else
	{
		main_menu(id, item/7)
	}
 
	if( get_user_weapon(id) == CSW_KNIFE )
	{
		knifes_set_models(id)
	}
 
	return PLUGIN_HANDLED
}