#if defined WPMGPrintChatColorIncluded
	#endinput
#endif

#define WPMGPrintChatColorIncluded

#include <cstrike>

// Максимальное количество %L в сообщении
#define MAX_LANG_ARGS	5

// Цвета сообщений
enum
{
	PRINT_COLOR_GREY,		// Серый
	PRINT_COLOR_RED,		// Красный
	PRINT_COLOR_BLUE,		// Синий
	PRINT_COLOR_PLAYERTEAM	// Цвет команды игрока которому мы отсылаем или цвет команды определённого игрока (если PRINT_COLOR_PLAYERTEAM + id)
};

// Имена команд
static const g_aszTeamNames[][] =
{
	"UNASSIGNED",
	"TERRORIST",
	"CT",
	"SPECTATOR"
};

stock PrintChatColor(pReceiver, iColor = PRINT_COLOR_PLAYERTEAM, const szMessage[], any:...)
{
	// Сообщение
	new szBuffer[256];
	
	// Количество аргументов
	new iArgs = numargs();
	
	// Отсылаем одному игроку
	if (pReceiver)
	{
		// Заменяем все LANG_PLAYER, на ID получателя
		for (new iArg = 3; iArg < iArgs; iArg++)
		{
			// Если аргумент не равен LANG_PLAYER идём дальше
			if (getarg(iArg) != LANG_PLAYER)
				continue;
			
			// Меняем численное значение аргумента
			setarg(iArg, _, pReceiver);
		}
		
		// Форматируем сообщение
		vformat(szBuffer, 255, szMessage, 4);
		
		// Заменяем !y, !t, !g на цвета
		while (replace(szBuffer, 255, "!y", "^1")) {}
		while (replace(szBuffer, 255, "!t", "^3")) {}
		while (replace(szBuffer, 255, "!g", "^4")) {}
		
		// Если цвет PLAYERTEAM
		if (iColor >= PRINT_COLOR_PLAYERTEAM)
			// Отсылаем сообщение игроку, за отправителя берём либо получателя, либо указанного игрока
			UTIL_SayText(MSG_ONE, _, pReceiver, (iColor > PRINT_COLOR_PLAYERTEAM) ? iColor - PRINT_COLOR_PLAYERTEAM : pReceiver, szBuffer);
		else
		{
			// Получаем команду получателя
			new iTeam = _:cs_get_user_team(pReceiver);
			
			// Если команда равна цвету сразу отслылаем сообщение
			if (iTeam % 3 == iColor)
				UTIL_SayText(MSG_ONE, _, pReceiver, pReceiver, szBuffer);
			else
			{
				// Меняем команду (для цвета)
				UTIL_TeamInfo(MSG_ONE, _, pReceiver, pReceiver, g_aszTeamNames[iColor]);
				// Отсылаем сообщение
				UTIL_SayText(MSG_ONE, _, pReceiver, pReceiver, szBuffer);
				// Возвращаем команду
				UTIL_TeamInfo(MSG_ONE, _, pReceiver, pReceiver, g_aszTeamNames[iTeam]);
			}
		}
	}
	// Отсылаем всем
	else
	{
		// Массив для аргументов
		new aiChangeArgs[MAX_LANG_ARGS];
		// Количество аргументов, текущий аргумент
		new iChangeArgs, iArg;
		
		// Записываем все аргументы содержащие LANG_PLAYER
		for (iArg = 3; iArg < iArgs; iArg++)
		{
			// Если аргумент не равен LANG_PLAYER идём дальше
			if (getarg(iArg) != LANG_PLAYER)
				continue;
			
			// Записываем в массив
			aiChangeArgs[iChangeArgs++] = iArg;
			
			// Если достигнут максимум выходим из цикла
			if (iChangeArgs == MAX_LANG_ARGS)
				break;
		}
		
		// Массив из игроков
		new apPlayers[32];
		// Всего игроков
		new iPlayers;
		// Последний игрок
		new pPlayer;
		
		// Получаем игроков
		get_players(apPlayers, iPlayers);
		
		// Делаем цикл из игроков
		for (new i = 0; i < iPlayers; i++)
		{
			// Сохраняем последнего игрока
			pPlayer = apPlayers[i];
			
			// Меняем аргументы LANG_PLAYER на ID игрока
			for (iArg = 0; iArg < iChangeArgs; iArg++)
				setarg(aiChangeArgs[iArg], _, pPlayer);
			
			// Форматируем сообщение
			vformat(szBuffer, 255, szMessage, 4);
			
			// Заменяем !y, !t, !g на цвета
			while (replace(szBuffer, 255, "!y", "^1")) {}
			while (replace(szBuffer, 255, "!t", "^3")) {}
			while (replace(szBuffer, 255, "!g", "^4")) {}
			
			// Если цвет PLAYERTEAM
			if (iColor >= PRINT_COLOR_PLAYERTEAM)
				// Отсылаем сообщение игроку, за отправителя берём либо получателя, либо указанного игрока
				UTIL_SayText(MSG_ONE, _, pPlayer, (iColor > PRINT_COLOR_PLAYERTEAM) ? iColor - PRINT_COLOR_PLAYERTEAM : pPlayer, szBuffer);
			else
			{
				// Получаем команду получателя
				new iTeam = _:cs_get_user_team(pPlayer);
				
				// Если команда равна цвету сразу отслылаем сообщение
				if (iTeam % 3 == iColor)
					UTIL_SayText(MSG_ONE, _, pPlayer, pPlayer, szBuffer);
				else
				{
					// Меняем команду (для цвета)
					UTIL_TeamInfo(MSG_ONE, _, pPlayer, pPlayer, g_aszTeamNames[iColor]);
					// Отсылаем сообщение
					UTIL_SayText(MSG_ONE, _, pPlayer, pPlayer, szBuffer);
					// Возвращаем команду
					UTIL_TeamInfo(MSG_ONE, _, pPlayer, pPlayer, g_aszTeamNames[iTeam]);
				}
			}
		}
	}
}

// Утилита отсылки SayText
stock UTIL_SayText(iDest, const vecOrigin[3] = {0, 0, 0}, pEntity, pSender, const szMessage[], const szArg1[] = "", const szArg2[] = "")
{
	// Получаем ID сообщения SayText
	static msgSayText;
	
	if (!msgSayText)
		msgSayText = get_user_msgid("SayText");
	
	// Отсылаем SayText
	message_begin(iDest, msgSayText, vecOrigin, pEntity);
	write_byte(pSender);
	write_string(szMessage);
	if (szArg1[0])
	{
		write_string(szArg1);
		
		if (szArg2[0])
			write_string(szArg2);
	}
	message_end();
}

// Утилита отсылки TeamInfo
stock UTIL_TeamInfo(iDest, const vecOrigin[3] = {0, 0, 0}, pEntity, pPlayer, const szTeamName[])
{
	// Получаем ID сообщения TeamInfo
	static msgTeamInfo;
	
	if (!msgTeamInfo)
		msgTeamInfo = get_user_msgid("TeamInfo");
	
	// Отсылаем TeamInfo
	message_begin(iDest, msgTeamInfo, vecOrigin, pEntity);
	write_byte(pPlayer);
	write_string(szTeamName);
	message_end();
}