AMX MOD X
Пятница, 29.03.2024, 04:05:31



Приветствую Вас Гость | RSS
[ Главная ] [ Меню игроков - AMX Mod X Форум ] [ Регистрация ] [ Вход ]
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]

Вниманию участников! Данный форум теперь является архивом и вскором времени здесь нельзя будет создавать новых тем! Просьба всем для общения и создания новых тем перейти на наш новый форум: http://amxmodx.su/

  • Страница 1 из 1
  • 1
Модератор форума: slogic, AlMod  
AMX Mod X Форум » Скриптинг » Полезная информация » Меню игроков (В старой и новой системе)
Меню игроков
FreeKILLДата: Вторник, 12.01.2010, 10:10:55 | Сообщение # 1
Подполковник
Группа: Пользователи
Сообщений: 143
Репутация: 4
Статус: Не в сети
Новая система меню

Если вы хотите сделать меню игроков без дополнительных функций быстро и легко, то вам поможет новая система меню
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

Всем Желаю Удачи !

Критика, добавления, помечания приветствуются!

 
AMX Mod X Форум » Скриптинг » Полезная информация » Меню игроков (В старой и новой системе)
  • Страница 1 из 1
  • 1
Поиск:

AMX Mod X Russian Community © 2006-2024