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

Ice_Sochi

Участник
Сообщения
709
Реакции
413
  • Автор ресурса
  • #1
Ice_Sochi добавил(а) новый ресурс:

Server Menu - Обычное меню сервера

Самое обыкновенное мультиязычное меню сервера

Нужно лишь настроить конфиг и добавить пункты в файл перевода в соответствии с примером:
"menu"
{
    "commands"        "com;menu;commands"        //команды открытия меню (макс 8)
    
    "items"
    {
        //"команда"        "название в файле перевода"
        "sm_shop"        "shop"
        "sm_lvl"        "lvl_ranks"
        "sm_vip"        "vip"
        //...
    }
}

Узнать больше об этом ресурсе...
 

Grey83

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

Теперь меню создаётся только раз при запуске конфига (и соответственно конфиг читается только раз).
При открытии меню оно переводится на лету для открывшего игрока.

UPD Перезалил исходник (исправил отображение названия меню).
 

Вложения

  • server_menu 1.1.1_16.05.2024.sp
    2.4 КБ · Просмотры: 11
Последнее редактирование:

Ice_Sochi

Участник
Сообщения
709
Реакции
413
  • Автор ресурса
  • #4
Пошерстил чуток код.

Теперь меню создаётся только раз при запуске конфига (и соответственно конфиг читается только раз).
При открытии меню оно переводится на лету для открывшего игрока.
C-подобный:
hMenu = CreateMenu(Menu_ServerMenu, MenuAction_Display|MenuAction_DisplayItem);
MenuAction_Select и MenuAction_End не нужно указывать?

C-подобный:
hOptions.GetSectionName(sBuffs[0], sizeof(sBuffs[]));
hOptions.GetString(NULL_STRING, buffer, sizeof(buffer));
Вот тут не понимаю. Если мы находимся на ключе sBuffs[0](false), то, чтобы получить текущую строку, можно не прыгать заново по кв, а просто указать NULL_STRING?

C-подобный:
case MenuAction_Display:
{
    menu.SetTitle("%T", "no_items", client);
}
С фразой опечатка?

C-подобный:
if(strlen(buffer) < 1) SetFailState("The config does not contain any commands.", buffer);
if(i < 1) SetFailState("The config does not contain valid commands.", buffer);
А для чего два раза отправлять сообщение об ошибке, разве первой строки не хватит?

C-подобный:
while(i > 0) if(sBuffs[--i][0]) RegConsoleCmd(sBuffs[i], Cmd_Menu);
Ну это просто гениально, серьезно

Жаль, что не знал некоторые фичи, придется огромный плагин, которым занимаюсь, в очередной раз переделывать.
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,517
Реакции
4,979
MenuAction_Select и MenuAction_End не нужно указывать?
нет: они самим SM автоматически добавляется.
Если мы находимся на ключе sBuffs[0](false), то, чтобы получить текущую строку, можно не прыгать заново по кв, а просто указать NULL_STRING?
да
C-подобный:
case MenuAction_Display:
{
    menu.SetTitle("%T", "no_items", client);
}
С фразой опечатка?
упс
А для чего два раза отправлять сообщение об ошибке, разве первой строки не хватит?
это на тот случай, если строка будет состоять из символов «;»
C-подобный:
while(i > 0) if(sBuffs[--i][0]) RegConsoleCmd(sBuffs[i], Cmd_Menu);
Ну это просто гениально, серьезно
главное чтобы работало, как было задумано
Жаль, что не знал некоторые фичи, придется огромный плагин, которым занимаюсь, в очередной раз переделывать.
я до многих вещей тоже далеко не сразу дошёл
Сообщения автоматически склеены:

Перезалил исходник выше с исправлением названия меню.

Вообще хорошо бы работоспособность проверить, т.к. я не тестил (только проверял компилиться ли). Вдруг какой косяк вылезет.

Ну и на счёт проверки строки команд: там бы сделать проверку на наличие допустимых символов в команде (пробелов, например, быть не должно), перед её добавлением.
 
Последнее редактирование:

Ice_Sochi

Участник
Сообщения
709
Реакции
413
  • Автор ресурса
  • #6
Вообще хорошо бы работоспособность проверить, т.к. я не тестил (только проверял компилиться ли). Вдруг какой косяк вылезет.

Ну и на счёт проверки строки команд: там бы сделать проверку на наличие допустимых символов в команде (пробелов, например, быть не должно), перед её добавлением.
Ночью посмотрю и обновлю ресурс
А как можно проверить запрещенные символы? Добавить все латинские буквы в массив и прлверять каждый символ строки на его нахождение там?
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,517
Реакции
4,979
@Ice_Sochi, в массив не обязательно: они же по порядку расположены.
Достаточно проверить входят ли символы в какой-то диапазон.
Правда с кириллицей уже немного сложнее: там 2 символа на букву.
 

Ice_Sochi

Участник
Сообщения
709
Реакции
413
  • Автор ресурса
  • #8
@Ice_Sochi, в массив не обязательно: они же по порядку расположены.
Достаточно проверить входят ли символы в какой-то диапазон.
Правда с кириллицей уже немного
Сможете пример привести? Я не могу придумать способ, кроме как
C-подобный:
char sbuffer[1], stext[...];

int i = strlen(stext) - 1;

while (i >= 0)
{
      FormatEx(sbuffer, 1, "%s", stext[i]);
      if(hArray.FindString(sbuffer) >= 0) continue; //hArray содержит все латинские буквы
      ReplaceString(stext, sizeof(stext), sbuffer, "", false);
      i--;
}
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,517
Реакции
4,979
@Ice_Sochi, ну для перебора символов не нужно определять длину текста: достаточно проверять не равен символ нулю (в соурспавне используется строка заканчивающаяся нулём).

Что-то типа такого:
C-подобный:
char buffer[] = "qwertyuiop";

int i = -1;
while(buffer[++i])
{
    if(’a’ <= buffer[i] <= ’Z’)
        continue;
    else
    {
        buffer[i] = 0;
        break;
    }
}
Этот код должен заменять любой символ, не являющийся буквой латиницы, на символ окончания строки. Т.е. обрезает строку.
Хотя в SM есть функция определения является ли символ буквой.
Я вообще делал себе плагин, который выводит в консоль все символы из одного байта.
Что-то типа такого:
C-подобный:
int i;
while(++i < 256) PrintToServer("%3i) \"%c\"", i, i);
Емнип 10 - это перевод строки. А буквы где-то на 30+ начинаются (сначала разные знаки идут).
 

Ice_Sochi

Участник
Сообщения
709
Реакции
413
  • Автор ресурса
  • #10
Вообще хорошо бы работоспособность проверить, т.к. я не тестил (только проверял компилиться ли). Вдруг какой косяк вылезет.
Работает, только забыли инициализировать stringmap, и в хендлере меню нужно было вместо 0 указать param
 

696DEATH696

Участник
Сообщения
42
Реакции
1
Предложение: Добавить авто бинд для игроков на кнопку F4 например.
 
Сверху Снизу