注册ItemBlock的更好方法比我在这里拥有的更好



所以,我试图让一个 ItemBlock 在注册时与我的块一起注册。到目前为止,我已经想出了这个。有没有更好的方法可以做到这一点? 我对registerBlock()里面的itemBlock.setRegistryName部分不太满意!

public class ModBlocks {
    public static Block tinBlock;
    public static void init(){
        tinBlock = new BlockTinBlock("tin_block", "tin_block");
    }
    public static void register(){
        registerBlock(tinBlock);
    }
    public static void registerRenders(){
        registerRender(tinBlock);
    }
    public static void registerBlock(Block block){
        GameRegistry.register(block);
        ItemBlock itemBlock = new ItemBlock(block);
        itemBlock.setRegistryName(Reference.MODID, block.getUnlocalizedName().substring(5));
        GameRegistry.register(itemBlock);
    }
    public static void registerRender(Block block){
        ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(block), 0, new ModelResourceLocation(new ResourceLocation(Reference.MODID, block.getUnlocalizedName().substring(5)), "inventory"));
    }
}

我偶然发现了 2 天前在MinecraftForge论坛上发布给我的链接。这种注册项目和块的方法是最新的,并使用RegistryEvents!看一看,并考虑切换!

[MinecraftForge] 1.11.2 - 以這種方式使用 RegistryEvent 可以嗎?

你正在做的差不多了,但是对于块、项目和模型等的注册,你应该使用相应的事件:
为此,您需要一个事件侦听器来侦听事件。
事件侦听器是一个函数,它将 Event 作为参数,并被批注@SubscribeEvent它们可以位于您的 @Mod 类中或在课堂上带注释@Mod.EventBusSubscriber(modid = "yourmodid")

要在单独的类中注册块、项目和模型,您可以编写如下内容:

@Mod.EventBusSubscriber(modid = "yourmodid")
public class Registration{
    @SubscribeEvent
    public static void registerBlocks(RegistryEvent.Register<Block> event) {
        IForgeRegistry registry = event.getRegistry();
        //register blocks here using registry
    }
    @SubscribeEvent
    public static void registerItems(RegistryEvent.Register<Item> event) {
        //register items here like we did with the blocks
    }
    @SideOnly(Side.CLIENT)
    @SubscribeEvent
    public static void initModels(ModelRegistryEvent event) {
        //register models here
    }
}

有关此主题的更多信息可以在官方 Minecraft Forge 文档中找到,该文档可在此处找到。

最新更新