1. Punisher Пользователь

    Регистрация:
    08.02.16
    Сообщения:
    1.879
    Симпатии:
    281
    Пол:
    Мужской
    VKcom:
    wkolopunisher
    Telegram:
    punproject
    Skype:
    punproject
    Кто сможет такое реализовать со стандартным mapsmenu?
    Если это сложно-геморойно, то за $

    PHP:
    // vim: set ts=4 sw=4 tw=99 noet:
    //
    // AMX Mod X, based on AMX Mod by Aleksander Naszko ("OLO").
    // Copyright (C) The AMX Mod X Development Team.
    //
    // This software is licensed under the GNU General Public License, version 3 or higher.
    // Additional exceptions apply. For full license details, see LICENSE.txt or visit:
    //     https://alliedmods.net/amxmodx-license

    //
    // Maps Menu Plugin
    //

    #include <amxmodx>
    #include <amxmisc>

    new Array:g_mapName;
    new 
    g_mapNums
    new g_menuPosition[MAX_PLAYERS 1]

    new 
    g_voteCount[5]

    new 
    g_voteSelected[MAX_PLAYERS 1][4]
    new 
    g_voteSelectedNum[MAX_PLAYERS 1]

    new 
    g_coloredMenus

    new g_choosed

    public plugin_init()
    {
        
    register_plugin("Maps Menu"AMXX_VERSION_STR"AMXX Dev Team")
        
    register_dictionary("mapsmenu.txt")
        
    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("Changelevel Menu"), 1023"actionMapsMenu")
        
    register_menucmd(register_menuid("Which map do you want?"), 527"voteCount")
        
    register_menucmd(register_menuid("Change map to"), 527"voteCount")
        
    register_menucmd(register_menuid("Votemap Menu"), 1023"actionVoteMapMenu")
        
    register_menucmd(register_menuid("The winner: "), 3"actionResult")

        
    g_mapName=ArrayCreate(32);
       
        new 
    maps_ini_file[64];
        
    get_configsdir(maps_ini_filecharsmax(maps_ini_file));
        
    format(maps_ini_filecharsmax(maps_ini_file), "%s/maps.ini"maps_ini_file);

        if (!
    file_exists(maps_ini_file))
            
    get_cvar_string("mapcyclefile"maps_ini_filecharsmax(maps_ini_file));
           
        if (!
    file_exists(maps_ini_file))
            
    format(maps_ini_filecharsmax(maps_ini_file), "mapcycle.txt")
       
        
    load_settings(maps_ini_file)

        
    g_coloredMenus colored_menus()
    }

    public 
    autoRefuse()
    {
        
    log_amx("Vote: %L""en""RESULT_REF")
        
    client_print(0print_chat"%L"LANG_PLAYER"RESULT_REF")
    }

    public 
    actionResult(idkey)
    {
        
    remove_task(4545454)
       
        switch (
    key)
        {
            case 
    0:
            {
                new 
    _modName[10]
                
    get_modname(_modNamecharsmax(_modName))
               
                if (!
    equal(_modName"zp"))
                {
                    
    message_begin(MSG_ALLSVC_INTERMISSION)
                    
    message_end()
                }

                new 
    tempMap[32];
                
    ArrayGetString(g_mapNameg_choosedtempMapcharsmax(tempMap));
               
                
    set_task(2.0"delayedChange"0tempMapstrlen(tempMap) + 1)
                
    log_amx("Vote: %L""en""RESULT_ACC")
                
    client_print(0print_chat"%L"LANG_PLAYER"RESULT_ACC")
            }
            case 
    1autoRefuse()
        }
       
        return 
    PLUGIN_HANDLED
    }

    public 
    checkVotes(id)
    {
        
    id -= 34567
        
    new numppl[MAX_PLAYERS], 0
       
        get_players
    (pplnum"c")
        if (
    num == 0num 1
        g_choosed 
    = -1
       
        
    for (new 0g_voteSelectedNum[id]; ++i)
            if (
    g_voteCount[a] < g_voteCount[i])
                
    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_mapNameg_choosedtempMapcharsmax(tempMap));
            
    client_print(0print_chat"%L %s"LANG_PLAYER"VOTE_SUCCESS"tempMap);
            
    log_amx("Vote: %L %s""en""VOTE_SUCCESS"tempMap);
        }
       
        if (
    g_choosed != -1)
        {
            if (
    is_user_connected(id))
            {
                new 
    menuBody[512]
                new 
    tempMap[32];
                
    ArrayGetString(g_mapNameg_choosedtempMapcharsmax(tempMap));
                new 
    len format(menuBodycharsmax(menuBody), g_coloredMenus "\y%L: \w%s^n^n" "%L: %s^n^n"id"THE_WINNER"tempMap)
               
                
    len += format(menuBody[len], charsmax(menuBody) - leng_coloredMenus "\y%L^n\w" "%L^n"id"WANT_CONT")
                
    format(menuBody[len], charsmax(menuBody) - len"^n1. %L^n2. %L"id"YES"id"NO")

                
    show_menu(id0x03menuBody10"The winner: ")
                
    set_task(10.0"autoRefuse"4545454)
            } else {
                new 
    _modName[10]
                
    get_modname(_modNamecharsmax(_modName))
               
                if (!
    equal(_modName"zp"))
                {
                    
    message_begin(MSG_ALLSVC_INTERMISSION)
                    
    message_end()
                }
                new 
    tempMap[32];
                
    ArrayGetString(g_mapNameg_choosedtempMapcharsmax(tempMap));
                
    set_task(2.0"delayedChange"0tempMapstrlen(tempMap) + 1)
            }
        } else {
            
    client_print(0print_chat"%L"LANG_PLAYER"VOTE_FAILED")
            
    log_amx("Vote: %L""en""VOTE_FAILED")
        }
       
        
    remove_task(34567 id)
    }

    public 
    voteCount(idkey)
    {
        if (
    key 3)
        {
            
    client_print(0print_chat"%L"LANG_PLAYER"VOT_CANC")
            
    remove_task(34567 id)
            
    set_cvar_float("amx_last_voting"get_gametime())
            
    log_amx("Vote: Cancel vote session")
           
            return 
    PLUGIN_HANDLED
        
    }
       
        if (
    get_cvar_float("amx_vote_answers"))
        {
            new 
    name[MAX_NAME_LENGTH]
           
            
    get_user_name(idnamecharsmax(name))
            
    client_print(0print_chat"%L"LANG_PLAYER"X_VOTED_FOR"namekey 1)
        }
       
        ++
    g_voteCount[key]
       
        return 
    PLUGIN_HANDLED
    }

    isMapSelected(idpos)
    {
        for (new 
    0g_voteSelectedNum[id]; ++a)
            if (
    g_voteSelected[id][a] == pos)
                return 
    1
        
    return 0
    }

    displayVoteMapsMenu(idpos)
    {
        if (
    pos 0)
            return

        new 
    menuBody[512], 0start pos 7

        
    if (start >= g_mapNums)
            
    start pos g_menuPosition[id] = 0

        
    new len format(menuBodycharsmax(menuBody), g_coloredMenus "\y%L\R%d/%d^n\w^n" "%L %d/%d^n^n"id"VOTEMAP_MENU"pos 1, (g_mapNums + ((g_mapNums 7) ? 0)))
        new 
    end start 7keys MENU_KEY_0

        
    if (end g_mapNums)
            
    end g_mapNums

        
    new tempMap[32];
        for (new 
    startend; ++a)
        {
            
    ArrayGetString(g_mapNameatempMapcharsmax(tempMap));
            if (
    g_voteSelectedNum[id] == || isMapSelected(idpos b))
            {
                ++
    b
                
    if (g_coloredMenus)
                    
    len += format(menuBody[len], charsmax(menuBody) - len"\d%d. %s^n\w"btempMap)
                else
                    
    len += format(menuBody[len], charsmax(menuBody) - len"#. %s^n"tempMap)
            } else {
                
    keys |= (1<<b)
                
    len += format(menuBody[len], charsmax(menuBody) - len"%d. %s^n", ++btempMap)
            }
        }

        if (
    g_voteSelectedNum[id])
        {
            
    keys |= MENU_KEY_8
            len 
    += format(menuBody[len], charsmax(menuBody) - len"^n8. %L^n"id"START_VOT")
        }
        else
            
    len += format(menuBody[len], charsmax(menuBody) - leng_coloredMenus "^n\d8. %L^n\w" "^n#. %L^n"id"START_VOT")

        if (
    end != g_mapNums)
        {
            
    len += format(menuBody[len], charsmax(menuBody) - len"^n9. %L...^n0. %L^n"id"MORE"idpos "BACK" "EXIT")
            
    keys |= MENU_KEY_9
        
    }
        else
            
    len += format(menuBody[len], charsmax(menuBody) - len"^n0. %L^n"idpos "BACK" "EXIT")

        if (
    g_voteSelectedNum[id])
            
    len += format(menuBody[len], charsmax(menuBody) - leng_coloredMenus "^n\y%L:^n\w" "^n%L:^n"id"SEL_MAPS")
        else
            
    len += format(menuBody[len], charsmax(menuBody) - len"^n^n")

        for (new 
    04c++)
        {
            if (
    g_voteSelectedNum[id])
            {
                
    ArrayGetString(g_mapNameg_voteSelected[id][c], tempMapcharsmax(tempMap));
                
    len += format(menuBody[len], charsmax(menuBody) - len"%s^n"tempMap)
            }
            else
                
    len += format(menuBody[len], charsmax(menuBody) - len"^n")
        }

        new 
    menuName[64]
        
    format(menuNamecharsmax(menuName), "%L""en""VOTEMAP_MENU")

        
    show_menu(idkeysmenuBody, -1menuName)
    }

    public 
    cmdVoteMapMenu(idlevelcid)
    {
        if (!
    cmd_access(idlevelcid1))
            return 
    PLUGIN_HANDLED

        
    if (get_cvar_float("amx_last_voting") > get_gametime())
        {
            
    client_print(idprint_chat"%L"id"ALREADY_VOT")
            return 
    PLUGIN_HANDLED
        
    }

        
    g_voteSelectedNum[id] = 0

        
    if (g_mapNums)
        {
            
    displayVoteMapsMenu(idg_menuPosition[id] = 0)
        } else {
            
    console_print(id"%L"id"NO_MAPS_MENU")
            
    client_print(idprint_chat"%L"id"NO_MAPS_MENU")
        }

        return 
    PLUGIN_HANDLED
    }

    public 
    cmdMapsMenu(idlevelcid)
    {
        if (!
    cmd_access(idlevelcid1))
            return 
    PLUGIN_HANDLED

        
    if (g_mapNums)
        {
            
    displayMapsMenu(idg_menuPosition[id] = 0)
        } else {
            
    console_print(id"%L"id"NO_MAPS_MENU")
            
    client_print(idprint_chat"%L"id"NO_MAPS_MENU")
        }

        return 
    PLUGIN_HANDLED
    }

    public 
    delayedChange(mapname[])
    {
        
    engine_changelevel(mapname)
    }

    public 
    actionVoteMapMenu(idkey)
    {
        new 
    tempMap[32];
        switch (
    key)
        {
            case 
    7:
            {
                new 
    Float:voting get_cvar_float("amx_last_voting")
           
                if (
    voting get_gametime())
                {
                    
    client_print(idprint_chat"%L"id"ALREADY_VOT")
                    return 
    PLUGIN_HANDLED
                
    }

                if (
    voting && voting get_cvar_float("amx_vote_delay") > get_gametime())
                {
                    
    client_print(idprint_chat"%L"id"VOT_NOW_ALLOW")
                    return 
    PLUGIN_HANDLED
                
    }

                
    g_voteCount = {00000}
               
                new 
    Float:vote_time get_cvar_float("amx_vote_time") + 2.0
                set_cvar_float
    ("amx_last_voting"get_gametime() + vote_time)
                new 
    iVoteTime floatround(vote_time)

                
    set_task(vote_time"checkVotes"34567 id)

                new 
    menuBody[512]
                new 
    players[MAX_PLAYERS]
                new 
    pnumkeyslen

                get_players
    (playerspnum)

                if (
    g_voteSelectedNum[id] > 1)
                {
                    
    len format(menuBodycharsmax(menuBody), g_coloredMenus "\y%L^n\w^n" "%L^n^n"id"WHICH_MAP")
                   
                    for (new 
    0g_voteSelectedNum[id]; ++c)
                    {
                        
    ArrayGetString(g_mapNameg_voteSelected[id][c], tempMapcharsmax(tempMap));
                        
    len += format(menuBody[len], charsmax(menuBody) - len"%d. %s^n"1tempMap)
                        
    keys |= (1<<c)
                    }
                   
                    
    keys |= (1<<8)
                    
    len += format(menuBody[len], charsmax(menuBody) - len"^n9. %L^n"id"NONE")
                } else {
                    
    ArrayGetString(g_mapNameg_voteSelected[id][0], tempMapcharsmax(tempMap));
                    
    len format(menuBodycharsmax(menuBody), g_coloredMenus "\y%L^n%s?^n\w^n1. %L^n2. %L^n" "%L^n%s?^n^n1. %L^n2. %L^n"id"CHANGE_MAP_TO"tempMapid"YES"id"NO")
                    
    keys MENU_KEY_1|MENU_KEY_2
                
    }

                new 
    menuName[64]
                
    format(menuNamecharsmax(menuName), "%L""en""WHICH_MAP")

                for (new 
    0pnum; ++b)
                    if (
    players[b] != id)
                        
    show_menu(players[b], keysmenuBodyiVoteTimemenuName)

                
    format(menuBody[len], charsmax(menuBody), "^n0. %L"id"CANC_VOTE")
                
    keys |= MENU_KEY_0
                show_menu
    (idkeysmenuBodyiVoteTimemenuName)

                new 
    authid[32], name[MAX_NAME_LENGTH]
               
                
    get_user_authid(idauthidcharsmax(authid))
                
    get_user_name(idnamecharsmax(name))

                
    show_activity_key("ADMIN_V_MAP_1""ADMIN_V_MAP_2"name);

                new 
    tempMapA[32];
                new 
    tempMapB[32];
                new 
    tempMapC[32];
                new 
    tempMapD[32];
                if (
    g_voteSelectedNum[id] > 0)
                {
                    
    ArrayGetString(g_mapNameg_voteSelected[id][0], tempMapAcharsmax(tempMapA));
                }
                else
                {
                    
    copy(tempMapAcharsmax(tempMapA), "");
                }
                if (
    g_voteSelectedNum[id] > 1)
                {
                    
    ArrayGetString(g_mapNameg_voteSelected[id][1], tempMapBcharsmax(tempMapB));
                }
                else
                {
                    
    copy(tempMapBcharsmax(tempMapB), "");
                }
                if (
    g_voteSelectedNum[id] > 2)
                {
                    
    ArrayGetString(g_mapNameg_voteSelected[id][2], tempMapCcharsmax(tempMapC));
                }
                else
                {
                    
    copy(tempMapCcharsmax(tempMapC), "");
                }
                if (
    g_voteSelectedNum[id] > 3)
                {
                    
    ArrayGetString(g_mapNameg_voteSelected[id][3], tempMapDcharsmax(tempMapD));
                }
                else
                {
                    
    copy(tempMapDcharsmax(tempMapD), "");
                }
               
                
    log_amx("Vote: ^"%s<%d><%s><>^" vote maps (map#1 ^"%s^") (map#2 ^"%s^") (map#3 ^"%s^") (map#4 ^"%s^")",
                        
    nameget_user_userid(id), authid,
                        
    tempMapAtempMapBtempMapCtempMapD)
            }
            case 
    8displayVoteMapsMenu(id, ++g_menuPosition[id])
            case 
    9displayVoteMapsMenu(id, --g_menuPosition[id])
            default:
            {
                
    g_voteSelected[id][g_voteSelectedNum[id]++] = g_menuPosition[id] * key
                displayVoteMapsMenu
    (idg_menuPosition[id])
            }
        }

        return 
    PLUGIN_HANDLED
    }

    public 
    actionMapsMenu(idkey)
    {
        switch (
    key)
        {
            case 
    8displayMapsMenu(id, ++g_menuPosition[id])
            case 
    9displayMapsMenu(id, --g_menuPosition[id])
            default:
            {
                new 
    g_menuPosition[id] * key
                
    new _modName[10]

                
    get_modname(_modNamecharsmax(_modName))
                if (!
    equal(_modName"zp"))
                {
                    
    message_begin(MSG_ALLSVC_INTERMISSION)
                    
    message_end()
                }
               
                new 
    authid[32], name[MAX_NAME_LENGTH]
               
                
    get_user_authid(idauthidcharsmax(authid))
                
    get_user_name(idnamecharsmax(name))

                new 
    tempMap[32];
                
    ArrayGetString(g_mapNameatempMapcharsmax(tempMap));
               
                
    show_activity_key("ADMIN_CHANGEL_1""ADMIN_CHANGEL_2"nametempMap);

                
    log_amx("Cmd: ^"%s<%d><%s><>^" changelevel ^"%s^""nameget_user_userid(id), authidtempMap)
                
    set_task(2.0"delayedChange"0tempMapstrlen(tempMap) + 1)
                
    /* displayMapsMenu(id, g_menuPosition[id]) */
            
    }
        }
       
        return 
    PLUGIN_HANDLED
    }

    displayMapsMenu(idpos)
    {
        if (
    pos 0)
            return

        new 
    menuBody[512]
        new 
    tempMap[32]
        new 
    start pos 8
        
    new 0

        
    if (start >= g_mapNums)
            
    start pos g_menuPosition[id] = 0

        
    new len format(menuBodycharsmax(menuBody), g_coloredMenus "\y%L\R%d/%d^n\w^n" "%L %d/%d^n^n"id"CHANGLE_MENU"pos 1, (g_mapNums + ((g_mapNums 8) ? 0)))
        new 
    end start 8
        
    new keys MENU_KEY_0

        
    if (end g_mapNums)
            
    end g_mapNums

        
    for (new startend; ++a)
        {
            
    keys |= (1<<b)
            
    ArrayGetString(g_mapNameatempMapcharsmax(tempMap));
            
    len += format(menuBody[len], charsmax(menuBody) - len"%d. %s^n", ++btempMap)
        }

        if (
    end != g_mapNums)
        {
            
    format(menuBody[len], charsmax(menuBody) - len"^n9. %L...^n0. %L"id"MORE"idpos "BACK" "EXIT")
            
    keys |= MENU_KEY_9
        
    }
        else
            
    format(menuBody[len], charsmax(menuBody) - len"^n0. %L"idpos "BACK" "EXIT")

        new 
    menuName[64]
        
    format(menuName63"%L""en""CHANGLE_MENU")

        
    show_menu(idkeysmenuBody, -1menuName)
    }
    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(fptextcharsmax(text));
           
            if (
    text[0] == ';')
            {
                continue;
            }
            if (
    parse(texttempMapcharsmax(tempMap)) < 1)
            {
                continue;
            }
            if (!
    ValidMap(tempMap))
            {
                continue;
            }
           
            
    ArrayPushString(g_mapNametempMap);
            
    g_mapNums++;
        }

        
    fclose(fp);

        return 
    1;
    }

    public 
    plugin_end()
    {
        
    ArrayDestroy(g_mapName)
    }

    Я думаю такое много кому будет полезно
     

    Вложения:

    • mapsmenu.sma
      Размер файла:
      14,2 КБ
      Просмотров:
      4
  2. d3m37r4 Пользователь

    Регистрация:
    19.07.15
    Сообщения:
    247
    Симпатии:
    64
    Пол:
    Мужской
    VKcom:
    id109544387
    Skype:
    d1mas1kw0w
    Это уже было реализовано в стандартном плагине, на другом форуме, если нужно, могу скинуть исходник.
     
  3. maFFyoZZyk Черный Жнец ^_^ Команда форума

    Регистрация:
    14.01.16
    Сообщения:
    1.404
    Симпатии:
    605
    Пол:
    Мужской
    Если автор не запрещает выкладывать исходники, то выложи сюда с ссылкой на источник
     
  4. d3m37r4 Пользователь

    Регистрация:
    19.07.15
    Сообщения:
    247
    Симпатии:
    64
    Пол:
    Мужской
    VKcom:
    id109544387
    Skype:
    d1mas1kw0w

    Вложения:

    • mapsmenu.sma
      Размер файла:
      17,3 КБ
      Просмотров:
      13
    maFFyoZZyk, mattguetta и Punisher нравится это.
  5. Punisher Пользователь

    Регистрация:
    08.02.16
    Сообщения:
    1.879
    Симпатии:
    281
    Пол:
    Мужской
    VKcom:
    wkolopunisher
    Telegram:
    punproject
    Skype:
    punproject
    Посмотрите, решил сделать так же для 1.8.3
    Правильно ли?
     

    Вложения:

    • mapsmenu.sma
      Размер файла:
      14,8 КБ
      Просмотров:
      8
  6. d3m37r4 Пользователь

    Регистрация:
    19.07.15
    Сообщения:
    247
    Симпатии:
    64
    Пол:
    Мужской
    VKcom:
    id109544387
    Skype:
    d1mas1kw0w
    Punisher, так поставьте на сервер сами, просто нет возможности плагин на 1.8.3 протестить, так бы сам проверил)
     
  7. Punisher Пользователь

    Регистрация:
    08.02.16
    Сообщения:
    1.879
    Симпатии:
    281
    Пол:
    Мужской
    VKcom:
    wkolopunisher
    Telegram:
    punproject
    Skype:
    punproject
    d3m37r4, У меня хуже ситуация) На локалке проверю потом)
     
  8. maFFyoZZyk Черный Жнец ^_^ Команда форума

    Регистрация:
    14.01.16
    Сообщения:
    1.404
    Симпатии:
    605
    Пол:
    Мужской
    я вот не пойму, а в чем собственно разница?
    Разница в 3 строчках кода, в 1 - 606, в другом 609
     
  9. Punisher Пользователь

    Регистрация:
    08.02.16
    Сообщения:
    1.879
    Симпатии:
    281
    Пол:
    Мужской
    VKcom:
    wkolopunisher
    Telegram:
    punproject
    Skype:
    punproject
    maFFyoZZyk, Я лично не знаю и во избежании проблем сделал под 1.8.3.
    Разница вроде не в 3х строчках. Написано чуть иначе, не стал мешать
     
  10. Punisher Пользователь

    Регистрация:
    08.02.16
    Сообщения:
    1.879
    Симпатии:
    281
    Пол:
    Мужской
    VKcom:
    wkolopunisher
    Telegram:
    punproject
    Skype:
    punproject
    d3m37r4, Неизвестность последствий страшная штука, но оказалось все норм :)
     
    d3m37r4 нравится это.
  11. Punisher Пользователь

    Регистрация:
    08.02.16
    Сообщения:
    1.879
    Симпатии:
    281
    Пол:
    Мужской
    VKcom:
    wkolopunisher
    Telegram:
    punproject
    Skype:
    punproject
    d3m37r4, не работает...