// Создаем глобальное событие, чтобы отследить, кто нажал какой-либо пункт в меню // --- // Оно будет иметь следующий вид // TEST_OnItemPressed(iClient, iItemID, const String:szItemName[], const String:szItemDescription[]), где // iClient - ID клиента, который нажал на пункт (Param_Cell) // iItemID - позиция пункта в меню (Param_Cell) // szItemName - название пункта(Param_String) // szItemDecription - описание пункта (Param_String) g_hOnItemPressed = CreateGlobalForward("TEST_OnItemPressed", ET_Ignore, Param_Cell, Param_Cell, Param_String, Param_String);
// Регистрируем команду RegConsoleCmd("test", RCC_Test); }
public APLRes:AskPluginLoad2(Handle:hSelf, bool:bLate, String:szError[], iError_Max) { // Создаем натив, он и будет регистрировать новый плагин в модульной системе CreateNative("TEST_RegisterItem", CN_RegisterItem);
return APLRes_Success; }
// TEST_RegisterItem будет иметь следующий вид // TEST_RegisterItem(const String:szItemName[], const String:szItemDescription[]) // Что будет делать этот натив? // --- // Он будет добавлять в главное меню пункт, где // szItemName - название пункта // szItemDecription - описание пункта, то есть то, что мы будем видеть, листая меню public CN_RegisterItem(Handle:hPlugin, iParams) { // Получем первый параметр (TEST_RegisterItem("1_параметр", "2_параметр")) decl String:szItemName[16]; if (GetNativeString(1, szItemName, sizeof(szItemName)) == SP_ERROR_NONE) { // Получаем второй параметр decl String:szItemDescription[64]; if (GetNativeString(2, szItemDescription, sizeof(szItemDescription)) == SP_ERROR_NONE) { // Добавляем в меню AddMenuItem(g_hGlobalMenu, szItemName, szItemDescription);
// Возвращаем позицию пункта return g_iItemID++; } }
// Возвращаем -1, если не удалось добавить пункт в меню return -1; }
// Callback нашего глобального меню public CT_MenuHandler(Handle:hMenu, MenuAction:iAction, iParam1, iParam2) { switch (iAction) { // Если пункт какой-либо выбран case MenuAction_Select: { // Получаем название и описание пункта decl String:szItemName[16], String:szItemDescription[32]; GetMenuItem(hMenu, iParam2, szItemName, sizeof(szItemName), _, szItemDescription, sizeof(szItemDescription));
// Передаем данные нашему глобальному событию // Напомню, что оно имеет вид: // TEST_OnItemPressed(iClient, iItemID, const String:szItemName[], const String:szItemDescription[]) // --- Call_StartForward(g_hOnItemPressed);
// Передаем ID клиента (iClientID) Call_PushCell(iParam1);
// Передаем позицию пункта (iItemID) Call_PushCell(iParam2);
// Передаем название пункта Call_PushString(szItemName);
// Передаем описание пункта Call_PushString(szItemDescription); Call_Finish(); } } }
// Соответственно, это наша команда public Action:RCC_Test(iClient, iArgs) { if (iClient > 0) { // Показываем меню при вызове команды DisplayMenu(g_hGlobalMenu, iClient, MENU_TIME_FOREVER); }
return Plugin_Handled; }
Код
#if defined _test_included #endinput #endif #define _test_included
// Суть данного модуля: // --- // Показать меню с игроками. Кикнуть выбранного игрока
#include <sourcemod> #include <test>
new g_iItemID = -1;
public OnPluginStart() { if ((g_iItemID = TEST_RegisterItem("test_module_1", "Для теста 1")) == -1) { // Ошибка создания пункта SetFailState("Error"); }
// Проверяем на всякий случай, при старте плагина выводим позицию клиента // можно убрать '//' для теста //PrintToServer("Module #1: %d", g_iItemID); }
// Вот и наше событие public TEST_OnItemPressed(iClient, iItemID, const String:szItemName[], const String:szItemDescription[]) { // Можно убрать '//' для теста //PrintToConsole(iClient, "(Modude 1) iClient = %d || iItemID = %d (g_iItemID = %d) || Name = %s || Desc = %s", iClient, iItemID, g_iItemID, szItemName, szItemDescription);
// Теперь нам необходимо узнать, точно ли используется пункт из этого плагина // Для этого сравниваем iItemID (позиция пункта, на который нажали) и g_iItemID (позиция пункта нашего плагина) if (g_iItemID == iItemID) { new Handle:hMenu = CreateMenu(CT_MenuHandler); SetMenuTitle(hMenu, "Выберите игрока");
decl String:szClientUserID[8], String:szClientName[32]; for (new i = 1; i <= MaxClients; i++) { if (IsClientInGame(i)) { if (GetClientName(i, szClientName, sizeof(szClientName))) { IntToString(GetClientUserId(i), szClientUserID, sizeof(szClientUserID)); AddMenuItem(hMenu, szClientUserID, szClientName); } } }
public OnPluginStart() { if ((g_iItemID = TEST_RegisterItem("Для теста 1")) == -1) { // Ошибка создания пункта SetFailState("Error"); }
PrintToServer("Module #1: %d", g_iItemID); }
// Вот и наше событие public TEST_OnItemPressed(iClientID, iItemID) { PrintToConsole(iClientID, "(Modude 1) iClientID = %d || iItemID = %d (g_iItemID = %d)", iClientID, iItemID, g_iItemID);
// Теперь нам необходимо узнать, точно ли используется пункт из этого плагина // Для этого сравниваем iItemID (позиция пункта, который нажали) и g_iItemID (позиция пункта нашего плагина) if (g_iItemID == iItemID) { new Handle:hMenu = CreateMenu(CT_MenuHandler); SetMenuTitle(hMenu, "Выберите игрока");
decl String:szClientUserID[8], String:szClientName[32]; for (new i = 1; i <= MaxClients; i++) { if (IsClientInGame(i)) { if (GetClientName(i, szClientName, sizeof(szClientName))) { IntToString(GetClientUserId(i), szClientUserID, sizeof(szClientUserID)); AddMenuItem(hMenu, szClientUserID, szClientName); } } }
ой прости не правильно написал, я имел в виду как сделать все пункты мультиязычными без, исключений!
так вить не покатит же!
Код
public OnPluginStart() { g_hGlobalMenu = CreateMenu(CT_MenuHandler); for (new i = 1; i <= MaxClients; i++) { SetMenuTitle(g_hGlobalMenu,"%T","TEST_MENU",i); }
Сообщение отредактировал «SeReGa»☆ - Пятница, 12.06.2015, 00:58:19
TEIN, АГА! есть есть, знаю знаю) там нужной информации нет(
Добавлено (12.06.2015, 19:48:32) --------------------------------------------- кто нибудь знает как сделать пункт SetPanelTitle(g_hGlobalPanel, "Панель"); мультиязычным в событии OnPluginStart() ??
Сообщение отредактировал «SeReGa»☆ - Пятница, 12.06.2015, 19:49:23
// Создаем глобальное событие, чтобы отследить, кто нажал какой-либо пункт в меню // --- // Оно будет иметь следующий вид // TEST_OnItemPressed(iClient, iItemID, const String:szItemName[], const String:szItemDescription[]), где // iClient - ID клиента, который нажал на пункт (Param_Cell) // iItemID - позиция пункта в меню (Param_Cell) // szItemName - название пункта(Param_String) // szItemDecription - описание пункта (Param_String) g_hOnItemPressed = CreateGlobalForward("TEST_OnItemPressed", ET_Ignore, Param_Cell, Param_Cell, Param_String, Param_String);
// Регистрируем команду RegConsoleCmd("test", RCC_Test);
LoadTranslations("test.phrases.txt"); }
public APLRes:AskPluginLoad2(Handle:hSelf, bool:bLate, String:szError[], iError_Max) { // Создаем натив, он и будет регистрировать новый плагин в модульной системе CreateNative("TEST_RegisterItem", CN_RegisterItem);
return APLRes_Success; }
// TEST_RegisterItem будет иметь следующий вид // TEST_RegisterItem(const String:szItemName[], const String:szItemDescription[]) // Что будет делать этот натив? // --- // Он будет добавлять в главное меню пункт, где // szItemName - название пункта // szItemDecription - описание пункта, то есть то, что мы будем видеть, листая меню public CN_RegisterItem(Handle:hPlugin, iParams) { // Получем первый параметр (TEST_RegisterItem("1_параметр", "2_параметр")) decl String:szItemName[16]; if (GetNativeString(1, szItemName, sizeof(szItemName)) == SP_ERROR_NONE) { // Получаем второй параметр decl String:szItemDescription[64]; if (GetNativeString(2, szItemDescription, sizeof(szItemDescription)) == SP_ERROR_NONE) { // Добавляем в меню AddMenuItem(g_hGlobalMenu, szItemName, szItemDescription);
// Возвращаем позицию пункта return g_iItemID++; } }
// Возвращаем -1, если не удалось добавить пункт в меню return -1; }
// Callback нашего глобального меню public CT_MenuHandler(Handle:hMenu, MenuAction:iAction, iParam1, iParam2) { switch (iAction) { case MenuAction_Display: { decl String:display[64]; Format(display, sizeof(display), "%T", "TEST_MENU", iParam1); SetMenuTitle(g_hGlobalMenu, display); }
// Если пункт какой-либо выбран case MenuAction_Select: { // Получаем название и описание пункта decl String:szItemName[16], String:szItemDescription[32]; GetMenuItem(hMenu, iParam2, szItemName, sizeof(szItemName), _, szItemDescription, sizeof(szItemDescription));
// Передаем данные нашему глобальному событию // Напомню, что оно имеет вид: // TEST_OnItemPressed(iClient, iItemID, const String:szItemName[], const String:szItemDescription[]) // --- Call_StartForward(g_hOnItemPressed);
// Передаем ID клиента (iClientID) Call_PushCell(iParam1);
// Передаем позицию пункта (iItemID) Call_PushCell(iParam2);
// Передаем название пункта Call_PushString(szItemName);
// Передаем описание пункта Call_PushString(szItemDescription); Call_Finish(); } } }
// Соответственно, это наша команда public Action:RCC_Test(iClient, iArgs) { if (iClient > 0) { // Показываем меню при вызове команды DisplayMenu(g_hGlobalMenu, iClient, MENU_TIME_FOREVER); } return Plugin_Handled; }