#include < amxmodx >
#include < amxmisc >
#include < fun >
#include < fakemeta >
#include < cstrike >
#include < hamsandwich >
#define VERSION 		"0.0.1"
 
#define Max_Players		32
 
#define OFFSET_PRIMARYWEAPON 	116
#define OFFSET_C4_SLOT 		372
 
#define Weapon_Menu_Name	"Fegyver Csomagok"
 
#define Next_Button		"KÃ¶vetkezÅ‘"
#define Back_Button		"Vissza"
#define Exit_Button		"KilÃ©pÃ©s"
 
#define Money_Hud		( 1 << 5 )
 
new g_iWPCT;
new g_iWPTE;
 
new pCvarMaxCTWps;
new pCvarMaxTEWps;
 
new pCvarWPBlock;
 
new pCvarFlash;
new pCvarHe;
new pCvarSmoke;
 
new pCvarKevlar;
new pCvarDefuser;
new pCvarMoney;
new pCvarBlockBuy;
new pCvarUnAmmo;
 
new const g_szMessages [ ] [ ] = 
{
	"",
	"CsapatonkÃ©nt csak kÃ©t ember AWP-zhet!",
	"^3%s^1 AWP^4 csak^1 3v3-tÃ³l hasznÃ¡lhatÃ³!",
	"A vÃ¡sÃ¡rlÃ¡s letÃ­ltva!",
	"Te mÃ¡r vÃ¡lasztottÃ¡l fegyvert!"
};
 
new const g_szWeaponMenuNames [ ] [ ] =  {
 
	"\y|\rM4A1\y|",
	"\y|\rAK47\y|",
	"\y|\rAWP\y| \y(\r3v3-tÃ³l\y)",
	"\y|\rM249\y|",
	"\y|\rAUG\y|",
	"\y|\rFAMAS\y|",
	"\y|\rGALIL\y|",
	"\y|\rMP5\y|",
	"\y|\rXM1014\y|",
	"\y|\rM3\y|",
	"\y|\rSCOUT\y|"
};
 
new const g_szWeaponsName [ ] [ ] = {
 
	"weapon_m4a1",
	"weapon_ak47",
	"weapon_awp",
	"weapon_m249",
	"weapon_aug",
	"weapon_famas",
	"weapon_galil",
	"weapon_mp5navy",
	"weapon_xm1014",
	"weapon_m3",
	"weapon_scout"
};

new const g_szPistolName [ ] = "weapon_deagle";
 
const DoNotReload = ( ( 1 << CSW_HEGRENADE ) | ( 1 << CSW_SMOKEGRENADE ) | ( 1 << CSW_FLASHBANG ) | ( 1 << CSW_KNIFE ) | ( 1 << CSW_C4 ) );
new const maxAmmo[ 31 ] = {
 
	0,
	52, 
	0, 
	90, 
	1, 
	32, 
	1, 
	100, 
	90, 
	1, 
	120, 
	100, 
	100, 
	90, 
	90, 
	90, 
	100, 
	120, 
	30, 
	120, 
	200, 
	32, 
	90, 
	120, 
	90, 
	2, 
	35, 
	90, 
	90, 
	0, 
	100 
};
 
new g_szBuyCommands[  ][  ] = 
{
	"usp", "glock", "deagle", "p228", "elites", "fn57", "m3", "xm1014", "mp5", "tmp", "p90", "mac10", "ump45", "ak47", 
	"galil", "famas", "sg552", "m4a1", "aug", "scout", "awp", "g3sg1", "sg550", "m249", "vest", "vesthelm", "flash", "hegren",
	"sgren", "defuser", "nvgs", "shield", "primammo", "secammo", "km45", "9x19mm", "nighthawk", "228compact", "12gauge",
	"autoshotgun", "smg", "mp", "c90", "cv47", "defender", "clarion", "krieg552", "bullpup", "magnum", "d3au1", "krieg550",
	"buyammo1", "buyammo2"
};
 
new const g_szMenuCommands[  ] [  ] = 
{
	"fegyo",
	"say fegyo",
	"say_team fegyo",
 
	"fegyver",
	"say fegyver",
	"say_team fegyver",
 
	"say /fegyo",
	"say_team /fegyo",
 
	"say /fegyver",
	"say_team /fegyver"
 
};
new g_msgHideWeapon;
new g_bHasWeapon[ Max_Players ];
new const SZEROPREF[] = "~|Ultimate|~"
public plugin_init ( ) {
 
	register_plugin( "Advanced Weapon Menu", VERSION, "#YouCantStopMe" );
	loading_maps();
	RegisterHam( Ham_Spawn, "player", "func_OpenWeaponMenu", 1 );
 
	pCvarMaxCTWps 	= register_cvar( "awm_max_ct_awp", 	"2" ); // Ct-n?l 2 AWP-s lehet.
	pCvarMaxTEWps	= register_cvar( "awm_max_te_awp", 	"2" ); // Terrorist?kn?l 2 AWP-s lehet.
 
	pCvarWPBlock	= register_cvar( "awm_allow_wp_player", 	"3" ); // Ha mindk?t csapatban van 4-4 j?t?kos akkor engedi az AWP-t
 
	pCvarFlash	= register_cvar( "awm_give_flash", 	"2" ); // Itt tudod be?ll?tani ,hogy adjon-e f?st gr?n?tot. ( 0 = Nem ad ) Alap: 2 Flash gr?n?t
	pCvarHe		= register_cvar( "awm_give_he", 		"1" ); // Itt tudod be?ll?tani ,hogy adjon-e f?st gr?n?tot. ( 0 = Nem ad ) Alap: 1 Roban? gr?n?t
	pCvarSmoke	= register_cvar( "awm_give_smoke", 	"1" ); // Itt tudod be?ll?tani ,hogy adjon-e f?st gr?n?tot. ( 0 = Nem ad )
 
	pCvarKevlar	= register_cvar( "awm_give_kevlar",	"2" ); // Itt tudod be?ll?tani ,hogy adjon-e kevl?rt. ( 0 = Nem Ad ) Alap: 2 ( Kevl?r + Sisak )
	pCvarDefuser 	= register_cvar( "awm_give_defuser",	"1" ); // Itt tudod be?ll?tani ,hogy adjon-e defusert. ( 0 = Nem Ad )
 
	pCvarUnAmmo	= register_cvar( "awm_unlimited_ammo",	"1" ); // Itt tudod be?ll?tani ,hogy elfoggyon-e a t?r vagy ne. Alap: 1 ( Teh?t nem fogy el a t?r )
 
	pCvarBlockBuy	= register_cvar( "awm_block_buy",	"1" ); // Itt tudod be?ll?tani ,hogy tiltsa-e a v?s?rl?st vagy ne. Alap 1 ( Teh?t tiltva van ) ( 0 = Nincs tiltva )
	pCvarMoney	= register_cvar( "awm_set_money",	"0" ); // Itt tudod be?ll?tani ,hogy mennyi p?nze legyen a j?t?kosoknak. ( 0 = Nincs , elt?nik a hudr?l is ) Alap: 0
 
	g_msgHideWeapon = get_user_msgid( "HideWeapon" );
 
	for( new i = 0; i < sizeof( g_szBuyCommands ); i++ )
		register_clcmd( g_szBuyCommands[ i ], "cmd_BlockBuy" );
 
	for( new i = 0; i < sizeof( g_szMenuCommands ); i++ )
		register_clcmd( g_szMenuCommands[ i ], "cmd_ShowWeaponMenu" );
 
	register_event( "ResetHUD", "onResetHUD", "b" );
	register_event( "CurWeapon", "eCurWeapon", "be", "1=1" );
 
	register_message( g_msgHideWeapon, "msgHideWeapon" );
 
	register_logevent( "eRoundEnd", 2, "1=Round_End" );
}
public loading_maps() 
{	
	new fajl[64],linedata[1024],currentmap[64],mapnev[32];
	get_mapname(currentmap,charsmax(currentmap));
	formatex(fajl, charsmax(fajl), "addons/amxmodx/configs/fegyvermenu_tiltas.ini");
	
	if (!file_exists("addons/amxmodx/configs/fegyvermenu_tiltas.ini")) {
		new len,buffer[512];
		len += formatex(buffer[len], charsmax(buffer),";Csak írd be azoknak a mapoknak a nevét amelyiken ne mûködjön a fegyvermenü. Pl:^n");
		len += formatex(buffer[len], charsmax(buffer)-len,";^"awp_india^"^n");
		
		new file = fopen("addons/amxmodx/configs/fegyvermenu_tiltas.ini", "at");
	    
		fprintf(file, buffer);
		fclose(file);
		return;
	}
	
	new file = fopen(fajl, "rt");
	
	while (file && !feof(file))
	{
		// Read one line at a time
		fgets(file, linedata, charsmax(linedata));
		replace(linedata, charsmax(linedata), "^n", "");//üres sorokat eltünteti
		
		parse(linedata,mapnev,31);
		if(equal(currentmap,mapnev))
		{
			new buffer[100];
			formatex(buffer,charsmax(buffer),"A plugin '%s' mapon nem fut. (configs/fegyvermenu_tiltas.ini)",currentmap);
			set_fail_state(buffer);
			return;
		}
	}
	if (file) fclose(file);
}
public client_connect( iClient ) {
 
	g_bHasWeapon[ iClient ] = false;
}
 
public client_disconnect( iClient ) {
 
	g_bHasWeapon[ iClient ] = false;
}
 
public cmd_ShowWeaponMenu( iClient ) {
 
	switch( g_bHasWeapon[ iClient ] ) {
 
		case true: 
		{
			ColorChat( iClient, "^3%s %s" , SZEROPREF, g_szMessages[ 4 ] );
 
			return PLUGIN_HANDLED;
		}
		case false: 	func_OpenWeaponMenu( iClient );
	}
	return PLUGIN_HANDLED;
}
 
public cmd_BlockBuy( iClient ) {
 
	if( !get_pcvar_num( pCvarBlockBuy ) )
		return PLUGIN_CONTINUE;
	ColorChat( iClient,  "^3%s %s" , SZEROPREF, g_szMessages[ 3 ] );
	return PLUGIN_HANDLED;
}
 
public eCurWeapon( iClient ) {
 
	if( get_pcvar_num( pCvarUnAmmo ) ) {
 
		if( is_user_alive( iClient ) ) {
 
			new weapon = read_data( 2 );
			if( !( DoNotReload & ( 1 << weapon ) ) ) {
 
				cs_set_user_bpammo( iClient, weapon, maxAmmo[ weapon ] );
			}
		}
	}
}
 
public onResetHUD( iClient ) {
 
	if( !get_pcvar_num( pCvarMoney ) ) {
 
		message_begin( MSG_ONE, g_msgHideWeapon, _, iClient );
		write_byte( Money_Hud );
		message_end( );
	}
}
 
public msgHideWeapon( ) {
 
	if( !get_pcvar_num( pCvarMoney ) ) {
 
		set_msg_arg_int( 1, ARG_BYTE, get_msg_arg_int( 1 ) | Money_Hud );
	}
}
 
public eRoundEnd ( ) {
 
	g_iWPCT = 0;
	g_iWPTE = 0;
}
 
public func_OpenWeaponMenu ( iClient ) {
 
	if( !is_user_alive( iClient ) )
		return;
 
	cs_set_user_money( iClient, get_pcvar_num( pCvarMoney ) );
 
	g_bHasWeapon[ iClient ] = false;
 
	new szMenuTitle[ 121 ];
	new szMenuItem[ 121 ];
 
	format( szMenuTitle, charsmax( szMenuTitle ), "\r%s^n\w%s", SZEROPREF, Weapon_Menu_Name );
 
	StripUserWeapons( iClient );
	new menu = menu_create( szMenuTitle, "func_OpenWeaponMenu_handler" );
 
	for( new i = 0; i < sizeof( g_szWeaponMenuNames ); i++ ) {
 
		if( i != 2 ) {
 
			format( szMenuItem, charsmax( szMenuItem ), "\w%s", g_szWeaponMenuNames[ i ] );
		}
		else {
			switch( get_user_team( iClient ) )
			{
				case 1: format( szMenuItem, charsmax( szMenuItem ), "\w%s \y[ElsÅ‘ %d embernek]", g_szWeaponMenuNames[ i ], get_pcvar_num( pCvarMaxTEWps ) );
				case 2: format( szMenuItem, charsmax( szMenuItem ), "\w%s \y[ElsÅ‘ %d embernek]", g_szWeaponMenuNames[ i ], get_pcvar_num( pCvarMaxCTWps ) );
				default: continue;
			}
		}
 
		menu_additem( menu, szMenuItem, _, 0 );
	}
 
	menu_setprop( menu, MPROP_EXIT, MEXIT_ALL );
	menu_setprop( menu, MPROP_BACKNAME, Back_Button );
	menu_setprop( menu, MPROP_NEXTNAME, Next_Button );
	menu_setprop( menu, MPROP_EXITNAME, Exit_Button );
	menu_display( iClient, menu );
}
 
public func_OpenWeaponMenu_handler( iClient, iMenu, iItem ) {
 
	if( iItem == MENU_EXIT ) {
 
		menu_destroy( iMenu );
		return PLUGIN_HANDLED;
	}
 
	new data[ 6 ], szName[ 64 ];
	new access, callback;
	menu_item_getinfo( iMenu, iItem, access, data, charsmax( data ), szName, charsmax( szName ), callback );
 
	if( iItem != 2 ) {
 
		give_item( iClient, g_szWeaponsName[ iItem ] );
		give_item( iClient, g_szPistolName );
 
		ColorChat( iClient,  "^3%s^1 Sikeres vÃ¡lasztÃ¡s!^4JÃ³ jÃ¡tÃ©kot!", SZEROPREF ,g_szWeaponMenuNames[ iItem ] );
	}
	else {
 
		new iTeams[ CsTeams ];
		GetPlayerCount( iTeams );
 
		if( iTeams[ CS_TEAM_T ] < get_pcvar_num( pCvarWPBlock ) 
		|| iTeams[ CS_TEAM_CT ] < get_pcvar_num( pCvarWPBlock ) ) {
 
			ColorChat( iClient,  g_szMessages[ 2 ], SZEROPREF );
			func_OpenWeaponMenu( iClient );
 
			return PLUGIN_HANDLED;
		}
 
		new CsTeams:userTeam = cs_get_user_team( iClient );
		if( userTeam == CS_TEAM_CT ) {
 
			if( g_iWPCT < get_pcvar_num( pCvarMaxCTWps ) ) {
 
				give_item( iClient, g_szWeaponsName[ iItem ] );
				give_item( iClient, g_szPistolName );
 
				ColorChat( iClient, "^3%s^1 Sikeres vÃ¡lasztÃ¡s!^4JÃ³ jÃ¡tÃ©kot!", SZEROPREF, g_szWeaponMenuNames[ iItem ] );
				g_iWPCT++;
			}
			else {
 
				client_print( iClient, print_center, g_szMessages[ 1 ] );
				func_OpenWeaponMenu ( iClient );
 
				return PLUGIN_HANDLED;
			}
		}
 
		if( userTeam == CS_TEAM_T ) {
 
			if( g_iWPTE < get_pcvar_num( pCvarMaxTEWps ) ) {
 
 
				give_item( iClient, g_szWeaponsName[ iItem ] );
				give_item( iClient, g_szPistolName );
 
				ColorChat( iClient,  "^3%s^1 Sikeres vÃ¡lasztÃ¡s!^4JÃ³ jÃ¡tÃ©kot!", SZEROPREF, g_szWeaponMenuNames[ iItem ] );
				g_iWPTE++;
			}
			else {
 
				client_print( iClient, print_center, g_szMessages[ 1 ] );
				func_OpenWeaponMenu( iClient );
 
				return PLUGIN_HANDLED;
			}
		}
	}
 
	give_item( iClient, "weapon_knife" );
	give_player_stuff( iClient );
 
	menu_destroy( iMenu );
	return PLUGIN_HANDLED;
}
 
GetPlayerCount( iTeamPlayers[ CsTeams ] ) {
 
	new iPlayers[ 32 ] , iPlayerCount;
 
	get_players( iPlayers , iPlayerCount ); 
 
	for ( new i = 0 ; i < iPlayerCount ; i++ )
		iTeamPlayers[ cs_get_user_team( iPlayers[ i ] ) ]++;
}  
 
stock give_player_stuff( iClient ) {
 
	if( get_pcvar_num( pCvarFlash ) ) {
 
		give_item( iClient, "weapon_flashbang" );
		cs_set_user_bpammo( iClient, CSW_FLASHBANG, get_pcvar_num( pCvarFlash ) );
	}
 
	if( get_pcvar_num( pCvarHe ) ) {
 
		give_item( iClient, "weapon_hegrenade" );
		cs_set_user_bpammo( iClient, CSW_HEGRENADE, get_pcvar_num( pCvarHe ) );
	}
 
	if( get_pcvar_num( pCvarSmoke ) ) {
 
		give_item( iClient, "weapon_smokegrenade" );
		cs_set_user_bpammo( iClient, CSW_SMOKEGRENADE, get_pcvar_num( pCvarSmoke ) );
	}
 
	if( get_pcvar_num( pCvarKevlar ) ) {
 
		switch( get_pcvar_num( pCvarKevlar ) ) {
 
			case 1: give_item( iClient, "item_kevlar" );
			case 2:	give_item( iClient, "item_assaultsuit" );
			default: return PLUGIN_CONTINUE;
		}
	}
 
	if( get_pcvar_num( pCvarDefuser ) ) {
 
		give_item( iClient, "item_thighpack" );
	}
 
	if( !get_pcvar_num( pCvarUnAmmo ) ) {
 
		new weapons[ 32 ];
		new weaponsnum;
		get_user_weapons( iClient, weapons, weaponsnum );
		for( new i = 0; i < weaponsnum; i++ )
			if( is_user_alive( iClient ) )
				if( maxAmmo[ weapons[ i ] ] > 0 )
					cs_set_user_bpammo( iClient, weapons[ i ], maxAmmo[ weapons[ i ] ] );
	}
 
	g_bHasWeapon[ iClient ] = true;
	return PLUGIN_CONTINUE;
}
 
 
//Stolen from CSDM Weapon Menu
stock StripUserWeapons( iClient ) {
 
	new iC4Ent = get_pdata_cbase( iClient, OFFSET_C4_SLOT );
 
	if( iC4Ent > 0 ) {
 
		set_pdata_cbase( iClient, OFFSET_C4_SLOT, FM_NULLENT );
	}
 
	strip_user_weapons( iClient );
	set_pdata_int( iClient, OFFSET_PRIMARYWEAPON, 0 );
 
	if( iC4Ent > 0 )  {
 
		set_pev( iClient, pev_weapons, pev( iClient, pev_weapons ) | ( 1 << CSW_C4 ) );
		set_pdata_cbase( iClient, OFFSET_C4_SLOT, iC4Ent );
 
		cs_set_user_bpammo( iClient, CSW_C4, 1 );
		cs_set_user_plant( iClient, 1 );
	}
 
	return PLUGIN_HANDLED;
}
 
stock ColorChat( iClient, const input[], any:...) 
{ 
	new count = 1, players[ 32 ];
	static msg[ 191 ];
	vformat( msg, 190, input, 3 );
 
	replace_all( msg, 190, "^x01" , "^1");
	replace_all( msg, 190, "^x03" , "^3");
	replace_all( msg, 190, "^x04" , "^4"); 
 
	if ( iClient ) 	players[ 0 ] = iClient; 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(  ); 
			} 
		} 
	} 
}  
/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1033\\ f0\\ fs16 \n\\ par }
*/
