自定义交易 1.21 Fabric
本篇教程的视频
本篇教程的源代码
Github地址:TutorialMod-Trade-1.21
介绍
在我们的游戏中,也许我们需要一些特殊的物品,但这些物品获取起来可能没有那么容易,这时候我们可以通过交易
的方式来获得这些物品
本篇教程采用Fabric
的API
来实现与村民的自定义交易,因为原版的交易是硬编码的,我们如果要修改必须得使用Mixin。相比较而言,使用Fabric
的API
来实现自定义交易会更加方便
查看源代码
我们来查看TradeOffers
这个类,这个类是定义了原版的交易
1 | public static final Map<VillagerProfession, Int2ObjectMap<TradeOffers.Factory[]>> PROFESSION_TO_LEVELED_TRADE = Util.make( |
这里我们看其中的一部分,它是直接定义了Map<VillagerProfession, Int2ObjectMap<TradeOffers.Factory[]>>
这个类型的变量,这个Map
存储的是村民职业对应的交易内容
我们可以看到,这里的交易内容是直接硬编码的,我们如果要修改这个Map
,肯定是得使用Mixin
观察XXXFactory
方法
上面我们看到了各种各样的交易内容,这些交易内容都是通过XXXFactory
方法来创建的,我们来看看这些方法
1 | TradeOffers.BuyItemFactory(Items.WHEAT, 20, 16, 2) |
这个是玩家向村民出售物品的交易,即玩家出售物品,村民给玩家绿宝石
这里的参数分别是物品
、交易数量
、最大交易次数
、村民获得经验值
和价格
其中价格是绿宝石的数量,可以缺省
,缺省的话就是默认的1
个
1 | TradeOffers.SellItemFactory(Items.BREAD, 1, 6, 16, 1) |
这个是玩家购买物品的交易,即玩家购买物品,村民给玩家物品
这里的参数分别是物品
、交易数量
、价格
、最大交易次数
、村民获得经验值
和打折乘数
其中打折乘数是可以缺省
的,缺省的话就是默认的0.05F
1 | TradeOffers.SellSuspiciousStewFactory(StatusEffects.NIGHT_VISION, 100, 15) |
这个是玩家购买谜之炖菜
的交易
这里的参数分别是效果
、效果的持续时间
和村民获得的经验
1 | TradeOffers.ProcessItemFactory(Blocks.GRAVEL, 10, 1, Items.FLINT, 10, 12, 1, 0.05F) |
这个也是是玩家购买物品的交易,不过在购买的时候要提供绿宝石和特定的物品,村民给玩家物品
这里的参数分别是玩家给出的物品
、物品数量
、价格
、村民给出的物品
、物品数量
、最大交易次数
、村民获得经验值
和打折乘数
其实很多交易的参数都是类似的,这里我们只是列举了一些常见的交易,里面还有很多其他的交易,具体的可以查看源代码
创建交易
那么我们就来开始自定义自己的交易吧
创建ModCustomTrades类
1 | public class ModCustomTrades { |
首先我们创建一个ModCustomTrades
类,这个类用来存放我们自定义的交易
1 | public static void registerModCustomTrades() { |
我们创建一个registerModCustomTrades
方法,这个是用于之后初始化的
在这个方法中,我们使用TradeOfferHelper.registerVillagerOffers
来注册我们的交易
这个是Fabric
的API
提供的,我们可以直接使用
里面的参数是职业
、村民等级
和交易内容
在此之后我们用factories.add
新增交易内容,这里我们新增了两个交易,一个是玩家出售玉米
,一个是玩家购买玉米种子
我们可以直接使用原版的方法来创建交易
1 | TradeOfferHelper.registerVillagerOffers(VillagerProfession.FARMER, 2, factories -> { |
我们再新增一个交易,这个交易是玩家购买草莓
和奶酪
,其中购买奶酪的时候需要提供牛奶桶
(只是这个会有一个bug,桶也会被消耗)
另外在1.20的教程中,我们还编写了图书管理员
的新增交易,写了个特定附魔书,但在1.21中,变得没那么方便了
因为在1.21中,附魔大改,变成数据驱动的了,所有的附魔的注册名和等级得从注册表中获取
1 | TradeOfferHelper.registerVillagerOffers(VillagerProfession.LIBRARIAN,1, |
这是1.20中图书管理员的交易的内容
但在1.21中,EnchantmentLevelEntry
的第一个参数要求的是RegistryEntry<Enchantment>
,而不是Enchantment
,我们得先获取注册表才能来写这个东西
初始化交易方法
1 | ModCustomTrades.registerModCustomTrades(); |
到模组主类中,我们在onInitialize
方法中调用ModCustomTrades.registerModCustomTrades()
来初始化我们的交易
在此之后我们就可以进入我们的游戏测试了,可以找个村庄也可以自己生成一个村民来测试我们的交易