我的世界1.20.1模组开发---10.添加自定义的工具(镐子、斧子、铲子)和武器(剑)
介绍
之前介绍了如何添加自己的物品和有特殊功能的物品,都和Item
类息息相关。之前我们新增特殊功能物品时,新建了一个专门的类,这个类继承了Item
类,然后我们重写里面的方法就可以实现特殊的功能。原版中有很多种类的Item
,比如一些挖掘类的工具、武器、装备等等,我们进入Item
类中,使用快捷键CTRL+H
(IDEA中),就可以看到所有项目中继承了Item
类的类,我们如果想创建类似的物品,可以直接继承官方已经封装好的类再进行修改即可。我们主要介绍工具、武器、装备之类的常用到的物品的创建,这次先来介绍镐子、斧子、铲子和剑的创建。
我们在开发中大部分写法都可以参考原版的写法,但首先我们需要知道去哪里才能找到这些东西。之前我们用到过Items
类,这个类里面放了所有被注册过的原版的物品,类似的还要Blocks
类,里面放了所有原版的方块。这里面的物品和方块就涵盖了所有我们会添加的类型的方块,就从这里一点一点往下查找就能知道具体怎么实现的了。我们先进入Items类中,搜索diamond关键字,查看钻石一套的工具和武器是怎么创建的。
这里以钻石镐为例,我们可以看到是通过new
一个PickaxeItem
类创建的钻石镐,其他的也都一样,一步一步往下找可以发现他们都是继承的Item
类,我们可以把这些类理解成官方封装好的类,我们直接继承并重写一些方法或者修改一下参数就能创建我们的工具和武器。
这些物品的参数也都一样,含义也相同,这里就以PickaxeItem
类的创建为例,介绍一下具体含义。
我们需要传入四个参数,分别是工具的材质,攻击伤害,攻击速度和物品属性。
我们只需要关注前三个属性即可,最后一个属性new一个空的属性使用默认值即可,其中攻击伤害和攻击速度不难理解,我们传入数值即可,第一个工具材质属性才是我们关注的重点。
new PickaxeItem(Tiers.DIAMOND, 1, -2.8F, new Item.Properties()));
我们想知道这是个什么东西,就需要进到Tiers
类中看一下源码是什么,我们按住CTRL
并把鼠标移到Tiers
身上点击左键就能跳到这个东西里面看源码。
可以看到这是一个枚举,里面是各种工具的材质,里面定义了各种属性:
- 挖掘等级决定了我们的工具可以破坏什么样的方块。
- 耐久度决定了工具的使用次数。
- 挖掘速度主要针对工具来说的,决定了工具破坏方块的速度,new 相应的工具类时传入的是攻击速度,不要把两个速度弄混了。
- 这个参数也是攻击伤害,准确来说一个是这个材质的基础攻击伤害(我进源码看了一下, 总攻击伤害 = 基础攻击伤害 + 我们传入的攻击伤害)。
- 最小附魔等级决定了这个材质的工具可以被附魔的最小等级。
- 修复材料指明了在铁砧中修复对应材质的工具所需要的原材料。
好的,现在我们知道了创建一个自定义的工具类需要new
一个对应的xxxItem
类,并传入相应的材质和一些基础属性,如果我们想自定义工具的话,只能在工具的材质身上下手,所以我们就需要新建一个枚举并继承原版的Tiers
,然后创建对应的工具时选择我们的材质即可。下面给出具体代码。
代码
首先我们需要在我们的mod目录下新建一个tiers包,存放我们的材质,在这个包下新建ModItemTiers
的枚举类型,并实现Tiers
接口。
public enum ModItemTiers implements Tier {
//参数为挖掘等级(主要对挖掘工具用,对武器没什么影响)、 耐久度、 速度、 攻击伤害、 附魔等级(可接受的最高附魔等级)
RED(3, 2000, 10.0F, 6.0F, 15, () -> {
//返回的是需要的修复材料
return Ingredient.of(ModItems.JIUCHANZHIYUAN.get());
});
private final int harvestLevel;
private final int maxUses;
private final float efficiency;
private final float attackDamage;
private final int enchantability;
private final LazyLoadedValue<Ingredient> repairMaterial;
ModItemTiers(int harvestLevel, int maxUses, float efficiency, float attackDamage, int enchantability, Supplier<Ingredient> repairMaterial) {
this.harvestLevel = harvestLevel;
this.maxUses = maxUses;
this.efficiency = efficiency;
this.attackDamage = attackDamage;
this.enchantability = enchantability;
this.repairMaterial = new LazyLoadedValue<>(repairMaterial);
}
@Override
public int getUses() {
return this.maxUses;
}
@Override
public float getSpeed() {
return this.efficiency;
}
@Override
public float getAttackDamageBonus() {
return this.attackDamage;
}
@Override
public int getLevel() {
return this.harvestLevel;
}
@Override
public int getEnchantmentValue() {
return this.enchantability;
}
@Override
public Ingredient getRepairIngredient() {
return this.repairMaterial.get();
}
}
设置好我们的材质之后,就可以在创建工具的时候使用这个材质了,接下来我们就到ModItems
类下新建我们的工具(这里以稿子和剑为例),并且第一个参数选择我们的RED
材质。
//添加剑
public static final RegistryObject<Item> REDSWORD =ITEMS.register("redsword",
()->new SwordItem(ModItemTiers.RED,3, -2.4F,new Item.Properties()));
//添加稿子(用PickaxeItem类),自定义耐久等属性
public static final RegistryObject<Item>RED_PICKAXE=ITEMS.register("red_pickaxe",
()->new PickaxeItem(ModItemTiers.RED,1, -2.8F, new Item.Properties()));
然后就完成物品的添加了,之后就是老生常谈的把物品添加到创造模式物品栏、设置模型文件、设置语言文件、添加贴图等操作,这里不再过多演示,直接生成一下数据进入游戏即可。
然后就可以看到我们的攻击伤害已经发生变化,测试一下也会发现耐久值也发生了变化。