这是适用于Minecraft Java版1.21.4的Fabric模组开发系列教程专栏第四章——创建高级物品:武器。想要阅读其他内容,请查看或订阅上面的专栏。
创建自定义武器与创建食物的写法比较相似,都是在自定义类中创建一些物品的自定义行为,然后在注册物品时应用。此外,常规的物品创建流程依然不变,详细内容请参考我的世界Java版1.21.4的Fabric模组开发教程(二)创建物品。
创建武器的物品类、纹理、模型文件和模型描述文件并在语言文件中添加对应的翻译键
在本章中,我们创建一个名为究极神剑(best_sword)的武器,它重要特点就是拥有高达100点的伤害。
这是常规的物品创建流程。已经在本系列教程第二章进行了详细讲解,此处不再过多赘述。
1.创建com/example/test/item/BestSword.java
作为物品类,使其继承SwordItem
类并实现相关方法;
public class BestSword extends SwordItem {
public BestSword(ToolMaterial material, float attackDamage, float attackSpeed, Settings settings) {
super(material, attackDamage, attackSpeed, settings);
}
@Override
public void appendTooltip(ItemStack stack, TooltipContext context, List<Text> tooltip, TooltipType type) {
tooltip.add(Text.literal("锋利无比!").formatted(Formatting.GRAY));
}
}
注意,此处物品类继承了Item
的子类SwordItem
,SwordItem
类提供了构造剑类物品的构造器,可以简化创建剑类物品的过程;
2.创建物品纹理文件assets/test/textures/item/best_sword.png
;
3.创建模型文件assets/test/models/item/best_sword.json
;
{
"parent": "minecraft:item/handheld",
"textures": {
"layer0": "test:item/best_sword"
}
}
4.创建模型描述文件assets/test/items/best_sword.json
;
{
"model":{
"type": "minecraft:model",
"model": "test:item/best_sword"
}
}
5.编辑语言文件,添加一对键值。
{
...
"item.test.best_sword":"究极神剑"
}
为武器添加自定义属性和行为
在游戏中,剑和镐、斧、锹、锄等均属于工具类物品。通常,在注册这些物品时使用ToolMatetrial
对象设置物品的耐久度、修复材料、挖掘速度等公共属性。
工具材料记录ToolMatetrial
ToolMatetrial
记录用于设置工具类物品的基础属性。在创建ToolMatetrial
对象时,可以直接使用它的构造方法;
public ToolMaterial(TagKey<Block> tagKey, int i, float f, float g, int j, TagKey<Item> tagKey2) {
this.incorrectBlocksForDrops = tagKey;
this.durability = i;
this.speed = f;
this.attackDamageBonus = g;
this.enchantmentValue = j;
this.repairItems = tagKey2;
}
其中传递了很多参数,包括:
TagKey<Block> tagKey
:指定可挖掘方块标签,可以定义工具可以有效挖掘的方块类型,传递一个方块标签;int i
:指定耐久度,即工具彻底损坏前的使用次数。参考:钻石剑耐久度为1561;float f
:指定挖掘速度倍率,即物品破坏方块的速度。参考:钻石镐的挖掘速度倍率为8.0;float g
:指定额外攻击加成,在物品本身攻击力的基础上添加额外攻击力;int j
:指定附魔权重,指的是使用附魔台给工具附魔时,出现高等级的附魔条目的概率;TagKey<Item> tagKey2
:指定修复材料,指的使用铁砧修复工具时使用的材料。传递一个物品标签。
在BestSword.java中声明静态成员变量BEST_SWORD_TOOL_MATERIAL
,类型为ToolMatetrial
。使用ToolMatetrial
类的构造方法初始化变量;
public static final ToolMaterial BEST_SWORD_TOOL_MATERIAL = new ToolMaterial(null,455,0,2,22,ItemTags.REPAIRS_IRON_ARMOR);
由于剑类物品不可破坏方块,因此第一个参数可以为null
;第二个参数到最后一个参数分别设置了:耐久度为455、挖掘速度倍率为0、额外攻击加成为2、附魔权重22以及修复材料为ItemTags.REPAIRS_IRON_ARMOR
,即铁锭。查看更多物品标签请参考ItemTags.java
。
剑物品类SwordItem
SwordItem
类是Item
类的子类,专门用于配置剑类武器的其他独有属性。在自定义物品类中重写SwordItem
类的构造方法后,注册物品时需要调用此构造方法,来为剑类武器设置更多属性;
public SwordItem(ToolMaterial material, float attackDamage, float attackSpeed, Item.Settings settings) {
super(material.applySwordSettings(settings, attackDamage, attackSpeed));
}
构造方法传递了四个参数,包括:
ToolMaterial material
:工具材料对象;float attackDamage
:指定武器攻击力,传递一个浮点(float)型数据,从0开始计算;float attackSpeed
:指定攻击速度,传递一个浮点(float)类型数据,此处有值为4的基础攻击速度;Item.Settings settings
:物品基本配置对象。
只有使用此构造方法,才能设置剑类武器的攻击力和攻击速度,而ToolMatetrial
类的构造方法无法设置。
在游戏注册表中注册武器并将其添加到物品栏中
现在需要将写好的“究极神剑”在游戏注册表中注册,然后将其添加到物品组中。
1.在入口点类声明静态成员变量BEST_SWORD
,此处的类型为自定义物品类的父类SwordItem
,然后使用ModItems.register()
方法将其注册到游戏注册表中;
public static final SwordItem BEST_SWORD = (SwordItem) ModItems.register(
"best_sword",
settings -> new BestSword(BestSword.BEST_SWORD_TOOL_MATERIAL,97f,1f,settings),
new Item.Settings());
此处需要强制类型转换。在第二个参数使用自定义类的构造方法和默认配置对象的函数式,传递工具材料类ToolMaterial
的对象并设置攻击力为100(武器伤害97+1+额外伤害加成2),攻击速度为5(基础攻击速度4+武器攻击速度1)。
2.在onInitialize()
方法中,将“究极神剑”添加到“战斗用品”物品组中;
ItemGroupEvents.modifyEntriesEvent(ItemGroups.COMBAT).register(entries -> entries.add(BEST_SWORD));
此处使用的物品组注册键为ItemGroups.COMBAT
。
启动游戏测试
1.打开游戏测试“究极神剑”所在物品组;
可以看到“究极神剑”在“战斗用品”物品组结尾。
2.鼠标悬停在“究极神剑”上,可以看到攻击力为100,攻击速度为5。
本章小结
本章详细阐述了在游戏中添加自定义武器物品的具体流程,需要提前学习创建常规自定义物品的基础知识。总的来说,本章内容难度不大,篇幅较短,对新手模组开发者比较友好。感谢各位的阅读,有兴趣可以订阅此专栏!