Minecraft拥有双客户端/服务端的结构,具体来说,就是:
和 Java 中 AWT 和 Swing 类似,Minecraft 中的行为也是事件驱动的,我们需要为事件挂载事件监听器,当相应事件触发时,对应的监听器中的代码就会执行。
Mod开发中有两大类事件:
FML事件(FML 生命周期)
主要分为 preinit,init 和 postinit 等,顾名思义,就是加载 Mod 的三个阶段,通常来讲,preinit 阶段进行物品、方块等的注册,init 阶段进行合成表的注册,postinit 进行 Mod 之间的关联处理。
Forge事件
Forge 事件需要挂载到事件总线上,主要有:
挂载方法:
EventListener 类
@SubscribeEvent
public static void onSomeEventHappened(AEvent event) {
// 当然这个 AEvent 要换成某个存在的事件。
}
// 注册
MinecraftForge.EVENT_BUS.register(EventListener.class);
或者
@SubscribeEvent
public void onSomeEventHappened(AEvent event) {
// 当然这个 AEvent 要换成某个存在的事件。
}
// 注册
MinecraftForge.EVENT_BUS.register(new EventListener());
有没有感觉很熟悉呢?
public void actionPerformed(ActionEvent e){
// TODO
}
new JButton().addActionListener(this);
个人认为,Minecraft Forge 的事件系统就可以类比 AWT/Swing 里的监听器来理解。
其中,注解 @SubscribeEvent
表明下面的方法是一个事件监听器,也就是说监听器方法的名字不是固定的,监听的事件由参数指定。
此外,也可以这么写,用于将事件直接注册到 EVENT_BUS 上:
// 这个注解的意思是“将这个类注册到事件总线中去,该事件监听器属于 mymod 这个 Mod”
// 它相当于 MinecraftForge.EVENT_BUS.register(MyEventListener.class)
@Mod.EventBusSubscriber(modid = "mymod")
public final class MyEventListener {
@SubscribeEvent
public static void onEventFired(ACertainEvent event) {
}
}
moonfan.mymod
复制以下代码,包名和modid自行修改。
MyMod.java
@Mod(modid = MyMod.MODID, name = MyMod.NAME, version = MyMod.VERSION, acceptedMinecraftVersions = "1.12.2")
public class MyMod {
public static final String MODID = "mymod";
public static final String NAME = "My Mod";
public static final String VERSION = "1.0.0";
@Mod.Instance(MyMod.MODID)
public static MyMod instance;
@SidedProxy(clientSide = "moonfan.mymod.client.ClientProxy",
serverSide = "moonfan.mymod.common.CommonProxy")
public static CommonProxy proxy;
@Mod.EventHandler
public void preInit(FMLPreInitializationEvent event) {
proxy.preInit(event);
}
@Mod.EventHandler
public void init(FMLInitializationEvent event) {
proxy.init(event);
}
@Mod.EventHandler
public void postInit(FMLPostInitializationEvent event) {
proxy.postInit(event);
}
}
新建 moonfan.mymod.common.CommonProxy
和 moonfan.mymod.client.ClientProxy
类,且ClientProxy继承自CommonProxy:
CommonProxy.java
public class CommonProxy {
@Mod.EventHandler
public void preInit(FMLPreInitializationEvent event) {
// TODO
}
@Mod.EventHandler
public void init(FMLInitializationEvent event) {
// TODO
}
@Mod.EventHandler
public void postInit(FMLPostInitializationEvent event) {
// TODO
}
}
ClientProxy.java
public class ClientProxy extends CommonProxy {
@Override
public void preInit(FMLPreInitializationEvent event) {
super.preInit(event);
}
@Override
public void init(FMLInitializationEvent event) {
super.init(event);
}
@Override
public void postInit(FMLPostInitializationEvent event) {
super.postInit(event);
}
}
这样,Mod的基本框架完成了。
Minecraft 1.12.2 Mod开发笔记——基础概念
原文:https://www.cnblogs.com/moonfan/p/12267772.html