You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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. 注册你的自定义方块和物品

接下来,把你的BufferBlockBufferItem注册到对应的延迟注册器中:

// 在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

火山引擎 最新活动