root | Дата: Воскресенье, 03.02.2013, 00:59 | Сообщение # 1 |
Генералиссимус
Группа: Администраторы
Сообщений: 561
Статус: Offline
| Добавление Категорий/Опций в SourceMod Админку
Даю код для примера с комментариями (скачайте архив в прикреплениях) :
Код #pragma semicolon 1
#include <sourcemod> #undef REQUIRE_PLUGIN #include <adminmenu>
new Handle:g_TopMenu = INVALID_HANDLE; // для хранения Handle главного меню new TopMenuObject:g_SpecObject; // храним 'Object' опции "Переместить себя в SPEC"
public OnPluginStart() { // Если библиотека "adminmenu" найдена, вызываем функцию "OnAdminMenuReady" // В качестве параметра передаем Handle главного админ-меню (еще не известно, есть ли оно) if (LibraryExists("adminmenu")) OnAdminMenuReady(GetAdminTopMenu()); }
// Это событие вызывается плагином adminmenu.sp после того, как было создано главное админ-меню public OnAdminMenuReady(Handle:topmenu) { // Если вдруг админ-меню нет, или событие вызывается второй раз, то ничего не делаем if (topmenu == INVALID_HANDLE || topmenu == g_TopMenu) return;
// Сохраняем Handle главного админ-меню в нашей глобальной переменной g_TopMenu = topmenu;
// Если в меню ещё нет нашей категории, то создаем её new TopMenuObject:MyCat = FindTopMenuCategory(g_TopMenu, "MyNewCategory"); if (MyCat == INVALID_TOPMENUOBJECT) { MyCat = AddToTopMenu(g_TopMenu, "MyNewCategory", TopMenuObject_Category, MyNewCategory_CallBack, INVALID_TOPMENUOBJECT); }
// Добавляем опцию в нашу категорию (доступ имеют админы с флагом кик) g_SpecObject = AddToTopMenu(g_TopMenu, "wS_Spec", TopMenuObject_Item, wS_CallBack, MyCat, "sm_kick", ADMFLAG_KICK); }
public MyNewCategory_CallBack(Handle:topmenu, TopMenuAction:action, TopMenuObject:object_id, param, String:buffer[], maxlength) { // Текст нашей категории в главном меню if (action == TopMenuAction_DisplayOption) Format(buffer, maxlength, "МОЯ КАТЕГОРИЯ");
// Заглавие меню, которое откроется после выбора категории else if (action == TopMenuAction_DisplayTitle) Format(buffer, maxlength, "Выберите действие:"); }
public wS_CallBack(Handle:topmenu, TopMenuAction:action, TopMenuObject:object_id, param, String:buffer[], maxlength) { // Устанавливаем текст опции if (action == TopMenuAction_DisplayOption) Format(buffer, maxlength, "Переместить себя в SPEC");
// Если игрок выбрал опцию else if (action == TopMenuAction_SelectOption) { // Если это опция "Переместить себя в SPEC" if (object_id == g_SpecObject) { if (GetClientTeam(param) > 1) ChangeClientTeam(param, 1); else PrintToChat(param, "Вы и так в SPEC.."); }
if (g_TopMenu != INVALID_HANDLE) DisplayTopMenu(g_TopMenu, param, TopMenuPosition_LastCategory); else PrintToChat(param, "Библиотека \"adminmenu\" не найдена"); } }
public OnLibraryRemoved(const String:name[]) { // Если вдруг библиотека "adminmenu" удалилась, то очищаем переменную g_TopMenu if (StrEqual(name, "adminmenu")) g_TopMenu = INVALID_HANDLE; } AddToTopMenu(1, 2, 3, 4, 5, [6], [7], [8]) - добавляет категорию или опцию и возвращает ее TopMenuObject:
Код 1 - Handle главного админ-меню 2 - уникальное имя для категории/опции 3 - TopMenuObject_Category (категория), TopMenuObject_Item (опция в категории) 4 - функция, которая будет вызвана 5 - если это опция, укажите здесь TopMenuObject: категории. Если категория, то INVALID_TOPMENUOBJECT 6 - имя (название) команды для проверки доступа (не обязательно) 7 - флаг для доступа к категории/опции (не обязательно) 8 - какой-то текст, если вам нужно сохранить его здесь (не обязательно) TopMenuAction
Код TopMenuAction_DisplayOption TopMenuAction_DisplayTitle TopMenuAction_SelectOption TopMenuAction_DrawOption TopMenuAction_RemoveObject TopMenuObjectType
Код TopMenuObject_Category TopMenuObject_Item TopMenuPosition
Код TopMenuPosition_Start - главное меню TopMenuPosition_LastRoot - Последняя позиция в главном меню TopMenuPosition_LastCategory - Последняя позиция в последней категории TopMenuObject
|
|
| |