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

[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: Создание меню из игроков в старой системе меню

Сообщение Rejiser » 06 авг 2011, 10:24

где ж ты раньше был)

[pawn]// (0) Назад/Выход
case 9ShowMenuKickPlayer(pId, --g_iPlayerMenuPage[pId]); [/pawn]
Как именно поймать, что игрок вышел из меню, т.е нажал на 0
Аватара пользователя
Rejiser
 
Сообщения: 2928
Зарегистрирован: 03 сен 2010, 16:23
Благодарил (а): 215 раз.
Поблагодарили: 675 раз.
Языки программирования: Counter-Strike 1.6

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

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

Если страница меньше нуля, вроде не должна быть меньше чем -1.

Добавлено спустя 4 минуты 32 секунды:
[pawn]    // Если страница меньше нуля не продолжаем
    
if (iPage 0)
        return 
PLUGIN_HANDLED[/pawn]
Аватара пользователя
PRoSToTeM@
Скриптер
 
Сообщения: 2498
Зарегистрирован: 26 мар 2010, 00:12
Благодарил (а): 438 раз.
Поблагодарили: 1125 раз.

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

Сообщение ejik » 06 авг 2011, 17:35

[pawn]// Формируем заголовок меню, получаем длину строки
    
new iLen formatex(szMenu511"\r%L\R%d/%d^n^n"pId"#KickPlayerMenu_Title"iPage 1, (iPlayers 8) + 1); [/pawn]
неужели, если на сервере будет, например, 32 человека, будет показывать 5 страниц, ведь 32 / 8 = 4, 4 + 1 = 5 ? Тогда правильнее будет [pawn]iPlayers ) + (  ( iPlayers ) ? [/pawn]
Аватара пользователя
ejik
 
Сообщения: 249
Зарегистрирован: 01 июл 2010, 14:07
Благодарил (а): 83 раз.
Поблагодарили: 83 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6

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

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

ejik, как вариант
[pawn]((iPlayers - 1) / 8) + 1[/pawn]

Добавлено спустя 9 минут 57 секунд:
Обновил
ejik, спасибо за найденный недочёт.
Аватара пользователя
PRoSToTeM@
Скриптер
 
Сообщения: 2498
Зарегистрирован: 26 мар 2010, 00:12
Благодарил (а): 438 раз.
Поблагодарили: 1125 раз.

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

Сообщение Freezet » 23 янв 2013, 14:23

Было бы не плохо сделать пример на стандартном меню Slap/Slay, где есть дополнительная строка с выбором параметров (Убить, -5хп, -10хп и т.д.)

Актуально для меню выдачи денег или аммопаков на зомби моде, применить можно где угодно.
Аватара пользователя
Freezet
 
Сообщения: 25
Зарегистрирован: 29 май 2010, 17:47
Благодарил (а): 7 раз.
Поблагодарили: 0 раз.
Языки программирования: Counter-Strike 1.6

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

Сообщение HENRI(_)LLOYD » 11 фев 2013, 11:14

Делай, тебе никто не мешает, + на форуме если что помогут, а вот тебе и гоиовый пример.
Аватара пользователя
HENRI(_)LLOYD
 
Сообщения: 189
Зарегистрирован: 26 дек 2012, 03:07
Благодарил (а): 34 раз.
Поблагодарили: 7 раз.

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

Сообщение alex330863 » 12 мар 2013, 02:13

Лучше чем новая ^^
Хоронить будут в закрытом гробу... © Снайпер из "TF2" объясняет жертве её участь...
Аватара пользователя
alex330863
 
Сообщения: 228
Зарегистрирован: 20 янв 2012, 12:48
Откуда: Санкт-Петербург
Благодарил (а): 81 раз.
Поблагодарили: 47 раз.
Опыт программирования: Около 6 месяцев
Языки программирования: Counter-Strike 1.6

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

Сообщение GaMeRs » 12 мар 2013, 17:54

Ага, и ещё статья нормально написана, со всеми подробностями.
Аватара пользователя
GaMeRs
 
Сообщения: 1574
Зарегистрирован: 12 мар 2012, 17:25
Благодарил (а): 84 раз.
Поблагодарили: 468 раз.

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

Сообщение GaMeRs » 27 сен 2013, 19:18

Скажите, как убрать себя из списка.
Делал так: [pawn]
  1. if(id == pPlayer) continue
[/pawn], в итоге меня в списке не было, но при нажатии на 1 игрока, все действия применяются ко мне.
Кароч просто скрывает меня, но не убирает.
Что можно сделать ?
Аватара пользователя
GaMeRs
 
Сообщения: 1574
Зарегистрирован: 12 мар 2012, 17:25
Благодарил (а): 84 раз.
Поблагодарили: 468 раз.

След.

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

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

Сейчас этот форум просматривают: sb123 и гости: 8