Главная Регистрация RSS
Приветствую Вас, Гость
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум » AMX Mod X » Статьи / фрагменты кода » Создание меню из игроков в старой системе меню
Создание меню из игроков в старой системе меню
extazyДата: Суббота, 17.03.2012, 16:50 | Сообщение # 1
Генералиссимус
Группа: Администраторы
Сообщений: 18
Репутация: 10000
Статус: Offline
В этой статье мы рассмотрим создание меню сформированного из игроков в старой системе меню на примере меню кика игроков.

Для начала создадим нужные нам переменные

Код: Выделить всё

// Текущая страница меню
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);
}
}
}


Смотри, не получи бан!)
 
extazyДата: Суббота, 17.03.2012, 16:50 | Сообщение # 2
Генералиссимус
Группа: Администраторы
Сообщений: 18
Репутация: 10000
Статус: Offline
// Если последний игрок меньше всех игроков, добавляем пункт далее
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


Смотри, не получи бан!)
 
Форум » AMX Mod X » Статьи / фрагменты кода » Создание меню из игроков в старой системе меню
  • Страница 1 из 1
  • 1
Поиск: