Minecraft Forge 添加新物品

Minecraft Forge 添加新物品

基本概念

注册

所有 mod 的对象都要向游戏注册(物品,方块,声音等) 如果不进行注册,会报错或者导致莫名其妙的行为。

注册方法

  • 延迟注册 DeferredRegister
  • 注册事件 RegisterEvent
  • 非 Forge 注册的注册

在使用到的时候详细说明

引用注册的对象

  • 使用 RegistryObjects

详细内容可以参考 Forge 文档

新建物品类

创建一个软件包 item,在包里创建一个 Java 类 ModeItems

可以把 mod 中的所有物品从这个类文件中定义

定义物品变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package cc.neolux.tutorialmod.item;

import cc.neolux.tutorialmod.TutorialMod;
import net.minecraft.world.item.CreativeModeTab;
import net.minecraft.world.item.Item;
import net.minecraftforge.eventbus.api.IEventBus;
import net.minecraftforge.registries.DeferredRegister;
import net.minecraftforge.registries.ForgeRegistries;
import net.minecraftforge.registries.RegistryObject;

public class ModItems {
public static final DeferredRegister<Item> ITEMS =
DeferredRegister.create(ForgeRegistries.ITEMS, TutorialMod.MODID);

// 注册物品,添加到杂项分类中
public static final RegistryObject<Item> BEAR = ITEMS.register("bear",
() -> new Item(new Item.Properties().tab(CreativeModeTab.TAB_MISC)));

public static void register(IEventBus eventBus) {
ITEMS.register(eventBus);
}
}

在本例中,我简单的把微信头像放到游戏中,当作一个物品。

之后在 Mod 的构造方法中注册这个类

1
ModItems.register(modEventBus);

添加材质

在 resources 文件夹里面创建目录结构如下:

1
2
cd src/main/resources
mkdir assets/tutorialmod/{blockstates,lang,models/{block,item},textures/{block,item}} -p

之后 resources 文件夹结构应该是这样

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
.
├── assets
│   └── tutorialmod
│   ├── blockstates
│   ├── lang
│   ├── models
│   │   ├── block
│   │   └── item
│   └── textures
│   ├── block
│   └── item
├── META-INF
│   └── mods.toml
└── pack.mcmeta

12 directories, 2 files

assets/tutorialmod/models/item 创建 bear.json

1
2
3
4
5
6
{
"parent": "item/generated",
"textures": {
"layer0": "tutorialmod:item/bear"
}
}

把材质放到 /assets/tutorialmod/textures/item/bear.png

添加翻译

assets/tutorialmod/lang 创建英文翻译文件和中文翻译文件 en_us.json, zh_cn.json

1
2
3
{
"item.tutorialmod.bear": "Bear"
}
1
2
3
{
"item.tutorialmod.bear": "熊"
}

运行 runClient,创建存档,在杂项里面可以找到这个物品

image-20240708171035557

image-20240708171143227

新物品栏

创建 cc.neolux.tutorialmod.item.ModCreativeTab

1
2
3
4
5
6
7
8
9
10
11
12
13
package cc.neolux.tutorialmod.item;

import net.minecraft.world.item.CreativeModeTab;
import net.minecraft.world.item.ItemStack;

public class ModCreativeTab {
public static final CreativeModeTab tutorialmod_tab = new CreativeModeTab("tutorialmod_tab") {
@Override
public ItemStack makeIcon() {
return new ItemStack(ModItems.BEAR.get());
}
};
}

之后修改 ModItems

1
2
public static final RegistryObject<Item> BEAR = ITEMS.register("bear",
() -> new Item(new Item.Properties().tab(ModCreativeTab.tutorialmod_tab)));

为物品栏添加翻译

1
2
3
4
{
"item.tutorialmod.bear": "熊",
"itemGroup.tutorialmod_tab": "我的物品"
}

运行

image-20240708172111322