FreeKILL | Дата: Вторник, 12.01.2010, 10:10:55 | Сообщение # 1 |
Подполковник
Группа: Пользователи
Сообщений: 143
Статус: Не в сети
| Новая система меню Если вы хотите сделать меню игроков без дополнительных функций быстро и легко, то вам поможет новая система меню Code /* Подключаем файлы amxmodx.inc и amxmisc.inc, необходимые для работы. Обычно подключаются эти два файла */ #include <amxmodx> #include <amxmisc>
/* Глобальные переменные, которые понадобятся для работы. */ new players[32],name[32],info[10],choice,menu,num,i
/* Главная функция */ public plugin_init() { /* Регистрируем плагин Формат: register_plugin(название плагина,версия,автор) */ register_plugin("SlapPlayers","1.0","ZETA [M|E|N]") /* Регистрирует команду, по которой будет вызываться некая функция. Формат: register_clcmd(команда,функция,флаг доступа,описание) Полный список флагов вы найдете в конце страницы. Таким образом мы создали команду say /slap, которой может пользоваться админ с флагом с, и эта команда будет вызывать функцию func_slap.*/ register_clcmd("say /slap","func_slap",ADMIN_KICK,"") }
/* Функция func_slap */ public func_slap(id,level,cid) { /* Не буду вдаваться в подробности, ибо это не так важно. Главное запомните - эта конструкция проверяет наличие флагов у игрока. Если ее не будет, доступ к команде будет у всех. */ if(!cmd_access(id,level,cid,0)) return PLUGIN_HANDLED
/* Создает меню Формат: menu_create(название меню,функция-обработчки) */ menu=menu_create("SlapPlayer","menu_handler")
/* Меню создано, но в нем еще ничего нет, только название. Нужно его заполнить именами игроков, смотрим */
/* get_players - возвращает список с индексами игроков. Формат: get_players(players[32],num(количество),флаги) У этой функции есть кучу флагов, но т.к. пока они нам не нужны я ну буду разбирать. */ get_players(players,num)
/* В этом цикле все игроки получат свои индексы,а также мы доавим их имена в меню. */ for(i=0;i<num;i++) { /* Функция get_user_name возвращает имя игрока Формат: get_user_name(индекс,имя,размер) В данном случае инедксом у нас служит массив. С помощью функции get_players в каждую ячейку переменной players добавляется индекс игрока.*/ get_user_name(players[i],name,31) /* Преобразует число в строчку Формат: num_to_str(число,строчка,размер) В пункт меню кроме имени игрока мы будем записывать еще и информацию об индеске, но информация храниться только в виде строчки, поэтому переводим. */ num_to_str(players[i],info,9)
/* Добавляем пункт к меню Формат: menu_additem (меню,название пункта,информация) */ menu_additem(menu,name,info) } /* Показывает меню Формат: menu_display(индекс,меню,страница) */ menu_display(id,menu,0) return PLUGIN_HANDLED // Обязательно нужно закрывать функцию }
/* Функция-обработчик меню. После того как вы выбрали пунт меню,вызывается функция-обработчик. */ public menu_handler(id,menu,item) { /* Проверка: если пункт меню - выход, то закрыть функию-обработчик. */ if(item==MENU_EXIT) return PLUGIN_HANDLED
new data[32], iName[64],access, callback
/* Оператор menu_item_getinfo собирает информацию о выбраных пунктах Формат: menu_item_getinfo(id меню,пункт меню,доступ,информация пунктов,размер информации,текст пункта, длина текста, callback) Из этой функции нам необходима переменная data[32]. В ней содержиться информация пункта в виде строки. Например, если вы выбрали пункт 3, в data[3] будет информация пунта 3.*/ menu_item_getinfo(menu, item, access, data,31, iName, 63, callback) /* Преобразует строку в число. Формат: str_to_num(строка) Т.к. информация храниться в виде строки, а индекс использвуется в виде числа, переводим строку в число. */ choice=str_to_num(data) /* Фактически переменная choice является индексом выбранного игрока. Теперь с ним можно делать что угодно, в моем случае я просто его слепну */
/* Слепает игрока Формат: user_slap(индекс,сила) */ user_slap(choice,30) menu_display(id,menu,0) return PLUGIN_HANDLED } инф взята с сайта http://zetamen.ucoz.ru/publ/2-1-0-17 Новая система меню Если вы хотите сделать меню игроков с более большим спектром возможностей и функций, то будет лучше воспользоваться старой системой меню. вот пример меню игроков с возможностью возродить как одного игрока(выбранного в меню) так и всех сразу Code #include <amxmodx> #include <amxmisc> #include <hamsandwich>
new bool:g_menuOption4[33] = false new bool:g_menuOption5[33] = false new g_menuPosition[33] new g_menuPlayers[33][32] new g_menuPlayersNum[33] new menuBody[512] new g_coloredMenus
public plugin_init() { register_clcmd("revive_player_menu", "cmdRev", ADMIN_KICK, "") register_menucmd(register_menuid("Revive Menu2"), 1023, "actionReviveMenu") register_dictionary("dictionary") // ЗДЕСЬ ОБРАТИТЕ ВНИМАМИЕ! для корректной работы вам необходимо сделать перевод плагину. название перевода можите выбрать сами(в данном случае "dictionary") откройте папку cstrike\addons\amxmodx\data\lang и там текстовым редактором сделайте перевод плагину } public cmdRev(id, level, cid) { if (!cmd_access(id, level, cid, 1)) //проверка на админа return PLUGIN_HANDLED g_menuOption5[id] = false g_menuOption4[id] = true //даю изначальное значение булов, при включении меню. в данном случае изначально будет стоять опция возродить одного юзера. displayRevMenu(id, g_menuPosition[id] = 0) //показывать меню с позиции(страницы ) равной нулю
return PLUGIN_HANDLED } displayRevMenu(id, pos) { if (pos < 0) return //если позиция меньше нуля то меню закрывается get_players(g_menuPlayers[id], g_menuPlayersNum[id], "b") // получаем значение о игроках, в данном случае мертвых new name[32] new b = 0 new i new start = pos * 7 if (start>=g_menuPlayersNum[id]) start = pos = g_menuPosition[id] = 0 //форматируем тело меню на название и что бы показывало в какой позиции ты находишся(на какой странице меню) new len = format(menuBody,511, g_coloredMenus ? "\r%L\R%d/%d^n\w^n" : "%L %d/%d^n^n", id , "REVIVE_MENU2", pos + 1, (g_menuPlayersNum[id] / 7 + ((g_menuPlayersNum[id] % 7) ? 1 : 0))) new end = start + 7 new keys = MENU_KEY_0|MENU_KEY_8 if(end>g_menuPlayersNum[id]) // это нужно чтобы у меню была функция more, back . Ниже end=g_menuPlayersNum[id] for (new a = start; a< end; ++a) { //здесь мы проходимся по всем игрокам в меню i = g_menuPlayers[id][a] // теперь i будет id игрока в меню get_user_name(i, name, 31) // получаем имя игрока if (is_user_bot(i)) { // если игрок в меню-это бот, то либо будет показывать его серым(и нельзя возродить) либо будет показывать перед ником бота #(и тоже нельзя будет его возродить) ++b if(g_coloredMenus) len+=format(menuBody[len], 511-len, "\d%d. %s^n\w", b , name) else len += format(menuBody[len], 511-len, "#. %s^n", name) } else { keys |= (1<<b) if (is_user_admin(i)) len += format(menuBody[len], 511-len, g_coloredMenus ? "%d. %s \r*^n\w" : "%d. %s *^n", ++b, name) //после ника админа будет показываться * else len += format(menuBody[len], 511-len, "%d. %s^n", ++b, name) // имя игрока будет показываться в меню } } if(g_menuOption4[id] ==true) len += format(menuBody[len], 511-len, "^n8. \g%L^n", id, "REVIVE_ONE") //здесь отображаются функции(возродить всех или одного) if(g_menuOption5[id] == true) len += format(menuBody[len], 511-len, "^n8. \g%L^n", id, "REVIVE_ALL") if(end!=g_menuPlayersNum[id]) { // это нужно чтобы правильно показывало функции more back exit format(menuBody[len], 511-len, "^n9. %L...^n0. %L", id, "MORE2", id, pos ? "BACK2" : "EXIT2") keys |= MENU_KEY_9 } else format(menuBody[len], 511-len, "^n0. %L", id, pos ? "BACK2" : "EXIT2") show_menu(id,keys,menuBody,-1,"Revive Menu2") //ну и наконец включается само меню } public actionReviveMenu(id, key) { switch(key) { case 7: { // здесь регулеровка функций (возродить всех или одного) if(g_menuOption4[id]== true) { g_menuOption4[id] =false g_menuOption5[id] =true displayRevMenu(id, g_menuPosition[id]) return PLUGIN_HANDLED } if(g_menuOption5[id] ==true) { g_menuOption4[id] =true g_menuOption5[id] =false displayRevMenu(id, g_menuPosition[id]) return PLUGIN_HANDLED } return PLUGIN_HANDLED } case 8: displayRevMenu(id, ++g_menuPosition[id]) // пункты more case 9: displayRevMenu(id, --g_menuPosition[id]) // back exit
default: { new player = g_menuPlayers[id][g_menuPosition[id] * 7 +key]// теперь player это ИД того игрока, кого вы выбрали в меню(нажали на его имя) if(g_menuOption4[id] ==true) { // возрождается один игрок if(!is_user_alive(player)) {
ExecuteHamB( Ham_CS_RoundRespawn, player) displayRevMenu(id, g_menuPosition[id]) return PLUGIN_HANDLED } else { displayRevMenu(id, g_menuPosition[id]) return PLUGIN_HANDLED } } if(g_menuOption5[id] == true) { //возрождаются все мертвые new maxplayers = get_maxplayers() new i for(i=1;i<= maxplayers;i++) { if(is_user_connected(i) && 1 <=get_user_team(i) <= 2 && !is_user_alive(i)) { ExecuteHamB( Ham_CS_RoundRespawn, i) } } client_print(0, print_chat, "%L", LANG_SERVER, "REVIVE_ALL2") displayRevMenu(id, g_menuPosition[id]) return PLUGIN_HANDLED } } } return PLUGIN_HANDLED } эту меню игроков взял с стандартного амх скрипта plmenu.sma Если вы незнаете как сдлеать перевод плагину то перейдите по ссылочке http://www.amxserv.net/articles.php?article_id=49 Всем Желаю Удачи ! Критика, добавления, помечания приветствуются!
|
|
| |