
VillagersTradingPlus
Мод VillagersTradingPlus для Minecraft позволяет полностью переделать торговлю жителей через датапаки: менять валюту, добавлять условия, переписывать сделки и настраивать странствующего торговца.
VillagersTradingPlus - мод-библиотека для Майнкрафт, которая подменяет внутренний движок торговли с жителями. Сам по себе он не добавляет ни мобов, ни блоков, ни предметов. Вместо этого он открывает систему сделок для датапаков и других модов, чтобы любую торговлю можно было описать в обычном JSON-файле.
Зачем это вообще нужно? В ванильном Minecraft сделки жителей зашиты в код игры. Хочешь, чтобы библиотекарь продавал только Остроту и Починку, а мясник покупал изумруды за свинину - извини, без модов никак. С VillagersTradingPlus ты просто пишешь JSON, кладёшь его в датапак, и жители торгуют так, как ты решил. Это находка для сборок модов, RPG-серверов и всех, кто строит свой мир с уникальной экономикой.
Скачать VillagersTradingPlus стоит, если какой-то мод требует его как зависимость, или если ты сам хочешь переписать торговлю. Эталонный пример мода на этой библиотеке - VillagersPlus, который как раз построен поверх неё.
Мод работает на Fabric, NeoForge и Forge, поддерживает Minecraft 1.20.1, 1.21.1 и 1.21.8.
Что умеет библиотека
- Добавлять, удалять и перезаписывать сделки для любой профессии жителя, включая ванильные.
- Менять валюту с изумрудов на любой предмет - хоть на золотые слитки, хоть на алмазы.
- Настраивать количество, лимит использований, опыт жителя и поведение цены для каждой сделки.
- Прятать сделки за условиями: биом, измерение, погода, время суток, фаза луны, геймрул, рабочий блок или флаг из конфига.
- Четырнадцать типов сделок - от простой продажи предмета до взвешенных пулов, карт сокровищ и зачарованных книг из твоего собственного списка.
- Объединять несколько датапаков, которые меняют одного и того же жителя, вместо того чтобы последний перезаписывал всех.
- Настраивать странствующего торговца точно так же, с его собственными обычным и редким уровнями.
Конфигурация
Файл настроек лежит тут:
config/villagertradingplus/villagertradingplus-1.0-config.json5
Эти параметры применяются ко всем сделкам, которые строит библиотека, независимо от того, какой мод или датапак их определил.
Торговля
| Опция | По умолчанию | Что делает |
|---|---|---|
trade_offers_per_level | 2 | Максимум новых сделок, которые житель получает за уровень. |
trade_offers_wandering_trader | 5 | Максимум сделок у странствующего торговца. |
trade_price_multiplier_scale | 1.0 | Масштабирует, насколько сильно цены колеблются от спроса и репутации. 0.0 замораживает оба эффекта. Не меняет стартовую цену сделки. |
trade_cost_scale | 1.0 | Умножает базовую стоимость каждой сделки (только первый входной слот). 2.0 удваивает все цены. Результат ограничен от 1 до одного стака. |
enable_conditional_trades | true | Проверять ли условия для сделок. false делает все сделки доступными всегда. |
enable_time_of_day_pricing | false | Случайно подталкивает цену сделки в зависимости от игрового времени, когда она разблокирована. Цена фиксируется в момент разблокировки и дальше не меняется. |
time_of_day_price_variance | 0.15 | Насколько сильно может сместиться цена, в долях от стоимости. Работает только если включена опция выше. |
Кнопки на экране торговли
Все три выключены по умолчанию. Когда включены, любой игрок может ими пользоваться, так что они скорее для креатива и тестирования, чем для выживания на сервере.
| Опция | По умолчанию | Что делает |
|---|---|---|
allow_trade_reroll | false | Кнопки для переброса сделок жителя или торговца - всех сразу или по одному уровню. |
allow_set_villager_level | false | Контроль для установки уровня жителя (1-5) с перегенерацией сделок. У странствующего торговца уровней нет, он это игнорирует. |
allow_view_all_trades | false | Кнопка, открывающая панель-каталог со всеми сделками, которые житель может выкинуть на выбранном уровне, с весами, шансами и условиями. Только для чтения. |
Создание датапака
Файлы сделок кладутся в датапак под твоим собственным неймспейсом. Библиотека читает три папки:
| Папка | Что делает |
|---|---|
data/<неймспейс>/default_villager_trades/<профессия>.json | Полностью заменяет сделки профессии. |
data/<неймспейс>/villager_trades/<профессия>.json | Добавляет сделки к профессии. |
data/<неймспейс>/wandering_trader_trades/<любое имя>.json | Сделки странствующего торговца. |
Файл профессии указывает профессию и содержит пять массивов по уровням:
{
"profession": "minecraft:butcher",
"trades": {
"novice": [],
"apprentice": [],
"journeyman": [],
"expert": [],
"master": []
}
}
Каждый пример ниже - это один объект сделки, который вставляется в один из этих пяти массивов.
Важный нюанс: ванильные сделки пока не переведены в JSON, так что если хочешь заменить их - придётся выписать вручную те уровни, которые нужно сохранить.
Общие поля для всех типов сделок
Чтобы примеры не раздувались, эти поля опущены, но они работают везде:
| Поле | Значение |
|---|---|
max_uses | Сколько раз сделку можно использовать до блокировки. |
villager_experience | Опыт, который житель получает за каждое использование. |
price_multiplier | Насколько сильно репутация и эффект Героя деревни влияют на цену. |
demand | Задаёт ванильную механику спроса: цена растёт с использованием и со временем спадает. |
conditions / logic | Смотри раздел Условия ниже. |
Типы сделок используют неймспейс villagertradingplus:. Старый villagersplus: тоже принимается для датапаков, написанных до разделения, но при загрузке выводит предупреждение об устаревании. Новые файлы пиши под новый неймспейс.
Типы сделок
sell_item
Житель продаёт предмет за цену.
{
"type": "villagertradingplus:sell_item",
"sell": { "item": "minecraft:oxeye_daisy", "count": 1 },
"priceIn": { "item": "minecraft:emerald", "count": 2 }
}
buy_item
Житель покупает предмет и платит тебе.
{
"type": "villagertradingplus:buy_item",
"buy": { "item": "minecraft:wheat_seeds", "count": 4 },
"reward": { "item": "minecraft:emerald", "count": 1 }
}
sell_tagged_item
Продаёт один случайный предмет из тега. Выбор происходит при генерации сделки, так что два жителя с этой сделкой обычно продают разные вещи. Ванильные сделки привязаны к конкретному предмету, так что это не "любой из" на прилавке.
{
"type": "villagertradingplus:sell_tagged_item",
"sell": { "tag": "minecraft:saplings", "count": 1 },
"priceIn": { "item": "minecraft:emerald", "count": 3 }
}
buy_tagged_item
Та же идея, но для покупки.
{
"type": "villagertradingplus:buy_tagged_item",
"buy": { "tag": "minecraft:flowers", "count": 8 },
"reward": { "item": "minecraft:emerald", "count": 1 }
}
process_item
Берёт convertible плюс priceIn и возвращает sell - классическая сделка "принеси мне сырьё".
{
"type": "villagertradingplus:process_item",
"convertible": { "item": "minecraft:dead_tube_coral", "count": 1 },
"priceIn": { "item": "minecraft:emerald", "count": 5 },
"sell": { "item": "minecraft:tube_coral", "count": 1 }
}
multi_input
Два входа, один выход. В ванили ровно два слота покупки, так что один из входов и есть валюта.
{
"type": "villagertradingplus:multi_input",
"input_a": { "item": "minecraft:emerald", "count": 5 },
"input_b": { "item": "minecraft:book", "count": 1 },
"sell": {
"item": "minecraft:enchanted_book",
"enchantments": [ { "id": "minecraft:mending", "lvl": 1 } ]
}
}
weighted_pool
Выбирает одну из нескольких сделок по весу при генерации. Ниже ромашка в десять раз вероятнее розы иссушения.
{
"type": "villagertradingplus:weighted_pool",
"pool": [
{
"weight": 10,
"trade": {
"type": "villagertradingplus:sell_item",
"sell": { "item": "minecraft:oxeye_daisy", "count": 1 },
"priceIn": { "item": "minecraft:emerald", "count": 1 }
}
},
{
"weight": 1,
"trade": {
"type": "villagertradingplus:sell_item",
"sell": { "item": "minecraft:wither_rose", "count": 1 },
"priceIn": { "item": "minecraft:emerald", "count": 8 }
}
}
]
}
sell_potion
Берёт convertible плюс priceIn и возвращает sell, для сделок с зельями.
{
"type": "villagertradingplus:sell_potion",
"convertible": { "item": "minecraft:potion", "count": 3 },
"priceIn": { "item": "minecraft:emerald", "count": 5 },
"sell": { "item": "minecraft:splash_potion", "count": 7 }
}
sell_map
Продаёт заполненную карту, указывающую на структуру. structure_id - это тег структуры.
{
"type": "villagertradingplus:sell_map",
"structure_id": "minecraft:on_woodland_explorer_maps",
"name": "filled_map",
"buy": { "item": "minecraft:compass", "count": 1 },
"priceIn": { "item": "minecraft:emerald", "count": 2 },
"price_multiplier": 0.2
}
sell_enchanted_tool
Продаёт инструмент со случайным зачарованием, как в ванили. Цена масштабируется от того, что выпало.
{
"type": "villagertradingplus:sell_enchanted_tool",
"sell": { "item": "minecraft:diamond_pickaxe", "count": 1 },
"basePriceIn": { "item": "minecraft:emerald", "count": 2 }
}
sell_specific_enchanted_tool
Продаёт инструмент с фиксированным зачарованием на фиксированном уровне - гарантированный результат, а не ролл. enchantment по умолчанию minecraft:fortune, level по умолчанию 1.
{
"type": "villagertradingplus:sell_specific_enchanted_tool",
"sell": { "item": "minecraft:diamond_pickaxe", "count": 1 },
"basePriceIn": { "item": "minecraft:emerald", "count": 32 },
"enchantment": "minecraft:efficiency",
"level": 4
}
sell_enchanted_book
Продаёт случайно зачарованную книгу, ванильный стиль.
{
"type": "villagertradingplus:sell_enchanted_book",
"currency": { "item": "minecraft:emerald" },
"price_multiplier": 0.2
}
sell_specific_enchanted_book
Продаёт книгу с фиксированным зачарованием и уровнем. Поля sell нет, предмет всегда книга. enchantment по умолчанию minecraft:unbreaking, level по умолчанию 1.
{
"type": "villagertradingplus:sell_specific_enchanted_book",
"basePriceIn": { "item": "minecraft:emerald", "count": 20 },
"enchantment": "minecraft:mending",
"level": 1
}
sell_enchanted_book_from_list
Продаёт зачарованную книгу из взвешенного списка, который ты задаёшь сам. Ты контролируешь, какие именно зачарования может предложить библиотекарь. Стоимость: base_cost + cost_per_level * level, умноженная на treasure_multiplier для сокровищных зачарований.
{
"type": "villagertradingplus:sell_enchanted_book_from_list",
"currency": { "item": "minecraft:emerald" },
"enchantments": [
{ "id": "minecraft:sharpness", "min_level": 1, "max_level": 3, "weight": 5 },
{ "id": "minecraft:unbreaking", "min_level": 1, "max_level": 3, "weight": 5 },
{ "id": "minecraft:mending", "min_level": 1, "max_level": 1, "weight": 1 }
],
"base_cost": 2,
"cost_per_level": 3,
"treasure_multiplier": 2,
"price_multiplier": 0.2
}
Условия
Добавь массив conditions к любой сделке, чтобы спрятать её за проверкой. По умолчанию логика И (AND); поставь "logic": "or" на сделке, чтобы достаточно было одного условия.
Тайминг важен. Условия проверяются один раз - в момент генерации сделки, когда житель повышает уровень. Не постоянно. Условия по местоположению (biome, dimension, job_site_block, config_flag) стабильны для осевшего жителя и поэтому надёжны. Условия по состоянию мира (weather, day_night, moon_phase, gamerule) - это снимок того момента: сделка, привязанная к night, останется доступной средь бела дня, если уже выпала.
Условия можно глобально отключить через enable_conditional_trades.
| Тип | Поля | Пример |
|---|---|---|
biome | tag (строка) или biomes (массив) | { "type": "biome", "tag": "minecraft:is_ocean" } |
dimension | dimension | { "type": "dimension", "dimension": "minecraft:overworld" } |
weather | state: clear, rain, thunder | { "type": "weather", "state": "rain" } |
day_night | time: day или night | { "type": "day_night", "time": "night" } |
moon_phase | phases (массив 0-7) | { "type": "moon_phase", "phases": [0] } |
config_flag | field (имя булева поля конфига), опционально value | { "type": "config_flag", "field": "can_explode" } |
gamerule | rule (булев геймрул), опционально value | { "type": "gamerule", "rule": "doInsomnia", "value": true } |
job_site_block | blocks (массив) или wood_variant (строка, сравнивается с id блока) | { "type": "job_site_block", "blocks": [ "villagersplus:oceanographer_table" ] } |
Обрати внимание: biomes, blocks и phases принимают массивы, а tag, dimension и wood_variant - одну строку.
{
"type": "villagertradingplus:sell_item",
"sell": { "item": "minecraft:heart_of_the_sea", "count": 1 },
"priceIn": { "item": "minecraft:emerald", "count": 30 },
"logic": "or",
"conditions": [
{ "type": "biome", "tag": "minecraft:is_ocean" },
{ "type": "day_night", "time": "night" }
]
}
Ценообразование
price_multiplier и demand работают на любой сделке и подключаются к ванильной ценовой механике:
price_multiplier- насколько сильно репутация и Герой деревни двигают цену этой сделки.demand- задаёт ванильный трекинг спроса. Цена растёт по мере использования и со временем снижается.
Оба параметра масштабируются сервером через trade_price_multiplier_scale (размах колебаний) и trade_cost_scale (базовая стоимость). Скидки от репутации и Героя деревни ваниль накладывает сверху.
{
"type": "villagertradingplus:sell_item",
"sell": { "item": "minecraft:diamond", "count": 1 },
"priceIn": { "item": "minecraft:emerald", "count": 12 },
"price_multiplier": 0.1,
"demand": 10
}
Кастомные предметы
Любой стак предмета в любом типе сделки принимает этот сахар, специальный тип не нужен:
| Поле | Значение |
|---|---|
name | Отображаемое имя. Просто строка или сырой JSON text component. |
lore | Массив строк лора. |
enchantments | Массив { "id": ..., "lvl": ... }. |
color | Hex-цвет для красимой брони. |
potion | Id зелья для зелий. |
skull_owner | Имя игрока для голов. |
book | { "title": ..., "author": ..., "pages": [...] } для написанных книг. |
nbt | Сырой SNBT, применяется последним как запасной выход. |
{
"type": "villagertradingplus:sell_item",
"sell": {
"item": "minecraft:diamond_sword",
"name": "{\"text\":\"Excalibur\",\"color\":\"gold\",\"italic\":false}",
"lore": [ "A blade of legend" ],
"enchantments": [ { "id": "minecraft:sharpness", "lvl": 5 } ],
"nbt": "{Unbreakable:1b}"
},
"priceIn": { "item": "minecraft:emerald", "count": 40 }
}
Сделки странствующего торговца
Создай датапак с такой структурой папок:
data/<неймспейс>/wandering_trader_trades
Имя файла любое. Вместо пяти уровней жителя у торговца два:
common- уровень 1. Выбирается несколько, количество задаётtrade_offers_wandering_trader.rare- уровень 2. Выбирается ровно одна.
Поставь "replace": true, чтобы выкинуть ванильные сделки торговца и использовать только свои. Не ставь (или false), чтобы добавить поверх ванильных. Все типы сделок, блок условий и ценообразование работают тут точно так же, как у жителей.
{
"replace": false,
"trades": {
"common": [
{
"type": "villagertradingplus:sell_item",
"sell": { "item": "minecraft:glowstone_dust", "count": 4 },
"priceIn": { "item": "minecraft:emerald", "count": 2 },
"conditions": [ { "type": "day_night", "time": "night" } ],
"max_uses": 6,
"villager_experience": 1
}
],
"rare": [
{
"type": "villagertradingplus:sell_item",
"sell": {
"item": "minecraft:trident",
"name": "{\"text\":\"Traveler's Trident\",\"color\":\"aqua\",\"italic\":false}",
"enchantments": [ { "id": "minecraft:loyalty", "lvl": 3 } ],
"nbt": "{Unbreakable:1b}"
},
"priceIn": { "item": "minecraft:emerald", "count": 30 },
"max_uses": 2,
"villager_experience": 1
}
]
}
}
Готовые файлы-примеры
Внутри jar по пути data/villagertradingplus/available_trade_examples лежат полные, готовые к копированию файлы для случаев, которые сниппетом не покажешь:
full_profession.json- одна профессия на всех пяти уровнях, со смесью разных типов сделок.conditions_and_pricing.json- условия и ценообразование на реалистичных сделках.wandering_trader.json- полный файл странствующего торговца.
Скачать мод VillagersTradingPlus и начать переписывать экономику своего мира - это, пожалуй, самый гибкий способ настроить торговлю в Майнкрафт без единой строчки Java-кода. Для сборок модов и серверов с кастомной экономикой - must-have.
Как поиграть с друзьями с модом VillagersTradingPlus?
Мод VillagersTradingPlus куда интереснее в компании: поднимите сервер Майнкрафт с уже установленным модом, позовите друзей и играйте по своим правилам. Хостинг Майнкрафт для мода VillagersTradingPlus будет готов за пару минут - BungeeHost сделает всё за вас.
