SourcePawn [SourcePawn] Урок 11 - Админ меню

Pushistik↯❤

Команда форума
Регистрация
6 Июл 2017
Сообщения
393
Реакции
97
Баллы
28
[SourcePawn] Урок 11 - Админ меню
<= К содержанию
PHP:
#pragma semicolon 1
#include <sourcemod>

#undef REQUIRE_PLUGIN    // Все библиотеки подключенные ниже этого  - не обязательные для работы плагина

// Подключаем библиотеку
#include <adminmenu>

#pragma newdecls required

// Создаем переменную для админ-меню

TopMenu g_hAdminMenu = null;

// При старте плагина проверяем
public void OnPluginStart()
{
    // Если библиотека есть
    if (LibraryExists("adminmenu"))
    {
        TopMenu hTopMenu;
        if ((hTopMenu = GetAdminTopMenu()) != null)) // Если админ-меню уже создано
        {
            // Вызываем ф-ю, в которой добавляется пункт в админ-меню
            OnAdminMenuReady(hTopMenu);
        }
    }
}

// Если библиотека была отключена
public OnLibraryRemoved(const char[] szName)
{
    if (StrEqual(szName, "adminmenu"))
    {
        g_hAdminMenu = null;
    }
}

// Ф-я вызывается когда админ-меню готово к добавлению пунктов
public void OnAdminMenuReady(Handle aTopMenu)
{
    /*
    Дальше всё очень сложно, просто всё делаем так же
    */
    TopMenu hTopMenu = TopMenu.FromHandle(aTopMenu);

    if (hTopMenu == g_hAdminMenu)
    {
        return;
    }

    g_hAdminMenu = hTopMenu;

    /* Вот теперь можно добавлять что хотим

    Необходимо различать 2 понятия:
    1. Категория - пункт главной странице админ-меню
    2. Пункт - пункт внутри категории

    Т.е. структура админ-меню выглядит так:

    Админ-меню
    1. Категория 1
        1. Пункт 1
        2. Пункт 2
        3. Пункт 3
        4. Пункт 4
    2. Категория 2
        1. Пункт 1
        2. Пункт 2
    3. Категория 3
        1. Пункт 1
        2. Пункт 2
    4. Категория 4
        1. Пункт 1
        2. Пункт 2
        3. Пункт 3


    Дальше 2 варианта:
        a) Создать категорию и добавить в неё пункты
        b) Добавить пункты в уже существующую категорию
 
        Либо и то и то
    */

    // Вариант a
    TopMenuObject hMyCategory = g_hTopMenu.AddCategory("vip_admin_category", Handler_MenuVIPAdmin, "vip_admin", ADMFLAG_ROOT, "Моя категория 1");
    /*
    "vip_admin_category"    - уникальное имя категории
    Handler_MenuVIPAdmin    - обработчик событий
    "vip_admin"                - команда (для access overrides)
    ADMFLAG_ROOT            - Флаг доступа по умолчанию
    "Моя категория 1"        - Описание категории (опционально)
    */

    // Вариант b
    TopMenuObject hMyCategory = g_hTopMenu.FindCategory("vip_admin_category");
    // Если категории нет вернет INVALID_TOPMENUOBJEC


    if (hMyCategory != INVALID_TOPMENUOBJECT)
    {
        // Теперь можем добавить пункты
        g_hTopMenu.AddItem("vip_add_item", Handler_MenuVIPAdd, hMyCategory, "vip_add", ADMFLAG_ROOT, "Мой пункт 1");
        /*
        "vip_add_item"            - уникальное имя пункта
        Handler_MenuVIPAdd        - обработчик событий
        hMyCategory                - Объект категории в которую должен быть добавлен пункт
        "vip_add"                - команда (для access overrides)
        ADMFLAG_ROOT            - Флаг доступа по умолчанию
        "Мой пункт 1"            - Описание пункта (опционально)
        */

        g_hTopMenu.AddItem("vip_list_item",                Handler_MenuVIPList,            hMyCategory, "vip_list",            ADMFLAG_ROOT);
        g_hTopMenu.AddItem("vip_reload_players_item",    Handler_MenuVIPReloadPlayers,    hMyCategory, "vip_reload_players",    ADMFLAG_ROOT);
    }
}

// обработчик событий категории
public void Handler_MenuVIPAdmin(TopMenu hMenu, TopMenuAction action, TopMenuObject object_id, int iClient, char[] sBuffer, int maxlength)
{
    switch (action)
    {
        // Когда категория отображается пунктом на главной странице админ-меню
    case TopMenuAction_DisplayOption:
        {
            FormatEx(sBuffer, maxlength, "Управление VIP");
        }
        // Когда категория отображается заглавием меню
    case TopMenuAction_DisplayTitle:
        {
            FormatEx(sBuffer, maxlength, "Управление VIP");
        }
    }
}

// обработчик событий пункта
public void Handler_MenuVIPAdd(TopMenu hMenu, TopMenuAction action, TopMenuObject object_id, int iClient, char[] sBuffer, int maxlength)
{
    switch (action)
    {
        // Когда пункт отображается в категории
    case TopMenuAction_DisplayOption:
        {
            FormatEx(sBuffer, maxlength, "Добавить VIP-игрока");
        }
        // Когда пункт выбрали
    case TopMenuAction_SelectOption:
        {
            // открываем меню со списком игроков.
        }
    }
}

public void Handler_MenuVIPList(TopMenu hMenu, TopMenuAction action, TopMenuObject object_id, int iClient, char[] sBuffer, int maxlength)
{
    switch (action)
    {
    case TopMenuAction_DisplayOption: FormatEx(sBuffer, maxlength, "Список VIP-игроков");
    case TopMenuAction_SelectOption:
        {
            // Открываем список VIP-игроков
        }
    }
}

public void Handler_MenuVIPReloadPlayers(TopMenu hMenu, TopMenuAction action, TopMenuObject object_id, int iClient, char[] sBuffer, int maxlength)
{
    switch (action)
    {
    case TopMenuAction_DisplayOption:FormatEx(sBuffer, maxlength, "Перезагрузка VIP-игроков");
    case TopMenuAction_SelectOption:
        {
            //
        }
    }
}
Cобытия админ-меню:
  • OnAdminMenuCreated - Админ-меню готово к добавлению категорий
    PHP:
    void OnAdminMenuCreated(Handle topmenu)
  • OnAdminMenuReady - Админ-меню готово к добавлению пунктов
    PHP:
    void OnAdminMenuReady(Handle topmenu)
  • ADMINMENU_SERVERCOMMANDS или "ServerCommands" - Управление сервером
  • ADMINMENU_VOTINGCOMMANDS или "VotingCommands" - Управление голосованиями
Если вы хотите добавить пункты одну из 3-х стандартных категорий в FindCategory можно использовать:
  • ADMINMENU_PLAYERCOMMANDS или "PlayerCommands" - Управление игроками
  • ADMINMENU_SERVERCOMMANDS или "ServerCommands" - Управление сервером
  • ADMINMENU_VOTINGCOMMANDS или "VotingCommands" - Управление голосованиями
Вспомогательные функции админ-меню:
  • RedisplayAdminMenu - Повторно отображает админ-меню админу после выбора пункта.
    PHP:
    bool RedisplayAdminMenu(Handle topmenu, int client)
  • AddTargetsToMenu - Добавляет цели (игроков) в меню.
    PHP:
    int AddTargetsToMenu(Handle menu, int source_client, bool in_game_only, bool alive_only)
  • AddTargetsToMenu2 - Тоже что и AddTargetsToMenu но с использованием фильтров.
    PHP:
    int AddTargetsToMenu2(Handle menu, int source_client, int flags)
    Фильтры:
    PHP:
    #define COMMAND_FILTER_ALIVE        (1<<0)        /**< Только живые */
    #define COMMAND_FILTER_DEAD            (1<<1)        /**< Только мертвые */
    #define COMMAND_FILTER_CONNECTED    (1<<2)        /**< Разрешить игро, которые не полностью в игре (IsClientInGame) */
    #define COMMAND_FILTER_NO_IMMUNITY    (1<<3)        /**< Игнорировать правила иммунитета */
    #define COMMAND_FILTER_NO_MULTI        (1<<4)        /**< Запретить множественный выбор (Не используется для данной функции) */
    #define COMMAND_FILTER_NO_BOTS        (1<<5)        /**< Исключить ботов */
Еще обратите внимание на методы типа TopMenu · topmenus · SourceMod Scripting API Reference


<= К содержанию
 
Последнее редактирование:
Сверху Снизу