概述
本部分以制作一个红石镐为例,讲述如何做出一个新的工具或武器,如斧、镐、铲、以及锄和剑。
物品和ToolMaterial
在包com.github.ustc_zzzz.fmltutor.item
下新建一个文件ItemRedstonePickaxe.java
,并让ItemRedstonePickaxe
类继承ItemPickaxe
类:
src/main/java/com/github/ustc_zzzz/fmltutor/item/ItemRedstonePickaxe.java:
package com.github.ustc_zzzz.fmltutor.item;
import com.github.ustc_zzzz.fmltutor.creativetab.CreativeTabsLoader;
import net.minecraft.item.Item;
import net.minecraft.item.ItemPickaxe;
import net.minecraftforge.common.util.EnumHelper;
public class ItemRedstonePickaxe extends ItemPickaxe
{
public static final Item.ToolMaterial REDSTONE = EnumHelper.addToolMaterial("REDSTONE", 3, 16, 16.0F, 0.0F, 10);
public ItemRedstonePickaxe()
{
super(REDSTONE);
this.setUnlocalizedName("redstonePickaxe");
this.setCreativeTab(CreativeTabsLoader.tabFMLTutor);
}
}
我们先来说说这一行:
src/main/java/com/github/ustc_zzzz/fmltutor/item/ItemRedstonePickaxe.java(部分):
public static final Item.ToolMaterial REDSTONE = EnumHelper.addToolMaterial("REDSTONE", 3, 16, 16.0F, 0.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的,其他镐挖不出物品的方块,如黑曜石。这里使用了最高等级3maxUses
参数表示制作出的工具对应耐久。如钻石工具就是1561,耐久最高,而木工具为59,耐久最低。这里刻意降低了该数值,为16efficiency
参数表示制作出的工具使用效率。使用效率和该参数的值成正比。这里刻意提高了该数值,为16.0FdamageVsEntity
参数表示攻击伤害力度。同样该力度和该参数的值成正相关。这里为0.0F,表示攻击力很低enchantability
参数与附魔等级相关。Minecraft中关于附魔等级的系统十分复杂。但是有一点,就是该值越高,对应的附魔就越容易得到高等级。这也是为何金更容易得到高等级附魔,而石头得到的附魔就相当低。这里为10,和钻石相同
EnumHelper
的作用就是为Minecraft的一些枚举类型注册新的实例,该方法的第一个参数为实例的名称,后面的参数就是该枚举类型构造方法需要的参数。比如这里就是向ToolMaterial枚举类型添加一个名为REDSTONE
的实例,并提供相应的参数。
物品模型和材质
该物品的模型:
src/main/resources/assets/fmltutor/models/item/redstone_pickaxe.json:
{
"parent": "builtin/generated",
"textures": {
"layer0": "fmltutor:items/redstone_pickaxe"
},
"display": {
"thirdperson": {
"rotation": [ 0, 90, -35 ],
"translation": [ 0, 1.25, -3.5 ],
"scale": [ 0.85, 0.85, 0.85 ]
},
"firstperson": {
"rotation": [ 0, -135, 25 ],
"translation": [ 0, 4, 2 ],
"scale": [ 1.7, 1.7, 1.7 ]
}
}
}
和对应的材质(然而大家可以明显地看出这只是钻石镐的调色=_=||):
src/main/resources/assets/fmltutor/textures/items/redstone_pickaxe.png:
一些例行公事
语言文件和在GameRegistry
中注册(这里需要稍微注意一下的可能是ToolMaterial
和物品的先后注册顺序):
src/main/resources/assets/fmltutor/lang/en_US.lang(部分):
item.redstonePickaxe.name=Redstone Pickaxe
src/main/resources/assets/fmltutor/lang/zh_CN.lang(部分):
item.redstonePickaxe.name=红石镐
src/main/java/com/github/ustc_zzzz/fmltutor/item/ItemLoader.java(部分):
public static Item goldenEgg = new ItemGoldenEgg();
public static ItemPickaxe redstonePickaxe = new ItemRedstonePickaxe();
public ItemLoader(FMLPreInitializationEvent event)
{
register(goldenEgg, "golden_egg");
register(redstonePickaxe, "redstone_pickaxe");
}
@SideOnly(Side.CLIENT)
public static void registerRenders()
{
registerRender(goldenEgg);
registerRender(redstonePickaxe);
}
当然最后,我们也可以加上合成表:
src/main/java/com/github/ustc_zzzz/fmltutor/crafting/CraftingLoader.java(部分):
GameRegistry.addShapedRecipe(new ItemStack(ItemLoader.redstonePickaxe), new Object[]
{
"###", " * ", " * ", '#', Items.redstone, '*', Items.stick
});
打开游戏试试吧~
当然,其他需要ToolMaterial的工具,如斧、铲、锄与剑,它们的制作,都是同样的道理。