> For the complete documentation index, see [llms.txt](https://guide-autodonate.magicbyte.ru/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://guide-autodonate.magicbyte.ru/magazin/tovary/nastraivaemyi-predmet.md).

# Настраиваемый предмет

Настраиваемый товар позволяет добавлять товары, не поддерживаемые напрямую сайтом и DayZShop.

Данный тип товара имеет два поля:

* Идентификатор - строка, которая будет использоваться Вашим модом для определения вида товара.
* Содержание - строка произвольного содержимого, которую Вы можете использовать для передачи данных о товаре своему моду.

Для использования данного типа товара Вам необходимо создать свой мод, который будет интегрироваться с DayZShop с помощью шаблона слабых событий, предоставляемого MagicByteSharedLibrary. Разберём интеграцию мода на примере ниже.

Сначала необходимо в классе, который будет отвечать за обработку товаров, создать метод, отвечающий за событие использования кастомного товара. В этом методе Вы обрабатываете кастомные товары. Если товар удалось успешно применить, то метод должен вернуть экземпляр MBSL\_UnmanagedValue\<bool>, содержащий значение true. Иначе метод должен вернуть null. Сигнатура метода должна полностью совпадать с указанной ниже:

```clike
MBSL_UnmanagedValue<bool> DZS_CustomProduct(PlayerIdentity player, string identifier, string content)
```

Затем класс должен подписаться на событие DZS\_CustomProduct через MBSL\_EventManager:

```clike
MBSL_EventSystem.Subscribe(this, "DZS_CustomProduct");
```

Теперь при получении пользователем через корзину или код кастомного товара, эта функция будет вызвана для обработки товара.

Ниже представлен пример простого мода-интеграции для того, чтобы напечатать поле "содержание" в чат пользователю при использовании товара с идентификатором Message:

```clike
modded class MissionServer
{
    protected ref ExampleCustomProductHandler m_CustomProductHandler;
    
    void MissionServer()
    {
        m_CustomProductHandler = new ExampleCustomProductHandler();
    }
}

class ExampleCustomProductHandler : Managed
{
    void ExampleCustomProductHandler()
    {
        MBSL_EventSystem.Subscribe(this, "DZS_CustomProduct");
    }
    
    protected MBSL_UnmanagedValue<bool> DZS_CustomProduct(PlayerIdentity player, string identifier, string content)
    {
        if (identifier == "Message")
        {
            PlayerBase.Cast(player.GetPlayer()).MessageImportant(content);
            return new MBSL_UnmanagedValue<bool>(true);
        }
	return null;
    }
}
```
