本帖最后由 yuxuanchiadm 于 2013-7-26 09:22 编辑

利用Forge API开发联机MOD【基础篇】【第六章】
给你的MOD添加一个方块
作者:yuxuanchiadm

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

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

序:
在上一章里,我们学会了如何创建一个物品,并应用于游戏中。现在我们将创建一个高级刷怪笼方块的基本Block对象,使你可以设置刷怪笼所刷的怪物。

添加一个新方块:
首先,我们要想好这个方块所能实现的功能。
1.可以被任何镐子直接挖掉。
2.可以设置刷怪笼所刷的怪物。
3.可以设置刷怪笼刷怪的时间间隔。
下面,开始行动!
首先,添加一个可以合成普通刷怪笼的合成表:
  1. ModLoader.addRecipe(new ItemStack(Block.mobSpawner,1), new Object[]
  2. {
  3.     "###","#*#","###",Character.valueOf('#'),Item.ingotIron,Character.valueOf('*'),Item.redstone
  4. });
复制代码
然后,在myFirstMod下新建一个包Block,再新建一个类,命名为BlockAdvancedMobSpawner,并更改内容为:
  1. package myFirstMod.Block;import java.util.Random;import net.minecraft.block.BlockContainer;
  2. import net.minecraft.block.material.Material;
  3. import net.minecraft.entity.player.EntityPlayer;
  4. import net.minecraft.tileentity.TileEntity;
  5. import net.minecraft.world.World;public class BlockAdvancedMobSpawner extends BlockContainer
  6. {
  7.     // 构造函数
  8.     public BlockAdvancedMobSpawner(int par1)
  9.     {
  10.         super(par1, Material.rock);
  11.         this.setHardness(5.0F);
  12.         this.setStepSound(soundMetalFootstep);
  13.         this.setBlockName("Advanced Mob Spawner");
  14.     }
  15.     // TileEntity对象
  16.     public TileEntity createNewTileEntity(World var1)
  17.     {
  18.         return new TileEntityAdvancedMobSpawner();
  19.     }
  20.     // 掉落的物品ID
  21.     public int idDropped(int par1, Random par2Random, int par3)
  22.     {
  23.         return this.blockID;
  24.     }
  25.     // 不是不透明方块
  26.     public boolean isOpaqueCube()
  27.     {
  28.         return false;
  29.     }
  30.     // 玩家右击方块
  31.     public boolean onBlockActivated(World par1World, int par2, int par3, int par4, EntityPlayer par5EntityPlayer, int par6, float par7, float par8, float par9)
  32.     {
  33.         if (par5EntityPlayer.isSneaking())
  34.         {
  35.             if(par1World.isRemote)
  36.             {
  37.                 //如果蹲下但是客户端,也跳出,但返回true使其挥舞手臂
  38.                 return true;
  39.             }
  40.         }
  41.         else
  42.         {
  43.             //如果没有蹲下则跳出
  44.             return false;
  45.         }
  46.         // 以后会在这里添加代码
  47.         return true;
  48.     }
  49. }
复制代码
这里Eclipse会报错,因为没有定义TileEntityAdvancedMobSpawner类,我们将在稍后将其补全。

/**知识点:在Minecraft里用什么表示一个方块?
Minecraft里所有的方块都表示为继承自Block类的一个类,在Block类里,定义了许多有用的方法,这些方法会在玩家执行右击、破坏、左击......等动作时调用,以实现相应的处理,Minecraft的方块时一个接一个的储存在存档文件里的,在读取的时候顺序读取,存储在存档文件里面的一个方块只包含基础信息,不包含其方块的坐标,方块的坐标是在载入时根据先后顺序依次计算的。

**/
在mod_myFirstMod里添加字段:


  1. public static int BlockAdvancedMobSpawnerID;
  2. public static Block AdvancedMobSpawner;
复制代码

在preInit函数唯一一个try语句块中添加
  1. BlockAdvancedMobSpawnerID = myFirstModConfig.GetBlockID("BlockAdvancedMobSpawner", 300);
复制代码
复制一个刷怪笼的纹理图片到myFirstMod\sprites\blocks.png,用PS打开,并乱涂一番。
得到高级刷怪笼的纹理:)

在myFirstModProxyClient中注册(预载入)这个纹理:
添加字段:
  1. public final static String BLOCKS_PNG_PATH = "/myFirstMod/sprites/blocks.png";
复制代码
在registerRenderers方法中添加:
  1. MinecraftForgeClient.preloadTexture(BLOCKS_PNG_PATH);
复制代码
在BlockAdvancedMobSpawner中绑定这个纹理:
  1. this.blockIndexInTexture = 0;
  2. this.setTextureFile(myFirstModProxyClient.BLOCKS_PNG_PATH);
复制代码
然后在load函数添加:
  1. AdvancedMobSpawner = new BlockAdvancedMobSpawner(BlockAdvancedMobSpawnerID);
  2. ModLoader.registerBlock(AdvancedMobSpawner);
  3. ModLoader.addName(AdvancedMobSpawner, "高级刷怪笼");
复制代码

添加合成表:
  1. ModLoader.addRecipe(new ItemStack(AdvancedMobSpawner,1), new Object[]
  2. {
  3.     "###","#*#","###",Character.valueOf('#'),Item.diamond,Character.valueOf('*'),Block.mobSpawner
  4. });
复制代码

现在,你可以把这个方块的createNewTileEntity()函数改成(记得改回来):
  1. public TileEntity createNewTileEntity(World var1)
  2. {
  3.     return null;
  4. }
复制代码


并测试游戏,你可以用8个钻石和1个刷怪笼得到一个类似刷怪笼的玩意(伪·钻石氪金刷怪笼),但是这玩意丝毫没有用处,在下一章里,我将教你如何让这玩意起作用。

总结:
在这一章里,我们学会了如何创建一个基本的方块,在下一章里,我们会让这个方块能够像刷怪笼一样刷各种生物。