本帖最后由 1137246733 于 2015-8-16 20:18 编辑

Minecraft MOD制作:从入门到精通
The Dummy's Guide to Modding - From Setup to Advanced!




第四章:您等待已久的一章


我希望您能多加阅读一些Minecraft的代码,虽然对于一个java造诣不精人来说,代码有可能显得凌乱,但是不要灰心丧气。


第一节:您的第一个方块


通过在net.minecraft.src包内右击任意文件,点击New ->Class。

将其命名为“mod_YOURMODNAME”,必须确保其以“mod_”开头,因为只有这样系统才会识别该文件为一个MOD并开始加载。无需在底部选择任何的选项,点击"Finish"完成创建。

此时您会看见一段预先写好的类代码。您的第一件事就是要扩展这个MOD使之成为一个基本类(BaseMod)。您可以通过添加“extends BaseMod”这样的代码完成类的声明,此时代码如下:

  1. package net.minecraft.src;

  2. public class mod_YourModName extends BaseMod {

  3. }
复制代码

当然,此时会在“mod_YOURMODNAME”处显示错误,此时将鼠标移至该错误处,在弹出的对话框中单击“Add unimplemented methods”。此时会在当前的基本类里添加两个类函数:“load”与“getVersion”。您可以删除掉“//TODO”这种行,在“getVersion”类函数中,您需要将null替换为”1.0“或者其他您喜欢的版本号。您需要保留引用,就如同需要返回一个字符串一样。此时的代码如下所示:


  1. package net.minecraft.src;

  2. public class mod_YourModName extends BaseMod {

  3.     @Override
  4.     public String getVersion() {
  5.         return "1.0";
  6.     }

  7.     @Override
  8.     public void load() {
  9.         
  10.     }

  11. }
复制代码

现在您终于可以开始创作您的第一份方块代码啦~

在类的顶端添加下列代码(在“{}”之内):

  1. public static Block yourFirstBlock = new BlockTutorial(blockID, 0).setHardness(2.5F).setStepSound(Block.soundWoodFootstep).setBlockName("blockName");
复制代码

其中:

名称
含义
public 表示所有类均可以访问。
static
表示在类内不创建一个新的实例的条件下即可访问(详情请查阅java教程)
Block 该变量引用“Block.java”
yourfirstBLock 变量名,叫什么都行
= new BlockTutorial 此时在BlockTutorial类中创建了一个新的实例,由于我们之前没有声明,因此会出错。您可以将其改为任何您喜欢的名字,只要之后的名字与其相同就可以了。
(blockID, 0)  
您所传递给BlockTutorial类的信息,就是方块ID。您可以在这里将其替换成您所希望的任何数值。特别提醒您,在最新版本的Forge中,可以自动调整您的方块ID,并将其设置到137到4096中的一个未使用过的数值。您可以在这里查看您的MOD与MOD的兼容性。之后的0稍后会为您详细阐述,现在暂且放过它。
.setHardness(2.5F) 设置该方块的硬度为2.5,您可以随意调整。
.setStepSound(Block.soundWoodFootstep)   
走在上面的声音,如果您喜欢的话,也可以将“soundWoodFootstep”改成“soundClothFootstep”或者任何你喜欢的声音。
.setBlockName("blockName"); 这个变量无关紧要,只是要保证每个的名字不同就可以了。

现在您已经掌握了如何新建一个BlockTutorial类了,当然有可能在之前您就把这个名字改掉了……

现在我们要扩展方块,我们首先需要执行ITextureProvider,当您将如下代码复制进其中时,可以使鼠标悬停在ITextureProvider处并单击导入(import)。

  1. public class BlockTutorial extends Block implements ITextureProvider {
复制代码

现在我们需要为我们之前跳过的那部分创建一个构造函数(可以在java教程中获得更为详实的信息)。

  1. public BlockTutorial(int i, int j)
  2. {
  3.     super(i, j, Material.wood);
  4. }
复制代码

名称
含义
BlockTutorial 由于是构造函数,此处需与类的名字相同。
(int i, int j) 我们在之前使用(blockID, 0)的声明。更为详细的来说,表示该构造函数使用两个整数变量并将其命名为i和j。
super
表示需要使用超类来传递方块信息,这也是问什么我们扩展这个类的缘故。可能难以理解但是请参阅java教程o(∩_∩)o~~
(i, j, Material.wood); 这是由我们的MOD类中继承的将要传给方块的参数,我们同时也传递了Material.wood是因为我希望这个方块在被镐敲击时可以更为容易地被破坏。

好,现在您即将进行的步骤是添加一个Forge的类函数以便我们可以为这个方块设置材质

  1. public String getTextureFile()
  2. {
  3.     return "/Mic'sMods/CrossbowMod/gui/Crossbow.png";
  4. }
复制代码

切记:不要更改类函数的第一行!乱修改可能覆盖或者替换类函数。

这是一个用于十字弓MOD的例子,其中的材质存储在minecraft.jar的相应位置中。您可以很轻松地修改您所使用的材质,但是如果指向一个空位置则无法进行加载。当然也要保证是双引号~

最后还需要一个Forge的类函数将该方块添加至创造模式的物品栏中。

  1. public void addCreativeItems(ArrayList itemList)
  2. {
  3. if(blockID == mod_ YourModName. yourFirstBlock.blockID)
  4.             {
  5.                     itemList.add(new ItemStack(this));
  6.             }
  7. }
复制代码

当鼠标悬停至ArrayList时可以导入。

最后一个类函数可能有些复杂……

名称
含义
void 表示该函数没有返回值
addCreativeItems(ArrayList itemList) 类函数和构造函数的名字。不要进行修改,否则会覆盖Forge的类函数。
if(
根据真假不同返回值也不同,如果不懂请多看看教程
blockID == mod_ YourModName. yourFirstBlock.blockID 逻辑表达式,如果该方块的方块ID与您创建的方块的方块ID则继续
itemList.add(new ItemStack(this));
在创造模式中可以创建和堆叠这一方块,这条语句不懂亦无妨。

之后,我们在load()类函数中添加如下语句

  1. ModLoader.registerBlock(yourFirstBlock);
  2. ModLoader.addName(yourFirstBlock, "Woohoo! My first Block :D");
复制代码

其中:

名称
含义
ModLoader.registerBlock 您所调用的类函数
(yourFirstBlock) 您所使用的方块,确保之前声明过。
ModLoader.addName 调用另一个类函数,用于添加名字
(yourFirstBlock, "Woohoo! My first Block :D"); 这里是为您的方块实例赋予名字的地方,您可以在这里写“红石灯(Redstone Lamp)”,“楼主我要整合包~(LouzhuWoyaoZhengheBao)”等等。

现在要做一件最为重要的事请:
在Eclipse中单击Run运行Minecraft,进入创造模式,去寻找您的方块吧!

您已经为Minecraft制作了一个属于您的MOD,不再是MOD制作小白痴了!无论这个MOD多么粗糙和简陋,但都是您在MOD制作大师之路的一个见证!希望当您在成为大师之时蓦然回首还能记得您的第一份作品,无论如何,恭喜您!!!