跳转至

工具与防具材质

在前两个章节中我们学习了如何创建一个工具、武器以及一套盔甲,但是我们都接触到了一个概念:材质。这个章节我们将要学习如何创建一个我们自己的材质。

章节相关源码

思考:如何注册材质

我们在工具与武器章节中已经观察过 ToolMaterial 了,相信读者在编写盔甲时也应该已经观察过 ArmorMaterial 了。
细心的读者应该会发现,这些材质类都采用了枚举 enum 的方式创建。如果读者对 Java 有一定了解,那么应该知道 enum 是一个外部不可拓展的的特殊类型。
那我们应该如何注册它?答案是 反射

这是一种肮脏的概念,不过很幸运,Forge 已经为我们提供了工具,因此读者不会被复杂的底层概念与学习反射必备的知识吓跑。如果读者已经准备好起身逃跑——别忙,回来,坐下来。

注入或修改 enum 通常不是一个好主意,这可能会导致较多问题。但 1.7.10 开发本身就是一件相对肮脏的体验,因此希望读者没有字节码洁癖。好吧,我们有些跑题了,总之先来看看这个特殊的类:EnumHelper

EnumHelper.class
private static Class[][] commonTypes =
{
    {EnumAction.class},
    {ArmorMaterial.class, int.class, int[].class, int.class},
    {EnumArt.class, String.class, int.class, int.class, int.class, int.class},
    {EnumCreatureAttribute.class},
    {EnumCreatureType.class, Class.class, int.class, Material.class, boolean.class, boolean.class},
    {Door.class},
    {EnumEnchantmentType.class},
    {EnumEntitySize.class},
    {Sensitivity.class},
    {MovingObjectType.class},
    {EnumSkyBlock.class, int.class},
    {EnumStatus.class},
    {ToolMaterial.class, int.class, int.class, float.class, float.class, int.class},
    {EnumRarity.class, EnumChatFormatting.class, String.class}
};

commonTypes 中的全部列出的枚举类都是我们将可以增加注册的部分。可以看到,我们可以增加注册 ArmorMaterialToolMaterial

注册一个材质

我们一开始创建了一个物品,但是还没有任何用处。或许读者有很多想法,但我得坦白:我其实没想过那个物品要做什么。那么我就称它为废料吧!(当然,我也不知道为什么)
既然我们得到了废料,干脆就为我们的工具注册一个废料材质吧:

IniteMetarial.java
public class InitMaterials {
    public static final Item.ToolMaterial TOOL_SCRAP = EnumHelper.addToolMaterial("scrap", 2, 150, 4.0F, 2.0F, 18);

    public static final ItemArmor.ArmorMaterial ARMOR_SCRAP = EnumHelper.addArmorMaterial("scrap", 13, new int[]{ 2, 5, 4, 2 }, 18);
}

这样,我们就算是完成注册了一套材质,现在我们可以用于我们刚注册过的工具与盔甲了!

由于工具与盔甲的材质并没有注册时机上的限制,因此可以不用写到主类呼叫——只需要直接调用即可!