本篇教程的视频

本篇教程的源代码

GitHub地址:TutorialMod-1.20.1-Forge-PickaxeAxeItem

注册物品类

通过上一期的工具教程,大家应该对工具有了一定的理解

那么,本期教程我们来制作一个组合型的工具,我们来制作一个斧头 + 镐子的组合型工具,让它既有镐子的功能又有斧头的功能

那么首先,我们需要新建一个物品类,PickaxeAxeItem,然后让它继承AxeItem,并创建相应的构造函数

1
2
3
4
5
6
public class PickaxeAxeItem extends AxeItem {

public PickaxeAxeItem(Tier pTier, float pAttackDamageModifier, float pAttackSpeedModifier, Properties pProperties) {
super(pTier, pAttackDamageModifier, pAttackSpeedModifier, pProperties);
}
}

可能有的同学会一上来就选择直接继承Item类,但不妨多想一想,斧头本身有哪些功能?

斧头不仅可以砍树挖木头对吧?它还有给原木去皮、给生锈或上蜡的铜块抛光或者去蜡

而斧头的这部分逻辑,是Item类本身没有的,它是在AxeItem类里面编写的(当然这里另外说一句,Forge这里对原版的源代码进行了特化处理,感兴趣的同学可以去看看Forge这里的源码和Fabric那边的源码有什么不同)

所以如果我们直接继承Item类,那么这部分逻辑我们就得自己去写了,所以为了简化我们的逻辑,我们可以直接继承AxeItem

这里呢也就是告诉大家,有时候我们想实现某些物品、方块相应的功能时,不妨先想想有没有已经实现的相似功能的物品、方块,如果有,那么就可以拿过来借用一下,也可以简化代码

好,那么接下来我们需要重写一些方法,来实现我们的逻辑

1
2
3
4
5
6
7
8
9
@Override
public float getDestroySpeed(ItemStack pStack, BlockState pState) {
return pState.is(ModBlockTags.PICKAXE_AXE_MINEABLE) ? this.speed : 1.0F;
}

@Override
public boolean isCorrectToolForDrops(ItemStack stack, BlockState state) {
return state.is(ModBlockTags.PICKAXE_AXE_MINEABLE);
}

这里我们重写getDestroySpeedisCorrectToolForDrops方法,显而易见,一个方法是获取破坏方块时的速度,一个是判断它是否是该工具能够采集并掉落的方块

两个方法都是使用Tag来判断,原版也是利用Tag进行判断的,还记得我们在很早之前写战利品列表时写的Tag吗?

这里我们用到了自定义的Tag,待会到ModBlockTags里面注册我们的新标签,并在数据生成中写具体的内容

那么到这里为止,我们的物品类就写好了

方块标签注册

这里我们先把自定义的标签给注册了

1
public static final TagKey<Block> PICKAXE_AXE_MINEABLE = createForgeTag("tools/pickaxe_axe_mineable");

而后我们来注册物品

物品注册

1
2
public static final RegistryObject<Item> PICKAXE_AXE_ITEM = ITEMS.register("pickaxe_axe_item",
() -> new PickaxeAxeItem(ModToolTiers.FIRE_ETHER, 6.0F, -2.8F, new Item.Properties().fireResistant()));

注意注册物品时,使用的物品类是我们刚刚写的PickaxeAxeItem类,写法与工具类似,也要写它的攻击伤害和攻击速度,毕竟它本质还是工具

另外,在物品属性编写时,我们还加上了fireResistant方法,这个是让我们的物品掉落物具有抗火保护,掉火里或者岩浆里都不会被烧毁

原版只有下界合金类的工具有这个抗火保护

然后不要忘了将它添加到物品栏里

1
pOutput.accept(ModItems.PICKAXE_AXE_ITEM.get());

数据文件

那么最后就是一堆数据文件

方块标签

我们为新的自定义标签添加具体的方块

1
2
3
tag(ModBlockTags.PICKAXE_AXE_MINEABLE)
.addTag(BlockTags.MINEABLE_WITH_AXE)
.addTag(BlockTags.MINEABLE_WITH_PICKAXE);

这里我们可以将原版的斧头和镐子的标签合并到一起,这样我们的工具既可以挖斧头能挖的,又能挖镐子能挖的了

语言文件

1
add(ModItems.PICKAXE_AXE_ITEM.get(), "Pickaxe Axe");

物品模型文件

1
handheldItem(ModItems.PICKAXE_AXE_ITEM);

同样我们还是和工具一样使用手持物品的模型

那么最后不要忘记物品的贴图,之后就可以进入游戏进行测试了