Counter-Strike 1.6
CS1.BG | DUST2 NOSHTA GARMI [RANKED PLAY] #1
45.144.155.113:27015
de_dust2
Играчи: 30/32
de_dust2
Counter-Strike 1.6
Cs-PlovdiV.com - Aim Attack 93.123.16.4:27022 aim_aztec Играчи: 0/16

Създаване на меню с играчи със старата система за менюта

В този раздел можете да намерите полезни кодове и уроци свързани с PAWN скриптинга.
Аватар
hackera457
Извън линия
Потребител
Потребител
Мнения: 768
Регистриран на: 01 Ное 2016, 09:46
Местоположение: София
Се отблагодари: 1 път
Получена благодарност: 124 пъти
Обратна връзка:

Създаване на меню с играчи със старата система за менюта

Мнение от hackera457 » 01 Дек 2016, 00:01

Автор: WPMG PRoSToTeM@
Превод: hackera457

Предполагам повечето от вас са отваряли кода на плъгини като Galileo, Deagles Map Manager, Zombie Plague и сте забелязали странен начин за създаване та менюта. Е това е стария начин за правене на менюта в AMXX, който преди време беше актуален, но вече е остарял и почти не се ползва, тъй като новата система за менюта, която е създадена е по проста и по-функционална. Идеята на превода на този урок е да видите и да знаете как работи, как се рeгистрира меню, управление на клавишите и т.н. Урока го превеждам от един руски сайт, така че извинявам се за неточностите ако има. Е нека да започне урока

Като начало си създаваме глобални променливи

Код за потвърждение: Избери целия код

// Текуща страница на менюто
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");
} 
Прихващаме командата /KickPlayerMenu

Код за потвърждение: Избери целия код

// Като напишем /KickPlayerMenu
public ClCmdKickPlayerMenu(pId, bitsAccess)
{
    // Ако нямаме нужния флаг не продължаваме
    if (!(get_user_flags(pId) & bitsAccess))
        return PLUGIN_CONTINUE;
    
    // Показваме Kick менюто и зануляваме страниците
    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);
        
        // Проверка за съвпадение на ID на играч
        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;
} 
Езиковия файл:

Код за потвърждение: Избери целия код

[en]
#KickPlayerMenu_Title = Kick Menu
#KickPlayerMenu_Next = Next
#KickPlayerMenu_Back = Back
#KickPlayerMenu_Exit = Exit
#KickPlayerMenu_TargetDisconnected = Player is disconnected
#KickPlayerMenu_TargetImmunity = Player has immunity
#KickPlayerMenu_SelfKicked = Admin %s kick self
#KickPlayerMenu_TargetKicked = Admin %s kick player %s
Ето това е прословутия странен стар начин за създаване на менюта, който присъства във повечето по-стари плъгини. Лично аз не ви го препоръчвам, новия начин е по-лесен, по-разбираем, по-лесен за прилагане
Моите плъгини

Код за потвърждение: Избери целия код

#include <hambeer>

RegisterHamBeer(HamBeer_Spawn, "player", "GivePlayerBeer", 1);

public GivePlayerBeer(Pl){
    if(!is_user_alive(Pl)){
        ham_give_beer(Pl, 5)
        client_print(Pl, print_chat, "Go Go Go"){
}  


  • Подобни теми
    Отговори
    Преглеждания
     Последно мнение

Обратно към “Полезни кодове/уроци”

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 5 госта