Сменить язык меню для клиента

oleg_nelasy

Участник
Сообщения
664
Реакции
46
Подскажите если язык клиента на английском. То сервер выдет админ меню тоже на английском. Я могу сменить язык меню для себя не меняя язык клиента? Sourcemod
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,517
Реакции
4,979
@oleg_nelasy, попробуй вот этот:
Настройки сохраняются через clientpref. Языки предлагаются из конфига соурсмода .../addons/sourcemod/configs/languages.cfg
Сообщения автоматически склеены:

Вот здесь описание:
Здесь в ресурсах у себя не вижу, возможно просто не выкладывал на hlmod. Но на его основе сделан вот этот плагин R1KO:
Сообщения автоматически склеены:

глянул код на гитхабе и что-то терзают меня смутные сомнения по поводу 52-й строчки: по идее там if(num < 1)должно было быть

если что на AM код точно рабочий был
 
Последнее редактирование:

oleg_nelasy

Участник
Сообщения
664
Реакции
46
@Grey83, попробовал
https://forums.alliedmods.net/showthread.php?p=2444363
Язык меняет но при смене карты или переподключении язык сбрасывает на язык клиента. При этом если зайти !settings видно что саму настройку запомнило и если переключить туда обратно что снова все работает.
Сообщения автоматически склеены:

Что-то мне подсказывает что не хватает при подключении игрока к серверу проверять его настройку и делать ChangeLanuage()
 
Последнее редактирование:

oleg_nelasy

Участник
Сообщения
664
Реакции
46
@oleg_nelasy, попробуй версию с гитхаба (и строчку ту поправь, как я написал).
Пировал когда захожу из меню настроек в меню выбора языка
L 06/09/2025 - 16:32:46: SourceMod error session started
L 06/09/2025 - 16:32:46: Info (map "de_dust2_csco") (file "/NVME1TB/cscoPublic/csco/csgo/addons/sourcemod/logs/errors_20250609.log")
L 06/09/2025 - 16:32:46: [SM] Exception reported: Invalid Handle 0 (error: 4)
L 06/09/2025 - 16:32:46: [SM] Blaming: lang 1.1.0_07.09.2023.smx
L 06/09/2025 - 16:32:46: [SM] Call stack trace:
L 06/09/2025 - 16:32:46: [SM] [0] ArrayList.GetString
L 06/09/2025 - 16:32:46: [SM] [1] Line 131, C:\Users\Krabik\Desktop\sourcemod-1.13.0-git7243-windows\addons\sourcemod\scripting\lang 1.1.0_07.09.2023.sp::LangMenu
L 06/09/2025 - 16:32:46: [SM] [3] ShowCookieMenu
L 06/09/2025 - 16:32:46: [SM] [4] Line 171, /home/builds/sourcemod/debian11-1.13/build/plugins/clientprefs.sp::Command_Settings
Сообщения автоматически склеены:

sourcemod-1.13.0-git7243-linux
Сообщения автоматически склеены:

Еще момент
sm_lang
Unknown command: sm_lang
sm_leng_versoin
Unknown command: sm_leng_versoin
!settings открывает меню но при попытке войти в настйроки языка ошибка выше.
Сообщения автоматически склеены:

@Grey83, Боже мой рука лицо. if(num < 1) я менял значения с 0 но на знак не обратил внимание. Сейчас работает. Но снова надо при коннекте добавить установку игроку языка который он сохранил. И в меня пункты перепутаны ты что должны быть юзабильны не юзабильны и на оборот.
 
Последнее редактирование:

oleg_nelasy

Участник
Сообщения
664
Реакции
46
@Grey83, В общем получилась исправить.
в
C++:
public void OnClientPostAdminCheck(int client)
{
    if(iLang[client] == -1)    OnClientCookiesCached(client);
}

public void OnClientCookiesCached(int client)
{
    if(IsFakeClient(client))
        return;

    GetClientCookie(client, hCookies, sCode, sizeof(sCode));
    iLang[client] = GetLanguageByCode(sCode);
   
    //PrintToChatAll("iLang[client] для игрока %N = %d", client, iLang[client]);
    //PrintToServer("iLang[client] для игрока %N = %d", client, iLang[client]);
   
    //if(iLang[client] != -1) SetClientLanguage(client, iLang[client]);
}

Я убрал if(iLang[client] != -1) SetClientLanguage(client, iLang[client]);

И добавил
C-подобный:
public void OnClientLanguageChanged(int client, int lang)
{
    if(IsFakeClient(client))
        return;
   
    if(iLang[client] != -1) SetClientLanguage(client, iLang[client]);
}
Все стало корректно работать. Также поправил юзабильнось кнопок в меню изначально работали наоборот.
case MenuAction_DrawItem: return item == iLang[client] ? ITEMDRAW_DISABLED : ITEMDRAW_DEFAULT;

И тут я хотел с вами посоветоваться. Я не очень понял 76 строку
for(int i = 1; i <= MaxClients; i++) if(IsClientInGame(i) && AreClientCookiesCached(i)) OnClientPostAdminCheck(i);
Почему не делать по событию подключился. Как помне надо блок OnClientPostAdminCheck() и OnClientCookiesCached() Переносить в OnClientLanguageChanged();


C++:
public void OnClientLanguageChanged(int client)
{
    if(iLang[client] == -1){
        if(IsFakeClient(client))
        return;

        GetClientCookie(client, hCookies, sCode, sizeof(sCode));
        iLang[client] = GetLanguageByCode(sCode);  
        if(iLang[client] != -1) SetClientLanguage(client, iLang[client]);
    }
}
 
Последнее редактирование:

Grey83

не пишу плагины с весны 2022
Сообщения
8,517
Реакции
4,979
@oleg_nelasy, попробуй такой вариант.
Поправил меню и исправил ещё в паре мест.
 

Вложения

  • lang 1.1.1_09.06.2025.sp
    4.8 КБ · Просмотры: 2

oleg_nelasy

Участник
Сообщения
664
Реакции
46
@oleg_nelasy, попробуй такой вариант.
Поправил меню и исправил ещё в паре мест.
Меню работает. Но язык при входе также не меняется. Как я уже писал выше в похоже тот момент игрок еще не передал данные о языке своего клиента. И похоже что позже данные просто перезаписываются на то что клиент перед серверу. Я у себя это исправил переместив смену языка в OnClientLanguageChanged(). В моей версии все идеально работает.
Как я уже писал выше мне кажется надо весь блок OnClientPostAdminCheck() и OnClientCookiesCached() переносить в OnClientLanguageChanged();
 

Вложения

  • lang 1.1.0_07.09.2023.sp
    5.2 КБ · Просмотры: 2

Grey83

не пишу плагины с весны 2022
Сообщения
8,517
Реакции
4,979

oleg_nelasy

Участник
Сообщения
664
Реакции
46
это момент, когда SM прочитал инфу в своей БД о игроке
я пробовал OnClientPutInServer(), OnClientConnected в обоих вариантах тоже самое что у вас все данные записываются верно но сам язык остается как у клиента. А в OnClientLanguageChanged все работает как надо.
Сообщения автоматически склеены:

Этот форвард только в SM1.13 появился?
Честно не знаю 3 года к sm вообще не прикасался сейчас cs co запустили появился интерес попробовать сделать сервер. Появилась проблема полез искать что подойдет на SourceMod: Half-Life 2 Scripting.
 
Последнее редактирование:

Grey83

не пишу плагины с весны 2022
Сообщения
8,517
Реакции
4,979
Глянул инклюды: начиная с 1.11 встречается
Сообщения автоматически склеены:

Можно для более старых версий сделать таймер до успешного получения языка.
Сообщения автоматически склеены:

Надеюсь такой фикс для SM1.8 - SM1.10 поможет.
 

Вложения

  • lang 1.1.2_10.06.2025.sp
    5.6 КБ · Просмотры: 6
Последнее редактирование:

oleg_nelasy

Участник
Сообщения
664
Реакции
46
@Grey83, проверил работает

Зачем в 86 строке SetClientLanguage(client, iLang[client])?
Если установка идет с 89 по 120. Или просто прибрали все варианты чтоб точно работало?
И можете подсказать откуда появляется !settings просмотрел файл не нашел RegConsoleCmd("sm_settings "...
Сообщения автоматически склеены:

Проверить sm < 11 нету возможности.
 
Последнее редактирование:

Grey83

не пишу плагины с весны 2022
Сообщения
8,517
Реакции
4,979
И можете подсказать откуда появляется !settings
Это команда дефолтного плагина SM clientprefs.
Сообщения автоматически склеены:

чтоб точно работало
именно
Сообщения автоматически склеены:

С 90-й по 109-ю строки для компиляции SM1.8 - 1.10.
Версии SM1.11 и новее будут компилить кусок с 111-й строки по 119-ю вместо указаных выше.
Просто сделал чтобы для разных версий SM использовался более подходящий кусок кода.
 
Последнее редактирование:

oleg_nelasy

Участник
Сообщения
664
Реакции
46
Это команда дефолтного плагина SM clientprefs.
Сообщения автоматически склеены:
Объясните пожалуйста как интегрируете свое меню в SM clientprefs. Просматривал код так и не понял. Интересно если буду в будущем что то свое делать.
 
Сверху Снизу