Как настроить магазины в игре?

Материал из AdvExt64
Перейти к: навигация, поиск

English (en)

Продажа предметов в игре организована несколькими способами, каждый из которых обладает своими преимуществами и недостатками и использует следующие механики:

  • Параметры AI
  • Multisell.txt
  • Премиум-магазин (GF/GE/HF)

Настройка магазина при помощи параметров AI

Этот способ подходит для продажи предметов через NPC только за Адену. Для доступа к списку товаров используется специальный html-байпасс, который надо применить в html-диалоге. Для разных версий байпассы могут быть разные, но, перед тем как понять суть байпасса, давайте рассмотрим AI любого торговца. Например,

class 0 trader_holly : merchant
property_define_begin
buyselllist_begin SellList0
{1835; 20; 0.000000; 0 }
и т.д.

Для своих NPC-торговцев мы советуем применять родительский класс merchant, который позволяет использовать до 8 различных списков товаров, чего должно с лихвой хватить.
SellList0 - это параметр AI, в котором перечисляются товары торговца. 0 - это индекс списка товаров, который будет применяться в html-байпассе.
Параметры строки списка товаров:

  1. ID продаваемого предмета
  2. процентная ставка налога, которая будет выплачиваться Лорду (если такой есть)
  3. шанс восполнения данной позиции товара на складе, если товар должен заканчиваться. Вероятность восполнения осуществляется раз в час. 1.000000 - 100%. 0.000000 - товар не заканчивается. Если нужно ограничивать количество товара на складе, то этот параметр обязательно использовать со следующим.
  4. количество данной позиции товара на складе. Когда весь товар будет выкуплен, то следующая его партия станет доступна через час, если сработает шанс предыдущего параметра.

Создав или изменив нужный класс AI, можно подключить его к html своего NPC. Для этого в диалог добавляем:

<a action="bypass -h menu_select?ask=-1&reply=0">Buy</a>

Где 0 и есть индекс вызываемого из AI списка товаров. Т.е., если мы хотим вызвать список товаров, перечисленных, например, в SellList6, нам надо использовать:

<a action="bypass -h menu_select?ask=-1&reply=6">Buy</a>

Для того, чтобы продать торговцу свои товары (IL и GF), используется следующий байпасс:

<a action="bypass -h menu_select?ask=-1&reply=8">Sell</a>

Базовая цена на предмет устанавливается в script\itemdata.txt в поле default_price

Настройка магазина при помощи multisell.txt

Этот способ прекрасно подходит для использования внутриигровых донат-систем, ГМ-шопов и различных обменников. Он позволяет обменять одни предметы на другие, например, Монеты Удачи на оружие, доспехи, бижутерию, свитки, зелья и т.д. и т.п.
Настройка системы осуществляется при помощи файла script\multisell.txt. Файл имеет весьма высокие требования к синтаксису, поэтому малейшее нарушение приведет к отказу работы либо всего скрипта, либо какой-то его части.
Пример блока multisell:

MultiSell_begin [blackmerchant_weapon] 1
is_dutyfree = 1
selllist={
{{{[great_sword];1}};{{[adena];6680500}}};
...
{{{[tallum_glaive];1}};{{[adena];20741000}}};
{{{[dragon_grinder];1}};{{[adena];20741000}}}
}
MultiSell_end

  • Заголовок блока
    • MultiSell_begin - объявление заголовка
    • [blackmerchant_weapon] - название блока, обязательно в квадратных скобках. Применяется для идентификации блока разработчиком
    • 1 - уникальный ID блока. По нему блок вызывается в html при помощи специального байпасса (описано ниже).
  • Свойства блока
    • is_dutyfree = 0/1 - облагается ли покупка налогом Лорда
    • is_show_all = 0/1 - показывать ли все позиции или только доступные
    • keep_enchanted = 1 - сохранять заточку обмениваемого предмета
    • show_variation_item = 1 - показывает свойства аугментации
    • selllist={ - начало перечня обмениваемых предметов
  • Список обмениваемых позиций
    • Позиция в списке начинается с {
    • Блок товаров, которые получит игрок, отделяются 2-мя скобками {{ }}. Если выдать надо несколько предметов, то они между собой отделяются 1-й скобкой { }
    • [great_sword];1 - Непосредственно сам выдаваемый игроку предмет и его количество
    • ; - завершение блока выдаваемых игроку предметов и отделение его от забираемых у игрока предметов
    • Блок товаров, которые игрок отдаст, отделяются 2-мя скобками {{ }}. Если забрать надо несколько предметов, то они между собой отделяются 1-й скобкой { }
    • [adena];20741000 - забираемые у игрока предметы и их количество
    • Завершается позиция }; и без ; если позиция в блоке последняя
  • } - конец списка обмениваемых позиций
  • Завершение блока
    • MultiSell_end - объявление закрытия блока

Для вызова нужного блока используется html-байпасс:

<a action="bypass -h menu_select?ask=-303&reply=1">Buy</a>

Где -303 - специальный код, который работает с мультиселлами (для этого родительским AI-классом используемого NPC должен быть citizen) и 1 - уникальный ID блока из multisell.txt

Настройка Премиум-Магазина

Данный функционал пока доступен в версиях GF, GE и HF. Для полноценного использования на экстендере AdvExt64 Премиум-Магазина, его сначала необходимо приобрести.
После активации продукта появится таблица lin2world.account_balance, в которую можно вносить данные о наличии игровых денег на аккаунте, которыми каждый персонаж этого аккаунта сможет рассчитываться в Премиум-Магазине.
Для изменения ассортимента и цен в Премиум-Магазине необходимо править script\productdata.txt на серверной и system\productname-*.dat на клиентской сторонах.

Работа с productdata.txt

Рассмотрим на примере первой строки:

product_begin id=1080001 name={p_br_cash_fortuna_box_c} category=5 price=500 is_event_product=0 is_best_product=1 is_new_product=0 buyable=1 buy_condition={} sale_start_date={1980/01/01 08:00} sale_end_date={2079/06/01 08:00} location_id=8 /*ru*/ items={{[br_cash_fortuna_box_c];1}} server_type=free product_end

  • id - уникальный ID, по которому происходит связь с клиентским файлом
  • name - уникальное название для идентификации разработчиком
  • category - закладка, в которой товар будет продаваться:
    1. Руны
    2. Припасы
    3. Украшения
    4. Упаковки
    5. Другое
  • price - цена товара
  • is_event_product - 0/1 - отображать ли товар в закладке "Ивент"
  • is_best_product - 0/1 - отображать ли товар в закладке "Выбор дня"
  • buyable - продается ли товар
  • location_id - должно соответствовать значению country в L2Server.ini
  • items - перечень приобретаемых товаров (из itemdata.txt) и их количество

Работа с productname-*.dat

Вид декодированного файла будет зависеть от того, какой будет использоваться редактор клиентских файлов. В нашем случае первая строка файла выглядит так:

1080001 Small fortuna box br_cashtex.item.br_cash_lucky_box_i00

Как видим, здесь все просто:

  • Уникальный ID, который соответствует id из серверного скрипта
  • Название, которое отображается в Магазине
  • Имя пакета текстур и название иконки для отображения