#include <amxmodx>
#include <engine>
 
new const Version[] = "0.3";
 
enum BombSites
{
	BOMBSITE_A,
	BOMBSITE_B
}
 
new g_iBombSiteEntity[ BombSites ];
new bool:g_bBombSiteStatus[ BombSites ];
new g_iPlayerWithBomb;
new bool:g_bPlayerHoldingBomb;
 
new g_iHUDEntity;
 
new g_pCVarAllowPlantNum;
new g_pCVarLockSiteNum;
new g_pCVarLockSite;
 
public plugin_init( ) 
{
	register_plugin( "BombSite Lock" , Version , "bugsy" );
 
	register_concmd( "bl_setbombsite" , "SetBombSiteConsole" , ADMIN_KICK );
	register_concmd( "bl_bombsitemenu" , "ShowBombSiteMenu" , ADMIN_KICK );
 
	register_event( "CurWeapon" , "fw_EvCurWeapon" , "b" , "1=1" );
	register_event( "WeapPickup", "fw_EvWeapPickup" , "be" , "1=6" );
	register_event( "BombDrop" ,  "fw_EvBombDrop" , "bc" );
 
	register_logevent( "fw_EvRoundStart" , 2 , "1=Round_Start" );  
 
	g_pCVarAllowPlantNum = register_cvar( "bl_allowplantctnum" , "0" );
	g_pCVarLockSiteNum = register_cvar( "bl_locksitectnum" , "2" );
	g_pCVarLockSite = register_cvar( "bl_locksite" , "b" );
 
	g_iHUDEntity = create_entity( "info_target" );
	entity_set_string( g_iHUDEntity , EV_SZ_classname , "bl_hud_entity" );
	register_think( "bl_hud_entity" , "fw_HUDEntThink" );
 
	new szMap[ 11 ] , BombSites:bsBombSiteA , BombSites:bsBombSiteB;
	get_mapname( szMap , charsmax( szMap ) );
 
	if ( equal( szMap , "de_chateau" ) || equal( szMap , "de_dust2" ) || equal( szMap , "de_train" ) )
	{
		bsBombSiteA = BOMBSITE_B;
		bsBombSiteB = BOMBSITE_A;
	}
	else
	{
		bsBombSiteA = BOMBSITE_A;
		bsBombSiteB = BOMBSITE_B;	
	}
 
	g_iBombSiteEntity[ bsBombSiteA ] = find_ent_by_class( -1 , "func_bomb_target" );
	g_iBombSiteEntity[ bsBombSiteB ] = find_ent_by_class( g_iBombSiteEntity[ bsBombSiteA ] , "func_bomb_target" );
}
 
public client_disconnect( id )
{
	if ( g_iPlayerWithBomb == id )
	{
		g_iPlayerWithBomb = 0;
		g_bPlayerHoldingBomb = false;
	}
}
 
public fw_EvCurWeapon( id )
{
	if ( id == g_iPlayerWithBomb )
	{
		if ( read_data( 2 ) == CSW_C4 ) 
		{
			g_bPlayerHoldingBomb = true;
			entity_set_float( g_iHUDEntity , EV_FL_nextthink , ( get_gametime() + 1.0 ) );
		}
		else
		{
			g_bPlayerHoldingBomb = false;
		}
	}
}
 
public fw_EvWeapPickup( id )
{
	g_iPlayerWithBomb = id;
}
 
public fw_EvBombDrop()
{
	g_iPlayerWithBomb = 0;
	g_bPlayerHoldingBomb = false;
}
 
public fw_EvRoundStart()
{
	new iAllowPlantNum = get_pcvar_num( g_pCVarAllowPlantNum );
	new iLockSiteNum = get_pcvar_num( g_pCVarLockSiteNum );		
	new iPlayers[ 32 ] , iNum , iCTCount;
 
	get_players( iPlayers , iNum , "h" );
 
	for ( new i = 0 ; i < iNum ; i++ )
		if ( get_user_team( iPlayers[ i ] ) == 2 )
			iCTCount++;
 
	if ( iCTCount < iAllowPlantNum )
	{
		SetBombSiteLock( BOMBSITE_A , true );
		SetBombSiteLock( BOMBSITE_B , true );
 
		client_print( 0 , print_chat , "* Bombalerako A & B mindketto le lesz zarva, amig kevesebb mint %d CT van!" , iAllowPlantNum );
	}
	else if ( iCTCount < iLockSiteNum ) 
	{
		new szSite[ 2 ];
		get_pcvar_string( g_pCVarLockSite , szSite , charsmax( szSite ) );
		szSite[ 0 ] = toupper( szSite[ 0 ] );
 
		if ( !( 'A' <= szSite[ 0 ] <= 'B' ) )
			return PLUGIN_CONTINUE;
 
		SetBombSiteLock( ( szSite[ 0 ] == 'A' ) ? BOMBSITE_A : BOMBSITE_B , true );		
		SetBombSiteLock( ( szSite[ 0 ] == 'A' ) ? BOMBSITE_B : BOMBSITE_A , false );			
 
		client_print( 0 , print_chat , "* Bombalerako %s le lesz zarva amig kevesebb mint %d CT van!" , szSite , iLockSiteNum );	
	}
	else
	{
		SetBombSiteLock( BOMBSITE_A , false );
		SetBombSiteLock( BOMBSITE_B , false );
	}
 
	return PLUGIN_CONTINUE;
}
 
public SetBombSiteConsole( id , AdminLevel )
{
	if ( !( get_user_flags( id ) & AdminLevel ) )
	{
		console_print( id , "* Neked nincs elerhetoseged ehhez a parancshoz!." );
		return PLUGIN_HANDLED;
	}
 
	if ( !g_iBombSiteEntity[ BOMBSITE_A ] || !g_iBombSiteEntity[ BOMBSITE_B ] )
	{
		console_print( id , "* Bombalerako zarolas: Bocsi, ez a palya nem tamogatott." );
		return PLUGIN_HANDLED;
	}
 
	new szSite[ 3 ] , szState[ 3 ] , iState , BombSites:bsSite;
	read_argv( 1 , szSite , charsmax( szSite ) );
	read_argv( 2 , szState , charsmax( szState ) );
 
	iState = str_to_num( szState );
 
	if ( ( strlen( szSite ) > 1 ) || !is_str_num( szState ) || !( 0 <= iState <= 1 ) )
		szSite[ 0 ] = 'X';
	else
		szSite[ 0 ] = toupper( szSite[ 0 ] );
 
	switch ( szSite[ 0 ] )
	{
		case 'A':
		{
			bsSite = BOMBSITE_A;
		}
		case 'B':
		{
			bsSite = BOMBSITE_B;
		}
		default:
		{
			console_print( id , "* Bombalerako zarolas: Ervenytelen parancs, hasznalat: 'fb_setbombsite a\b 0\1'" );
			return PLUGIN_HANDLED;
		}
	}
 
	SetBombSiteLock( bsSite , bool:iState );
 
	console_print( id , "* Bombalerako %s le lett %s zarva" , szSite , iState ? "L" : "Unl" );
 
	set_hudmessage( 255 , 255 , 255 , -1.0 , 0.65 , 0 , 3.0 , 3.0 , .channel = -1 );
	show_hudmessage( 0 , "Bombalerako %s le lett %s zarva" , szSite , iState ? "L" : "Unl" );
 
	return PLUGIN_HANDLED;
}
 
public ShowBombSiteMenu( id , AdminLevel )
{
	if ( !( get_user_flags( id ) & AdminLevel ) )
	{
		console_print( id , "* Nincs elerhetoseged ehhez a parancshoz." );
		return PLUGIN_HANDLED;
	}
 
	if ( !g_iBombSiteEntity[ BOMBSITE_A ] || !g_iBombSiteEntity[ BOMBSITE_B ] )
	{
		console_print( id , "* Bombalerako zarolas: Bocsi, ez a palya nem tamogatott." );
		return PLUGIN_HANDLED;
	}
 
	new iMenu = menu_create( "BombSite Lock Menu" , "MenuHandler" );
	new iCallBack = menu_makecallback( "MenuCallBack" );
 
	menu_additem( iMenu , "Leezaras A" , .callback = iCallBack );
	menu_additem( iMenu , "Lezaras B" , .callback = iCallBack );
	menu_additem( iMenu , "Feloldas A" , .callback = iCallBack );
	menu_additem( iMenu , "Feloldas B" , .callback = iCallBack );
	menu_additem( iMenu , "Lezaras A & B" , .callback = iCallBack );
	menu_additem( iMenu , "Feloldas A & B" , .callback = iCallBack );
 
	menu_display( id , iMenu );
 
	return PLUGIN_HANDLED;
}
 
public MenuCallBack( id , iMenu, iItem )
{	
	new iRetVal;
 
	switch ( iItem )
	{
		case 0: iRetVal = g_bBombSiteStatus[ BOMBSITE_A ] ? ITEM_DISABLED : ITEM_ENABLED; 
		case 1: iRetVal = g_bBombSiteStatus[ BOMBSITE_B ] ? ITEM_DISABLED : ITEM_ENABLED;
		case 2: iRetVal = g_bBombSiteStatus[ BOMBSITE_A ] ? ITEM_ENABLED : ITEM_DISABLED;
		case 3: iRetVal = g_bBombSiteStatus[ BOMBSITE_B ] ? ITEM_ENABLED : ITEM_DISABLED;
		case 4: iRetVal = g_bBombSiteStatus[ BOMBSITE_A ] && g_bBombSiteStatus[ BOMBSITE_B ] ? ITEM_DISABLED : ITEM_ENABLED;
		case 5: iRetVal = g_bBombSiteStatus[ BOMBSITE_A ] || g_bBombSiteStatus[ BOMBSITE_B ] ? ITEM_ENABLED : ITEM_DISABLED;
	}	
 
	return iRetVal;
}
 
public MenuHandler( id , iMenu , iItem )
{
	if( iItem == MENU_EXIT ) 
	{
		menu_destroy( iMenu );
		return PLUGIN_HANDLED;
	}
 
	set_hudmessage( 255 , 255 , 255 , -1.0 , 0.65 , 0 , 3.0 , 3.0 , .channel = -1 );
 
	switch ( iItem )
	{
		case 0:
		{
			SetBombSiteLock( BOMBSITE_A , true );
			show_hudmessage( 0 , "Bombalerako A le lett zarva" );
		}
		case 1: 
		{
			SetBombSiteLock( BOMBSITE_B , true );
			show_hudmessage( 0 , "Bombalerako B le lett zarva" );
		}
		case 2:
		{
			SetBombSiteLock( BOMBSITE_A , false );
			show_hudmessage( 0 , "Bombalerako A fel lett nyitva" );
		}
		case 3:
		{
			SetBombSiteLock( BOMBSITE_B , false );
			show_hudmessage( 0 , "Bombalerako B fel lett nyitva" );
		}
		case 4: 
		{
			SetBombSiteLock( BOMBSITE_A , true );
			SetBombSiteLock( BOMBSITE_B , true );
			show_hudmessage( 0 , "Bombalerako A & B mindketto le lett zarva" );
		}
		case 5: 
		{ 
			SetBombSiteLock( BOMBSITE_A , false );
			SetBombSiteLock( BOMBSITE_B , false );
			show_hudmessage( 0 , "Bombalerako A & B mindketto fel lett nyitva" );
		}
	}
 
	menu_destroy( iMenu );
 
	return PLUGIN_HANDLED;
}
 
public fw_HUDEntThink( iEntity )
{
	if( g_bPlayerHoldingBomb && ( g_bBombSiteStatus[ BOMBSITE_A ] || g_bBombSiteStatus[ BOMBSITE_B ] ) && ( iEntity == g_iHUDEntity ) && is_user_alive( g_iPlayerWithBomb ) ) 
	{
		set_hudmessage( 255 , 255 , 255 , -1.0 , 0.87 , 0 , 1.0 , 1.0 , .channel = -1 );
		show_hudmessage( g_iPlayerWithBomb , "Bombalerako%s %s%s%s %s Jelenleg Lezarva!" ,	g_bBombSiteStatus[ BOMBSITE_A ] && g_bBombSiteStatus[ BOMBSITE_B ] ? "s" : ""  , 
												g_bBombSiteStatus[ BOMBSITE_A ] ? "A" : "" , 
												g_bBombSiteStatus[ BOMBSITE_A ] && g_bBombSiteStatus[ BOMBSITE_B ] ? " & " : "" , 
												g_bBombSiteStatus[ BOMBSITE_B ] ? "B" : "" ,
												g_bBombSiteStatus[ BOMBSITE_A ] && g_bBombSiteStatus[ BOMBSITE_B ] ? "are" : "is" );
 
		entity_set_float( g_iHUDEntity , EV_FL_nextthink , ( get_gametime() + 1.0 ) );
	}
}
 
SetBombSiteLock( BombSites:bsBombSite , bool:bLockState )	
{
	entity_set_int( g_iBombSiteEntity[ bsBombSite ] , EV_INT_solid , bLockState ? SOLID_NOT : SOLID_TRIGGER );
	g_bBombSiteStatus[ bsBombSite ] = bLockState;
 
	if ( bLockState )
		entity_set_float( g_iHUDEntity , EV_FL_nextthink , ( get_gametime() + 1.0 ) );
}
/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1033\\ f0\\ fs16 \n\\ par }
*/