Не очень удачная модификация Map Manager Modular

Статус
В этой теме нельзя размещать новые ответы.
Сообщения
499
Реакции
271
Помог
6 раз(а)
По некоторым причинам понадобилось добавить в меню номинации Map Manager пороги онлайна, при которых карта появится в голосовании. Порылся в коде, сделал. Пороги показываются, всё красиво, всё замечательно, но не номинируется карта теперь) К её названию добавляются пороги и соответственно, плагин не находит карту в ini. Я так понял проблему, но не понял, где я накосячил.

Было:
Код:
show_nomination_menu(id, Array:maplist, custom_title[] = "")
{
    new text[64];
    if(!custom_title[0]) {
        formatex(text, charsmax(text), "%L", LANG_PLAYER, "MAPM_MENU_MAP_LIST");
    } else {
        formatex(text, charsmax(text), "%s", custom_title);
    }
    new menu = menu_create(text, "mapslist_handler");
    
    new map_info[MapStruct], item_info[48], block_count, size = ArraySize(maplist);
    new random_sort = get_num(RANDOM_SORT), Array:array = ArrayCreate(1, 1);

    for(new i = 0, index, nom_index; i < size; i++) {
        if(random_sort) {
            do {
                index = random_num(0, size - 1);
            } while(in_array(array, index));
            ArrayPushCell(array, index);
        } else {
            index = i;
        }

        ArrayGetArray(maplist, index, map_info);
        nom_index = map_nominated(map_info[MapName]);
        block_count = mapm_get_blocked_count(map_info[MapName]);
        
        if(block_count) {
            formatex(item_info, charsmax(item_info), "%s[\r%d\d]", map_info[MapName], block_count);
            menu_additem(menu, item_info, .callback = g_hCallbackDisabled);
        } else if(nom_index != INVALID_MAP_INDEX) {
            new nom_info[NomStruct]; ArrayGetArray(g_aNomList, nom_index, nom_info);
            if(id == nom_info[NomPlayer]) {
                formatex(item_info, charsmax(item_info), "%s[\y*\w]", map_info[MapName]);
                menu_additem(menu, item_info);
            } else {
                formatex(item_info, charsmax(item_info), "%s[\y*\d]", map_info[MapName]);
                menu_additem(menu, item_info, .callback = g_hCallbackDisabled);
            }
        } else {
            menu_additem(menu, map_info[MapName]);
        }
    }

    ArrayDestroy(array);

    formatex(text, charsmax(text), "%L", id, "MAPM_MENU_BACK");
    menu_setprop(menu, MPROP_BACKNAME, text);
    formatex(text, charsmax(text), "%L", id, "MAPM_MENU_NEXT");
    menu_setprop(menu, MPROP_NEXTNAME, text);
    formatex(text, charsmax(text), "%L", id, "MAPM_MENU_EXIT");
    menu_setprop(menu, MPROP_EXITNAME, text);
    
    menu_display(id, menu);
}
bool:in_array(Array:array, index)
{
    for(new i, size = ArraySize(array); i < size; i++) {
        if(ArrayGetCell(array, i) == index) {
            return true;
        }
    }
    return false;
}
public mapslist_handler(id, menu, item)
{
    if(item == MENU_EXIT) {
        menu_destroy(menu);
        return PLUGIN_HANDLED;
    }
    
    new item_info[8], item_name[MAPNAME_LENGTH + 16], access, callback;
    menu_item_getinfo(menu, item, access, item_info, charsmax(item_info), item_name, charsmax(item_name), callback);
    
    trim_bracket(item_name);
    new nominated = nominate_map(id, item_name);
    
    if(g_iNomMaps[id] < get_num(MAPS_PER_PLAYER) || get_num(DONT_CLOSE_MENU)) {
        if(nominated == NOMINATION_SUCCESS) {
            format(item_name, charsmax(item_name), "%s[\y*\w]", item_name);
            menu_item_setname(menu, item, item_name);
        } else if(nominated == NOMINATION_REMOVED) {
            menu_item_setname(menu, item, item_name);
        }
        menu_display(id, menu, item / 7);
    } else {
        menu_destroy(menu);
    }
    
    return PLUGIN_HANDLED;
}
Стало:
Код:
show_nomination_menu(id, Array:maplist, custom_title[] = "")
{
    new text[64];
    if(!custom_title[0]) {
        formatex(text, charsmax(text), "%L", LANG_PLAYER, "MAPM_MENU_MAP_LIST");
    } else {
        formatex(text, charsmax(text), "%s", custom_title);
    }
    new menu = menu_create(text, "mapslist_handler");
    menu_setprop(menu, MPROP_NUMBER_COLOR, "\w");
    
    new map_info[MapStruct], item_info[48], block_count, size = ArraySize(maplist);
    new random_sort = get_num(RANDOM_SORT), Array:array = ArrayCreate(1, 1);

    for(new i = 0, index, nom_index; i < size; i++) {
        if(random_sort) {
            do {
                index = random_num(0, size - 1);
            } while(in_array(array, index));
            ArrayPushCell(array, index);
        } else {
            index = i;
        }

        ArrayGetArray(maplist, index, map_info);
        nom_index = map_nominated(map_info[MapName]);
        block_count = mapm_get_blocked_count(map_info[MapName]);
        
        if(block_count) {
            formatex(item_info, charsmax(item_info), "%s (%d-%d) [\r%d\d]", map_info[MapName], map_info[MinPlayers], map_info[MaxPlayers], block_count);
            menu_additem(menu, item_info, .callback = g_hCallbackDisabled);
        } else if(nom_index != INVALID_MAP_INDEX) {
            new nom_info[NomStruct]; ArrayGetArray(g_aNomList, nom_index, nom_info);
            if(id == nom_info[NomPlayer]) {
                formatex(item_info, charsmax(item_info), "%s (%d-%d) [\y*\w]", map_info[MapName], map_info[MinPlayers], map_info[MaxPlayers]);
                menu_additem(menu, item_info);
            } else {
                formatex(item_info, charsmax(item_info), "%s (%d-%d) [\y*\d]", map_info[MapName], map_info[MinPlayers], map_info[MaxPlayers]);
                menu_additem(menu, item_info, .callback = g_hCallbackDisabled);
            }
        } else {
            formatex(item_info, charsmax(item_info), "%s (%d-%d)", map_info[MapName], map_info[MinPlayers], map_info[MaxPlayers]);
            menu_additem(menu, item_info);
        }
    }

    ArrayDestroy(array);

    formatex(text, charsmax(text), "%L", id, "MAPM_MENU_BACK");
    menu_setprop(menu, MPROP_BACKNAME, text);
    formatex(text, charsmax(text), "%L", id, "MAPM_MENU_NEXT");
    menu_setprop(menu, MPROP_NEXTNAME, text);
    formatex(text, charsmax(text), "%L", id, "MAPM_MENU_EXIT");
    menu_setprop(menu, MPROP_EXITNAME, text);
    
    menu_display(id, menu);
}
bool:in_array(Array:array, index)
{
    for(new i, size = ArraySize(array); i < size; i++) {
        if(ArrayGetCell(array, i) == index) {
            return true;
        }
    }
    return false;
}
public mapslist_handler(id, menu, item)
{
    if(item == MENU_EXIT) {
        menu_destroy(menu);
        return PLUGIN_HANDLED;
    }
    
    new item_info[8], item_name[MAPNAME_LENGTH + 16], access, callback;
    menu_item_getinfo(menu, item, access, item_info, charsmax(item_info), item_name, charsmax(item_name), callback);
    
    trim_bracket(item_name);
    new nominated = nominate_map(id, item_name);
    
    if(g_iNomMaps[id] < get_num(MAPS_PER_PLAYER) || get_num(DONT_CLOSE_MENU)) {
        if(nominated == NOMINATION_SUCCESS) {
            format(item_name, charsmax(item_name), "%s [\y*\w]", item_name);
            menu_item_setname(menu, item, item_name);
        } else if(nominated == NOMINATION_REMOVED) {
            menu_item_setname(menu, item, item_name);
        }
        menu_display(id, menu, item / 7);
    } else {
        menu_destroy(menu);
    }
    
    return PLUGIN_HANDLED;
}
 
Сообщения
2,491
Реакции
2,794
Помог
61 раз(а)
У вас не самая свежая версия.
Причина в том, что в названии пункта как раз хранится имя карты, которое позже обрезается и получается его значение. Вы же изменив тайтл пункта, сделали невозможным дальше обрезаение (ищите trim_bracket)
Не тестировал. Пробуйте сами
Код:
show_nomination_menu(id, Array:maplist, custom_title[] = "")
{
    new text[64];
    if(!custom_title[0]) {
        formatex(text, charsmax(text), "%L", LANG_PLAYER, "MAPM_MENU_MAP_LIST");
    } else {
        formatex(text, charsmax(text), "%s", custom_title);
    }
    new menu = menu_create(text, "mapslist_handler");
    menu_setprop(menu, MPROP_NUMBER_COLOR, "\w");
    
    new map_info[MapStruct], item_info[48], block_count, size = ArraySize(maplist);
    new random_sort = get_num(RANDOM_SORT), Array:array = ArrayCreate(1, 1);

    for(new i = 0, index, nom_index; i < size; i++) {
        if(random_sort) {
            do {
                index = random_num(0, size - 1);
            } while(in_array(array, index));
            ArrayPushCell(array, index);
        } else {
            index = i;
        }

        ArrayGetArray(maplist, index, map_info);
        nom_index = map_nominated(map_info[MapName]);
        block_count = mapm_get_blocked_count(map_info[MapName]);
        
        if(block_count) {
            formatex(item_info, charsmax(item_info), "%s (%d-%d) [\r%d\d]", map_info[MapName], map_info[MinPlayers], map_info[MaxPlayers], block_count);
            menu_additem(menu, item_info, map_info[MapName], .callback = g_hCallbackDisabled);
        } else if(nom_index != INVALID_MAP_INDEX) {
            new nom_info[NomStruct]; ArrayGetArray(g_aNomList, nom_index, nom_info);
            if(id == nom_info[NomPlayer]) {
                formatex(item_info, charsmax(item_info), "%s (%d-%d) [\y*\w]", map_info[MapName], map_info[MinPlayers], map_info[MaxPlayers]);
                menu_additem(menu, item_info, map_info[MapName]);
            } else {
                formatex(item_info, charsmax(item_info), "%s (%d-%d) [\y*\d]", map_info[MapName], map_info[MinPlayers], map_info[MaxPlayers]);
                menu_additem(menu, item_info, map_info[MapName], .callback = g_hCallbackDisabled);
            }
        } else {
            formatex(item_info, charsmax(item_info), "%s (%d-%d)", map_info[MapName], map_info[MinPlayers], map_info[MaxPlayers]);
            menu_additem(menu, item_info, map_info[MapName]);
        }
    }

    ArrayDestroy(array);

    formatex(text, charsmax(text), "%L", id, "MAPM_MENU_BACK");
    menu_setprop(menu, MPROP_BACKNAME, text);
    formatex(text, charsmax(text), "%L", id, "MAPM_MENU_NEXT");
    menu_setprop(menu, MPROP_NEXTNAME, text);
    formatex(text, charsmax(text), "%L", id, "MAPM_MENU_EXIT");
    menu_setprop(menu, MPROP_EXITNAME, text);
    
    menu_display(id, menu);
}
bool:in_array(Array:array, index)
{
    for(new i, size = ArraySize(array); i < size; i++) {
        if(ArrayGetCell(array, i) == index) {
            return true;
        }
    }
    return false;
}
public mapslist_handler(id, menu, item)
{
    if(item == MENU_EXIT) {
        menu_destroy(menu);
        return PLUGIN_HANDLED;
    }
    
    new item_info[8], item_name[MAPNAME_LENGTH + 16], access, callback;
    menu_item_getinfo(menu, item, access, item_info, charsmax(item_info), item_name, charsmax(item_name), callback);
    
    new nominated = nominate_map(id, item_info);
    
    if(g_iNomMaps[id] < get_num(MAPS_PER_PLAYER) || get_num(DONT_CLOSE_MENU)) {
        if(nominated == NOMINATION_SUCCESS) {
            format(item_name, charsmax(item_name), "%s [\y*\w]", item_info);
            menu_item_setname(menu, item, item_name);
        } else if(nominated == NOMINATION_REMOVED) {
            menu_item_setname(menu, item, item_name);
        }
        menu_display(id, menu, item / 7);
    } else {
        menu_destroy(menu);
    }
    
    return PLUGIN_HANDLED;
}
25 Янв 2019
CHEL74, UPD: тут написали мне что множество ошибок я допустил. Так что с кодом будьте внимательней. У меня нету возможности на даный момент запустить его и проверить на работоспособность
 
Сообщения
499
Реакции
271
Помог
6 раз(а)
fantom, на тестовом серве запустил попробовал, названия обрезаются при номинации и после снятия всё остаётся как есть. К такому меня жизнь не готовила.

5.PNG
26 Янв 2019
fantom, в общем изменения, которые вы внесли меня ещё больше запутали) Ступор и не понимание, как это фиксить.
 
Сообщения
333
Реакции
290
Помог
9 раз(а)
CHEL74, строка 407
new item_info[8] размер увеличить. Но, от дальнейших проблем это не спасет
 
Сообщения
499
Реакции
271
Помог
6 раз(а)
Решили проблему просто и красиво с BlackSignature, за что ему огромное спасибо!) Тему можно закрывать.
 
Сообщения
1,293
Реакции
2,294
Помог
57 раз(а)
Кому интересно: разбивка строки в хендлере меню функцией trim_bracket() выполняется, по символу '['. Аля de_dust2[УПЯЧКА] превращался ей в de_dust2, и передавался уже в функцию номинации. ТС юзал круглые скобки, соотвественно, ничего не отсекалось. Я предложил форматирование в меню переделать, добавить между именем карты и тех. инфой обязательный пробел, и разбивать строку по нему.
 
Статус
В этой теме нельзя размещать новые ответы.

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу