本篇教程的视频

本篇教程的源代码

GitHub地址:TutorialMod-1.20.1-Forge-Trade

村民交易

在Forge这里,添加村民交易可以直接用事件监听来实现

所以我们这里直接来写

首先我们新建一个类ModCustomTrades,并加上@Mod.EventBusSubscriber注解,里面写上我们的MOD_ID

1
2
3
4
@Mod.EventBusSubscriber(modid = TutorialMod.MOD_ID)
public class ModCustomTrades {

}

然后我们来创建一个方法addTrades,并加上@SubscribeEvent注解,它使用的事件是VillagerTradesEvent

1
2
3
4
@SubscribeEvent
public static void addTrades(VillagerTradesEvent event) {

}

然后我们来写我们的交易

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 if (event.getType() == VillagerProfession.FARMER) {
Int2ObjectMap<List<VillagerTrades.ItemListing>> trades = event.getTrades();

trades.get(1).add((pTrader, pRandom) -> new MerchantOffer(
new ItemStack(Items.EMERALD, 2),
new ItemStack(ModItems.STRAWBERRY.get(), 15),
10, 2, 0.5f
));
trades.get(2).add((pTrader, pRandom) -> new MerchantOffer(
new ItemStack(ModItems.CORN.get(), 15),
new ItemStack(Items.EMERALD, 5),
10, 2, 0.5f
));
}

if (event.getType() == VillagerProfession.ARMORER) {
Int2ObjectMap<List<VillagerTrades.ItemListing>> trades = event.getTrades();
trades.get(2).add((pTrader, pRandom) -> new MerchantOffer(
new ItemStack(Items.EMERALD, 10),
new ItemStack(ModItems.ICE_ETHER_HELMET.get()),
5, 2, 0.5f
));
}

首先使用event.getType()方法获取村民的职业

然后使用event.getTrades()方法获取村民的职业对应的交易列表

再使用trades.get(int)方法获取村民的职业对应的交易列表中对应等级的交易列表

最后使用add()方法添加交易

我们再来看看MerchantOffer的各参数:

  • 玩家给村民的物品(用绿宝石买东西的话,绿宝石就写在第一个)
  • 玩家从村民那里得到的物品
  • 最大的交易次数
  • 村民每次交易能获得的经验
  • 玩家声誉值影响的折扣率

以此类推我们就能写其他的交易了

然后我们就可以启动游戏进行测试了