截图
介绍
VillagersTradingPlus 是一个前置库,可让模组和数据包通过 JSON 定义村民交易。
通过数据包添加或替换任意村民的交易、更改货币、设置交易条件并调整价格。
版本:1.20 至 1.20.1、1.21 至 1.21.1、1.21.6 至 1.21.8、1.21.11、26.1.2、26.2、26.3
支持我的创作
这是做什么的
VillagersTradingPlus 是一个前置库。它本身不会添加村民、方块或物品,而是改造村民交易的底层机制,让模组和数据包能够通过 JSON 定义交易。
VillagersPlus 是基于它构建的示例模组。
你可以用它做什么
- 添加、删除或覆盖所有村民职业的交易,包括原版职业。
- 更改货币,将绿宝石换成任意物品。
- 设置每项交易的数量、最大使用次数、村民经验和价格行为。
- 根据条件限制交易:生物群系、维度、天气、一天中的时间、月相、游戏规则、工作站点方块或配置开关。
- 提供 16 种交易类型(26.1 及更新版本为 15 种),包括普通物品交易、加权池、结构地图,以及从自定义加权列表中抽取附魔书。交易还支持原版的
merchant_predicate格式,例如将交易限制为特定村民类型(1.21.1 及更新版本)。 - 合并多个数据包对同一村民的修改,而不是只保留最后一个数据包的设置。
- 以相同方式自定义流浪商人,为其设置独立的普通和稀有等级;在 1.21.8 及更新版本中还可添加购买等级(1.21.1 仅在启用交易再平衡实验时支持)。
配置
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_ 选项默认关闭。任何玩家都可以打开交易目录。重新随机生成按钮和等级控制需要满足 reroll_permission_level 中设定的权限等级。它们主要用于创造模式建造和测试,而非生存服务器。
| 选项 | 默认值 | 作用 |
|---|---|---|
allow_trade_reroll |
false | 用于重新随机生成村民或流浪商人交易的按钮,可一次性重新生成全部交易,也可逐级重新生成。 |
allow_set_villager_level |
false | 用于设置村民等级(1-5)并重新生成其交易的控件。流浪商人没有等级,因此不会受此选项影响。 |
reroll_permission_level |
0 | 玩家使用重新随机生成按钮和等级控制所需的命令权限等级(0-4)。0 表示所有玩家都可以使用,2 表示需要管理员权限。 |
allow_view_all_trades |
false | 打开只读目录面板的按钮,可列出村民在指定等级下可能获得的所有交易,以及对应权重、概率和条件。 |
制作数据包
交易文件应放在使用你自己的命名空间的数据包中。系统会读取以下三个文件夹:
| 文件夹 | 作用 |
|---|---|
data/<namespace>/default_villager_trades/<profession>.json |
完全替换某个职业的交易。 |
data/<namespace>/villager_trades/<profession>.json |
向某个职业的交易中添加内容。 |
data/<namespace>/wandering_trader_trades/<any name>.json |
流浪商人的交易。 |
职业文件会指定职业,并包含五个等级数组:
{
"profession": "minecraft:butcher",
"trades": {
"novice": [],
"apprentice": [],
"journeyman": [],
"expert": [],
"master": []
}
}
下面的每个代码片段都是一个交易对象,可放入上述五个等级数组之一。
注意:模组 JAR 文件已按此格式提供所有原版交易,路径为 data/villagertradingplus/vanilla_trades。将文件复制到你的数据包中即可替换某个职业的交易。
所有交易类型均支持的字段
为保持简短,以下示例中省略了这些字段:
| 字段 | 含义 |
|---|---|
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,用于药水形状的交易。sell.count 用于设置堆叠数量。
{
"type": "villagertradingplus:sell_potion",
"convertible": { "item": "minecraft:potion", "count": 3 },
"priceIn": { "item": "minecraft:emerald", "count": 5 },
"sell": { "item": "minecraft:splash_potion", "count": 1 }
}
sell_map
出售一张指向某个结构的已填充地图。structure_id 是结构标签。name 是翻译键;省略该字段可保留原版地图名称。
{
"type": "villagertradingplus:sell_map",
"structure_id": "minecraft:on_woodland_explorer_maps",
"name": "filled_map.mansion",
"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 的数组);默认还要求处于夜晚。若只想匹配月相对应的日期,请设置 "require_night": false |
{ "type": "moon_phase", "phases": [0] } |
config_flag |
field(布尔值配置字段名称),可选的 value |
{ "type": "config_flag", "field": "allow_trade_reroll" } |
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 文本组件。 |
lore |
描述文本行数组。 |
enchantments |
{ "id": ..., "lvl": ... } 数组。 |
color |
可染色盔甲的十六进制颜色。 |
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/<namespace>/wandering_trader_trades
任意文件名均可。流浪商人没有村民的五个等级,而是最多三个:
buying– 商人用绿宝石购买物品的交易(1.21.8 及更新版本;在 1.21.1 上仅在交易重平衡实验性功能下可用)。没有此等级的文件会保留原版购买交易。common– 等级 1。会选取多个,数量由trade_offers_wandering_trader设定。rare– 等级 2。只会选取一个。
设置 "replace": true 可丢弃原版流浪商人交易,仅使用你的交易。省略它
(或设为 false)则在原版基础上添加。所有交易类型、条件块和定价在此处的行为与村民完全一致。没有自定义交易的等级会保留原版交易,即使 replace 设为 true 也是如此。
{
"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– 一个完整的流浪商人文件。
社区
问题、截图和帮助请前往 Discord。
LithiumPlus 的更多模组
- The Graveyard:新增墓地主题的结构、生物、方块和一位Boss。Forge版本:The Graveyard (Forge)。
- VillagersPlus:新增村民类型、交易和工作站点。
- Nyctophobia:为主世界增添昏暗、雾气弥漫且令人不安的生物群系。Forge版本:Nyctophobia (Forge)。
- DataDrivenVillagers:通过JSON文件或游戏内编辑器创建和更改村民职业。
VanillaTales是一组小型、独立的模组,为原版内容增添一个个小故事。只安装你喜欢的模组即可。
- Golem Patrol:铁傀儡白天巡逻,夜晚站岗,并会响应钟声集结。
- Zombie Sieges:将原版僵尸围城变成一场真正的事件,加入钟声、Boss栏和两波僵尸。
- Sherd Stories:为每个饰纹陶罐添加标题,并讲述其陶片的发现地点。
- Ghost Crews:为每艘沉船命名,并安排一群溺尸守护它,直到船上的战利品被搜刮一空。
- Illager Scouts:掠夺者侦察兵会监视你的村庄,并在巡逻队抵达前两天发出警告。
- Occupied Villages:部分新生成的村庄已被灾厄村民驻军占据,你可以将其解放。
- Bonded Pairs:将同一生成群组中的两只生物绑定成一对,让它们为彼此复仇。
- Raid Aftermath:村民会修复袭击或爆炸给村庄造成的破坏。
- Wayfarer’s Landmarks:进入结构时显示标题和实用图标。
常见问题
VillagersTradingPlus 支持哪些 Minecraft 版本?
VillagersTradingPlus 支持 Minecraft Java 版 1.20–26.3,共 11 个版本,可用的加载器:Fabric / Forge / NeoForge。下载时注意选择和你游戏版本一致的文件。
VillagersTradingPlus 怎么安装?
先用 PCL2 或 HMCL 启动器安装对应版本的 Fabric / Forge / NeoForge,再把下载的 .jar 文件放进游戏目录的 mods 文件夹,重新启动游戏即可。开启了版本隔离的,mods 文件夹在 versions/版本名 下面。
LithiumPlus 的其他作品
查看全部 →The Graveyard (Forge)
一款以墓地为主题,新增结构、生物、Boss 和方块的模组。
The Graveyard (Fabric/Neoforge)
一款以墓地为主题,新增结构、生物、Boss 和方块的模组。
VillagersPlus (Fabric/Neoforge)
一个村民自定义与扩展模组,添加新的村民类型、交易和精美的工作站点。
VillagersPlus (Forge)
村民扩展模组,新增村民类型、交易以及精美的工作站。


评论
登录后评论和评分