Minecraft 修改块构造器错误

Posted

技术标签:

【中文标题】Minecraft 修改块构造器错误【英文标题】:Minecraft modding block constructer error 【发布时间】:2016-02-22 04:13:45 【问题描述】:

我正在制作一个模组,但我遇到了一个错误(不是废话),我已经尝试搜索它,但我想要一个针对我的问题的答案,因为我不太擅长这个。我的块类中出现此错误。

默认构造函数的隐式超级构造函数 Block() 未定义。必须定义显式构造函数

我不知道如何解决它。请帮助它的一个项目。

块类:

package GDMCrocknrollkid.fandomcraft;

import net.minecraft.block.Block;
import net.minecraft.block.material.Material;

public class BlockCbBlock extends Block 

protected BlockCbBlock(Material material) 
    super(material);



模组类:

    package GDMCrocknrollkid.fandomcraft;

    import net.minecraft.block.Block;
    import net.minecraft.item.Item;
    import cpw.mods.fml.common.Mod;
    import cpw.mods.fml.common.Mod.EventHandler;
    import cpw.mods.fml.common.event.FMLInitializationEvent;
    import cpw.mods.fml.common.event.FMLPostInitializationEvent;
    import cpw.mods.fml.common.event.FMLPreInitializationEvent;
    import cpw.mods.fml.common.registry.GameRegistry;

    @Mod(modid = "fc", name = "Fandomcraft", version = "1.0")
    public class fandomcraft 

    public static Item itemCbIngot;
    public static Block blockCbBlock;

    @EventHandler
    public void preInit(FMLPreInitializationEvent event)
        //Item/Block initialization and registering
        //Config Handling
        itemCbIngot = new ItemCbIngot().setUnlocalizedName("ItemCbIngot").setTextureName("fc:itemCbIngot"); //item.itemCbIngot.name
        blockCbBlock = new BlockCbBlock(Material.iron);




        GameRegistry.registerItem(itemCbIngot, itemCbIngot.getUnlocalizedName().substring(5));
    

    @EventHandler
    public void init(FMLInitializationEvent event)
        //Proxy, TileEntity, entity, GUI and Packet Registering
    

    @EventHandler
    public void postInit(FMLPostInitializationEvent event) 

    

【问题讨论】:

【参考方案1】:

此错误与所有 java 相关,而不仅仅是 minecraft forge。检查this 以获得更多参考。此错误有几个可能的原因。很可能是 1,但 2 和 3 可能是导致错误的一个因素。

    1234563 987654323@ 类使用默认构造函数,那么您不能在争论上调用 super(),因为 Block 类使用没有参数的构造函数。因此,如果您想修改 Block 构造函数,在 BlockCbBlock 类本身内部创建自定义构造函数会更安全、更容易。

    您正在尝试继承Block 的构造函数,但您已将其声明为受保护,此时您的类中的构造函数应为public 以匹配继承的.

    如果您使用的是 Eclipse,当您的项目设置不正确(系统配置不匹配)时,它可能会出现此错误

    可能与此特定错误没有直接关系,但在不久的将来可能会导致其他错误;您正在使用注解 @EventHandler,但您实际上并未声明伪造事件处理程序。

    由于某种原因,您实际上并未注册该块。即使您将块用作配方项目,您仍然需要注册它

要解决潜在的问题 1、2 和 4,试试这个(从here 获得):

package GDMCrocknrollkid.fandomcraft;

import net.minecraft.block.Block;
import net.minecraft.block.material.Material;

private final String name = "BlockCbBlock";
public class BlockCbBlock extends Block 
    public BlockCbBlock() 
        super(Material.iron);
        GameRegistry.registerBlock(this, name);
        setUnlocalizedName(Reference.MODID + "_" + name);
        setCreativeTab(CreativeTabs.tabBlock);
    
    public String getName() 
        return name;
    

这样,您将提前声明其UnlocalizedNameMaterialCreativeTab。这种方法可能是不必要的,但它是一个很好的预防措施,可以帮助防止错误。现在,您所要做的就是像这样声明它:

//You need to make your own EventHandler class. Search online for that.
FCEventHandler handler = new FCEventHandler();
@EventHandler
public void preInit(FMLPreInitializationEvent event)
    //Config Handling
    //event handler registry
    FMLCommonHandler.instance().bus().register(handler);
    MinecraftForge.EVENT_BUS.register(handler);
    //the same thing can be similarly done with this if you wish    
    itemCbIngot = new ItemCbIngot().setUnlocalizedName("ItemCbIngot").setTextureName("fc:itemCbIngot"); 
    blockCbBlock = new BlockCbBlock();
    GameRegistry.registerItem(itemCbIngot, itemCbIngot.getUnlocalizedName().substring(5));

【讨论】:

#4 不适用。 @EventHandler 注释是 Forge 的一部分。 import cpw.mods.fml.common.Mod.EventHandler 并表示 Forge Mod 生命周期事件,即 FMLPreInitializationEventFMLInitializationEventFMLPostInitializationEvent,并在任何带有 @Mod 注释的类中搜索

以上是关于Minecraft 修改块构造器错误的主要内容,如果未能解决你的问题,请参考以下文章

修改Minecraft mod中的.class文件

Minecraft Forge 项目块渲染问题

从编程的角度来看,Minecraft 是怎么样设计的

Minecraft NBTEDIT 实体数据修改器

Minecraft Fabric Client 教程 #2 修改文件和目录名添加run和stop

[导入类Java问题Minecraft插件