Minecraft 1.18.2 Forge模组开发报错:找不到合适的Block构造方法
解决Minecraft 1.18.2 Forge模组中Block构造器报错问题
错误根源
你遇到的java: no suitable constructor found for Block(net.minecraft.world.level.block.state.BlockBehaviour.Properties)错误,核心原因有两个:
- 导入了错误的
Block类:当前代码中导入的是org.openjdk.nashorn.internal.ir.Block(JDK内部Nashorn脚本引擎的类),而非Minecraft官方的方块类net.minecraft.world.level.block.Block,后者才支持接收BlockBehaviour.Properties参数的构造器。 DeferredRegister初始化代码错误:将ForgeRegistries.BLOCKS强转为ResourceLocation是完全错误的,ForgeRegistries.BLOCKS本身就是方块注册表的实例,无需类型转换。
修复步骤
1. 修正导入语句
删除错误的导入:
import org.openjdk.nashorn.internal.ir.Block;
添加正确的Minecraft方块类导入:
import net.minecraft.world.level.block.Block;
2. 修正DeferredRegister初始化
将BLOCKS的初始化代码从:
private static final DeferredRegister<Block> BLOCKS = DeferredRegister.create((ResourceLocation) ForgeRegistries.BLOCKS, "factorytechv0_1");
改为:
private static final DeferredRegister<Block> BLOCKS = DeferredRegister.create(ForgeRegistries.BLOCKS, "factorytechv0_1");
修正后的完整Registration类代码
package com.example.factorytechv0_1.startup; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.Item; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockBehaviour; import net.minecraft.world.level.material.Material; import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import net.minecraftforge.registries.DeferredRegister; import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.registries.RegistryObject; public class Registration { private static final DeferredRegister<Block> BLOCKS = DeferredRegister.create(ForgeRegistries.BLOCKS, "factorytechv0_1"); private static final DeferredRegister<Item> ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, "factorytechv0_1"); public static void init() { IEventBus bus = FMLJavaModLoadingContext.get().getModEventBus(); BLOCKS.register(bus); ITEMS.register(bus); } public static final BlockBehaviour.Properties ORE_PROPERTIES = BlockBehaviour.Properties.of(Material.STONE).strength(2f); public static final Item.Properties ITEM_PROPERTIES = new Item.Properties().tab(ModSetup.ITEM_GROUP); public static final RegistryObject<Block> CHROME_ORE_OVERWORLD = BLOCKS.register("chrome_ore_overworld", () -> new Block(ORE_PROPERTIES)); public static final RegistryObject<Item> CHROME_ORE_OVERWORLD_ITEM = fromBlock(CHROME_ORE_OVERWORLD); public static final RegistryObject<Block> CHROME_ORE_DEEPSLATE = BLOCKS.register("chrome_ore_deepslate", () -> new Block(ORE_PROPERTIES)); public static final RegistryObject<Item> CHROME_ORE_DEEPSLATE_ITEM = fromBlock(CHROME_ORE_DEEPSLATE); public static final RegistryObject<Block> HAFNIUM_ORE_NETHER = BLOCKS.register("hafnium_ore_nether", () -> new Block(ORE_PROPERTIES)); public static final RegistryObject<Item> HAFNIUM_ORE_NETHER_ITEM = fromBlock(HAFNIUM_ORE_NETHER); public static final RegistryObject<Block> TECHNETIUM_ORE_END = BLOCKS.register("technetium_ore_end", () -> new Block(ORE_PROPERTIES)); public static final RegistryObject<Item> TECHNETIUM_ORE_END_ITEM = fromBlock(TECHNETIUM_ORE_END); public static <B extends Block> RegistryObject<Item> fromBlock(RegistryObject<B> block) { return ITEMS.register(block.getId().getPath(), () -> new BlockItem(block.get(), ITEM_PROPERTIES)); } }
补充:ModSetup类示例(若未创建)
如果你的ModSetup类还未实现,需要确保ITEM_GROUP正确定义,否则ITEM_PROPERTIES的tab()调用会报错,以下是简单实现:
package com.example.factorytechv0_1.startup; import net.minecraft.world.item.CreativeModeTab; import net.minecraft.world.item.ItemStack; public class ModSetup { public static final CreativeModeTab ITEM_GROUP = new CreativeModeTab("factorytech_tab") { @Override public ItemStack makeIcon() { // 用模组中的某个物品作为创造标签图标,示例使用铬矿石物品 return new ItemStack(Registration.CHROME_ORE_OVERWORLD_ITEM.get()); } }; }
内容的提问来源于stack exchange,提问作者x_Kronos
相关产品推荐
相关产品推荐

