本帖最后由 yuxuanchiadm 于 2013-2-13 04:40 编辑

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

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

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

序:
在上一章里,我们已经学会了如何制作一个MOD的配置文件,是时候做一个功能强大的MOD了把 : )。现在,我将要手把手教你做一个有一定内容的MOD。

添加一个新的物品:
(这次的教程我准备讲解一个名为刷怪笼手工艺的MOD,当然这是我自己的MOD :D,顺便把这MOD做成联机的,一举两得:D,此MOD的老版本下载地址:http://www.mcbbs.net/thread-37772-1-1.html
首先,我们需要做一个镐子,来采集传说中的刷怪笼 :D
新建一个包:myFirstMod.Item
新建一个类,命名为ItemSpawnerPickaxe,继承自ItemPickaxe,
然后写入如下代码:
  1. package myFirstMod.Item;

  2. import net.minecraft.block.Block;
  3. import net.minecraft.entity.EntityLiving;
  4. import net.minecraft.entity.item.EntityItem;
  5. import net.minecraft.item.EnumToolMaterial;
  6. import net.minecraft.item.ItemPickaxe;
  7. import net.minecraft.item.ItemStack;
  8. import net.minecraft.world.World;
  9. public class ItemSpawnerPickaxe extends ItemPickaxe
  10. {
  11.     //构造函数(参数1:物品ID)
  12.     public ItemSpawnerPickaxe(int par1)
  13.     {
  14.         super(par1, EnumToolMaterial.EMERALD);
  15.         this.setItemName("SpawnerPickaxe");
  16.     }
  17.     //破坏方块时调用(参数1:玩家拿着的物品栈(此物品的物品栈),参数2:方块世界,参数3:方块ID,参数4-6:方块坐标,参数7:使方块被摧毁的玩家)
  18.     public boolean onBlockDestroyed(ItemStack par1ItemStack, World par2World, int par3, int par4, int par5, int par6, EntityLiving par7EntityLiving)
  19.     {
  20.         //损伤这个物品
  21.         par1ItemStack.damageItem(1, par7EntityLiving);
  22.         //如果被破坏的方块等于刷怪笼
  23.         if(par3 == Block.mobSpawner.blockID)
  24.         {
  25.             //新建一个掉落的方块
  26.             EntityItem entityitem = new EntityItem(ModLoader.getMinecraftInstance().theWorld, (float)par4, (float)par5, (float)par6, new ItemStack(Block.mobSpawner.blockID,1,0));
  27.             //设置可拿起的间隔
  28.             entityitem.delayBeforeCanPickup = 10;
  29.             //抛出这个方块
  30.             ModLoader.getMinecraftInstance().theWorld.spawnEntityInWorld(entityitem);
  31.         }
  32.         return true;
  33.     }
  34. }
复制代码
现在,我们已经成功的创建了一把可以回收刷怪笼的稿子,别急着编译,先添加到MOD里:
首先,上次创建的配置文件管理类有用处了=w=,在mod_myFirstMod的字段区域添加:
  1. public static int ItemSpawnerPickaxeID;
复制代码
这个字段储存我们制作的稿子的ID。然后在preInit方法里添加:
  1. myFirstModConfig.InitliazeConfig(event.getSuggestedConfigurationFile());
  2. try
  3. {
  4.     ItemSpawnerPickaxeID = myFirstModConfig.GetItemID("ItemSpawnerPickaxe",12001);
  5. }
  6. catch(Exception error)
  7. {
  8.     System.out.println(error.getMessage());
  9.     System.out.println(error.getStackTrace());
  10. }
  11. myFirstModConfig.SaveConfig();
复制代码

现在,我们已经成功的获取到了镐子的ID,默认为12001,并且可以在配置文件修。
是时候了,编译此MOD,再运行一次游戏,你将在MCP62ForgeMod\jars\config下得到一个漂亮的配置文件LOL,虽然此MOD任然不能玩。

现在,我们需要把这个镐子添加进游戏里。

第一步:我们需要纹理

首先,复制这个图片:

到\mcp725ForgeMOD\src\minecraft\myFirstMod\sprites并命名为items.png。
打开此文件,用PS乱涂一番,保存为items.png,建议把.psd文件一起保存,方便日后修改,就得到了我们镐子的纹理:)。

(记得注意透明通道 :D)

第二步:纹理需预载入

还记得我们在第四章做的代理类么,现在派上用处了 :D
打开myFirstModProxyCommon类,添加:
  1. public void registerRenderers()
  2. {
  3.   
  4. }
复制代码
打开myFirstModProxyClient类,添加:
  1. public final static String ITEMS_PNG_PATH = "/myFirstMod/sprites/items.png";
  2. public void registerRenderers()
  3. {
  4.                     MinecraftForgeClient.preloadTexture(ITEMS_PNG_PATH);
  5. }
复制代码
第三步:给物品绑定纹理

打开ItemSpawnerPickaxe,在构造函数中添加代码:
  1. this.setTextureFile(myFirstModProxyClient.ITEMS_PNG_PATH);this.setIconIndex(0);
复制代码
第四步:注册物品到游戏中

在mod_myFirstMod中新建字段:
  1. public static Item SpawnerPickaxe;
复制代码
然后导入类:
  1. import net.minecraft.src.EnumToolMaterial;
  2. import net.minecraft.src.Item;
  3. import myFirstMod.Item.ItemSpawnerPickaxe;
复制代码
在load方法里添加:
  1. SpawnerPickaxe = new ItemSpawnerPickaxe(ItemSpawnerPickaxeID);
  2. ModLoader.addName(SpawnerPickaxe, "刷怪笼回收镐");
复制代码

这样,你就成功的把你的镐子添加进了游戏:),现在,再添加个合成公式:
  1. ModLoader.addRecipe(new ItemStack(SpawnerPickaxe,1), new Object[]
  2. {
  3.     "###"," * "," * ",Character.valueOf('#'),Item.redstone,Character.valueOf('*'),Item.stick
  4. });
复制代码

现在,编辑并测试的的MOD,尝试合成一个镐子,如果你能够合成,就说明你成功了!


(好吧,代码编辑功能极度不好用,空格键差点被我敲坏)