Minecraft Mod中的第一个物品

Minecraft Mod中的第一个物品

上文中,我们把Mod开发环境架设好了,然后今天继续翻官方Doc,官方说:

游戏分为客户端和服务端,两端的代码可能不一样需要分开写,建议创建一个接口 IProxy 并在 Client 和 Server 下采用不同的实现

好的,按照官方的建议,我创建了一个IProxy接口:

[IProxy.java]

import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPostInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;

public interface IProxy
{
    void preInit(FMLPreInitializationEvent event);
    void init(FMLInitializationEvent event);
    void postInit(FMLPostInitializationEvent event);
}

好的,然后创建两个类,ClientProxy 和 ServerProxy ,分别实现该接口。现在我们已经按照官方的建议创建了代理,然后呢?当然就是在我们最开始创建的第一个类中,根据不同端把初始化事件转发到不同的代理当中。在FML中为我们提供了自动的代理选择注解:

@SidedProxy(clientSide = "com.boom.shaka.laka.ClientProxy", 
            serverSide = "com.boom.shaka.laka.ServerProxy")
public static IProxy proxy;

好了,有了代理,把初始化事件转发过去就好了。

好的,进入今天的正题,为了创建第一个Item做了那么多没用的工作(想一想还是有用的,不这样到时候写Mod会被服务端和客户端的差异烦死)

根据官方的Doc,注册Item需要用到下面的代码:

@SubscribeEvent
public void registerBlocks(RegistryEvent.Register<Item> event) 
{
    event.getRegistry().registerAll(item1, item2, ...);
}

然后看到这里使用到了Item这个类型,再次查阅文档,再加上自己的尝试,写出了一个测试Item:

[TestItem.java]

import net.minecraft.item.Item;

public class TestItem extends Item
{
    public TestItem()
    {
        super();
        this.
            setRegistryName("Test").
            setUnlocalizedName("testItem");
    }
}

这里呢,有一点需要注意setRegistryName(string)是必须的操作,不然注册的时候会报错。

到这里,我们所需要的一切都有了,然而运行时我却没有发现那激动人心的新Item,再次查阅资料,发现所有事件处理器(Event Handler)都是需要注册到主 EventBus 上边的,具体注册代码如下:

MinecraftForge.EVENT_BUS.register(yourEventHandler);

好了,这回运行时果然看到了我的新Item~

*★,°*:.☆( ̄▽ ̄)/$:*.°★* 。

文章最后附上本次的Java源码: MyFirstMCItem.zip (下载37)

GM2000

    评论已关闭。