/** * Как будет работать `{team}` при следующем `CPrintToChat`/`CPrintToChatAll`. * @param value `TEAM_COLOR_..` или индекс игрока. * @note По умолчанию отображается цвет в зависимости от команды получателя сообщения. * @note GRAY/RED/BLUE работает, если в команде SPEC/T/CT есть хотя бы 1 игрок. * @note Если игрок не найден, используется индекс из `CPrintToChat`. */ native void CSetNextTeamColor(int value);
// Использовать в `OnClientPutInServer` или позже. native bool CIsClientModUser(int client);
native void CPrintToChat(int client, const char[] format, any ...); native void CPrintToChatAll(const char[] format, any ...);
native void CPrintCenterText(int client, const char[] format, any ...); native void CPrintCenterTextAll(const char[] format, any ...);
native void CPrintHintText(int client, const char[] format, any ...); native void CPrintHintTextToAll(const char[] format, any ...);
native void CPrintToConsole(int client, const char[] format, any ...); native void CPrintToConsoleAll(const char[] format, any ...);
native void CPrintToServer(const char[] format, any ...); native void CReplyToCommand(int client, const char[] format, any ...);
/** * Возвращает текст без `cfg/colors_clientmod/colors.txt` цветов. * @return Кол-во ненулевых байт, записанных в `buffer`. */ native int CFormat(char[] buffer, int maxlength, const char[] format, any ...);
/** * Возвращает текст без `cfg/colors_clientmod/colors.txt` цветов. * @param sDefault Записывается в `buffer`, если возникли ошибки перевода/аргументов и т.д. * @note Если фраза не переведена, то может записаться в `buffer`, если `sDefault` не указан. * @note В случае ошибок `КОД ПРОДОЛЖАЕТ ВЫПОЛНЯТЬСЯ`, но в логе нет сообщения об ошибке. * @note НЕ РАБОТАЕТ: `%!`, `%L`, `%N`, `%E`. * @return Кол-во ненулевых байт, записанных в `buffer`. */ native int CFormatEx(char[] buffer, int maxlength, const char[] sDefault, const char[] format, any ...);
- Быстрее плагин-версий. - Отправляете CPrintToChat и css:ob + css:34 ClientMod видят hex, а обычный css:34 вместо hex'ов видит {green}/{lightgreen}.
- ToAll кэшируется (на 1 вызов). Т.е. если есть игроки с одинаковым языком, то лишь один раз будет выполнен перевод + заменены цвета, а второй/третий и т.д. игроки - для них этот готовый текст быстро вытащится из кэша.
- Раздражает, когда из-за какой-то непереведённой фразы крашится всё меню/функция? Поможет CFormatEx. - Настраивайте любые hex цвета в cfg/colors_clientmod/colors.txt - Если сообщение не в чат, то цвета, которые есть в cfg/colors_clientmod/colors.txt - вырезаются. - Хочется использовать в своём расширении? Используй интерфейс colors_clientmod_src.zip/public/IColorsClientMod.h
Была логическая ошибка в ToAll кэшировании:
1. Результат кэширован по языку игрока. 2. Второй/третий и т.д. игроки с тем же языком - им отправляется этот результат из кэша. 3. Если в этом результате было "\x07FFFFFF", то игроки с обычной css:34 увидят мусор, а если кэширован был обычный css:34, то никто не увидит hex.
Исправлено. Теперь кэшируются по номеру языка три строки:
2. char hex[CMSG_SIZE]; // "\x07FFFFFFMsg" css:ob + css:34 ClientMod Переведённый/отформатированный текст, в котором были заменены {white} цвета на "\x07FFFFFF".
3. char legacy[CMSG_SIZE]; // "\x03Msg" или "\x04Msg" css:34 Переведённый/отформатированный текст, в котором были заменены {white} цвета на "\x03" или "\x04".
Например, на сервере три игрока с одним и тем же языком: 1. css:ob 2. css:34 ClientMod 3. css:34 legacy Crpint..All нашло игрока 1, вычислило и сохранило translated + hex в кэш. Дальше нашло игрока 2 - видим, что hex работает и просто сразу из кэша показываем ему hex без лишних действий. Дальше нашло игрока 3 - hex не работает и в legacy пусто - берём translated из кэша, заменяем {white} на "\x03"/"\x04" и сохраняем в legacy кэш. Перед началом следующего Crpint..All - весь этот кэш очищается.
В большинстве плагинов, скорее всего, это всё уже будет работать и там достаточно заменить #include или что вы подключали на #include
natives.cpp Было if (!cached_msg.translated[0]) Стало if (!isCPrintToAll || !cached_msg.translated[0]) Т.е. когда сообщение для 1 игрока, то могло не переводить, а взять старое из кэша.
CFormatEx теперь не ломается, если передать больше аргументов, чем в файле перевода. Пример полезности: в vip.phrases.txt есть:
Вы хотите получить лишь "Скорость" и не знаете какие там аргументы передавать нужно и сколько их. По нормальному будет: CFormatEx(s, sizeof(s), "speed", "%T", "speed", client, "200"); Но можно: CFormatEx(s, sizeof(s), "speed", "%T", "speed", client, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); И получим "Скорость: 0" - ну а дальше двоеточие ищем, обрезаем и т.д. - это как способ, чтобы не дублировать фразы, а вытащить из существующей. Вместо 0 можно "" - главное чтобы их было >= кол-ву в "#format", т.к. если указать меньше, то вернёт sDefault ("speed").