所以,我试图让一个 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 文档中找到,该文档可在此处找到。