Источник: JustServer.Ru
В этой статье мы рассмотрим создание меню сформированного из игроков в старой системе меню на примере меню кика игроков.
Для начала создадим нужные нам переменные
- Код: Выделить всё
// Текущая страница меню
new g_iPlayerMenuPage[33];
// Соотношение пункта к игроку в меню
new g_apPlayerMenuPlayers[33][32];
Далее в plugin_init зарегистрируем наше меню, а также зарегистрируем команду для вызова меню и словарь.
- Код: Выделить всё
// Инициализация плагина
public plugin_init()
{
// Регистрируем команду для вызова меню кика
register_clcmd("say /KickPlayerMenu", "ClCmdKickPlayerMenu", ADMIN_KICK);
// Регистрируем меню (1-ый аргумент - ID меню (получается по его названию), 2-ой аргумент - кнопки (1023 все кнопки), 3-ий аргумент - функция которая будет вызываться при нажатии кнопки)
register_menucmd(register_menuid("Kick Player"), 1023, "MenuKickPlayer");
// Регистрируем словарь
register_dictionary("KickPlayerMenu.txt");
}
Перехват команды say /KickPlayerMenu
- Код: Выделить всё
// Кто-то написал /KickPlayerMenu
public ClCmdKickPlayerMenu(pId, bitsAccess)
{
// Если нету нужного флага не продолжаем
if (!(get_user_flags(pId) & bitsAccess))
return PLUGIN_CONTINUE;
// Показываем меню кика и обнуляем страницу
ShowMenuKickPlayer(pId, g_iPlayerMenuPage[pId] = 0);
// Не показываем команду в чате
return PLUGIN_HANDLED;
}
Функция показа меню кика:
- Код: Выделить всё
// Показываем меню игроку
public ShowMenuKickPlayer(pId, iPage)
{
// Если страница меньше нуля не продолжаем
if (iPage < 0)
return PLUGIN_HANDLED;
new apPlayers[32]; // Массив из игроков
new iPlayers; // Всего игроков
new szMenu[512], szName[32]; // Меню, имя
new pPlayer; // Игрок
// Получаем игроков
get_players(apPlayers, iPlayers);
// Находим стартового игрока
new i = min(iPage * 8, iPlayers);
new iStart = i - (i % 8);
// Находим конечного игрока
new iEnd = min(iStart + 8, iPlayers);
// Получаем страницу
iPage = iStart / 8;
// Записываем игроку
g_apPlayerMenuPlayers[pId] = apPlayers;
g_iPlayerMenuPage[pId] = iPage;
// Формируем заголовок меню, получаем длину строки
new iLen = formatex(szMenu, 511, "\r%L\R%d/%d^n^n", pId, "#KickPlayerMenu_Title", iPage + 1, ((iPlayers - 1) / 8) + 1);
// Добавляем к кнопкам 0
new bitsKeys = MENU_KEY_0;
// Пункт
new iItem;
// Флаги игрока
new bitsFlags;
// Цикл из игроков
for (i = iStart; i < iEnd; i++)
{
// Получаем id игрока
pPlayer = apPlayers[i];
// Берём имя игрока
get_user_name(pPlayer, szName, 31);
// Делаем ник жёлтым если этот игрок это мы =)
if (pId == pPlayer)
{
// Добавляем к кнопкам текущий пункт
bitsKeys |= (1 << iItem);
// Форматируем пункт, получаем длину
iLen += formatex(szMenu[iLen], 511 - iLen, "\r%d. \y%s^n", ++iItem, szName);
}
// Рассматриваем другой случай
else
{
// Получаем флаги игрока
bitsFlags = get_user_flags(pPlayer);
// Если игрок имеет имунитет делаем пункт серым, получаем длину
if (bitsFlags & ADMIN_IMMUNITY)
iLen += formatex(szMenu[iLen], 511 - iLen, "\d%d. %s^n", ++iItem, szName);
// Игрок админ добавляем после ника красную звёздочку
else if (bitsFlags > 0 && !(bitsFlags & ADMIN_USER))
{
// Добавляем к кнопкам текущий пункт
bitsKeys |= (1 << iItem);
// Форматируем пункт, получаем длину
iLen += formatex(szMenu[iLen], 511 - iLen, "\r%d. \w%s\r*^n", ++iItem, szName);
}
// Обычный игрок
else
{
// Добавляем к кнопкам текущий пункт
bitsKeys |= (1 << iItem);
// Форматируем пункт, получаем длину
iLen += formatex(szMenu[iLen], 511 - iLen, "\r%d. \w%s^n", ++iItem, szName);
}
}
}
// Если последний игрок меньше всех игроков, добавляем пункт далее
if (iEnd < iPlayers)
{
// Добавляем к кнопкам 9
bitsKeys |= MENU_KEY_9;
// Форматируем пункты
formatex(szMenu[iLen], 511 - iLen, "^n\r9. \w%L^n\r0. \w%L", pId, "#KickPlayerMenu_Next", pId, iPage ? "#KickPlayerMenu_Back" : "#KickPlayerMenu_Exit");
}
else
formatex(szMenu[iLen], 511 - iLen, "^n\r0. \w%L", pId, iPage ? "#KickPlayerMenu_Back" : "#KickPlayerMenu_Exit");
// Показываем меню
return show_menu(pId, bitsKeys, szMenu, -1, "Kick Player");
}
При нажатии кнопки в меню игроком
- Код: Выделить всё
// Игрок нажал кнопку
public MenuKickPlayer(pId, iKey)
{
// Смотрим какая кнопка
switch (iKey)
{
// (9) Далее
case 8: ShowMenuKickPlayer(pId, ++g_iPlayerMenuPage[pId]); // Сразу прибавляем страницу
// (0) Назад/Выход
case 9: ShowMenuKickPlayer(pId, --g_iPlayerMenuPage[pId]); // Сразу уменьшаем страницу, если страница будет меньше нуля, то иеню закроется
// Выбрали игрока
default:
{
// Получаем игрока из массива (Умножаем текущую страницу на 8 и прибавляем кнопку)
new pPlayer = g_apPlayerMenuPlayers[pId][(g_iPlayerMenuPage[pId] * 8) + iKey];
// Если игрок вышел
if (!is_user_connected(pPlayer))
{
// Пишем игроку что игрок вышел
client_print(pId, print_chat, "%L", pId, "#KickPlayerMenu_TargetDisconnected");
// Снова показываем меню
ShowMenuKickPlayer(pId, g_iPlayerMenuPage[pId]);
return PLUGIN_HANDLED;
}
// Если игрок получил иммунитет
if (pId != pPlayer && (get_user_flags(pPlayer) & ADMIN_IMMUNITY))
{
// Пишем что игрок получил иммунитет
client_print(pId, print_chat, "%L", pId, "#KickPlayerMenu_TargetImmunity");
// Снова показываем меню
ShowMenuKickPlayer(pId, g_iPlayerMenuPage[pId]);
return PLUGIN_HANDLED;
}
// Кикнул ли себя администратор
new bool:bKickSelf = bool:(pId == pPlayer);
// Берём имя игрока
new szName[32];
get_user_name(pId, szName, 31);
// Пишем что администратор кикнул себя
if (bKickSelf)
client_print(0, print_chat, "%L", LANG_PLAYER, "#KickPlayerMenu_SelfKicked", szName);
else
{
// Берём имя цели
new szName2[32];
get_user_name(pPlayer, szName2, 31);
// Пишем что администратор кикнул игрока
client_print(0, print_chat, "%L", LANG_PLAYER, "#KickPlayerMenu_TargetKicked", szName, szName2);
// Снова показываем меню
ShowMenuKickPlayer(pId, g_iPlayerMenuPage[pId]);
}
// Кикаем игрока
server_cmd("kick #%d", get_user_userid(pPlayer));
// Делаем чтобы игрок сразу кикнулся
server_exec();
}
}
return PLUGIN_HANDLED;
}
Словарь:
- Код: Выделить всё
[ru]
#KickPlayerMenu_Title = Меню кика игроков
#KickPlayerMenu_Next = Далее
#KickPlayerMenu_Back = Назад
#KickPlayerMenu_Exit = Выход
#KickPlayerMenu_TargetDisconnected = Данный игрок вышел с сервера
#KickPlayerMenu_TargetImmunity = Данный игрок получил иммунитет
#KickPlayerMenu_SelfKicked = Администратор %s кикнул себя
#KickPlayerMenu_TargetKicked = Администратор %s кикнул игрока %s
Полный плагин:
- Код: Выделить всё
#include <amxmodx>
// Текущая страница меню
new g_iPlayerMenuPage[33];
// Соотношение пункта к игроку в меню
new g_apPlayerMenuPlayers[33][32];
// Прекеш плагина
public plugin_precache()
register_plugin(
"Kick Player Menu",
"Alpha",
"WPMG PRoSToTeM@"
); // Регистрируем плагин
// Инициализация плагина
public plugin_init()
{
// Регистрируем команду для вызова меню кика
register_clcmd("say /KickPlayerMenu", "ClCmdKickPlayerMenu", ADMIN_KICK);
// Регистрируем меню (1-ый аргумент - ID меню (получается по его названию), 2-ой аргумент - кнопки (1023 все кнопки), 3-ий аргумент - функция которая будет вызываться при нажатии кнопки)
register_menucmd(register_menuid("Kick Player"), 1023, "MenuKickPlayer");
// Регистрируем словарь
register_dictionary("KickPlayerMenu.txt");
}
// Кто-то написал /KickPlayerMenu
public ClCmdKickPlayerMenu(pId, bitsAccess)
{
// Если нету нужного флага не продолжаем
if (!(get_user_flags(pId) & bitsAccess))
return PLUGIN_CONTINUE;
// Показываем меню кика и обнуляем страницу
ShowMenuKickPlayer(pId, g_iPlayerMenuPage[pId] = 0);
// Не показываем команду в чате
return PLUGIN_HANDLED;
}
// Показываем меню игроку
public ShowMenuKickPlayer(pId, iPage)
{
// Если страница меньше нуля не продолжаем
if (iPage < 0)
return PLUGIN_HANDLED;
new apPlayers[32]; // Массив из игроков
new iPlayers; // Всего игроков
new szMenu[512], szName[32]; // Меню, имя
new pPlayer; // Игрок
// Получаем игроков
get_players(apPlayers, iPlayers);
// Находим стартового игрока
new i = min(iPage * 8, iPlayers);
new iStart = i - (i % 8);
// Находим конечного игрока
new iEnd = min(iStart + 8, iPlayers);
// Получаем страницу
iPage = iStart / 8;
// Записываем игроку
g_apPlayerMenuPlayers[pId] = apPlayers;
g_iPlayerMenuPage[pId] = iPage;
// Формируем заголовок меню, получаем длину строки
new iLen = formatex(szMenu, 511, "\r%L\R%d/%d^n^n", pId, "#KickPlayerMenu_Title", iPage + 1, ((iPlayers - 1) / 8) + 1);
// Добавляем к кнопкам 0
new bitsKeys = MENU_KEY_0;
// Пункт
new iItem;
// Флаги игрока
new bitsFlags;
// Цикл из игроков
for (i = iStart; i < iEnd; i++)
{
// Получаем id игрока
pPlayer = apPlayers[i];
// Берём имя игрока
get_user_name(pPlayer, szName, 31);
// Делаем ник жёлтым если этот игрок это мы =)
if (pId == pPlayer)
{
// Добавляем к кнопкам текущий пункт
bitsKeys |= (1 << iItem);
// Форматируем пункт, получаем длину
iLen += formatex(szMenu[iLen], 511 - iLen, "\r%d. \y%s^n", ++iItem, szName);
}
// Рассматриваем другой случай
else
{
// Получаем флаги игрока
bitsFlags = get_user_flags(pPlayer);
// Если игрок имеет имунитет делаем пункт серым, получаем длину
if (bitsFlags & ADMIN_IMMUNITY)
iLen += formatex(szMenu[iLen], 511 - iLen, "\d%d. %s^n", ++iItem, szName);
// Игрок админ добавляем после ника красную звёздочку
else if (bitsFlags > 0 && !(bitsFlags & ADMIN_USER))
{
// Добавляем к кнопкам текущий пункт
bitsKeys |= (1 << iItem);
// Форматируем пункт, получаем длину
iLen += formatex(szMenu[iLen], 511 - iLen, "\r%d. \w%s\r*^n", ++iItem, szName);
}
// Обычный игрок
else
{
// Добавляем к кнопкам текущий пункт
bitsKeys |= (1 << iItem);
// Форматируем пункт, получаем длину
iLen += formatex(szMenu[iLen], 511 - iLen, "\r%d. \w%s^n", ++iItem, szName);
}
}
}
// Если последний игрок меньше всех игроков, добавляем пункт далее
if (iEnd < iPlayers)
{
// Добавляем к кнопкам 9
bitsKeys |= MENU_KEY_9;
// Форматируем пункты
formatex(szMenu[iLen], 511 - iLen, "^n\r9. \w%L^n\r0. \w%L", pId, "#KickPlayerMenu_Next", pId, iPage ? "#KickPlayerMenu_Back" : "#KickPlayerMenu_Exit");
}
else
formatex(szMenu[iLen], 511 - iLen, "^n\r0. \w%L", pId, iPage ? "#KickPlayerMenu_Back" : "#KickPlayerMenu_Exit");
// Показываем меню
return show_menu(pId, bitsKeys, szMenu, -1, "Kick Player");
}
// Игрок нажал кнопку
public MenuKickPlayer(pId, iKey)
{
// Смотрим какая кнопка
switch (iKey)
{
// (9) Далее
case 8: ShowMenuKickPlayer(pId, ++g_iPlayerMenuPage[pId]); // Сразу прибавляем страницу
// (0) Назад/Выход
case 9: ShowMenuKickPlayer(pId, --g_iPlayerMenuPage[pId]); // Сразу уменьшаем страницу, если страница будет меньше нуля, то иеню закроется
// Выбрали игрока
default:
{
// Получаем игрока из массива (Умножаем текущую страницу на 8 и прибавляем кнопку)
new pPlayer = g_apPlayerMenuPlayers[pId][(g_iPlayerMenuPage[pId] * 8) + iKey];
// Если игрок вышел
if (!is_user_connected(pPlayer))
{
// Пишем игроку что игрок вышел
client_print(pId, print_chat, "%L", pId, "#KickPlayerMenu_TargetDisconnected");
// Снова показываем меню
ShowMenuKickPlayer(pId, g_iPlayerMenuPage[pId]);
return PLUGIN_HANDLED;
}
// Если игрок получил иммунитет
if (pId != pPlayer && (get_user_flags(pPlayer) & ADMIN_IMMUNITY))
{
// Пишем что игрок получил иммунитет
client_print(pId, print_chat, "%L", pId, "#KickPlayerMenu_TargetImmunity");
// Снова показываем меню
ShowMenuKickPlayer(pId, g_iPlayerMenuPage[pId]);
return PLUGIN_HANDLED;
}
// Кикнул ли себя администратор
new bool:bKickSelf = bool:(pId == pPlayer);
// Берём имя игрока
new szName[32];
get_user_name(pId, szName, 31);
// Пишем что администратор кикнул себя
if (bKickSelf)
client_print(0, print_chat, "%L", LANG_PLAYER, "#KickPlayerMenu_SelfKicked", szName);
else
{
// Берём имя цели
new szName2[32];
get_user_name(pPlayer, szName2, 31);
// Пишем что администратор кикнул игрока
client_print(0, print_chat, "%L", LANG_PLAYER, "#KickPlayerMenu_TargetKicked", szName, szName2);
// Снова показываем меню
ShowMenuKickPlayer(pId, g_iPlayerMenuPage[pId]);
}
// Кикаем игрока
server_cmd("kick #%d", get_user_userid(pPlayer));
// Делаем чтобы игрок сразу кикнулся
server_exec();
}
}
return PLUGIN_HANDLED;
}