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

Colors With ClientMod Support 1.0.7

_wS_

Участник
Сообщения
401
Реакции
785
  • Автор ресурса
  • #1
PHP:
#define TEAM_COLOR_GRAY -1
#define TEAM_COLOR_RED  -2
#define TEAM_COLOR_BLUE -3

/**
 * Как будет работать `{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` цветов.
 * @note                 Если фраза не переведена, то запишется в `buffer`.
 * @note                 Если забыли передать аргументы в перевод, то вместо них будет 0 0.0 "".
 * @note                 В случае ошибок `КОД ПРОДОЛЖАЕТ ВЫПОЛНЯТЬСЯ`, но в логе нет сообщения об ошибке.
 * @note                 НЕ РАБОТАЕТ: `%!`, `%L`, `%N`, `%E`.
 * @return               Кол-во ненулевых байт, записанных в `buffer`.
 */
native int CFormatEx(char[] buffer, int maxlength, const char[] format, any ...);

- Быстрее плагин-версий.
- CPrintToChat: css:ob + css:34 ClientMod видят hex, а обычный css:34 вместо hex'ов видит {green} / {lightgreen}.
- ToAll кэшируются (на 1 вызов) по языку игроков - нет лишних переводов/замен цветов.
- CFormatEx умный и ему плевать на какие-либо ошибки - подробнее в .inc
- Настройки hex цветов в cfg/colors_clientmod/colors.txt
- Если сообщение не в чат, то цвета, которые есть в cfg/colors_clientmod/colors.txt - вырезаются.
- Интерфейс colors_clientmod_src.zip/public/IColorsClientMod.h для использования в расширениях.

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

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
 
Последнее редактирование:

_wS_

Участник
Сообщения
401
Реакции
785
  • Автор ресурса
  • #2
_wS_ обновил(а) ресурс Colors With ClientMod Support новой записью:

Исправлена логическая ошибка в ToAll кэшировании

Была логическая ошибка в ToAll кэшировании:

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

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

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

Узнать больше об этом обновлении...
 

_wS_

Участник
Сообщения
401
Реакции
785
  • Автор ресурса
  • #3
_wS_ обновил(а) ресурс Colors With ClientMod Support новой записью:

Ещё ошибку нашёл

natives.cpp
Было if (!cached_msg.translated[0])
Стало if (!isCPrintToAll || !cached_msg.translated[0])
Т.е. когда сообщение для 1 игрока, то могло не переводить, а взять старое из кэша.

Вроде всё, заколебал он.

Узнать больше об этом обновлении...
 
Последнее редактирование:

_wS_

Участник
Сообщения
401
Реакции
785
  • Автор ресурса
  • #4
_wS_ обновил(а) ресурс Colors With ClientMod Support новой записью:

Улучшил CFormatEx

PHP:
/**
 * Возвращает текст без `cfg/colors_clientmod/colors.txt` цветов.
 * @note                 Если фраза не переведена, то запишется в `buffer`.
 * @note                 Если забыли передать аргументы в перевод, то вместо них будет 0 0.0 "".
 * @note                 В случае ошибок `КОД ПРОДОЛЖАЕТ ВЫПОЛНЯТЬСЯ`, но в логе нет сообщения об ошибке.
 * @note                 НЕ РАБОТАЕТ: `%!`, `%L`, `%N`, `%E`.
 * @return               Кол-во ненулевых байт, записанных в `buffer`.
 */...

Узнать больше об этом обновлении...
 

InFro

Участник
Сообщения
26
Реакции
47
Как эксперимент конечно интересно.

Но:
На данный момент нет поддержки linux
Не помешало бы перенести сборку на ambuild
Будто нафиг не нужОн это расширение
 

_wS_

Участник
Сообщения
401
Реакции
785
  • Автор ресурса
  • #6
На данный момент нет поддержки linux
Всм? .so в архиве.

Не помешало бы перенести сборку на ambuild
Я привык компилировать так, чтобы сразу везде работало (1 ext файл), используя Makefile (прикрепил).
Если вам нравится ambuild, то в чём пробл, компильте на нём, я сейчас не хочу вспоминать как он там работает.
 

Вложения

  • Makefile.zip
    3.8 КБ · Просмотры: 12

_wS_

Участник
Сообщения
401
Реакции
785
  • Автор ресурса
  • #7
_wS_ обновил(а) ресурс Colors With ClientMod Support новой записью:

-

Было как минимум 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 или нет. Уверен должно.

Узнать больше об этом обновлении...
 
Последнее редактирование:

Vit_ amin

Добрая душа
Сообщения
1,594
Реакции
760
P.S. Я видел выше - что вы указали, что нет возможности у вас ставить старый вариант ОС для охвата большего варианта GLIBC (но делюсь свои вариантом установки данного расширения)

C-подобный:
sm exts load colors_clientmod
[SM] Extension colors_clientmod.ext.so failed to load: /lib/i386-linux-gnu/libc.so.6: version `GLIBC_2.38' not found (required by /home/vitamin/SRCDS_07/cstrike/addons/sourcemod/extensions/colors_clientmod.ext.so)

cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 12 (bookworm)"
NAME="Debian GNU/Linux"
VERSION_ID="12"
VERSION="12 (bookworm)"
VERSION_CODENAME=bookworm
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"
uname -a
Linux Admin 6.6.87.2-microsoft-standard-WSL2 #1 SMP PREEMPT_DYNAMIC Thu Jun 5 18:30:46 UTC 2025 x86_64 GNU/Linux
strings /lib/i386-linux-gnu/libc.so.6 | grep GLIBC
GLIBC_2.0
GLIBC_2.1
GLIBC_2.1.1
GLIBC_2.1.2
GLIBC_2.1.3
GLIBC_2.2
GLIBC_2.2.1
GLIBC_2.2.2
GLIBC_2.2.3
GLIBC_2.2.4
GLIBC_2.2.6
GLIBC_2.3
GLIBC_2.3.2
GLIBC_2.3.3
GLIBC_2.3.4
GLIBC_2.4
GLIBC_2.5
GLIBC_2.6
GLIBC_2.7
GLIBC_2.8
GLIBC_2.9
GLIBC_2.10
GLIBC_2.11
GLIBC_2.12
GLIBC_2.13
GLIBC_2.14
GLIBC_2.15
GLIBC_2.16
GLIBC_2.17
GLIBC_2.18
GLIBC_2.22
GLIBC_2.23
GLIBC_2.24
GLIBC_2.25
GLIBC_2.26
GLIBC_2.27
GLIBC_2.28
GLIBC_2.29
GLIBC_2.30
GLIBC_2.31
GLIBC_2.32
GLIBC_2.33
GLIBC_2.34
GLIBC_2.35
GLIBC_2.36
GLIBC_ABI_DT_RELR
GLIBC_PRIVATE
GNU C Library (Debian GLIBC 2.36-9+deb12u10) stable release version 2.36
 
  • Мне нравится
Реакции: _wS_

_wS_

Участник
Сообщения
401
Реакции
785
  • Автор ресурса
  • #9
version `GLIBC_2.38' not found
Мда, я скомпил на слишком новой версии, это нужно играться с докером наверно, чтобы компилить на версиях пониже😾
Спс за инфу, позже перезалью.
Сообщения автоматически склеены:

С cs:s v34 linux какой-то ад.
virtual const char* GetClientConVarValue(int clientIndex, const char* name) = 0;
Это всегда возвращает пустую строку.
На 34 индекс 58. На ob 55.
Хз что делать или я скачал какой-то не такой сервер.
Через докер под i386/debian:8 компилил, c++14, пустая строка и всё.
Зато SM спокойно делает const char *val = engine->GetClientConVarValue(client, key); и всё у них хорошо.
Плагин что-ли добавлять, чтобы он мог отправлять GetClientInfo инфу расширению, но это ерунда.
Везде работает, а этот css:34 linux..
Может у кого есть нормальная инструкция как нормально скомпилить екст под 34 лин?
episode1 sdk.
Тупик какой-то.

---
Хотя тут дело не именно в GetClientConVarValue, а в строках, сломаны строки.
IVEngineServer:
virtual float Time( void ) = 0; - работает.
virtual void GetGameDir( char *szGetGameDir, int maxlength ) = 0; - тоже пустая строка.

---
Ёшкин кошкин, надо было подгружать engine_i686.so, а не engine_i486.so.
 
Последнее редактирование:

Vit_ amin

Добрая душа
Сообщения
1,594
Реакции
760
надо было подгружать engine_i686.so, а не engine_i486.so.
Собственно - вам требуется определять через ELF структуру каждый отдельный случай, так как динамические библиотеки в данном случае скомпилированы и слинкованы под разные семейства CPU (i486 - в основном legacy) - впрочем, могу ошибаться
P.S. Зачем вам делать подгрузку engine целиком библиотеки если через CreateInterface вы можете получить указатель на IVEngineServer/CVEngineServer ?

Подправьте - если я что-то не так понял
 

_wS_

Участник
Сообщения
401
Реакции
785
  • Автор ресурса
  • #11
Зачем вам делать подгрузку engine целиком библиотеки если через CreateInterface вы можете получить указатель на IVEngineServer/CVEngineServer ?
Собираю без зависимостей от metamod'а
//#define SMEXT_CONF_METAMOD
Поэтому приходится так.
Если можно как-то проще получить IVEngineServer*, то буду рад узнать как.
Ещё мне въелось в голову, что лучше собирать без metamod'а, т.к. он не сможет так дружить с 34 + ob, как это делает один ext без него.
Пока есть возможность заставить работать и без metamod'а, логичнее его пока и не трогать :)
Но нужно потестировать ещё, вполне возможно что всё будет норм и с metamod'ом.
 
Последнее редактирование:

Vit_ amin

Добрая душа
Сообщения
1,594
Реакции
760
Если можно как-то проще получить IVEngineServer*, то буду рад узнать как.
Ну тогда находите указатель на server библиотеку, там получайте адрес функции CreateInterface и вызывайте ей с нужными параметрами, впрочем - этот вариант мало отличается от вашего с получением указателя на engine библиотеку
 

_wS_

Участник
Сообщения
401
Реакции
785
  • Автор ресурса
  • #13
_wS_ обновил(а) ресурс Colors With ClientMod Support новой записью:

Перекомпилировал

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
Ну теперь должно заводиться.

Узнать больше об этом обновлении...
 

_wS_

Участник
Сообщения
401
Реакции
785
  • Автор ресурса
  • #14

Похожие темы

Ответы
608
Просмотры
114К
Сверху Снизу