## 概述
本部分以制作一个和黑曜石镐为例,讲述如何做出一个新的工具或武器,如斧、镐、铲、以及锄和剑。
## 物品和ToolMaterial
在包`net.xiaobang.bm.item`下新建一个文件`ItemObsidianPickaxe.java`,并让`ItemObsidianPickaxe`类继承`ItemPickaxe`类:
**`src/main/java/net/xiaobang/bm/item/ItemObsidianPickaxe.java`**
~~~
package net.xiaobang.bm.item;
import net.xiaobang.bm.creativetab.CreativeTabsLoader;
import net.minecraft.item.Item;
import net.minecraft.item.ItemPickaxe;
import net.minecraftforge.common.util.EnumHelper;
public class ItemObsidianPickaxe extends ItemPickaxe
{
public static final Item.ToolMaterial OBSIDIAN = EnumHelper.addToolMaterial("OBSIDIAN", 3, 2061, 18.0F, 2.0F, 10);
public ItemObsidianPickaxe()
{
super(OBSIDIAN);
this.setUnlocalizedName("obsidianPickaxe");
this.setCreativeTab(CreativeTabsLoader.tabBm);
this.setTextureName("bm:obsidianPickaxe");
}
}
~~~
先来说说这一行:
`public static final Item.ToolMaterial OBSIDIAN = EnumHelper.addToolMaterial("OBSIDIAN", 3, 2061, 18.0F, 2.0F, 10);`
这里添加了一个作为工具需要的枚举类,ToolMaterial的实例。顾名思义,ToolMaterial就是工具或武器使用的材料,Forge本身定义了五种材料:WOOD,STONE,IRON,EMERALD,GOLD。它们分别表示木头、石头、铁、钻石、金。
我们来看看ToolMaterial的构造方法:
~~~
private ToolMaterial(int harvestLevel, int maxUses, float efficiency, float damageVsEntity, int enchantability) {...}
~~~
和五种材料的参数:
* WOOD(0, 59, 2.0F, 0.0F, 15),
* STONE(1, 131, 4.0F, 1.0F, 5),
* IRON(2, 250, 6.0F, 2.0F, 14),
* EMERALD(3, 1561, 8.0F, 3.0F, 10),
* GOLD(0, 32, 12.0F, 0.0F, 22);
ToolMaterial的构造方法共有五个参数:
* `harvestLevel`参数表示制作出的工具等级。这一点在镐中尤其明显,如木头为0,只能挖掘对应等级为0的方块才能掉落物品,如石头等,而钻石为3,就可以挖掘出对应等级为3的,其他镐挖不出物品的方块,如黑曜石。这里使用了最高等级3
* `maxUses`参数表示制作出的工具对应耐久。如钻石工具就是1561,耐久最高,而木工具为59,耐久最低。这里刻意提高了该数值,为2061
* `efficiency`参数表示制作出的工具使用效率。使用效率和该参数的值成正比。这里刻意提高了该数值,为18.0F
* `damageVsEntity`参数表示攻击伤害力度。同样该力度和该参数的值成正相关。这里为2.0F,表示攻击力很低
* `enchantability`参数与附魔等级相关。Minecraft中关于附魔等级的系统十分复杂。但是有一点,就是该值越高,对应的附魔就越容易得到高等级。这也是为何金更容易得到高等级附魔,而石头得到的附魔就相当低。这里为10,和钻石相同
`EnumHelper`的作用就是为Minecraft的一些枚举类型注册新的实例,该方法的第一个参数为实例的名称,后面的参数就是该枚举类型构造方法需要的参数。比如这里就是向ToolMaterial枚举类型添加一个名为`REDSTONE`的实例,并提供相应的参数。
## 材质
(你可以看到就只是钻石镐调了色=_=||):
**`src/main/resources/assets/fmltutor/textures/items/obsidianPickaxe.png`**
![](https://i.vgy.me/QCAbvv.png)
## 一些事情
语言文件和在`GameRegistry`中注册(这里需要稍微注意一下的可能是`ToolMaterial`和物品的先后注册顺序):
**`src/main/resources/assets/bm/lang/en_US.lang`(部分)**
`item.obsidianPickaxe.name=Obsidian Pickaxe`
**`src/main/resources/assets/bm/lang/zh_CN.lang.lang`(部分)**
`item.obsidianPickaxe.name=黑曜石镐`
**`src/main/java/net/xiaobang/bm/loader/ItemLoader.java`(部分)**
~~~
public static ItemDiamondStick ds = new ItemDiamondStick();
public static ItemObsidianPickaxe op = new ItemObsidianPickaxe();
public ItemLoader(FMLPreInitializationEvent event)
{
register(ds, "diamondStick");
register(op,"obsidianPickaxe");
}
~~~
当然最后,也可以加入进合成表里面:
**`src/main/java/net/xiaobang/bm/crafting/CraftingLoader.java`(部分)**
~~~
GameRegistry.addShapedRecipe(new ItemStack(ItemLoader.op), new Object[]
{
"###", " * ", " * ", '#', Blocks.obsidian '*', Items.stick
});
~~~
打开游戏试试吧~
当然,其他需要ToolMaterial的工具,如斧、铲、锄与剑,它们的制作,都是同样的道理。