MCBBS Wiki欢迎您共同参与编辑!在参与编辑之前请先阅读Wiki方针

如果在编辑的过程中遇到了什么问题,可以去讨论板提问。

为了您能够无阻碍地参与编辑 未验证/绑定过邮箱的用户,请尽快绑定/验证

MCBBS Wiki GitHub群组已上线!

您可以在回声洞中发表吐槽!

服务器状态监控。点击进入

本站由MCBBS用户自行搭建,与MCBBS及东银河系漫游指南(北京)科技有限公司没有从属关系。点此了解 MCBBS Wiki 不是什么>>

用户:MashKJo/1.12.2模组开发笔记/IRecipe接口详解:修订间差异

跳到导航 跳到搜索
 
(未显示同一用户的8个中间版本)
第7行: 第7行:
== IRecipe接口中的方法 ==
== IRecipe接口中的方法 ==
=== boolean matches(InventoryCrafting inv, World worldIn) ===
=== boolean matches(InventoryCrafting inv, World worldIn) ===
这个方法用于判断合成原料是否“匹配上了”——换言之,就是判断玩家放入合成界面的ItemStack及它们的摆放方式是否可以合成一个新ItemStack。例如,在原版的有序合成定义的逻辑中,木棍上面放煤炭或木炭,就是“匹配上了”——这样摆放就可以合成火把。但是,如果在把木棍换成木板——那不好意思,匹配不上,那就合成不了任何东西。
这个方法用于判断合成原料是否“匹配上了”——换言之,就是判断玩家放入合成界面的ItemStack及它们的摆放方式是否可以合成一个新ItemStack。例如,在原版的有序合成定义的逻辑中,木棍上面放煤炭或木炭,就是“匹配上了”——这样摆放就可以合成火把。但是,如果在把木棍换成木板——那不好意思,匹配不上,那就合成不了任何东西<ref>严格来说火把的配方是以.json文件的形式呈现的——这一点相信读者们都知道,而原版的有序合成的相关代码只是读取.json文件中的内容,并反序列化为一个IRecipe,这里这么说只是方便读者理解。</ref>。


这个方法传入了两个参数:第一个是InventoryCrafting类型的,你可以把这个类理解为“合成容器”,原版MC中合成容器有两种:一是工作台中3×3大小的合成容器,二是玩家背包里的2×2大小的合成容器;你可以从该参数中拿到合成容器的长、宽,以及该容器中放入的ItemStack。第二个参数是World类型的,代表玩家当前所处的world实例,这没什么好说的。
这个方法传入了两个参数:第一个是InventoryCrafting类型的,你可以把这个类理解为“合成容器”,原版MC中合成容器有两种:一是工作台中3×3大小的合成容器,二是玩家背包里的2×2大小的合成容器;你可以从该参数中拿到合成容器的长、宽,以及该容器中放入的ItemStack。第二个参数是World类型的,代表玩家当前所处的world实例,这没什么好说的。
第20行: 第20行:
这个方法用于获取合成配方的输出(outputs)——同样是一个ItemStack对象。
这个方法用于获取合成配方的输出(outputs)——同样是一个ItemStack对象。


同时我们注意到这个方法传入的参数只有一个<code>InventoryCrafting inv</code>。我们得再通过和上一部分相同的方法把合成容器中的ItemStack信息转移到一个集合中——这里算是MC一个小小的设计失误之处吧。
同时我们注意到这个方法传入的参数只有一个<code>InventoryCrafting inv</code>。我们得再通过和上一部分相同的方法把合成容器中的ItemStack信息转移到一个集合中——这里算是MC一个小小的设计失误之处吧。或者你也可以写一个private方法,以把从InventoryCrafting对象中提取ItemStack信息并存储到集合中的代码封装起来,以便多次调用。


=== boolean canFit(int width, int height) ===
=== boolean canFit(int width, int height) ===
第38行: 第38行:


=== default NonNullList<Ingredient> getIngredients() ===
=== default NonNullList<Ingredient> getIngredients() ===
Ingredient类其实和ItemStack类很相似,甚至它的构造器就接受一个ItemStack对象,只是该类封装了一些和合成有关的东西。
该方法的默认实现为返回一个元素为<code>Ingredient.EMPTY</code>的NonNullList——说是“NonNullList”,其实只是其中的值不为null,但代表的含义还是“没有物品”。


=== default boolean isDynamic() ===
=== default boolean isDynamic() ===
默认实现为<code>return false;</code>。
该方法意为“合成表是否为动态的”,那当然要返回<code>return true;</code>了,如果不是动态的,又何必重新实现IRecipe接口呢?写个.json文件不就得了。


=== default String getGroup() ===
=== default String getGroup() ===
该方法用于获取配方所在的“组别”,什么叫“配方所在的组别”?以.json文件形式添加的配方中,有这么一个“group”键,值的格式为“modid:examplegroup”。该方法的返回值的作用就类似于这个键值对。如果你没什么特别的需求,这个方法就可以不Override了。
== 注册IRecipe ==
是的,IRecipe需要注册——而且走的是Forge的注册表系统。因此:
public class MyCustomRecipe implements IRecipe
{
    private ResourceLocation regName;
   
    ...
   
    @Override
    public IRecipe setRegistryName(ResourceLocation name)
    {
        this.regName = name;
        return this;
    }
   
    @Override
    public ResourceLocation getRegistryName()
    {
        return this.regName;
    }
   
    ...
}


== 实战:自己实现IRecipe接口 ==
@Mod.EventBusSubscriber(modid = [Your MODID])
public class RecipeLoader
{
    @SubscribeEvent
    public static void register(RegistryEvent.Register<IRecipe> event)
    {
        event.getRegistry().register([Your IRecipe Instance].setRegistryName(new ResourceLocation(...)));
    }
}


== 注释与外部链接 ==
== 注释与外部链接 ==
行政员、​优秀编辑者、​界面管理员、​监督员、​管理员、​小部件编辑者
3,417

个编辑

我们提供服务需要使用Cookie。您使用我们的服务,即表示您同意我们使用Cookie。

导航菜单