Статус темы:
Закрыта.
  1. Phantom Команда форума

    Регистрация:
    27.02.15
    Сообщения:
    1.692
    Симпатии:
    797
    Пол:
    Мужской
    Telegram:
    ph4nt0m
    Всем привет
    Собственно маленькая проблемка: при попытке создать голосование за карту через amxmodmenu меню с выбором карт сразу же закрывается. Не успеваю ничего выбрать, закрывается с надписью в чат Голосование не состоялось.
    Исходник ниже


    З.Ы Т.к в одном сообщении стоит ограничение в 15000 символов, исходник делю на 2 части
    Код:
    #include <amxmodx>
    #include <amxmisc>
    
    new Array:g_mapName;
    new g_mapNums
    new g_menuPosition[33]
    new g_voteCount[5]
    new g_voteSelected[33][4]
    new g_voteSelectedNum[33]
    new g_coloredMenus
    new g_choosed
    
    public plugin_init()
    {
            register_plugin("Maps Menu", AMXX_VERSION_STR, "AMXX Dev Team")
            register_dictionary("common.txt")
            register_clcmd("amx_mapmenu", "cmdMapsMenu", ADMIN_MAP, "- displays changelevel menu")
            register_clcmd("amx_votemapmenu", "cmdVoteMapMenu", ADMIN_VOTE, "- displays votemap menu")
    
            register_menucmd(register_menuid("Меню смены карты"), 1023, "actionMapsMenu")
        register_menucmd(register_menuid("Menu"), 1023, "actionVoteMapMenu")
            register_menucmd(register_menuid("Какую карту вы бы хотели?"), 527, "voteCount")
            register_menucmd(register_menuid("Сменить карту на"), 527, "voteCount")
            register_menucmd(register_menuid("Большинство игроков выбрало"), 3, "actionResult")
    
            g_mapName=ArrayCreate(32);
       
            new maps_ini_file[64];
            get_configsdir(maps_ini_file, 63);
            format(maps_ini_file, 63, "%s/map_list.ini", maps_ini_file);
       
            load_settings(maps_ini_file)
    
            g_coloredMenus = colored_menus()
    }
    
    public autoRefuse()
    {
            log_amx("Administrator doesn't change the map")
            client_print(0, print_chat, "Голосование завершено. Администратор не сменит карту")
    }
    
    public actionResult(id, key)
    {
            remove_task(4545454)
       
            switch (key)
            {
                    case 0:
                    {
                            new _modName[10]
                            get_modname(_modName, 9)
                       
                            if (!equal(_modName, "zp"))
                            {
                                    message_begin(MSG_ALL, SVC_INTERMISSION)
                                    message_end()
                            }
    
                            new tempMap[32];
                            ArrayGetString(g_mapName, g_choosed, tempMap, charsmax(tempMap));
                       
                            set_task(2.0, "delayedChange", 0, tempMap, strlen(tempMap) + 1)
                            log_amx("Voting finished. The next map will be %s", tempMap)
                            ChatColor(0, "^1Голосование завершено. Администратор сменил карту на ^4%s", tempMap)
                    }
                    case 1: autoRefuse()
            }
       
            return PLUGIN_HANDLED
    }
    
    public checkVotes(id)
    {
            id -= 34567
            new num, ppl[32], a = 0
       
            get_players(ppl, num, "c")
            if (num == 0) num = 1
            g_choosed = -1
       
            for (new i = 0; i < g_voteSelectedNum[id]; ++i)
                    if (g_voteCount[a] < g_voteCount[i])
                            a = i
    
            new votesNum = g_voteCount[0] + g_voteCount[1] + g_voteCount[2] + g_voteCount[3] + g_voteCount[4]
            new iRatio = votesNum ? floatround(get_cvar_float("amx_votemap_ratio") * float(votesNum), floatround_ceil) : 1
            new iResult = g_voteCount[a]
    
            if (iResult >= iRatio)
            {
                    g_choosed = g_voteSelected[id][a]
                    new tempMap[32];
                    ArrayGetString(g_mapName, g_choosed, tempMap, charsmax(tempMap));
                    ChatColor(0, "^1Голосование завершено. ^4%s ^1набрала наибольшее количество голосов. Ждем решения Администратора", tempMap);
                    log_amx("Voting finished. Wait for the Administrator's decision", tempMap);
            }
       
            if (g_choosed != -1)
            {
                    if (is_user_connected(id))
                    {
                            new menuBody[512]
                            new tempMap[32];
                            ArrayGetString(g_mapName, g_choosed, tempMap, charsmax(tempMap));
                            new len = format(menuBody, 511, g_coloredMenus ? "\rБольшинство игроков выбрало \y%s^n^n" : "Большинство игроков выбрало %s^n^n", tempMap)
                       
                            len += format(menuBody[len], 511 - len, g_coloredMenus ? "\wСменить карту?^n\w" : "Сменить карту?^n")
                            format(menuBody[len], 511-len, "^n1. Да^n2. Нет")
    
                            show_menu(id, 0x03, menuBody, 30, "Большинство игроков выбрало")
                            set_task(10.0, "autoRefuse", 4545454)
                    }
            else
            {
                            new _modName[10]
                            get_modname(_modName, 9)
                       
                            if (!equal(_modName, "zp"))
                            {
                                    message_begin(MSG_ALL, SVC_INTERMISSION)
                                    message_end()
                            }
                            new tempMap[32];
                            ArrayGetString(g_mapName, g_choosed, tempMap, charsmax(tempMap));
                            set_task(2.0, "delayedChange", 0, tempMap, strlen(tempMap) + 1)
                    }
            }
        else
        {
                    client_print(0, print_chat, "Голосование не состоялось")
                    log_amx("Voting did not take place")
            }
       
            remove_task(34567 + id)
    }
    
    public voteCount(id, key)
    {
            if (key > 3)
            {
                    client_print(0, print_chat, "Голосование отменено")
                    remove_task(34567 + id)
                    set_cvar_float("amx_last_voting", get_gametime())
                    log_amx("Voting canceled")
               
                    return PLUGIN_HANDLED
            }
       
            if (get_cvar_float("amx_vote_answers"))
            {
                    new name[32]
               
                    get_user_name(id, name, 31)
                    ChatColor(0, "^1[^4Голосование^1] ^4%s ^1выбрал ^4#%d", name, key + 1)
            }
       
            ++g_voteCount[key]
       
            return PLUGIN_HANDLED
    }
    
    isMapSelected(id, pos)
    {
            for (new a = 0; a < g_voteSelectedNum[id]; ++a)
                    if (g_voteSelected[id][a] == pos)
                            return 1
            return 0
    }
    
    displayVoteMapsMenu(id, pos)
    {
            if (pos < 0)
                    return
    
            new menuBody[512], b = 0, start = pos * 7
    
            if (start >= g_mapNums)
                    start = pos = g_menuPosition[id] = 0
    
            new len = format(menuBody, 511, g_coloredMenus ? "\rМеню создания голосования карту^n\w^n" : "Меню создания голосования карту^n^n", pos + 1, (g_mapNums / 7 + ((g_mapNums % 7) ? 1 : 0)))
            new end = start + 7, keys = MENU_KEY_0
    
            if (end > g_mapNums)
                    end = g_mapNums
    
            new tempMap[32];
            for (new a = start; a < end; ++a)
            {
                    ArrayGetString(g_mapName, a, tempMap, charsmax(tempMap));
                    if (g_voteSelectedNum[id] == 4 || isMapSelected(id, pos * 7 + b))
                    {
                            ++b
                            if (g_coloredMenus)
                                    len += format(menuBody[len], 511-len, "\d%d. %s^n\w", b, tempMap)
                            else
                                    len += format(menuBody[len], 511-len, "# %s^n", tempMap)
                    }
            else
            {
                            keys |= (1<<b)
                            len += format(menuBody[len], 511-len, "%d. %s^n", ++b, tempMap)
                    }
            }
    
            if (g_voteSelectedNum[id])
            {
                    keys |= MENU_KEY_8
                    len += format(menuBody[len], 511-len, "^n8. \rНачать голосование\w^n")
            }
            else
                    len += format(menuBody[len], 511-len, g_coloredMenus ? "^n\d8. Начать голосование^n\w" : "^n# Начать голосование^n")
    
            if (end != g_mapNums)
            {
                    len += format(menuBody[len], 511-len, "^n9. Дальше^n0. %L^n", id, pos ? "BACK" : "EXIT")
                    keys |= MENU_KEY_9
            }
            else
                    len += format(menuBody[len], 511-len, "^n0. %L^n", id, pos ? "BACK" : "EXIT")
    
            if (g_voteSelectedNum[id])
                    len += format(menuBody[len], 511-len, g_coloredMenus ? "^n\rВыбранные карты^n\w" : "^nВыбранные карты^n")
            else
                    len += format(menuBody[len], 511-len, "^n^n")
    
            for (new c = 0; c < 4; c++)
            {
                    if (c < g_voteSelectedNum[id])
                    {
                            ArrayGetString(g_mapName, g_voteSelected[id][c], tempMap, charsmax(tempMap));
                            len += format(menuBody[len], 511-len, "%s^n", tempMap)
                    }
                    else
                            len += format(menuBody[len], 511-len, "^n")
            }
    
            new menuName[64]
            format(menuName, 63, "Menu")
    
            show_menu(id, keys, menuBody, -1, menuName)
    }
    
    public cmdVoteMapMenu(id, level, cid)
    {
            if (!cmd_access(id, level, cid, 1))
                    return PLUGIN_HANDLED
    
            if (get_cvar_float("amx_last_voting") > get_gametime())
            {
                    client_print(id, print_chat, "Голосование уже начато")
                    return PLUGIN_HANDLED
            }
    
            g_voteSelectedNum[id] = 0
    
            if (g_mapNums)
            {
                    displayVoteMapsMenu(id, g_menuPosition[id] = 0)
            }
        else
        {
                    console_print(id, "В меню нет карт")
                    client_print(id, print_chat, "В меню нет карт")
            }
    
            return PLUGIN_HANDLED
    }
    
    public cmdMapsMenu(id, level, cid)
    {
            if (!cmd_access(id, level, cid, 1))
                    return PLUGIN_HANDLED
    
            if (g_mapNums)
            {
                    displayMapsMenu(id, g_menuPosition[id] = 0)
            }
        else
        {
                    console_print(id, "В меню нет карт")
                    client_print(id, print_chat, "В меню нет карт")
            }
    
            return PLUGIN_HANDLED
    }
    
    public delayedChange(mapname[])
            server_cmd("changelevel %s", mapname)
    
    
    --- добавлено 24.05.15 ---
    Код:
    displayMapsMenu(id, pos)
    {
            if (pos < 0)
                    return
    
            new menuBody[512]
            new tempMap[32]
            new start = pos * 8
            new b = 0
    
            if (start >= g_mapNums)
                    start = pos = g_menuPosition[id] = 0
    
            new len = format(menuBody, 511, g_coloredMenus ? "\rМеню смены карты^n\w^n" : "Меню смены карты^n^n", pos + 1, (g_mapNums / 8 + ((g_mapNums % 8) ? 1 : 0)))
            new end = start + 8
            new keys = MENU_KEY_0
    
            if (end > g_mapNums)
                    end = g_mapNums
    
            for (new a = start; a < end; ++a)
            {
                    keys |= (1<<b)
                    ArrayGetString(g_mapName, a, tempMap, charsmax(tempMap));
                    len += format(menuBody[len], 511-len, "%d. %s^n", ++b, tempMap)
            }
    
            if (end != g_mapNums)
            {
                    format(menuBody[len], 511-len, "^n9. Дальше^n0. %L", id, pos ? "BACK" : "EXIT")
                    keys |= MENU_KEY_9
            }
            else
                    format(menuBody[len], 511-len, "^n0. %L", id, pos ? "BACK" : "EXIT")
    
            new menuName[64]
            format(menuName, 63, "Меню смены карты")
    
            show_menu(id, keys, menuBody, -1, menuName)
    }
    stock bool:ValidMap(mapname[])
    {
            if (is_map_valid(mapname))
            {
                    return true;
            }
            // If the is_map_valid check failed, check the end of the string
            new len = strlen(mapname) - 4;
       
            // The mapname was too short to possibly house the .bsp extension
            if (len < 0)
            {
                    return false;
            }
            if (equali(mapname[len], ".bsp"))
            {
                    // If the ending was .bsp, then cut it off.
                    // the string is byref'ed, so this copies back to the loaded text.
                    mapname[len] = '^0';
               
                    // recheck
                    if (is_map_valid(mapname))
                    {
                            return true;
                    }
            }
       
            return false;
    }
    
    load_settings(filename[])
    {
            new fp = fopen(filename, "r");
       
            if (!fp)
            {
                    return 0;
            }
               
    
            new text[256];
            new tempMap[32];
       
            while (!feof(fp))
            {
                    fgets(fp, text, charsmax(text));
               
                    if (text[0] == ';')
                    {
                            continue;
                    }
                    if (parse(text, tempMap, charsmax(tempMap)) < 1)
                    {
                            continue;
                    }
                    if (!ValidMap(tempMap))
                    {
                            continue;
                    }
               
                    ArrayPushString(g_mapName, tempMap);
                    g_mapNums++;
            }
    
            fclose(fp);
    
            return 1;
    }
    
    stock ChatColor(const id, const szMessage[], any:...)
    {
        static pnum, players[32], szMsg[190], IdMsg;
        vformat(szMsg, charsmax(szMsg), szMessage, 3);
    
        if(!IdMsg)
            IdMsg = get_user_msgid("SayText");
    
        if(id)
        {
            players[0] = id;
            pnum = 1;
        }
        else
            get_players(players, pnum, "ch");
    
        for(new i; i < pnum; i++)
        {
            message_begin(MSG_ONE, IdMsg, .player = players[i]);
            write_byte(players[i]);
            write_string(szMsg);
            message_end();
        }
        return 1;
    }
    
     
    Последнее редактирование: 14.07.15
  2. neygomon Его Темнейшество :j Команда форума

    Регистрация:
    26.02.15
    Сообщения:
    7.596
    Симпатии:
    4.171
    Пол:
    Мужской
    Phantom, привет.
    fresh bans стоит с admin loader?
     
  3. Phantom Команда форума

    Регистрация:
    27.02.15
    Сообщения:
    1.692
    Симпатии:
    797
    Пол:
    Мужской
    Telegram:
    ph4nt0m
    Нет. Ни того, ни другого
    --- добавлено 24.05.15 ---
    Ну и еще немного инфы. Если все же постараться в этот маленький промежуток времени выбрать опр. карту, в чат не выводится надпись
    [Голосование] %s выбрал #%d, и через секунду буквально появляется менюшка Большинство игроков выбрало %d. Сменить карту?
     
  4. neygomon Его Темнейшество :j Команда форума

    Регистрация:
    26.02.15
    Сообщения:
    7.596
    Симпатии:
    4.171
    Пол:
    Мужской
    Phantom, тогда amx_vote_time или что то типа такого смотри.
     
    Phantom нравится это.
  5. Phantom Команда форума

    Регистрация:
    27.02.15
    Сообщения:
    1.692
    Симпатии:
    797
    Пол:
    Мужской
    Telegram:
    ph4nt0m
    adminvote.amxx удалил
    --- добавлено 24.05.15 ---
    Так, кажется разобрался. В исходнике есть несколько кваров, коих нет в amxx.cfg. Может в этом все дело?
     
    Последнее редактирование: 14.07.15
  6. neygomon Его Темнейшество :j Команда форума

    Регистрация:
    26.02.15
    Сообщения:
    7.596
    Симпатии:
    4.171
    Пол:
    Мужской
    Phantom, пробуй..
     
  7. HannibaL Команда форума

    Регистрация:
    28.02.15
    Сообщения:
    1.058
    Симпатии:
    218
    Пол:
    Мужской
    adminvote перекомпилируй под свою версию amx
     
  8. Phantom Команда форума

    Регистрация:
    27.02.15
    Сообщения:
    1.692
    Симпатии:
    797
    Пол:
    Мужской
    Telegram:
    ph4nt0m
    Друг мой
    --- добавлено 24.05.15 ---
    Все заработало. Спасибо тебе Вань, навел на мысль. И еще вопрос: можно ли мапсменю переделать в formatex? Если да, то скинь пример один, пожалуйста
     
    Последнее редактирование: 14.07.15
  9. neygomon Его Темнейшество :j Команда форума

    Регистрация:
    26.02.15
    Сообщения:
    7.596
    Симпатии:
    4.171
    Пол:
    Мужской
    Phantom, format замени на formatex и все.
    скорости не добавит почти.
    пару тактов процессора только сэкономишь.
     
    Phantom нравится это.
  10. Phantom Команда форума

    Регистрация:
    27.02.15
    Сообщения:
    1.692
    Симпатии:
    797
    Пол:
    Мужской
    Telegram:
    ph4nt0m
    Окей, спасибо
     
  11. Phantom Команда форума

    Регистрация:
    27.02.15
    Сообщения:
    1.692
    Симпатии:
    797
    Пол:
    Мужской
    Telegram:
    ph4nt0m
    PS2 Хотелось бы увидеть mapsmenu в твоем стиле :)
     
    HannibaL нравится это.
  12. neygomon Его Темнейшество :j Команда форума

    Регистрация:
    26.02.15
    Сообщения:
    7.596
    Симпатии:
    4.171
    Пол:
    Мужской
    Phantom, я себе сделал.
    в паблик не планирую:)
     
  13. Phantom Команда форума

    Регистрация:
    27.02.15
    Сообщения:
    1.692
    Симпатии:
    797
    Пол:
    Мужской
    Telegram:
    ph4nt0m
    Понятно
     
  14. HannibaL Команда форума

    Регистрация:
    28.02.15
    Сообщения:
    1.058
    Симпатии:
    218
    Пол:
    Мужской
    neygomon, С нуля?
     
  15. neygomon Его Темнейшество :j Команда форума

    Регистрация:
    26.02.15
    Сообщения:
    7.596
    Симпатии:
    4.171
    Пол:
    Мужской
    HannibaL, да
     
  16. HannibaL Команда форума

    Регистрация:
    28.02.15
    Сообщения:
    1.058
    Симпатии:
    218
    Пол:
    Мужской
    neygomon, Норм.)
    Вопрос: Плагин без мултиланга, на сколько будет легче, чем с мултилангом? + если заменить format на formatex..
     
  17. neygomon Его Темнейшество :j Команда форума

    Регистрация:
    26.02.15
    Сообщения:
    7.596
    Симпатии:
    4.171
    Пол:
    Мужской
    HannibaL, на 0.0000001%
     
  18. HannibaL Команда форума

    Регистрация:
    28.02.15
    Сообщения:
    1.058
    Симпатии:
    218
    Пол:
    Мужской
    neygomon, :confused: я на большее надеялся...
     
Статус темы:
Закрыта.