概述

本部分以制作一个红石镐为例,讲述如何做出一个新的工具或武器,如斧、镐、铲、以及锄和剑。

物品和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的,其他镐挖不出物品的方块,如黑曜石。这里使用了最高等级3
  • maxUses参数表示制作出的工具对应耐久。如钻石工具就是1561,耐久最高,而木工具为59,耐久最低。这里刻意降低了该数值,为16
  • efficiency参数表示制作出的工具使用效率。使用效率和该参数的值成正比。这里刻意提高了该数值,为16.0F
  • damageVsEntity参数表示攻击伤害力度。同样该力度和该参数的值成正相关。这里为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:

redstone_pickaxe

一些例行公事

语言文件和在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的工具,如斧、铲、锄与剑,它们的制作,都是同样的道理。

results matching ""

    No results matching ""