我的世界fabric-1.21.1mod制作心得一——物品注册

主要架构

主要java文件


下文统一用”A“代表您mod的名字,用”modid”代表您mod的modid。


AClient.java

此文件是必备文件,用于游戏客户端的主要内容。但与本篇文章无关。

AMod.java

此文件也是必备文件,内容非常重要。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class AMod implements ModInitializer {
// 此处定义了静态常量,mod_id方便您随时调用。在模组创作中是常用的。
public static final String MOD_ID = "modid";

// 略过
public static final Logger LOGGER = LoggerFactory.getLogger(MOD_ID);

// 略过
@Override
public void onInitialize() {

// 注意这个函数调用,目前这是用来加载AItems类的。
// 我们知道java的特性是一个类的静态方法被调用,这个类的所有静态变量和方法都会完成初始化。
//请记住这个函数,我们会在后面编写他。
CelestialModItems.registerItems();

LOGGER.info("Hello Fabric world!");
}
}

AModDataGenerator.java

这是最后一个必备文件,以上三个java文件就是fabric必须的三个文件,位置在您的项目层最内部的mixin文件夹中(比如src/main/java/com/name/A/mixin)。不过这个文件我们还用不到,所以略过。

AModItems.java

现在让我们进入主题,在目录src/main/java/com/name/A下创建item文件夹,并在此文件夹中创建ModItems.java。

您可以自由命名,但建议用意义更加明确的名称。这里要提醒您的是在我的世界中,复数词表示注册,单数词表示内容。比如Item和Items就是不同的。如果您想要注册物品那么建议您创建如ModItems的类名,以保证和原版风格相同,避免混乱。

下面给出此类的原版写法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class ModItems {
// 原版写法较为繁琐,用了三层嵌套。
public static Item register(String id, Item item) {
// 可以看到第一个register方法内调用了另一个register方法
return register(new Identifier(CelestialMod.MOD_ID,id), item);
}

public static Item register(Identifier id, Item item) {
// 这里是第二个register方法这里又调用了第三个register方法
return register(RegistryKey.of(Registries.ITEM.getKey(), id), item);
}

public static Item register(RegistryKey<Item> key, Item item) {
// 这里是第三个register方法,这里做了一次条件判断,用于区分出方块类物品。
if (item instanceof BlockItem) {
((BlockItem)item).appendBlocks(Item.BLOCK_ITEMS, item);
}
return Registry.register(Registries.ITEM, key, item);
}

}

官方的这种写法或许有某种考虑,但我们完全可以用更简单发方法来实现:

1
2
3
4
5
6
7
8
9
public  static  Item registerItems(String id, Item item){
// 这里的写法就是简单的把原版的嵌套塞到一个方法里了。
return Registry.register(Registries.ITEM, RegistryKey.of(Registries.ITEM.getKey(), new Identifier(CelestialMod.MOD_ID,id)),item);
}

public static Item registerItem(String id, Item item){
// 这里的简化是因为Registry.register方法有一个重载,可以直接传入一个Identifier类,这个重构其实又会调用上面的那个原版Registry.register方法,自动的使用Registries.ITEM.getKey(),这样就不用手写了。
return Registry.register(Registries.ITEM, new Identifier(CelestialMod.MOD_ID,id),item);
}

好了我们完成了物品注册的方法,现在要开始注册物品了!

上文的register注册方法,它们的返回值是Item类。现在我们需要使用它们注册物品,就需要用一个Item变量来接收这个Item。显然这个变量应该是静态的常量。

1
2
3
4
5
public  static  final  Item MOD_ITEM = registerItem("物品id",new Item(new Item.Settings()));
// 是的就是简单的调用一下我们写过的代码就可以了。当然你可以为物品设置food组件,设置最大堆叠数量(默认64)。

public static final Item MOD_ITEM = registerItem("分类前缀/物品id",new Item(new Item.Settings()));
// 物品id可以以添加一个分类前缀,这可以方便您分类管理。

显然,我们注册的物品是一个Item静态常量。此后再要注册物品参考上例,全部写在这个类中便可。也就是我们上文中所说的,Item等单数类名是类本身,Items这样的复数类名类是用于注册的。


最后还有一步,你还记得我们在必备类中调用了一个静态方法吗?现在让我们来编写它!

1
2
3
public  static void registerItems(){
// 是的就是这样空着就行了,目前来说这个静态方法只是为了让程序加载这个类而已。这个方法您可以直接写在最下面。只要此方法被调用,类内的所有初始化代码都会执行,物品注册也就自动完成了。
}

以上我们就完成了物品注册的全部过程。但想要让物品能够正常使用,还需要一些工作。

配置的json文件

文件结构


src/main/resources/assets/id 此文件夹下,有您需要创建三个文件夹:“lang”,“models”,“textures”。

这些文件夹的作用:

”lang“文件夹是语言文件夹,您需要创建语言json文件。

“models”文件夹是贴图路径文件夹,您需要创建规定贴图路径的json文件。

“textures”文件夹是贴图文件夹,这里放置您的贴图文件。


lang文件夹

语言文件的文件名有硬性规定。

比如:英语文件(默认文件)是“en_us.json”,中文是“zh_cn.json”;

书写方法如下:

1
2
3
{
"item.modid.物品id": "物品名"
}

models文件夹

此文件夹之下需要两个文件夹:“block”,“item”。分别装方块和物品的json文件。

需要注意的是文件名建议和物品或方块的id一致。

如果物品id用了分类前缀,可以再加一个文件夹,名字就是您的分类前缀名。

写法如下:

1
2
3
4
5
6
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "modid:item/图片名(这里建议用物品id)"
}
}

textures文件夹

此文件夹之下需要两个文件夹:“block”,“item”。分别装方块和物品的json文件。

同样的文件名建议和物品或方块的id一致。

如果物品id用了分类前缀,可以再加一个文件夹,名字就是您的分类前缀名。


注意点:所有的贴图文件必须是png格式!!!