工具和武器 26.1.2
学习如何创建自己的工具并配置其属性。
工具对于生存和游戏进程至关重要,可让玩家收集资源、建造建筑物和保护自己。
创建工具材料
你可以通过实例化一个ToolMaterial对象来创建一个工具材料,并将其储存在一个之后可以用该材料创建工具物品的字段内。
java
public static final ToolMaterial GUIDITE_TOOL_MATERIAL = new ToolMaterial(
INCORRECT_FOR_GUIDITE_TOOL, // incorrect blocks for drops
455, // durability
5.0F, // speed
1.5F, // attack damage bonus
22, // enchantment value
GuiditeArmorMaterial.REPAIRS_GUIDITE_ARMOR // repair items
);1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
ToolMaterial接口的构造函数接受以下参数(按顺序排列):
| 参数 | 描述 |
|---|---|
incorrectBlocksForDrops | 如果一个方块具有incorrectBlocksForDrops标签,这就意味着当你对这个方块使用由这个ToolMaterial创建的工具,这个方块不会有任何掉落物。 |
durability | 该ToolMaterial的耐久度。 |
speed | 该ToolMaterial的挖掘速度。 |
attackDamageBonus | 该ToolMaterial的额外攻击伤害。 |
enchantmentValue | 该ToolMaterial在附魔时得到更好附魔的概率。 |
repairItems | 任何具有这个标签的物品可以被用来在铁砧中修复该ToolMaterial。 |
在本例中,我们将使用与修复盔甲相同的修复物品标签。 我们定义标签引用如下:
java
public static final TagKey<Item> REPAIRS_GUIDITE_ARMOR = TagKey.create(BuiltInRegistries.ITEM.key(), Identifier.fromNamespaceAndPath(ExampleMod.MOD_ID, "repairs_guidite_armor"));1
如果你不确定怎么给上述参数设置一个平衡的数值,你可以考虑参考原版材料的数值,比如ToolMaterial.STONE或者ToolMaterial.DIAMOND。
创建工具材料标签
针对我们的incorrectBlocksForDrops标签,我们可以创建一个类似于原版minecraft:incorrect_for_*_drops的标签,用于指定使用该材料挖掘时不会掉落物品的方块。 我们定义标签引用如下:
java
public static final TagKey<Block> INCORRECT_FOR_GUIDITE_TOOL = TagKey.create(BuiltInRegistries.BLOCK.key(),
Identifier.fromNamespaceAndPath(ExampleMod.MOD_ID, "incorrect_for_guidite_tool"));1
2
2
接下来,我们使用标签 JSON 文件来定义该标签的具体内容。 这里设定 Guidite 工具可以挖掘木制工具能挖掘的方块,外加铜矿石和深层铜矿石:
json
{
"values": ["#minecraft:incorrect_for_wooden_tool"],
"fabric:remove": ["#minecraft:copper_ores"]
}1
2
3
4
2
3
4
请注意,这个例子继承自较弱的工具材料,并 移除 了我们更强的材料能挖掘的条目,从而继承了所有木制工具无法挖掘的其他方块。
TIP
我们也可以反过来操作:继承更强的工具,并 追加 那些 Guidite 工具挖不动的额外方块。
举例来说,如果我们想创建一个等效于铁制工具、但无法挖掘钻石矿石的工具,其values中就需要包含#minecraft:incorrect_for_iron_tool以及#minecraft:diamond_ores。
如果你希望你的工具材料能够挖掘与现有材料完全相同的方块,你可以在标签定义中直接包含相应的标签,无需进行任何添加或删除。 建议采用此方法,而不是直接将现有的标签当作你材料的incorrectBlocksForDrops参数传入,这样能确保用户可以独立配置每种材料的无效方块。
注册工具物品
使用与 创建你的第一个物品 指南中相同的实用功能,你可以创建工具物品:
java
public static final Item GUIDITE_SWORD = register(
"guidite_sword",
Item::new,
new Item.Properties().sword(GUIDITE_TOOL_MATERIAL, 1f, 1f)
);1
2
3
4
5
2
3
4
5
两个浮点数值 (1f, 1f) 分别表示工具的攻击伤害以及攻击速度。
对于锹、斧和锄,你应该创建 ShovelItem、AxeItem 或 HoeItem,而不是通用的 Item,因为这些实现了特定于工具的右键单击操作:
java
public static final Item GUIDITE_AXE = register(
"guidite_axe",
settings -> new AxeItem(GUIDITE_TOOL_MATERIAL, 5.0F, -3.0F, settings),
new Item.Properties());1
2
3
4
2
3
4
INFO
ShovelItem、AxeItem 和 HoeItem 在其构造函数中调用 Item.Properties 的 shovel、axe 或 hoe 方法。
如果你想通过创造模式物品栏访问,记得其加入一个创造标签页!
java
CreativeModeTabEvents.modifyOutputEvent(CreativeModeTabs.TOOLS_AND_UTILITIES)
.register((creativeTab) -> creativeTab.accept(ModItems.GUIDITE_SWORD));1
2
2
你还得添加纹理、物品翻译和物品模型。 然而,对于物品模型,你应该使用 item/handheld 模型作为父模型,而非通常的 item/generaterd。
资产
你还需要添加纹理、翻译、客户端物品和物品模型。 然而,对于物品模型,你应该使用 item/handheld 模型作为父模型,而非通常的 item/generaterd。
在这个例子中,我们将为“Guidite Sword”物品定义以下客户端物品、模型和纹理:
INFO
该模型可以由数据生成。 更多信息,请参阅有关生成物品模型的文档。
java
itemModelGenerator.generateFlatItem(ModItems.GUIDITE_SWORD, ModelTemplates.FLAT_HANDHELD_ITEM);1
类似的模式也适用于“Guidite Axe”物品。
java
itemModelGenerator.generateFlatItem(ModItems.GUIDITE_AXE, ModelTemplates.FLAT_HANDHELD_ITEM);1
标签工具物品
前置知识
更多信息,请参阅有关生成物品标签的文档。
建议将工具放置在相应的物品标签中。 工具拥有各自独特的标签,例如 ItemTags.SWORDS,这些标签用于附魔能力和其他特定逻辑,例如是否施加横扫伤害。
在你的物品标签提供程序中,将以下代码添加到 addTags 函数中:
java
valueLookupBuilder(ItemTags.SWORDS)
.add(ModItems.GUIDITE_SWORD);
valueLookupBuilder(ItemTags.AXES)
.add(ModItems.GUIDITE_AXE);1
2
3
4
2
3
4
这样就差不多了! 进入游戏后,你应该能在创造模式物品栏菜单的“工具与实用物品”标签页中看到你的工具。






