/***************************************************************************\
  ====================================================
  * || [Team_Umbrella] Mode Sinapsis by TR@VIESO || *
  ====================================================

	-------------------
	 *||DESCRIPCION||*
	-------------------

	Sinapsis Mode: Half of the players are
         turned into Assassins and the other half into Snipers.
	
\***************************************************************************/
#include < amxmodx >
#include < amxconst >
#include < fun >
#include < zombie_plague_advance >
#include < fakemeta_util >
#include < hamsandwich >

/************************************************************\
|                  Customizations Section                    |
|         You can edit here according to your liking         |
\************************************************************/

// This is the chance value according to which this game mode will be called
// The higher the value the lesser the chance of calling this game mode

// Zombie plague no soporta que estas variablee sean cvars
// Tienen que estar definidas aqui en el codigo fuente!
new g_chance = 90 //Chance (1 in X)
new g_dmmode = 0 //Allow respawning on sinapsis rounds

// This is the access flag required to start the game mode
// through the admin menu. Look in users.ini for more details
new const g_access_flag[] = "a"

// This is the sound which is played when the game mode is triggered
// Add as many as you want [Randomly chosen if more than one]
new const g_play_sounds[][] =
{
	"zombie_plague/sirena_alarma.wav"
}

// Comment the following line to disable ambience sounds
// Just add two slashes ( // )
#define AMBIENCE_SOUNDS

#if defined AMBIENCE_SOUNDS
// Ambience Sounds (only .wav and .mp3 formats supported)
// Add as many as you want [Randomly chosen if more than one]
new const g_sound_ambience[][] =
{ 
	"zombie_plague/ambience_sinapsis_tr.mp3"
}

// Duration in seconds of each sound
new const Float:g_sound_ambience_duration[] = { 88.0 }
#endif

/************************************************************\
|                  Customizations Ends Here..!!              |
|         You can edit the cvars in the plugin init          |
\************************************************************/

// Variables
new g_gameid, g_maxplayers, cvar_assaaura, cvar_assaaurared, cvar_assaauragreen, cvar_assaaurablue, cvar_assaauraradio, cvar_minplayers, cvar_assaglow, cvar_ratio, cvar_sniperhp, cvar_assahp, g_msg_sync

// Ambience sounds task
#define TASK_AMB 3256

enum (+= 100)
{
	TASK_AURA
}

#define ID_AURA (taskid - TASK_AURA)

public plugin_init( )
{
	// Plugin registeration.
	register_plugin( "[ZP] Mode: Synapse","1.0", "TR@VIESO" )
	RegisterHam(Ham_Killed, "player", "fw_PlayerKilled")

	// Register some cvars
	// Edit these according to your liking
	cvar_minplayers = register_cvar("zp_avsm_minplayers", "2")
	cvar_assaglow = register_cvar("zp_avsm_assaglow", "1")
    	cvar_assaaura = register_cvar("zp_avsm_assaaura", "1")
        cvar_assaaurared = register_cvar("zp_avsm_assaaura_red", "255")
        cvar_assaauragreen = register_cvar("zp_avsm_assaaura_green", "150")
        cvar_assaaurablue = register_cvar("zp_avsm_assaaura_blue", "0")
        cvar_assaauraradio = register_cvar("zp_avsm_assaaura_radio", "20")
	cvar_sniperhp =	  register_cvar("zp_avsm_sniper_hp", "0.6")
	cvar_assahp =	  register_cvar("zp_avsm_assassin_hp", "1.0")
	cvar_ratio = 	  register_cvar("zp_avsm_inf_ratio", "0.5")

	// Get maxplayers
	g_maxplayers = get_maxplayers( )
	
	// Hud stuff
	g_msg_sync = CreateHudSyncObj()
}

// Game modes MUST be registered in plugin precache ONLY
public plugin_precache( )
{
	// Read the access flag
	new access_flag = read_flags( g_access_flag )
	new i
	
	// Precache the play sounds
	for (i = 0; i < sizeof g_play_sounds; i++)
		precache_sound( g_play_sounds[i] )
	
	// Precache the ambience sounds
	#if defined AMBIENCE_SOUNDS
	new sound[100]
	for (i = 0; i < sizeof g_sound_ambience; i++)
	{
		if (equal(g_sound_ambience[i][strlen(g_sound_ambience[i])-4], ".mp3"))
		{
			formatex(sound, sizeof sound - 1, "sound/%s", g_sound_ambience[i])
			precache_generic( sound )
		}
		else
		{
			precache_sound( g_sound_ambience[i] )
		}
	}
	#endif
	// Register our game mode
	g_gameid = zp_register_game_mode( "Modo Sinapsis", access_flag, g_chance, 0, g_dmmode)
}

// Ham Player Killed Forward
public fw_PlayerKilled(id)
{
	remove_task(id+TASK_AURA)
}

// Player spawn post
public zp_player_spawn_post( id )
{
        remove_task(id+TASK_AURA)

	// Check for current mode
	if( zp_get_current_mode() == g_gameid && fn_get_alive_players() >= get_pcvar_num(cvar_minplayers) )
	{
		// Check if the player is a zombie
		if( zp_get_user_zombie( id )){
			
			// Make him an assassin instead
			zp_make_user_assassin( id )
			
			// Set his health
			set_user_health( id, floatround(get_user_health(id) * get_pcvar_float(cvar_assahp)) )
                        if  (get_pcvar_num(cvar_assaglow))
			fm_set_rendering(id, kRenderFxGlowShell, 250, 250, 0, kRenderNormal, 25)
                        if (get_pcvar_num(cvar_assaaura))
                        set_task(0.1, "assasin_aura", id+TASK_AURA, _, _, "b")
                        //if (get_user_health(id) <= 0)
		}else{
			// Make him a sniper
			zp_make_user_sniper( id )
			
			// Set his health
			set_user_health( id, floatround(get_user_health(id) * get_pcvar_float(cvar_sniperhp)) )
		}
	}
}

public zp_round_started_pre( game )
{
	// Check if it is our game mode
	if( game == g_gameid )
	{
		// Check for min players
		if( fn_get_alive_players() < get_pcvar_num(cvar_minplayers) )
		{
			/**
			 * Note:
			 * This very necessary, you should return ZP_PLUGIN_HANDLED if
			 * some conditions required by your game mode are not met
			 * This will inform the main plugin that you have rejected
			 * the offer and so the main plugin will allow other game modes
			 * to be given a chance
			 */
			return ZP_PLUGIN_HANDLED
		}
		// Start our new mode
		start_avs_mode( )
	}
	// Make the compiler happy =)
	return PLUGIN_CONTINUE
}

public zp_round_started( game, id )
{
	// Check if it is our game mode
	if( game == g_gameid )
	{
		// Show HUD notice
		set_hudmessage(221, 156, 21, -1.0, 0.17, 1, 0.0, 10.0, 1.0, 1.0, -1)
		ShowSyncHudMsg(0, g_msg_sync, "Modo Sinapsis !!!")
		
		// Play the starting sound
		client_cmd(0, "spk ^"%s^"", g_play_sounds[ random_num(0, sizeof g_play_sounds -1) ] )
		
		// Remove ambience task affects
		remove_task( TASK_AMB )
		
		// Set task to start ambience sounds
		#if defined AMBIENCE_SOUNDS
		set_task( 2.0, "start_ambience_sounds", TASK_AMB )
		#endif
	}
}

public zp_game_mode_selected( gameid, id )
{
	// Check if our game mode was called
	if( gameid == g_gameid )
		start_avs_mode()
	
	// Make the compiler happy again =)
	return PLUGIN_CONTINUE
}

// This function contains the whole code behind this game mode
start_avs_mode( )
{
	// Create and initialize some important vars
	static i_assassins, i_max_assassins, id, i_alive
	i_alive = fn_get_alive_players()
	id = 0
	
	// Get the no of players we have to turn into assassins
	i_max_assassins = floatround( ( i_alive * get_pcvar_float( cvar_ratio ) ), floatround_ceil )
	i_assassins = 0
	
	// Randomly turn players into Assassins
	while (i_assassins < i_max_assassins)
	{
		// Keep looping through all players
		if ( (++id) > g_maxplayers) id = 1
		
		// Dead
		if ( !is_user_alive(id) )
			continue;
		
		// Random chance
		//if (random_num(1, 5) == 1)
		//{
		// Make user assassin
		zp_make_user_assassin(id)
			
		// Set his health
		set_user_health( id, floatround(get_user_health(id) * get_pcvar_float(cvar_assahp)) )
                if  (get_pcvar_num(cvar_assaglow))
		fm_set_rendering(id, kRenderFxGlowShell, 250, 250, 0, kRenderNormal, 25)

                if (get_pcvar_num(cvar_assaaura))
                set_task(0.1, "assasin_aura", id+TASK_AURA, _, _, "b")
			
		// Increase counter
		i_assassins++
		//}
	}
	
	//Turn the remaining players into snipers
	for (id = 1; id <= g_maxplayers; id++)
	{
		// Only those of them who are alive and are not assassins
		if ( !is_user_alive(id) || zp_get_user_assassin(id) )
			continue;
			
		// Turn into a sniper
		zp_make_user_sniper(id)
		
		// Set his health
		set_user_health( id, floatround(get_user_health(id) * get_pcvar_float(cvar_sniperhp)) )
	}
}

#if defined AMBIENCE_SOUNDS
public start_ambience_sounds( )
{
	// Variables
	static amb_sound[64], sound, Float:duration
	
	// Select our ambience sound
	sound = random_num( 0, sizeof g_sound_ambience - 1 )
	copy( amb_sound, sizeof amb_sound - 1 , g_sound_ambience[ sound ] )
	duration = g_sound_ambience_duration[ sound ]
	
	// Check whether it's a wav or mp3, then play it on clients
	if ( equal( amb_sound[ strlen( amb_sound ) - 4 ], ".mp3" ) )
		client_cmd( 0, "mp3 play ^"sound/%s^"", amb_sound )
	else
		client_cmd( 0, "spk ^"%s^"", sound )
	
	// Start the ambience sounds
	set_task( duration, "start_ambience_sounds", TASK_AMB )
}
public zp_round_ended( winteam )
{
	// Stop ambience sounds on round end
	remove_task( TASK_AMB )
}

public assasin_aura(taskid)
{

	// Get player's origin
	static origin[3]
	get_user_origin(ID_AURA, origin)
	
	// Colored Aura
	message_begin(MSG_PVS, SVC_TEMPENTITY, origin)
	write_byte(TE_DLIGHT) // TE id
	write_coord(origin[0]) // x
	write_coord(origin[1]) // y
	write_coord(origin[2]) // z
	write_byte(get_pcvar_num(cvar_assaauraradio)) // radius
	
	// Aura color for assassin
	
	write_byte(get_pcvar_num(cvar_assaaurared)) // r
	write_byte(get_pcvar_num(cvar_assaauragreen)) // g
	write_byte(get_pcvar_num(cvar_assaaurablue)) // b
	
	write_byte(2) // life
	write_byte(0) // decay rate
	message_end()
}

#endif

// This function returns the no. of alive players
// Feel free to use this in your plugin when you 
// are making your own game modes.
fn_get_alive_players( )
{
	static i_alive, id
	i_alive = 0
	
	for ( id = 1; id <= g_maxplayers; id++ )
	{
		if( is_user_alive( id ) )
			i_alive++
	}
	return i_alive;
}