開設交易

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

商人

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

可以通过 Merchant 的 TradeOfferData 来存储和移除 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 。不同的等级和不同的 Career 的 TradeOfferListMutator 可以在 VillagerRegistry 中配置。

備註

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

交易生成工厂

交易生成工厂( 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 不会再受到任何影响。