村民交易

这里介绍了游戏中的 VillagerMerchant (村民或商人)提供的 TradeOffer (交易)。

商人

一个 Merchant 存储着若干 TradeOffer 。商人的最常见形式是 Villager ,而更一般的 Merchant 接口代表其可以打开一个交易界面。

可以通过 MerchantTradeOfferData 来存储和移除 TradeOffer

交易

一个交易包括

  • 商人希望购买的第一个(主) ItemStackSnapshot

  • 商人希望购买的第二个(可选) ItemStackSnapshot

  • 一个用于商人出售的 ItemStackSnapshot

  • 已经产生的交易次数

  • 可用于交易的最大次数

  • 一个用于判定什么时候生成经验球的标志

可以通过一个 Builder (交易生成器)或者 TradeOfferGenerator 创建 TradeOffer

交易生成器

交易生成器( TradeOfferBuilder )主要用于开发者随手创建的临时的交易。

下面的代码生成一个交易。玩家( Player )可以通过交换五个 DIRT 方块得到三个 GRASS 方块。这个交易一开始已经“进行”了四次,此后需要等待 Merchant 一段时间以允许其再次提供该交易。

TradeOffer offer = TradeOffer.builder()
    .firstBuyingItem(ItemStack.of(ItemTypes.DIRT, 5))
    .sellingItem(ItemStack.of(ItemTypes.GRASS, 3))
    .uses(0)
    .maxUses(4)
    .canGrantExperience(false)
    .build();

交易列表修改器

交易列表修改器( TradeOfferListMutator )是一个会在 Villager 升级时调用的接口。它可以用于替换现有(或更高等级)的 TradeOffer 或添加新的 TradeOffer 。它的最简单的也是目前 API 唯一提供的变种是 TradeOfferGenerator 。不同的等级和不同的 CareerTradeOfferListMutator 可以在 VillagerRegistry 中配置。

注解

VillagerTradeOffer 列表可能只会在村民交易界面打开时惰性生成。

交易生成工厂

交易生成工厂( TradeOfferGenerator )是一种用于生成 TradeOffer 的生成模板。所有的交易生成工厂都属于交易列表修改器,并且用于为村民生成新的 TradeOffer 。交易生成工厂并不移除已有的 TradeOffer

TradeOfferGenerator tradeOfferGenerator = TradeOfferGenerator.builder()
        .setPrimaryItemGenerator(random -> ItemStack.of(ItemTypes.DIRT, random.nextInt(3) + 5))
        .setSellingGenerator(random -> ItemStack.of(ItemTypes.GRASS, 5))
        .startingUses(VariableAmount.baseWithVariance(2, 1))
        .maxUses(VariableAmount.fixed(5))
        .experienceChance(0.5)
        .build();

这个交易生成工厂将如开发者所愿,随机地生成 TradeOffer

  • 购买五到八个 DIRT

  • 售出五个 GRASS

  • 可能已经发生过两到四次的交易

  • 最多交易五次

新生成的 TradeOffer 有 50% 的概率产生经验。

注解

你还可以使用 ItemStackGenerator 以实时地把附魔等自定义数据添加到物品中,并将其用于交易。

对村民的修改

可以通过 GameRegistry 类获取到 VillagerRegistry 用于修改村民的相关交易。通过配置 TradeOfferListMutator 我们可以自定义 Villager 升级时会发生的行为。

VillagerRegistry villagerRegistry = this.game.getRegistry().getVillagerRegistry();
List<TradeOfferListMutator> generators = new ArrayList<>(villagerRegistry.getMutatorsForCareer(Careers.FARMER, 1));
generators.addAll(additionalFarmerLevel1TradeOffers());
villagerRegistry.setMutators(Careers.FARMER, 1, generators);

Villager 的最低等级为一,等价于一个新出生的村民。

注解

VillagerRegistry 中数据的修改将不会保存到下一次服务器重启,同时已经升级的村民的 TradeOffer 不会再受到任何影响。