跳到正文

VillagersTradingPlus

作者:LithiumPlus

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

收藏

介绍

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

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

请我喝杯咖啡


这是什​​么

VillagersTradingPlus 是一个前置库。它本身不会添加村民、方块或物品:它会替换
村民交易背后的机制,让模组和数据包能够通过 JSON 定义交易。

VillagersPlus 是基于它构建的示例模组。

它能做什么

  • 为所有村民职业(包括原版职业)添加、删除或覆盖交易。
  • 将货币从绿宝石更改为任意物品。
  • 设置每项交易的数量、最大使用次数、村民经验和价格机制。
  • 为交易设置条件限制:生物群系、维度、天气、一天中的时间、月相、游戏规则、工作站方块或配置标记。
  • 提供 16 种交易类型(26.1 及更新版本为 15 种),从普通物品交易到加权池、结构地图,以及从你定义的加权列表中抽取附魔书。交易也可以使用原版的 merchant_predicate 格式,例如将交易限制为某一种村民类型(1.21.1 及更新版本)。
  • 合并多个数据包对同一村民所做的修改,而不是只保留最后一个数据包的设置。
  • 以相同方式自定义流浪商人,为其设置独立的普通和稀有等级;在 1.21.8 及更新版本中还可设置收购物品等级(1.21.1 仅在启用 Trade Rebalance 实验性玩法时支持)。

配置

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 中仅在启用 Trade Rebalance 实验性功能时可用)。不包含此等级的文件会保留原版购买交易。
  • 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 是一系列小型独立模组,为原版内容增添一些小故事。只安装你想要的模组即可。链接指向 CurseForge。

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

查看全部 →