Русское сообщество по скриптингу

[TUT] Создание меню из игроков в старой системе меню

Статьи или фрагменты кода для новичков и уже опытных скриптеров по AMXX.

Модератор: Chuvi

Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

В данном разделе форума разрешено создавать темы, касающие только обучающему материалу по AMX Mod X.

[TUT] Создание меню из игроков в старой системе меню

Сообщение PRoSToTeM@ » 06 авг 2011, 00:45

Автор: WPMG PRoSToTeM@
Источник: 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 - (% 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 (= iStart; i < iEnd; i++)
    {
        // Получаем id игрока
        pPlayer = apPlayers[i];
        
        
// Берём имя игрока
        get_user_name(pPlayer, szName, 31);
        
        
// Делаем ник жёлтым если этот игрок это мы =)
        if (pId == pPlayer)
        {
            // Добавляем к кнопкам текущий пункт
            bitsKeys |= (<< 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 |= (<< iItem);
                
                
// Форматируем пункт, получаем длину
                iLen += formatex(szMenu[iLen], 511 - iLen, "\r%d. \w%s\r*^n", ++iItem, szName);
            }
            // Обычный игрок
            else
            
{
                // Добавляем к кнопкам текущий пункт
                bitsKeys |= (<< 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 - (% 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 (= iStart; i < iEnd; i++)
    {
        // Получаем id игрока
        pPlayer = apPlayers[i];
        
        
// Берём имя игрока
        get_user_name(pPlayer, szName, 31);
        
        
// Делаем ник жёлтым если этот игрок это мы =)
        if (pId == pPlayer)
        {
            // Добавляем к кнопкам текущий пункт
            bitsKeys |= (<< 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 |= (<< iItem);
                
                
// Форматируем пункт, получаем длину
                iLen += formatex(szMenu[iLen], 511 - iLen, "\r%d. \w%s\r*^n", ++iItem, szName);
            }
            // Обычный игрок
            else
            
{
                // Добавляем к кнопкам текущий пункт
                bitsKeys |= (<< 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
;
}
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Последний раз редактировалось PRoSToTeM@ 14 авг 2011, 15:15, всего редактировалось 3 раз(а).
Аватара пользователя
PRoSToTeM@
Скриптер
 
Сообщения: 2498
Зарегистрирован: 26 мар 2010, 00:12
Благодарил (а): 438 раз.
Поблагодарили: 1125 раз.

Re: [TUT] Создание меню из игроков в старой системе меню

Сообщение Mistrick » 23 сен 2016, 22:50

артист666, ты подумай над вариантом, когда мы превысили страницу. Тогда и нужно это вычитание.

Модеры бы еще теги отредачили.
Аватара пользователя
Mistrick
Скриптер
 
Сообщения: 2940
Зарегистрирован: 04 ноя 2012, 18:15
Благодарил (а): 43 раз.
Поблагодарили: 1247 раз.
Языки программирования: PAWN
С/С++(few above zero)

Re: [TUT] Создание меню из игроков в старой системе меню

Сообщение артист666 » 23 сен 2016, 23:42

А как ты превысишь, если страница задана(она в принципе не может слететь)...
Тестировал даже, когда в код вдумался...
Всё нормально было...
Если вы хотите чему-то научиться, пробуйте, задавайте вопросы.
Иначе компенсируйте потраченное время на ваши "проблемы".
Аватара пользователя
артист666
 
Сообщения: 2706
Зарегистрирован: 09 апр 2013, 17:46
Благодарил (а): 284 раз.
Поблагодарили: 639 раз.
Опыт программирования: Больше трех лет
Языки программирования: С, C++
Delphi
HTML, CSS, Java Script
Pawn

Re: [TUT] Создание меню из игроков в старой системе меню

Сообщение CrashReports » 02 дек 2017, 17:44

есть статья, где формируется меню из игроков без применения словаря?
Аватара пользователя
CrashReports
 
Сообщения: 13
Зарегистрирован: 24 сен 2017, 00:10
Благодарил (а): 2 раз.
Поблагодарили: 0 раз.
Опыт программирования: Около года
Языки программирования: AmxModX

Re: [TUT] Создание меню из игроков в старой системе меню

Сообщение Subb98 » 02 дек 2017, 17:46

«Очень хорошо. Лучше вы, чем я» © Donald J. Trump
Аватара пользователя
Subb98
Модератор
 
Сообщения: 5485
Зарегистрирован: 24 мар 2011, 19:42
Откуда: г. Пермь
Благодарил (а): 1329 раз.
Поблагодарили: 2343 раз.
Опыт программирования: Больше трех лет
Языки программирования: PHP

Пред.

Вернуться в Статьи / фрагменты кода

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10