_wS_
|
Дата: Воскресенье, 08.07.2012, 12:28:05 | Сообщение # 1 |
|
Добавление Категорий/Опций в 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
Гости не могут скачивать файлы
|
|
|
| |
Vitaminoz
|
Дата: Воскресенье, 27.12.2015, 07:49:42 | Сообщение # 2 |
 |
Сообщений: 142
Репутация: 1 [ +/- ]
|
|
Сделал код (по новому синтаксису):
Код #undef REQUIRE_PLUGIN #include <adminmenu>
TopMenu h_AdminMenu; TopMenuObject h_AdminMenu_Object;
public Plugin Myinfo = { name = "L4D AdminMenu Extension", author = "Vitamin" , description = "Extend Admin Menu for Others Commands", version = "1.0", url = "http://l4d-zone.ru" }
public void OnPluginStart() { if (LibraryExists("adminmenu")) { OnAdminMenuReady(GetAdminTopMenu()); } }
public void OnLibraryRemoved(const char[] name) { if (StrEqual(name, "adminmenu")) { h_AdminMenu = null; } }
public void OnAdminMenuReady(TopMenu topmenu) { if (topmenu == null || topmenu == h_AdminMenu) { return; } h_AdminMenu = topmenu; TopMenuObject h_AdminMenu_Object_Buffer = FindTopMenuCategory(h_AdminMenu, ADMINMENU_PLAYERCOMMANDS); if (h_AdminMenu_Object_Buffer == INVALID_TOPMENUOBJECT) { return; } h_AdminMenu_Object = AddToTopMenu(h_AdminMenu, "AdminMenu_Extension", TopMenuObject_Item, Item_CallBack, h_AdminMenu_Object_Buffer, "sm_kick", ADMFLAG_KICK); }
public void Item_CallBack(TopMenu topmenu, TopMenuAction action, TopMenuObject object_id, int client, char[] buffer, int maxlength) { if (action == TopMenuAction_DisplayOption) { Format(buffer, maxlength, "Test"); } else if (action == TopMenuAction_DisplayTitle) { Format(buffer, maxlength, "Выберите опцию:"); } } Но около часу уже не могу понять почему мне сыпяться ошибки, мол что я создал неправильного типа переменные ...
Код //SourceMod Batch Compiler // by the SourceMod Dev Team
//// l4d_adminmenu.sp // // C:\Program Files\valve\left4dead\left4dead\addons\sourcemod\scripting\l4d_adm inmenu.sp(32) : error 181: function argument named 'topmenu' differs from protot ype // C:\Program Files\valve\left4dead\left4dead\addons\sourcemod\scripting\l4d_adm inmenu.sp(47) : error 100: function prototypes do not match // C:\Program Files\valve\left4dead\left4dead\addons\sourcemod\scripting\l4d_adm inmenu.sp(47) : warning 204: symbol is assigned a value that is never used: "h_A dminMenu_Object" // // 2 Errors. // // Compilation Time: 0,11 sec // ----------------------------------------
Press enter to exit ...
|
|
| |