
本文详细介绍了在Fabric Mod开发中,如何在Minecraft 1.19.3及更高版本中添加自定义物品。针对旧版`FabricItemSettings().group()`方法失效的问题,文章阐述了使用Fabric API提供的`ItemGroupEvents.modifyEntriesEvent`事件来将自定义物品注册到指定物品组的现代实践,并提供了完整的代码示例和注意事项,帮助开发者顺利实现物品的创建与管理。
核心概念:Fabric物品注册
在Fabric Mod开发中,添加自定义物品是基础操作。每个物品都需要通过Minecraft的注册系统进行注册,以便游戏能够识别和加载它。FabricItemSettings类用于定义物品的各种属性,例如最大堆叠数、耐久度、是否可附魔等。物品注册的核心是通过Registry.register方法将物品实例与一个唯一的Identifier关联起来。
Fabric 1.19.3+ 版本的新范式:物品组管理
随着Fabric API的不断演进,某些旧有的API用法已被更新或移除,以提供更灵活和强大的功能。其中一个显著的变化就是物品组(ItemGroup)的添加方式。在Minecraft 1.19.3及更高版本中,FabricItemSettings类中的.group()方法已被移除。这意味着我们不能再通过物品设置直接指定其所属的物品组。
取而代之的是,Fabric API引入了事件驱动模型来管理物品组的条目。开发者现在需要利用ItemGroupEvents.modifyEntriesEvent事件,在游戏初始化阶段动态地将自定义物品添加到指定的物品组中。这种新范式提供了更大的灵活性,允许Mod在运行时修改甚至其他Mod的物品组内容。
实现步骤
以下是使用新方法在Fabric 1.19.3+版本中添加自定义物品并将其加入物品组的详细步骤。
步骤一:注册自定义物品
首先,我们需要定义并注册我们的自定义物品。在这一步中,我们只关注物品本身的属性定义和注册,不涉及物品组。
import net.fabricmc.fabric.api.item.v1.FabricItemSettings;
import net.minecraft.item.Item;
import net.minecraft.registry.Registries; // 注意:在新版本中是Registries
import net.minecraft.registry.Registry; // 注意:在新版本中是Registry
import net.minecraft.util.Identifier;
public class MyModItems {
// 定义并注册自定义物品
// "tutorial" 是你的mod ID,"custom_item" 是物品的唯一ID
public static final Item CUSTOM_ITEM = Registry.register(
Registries.ITEM, // 使用Registries.ITEM来注册物品
new Identifier("tutorial", "custom_item"),
new Item(new FabricItemSettings()) // 物品设置,不包含group()方法
);
// 可以在这里添加其他自定义物品的注册
public static void registerModItems() {
// 此方法可以用于在Mod初始化时调用,确保所有物品都被注册
}
}在这个阶段,CUSTOM_ITEM已经被注册到游戏中,但它不会出现在任何物品组中,因此在创造模式物品栏中是不可见的。
步骤二:将物品添加到指定物品组
接下来,在你的Mod主类(通常是实现了ModInitializer接口的类)的onInitialize()方法中,使用ItemGroupEvents.modifyEntriesEvent事件将已注册的自定义物品添加到所需的物品组。
import net.fabricmc.api.ModInitializer;
import net.fabricmc.fabric.api.itemgroup.v1.ItemGroupEvents;
import net.minecraft.item.ItemGroups; // 导入ItemGroups,包含所有内置物品组常量
public class TutorialMod implements ModInitializer {
@Override
public void onInitialize() {
// 首先确保你的物品已经被注册
MyModItems.registerModItems(); // 调用注册物品的方法
// 通过事件将自定义物品添加到物品组
// ItemGroups.MISC 代表杂项物品组,你可以选择其他内置物品组
ItemGroupEvents.modifyEntriesEvent(ItemGroups.MISC).register(itemGroup -> {
// 将自定义物品添加到杂项物品组
itemGroup.add(MyModItems.CUSTOM_ITEM);
});
// 可以在此处添加其他初始化逻辑,例如注册方块、实体等
}
}通过上述代码,当游戏初始化时,CUSTOM_ITEM将被添加到“杂项”物品组中,从而在创造模式物品栏中可见。
完整代码示例
为了更好地理解,以下是一个包含物品注册和物品组添加的完整Mod类结构示例:
package com.example.tutorialmod; // 请替换为你的实际包名
import net.fabricmc.api.ModInitializer;
import net.fabricmc.fabric.api.item.v1.FabricItemSettings;
import net.fabricmc.fabric.api.itemgroup.v1.ItemGroupEvents;
import net.minecraft.item.Item;
import net.minecraft.item.ItemGroups; // 导入Minecraft内置物品组常量
import net.minecraft.registry.Registries; // 注册表辅助类
import net.minecraft.registry.Registry; // 核心注册类
import net.minecraft.util.Identifier;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class TutorialMod implements ModInitializer {
// 确保你的mod ID与fabric.mod.json中的一致
public static final String MOD_ID = "tutorial";
public static final Logger LOGGER = LoggerFactory.getLogger(MOD_ID);
// 定义并注册自定义物品
public static final Item CUSTOM_ITEM = Registry.register(
Registries.ITEM,
new Identifier(MOD_ID, "custom_item"),
new Item(new FabricItemSettings())
);
@Override
public void onInitialize() {
LOGGER.info("Initializing TutorialMod!");
// 在初始化时,通过事件将物品添加到物品组
// 这里将CUSTOM_ITEM添加到杂项物品组 (ItemGroups.MISC)
ItemGroupEvents.modifyEntriesEvent(ItemGroups.MISC).register(itemGroup -> {
itemGroup.add(CUSTOM_ITEM);
LOGGER.info("Added CUSTOM_ITEM to MISC item group.");
});
// 你可以在这里添加其他初始化逻辑,例如注册方块、实体、配方等
}
}注意事项
- 版本兼容性: 本教程中描述的ItemGroupEvents方法适用于Fabric 1.19.3及更高版本的Minecraft。如果你正在开发旧版本的Mod,可能仍然需要使用FabricItemSettings().group()。
-
Fabric API依赖: 确保你的build.gradle文件中正确添加了Fabric API的依赖。ItemGroupEvents是Fabric API的一部分。
dependencies { // ... 其他依赖 ... modImplementation "net.fabricmc.fabric-api:fabric-api:0.90.0+1.20.1" // 请根据你的Minecraft版本调整Fabric API版本 } - 物品组选择: ItemGroups.MISC只是一个示例。Minecraft提供了多个内置物品组,如ItemGroups.BUILDING_BLOCKS(建筑方块)、ItemGroups.COMBAT(战斗)等。你可以根据物品的性质选择最合适的物品组。
- Mod ID与物品ID: new Identifier("your_mod_id", "your_item_id")中的"your_mod_id"必须与你的fabric.mod.json文件中定义的id字段一致,而"your_item_id"则是该物品在你Mod内部的唯一标识符。
- 自定义物品组: 如果内置物品组无法满足需求,Fabric API也支持创建自定义物品组。这通常涉及创建新的FabricItemGroup实例并注册它,然后通过ItemGroupEvents.modifyEntriesEvent向其添加物品。
总结
在Fabric Mod开发中,适应API的变化是常态。对于Minecraft 1.19.3及更高版本,添加自定义物品到物品组的方式已从直接在FabricItemSettings中指定,转变为使用ItemGroupEvents.modifyEntriesEvent进行事件驱动的添加。这种新的方法提供了更大的灵活性和模块化,是当前推荐的最佳实践。理解并正确应用这一机制,将帮助开发者更高效、更稳定地构建Minecraft Mod。建议开发者经常查阅Fabric官方文档和Fabric API示例,以获取最新和最准确的开发指南。






