• Пожалуйста, создайте название темы отражающее ее смысл
  • Для ускорения решения Вашего вопроса заполните обязательные поля и подробно опишите возникшую проблему

Помощь menufront

krenko3

Участник
Сообщения
126
Реакции
13
Баллы
18
Всем привет.

Если не сложно, помогите, пожалуйста.

Есть плагин.

Тут есть функционал по выводу срока до конца админки через Admin Loader by Neugomon.

Помогите, пожалуйста, вшить в плагин вывод срока через GameCMS API.

Может и за идею нового плагина под GameCMS API пойдёт) Не знаю, где тут на форуме можно идеи закидывать.


Код:
// *************************************************************************************//
// Плагин загружен с  www.neugomon.ru                                                   //
// Автор: Neygomon                                                                      //
// При копировании материала ссылка на сайт www.neugomon.ru ОБЯЗАТЕЛЬНА!                //
// *************************************************************************************//

#include <amxmodx>
enum _:DATA { Name[64], Cmd[32], Flags }

//#define ADMIN_LOADER        // Выводить срок до конца админки с Admin Loader by Neugomon
new g_szDefaultItems[][DATA] =    // Стандартные пункты в меню | { "название пункта", "команда", "флаг доступа" }
{
    { "Кикнуть",             "amx_kickmenu",     ADMIN_KICK },
    { "\rЗабанить",         "amx_banmenu",         ADMIN_BAN },
    { "\yУдарить\w/\rУбить",    "amx_slapmenu",     ADMIN_SLAY },
    { "\yКоманда игрока",        "amx_teammenu",    ADMIN_KICK },
    { "Голосование за карту\r[Правила!]\y",         "amx_votemapmenu",         ADMIN_VOTE },
    { "Заткнуть игрока",         "amx_gagmenu",         ADMIN_BAN },
    { "\rМеню Бакугана",     "ar_armymenu",     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;
}
 

Вложения

  • menufront_end.sma
    5.1 KB · Просмотры: 8
Ниже добавить
Код:
#include <gamecms5>

Раскомментировать..
Ниже добавить
C++:
#define admin_expired(%1) cmsapi_service_timeleft(%1)
Так?


Код:
// *************************************************************************************//
// Плагин загружен с  www.neugomon.ru                                                   //
// Автор: Neygomon                                                                      //
// При копировании материала ссылка на сайт www.neugomon.ru ОБЯЗАТЕЛЬНА!                //
// *************************************************************************************//

#include <amxmodx>
#include <gamecms5>
enum _:DATA { Name[64], Cmd[32], Flags }

#define ADMIN_LOADER        // Выводить срок до конца админки с Admin Loader by Neugomon
#define admin_expired(%1) cmsapi_service_timeleft(%1)
new g_szDefaultItems[][DATA] =    // Стандартные пункты в меню | { "название пункта", "команда", "флаг доступа" }
{
    { "Кикнуть",             "amx_kickmenu",     ADMIN_KICK },
    { "\rЗабанить",         "amx_banmenu",         ADMIN_BAN },
    { "\yУдарить\w/\rУбить",    "amx_slapmenu",     ADMIN_SLAY },
    { "\yКоманда игрока",        "amx_teammenu",    ADMIN_KICK },
    { "Голосование за карту\r[Правила!]\y",         "amx_votemapmenu",         ADMIN_VOTE },
    { "Заткнуть игрока",         "amx_gagmenu",         ADMIN_BAN },
    { "\rМеню Бакугана",     "ar_armymenu",     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;
}

Так ошибка.

Код:
//AMXXPC compile.exe
// by the AMX Mod X Dev Team


//// menufront_end.sma
// C:\Users\Artjom\Desktop\ъюьяшы ЄюЁ\menufront_end.sma(29) : error 021: symbol
already defined: "cmsapi_service_timeleft"
//
// 1 Error.
// Could not locate output file C:\Users\Artjom\Desktop\ъюьяшы ЄюЁ\compiled\menu
front_end.amx (compile failed).
//
// Compilation Time: 0,12 sec
// ----------------------------------------

Press enter to exit ...
 

Вложения

  • menufront.sma
    5.5 KB · Просмотры: 22
Вот мой вариант + Поддержка нескольких языков + Менюшки отображаются по уровням доступа.
Очень удобно когда на сервере несколько уровней Админов. Админ Зам и т.д Чтобы простой Админ мог видеть только то что ему положено.
Особенно полезно для любителей испытывать удачу, а вдруг у меня получиться нажать (неактивное меню) :D
 

Вложения

  • menufront.sma
    4.9 KB · Просмотры: 33
  • menufront.txt
    4.1 KB · Просмотры: 26
Назад
Сверху