Иконка ресурса

Colors With ClientMod Support 1.0.7

Версия Дата выпуска Скачивания Оценка  
1.0.7 7 0.00 звёзд 0 оценок Скачать
Для тех, у кого в sm exts list была ошибка "!engine".
Теперь указывается полный путь к библиотеке, а не лишь её имя.
PHP:
//    objdump -p colors_clientmod.ext.so | grep GLIBC
0x0d696910 0x00 06 GLIBC_2.0
0x09691f73 0x00 03 GLIBC_2.1.3
0x0297f861 0x00 05 GLIBCXX_3.4.11
0x0297f870 0x00 04 GLIBCXX_3.4.20
0x08922974 0x00 02 GLIBCXX_3.4
Ну теперь должно заводиться.
Было как минимум 2 серьёзные проблемы.

1. Т.к. у меня не было тестового сервера css:ob linux, то я не учёл, что там теперь engine_srv.so, а я думал "engine.so", поэтому на cs:s ob linux ext сразу крашился с ошибкой.

2. Не определяло css:34 игрока с ClientMod'ом, т.к. я проверял "~clientmod" значение, а сейчас глянул их api и проверять уже нужно "_client_version".

В общем проверил css:ob win + css:ob lin + css:34 win, а css:34 lin не могу, т.к. там без магии не получится, у меня новая убунту, а с новыми ос v34 не дружит - там строки тупо сломаны - это надо старую ос какую-то ставить, у меня такого пока нет и было бы неплохо, если бы кто-то отписался работает ли на css:34 linux или нет. Уверен должно.
PHP:
/**
 * Возвращает текст без `cfg/colors_clientmod/colors.txt` цветов.
 * @note                 Если фраза не переведена, то запишется в `buffer`.
 * @note                 Если забыли передать аргументы в перевод, то вместо них будет 0 0.0 "".
 * @note                 В случае ошибок `КОД ПРОДОЛЖАЕТ ВЫПОЛНЯТЬСЯ`, но в логе нет сообщения об ошибке.
 * @note                 НЕ РАБОТАЕТ: `%!`, `%L`, `%N`, `%E`.
 * @return               Кол-во ненулевых байт, записанных в `buffer`.
 */
native int CFormatEx(char[] buffer, int maxlength, const char[] format, any ...);

- Убрал параметр const char[] sDefault.
- Если забыли передать аргументы в перевод, то вместо них будет 0 0.0 "".

Пример работы:

PHP:
"Test"
{
    "#format" "{1:d},{2:s}"
    "en"      "{green}d = {1} {team}s = {2}"
}

PrintToServer("'%s' len %d", s, len);

// len = CFormatEx(s, sizeof(s), "%T", "Test", LANG_SERVER, 5, "str");
// len = CFormatEx(s, sizeof(s), "%T", "Test", LANG_SERVER, 5, "str", 2.3, INVALID_HANDLE);
'd = 5 s = str' len 13

// len = CFormatEx(s, sizeof(s), "%T", "Test");
'd = 0 s = ' len 10

// len = CFormatEx(s, sizeof(s), "%T");
// len = CFormatEx(s, sizeof(s), "");
'' len 0

// len = CFormatEx(s, sizeof(s), "abcd %T", "UnknownPhrase", LANG_SERVER);
// len = CFormatEx(s, sizeof(s), "%T %T", "Test", LANG_SERVER, 5, "str", "UnknownPhrase", LANG_SERVER);
'UnknownPhrase' len 13

// len = CFormatEx(s, sizeof(s), "%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d", 5);
'50000000000000000000000000000000' len 32
natives.cpp
Было if (!cached_msg.translated[0])
Стало if (!isCPrintToAll || !cached_msg.translated[0])
Т.е. когда сообщение для 1 игрока, то могло не переводить, а взять старое из кэша.

Вроде всё, заколебал он.
Была логическая ошибка в ToAll кэшировании:

1. Результат кэширован по языку игрока.
2. Второй/третий и т.д. игроки с тем же языком - им отправляется этот результат из кэша.
3. Если в этом результате было "\x07FFFFFF", то игроки с обычной css:34 увидят мусор,
а если кэширован был обычный css:34, то никто не увидит hex.

Исправлено.
Теперь кэшируются по номеру языка три строки:

1. char translated[CMSG_BUFFER_SIZE]; // "{white}Msg" css:ob + css:34 ClientMod
Переведённый/отформатированный текст.

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:34 ClientMod
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 <morecolors> или что вы подключали на #include <colors_clientmod>
Сверху Снизу