Как сделать, чтобы меню работало с определенного раунда?

Сообщения
46
Реакции
2
Помог
1 раз(а)
Хочу изменить плагин "Оружейная" под свой сервер. Нужно с чего-то начать, но не знаю даже с чего.
Могли бы вы подсказать строчку кода, которая будет отвечать за то, чтобы меню работало, например, только с 5-го раунда. А до этого оно бы открывалось, но в ней писалось бы как на скриншоте "Разрешена с 5-го раунда" и команды были бы недоступны, в полупрозрачном стиле, как сама надпись (\d).
Также добавлю, что вроде как плагин этот старый и код там соответственный, сами увидите. Видел, что сейчас меню создают уже совсем из других внутренностей. Даже кнопка "Выход" не отображается корректно. Я уже немного начинал с ней шаманить, в процессе убрал строку, которая должна отвечать за функцию закрытия меню. Но что была там эта строчка, что ее уже нет, всё равно почему-то огромный отступ и просто "Exit".
27 Сен 2022
Код:
#include <amxmodx>
#include <fun>
#include <cstrike>

#define PLUGNAME "Weaponmenu"
#define VERSION "1.0"
#define AUTHOR "Kiow"


public plugin_init()
{
    register_plugin(PLUGNAME, VERSION, AUTHOR)
    register_clcmd( "say /admmenu", "admin_menu" )
    register_clcmd( "admmenu", "admin_menu" )
}

public admin_menu(id)
{
    {
        if(get_user_flags(id) & ADMIN_LEVEL_H)
        if ( cs_get_user_team(id) == CS_TEAM_CT )
        {
            new admin_menu = menu_create( "\wОружейная^n\dРазрешена с 5-го раунда", "menu_admin" )
            menu_additem( admin_menu, "Thunderbolt \d[\yВзять\d]", "1", 0 )
            menu_additem( admin_menu, "Needler \d[\yВзять\d]", "2", 0 )
            menu_additem( admin_menu, "Набор гранат \d[\yВзять\d]", "3", 0 )

            menu_setprop( admin_menu, MPROP_EXIT, MEXIT_ALL )
            menu_display( id, admin_menu, 0 )
        }
    }
}

public menu_admin( id, menu, item )
{
    if( item == MENU_EXIT )
    {
        menu_destroy( menu )
        return PLUGIN_HANDLED
    }
    new data[6], iName[64]
    new access, callback

    menu_item_getinfo( menu, item, access, data,5, iName, 63, callback )
    new key = str_to_num( data )
    switch( key )
    {
        case 1:
        {
            if( is_user_alive( id ) )
            {
                client_cmd(id, "admin_get_thunderbolttttt")
            }
        }
        case 2:
        {
            if( is_user_alive( id ) )
            {
                client_cmd(id, "admin_get_needlerrrrr")
            }
        }
        case 3:
        {
            if( is_user_alive( id ) )
            {
                give_item(id, "weapon_hegrenade")
                give_item(id, "weapon_flashbang")
            }
        }
    }
    menu_destroy( menu )
    return PLUGIN_HANDLED
}
 

Download all Attachments

Последнее редактирование:
Сообщения
542
Реакции
50
Предупреждения
2
Помог
4 раз(а)
Код:
#include <amxmodx>
#include <reapi>

#define ACCESS         ADMIN_MENU        // Флаг доступа к меню. По умолчанию "u"
#define NUM_OPEN     1                // Сколько раз можно открывать каждый из пунктов меню за 1 раунд
#define ALLOW_ROUND     5                // С какого раунда можно пользоваться менюшкой

enum _:WEAP { NAME[32], AMMOUNT, TYPE }
new g_aEquipData[64][WEAP], g_iCount;
new g_sSelectedItem[33][32];

new g_MainMenu, g_PrimMenu, g_ScndMenu, g_ItemMenu;
new _access, sItemData[32], callback;

new g_iCountRound;
new g_iNumUseMenus[33][3];

public plugin_init()
{
#define VERSION "1.1"
    register_plugin("WeaponMenu", VERSION, "neygomon");
    register_cvar("weaponmenu", VERSION, FCVAR_SERVER | FCVAR_SPONLY);
   
    register_clcmd("weaponmenu", "CmdWeaponMenu");
    register_clcmd("wmenu", "CmdWeaponMenu");
    register_clcmd("say /wmenu", "CmdWeaponMenu");
    register_clcmd("say_team /wmenu", "CmdWeaponMenu");

    RegisterHookChain(RG_CSGameRules_RestartRound, "CSGameRules_RestartRound_Pre");
}

#define PR_FILE "addons/amxmodx/configs/wmenu/primary.ini"
#define SR_FILE "addons/amxmodx/configs/wmenu/secondary.ini"
#define IT_FILE "addons/amxmodx/configs/wmenu/items.ini"

public plugin_cfg()
{
    new i, fp, buffer[96], temp[3][32];
    g_MainMenu = menu_create("\d[\rWeaponMenu\d] \yВыберите тип", "MainMenuHandler");
    menu_setprop(g_MainMenu, MPROP_EXITNAME, "Выход");
    if(file_exists(PR_FILE))
    {
        menu_additem(g_MainMenu, "Основное оружие", "0");
        g_PrimMenu = menu_create("\d[\rWeaponMenu\d] \yВыберите оружие\w", "MenuHandler");
        menu_setprop(g_PrimMenu, MPROP_NEXTNAME, "Далее");
        menu_setprop(g_PrimMenu, MPROP_BACKNAME, "Назад");
        menu_setprop(g_PrimMenu, MPROP_EXITNAME, "Выход");
       
        fp = fopen(PR_FILE, "rt");
        i = 0;
        while(!feof(fp))
        {
            fgets(fp, buffer, charsmax(buffer));
           
            if(buffer[0] && buffer[0] != ';' && parse(buffer, temp[0], charsmax(temp[]), temp[1], charsmax(temp[]), temp[2], charsmax(temp[])))
            {
                menu_additem(g_PrimMenu, temp[0], temp[1]);
                copy(g_aEquipData[g_iCount][NAME], charsmax(g_aEquipData[][NAME]), temp[1]);
                g_aEquipData[g_iCount][AMMOUNT] = str_to_num(temp[2]);
                g_aEquipData[g_iCount++][TYPE] = 1;
                i++;
            }  
        }
        fclose(fp);
        if(i == 0) log_amx("WARN! File ^"%s^" is blank or invalid format! Repare please.", PR_FILE);      
    }  
    if(file_exists(SR_FILE))
    {
        menu_additem(g_MainMenu, "Второстепенное оружие", "1");
        g_ScndMenu = menu_create("\d[\rWeaponMenu\d] \yВыберите оружие\w", "MenuHandler");
        menu_setprop(g_ScndMenu, MPROP_NEXTNAME, "Далее");
        menu_setprop(g_ScndMenu, MPROP_BACKNAME, "Назад");
        menu_setprop(g_ScndMenu, MPROP_EXITNAME, "Выход");
       
        fp = fopen(SR_FILE, "rt");
        i = 0;
        while(!feof(fp))
        {
            fgets(fp, buffer, charsmax(buffer));
           
            if(buffer[0] && buffer[0] != ';' && parse(buffer, temp[0], charsmax(temp[]), temp[1], charsmax(temp[]), temp[2], charsmax(temp[])))
            {
                menu_additem(g_ScndMenu, temp[0], temp[1]);
                copy(g_aEquipData[g_iCount][NAME], charsmax(g_aEquipData[][NAME]), temp[1]);
                g_aEquipData[g_iCount][AMMOUNT] = str_to_num(temp[2]);
                g_aEquipData[g_iCount++][TYPE] = 0;
                i++;
            }  
        }
        fclose(fp);
        if(i == 0) log_amx("WARN! File ^"%s^" is blank or invalid format! Repare please.", SR_FILE);
    }
    if(file_exists(IT_FILE))
    {
        menu_additem(g_MainMenu, "Обмундирование", "2");
        g_ItemMenu = menu_create("\d[\rWeaponMenu\d] \yВыберите экипировку\w", "MenuHandler");
        menu_setprop(g_ItemMenu, MPROP_NEXTNAME, "Далее");
        menu_setprop(g_ItemMenu, MPROP_BACKNAME, "Назад");
        menu_setprop(g_ItemMenu, MPROP_EXITNAME, "Выход");
       
        fp = fopen(IT_FILE, "rt");
        i = 0;
        while(!feof(fp))
        {
            fgets(fp, buffer, charsmax(buffer));
           
            if(buffer[0] && buffer[0] != ';' && parse(buffer, temp[0], charsmax(temp[]), temp[1], charsmax(temp[]), temp[2], charsmax(temp[])))
            {
                menu_additem(g_ItemMenu, temp[0], temp[1]);

                copy(g_aEquipData[g_iCount][NAME], charsmax(g_aEquipData[][NAME]), temp[1]);
                g_aEquipData[g_iCount][AMMOUNT] = (temp[1][0] == 'w' && temp[1][7] == 's') ? -1 : str_to_num(temp[2]);
                g_aEquipData[g_iCount++][TYPE] = 2;
                i++;
            }  
        }
        fclose(fp);
        if(i == 0) log_amx("WARN! File ^"%s^" is blank or invalid format! Repare please.", IT_FILE);
    }  
}

public client_disconnected(id)
{
    arrayset(g_iNumUseMenus[id], 0, 3);
    g_sSelectedItem[id][0] = 0;
}  

public CSGameRules_RestartRound_Pre()
{
    if(get_member_game(m_bCompleteReset))
        g_iCountRound = 0;
    g_iCountRound++;

    new iPlayers[MAX_CLIENTS], iPlayersNum;
    get_players(iPlayers, iPlayersNum, "ch");

    for(new id; id < iPlayersNum; id++)
        arrayset(g_iNumUseMenus[id], 0, sizeof(g_iNumUseMenus));
}

public CmdWeaponMenu(id)
{
    if(get_user_flags(id) & ACCESS)
    {
        if(g_iCountRound < ALLOW_ROUND) client_print(id, print_chat, "* WeaponMenu доступно только с %d раунда *", ALLOW_ROUND);
        else menu_display(id, g_MainMenu);
    }
    else client_print(id, print_notify, "* Доступ запрещён *");
    return PLUGIN_HANDLED;
}

public MainMenuHandler(id, menu, item)
{
    if(item != MENU_EXIT)
    {
        if(g_iNumUseMenus[id][item] < NUM_OPEN)
        {
            g_iNumUseMenus[id][item]++;
            switch(item)
            {
                case 0: menu_display(id, g_PrimMenu);
                case 1: menu_display(id, g_ScndMenu);
                case 2: menu_display(id, g_ItemMenu);
            }
        }
        else client_print(id, print_chat, "* В WeaponMenu каждым пунктом можно пользоваться только %d раз за раунд *", NUM_OPEN);
    }
    return PLUGIN_HANDLED;
}

public MenuHandler(id, menu, item)
{
    if(item != MENU_EXIT)
    {
        menu_item_getinfo(menu, item, _access, sItemData, charsmax(sItemData), _, _, callback);
        copy(g_sSelectedItem[id], charsmax(g_sSelectedItem[]), sItemData);
        SelectPlayer(id);
    }
    return PLUGIN_HANDLED;
}

SelectPlayer(id)
{
    new iPlayersMenu = menu_create("\d[\rWeaponMenu\d] \yВыберите игрока\w", "playersmenu_handler");
    menu_setprop(iPlayersMenu, MPROP_NEXTNAME, "Далее");
    menu_setprop(iPlayersMenu, MPROP_BACKNAME, "Назад");
    menu_setprop(iPlayersMenu, MPROP_EXITNAME, "Выход");
   
    new players[32], pnum, name[32], frmt[64], num[3];
   
    get_entvar(id, var_netname, name, charsmax(name));
    formatex(frmt, charsmax(frmt), "%s \d[\rВы\d]", name);
    num_to_str(id, num, charsmax(num));
    menu_additem(iPlayersMenu, frmt, num);
   
    get_players(players, pnum, "h");
    for(new i, playerId; i < pnum; i++)
    {
        playerId = players[i];

        if(id == playerId) continue;
       
        get_entvar(playerId, var_netname, name, charsmax(name));
        num_to_str(playerId, num, charsmax(num));
        menu_additem(iPlayersMenu, name, num);
    }
    return menu_display(id, iPlayersMenu, 0);
}

public playersmenu_handler(id, menu, item)
{
    if(item != MENU_EXIT)
    {
        menu_item_getinfo(menu, item, _access, sItemData, charsmax(sItemData), _, _, callback);
       
        new i         = ReturnNumAmmount(g_sSelectedItem[id]);
        new ammo     = g_aEquipData[i][AMMOUNT];
        new weap_type     = g_aEquipData[i][TYPE];
        new vic     = str_to_num(sItemData);
       
        if(ammo != -1 && weap_type != 2)
        {
            rg_give_item(vic, g_sSelectedItem[id], GT_REPLACE);
            rg_set_user_bpammo(vic, rg_get_weapon_info(g_sSelectedItem[id], WI_ID), ammo);
        }
        else if(weap_type == 2)
        {
            new wp = (g_sSelectedItem[id][0] == 'w' && g_sSelectedItem[id][6] == '_') ? 1 : 0;
            if(wp && g_sSelectedItem[id][7] == 's')
            {
                if(!get_member(vic, m_bOwnsShield))
                    rg_give_shield(vic);
            }
            else if(wp && ammo != -1)
            {
                rg_give_item(vic, g_sSelectedItem[id]);
                rg_set_user_bpammo(vic, rg_get_weapon_info(g_sSelectedItem[id], WI_ID), ammo);
            }  
            else
            {
                if(!strcmp(g_sSelectedItem[id], "kevlar"))
                    rg_set_user_armor(vic, ammo > 0 ? ammo : 0, ARMOR_KEVLAR);
                else if(!strcmp(g_sSelectedItem[id], "kevlar_helmet"))
                    rg_set_user_armor(vic, ammo > 0 ? ammo : 0, ARMOR_VESTHELM);
                else if(!strcmp(g_sSelectedItem[id], "nightvision"))
                    set_member(vic, m_bHasNightVision);
                else if(!strcmp(g_sSelectedItem[id], "defuse_kit"))
                    rg_give_defusekit(vic);
            }
        }
    }
    g_sSelectedItem[id][0] = 0;
    menu_display(id, g_MainMenu);
    return PLUGIN_HANDLED;
}

stock ReturnNumAmmount(weapon[])
{
    for(new i; i < g_iCount; i++)
    {
        if(!strcmp(g_aEquipData[i][NAME], weapon))
            return i;  
    }
    return -1;
}
#define ALLOW_ROUND 5 // С какого раунда можно пользоваться менюшкой

где 5 раунд с которого можно юзать менюшку. нужен реапи и регейм длл
 
Сообщения
46
Реакции
2
Помог
1 раз(а)
Artemich, Спасибо большое за код!
Но сейчас будет глупый вопрос, наверное. Этим кодом можно воспользоваться, чтобы пересоздать полностью мое меню? (надеюсь понял о чем я) Или будет достаточно перенести строки #define и inc reapi к себе? (сами регейм и реапи стоят на сервере)
Я не силен в кодах, от слова совсем, поэтому если возможно, то объясни по проще :)
 
Сообщения
542
Реакции
50
Предупреждения
2
Помог
4 раз(а)
Kioo, #define и inc этоого не достаточно #include это прикрепить к плагин сам инклюд с функциями а #define используется как настройка в плагине. там еще некоторые строчки есть, которые надо перенести. Но я пробовал, не получалось. А в чем проблема взять просто мой код?
 
Сообщения
46
Реакции
2
Помог
1 раз(а)
Artemich, все, ты ответил на мой вопрос)
А так, взять твой код - проблемы нет. Попытаюсь вникнуть в него. Надеюсь получится, спасибо)
Возможно, я еще отпишу в эту тему в ближайшие дни, появятся вопросы, поэтому пока не закрывайте
 
Сообщения
542
Реакции
50
Предупреждения
2
Помог
4 раз(а)
Kioo, хотя, вот, я попытался перенести стрчоки из моего в твой плагин, попробуй
Код:
#include <amxmodx>
#include <fun>
#include <cstrike>
#include <reapi>

#define PLUGNAME "Weaponmenu"
#define VERSION "1.0"
#define AUTHOR "Kiow"
#define ALLOW_ROUND     5                // С какого раунда можно пользоваться менюшкой
#define ACCESS       ADMIN_MENU        // Флаг доступа к меню. По умолчанию "u"


public plugin_init()
{
#define VERSION "1.1"
    register_plugin(PLUGNAME, VERSION, AUTHOR)
    register_clcmd( "say /admmenu", "admin_menu" )
    register_clcmd( "admmenu", "admin_menu" )
    RegisterHookChain(RG_CSGameRules_RestartRound, "CSGameRules_RestartRound_Pre");
}

new g_iCountRound;
new g_iNumUseMenus[33][3];

public admin_menu(id)
{
    {
        if(get_user_flags(id) & ADMIN_LEVEL_H)
        if ( cs_get_user_team(id) == CS_TEAM_CT )
        {
            new admin_menu = menu_create( "\wОружейная^n\dРазрешена с 5-го раунда", "menu_admin" )
            menu_additem( admin_menu, "Thunderbolt \d[\yВзять\d]", "1", 0 )
            menu_additem( admin_menu, "Needler \d[\yВзять\d]", "2", 0 )
            menu_additem( admin_menu, "Набор гранат \d[\yВзять\d]", "3", 0 )

            menu_setprop( admin_menu, MPROP_EXIT, MEXIT_ALL )
            menu_display( id, admin_menu, 0 )
        }
    }
}

public CSGameRules_RestartRound_Pre()
{
    if(get_member_game(m_bCompleteReset))
        g_iCountRound = 0;
    g_iCountRound++;

    new iPlayers[MAX_CLIENTS], iPlayersNum;
    get_players(iPlayers, iPlayersNum, "ch");

    for(new id; id < iPlayersNum; id++)
        arrayset(g_iNumUseMenus[id], 0, sizeof(g_iNumUseMenus));
}

public CmdWeaponMenu(id)
{
    if(get_user_flags(id) & ACCESS)
    {
        if(g_iCountRound < ALLOW_ROUND) client_print(id, print_chat, "* WeaponMenu доступно только с %d раунда *", ALLOW_ROUND);
    }
    else client_print(id, print_notify, "* Доступ запрещён *");
    return PLUGIN_HANDLED;
}

public menu_admin( id, menu, item )
{
    if( item == MENU_EXIT )
    {
        menu_destroy( menu )
        return PLUGIN_HANDLED
    }
    new data[6], iName[64]
    new access, callback

    menu_item_getinfo( menu, item, access, data,5, iName, 63, callback )
    new key = str_to_num( data )
    switch( key )
    {
        case 1:
        {
            if( is_user_alive( id ) )
            {
                client_cmd(id, "admin_get_thunderbolttttt")
            }
        }
        case 2:
        {
            if( is_user_alive( id ) )
            {
                client_cmd(id, "admin_get_needlerrrrr")
            }
        }
        case 3:
        {
            if( is_user_alive( id ) )
            {
                give_item(id, "weapon_hegrenade")
                give_item(id, "weapon_flashbang")
            }
        }
    }
    menu_destroy( menu )
    return PLUGIN_HANDLED
}
 
Сообщения
101
Реакции
-11
Помог
2 раз(а)
вот
27 Сен 2022
Artemich, если ты используешь реапи, для чего это????
#include <fun>
#include <cstrike>
 

Вложения

Сообщения
542
Реакции
50
Предупреждения
2
Помог
4 раз(а)
Nemec, плагин не мой, там они нужны для некоторых функций вроде как.
 
Сообщения
101
Реакции
-11
Помог
2 раз(а)
Artemich, ну так меняй и эти нативы
give_item
cs_get_user_team
И второй вопрос, неужели ты не заметил ошибок в его коде??? Которые во приоре не откроет меню
 
Последнее редактирование:
Сообщения
101
Реакции
-11
Помог
2 раз(а)
Да дело не в этом, ты в последнем посте с кодом, скинул набор слов, копировал там незная что и вставил незная куда и для чего. Для этого для начала протести свой вариант. И в этом варианте что кинули, много того что ему воприоре не нужно
 
Сообщения
46
Реакции
2
Помог
1 раз(а)
Nemec, я уже немного запутался в том, что все таки нужно сделать, чтобы работало мое меню, без переноса оружия на плагин, который скинул мне Artemich
Если такое вообще возможно
 
Сообщения
101
Реакции
-11
Помог
2 раз(а)
Я скинул тебе фаил выше. Правда код твой очень устарел, я в нем указал как на подобии твоего варианта это реализовать
 
Сообщения
46
Реакции
2
Помог
1 раз(а)
Nemec, не заметил сразу, спасибо! Сейчас проверил, вроде как работает. Вопрос: надпись "Доступна с 5-го раунда" исчезнет после того, как меню станет доступным, правильно?
 
Сообщения
101
Реакции
-11
Помог
2 раз(а)
Там ошибку забыл исправить, незаметил

Убрать проверку в самих кейсах на живучесть, ведь до этого указана эта проверка
27 Сен 2022
Код:
#include <amxmodx>
#include <fun>
#include <cstrike>

#define PLUGNAME "Weaponmenu"
#define VERSION "1.0"
#define AUTHOR "Kiow"

new g_round;

public plugin_init()
{
    register_plugin(PLUGNAME, VERSION, AUTHOR)
    register_clcmd( "say /admmenu", "menu" )
    register_clcmd( "admmenu", "menu" )
    
    register_event("HLTV", "StartRound", "a", "1=0", "2=0")
    register_event("TextMsg", "RestartRound", "a", "2=#Game_will_restart_in","2=#Game_Commencing")
}

public RestartRound()
    g_round = 0                                                                                         
    
public StartRound()
    ++g_round
                                                                                          
public menu(id)                                                                 
{
    if (!(get_user_flags(id) & ADMIN_LEVEL_H) || !is_user_alive(id) )
        return PLUGIN_HANDLED
            
    if ( cs_get_user_team(id) == CS_TEAM_CT )
    {                                                                           
        new szBuffer[128];
        format( szBuffer, charsmax(szBuffer), "\wОружейная^n%s", g_round < 5 ? "\dРазрешена с 5-го раунда" : "" )
            
        new iMenu = menu_create( szBuffer, "menu_hander" )
        menu_additem( iMenu, "Thunderbolt \d[\yВзять\d]", "1" )
        menu_additem( iMenu, "Needler \d[\yВзять\d]", "2" )
        menu_additem( iMenu, "Набор гранат \d[\yВзять\d]", "3" )

        menu_setprop( iMenu, MPROP_EXIT, MEXIT_ALL )
        menu_display( id, iMenu )       
    }
                                                            
    return PLUGIN_HANDLED
}                                 
                                                                  
public menu_hander( id, menu, item )
{
    if( !is_user_alive(id) || item == MENU_EXIT || g_round < 5 )
    {
        menu_destroy( menu )
        return PLUGIN_HANDLED
    }
    
    switch( item )
    {
        case 0: client_cmd(id, "admin_get_thunderbolttttt")
        case 1: client_cmd(id, "admin_get_needlerrrrr")

        case 2:
        {
            give_item(id, "weapon_hegrenade")
            give_item(id, "weapon_flashbang")
        }
    }
    
    menu_destroy( menu )
    return PLUGIN_HANDLED
}
 
Сообщения
46
Реакции
2
Помог
1 раз(а)
Nemec, понял о чем ты, изменю. И уже проверил ту функцию, надпись исчезает)

У меня еще вопрос: есть ли аналог строк кода, как в этом плагине, для того, чтобы у моего меню было несколько вариантов. То есть в этом плагине menufront.sma есть два стиля, так сказать. Один применяется, когда его открывает простой игрок (становится серым, некликабельным и появляется надпись "Отказано в доступе"), а второй применяется при открытии игрока с необходимым флагом доступа.
В прикрепленном плагине код новее, мне интересно есть ли аналог для старого кода

Код:
if(get_user_flags(id) &  ADMIN_KICK)
    {
        iLen += formatex(menu[iLen], charsmax(menu) - iLen, "\r1. \wКикнуть^n")
        keys |= MENU_KEY_1
    }
    else
    {
        iLen += formatex(menu[iLen], charsmax(menu) - iLen, "\r1. \dКикнуть^n")
        keys &= ~MENU_KEY_1   
    }
 

Download all Attachments

Сообщения
101
Реакции
-11
Помог
2 раз(а)
В вашем посте с кодом, вы применяете меню старого образца, насчет новизны, заменить пару нативов и сам отлов рестарта и старта нового раунда, все можно взять с образца выше предложенного другого пользователя
 
Сообщения
542
Реакции
50
Предупреждения
2
Помог
4 раз(а)
да, вот новый и простенький в изменении.
Код:
#include <amxmodx>
enum _:DATA { Name[64], Cmd[32], Flags }

// #define ADMIN_LOADER           // Выводить срок до конца админки с Admin Loader by Neugomon
new g_szDefaultItems[][DATA] =    // Стандартные пункты в меню | { "название пункта", "команда", "флаг доступа" }
{
    { "Кикнуть", "amx_kickmenu", ADMIN_KICK },
    { "Забанить", "fb_menu", ADMIN_BAN },
    { "Ударить/Убить", "amx_slapmenu", ADMIN_SLAY },
    { "Команда игрока", "amx_teammenu", ADMIN_KICK },
    { "Смена карты", "amx_mapmenu", ADMIN_MAP },
    { "Голосование за карту", "amx_votemapmenu", ADMIN_VOTE },
    { "Сделать скриншоты игроку^n", "amx_screenmenu", ADMIN_BAN },
    { "Сделать рестарт раунда^n", "sv_restartround 1", ADMIN_BAN },
    { "\yGagнуть игрока", "amx_gagmenu", ADMIN_BAN },
    { "\yДать бан ушедшему игроку", "fb_offban", ADMIN_BAN },
    { "\yРазбан Меню", "fb_unban", ADMIN_BAN },
    { "\yОчистить кеш после разбана^n", "fb_flushcache", ADMIN_BAN },
    { "\rЗапрет оружия", "amx_restmenu", ADMIN_CFG },
    { "\rНастройка статистики", "amx_statscfgmenu", ADMIN_CFG },
    { "\rВыключить сервер", "shutdownserver", ADMIN_CFG },
    { "\yПерезапустить сервер", "restart", ADMIN_CFG },   
}

new g_iNumItems;
new g_szMenuData[128][DATA];
new g_iMenuPage[33];
#if defined ADMIN_LOADER
    native admin_expired(index);
#endif   
public plugin_init()
{
    register_plugin("Menus Front-End", "1.5", "neugomon");
    
    register_clcmd("amxmodmenu",         "clcmdAdminMenu", ADMIN_MENU);
    register_srvcmd("amx_addmenuitem",     "SrvAddMenuItems");
    
    register_menucmd(register_menuid("AMX Menu"), 1023, "amxx_handler");
    
    MenuDefaultLoad();
}

public clcmdAdminMenu(id, flags)
{
    if(get_user_flags(id) & flags)
    {
        g_iMenuPage[id] = 0;
        BuildMenu(id, g_iMenuPage[id]);
    }   
    else    console_print(id, "* Вы не имеете доступа к этой команде");
    return PLUGIN_HANDLED;
}

public SrvAddMenuItems()
{
    if(read_argc() >= 3)
    {
        new ItemName[64], ItemCmd[32], ItemFlags[30];
        read_argv(1, ItemName, charsmax(ItemName));
        read_argv(2, ItemCmd, charsmax(ItemCmd));
        read_argv(3, ItemFlags, charsmax(ItemFlags));
        
        copy(g_szMenuData[g_iNumItems][Name],     charsmax(g_szMenuData[][Name]), ItemName);
        copy(g_szMenuData[g_iNumItems][Cmd],     charsmax(g_szMenuData[][Cmd]),     ItemCmd);
        g_szMenuData[g_iNumItems][Flags] =     read_flags(ItemFlags);
        g_iNumItems++;
    }
    else    server_print("[Menus Front-End by Neugomon] Item not added! Syntax: ^"Item name^" ^"Item command^" ^"Item access^"");
    return PLUGIN_HANDLED;
}

MenuDefaultLoad()
{
    for(new i; i < sizeof g_szDefaultItems; i++)
    {
        copy(g_szMenuData[g_iNumItems][Name],     charsmax(g_szMenuData[][Name]), g_szDefaultItems[i][Name]);
        copy(g_szMenuData[g_iNumItems][Cmd],      charsmax(g_szMenuData[][Cmd]),  g_szDefaultItems[i][Cmd]);
        g_szMenuData[g_iNumItems][Flags] =     g_szDefaultItems[i][Flags];
        g_iNumItems++;
    }
}

BuildMenu(id, pos)
{
    new szMenu[512];
    new len
    new start     = pos * 8;
    new end     = start + 8;
    new keys    = MENU_KEY_0;
    
    if(start >= g_iNumItems)
        start = pos = g_iMenuPage[id] = 0;
    if(g_iNumItems == 9 || end > g_iNumItems)
        end = g_iNumItems;   
#if defined ADMIN_LOADER
    new exp = admin_expired(id);
    if(exp > 0)
    {
        new systime = get_systime();
        if(exp - systime > 0)
        {
            if((exp - systime) / 86400 > 0)
                len = formatex(szMenu, charsmax(szMenu), "\rAmxModMenu^n\wОсталось \r%d \wдней^n^n", ((exp - systime) / 86400));
            else    len = formatex(szMenu, charsmax(szMenu), "\rAmxModMenu^n\rПоследний \wдень^n^n");
        }
    }
    else if(exp == 0)    len = formatex(szMenu, charsmax(szMenu), "\rAmxModMenu^n\wПрава \yне ограничены^n^n");
#else
    len = formatex(szMenu, charsmax(szMenu), "\rAmxModMenu^n\wВыберите действие^n^n");
#endif
    for(new i = start, flags = get_user_flags(id), a; i < end; i++)
    {
        if(flags & g_szMenuData[i][Flags])
        {
            keys |= (1 << a);
            len += formatex(szMenu[len], charsmax(szMenu) - len, "\r%d. \w%s^n", ++a, g_szMenuData[i][Name]);
        }
        else    len += formatex(szMenu[len], charsmax(szMenu) - len, "\r%d. \d%s^n", ++a, g_szMenuData[i][Name]);
    }   
    
    if(end != g_iNumItems)
    {
        formatex(szMenu[len], charsmax(szMenu) - len, "^n\r9. \yДалее^n\r0. \r%s", pos ? "Назад" : "Выход");
        keys |= MENU_KEY_9;
    }
    else formatex(szMenu[len], charsmax(szMenu) - len, "^n\r0. \r%s", pos ? "Назад" : "Выход");
    
    return show_menu(id, keys, szMenu, -1, "AMX Menu");
}

public amxx_handler(id, key)
{
    switch(key)
    {
        case 9: if(g_iMenuPage[id]) BuildMenu(id, --g_iMenuPage[id]);
        default:
        {
            if(key == 8 && g_iNumItems > 9)
                BuildMenu(id, ++g_iMenuPage[id]);
            else
            {
                new pos = g_iMenuPage[id] * 8 + key;
                if(g_szMenuData[pos][Cmd][0] == 's' && g_szMenuData[pos][Cmd][1] == 'v' && g_szMenuData[pos][Cmd][2] == '_')
                    server_cmd(g_szMenuData[pos][Cmd]);
                else     client_cmd(id, g_szMenuData[pos][Cmd]);
            }
        }
    }   
    return PLUGIN_HANDLED;
}
 
Сообщения
46
Реакции
2
Помог
1 раз(а)
Artemich, Вы не поняли, я скинул menufront как пример. В нем используются одни новые строки кода, которые мне нужны для плагина "Оружейной" со старым кодом
 

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

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