我的世界Java版1.21.4的Fabric模组开发教程(四)创建高级物品:武器

这是适用于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的子类SwordItemSwordItem类提供了构造剑类物品的构造器,可以简化创建剑类物品的过程;

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。
在这里插入图片描述

本章小结

本章详细阐述了在游戏中添加自定义武器物品的具体流程,需要提前学习创建常规自定义物品的基础知识。总的来说,本章内容难度不大,篇幅较短,对新手模组开发者比较友好。感谢各位的阅读,有兴趣可以订阅此专栏!

### 在 Fabric 1.21.4 中注册自定义工具 在 Minecraft 的 Fabric 模组开发中,注册自定义工具的过程与其他物品的注册方式类似。以下是具体实现方法: #### 工具类的创建 首先需要创建一个新的 Java 类继承 `ToolItem` 或者类似的基类,并重写必要的方法以定义工具的行为。例如,可以为工具设定攻击力、挖掘速度等特性。 ```java import net.minecraft.item.ToolMaterial; import net.minecraft.item.SwordItem; public class CustomSword extends SwordItem { public CustomSword(ToolMaterial material, int attackDamage, float attackSpeed, Settings settings) { super(material, attackDamage, attackSpeed, settings); } } ``` 此代码片段展示了如何创建一把类型的工具[^1]。其中 `ToolMaterial` 定义了工具的基础属性(如耐久度和效率),而 `attackDamage` 和 `attackSpeed` 则分别表示攻击伤害加成和攻击速度调整值。 #### 注册工具 接着,在模组初始化阶段完成工具的注册操作。通常会使用 `RegistryObject` 来管理新物品或工具的对象实例。 ```java import net.fabricmc.fabric.api.item.v1.FabricItemSettings; import net.minecraft.item.Item; import net.minecraft.util.registry.Registry; public class ModItems { public static final RegistryObject<Item> CUSTOM_SWORD = Registry.register( Registries.ITEM, new Identifier("modid", "custom_sword"), new CustomSword(ModToolMaterials.CUSTOM_TOOL_MATERIAL, 3, -2.4f, new FabricItemSettings()) ); } ``` 这里调用了 `Registry.register()` 方法将自定义工具注册至游戏内[^1]。注意替换 `"modid"` 为你自己的命名空间以及 `ModToolMaterials.CUSTOM_TOOL_MATERIAL` 为实际材料对象。 #### 添加材质数据 为了使工具能够正常工作,还需要提前定义好它的材质信息。这一步骤一般放在单独的一个枚举类型里完成。 ```java import net.minecraft.item.ToolMaterial; import net.minecraft.recipe.Ingredient; public enum ModToolMaterials implements ToolMaterial { CUSTOM_TOOL_MATERIAL(3, 500, 7.0F, 3.0F, 20, Ingredient.ofItems(ModItems.CUSTOM_INGOT)); private final int miningLevel; private final int itemDurability; private final float miningSpeed; private final float attackDamage; private final int enchantability; private final Ingredient repairIngredient; ModToolMaterials(int miningLevel, int itemDurability, float miningSpeed, float attackDamage, int enchantability, Ingredient repairIngredient) { this.miningLevel = miningLevel; this.itemDurability = itemDurability; this.miningSpeed = miningSpeed; this.attackDamage = attackDamage; this.enchantability = enchantability; this.repairIngredient = repairIngredient; } @Override public int getMiningLevel() { return miningLevel; } @Override public int getItemDurability() { return itemDurability; } @Override public float getMiningSpeedMultiplier() { return miningSpeed; } @Override public float getAttackDamage() { return attackDamage; } @Override public int getEnchantability() { return enchantability; } @Override public Ingredient getRepairIngredient() { return repairIngredient; } } ``` 这段代码定义了一个新的工具材质 `CUSTOM_TOOL_MATERIAL` 并设置了其各项数值[^1]。 --- ### 总结 以上就是基于 Fabric API 实现自定义工具的主要步骤。它涵盖了从工具类的设计到最终向游戏中引入该工具的整体流程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值