Превод: hackera457
Предполагам повечето от вас са отваряли кода на плъгини като Galileo, Deagles Map Manager, Zombie Plague и сте забелязали странен начин за създаване та менюта. Е това е стария начин за правене на менюта в AMXX, който преди време беше актуален, но вече е остарял и почти не се ползва, тъй като новата система за менюта, която е създадена е по проста и по-функционална. Идеята на превода на този урок е да видите и да знаете как работи, как се рeгистрира меню, управление на клавишите и т.н. Урока го превеждам от един руски сайт, така че извинявам се за неточностите ако има. Е нека да започне урока
Като начало си създаваме глобални променливи
Код за потвърждение: Избери целия код
// Текуща страница на менюто
new g_iPlayerMenuPage[33];
// Съотношение точките към играча в менюто
new g_apPlayerMenuPlayers[33][32];
Код за потвърждение: Избери целия код
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;
// Показваме 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