村民交易
这里介绍了游戏中的 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
不会再受到任何影响。