[CS:GO] Blocker Passes Fix Menu

Grey83

не пишу плагины с весны 2022
Сообщения
8,606
Реакции
5,096
@AlmazON, ну я-то это уже давно знаю после игр с форматированием менюшек для своих плагинов :cool:

Кто бы сказал почему у меня эти менюшки не отображаются в L4D2 (отключение модов ничего не даёт), а в прочих - всё пучком.
 

DarklSide

Участник
Сообщения
931
Реакции
468
Вот вопрос, почему все стараются всё налепить на кучу, будто с целью экономить строчки?
Не исключено, что если ориентирование поддерживания кода идет на свое усмотрение, в меньшей степени - экономии своего времени, в большей - воздерживание от морального переутомления, т.к. помимо данного сервиса, есть другие источники.

Вероятно, пользователи этого форума назовут даже этот подход своим любимым словом "оптимизация".
Если смотреть на кусок кода ТС и плагин оригинала, то изменения минимальны.
Т.к. автор ТС не является автором оригинального плагина, то после создания своих ветвей изменений и последующие обновления плагина - будет сложнее слияние этих версий.


для количество пунктов на странице в ксго функция должна примерно выглядеть вот так
Поэтому считаю, что изменения должны быть минимальны произведены, иначе если добавлять свои наработки (как в данном случае) или кардинально изменять плагин, это отразится в конечном счете себе не на пользу или в новую тему.
Вышеописанный кусок кода, были сделано возможно мной, сама идея этого сообщения и что подразумевается под "изменения минимальны":

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

PHP:
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));
}

----

P.S.:
Если кому-то нужно для своих нужд, - вырезал без изменений давнишнюю stock функцию (добавлен только синтаксис), которая была написана во времена css, скины csgo.
Циклы можно изменить, дополнить своими нововедениями, но основная концепция в "GetMaxPageItems" - максимальное количество элементов на странице.

Примерное использование:
PHP:
//char sItem[][] =
decl String:sItem[][] =  { "rote", "[Повернуть предмет]", "remove", "[Удалить предмет]\n " };
StaticNumInsertItem(h_PropsMenu, 0, sItem, sizeof(sItem));
PHP:
#if SOURCEMOD_V_MAJOR == 1 && SOURCEMOD_V_MINOR < 7
/**
* Добавление в меню статический(e) элемент(ы) под своим номером.
*
* @param menu                Menu Handle.
* @param startNum            Позиция, начиная с 0.
* @param sItem                Массив, One - Item information string, Two - item display string.
* @param maxSize            Общее кол-во элементов.
* @return                    True on success, false on failure.
* @error                    Invalid Handle or clear menu или если у элемента нет пары (One, Two, One)
*/
stock bool:StaticNumInsertItem(Handle:menu, startNum, const String:sItem[][], maxSize)
{
    if (menu != INVALID_HANDLE)
    {
        new iMenuItemCount = GetMenuItemCount(menu);
        if (iMenuItemCount > 0)
        {
            new iLog = maxSize % 2;
            new iMaxPageItems = GetMaxPageItems(GetMenuStyle(menu));
            //if (!iLog && startNum >= 0 && startNum < iMaxPageItems)
            if (!iLog && startNum >= 0)
            {
                #if defined DEBUG
                LogMessage("iMenuItemCount[%d]", iMenuItemCount);
                LogMessage("iMaxPageItems[%d]", iMaxPageItems);
                LogMessage("maxSize[%d]", maxSize);
                LogMessage("startNum[%d]", startNum);
                LogMessage("##### StartMenu #####");
                #endif
            
                //low
                for (new i = 0, j = startNum; i < maxSize; j++, i += 2)
                {
                    #if defined DEBUG
                    LogMessage("%s %s", sItem[i], sItem[i + 1]);
                    if (!InsertMenuItem(menu, j, sItem[i], sItem[i + 1]))
                    {
                        return false;
                    }
                    #else
                    InsertMenuItem(menu, j, sItem[i], sItem[i + 1]);
                    #endif
                }
            
                new bool:bExit = GetMenuExitButton(menu);
                new bool:bExitandBack = GetMenuExitBackButton(menu);
                if (bExitandBack)
                {
                    iMaxPageItems -= 4;
                }
                else if (bExit)
                {
                    iMaxPageItems -= 3;
                }
                else
                {
                    iMaxPageItems -= 3;
                }
            
                //middle
                new iCount;
                for (iCount = iMaxPageItems + startNum; iCount < GetMenuItemCount(menu); iCount += iMaxPageItems)
                {
                    for (new k = 0, j = iCount; k < maxSize; j++, k += 2)
                    {
                        #if defined DEBUG
                        if (!InsertMenuItem(menu, j, sItem[k], sItem[k + 1]))
                        {
                            return false;
                        }
                        #else
                        InsertMenuItem(menu, j, sItem[k], sItem[k + 1]);
                        #endif
                    }
                }
            
                #if defined DEBUG
                LogMessage("iCount[%d]_ItemCount[%d]", iCount, GetMenuItemCount(menu));
                #endif
            
                //hight
                if ((iCount - GetMenuItemCount(menu)) < startNum) // && startNum < maxSize)
                {
                    for (new i = 0, j = GetMenuItemCount(menu); i < maxSize; j++, i += 2)
                    {
                        #if defined DEBUG
                        //LogMessage("%s %s", sItem[i], sItem[i + 1]);
                        if (!AddMenuItem(menu, sItem[i], sItem[i + 1]))
                        {
                            return false;
                        }
                        #else
                        AddMenuItem(menu, sItem[i], sItem[i + 1]);
                        #endif
                    }
                }
            
                return true;
            }
            else
            {
                LogError("Bad sItem", sItem);
            }
        }
        else
        {
            LogError("Clear Menu");
        }
    }
    return false;
}
#else
/**
* Добавление в меню статический(e) элемент(ы) под своим номером.
*
* @param menu                Menu Handle.
* @param startNum            Позиция, начиная с 0.
* @param sItem                Массив, One - Item information string, Two - item display string.
* @param maxSize            Общее кол-во элементов.
* @return                    True on success, false on failure.
* @error                    Invalid Handle or clear menu или если у элемента нет пары (One, Two, One)
*/
stock bool StaticNumInsertItem(Menu menu, int startNum, const char[][] sItem, int maxSize)
{
    if (menu != INVALID_HANDLE)
    {
        int iMenuItemCount = menu.ItemCount;
        if (iMenuItemCount > 0)
        {
            int iLog = maxSize % 2;
            int iMaxPageItems = GetMaxPageItems(menu.Style);
            //if (!iLog && startNum >= 0 && startNum < iMaxPageItems)
            if (!iLog && startNum >= 0)
            {
                #if defined DEBUG
                LogMessage("iMenuItemCount[%d]", iMenuItemCount);
                LogMessage("iMaxPageItems[%d]", iMaxPageItems);
                LogMessage("maxSize[%d]", maxSize);
                LogMessage("startNum[%d]", startNum);
                LogMessage("##### StartMenu #####");
                #endif
            
                //low
                for (int i = 0, j = startNum; i < maxSize; j++, i += 2)
                {
                    #if defined DEBUG
                    LogMessage("%s %s", sItem[i], sItem[i + 1]);
                    if (!menu.InsertItem(j, sItem[i], sItem[i + 1]))
                    {
                        return false;
                    }
                    #else
                    menu.InsertItem(j, sItem[i], sItem[i + 1]);
                    #endif
                }
            
                bool bExit = menu.ExitButton;
                bool bExitandBack = menu.ExitBackButton;
                if (bExitandBack)
                {
                    iMaxPageItems -= 4;
                }
                else if (bExit)
                {
                    iMaxPageItems -= 3;
                }
                else
                {
                    iMaxPageItems -= 3;
                }
            
                //middle
                int iCount;
                for (iCount = iMaxPageItems + startNum; iCount < menu.ItemCount; iCount += iMaxPageItems)
                {
                    for (int k = 0, j = iCount; k < maxSize; j++, k += 2)
                    {
                        #if defined DEBUG
                        if (!menu.InsertItem(j, sItem[k], sItem[k + 1]))
                        {
                            return false;
                        }
                        #else
                        menu.InsertItem(j, sItem[k], sItem[k + 1]);
                        #endif
                    }
                }
            
                #if defined DEBUG
                LogMessage("iCount[%d]_ItemCount[%d]", iCount, menu.ItemCount);
                #endif
            
                //hight
                if ((iCount - menu.ItemCount) < startNum) // && startNum < maxSize)
                {
                    for (int i = 0, j = menu.ItemCount; i < maxSize; j++, i += 2)
                    {
                        #if defined DEBUG
                        //LogMessage("%s %s", sItem[i], sItem[i + 1]);
                        if (!menu.AddItem(sItem[i], sItem[i + 1]))
                        {
                            return false;
                        }
                        #else
                        menu.AddItem(sItem[i], sItem[i + 1]);
                        #endif
                    }
                }
            
                return true;
            }
            else
            {
                LogError("Bad sItem", sItem);
            }
        }
        else
        {
            LogError("Clear Menu");
        }
    }
    return false;
}
#endif

Скрины по парам: 1# - первая страница, #2 - последняя, всего пять пар.
Первая пара startNum = 0, втарая startNum = 1 и т.д.
Между 1# страницы и до последней #2, пункты меню статичны.

0_1.png 0_end.png 1_1.png 1_end.png 2_1.png 2_end.png 3_1.png 3_end.png 4_1.png 4_end.png
 
Последнее редактирование:

gibs

Фитиль народного волненья
Сообщения
722
Реакции
407
Мошенник
@DarklSide, бессмыслица)
Честно, не понимаю зачем ты отвечал на мои вопросы, которые в действительности являются риторическими.
И даже не представляю зачем ТСу заниматься слиянием двух версий.
 

DarklSide

Участник
Сообщения
931
Реакции
468
Честно, не понимаю зачем ты отвечал на мои вопросы

Вышеописанный кусок кода, были сделано возможно мной, сама идея этого сообщения и что подразумевается под "изменения минимальны":

PHP:
new menu_items = 0;
new reqmenuitems = 4;
    
if (KvGotoFirstSubKey(kv))
{
    new index = 0;
    decl String:buffer[255];
    decl String:bufferindex[5];
    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++;
        menu_items++;
        if (menu_items == reqmenuitems)
        {
            menu_items = 0;
            AddMenuItem(h_PropsMenu, "",     "", ITEMDRAW_SPACER);
            AddMenuItem(h_PropsMenu, "rote",     "[Повернуть предмет]");
            AddMenuItem(h_PropsMenu, "remove",     "[Удалить предмет]");
        }
    }
    while (KvGotoNextKey(kv));
}
PHP:
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));
}
и описывает почему не использовал "InsertMenuItem", или "StaticNumInsertItem".
 
Сверху Снизу