Заказать Сервер Заказать Плагин Контакты Поиск

[ вход ]
[ последние сообщения ]

Страница 1 из 11
Форум » SourceMod - Counter Strike Source && CS GO » Уроки SourceMod (SourcePawn) Скриптинга » Добавление Категорий/Опций в SM Админку
Добавление Категорий/Опций в SM Админку
_wS_ Дата: Воскресенье, 08.07.2012, 12:28:05 | Сообщение # 1
Добавление Категорий/Опций в SourceMod Админку

Даю код для примера с комментариями (скачайте архив в прикреплениях) :

Code
#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:

Code
1 - Handle главного админ-меню
2 - уникальное имя для категории/опции
3 - TopMenuObject_Category (категория), TopMenuObject_Item (опция в категории)
4 - функция, которая будет вызвана
5 - если это опция, укажите здесь TopMenuObject: категории. Если категория, то INVALID_TOPMENUOBJECT
6 - имя (название) команды для проверки доступа (не обязательно)
7 - флаг для доступа к категории/опции (не обязательно)
8 - какой-то текст, если вам нужно сохранить его здесь (не обязательно)

TopMenuAction

Code
TopMenuAction_DisplayOption
TopMenuAction_DisplayTitle
TopMenuAction_SelectOption
TopMenuAction_DrawOption
TopMenuAction_RemoveObject

TopMenuObjectType

Code
TopMenuObject_Category
TopMenuObject_Item

TopMenuPosition

Code
TopMenuPosition_Start - главное меню
TopMenuPosition_LastRoot - Последняя позиция в главном меню
TopMenuPosition_LastCategory - Последняя позиция в последней категории

TopMenuObject

Code
INVALID_TOPMENUOBJECT

Прикрепления: menu.zip(1Kb)
 
Vitaminoz Дата: Воскресенье, 27.12.2015, 07:49:42 | Сообщение # 2
Сообщений: 135
Репутация: 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 ...
 
Форум » SourceMod - Counter Strike Source && CS GO » Уроки SourceMod (SourcePawn) Скриптинга » Добавление Категорий/Опций в SM Админку
Страница 1 из 11
Поиск: