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

[TUT]Работа с файлами(Закупочное меню/Buy Menu)

Статьи или фрагменты кода для новичков и уже опытных скриптеров по AMXX.

Модератор: Chuvi

Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

В данном разделе форума разрешено создавать темы, касающие только обучающему материалу по AMX Mod X.

[TUT]Работа с файлами(Закупочное меню/Buy Menu)

Сообщение Sugarv » 21 фев 2013, 15:43

Совсем недавно по некоторым причинам начал заниматься работой с закупочным меню, или как его называют "Бай Меню", я думаю, вы знаете что это такое.
Самая главная сложность - это способ доставания информации из файла и создание меню или другого её использования.
Я несколько дней в свободное время понемногу делал это меню, и хочу поделится основной системой, я не буду вкладывать сюда уже готового сма, просто объясню сам алгоритм работы и приведу примеры.
Заполнение файла из которого будет браться иноформация для меню будет выглядеть примерно так
Код: Выделить всё
[WEAPON ON] - начало раздела
"Deset Eagle" "1500" "weapon_deagle" - "Название в меню" "Цена" "Оружие или название вещи из zp_extraitems.ini"
"Fire Nade" "200" "Napalm Nade"
[WEAPON OFF] - конец определенного раздела

Меню я буду делать для зомби сервера на основе ZP4.3(легко можно на паблик поменять)
Первым делом нам нужно создать пару глобальных массивов в которых будет лежать информация из нашего файла

Пример:
[pawn]
  1. new g_WeaponName[10][128], g_WeaponTodo[10][128], Float:g_WeaponCost[10], bool:g_WeaponCategory, g_WeaponCounter
[/pawn]
Где первый размер массива(у меня 10) это максимальное кол-во отдельно взятых вещей из файла(для Бай меню это оружие), а второй размер массива(128) - это макс. кол-во символов для последующей записи информации из файла в этот массив
Далее вы узнаете зачем нам нужны эти массивы/переменные

Далее в [pawn]
  1. public plugin_precache()
[/pawn]

Считываем и записываем информацию
[pawn]
  1. new file = fopen("addons/amxmodx/configs/test.txt","rt") // Открываем файл для чтения из опр. дериктории

  2.  

  3. new linedata[1024]//Массив для чтения строки

  4.        

  5. while (!feof(file))//Делаем цикл , проверка: "пока не закончится файл"

  6. {

  7.         fgets(file, linedata, charsmax(linedata))//получает поочередно 1 строку из файла и записывает её в linedata

  8.                

  9.         replace(linedata, charsmax(linedata), "^n", "")//Удаляем пустые строки(заменяем их на пустой символ)

  10.                

  11.         if( equali(linedata, "[WEAPON ON]") ) //Если строка совпадает "[WEAPON ON]", то меняем булевевую переменную на "правду"(1), это в дальнейшем пригодится нам для доставания информации

  12.                 g_WeaponCategory = true

  13.                

  14.         if( equali(linedata, "[PISTOL OFF]") ) // Если"[PISTOL OFF]", тогда меняем на "ложь"(0)

  15.                 g_WeaponCategory = false

  16.                

  17.         new WeaponCost[10][10] //Создаем новый массив, в который мы будет принимать информацию о цене, а позже записывать её в глобальный массив, где первый размер это макс. кол-во пунктов из файла, а второй размер нужен для записывания цены(макс. кол-во символов), не больше 10 , как правило

  18.                

  19.         if(g_WeaponCategory && (linedata[0] == '"')) // Если наша булевая переменная равняется "правде"(1) и первый знак в строке является кавычками, то...

  20.         {

  21.                 parse(linedata, g_WeaponName[g_WeaponCounter], 127, WeaponCost[g_WeaponCounter], 9, g_WeaponTodo[g_WeaponCounter], 127)// Достаем поочередно информацию из файла, сначала имя, потом цена, потом Todo(индикатор того, что мы будем выдавать)

  22.  

  23.                 g_WeaponCost[g_WeaponCounter] = floatstr(WeaponCost[g_WeaponCounter]) //Пишем что наша "глобальная цена" равняется конвертированной из строки в дробное число - WeaponCost, я думаю все понимают, что g_WeaponCounter нужен для поочередного чтения информации

  24.                        

  25.                 g_WeaponCounter++//+1 каждый раз к этой переменной, что бы очередь сохраняла свой порядок

  26.         }
[/pawn]

Такс, здесь просиходит цикл, каждый раз считывай новую строку мы делаем ряд проверок, вот таким способом вы можете получить иноформацию из файла, вид оформления в фале я описал в начале темы

Именно таким способом получаю я

Далее, допустим мы хотим добавить в меню пункты

Создаем меню:
в [pawn]
  1. public plugin_init()
[/pawn](если это будет статическое меню)

Регистрируем меню
[pawn]
  1. g_PMenu = menu_create("Weapon Menu", "PMenuHandler")
[/pawn]

Добавляем предмет(после создания меню вставлять):
[pawn]
  1. new Message[128]

  2.        

  3. for(new i; i <= g_WeaponCounter; i++)//Цикл делаем

  4. {

  5.         if(g_WeaponCost[i] == 0) что бы не было пустой строки

  6.                 return;

  7.                        

  8.         formatex(Message, 127, "%s \r[%d$]", g_PistolName[i], floatround(g_PistolCost[i]))//Форматируем название каждого пункта

  9.                

  10.         menu_additem(g_PMenu, Message)

  11. }
[/pawn]
В хандлер функции меню делаем следующее(на зомби сервер):
[pawn]
  1. public PMenuHandler(id, menu, item)

  2. {

  3.         if(g_WeaponTodo[item][0] == 'w' && g_WeaponTodo[item][1] == 'e' && g_WeaponTodo[item][2] == 'a')// Проверяем , содержит ли индефикатор первый знаки "wea" , от стандартных оружий (weapon_awp)

  4.         {

  5.                 give_item(id, g_WeaponTodo[item])//Если содержит то выдаем с помощью этого натива

  6.         }

  7.         else

  8.         {

  9.                 zp_force_buy_extra_item(id, zp_get_extra_item_id(g_WeaponTodo[item]), true)//Если же нет, то выдаем бесплатно вещь из Extra Items , используя ZP

  10.         }

  11.        

  12.         cs_set_user_money(id, cs_get_user_money(id) - floatround(g_WeaponCost[item]))//Снимаем деньги

  13. }
[/pawn]

Вроде все, краткий гайд закончен, я уж не говорю о том, что нужно подключать инклюды, блокирвать предмет с помощью CallBack если не хватает денег, создавать переменную к меню, не буду объянснять аргументы от menu_create, и других нативов, т.к. это есть в свободном доступе и т.д.

Как и обещал, дал основной код, даже прокомментировал все мои действия, при моих тестах все работало, вы можете это использовать как захотите, можете модифицировать по желанию, можете закрыть тему без каких либо последующих действий , дело ваше)
Аватара пользователя
Sugarv
 
Сообщения: 4
Зарегистрирован: 06 янв 2013, 00:02
Откуда: Новосибирск
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6

Re: [TUT]Работа с файлами(Закупочное меню/Buy Menu)

Сообщение kiryxapro » 11 окт 2013, 22:55

Не работает меню на линуксе
Аватара пользователя
kiryxapro
 
Сообщения: 161
Зарегистрирован: 23 дек 2011, 17:40
Откуда: Кишинёв
Забанен
Благодарил (а): 21 раз.
Поблагодарили: 14 раз.
Языки программирования: Counter-Strike 1.6


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

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6