開設交易
警告
这些文档是为 SpongeAPI 7 编写的,可能已经过时。 如果你觉得你可以帮助更新它们,请提交一个 PR!
这里介绍了游戏中的 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 不会再受到任何影响。