//---------------------------------------------------------------------------------
// Purpose: Say to all
//---------------------------------------------------------------------------------
void SayToAll(const int colour, bool echo, const char	*fmt, ...)
{
	va_list		argptr;
	char		tempString[1024];
	player_t	server_player;
	bool		found_player = false;

	if (war_mode)
	{
		return;
	}

	va_start ( argptr, fmt );
	vsnprintf( tempString, sizeof(tempString), fmt, argptr );
	va_end   ( argptr );

	MRecipientFilter mrf;
	mrf.MakeReliable();
	mrf.RemoveAllRecipients();
	if (echo) OutputToConsole(NULL, "%s\n", tempString);

	for (int i = 1; i <= max_players; i++)
		{
		server_player.index = i;
		if (!FindPlayerByIndex(&server_player))
		{
			continue;
		}

		if (server_player.is_bot)
		{
			continue;
		}

		found_player = true;
		mrf.AddPlayer(i);

		if (!(gpManiGameType->IsGameType(MANI_GAME_CSS) ||
			gpManiGameType->IsGameType(MANI_GAME_CSGO)))
		{
			if (echo) OutputToConsole(&server_player, "%s\n", tempString);
		}
	}

	if (found_player)
	{
		UTIL_SayText(colour, &mrf, tempString);
	}
}
//---------------------------------------------------------------------------------
// Purpose: Say string to specific teams
//---------------------------------------------------------------------------------
void SayToTeam
(
 const int colour,
bool	ct_side,
bool	t_side,
bool	spectator,
const char	*fmt, ...
)
{
	va_list		argptr;
	char		tempString[1024];

	if (war_mode)
	{
		return;
	}

	va_start ( argptr, fmt );
	vsnprintf( tempString, sizeof(tempString), fmt, argptr );
	va_end   ( argptr );

	MRecipientFilter mrf;
	player_t recipient_player;

	mrf.MakeReliable();
	mrf.RemoveAllRecipients();

	for (int i = 1; i <= max_players; i++)
	{
		recipient_player.index = i;
		if (!FindPlayerByIndex (&recipient_player))
		{
			continue;
		}

		if (recipient_player.is_bot)
		{
			continue;
		}

		if (ct_side)
		{
			if (recipient_player.team == TEAM_B)
			{
				mrf.AddPlayer(i);
			}
		}
		
		if (t_side)
		{
			if (recipient_player.team == TEAM_A)
			{
				mrf.AddPlayer(i);
			}
		}
		
		if (gpManiGameType->IsSpectatorAllowed() && spectator)
		{
			if (recipient_player.team == gpManiGameType->GetSpectatorIndex())
			{
				mrf.AddPlayer(i);
			}
		}
	}

	OutputToConsole(NULL, "%s\n", tempString);
	UTIL_SayText(colour, &mrf, tempString);
}
//---------------------------------------------------------------------------------
// Purpose: Say to Dead
//---------------------------------------------------------------------------------
void SayToDead(const int colour, const char	*fmt, ...)
{
	va_list		argptr;
	char		tempString[1024];
	player_t	recipient_player;
	bool		found_player = false;

	if (war_mode)
	{
		return;
	}

	va_start ( argptr, fmt );
	vsnprintf( tempString, sizeof(tempString), fmt, argptr );
	va_end   ( argptr );

	MRecipientFilter mrf;
	mrf.MakeReliable();
	mrf.RemoveAllRecipients();

	OutputToConsole(NULL, "%s\n", tempString);

	for (int i = 1; i <= max_players; i++)
	{
		recipient_player.index = i;
		if (!FindPlayerByIndex(&recipient_player))
		{
			continue;
		}

		if (recipient_player.is_bot)
		{
			continue;
		}

		// If player is spectator
		if (gpManiGameType->IsSpectatorAllowed() && 
			recipient_player.team == gpManiGameType->GetSpectatorIndex())
		{
			mrf.AddPlayer(i);
			found_player = true;
			if (!(gpManiGameType->IsGameType(MANI_GAME_CSS) ||
				gpManiGameType->IsGameType(MANI_GAME_CSGO)))
			{
				OutputToConsole(&recipient_player, "%s\n", tempString);
			}
			continue;
		}

		if (recipient_player.is_dead)
		{
			mrf.AddPlayer(i);
			found_player = true;
			if (!(gpManiGameType->IsGameType(MANI_GAME_CSS) ||
				gpManiGameType->IsGameType(MANI_GAME_CSGO)))
			{
				OutputToConsole(&recipient_player, "%s\n", tempString);
			}

			continue;
		}
	}

	if (found_player)
	{
		UTIL_SayText(colour, &mrf, tempString);
	}
}
//---------------------------------------------------------------------------------
// Purpose: Say from player only to admin
//---------------------------------------------------------------------------------
void SayToAdmin
(
 const int colour,
player_t	*player,
const char	*fmt, 
...
)
{
	va_list		argptr;
	char		tempString[1024];
	char	final_string[2048];
	bool	found_player = false;
	player_t recipient_player;
	
	if (war_mode)
	{
		return;
	}

	va_start ( argptr, fmt );
	vsnprintf( tempString, sizeof(tempString), fmt, argptr );
	va_end   ( argptr );

	MRecipientFilter mrf;
	mrf.MakeReliable();
	mrf.RemoveAllRecipients();
	snprintf(final_string, sizeof (final_string), "(TO ADMIN) %s: %s", player->name, tempString);
	OutputToConsole(NULL, "%s\n", final_string);

	for (int i = 1; i <= max_players; i++)
	{
		recipient_player.index = i;
		if (!FindPlayerByIndex (&recipient_player))
		{
			continue;
		}

		if (recipient_player.is_bot)
		{
			continue;
		}

		if (player->index == i)
		{
				mrf.AddPlayer(i);
				found_player = true;
//				OutputToConsole(recipient_player.entity, "%s\n", final_string);
		}
		else
		{
			if (gpManiClient->HasAccess(recipient_player.index, ADMIN, ADMIN_BASIC_ADMIN))
			{
				// This is an admin player
				mrf.AddPlayer(i);
				found_player = true;
//				OutputToConsole(recipient_player.entity, "%s\n", final_string);
			}
		}
	}

	if (found_player)
	{
		UTIL_SayText(colour, &mrf, final_string);
	}

}
//---------------------------------------------------------------------------------
// Purpose: Show hud message for kill
//---------------------------------------------------------------------------------
static	
void ShowQuakeSound (player_t *attacker, player_t *victim, int mode, char *fmt, ...)
{
	va_list		argptr;
	char		temp_string[256];
	

	va_start ( argptr, fmt );
	vsnprintf( temp_string, sizeof(temp_string), fmt, argptr );
	va_end   ( argptr );

	MRecipientFilter mrf;

	if (mode == 1)
	{
		mrf.RemoveAllRecipients();
		mrf.MakeReliable();

		// All players must see
		for (int i = 1; i <= max_players; i++)
		{

			player_settings_t	*player_settings;
			player_t			sound_player;

			sound_player.index = i;
			if (!FindPlayerByIndex(&sound_player)) continue;
			if (sound_player.is_bot) continue;
			
			player_settings = FindPlayerSettings(&sound_player);
			if (player_settings && player_settings->quake_sounds) 
			{
				mrf.AddPlayer(sound_player.index);
			}
		}
	}
	else if (mode == 2)
	{
		player_settings_t	*player_settings;

		player_settings = FindPlayerSettings(attacker);
		if (player_settings && player_settings->quake_sounds)
		{
			mrf.AddPlayer(attacker->index);
		}

		player_settings = FindPlayerSettings(victim);
		if (player_settings && player_settings->quake_sounds)
		{
			mrf.AddPlayer(victim->index);
		}
	}
	else if (mode == 3)
	{
		player_settings_t	*player_settings;
		player_settings = FindPlayerSettings(attacker);
		if (player_settings && player_settings->quake_sounds)
		{
			// Attacker sees it.
			mrf.AddPlayer(attacker->index);
		}
	}
	else if (mode == 4)
	{
		player_settings_t	*player_settings;
		player_settings = FindPlayerSettings(victim);
		if (player_settings && player_settings->quake_sounds)
		{
			// Victim sees it.
			mrf.AddPlayer(victim->index);
		}
	}

#if defined ( GAME_CSGO )
	CCSUsrMsg_TextMsg *msg = (CCSUsrMsg_TextMsg *)g_Cstrike15UsermessageHelpers.GetPrototype(CS_UM_TextMsg)->New(); // Show TextMsg type user message
	msg->set_msg_dst(4); // Center area
	// Client tries to read all 5 'params' and will crash if less
	msg->add_params(temp_string);
	msg->add_params("");
	msg->add_params("");
	msg->add_params("");
	msg->add_params("");
	engine->SendUserMessage(mrf, CS_UM_TextMsg, *msg);
	delete msg;
#else
	msg_buffer = engine->UserMessageBegin( &mrf, text_message_index ); // Show TextMsg type user message

	msg_buffer->WriteByte(4); // Center area
	msg_buffer->WriteString(temp_string);
	engine->MessageEnd();
#endif	
}