跳到正文

VillagersTradingPlus

作者:LithiumPlus

通过数据包添加或替换任意村民的交易、更改货币、设置交易解锁条件,还能调整价格。

收藏

截图

介绍

介绍由机器翻译自 CurseForge 原页面,仅供参考。

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

支持我的创作

Patreon

Buy me a coffee


这是做什么的

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 的更多模组

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 的其他作品

查看全部 →