Minecraft自定义方块模组注册报错:GameRegistry无对应注册方法
解决GameRegistry.registerBlock/registerItem方法未定义的问题
看起来你在Minecraft Forge模组开发中碰到了注册系统的版本兼容坑——这俩方法在新版本的Forge里已经被彻底移除了,取而代之的是更规范的**延迟注册(Deferred Register)**机制。我给你一步步讲怎么修复:
为什么会报错?
在Minecraft 1.13+的Forge版本中,GameRegistry类的registerBlock()和registerItem()方法已经被废弃并移除。Forge官方现在推荐用延迟注册来管理所有游戏内容的注册,这种方式不仅更高效,还能避免加载顺序相关的各种问题。
具体修复步骤
1. 创建延迟注册实例
首先,在你的模组代码里(可以是主类,也可以单独写一个专门的注册类),定义方块和物品的延迟注册器:
import net.minecraft.block.Block; import net.minecraft.item.Item; import net.minecraftforge.fml.RegistryObject; import net.minecraftforge.registries.DeferredRegister; import net.minecraftforge.registries.ForgeRegistries; public class ModRegistries { // 替换成你的模组ID,这里是"immersivesignals" private static final String MOD_ID = "immersivesignals"; // 方块注册表的延迟注册实例 public static final DeferredRegister<Block> BLOCKS = DeferredRegister.create(ForgeRegistries.BLOCKS, MOD_ID); // 物品注册表的延迟注册实例 public static final DeferredRegister<Item> ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, MOD_ID); }
2. 注册你的自定义方块和物品
接下来,把你的BufferBlock和BufferItem注册到对应的延迟注册器中:
// 在ModRegistries类里添加 // 注册BufferBlock,"buffer_block"是这个方块的注册表名称(会影响游戏内的ID) public static final RegistryObject<Block> BUFFER_BLOCK = BLOCKS.register("buffer_block", BufferBlock::new); // 注册对应的BufferItem,如果你的BufferItem继承自BlockItem,可以这么写 // 这里的CreativeModeTab可以根据你的模组需求调整 public static final RegistryObject<Item> BUFFER_ITEM = ITEMS.register("buffer_block", () -> new BufferItem(BUFFER_BLOCK.get(), new Item.Properties().tab(CreativeModeTab.TAB_REDSTONE)));
如果你的BufferItem是完全自定义的物品类(不是绑定方块的BlockItem),只需要按照自己的构造方法传入参数即可。
3. 将延迟注册器绑定到模组事件总线
最后,在你的模组主类(带有@Mod注解的类)的构造方法里,把延迟注册器注册到Forge的模组事件总线上:
import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; @Mod("immersivesignals") public class ImmersiveSignals { public ImmersiveSignals() { // 注册方块和物品的延迟注册器 ModRegistries.BLOCKS.register(FMLJavaModLoadingContext.get().getModEventBus()); ModRegistries.ITEMS.register(FMLJavaModLoadingContext.get().getModEventBus()); } }
额外注意事项
- 如果你还在使用1.12或更早的Forge版本,那
GameRegistry的方法是可用的,但要确保导入的是net.minecraftforge.fml.common.registry.GameRegistry类,不过还是强烈建议升级到新的注册方式,因为旧API已经被官方淘汰了。 - 确保你的模组ID在所有地方都保持一致,不要出现拼写错误,这是很多新手容易踩的坑。
内容的提问来源于stack exchange,提问作者Kaleb M C Ryan




