[CS:GO] Blocker Passes Fix Menu

smoke96

Участник
Сообщения
1,134
Реакции
175
В общем есть кусок кода который создаёт меню предметов в плагине Blocker Passes , весь плагин не буду выкладывать так как он переписанный. А вот с меню не могу разобраться.
PHP:
LoadPropsMenu()
{
    h_PropsMenu = CreateMenu(PropMenuHandler);
    SetMenuTitle(h_PropsMenu, "| Меню предметов |");
    SetMenuExitButton(h_PropsMenu, true);
    SetMenuExitBackButton(h_PropsMenu, true);
   
    decl String:file[255];
    new Handle:kv = CreateKeyValues("Props");
    BuildPath(Path_SM, file, sizeof(file), "data/blocker_passes/props_menu.txt");
    FileToKeyValues(kv, file);
    new menu_items = 5;
    new reqmenuitems = 5;
   
    if (KvGotoFirstSubKey(kv))
    {
        new index = 0;
        decl String:buffer[255];
        decl String:bufferindex[5];
        do {
            if (menu_items == reqmenuitems)
            {
                menu_items = 0;
                AddMenuItem(h_PropsMenu, "rote", "[Повернуть предмет]");
                AddMenuItem(h_PropsMenu, "remove", "[Удалить предмет]");
                AddMenuItem(h_PropsMenu, "", "", ITEMDRAW_SPACER);
            }
            menu_items++;
            KvGetString(kv, "model", g_sPropList[index], 256);
           
            PrecacheModel(g_sPropList[index]);
           
            KvGetSectionName(kv, buffer, sizeof(buffer));
            IntToString(index, bufferindex, sizeof(bufferindex));
            AddMenuItem(h_PropsMenu, bufferindex, buffer);
            index++;
        }
        while (KvGotoNextKey(kv));
    }
    CloseHandle(kv);
   
}
Проблема в том, что пункты Повернуть и Удалить предметы должны быть статически 1 и 2 соответственно , то есть листаешь станицу а они у тебя всегда 1 и 2 в меню. Сейчас же у меня они скачут по меню , по 4 и 5 то 2 и 3 и тд. Короче нужно зафиксировать пункты Повернуть и Удалить предметы на страницах и они должны быть первые. Заранее спасибо. Думаю внятно объяснил.
20161208124936_1.jpg 20161208124939_1.jpg 20161208124950_1.jpg
 

smoke96

Участник
Сообщения
1,134
Реакции
175

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,756
new menu_items = 5;
new
reqmenuitems = 5;

if (
KvGotoFirstSubKey(kv))
{
new
index = 0;
decl String:buffer[255];
decl String:bufferindex[5];
do {
if (
menu_items == reqmenuitems)
{
menu_items = 0;
AddMenuItem(h_PropsMenu, "rote", "[Повернуть предмет]");
AddMenuItem(h_PropsMenu, "remove", "[Удалить предмет]");
AddMenuItem(h_PropsMenu, "", "", ITEMDRAW_SPACER);
}
menu_items++;
PHP:
if (KvGotoFirstSubKey(kv))
    {
        new index = 0;
        decl String:buffer[255];
        decl String:bufferindex[5];
        AddMenuItem(h_PropsMenu, "rote", "[Повернуть предмет]");
        AddMenuItem(h_PropsMenu, "remove", "[Удалить предмет]");
        AddMenuItem(h_PropsMenu, "", "", ITEMDRAW_SPACER);
        do {
 

smoke96

Участник
Сообщения
1,134
Реакции
175
PHP:
if (KvGotoFirstSubKey(kv))
    {
        new index = 0;
        decl String:buffer[255];
        decl String:bufferindex[5];
        AddMenuItem(h_PropsMenu, "rote", "[Повернуть предмет]");
        AddMenuItem(h_PropsMenu, "remove", "[Удалить предмет]");
        AddMenuItem(h_PropsMenu, "", "", ITEMDRAW_SPACER);
        do {
Теперь пункты повернуть и удалить только на 1-й странице меню. А нужно чтобы были на всех.
 

gibs

Фитиль народного волненья
Сообщения
722
Реакции
407
Мошенник
@B1g, если честно, я помогать не особо люблю. Мне больше нравится заставлять думать.
И так, поможем вам придумывать нормальные алгоритмы)
Вот вопрос, почему все стараются всё налепить на кучу, будто с целью экономить строчки? Вероятно, пользователи этого форума назовут даже этот подход своим любимым словом "оптимизация". Но, увы, это не так.
В данном случае разумней было бы сперва обойти конфиг, добавить пункты в меню, а затем, в зависимости от количества пунктов, которые имеются, вставить дополнительные требуемые пункты с помощью функции InsertMenuItem() . То-есть не глупо всё пересчитывать, а пусть вместо нас это делает цикл. Итого для количество пунктов на странице в ксго функция должна примерно выглядеть вот так:
PHP:
LoadPropsMenu()
{
    h_PropsMenu = CreateMenu(PropMenuHandler);
    SetMenuTitle(h_PropsMenu, "| Меню предметов |");
    SetMenuExitButton(h_PropsMenu, true);
    SetMenuExitBackButton(h_PropsMenu, true);
   
    decl String:file[255];
    new Handle:kv = CreateKeyValues("Props");
    BuildPath(Path_SM, file, sizeof(file), "data/blocker_passes/props_menu.txt");
    FileToKeyValues(kv, file);
   
    if (KvGotoFirstSubKey(kv))
    {
        decl String:buffer[255];
        decl String:bufferindex[5];
        new index = 0;
        do
        {
            KvGetString(kv, "model", g_sPropList[index], 256);
           
            PrecacheModel(g_sPropList[index]);
           
            KvGetSectionName(kv, buffer, sizeof(buffer));
            IntToString(index, bufferindex, sizeof(bufferindex));
            AddMenuItem(h_PropsMenu, bufferindex, buffer);
            index++;
        }
        while (KvGotoNextKey(kv));
    }
    CloseHandle(kv);
   
    new itemCount = GetMenuItemCount(h_PropsMenu);
    if(itemCount)
    {
        new pageCount = RoundToCeil(float(itemCount) / 3.0);
        for (new i = 0, pos; i < pageCount; i++)
        {
            pos = i * 6;
            InsertMenuItem(h_PropsMenu, pos, "rote", "[Повернуть предмет]");
            InsertMenuItem(h_PropsMenu, pos + 1, "remove", "[Удалить предмет]");
            InsertMenuItem(h_PropsMenu, pos + 2, "", "", ITEMDRAW_SPACER);
        }
    }
}
 

Серый™

CS:S Server
Сообщения
2,925
Реакции
1,377
SetMenuExitButton(h_PropsMenu, true);
SetMenuExitBackButton(h_PropsMenu, true);
Зачем так?
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,606
Реакции
5,096
Для чего ты делаешь AddMenuItem(h_PropsMenu, "", "", ITEMDRAW_SPACER)?!
Не проще ли сделать AddMenuItem(h_PropsMenu, "remove", "[Удалить предмет]\n ") вместо AddMenuItem(h_PropsMenu, "remove", "[Удалить предмет]")?
Будет тот же пробел м/у пунктами, заодно на 1 пункт в списке будет больше
 

smoke96

Участник
Сообщения
1,134
Реакции
175
SetMenuExitButton(h_PropsMenu, true);
SetMenuExitBackButton(h_PropsMenu, true);
Зачем так?
Если не так , то как :?)
--- Добавлено позже ---
Для чего ты делаешь AddMenuItem(h_PropsMenu, "", "", ITEMDRAW_SPACER)?!
Не проще ли сделать AddMenuItem(h_PropsMenu, "remove", "[Удалить предмет]\n ") вместо AddMenuItem(h_PropsMenu, "remove", "[Удалить предмет]")?
Будет тот же пробел м/у пунктами, заодно на 1 пункт в списке будет больше
Не работает.
--- Добавлено позже ---
@B1g, если честно, я помогать не особо люблю. Мне больше нравится заставлять думать.
И так, поможем вам придумывать нормальные алгоритмы)
Вот вопрос, почему все стараются всё налепить на кучу, будто с целью экономить строчки? Вероятно, пользователи этого форума назовут даже этот подход своим любимым словом "оптимизация". Но, увы, это не так.
В данном случае разумней было бы сперва обойти конфиг, добавить пункты в меню, а затем, в зависимости от количества пунктов, которые имеются, вставить дополнительные требуемые пункты с помощью функции InsertMenuItem() . То-есть не глупо всё пересчитывать, а пусть вместо нас это делает цикл. Итого для количество пунктов на странице в ксго функция должна примерно выглядеть вот так:
PHP:
LoadPropsMenu()
{
    h_PropsMenu = CreateMenu(PropMenuHandler);
    SetMenuTitle(h_PropsMenu, "| Меню предметов |");
    SetMenuExitButton(h_PropsMenu, true);
    SetMenuExitBackButton(h_PropsMenu, true);
  
    decl String:file[255];
    new Handle:kv = CreateKeyValues("Props");
    BuildPath(Path_SM, file, sizeof(file), "data/blocker_passes/props_menu.txt");
    FileToKeyValues(kv, file);
  
    if (KvGotoFirstSubKey(kv))
    {
        decl String:buffer[255];
        decl String:bufferindex[5];
        new index = 0;
        do
        {
            KvGetString(kv, "model", g_sPropList[index], 256);
          
            PrecacheModel(g_sPropList[index]);
          
            KvGetSectionName(kv, buffer, sizeof(buffer));
            IntToString(index, bufferindex, sizeof(bufferindex));
            AddMenuItem(h_PropsMenu, bufferindex, buffer);
            index++;
        }
        while (KvGotoNextKey(kv));
    }
    CloseHandle(kv);
  
    new itemCount = GetMenuItemCount(h_PropsMenu);
    if(itemCount)
    {
        new pageCount = RoundToCeil(float(itemCount) / 3.0);
        for (new i = 0, pos; i < pageCount; i++)
        {
            pos = i * 6;
            InsertMenuItem(h_PropsMenu, pos, "rote", "[Повернуть предмет]");
            InsertMenuItem(h_PropsMenu, pos + 1, "remove", "[Удалить предмет]");
            InsertMenuItem(h_PropsMenu, pos + 2, "", "", ITEMDRAW_SPACER);
        }
    }
}
Спасибо сделал :)
 
Последнее редактирование модератором:

Серый™

CS:S Server
Сообщения
2,925
Реакции
1,377
@B1g,
SetMenuExitButton(h_PropsMenu, true); // тока кнопка выход
SetMenuExitBackButton(h_PropsMenu, true); // кнопки выход и назад
И использовать что то одно. Сей час же у тебя перебивается последним.
 

gibs

Фитиль народного волненья
Сообщения
722
Реакции
407
Мошенник
@AlmazON, и чё, второй переход лишний, достаточно пробела.
 

smoke96

Участник
Сообщения
1,134
Реакции
175
@B1g,
SetMenuExitButton(h_PropsMenu, true); // тока кнопка выход
SetMenuExitBackButton(h_PropsMenu, true); // кнопки выход и назад
И использовать что то одно. Сей час же у тебя перебивается последним.
Спасибо исправил.
а ты после перевода строки пробел поставить не забыл?
Забыл.
Вообще-то ставят так:
C-подобный:
\n \n
Так тоже работает но и с пробелом после одного \n работает.
@AlmazON, и чё, второй переход лишний, достаточно пробела.
Спасибо :)
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,606
Реакции
5,096
сразу видно пробел
В нормальных текстовых редакторах можно включить отображение пробелов.
У меня, например, даже выделяются разным цветом фона символы пробела и табуляции.
 
Сверху Снизу