本帖最后由 yuxuanchiadm 于 2013-5-30 03:45 编辑

利用Forge API开发联机MOD【基础篇】【第二章】
制作你的第一个基础MOD
作者:yuxuanchiadm

索引贴地址:http://www.mcbbs.net/thread-38211-1-1.html

请确定你已经阅读完成第一章的内容:
http://www.mcbbs.net/thread-38223-1-1.html
否则不要阅读此贴!

序:
(警告:前方高能量反应,非战斗人员请迅速撤离!)
在上一章里,你已经学会如何构建一个开发环境,以及成功构建了一个。现在,是时候制作你的第一个MOD了 :D。
首先,说明一下我写帖子的格式:
红色:章节和重要内容。
蓝色:知识点
灰色:作者的唠叨和闲话(可忽略)
绿色:容易出错的地方

使用Forge制作你的第一个小MOD:
现在,是时候制作你的第一个利用Forge API制作的MOD了,为自己欢呼吧:)。
首先找到Eclipse下的MinecraftForgeClient项目。
打开资源文件夹minecraft,你以后几乎所有的工作都要在此包下进行(不要在net.minecraft包下做任何事情,醒目)

/**知识点:什么是包
如果你不知道什么是包,那么我真的没办法相信你会JAVA,当然我也佩服你的勇气,一直学到这里,只不过此贴并非零基础教学贴,是给能掌握JAVA语法的人的入门贴。JAVA的包和文件夹是紧密相连的,在WINDOWS下,项目文件夹下,一个文件夹就代表一个包,例如你可以在\MCPForgeMod\src\minecraft下找到一些包。
**/
右击这个资源文件夹选择:新建->包

打开如下界面:

在名称那一栏的后面加包:myFirstMod,输入后应该是这个样子:myFirstMod。
点击完成按钮,在顶级包下创建你的MOD包myFirstMod。
在资源文件夹找到这个包并右键选择:新建->类:

打开新建JAVA类后,修改名称为mod_myFirstMod,点击完成:

现在,看到你刚刚新建好的类,此时这个类应该在myFirstMod包中。
首先,用Annotation注解类型:Mod、NetworkMod修饰myFirstMod类。在public class mod_myFirstMod的前面添加:
  1. import cpw.mods.fml.common.Mod;import cpw.mods.fml.common.network.NetworkMod; @Mod( modid = "myFirstMod", name="myFirstMod", version="1.0.0")
  2. @NetworkMod(clientSideRequired = true, serverSideRequired = false, channels={"myFirstMod"}, packetHandler=PacketHandler.class)
复制代码
在这里一定要注意了,channels的长度必须小于或等于16,大于16则MOD无法运行,注意+醒目
另外,我们目前尚未定义PacketHandler.class类,所以会报错,先不要管他,就像自上而下的编程方法所说的那样,先做框架,再做细节。
/**知识点:什么是Annotation注解类型
注解类型在JAVA里通常用于编译时对编译器的提示,使编译器可以根据某个对象的注解,提出警告、抛出错误、忽略警告等,在JDK5或以上版本中,你可以自定义注解类型,Forge4.x后用注解类型来描述某些信息,具体使用方法可以参考JAVA提供的相关帮助文档,Annotation通常具有实质性作用,不可以随意删除、修改及添加

**/

然后,定义一个载入方法,并用@Init对其修饰,此方法会在MOD载入时调用。

  1. @Mod.Init
  2. public void load(FMLInitializationEvent evt)
  3. {
  4.     System.out.println("我的第一个MOD");
  5. }
复制代码
/**知识点:既然需要用Init注解类型修饰,方法名称必须是load么?
方法名称不一定要是load。但是,这是提倡的,如果你用其他名字,其他开发此MOD的人员可能不会理解你的用意(如果有的话)。只要使用Init注解类型对其进行了修饰。

**/

这时,Eclipse会报错,是使用了未导入的类导致的,使用Eclipse自动修复这些错误。
以此类推,再分别添加MOD载入前和载入后调用的函数:

  1. @Mod.PreInit
  2. public void preInit(FMLPreInitializationEvent event)
  3. {
  4.    
  5. }
  6. @Mod.PostInit
  7. public void postInit(FMLPostInitializationEvent event)
  8. {
  9.    
  10. }
复制代码
/**知识点:3个MOD载入时调用的函数的参数是什么?
分别是3个Event(事件),这是Forge的新功能,这些事件中含有有用的信息,你可以在3个事件的类源码中了解有神马用处,此内容较为高级,暂时不做细节介绍
**/

最后,代码应该是这个样子:
  1. package myFirstMod; import cpw.mods.fml.common.Mod;
  2. import cpw.mods.fml.common.event.FMLInitializationEvent;
  3. import cpw.mods.fml.common.event.FMLPostInitializationEvent;
  4. import cpw.mods.fml.common.event.FMLPreInitializationEvent;
  5. import cpw.mods.fml.common.network.NetworkMod; @Mod( modid = "myFirstMod", name="myFirstMod", version="1.0.0")
  6. @NetworkMod(clientSideRequired = true, serverSideRequired = false, channels={"myFirstMod"}, packetHandler=PacketHandler.class)
  7. public class mod_myFirstMod
  8. {
  9.     @Mod.Init
  10.     public void load(FMLInitializationEvent evt)
  11.     {
  12.         System.out.println("我的第一个MOD");
  13.     }
  14.     @Mod.PreInit
  15.     public void preInit(FMLPreInitializationEvent event)
  16.     {
  17.         
  18.     }
  19.     @Mod.PostInit
  20.     public void postInit(FMLPostInitializationEvent event)
  21.     {
  22.         
  23.     }
  24. }
复制代码
蛋疼的代码编辑 : (
运行你的第一个MOD:
按下Ctrl+S保存,现在测试你的第一个MOD吧!(大雾 :D)

如果你此时想要运行这个MOD是绝对不可能的,别忘了PacketHandler类还没定义呢。而且在这一章里就弄PacketHandler过早,所以现在有个临时解决方案:

替换:
  1. @NetworkMod(clientSideRequired = true, serverSideRequired = false, channels={"myFirstMod"}, packetHandler=PacketHandler.class)
复制代码
为:
  1. @NetworkMod(clientSideRequired = true, serverSideRequired = false)
复制代码

OK,现在不会报错了,但是记住,我们删除了PacketHandler和channel,记得测试完要还原

按下Ctrl+S保存。

1.首先打开recompile.bat批处理文件,并等待编译完成。然后打开startclient.bat批处理文件,启动游戏LOL。(普通青年)
2.轻轻点击你的F11键,选择JAVA应用程序,然后选择Start类。(文艺青年)
3.猛击你的reobfuscate.bat批处理文件,等运行完成后,打开"mcp725ForgeMOD\reobf"文件夹,把所有文件打包成ZIP,丢进一个装了Forge的客户端,开始游戏(2B青年)
4.以上方法全做一遍(火星人泥嚎)

你可以再控制台看到类似“我的第一个MOD”的字样,进入游戏后,点击MODS按钮,你可以看到你的MOD正在运行:)

这虽然看起来毫无用处,但是这是你的第一个MOD,恭喜你已经学会了制作ForgeMOD的第一步 :D!

总结:
恭喜你已经学会了制作ForgeMOD的最基础的知识,而且做出了第一个MOD :D!