extazy | Дата: Суббота, 17.03.2012, 16:50 | Сообщение # 1 |
Генералиссимус
Группа: Администраторы
Сообщений: 18
Статус: 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
Статус: 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
Смотри, не получи бан!)
|
|
| |