FML与Forge的由来
在很久很久以前(一个可以追溯到Minecraft刚刚发布的年代),人们就开始为Minecraft制作和使用Mod了。那个时候,由于Mod的制作方式是直接通过底层对Minecraft修改,所以将两个Minecraft Mod进行整合几乎是一件不可能的事情。
随后,Minecraft MCP(Minecraft Mod Coder Pack)的诞生,让Mod的制作和整合变得容易。这是因为Minecraft被进行了混淆化,这件事使得原本好看好记的诸如Item这样的类名、方法名、变量名等,通通被混淆化成了alq这样难以阅读和辨认的符号。Minecraft MCP的意义,就是对其进行反混淆,把alq这样的类名用一个诸如Item的名称代替。这使得人们可以通过更改MCP提供的源代码来进行Mod制作。但是,若是想合并两个Mod,必须要把两个Mod的源代码一行一行地进行整合。
直到2010年年底,一个叫作ModLoader的Mod横空出世,这使得Mod的开发方式产生了跨时代性的变化。ModLoader提供了一个框架和一套API,玩家通过这个框架可以很方便地管理Mod,开发者通过这一套API可以完成很多任务,如添加新方块、添加新物品,等等。
从2010年圣诞节前夕,Minecraft Beta版本发布开始,直到2011年年底Minecraft正式版发布,这一段时间被称为Minecraft Mod的“黄金时期”。很多著名的Mod如RailCraft,IndustrialCraft,BuildCraft等,都是这一时期开始开发的。但是,这段时期的Mod开发仍然问题重重。比如BuildCraft和IndistrialCraft就不能共存。他们更改了太多底层的东西。
这些Mod的开发者们看到Mod的整合仍旧困难,他们便发起了一项新的计划,这个计划就是Minecraft Forge。随着Minecraft正式版的发布和“黄金时期”的终结,很多Minecraft Forge的开发者,渐渐不再参与Minecraft Forge的开发。然而随着Mod数量的爆炸式增加,以LexManos和Cpw等为首的开发人员仍然坚持着Minecraft Forge的开发,并加入了很多崭新的特性。他们甚至将ModLoader这个框架整合进了Minecraft Forge,也就是Forge Mod Loader,简称FML。直到今天,Minecraft Forge和通过Minecraft Forge开发的难以计数的Mods,仍在发展壮大。
阅读本教程需要什么
Java等程序设计基础知识
本教程不针对Java初学者,本教程假定读者已经对Java的基础知识有了一定深入的了解。换言之,本教程假设读者已经对下面这些Java概念进行了深入地了解:
- 对象
- 类、属性和方法
- 变量、运算符和表达式
- 条件和循环
- 包、继承、多态和接口
- 泛型
- 容器
- 异常
下面这些Java概念虽然对Mod开发比较重要,但是读者在阅读之前不需要掌握或者只有阅读本教程更深入的部分才需要掌握,如果教程的某一部分认为读者不需要掌握,教程会在用到的时候会加以简要的介绍,如果需要,教程会提醒读者阅读相关的资料:
- 注解
- 数字和字符串的操作
- 输入输出流
- 多线程和同步
- 反射
- 中立字节码
下面这些Java概念和本Mod开发教程无关,虽然这些概念在其他Java应用中比较重要,但在本教程中不会用到。当然,了解这些知识对Mod开发是有一定帮助的:
- 正则表达式
- 图形界面
- 网络
- 数据库
- ...
这里推荐一本书《Head First Java, 2nd Edition》,这本书的中文版适用于没有任何编程基础的读者。如果看完了这本书的前十一章,对于阅读本教程的Java基础知识就已经足够了。
如果想深入学习的话,推荐《Effective Java (2nd Edition)》和《The Java Language Specification (3rd Edition)》两本书。
相对而言,作者会保证教程使用的代码可以在Java6下运行,尽量减少使用一些令人迷惑的特性,并尽可能保证除了Forge/FML之外,不使用其他的第三方库。
除了Java知识之外,了解一些游戏开发的知识,如OpenGL等等,对阅读本教程有一些帮助,但对于阅读本教程没有专门学习的必要,除非作者在某些地方特定指出了对该知识的需要。
对Minecraft游戏的大致了解
本教程假设读者在阅读本教程前,已经对Minecraft这款游戏有了一些了解,包括Minecraft中一些现象的运作机制,一些小技巧等有了一些了解。作者也相信对本教程感兴趣的读者已经做到了这一点。
Java开发环境
为实践本教程的内容,读者可能需要一台安装有JDK7或JDK8或其他JDK版本的,可以保证流畅运行Minecraft的电脑。别忘了这里修改的是游戏(本人旧电脑的流畅度就很难满足这一条件= =)。
开发Mod最为推荐的JDK版本是JDK8,当然,使用特性相对较少的JDK7开发也是可以的。对于JDK6而言,虽然Minecraft 1.8.9可以在Java6上运行,但是JDK6相对而言太过陈旧了,所以并不推荐。对于JDK9及更高版本来说,由于Forge不准备对Minecraft 1.12.2及更低版本提供针对Java9及更高版本的支持,因此请不要尝试使用JDK9及更高版本编写Mod。
为了方便开发,你需要一个用于Java开发的IDE(Integrated Development Environment,集成开发环境),如Eclipse、IntelliJIDEA、Netbeans等,这里推荐Eclipse和IntelliJIDEA,本教程作者使用的IDE是IntelliJIDEA。
一定程度的不借助JavaDoc的源代码分析能力
Minecraft作为一个商业软件,每一次次版本号更新对于Mod界都是一次灾难,直到现在,仍然有很多优秀的Mod卡在Minecraft1.6.4、Minecraft1.7.10等旧版本。因此,这要求开发者拥有不借助JavaDoc,通过MCP提供的名称进行的源代码分析能力。当然,如果读者怀疑自己没有这方面的能力,那也没有关系,因为我相信通过本教程的学习,读者会慢慢掌握不借助JavaDoc分析源代码的能力的。
对Mod开发的热情、缜密的思维、以及一个足够大而又能正常运作的脑洞
这条很重要!!!
本教程为读者提供什么
针对Minecraft 1.8.9版本并基于Forge的Mod开发教程
本教程主要面向的Minecraft版本为1.8.9,本教程也会兼顾到对于Minecraft 1.9、1.9.4、1.10等更高版本对应的Forge的支持。
本教程不讨论1.8、1.7.10及之前的如1.7.2、1.6.4等Minecraft版本,虽然较1.8.9早期的版本的Mod开发和1.8.9的有着很多相通之处,本教程的很多地方也可能会对这些版本的Mod开发提供帮助,但本教程不去探究这些差别。
本教程不讨论基于ModLoader、Liteloader等其他Mod API的开发,以及基于CraftBukkit、Spigot等插件的开发,等等。
虽然本教程的每一句都经过了作者的推敲,但是由于大意疏忽等原因,可能无法发现一些错误,恳情读者斧正。
源代码
对于教程中的所有源代码实现,本教程会尽可能地保证在Minecraft 1.8.9版本、和给定Forge版本下的服务端和客户端下成功运行。本教程也会考虑到诸如Minecraft 1.9.4、1.10.2、1.11.2等更高的Minecraft版本对应的Forge版本,并尽可能使相同的代码在高版本的Forge里正常工作,但不作保证。
对于教程中出现的源代码,读者可能需要加上一些import等辅助语句以使其正常工作。对于教程附带的源代码,本教程已经在Minecraft 1.8.9版本、和给定Forge版本,也就是11.15.1.2318下的客户端和服务端进行了测试。
本教程的所有源代码虽然进行了充分的测试,但是由于作者水平有限,可能无法发现一些错误,恳情读者指出。
工作环境的准备
从Forge官网下载ForgeMdk,并尽可能采用稳定版本(作者采用的是11.15.1.2318版本),本教程的所有开发操作都基于此。
接下来对于工作环境的配置,教程会在下一部分进行讲解,如果读者希望升级自己的开发环境中Forge的版本,可以参阅附录。