本帖最后由 szszss 于 2012-4-13 20:15 编辑

MCPMod制作教程(2)
建立一个使用ModLoaderMod
作者:szszss

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


我决定以一个开发实例作为教程,我们要使用ModLoader来创建一个叫做Diraconmod,它将具有如下功能.
(1)一个新的矿物(砖块):Diracium
(2)一个新的矿锭(物品):Diracium Ingot
(3)一个新的物品:Dirac Wand
(4)一种新的Mob:Dirac Pig
(5)添加新的功能,使Dirac Wand具有瞬间转移箱子内的物品的能力
(6)修改地形生成器,使新矿物可以生成
(7)一个以土块为燃料的新炉子Unthinkable Furnace

7个功能基本涵盖了基础mod开发的全部,我计划分为三个部分,(1)(2)(3)作为第一部分,(4)(5)作为第二部分,(6)(7)mod的编译发布作为第三部分.

这里说明一下本教程中不同颜色的字体所代表的含义.
蓝色:一个章节
红色:知识点,相当于一个章节所讲内容的提炼
灰色:原理,想深入学习MCP的人可以读读,普通MODer可以无视了.

注:本文最初基于MCP5.6和ModLoader1.1.0编写的.
MCP6.2和ModLoader1.2.4更新了大量方法的名字,导致我的教程几乎报废一半...
不管怎么说,我用了一个晚上的时间还是修正了教程的文字部分,使其和最新版的MCP与ModLoader接轨.但图片部分我实在是无力修改了...大家将就着看吧.



使用ModLoader建立一个新Mod

首先你要在net.minecraft.src包内创建一个新的类(Class,假设你已经有基本的Java知识了,如果没有请自行学习...)文件.右键net.minecraft.src,选择New - Class.
之后要设定类的名字,Java的开发规范是类的首字母大写,MCP的开发规范是首字母小写,我们采用MCP的规范,将类命名为mod_Diracon


知识点:mod主类的命名
使用ModLoadermod必须有一个叫做mod_XXX(XXXmod)的类文件,并且与ModLoader类放在同一目录

点击Finish开始创建,创建完后我们便有了一个空荡荡的文件,我们要让它与ModLoader建立链接,方法是让mod_Diracon继承BaseMod.
public class mod_Diracon后面({的前面)输入extends BaseMod

输入完之后静等2,你的Eclipse就开始报错了...因为你继承了BaseMod,但没有重写(Override)BaseMod内的两个抽象(Abstract)方法.
解决的办法是在mod_Diracon类内加入这两个方法.

  1. public String getVersion()
  2. {
  3.      return "1.0.0";
  4. }
  5. public void load()
  6. {

  7. }
复制代码

之后你的程序应该是这个样子



知识点:继承BaseMod后必要的2个重写
getVersion和load是2个抽象功能,必须被mod文件重写,getVersion是在ModLoader查询版本时反馈版本号,MCP官方推荐的格式是"主版本号.副版本号.工程版本号"(1.1.5)
loadmod在载入时会执行的方法,它具有相当于构造函数的功能.

连接官方的Javadoc
注:在MCP6.1以后,MCP会自动在本地代码上加上注释,所以这一步不重要了.你完全可以跳过这一步.
MCP6.0,MCP组提供了一套Javadoc.可以理解为对代码的注释手册.
要在Eclipse中建立同在线Javadoc的链接,首先右键项目,选择Properties,在新弹出的窗口的左侧列表中选择Javadoc Location,在文本框中输入:
之后点击Apply,然后点击OK.这样你就完成配置了.

关于本文术语的约定俗成

这个章节实际上是在我写完全部基础教程后才加上的,我在这里解释一下今后教程中将使用的术语.


从上往下看.
1:,所有的MC源代码都在同一个包内.
1:导入的库,有时我们需要导入Java自带的库.
绿1:,类的概念我实在难以解释,熟悉Java的人应该都知道吧...
1:继承,派生.正规的说法是一个基类派生出子类,子类继承自基类.然后我们并不在乎这上面的文字游戏,汉语本来就是个不规范的语言呢...我们说子类从基类派生而来,或子类继承自基类不也一样吗...所以本文不会太注重派生/继承的用词.但我保证会留下足够的逻辑线索让你一眼看出我所表达的意思.
1:基于XXX接口创建类.
2:类的空位,即方法与方法间的空位,如果我说"XX类中添加这些代码"就是指在这些位置添加代码.
2:构造函数.如果一个方法的名字和类相同,那么它就是构造函数.它会在类实例化时执行.
绿2:方法/函数,我习惯叫它方法.这个是最准确最规范的叫法.
2:返回值.
2:参数.

最后再向新手程序员解释一下何为重写,重写(Override)是让子类的方法覆盖父类的方法,重写的办法是让子类方法的名字和父类方法一致.唯一特例是构造函数,它的名字依然和子类名字保持一致,但必须调用父类的构造函数(使用super).

下一篇:创建新的砖块,物品和冶炼
http://www.mcbbs.net/thread-18940-1-1.html