MerchantJS - аддон для KubeJS, который решает давнюю проблему создания кастомных торговцев в Майнкрафт. В ванильном Minecraft торговля жестко привязана к жителям (виллагерам) и их профессиям. Хочешь, чтобы игрок торговал со статуей? Или чтобы босс предлагал обмен после победы? Раньше приходилось городить сложные команды или писать свои моды. Теперь все решается парой строк JavaScript.
Торговля где угодно и с чем угодно
По факту, мод позволяет открыть интерфейс торговли с любым объектом. Хоть с куском эндерняка, хоть с зачарованным золотым яблоком, хоть просто из воздуха. Вот рабочий пример, как заставить свинью торговать:
javascript // server_scripts ItemEvents.entityInteracted(event => { // Проверяем, свинья ли это if (event.getTarget().type === "minecraft:pig") { // Создаем полноценную сделку с двумя предметами на входе let offer0 = MerchantJSUtils.createMerchantOffer({ buy: Item.of("minecraft:potato").toNBT(), buyB: Item.of("minecraft:bread").toNBT(), sell: Item.of("minecraft:stone").toNBT(), uses: 0, maxUses: 50, xp: 5, priceMultiplier: 0, demand: 0 }); // Создаем простую сделку let offer1 = MerchantJSUtils.createMerchantOffer({ buy: Item.of("minecraft:beef").toNBT(), sell: Item.of("minecraft:egg").toNBT() }); // Открываем кастомное меню торговли MerchantJSUtils.openMerchant( event.player, Component.translatable("Little Piggy's Cartoon House"), [offer0, offer1] ); } });
Короче, кликаешь по свинье - открывается GUI с названием "Little Piggy's Cartoon House". Внутри - твои кастомные предложения. Удобно для сюжетных карт, RPG-сборок модов и адвенчур, где стандартные жители не вписываются в лор.
Настройка сделок: разбираем параметры
Чтобы сделать сложную экономику, нужно понимать, что вообще можно настроить. Вот полный список параметров для createMerchantOffer:
javascript let offer0 = MerchantJSUtils.createMerchantOffer({ buy: Item.of("minecraft:potato").toNBT(), // Первый предмет на вход (обязательно) buyB: Item.of("minecraft:bread").toNBT(), // Второй предмет на вход (необязательно) sell: Item.of("minecraft:stone").toNBT(), // Предмет на выход (обязательно) uses: 0, // Сколько раз использовали (по умолчанию 0) maxUses: 50, // Лимит использований (по умолчанию 99) xp: 5, // Сколько опыта даст сделка (по умолчанию 0) priceMultiplier: 0, // Множитель цены (по умолчанию 0) demand: 0 // Начальный спрос (по умолчанию 0) });
Тут есть одна хитрая фишка. Если поставить maxUses на 0, сделка станет недоступной (заблокируется). Это круто для систем прогрессии - показал игроку крутой меч, но он серый, пока не выполнен квест.
А чтобы это выглядело естественно, используем клиентское событие:
javascript // client_scripts MerchantEvents.switchTrade(event => { if (event.titleKey == "Little Piggy's Cartoon House") { // Проверяем окно торговли (работает и с ванильными жителями!) if (event.getOffer().getMaxUses() == 0) { Client.player.tell("Эта сделка заблокирована..."); } } });
Так можно гибко включать и выключать сделки. Идеально для поэтапного прохождения.
Совместимость с ванилью и сохранение данных
Важно понимать: MerchantJS не пытается переизобрести экономику Майнкрафт. Он дает инструмент для легкого создания самих сделок. А вот такие штуки, как восстановление запасов (ресток), колебания цен или спрос - это уже придется реализовывать самому через скрипты.
Совет от практика: каждый вызов openMerchant создает предложения заново. Если тебе нужно хранить инфу о том, сколько раз игрок уже купил зелье у кастомного НПС, используй persistentData из KubeJS. Это нативный механизм сохранения данных, который не вызывает лагов и не ломает мир при удалении мода.
А вот событие afterTrade срабатывает после любой сделки, включая ванильные:
javascript
// server_scripts
MerchantEvents.afterTrade(event => {
event.player.tell(Спасибо за покупку ${event.getOffer().result.id}! Заходи еще!);
event.player.addXP(event.getOffer().xp);
});
Отличное место, чтобы выдать кастомный опыт или запустить тригггер для квеста. Что касается рестока - просто проверяй временные интервалы при каждом открытии окна торговли.
Итог
Скачайте MerchantJS, если делаете свой сервер на KubeJS и хотите гибкую систему бартера без ограничений ванильных жителей. Мод работает на Fabric, Forge, NeoForge и Quilt (в зависимости от того, какая версия KubeJS у вас установлена для нужной версии Minecraft). С ним создание уникальных торговцев занимает минуты, а не часы копания в исходном коде.

