#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();
}