# 第一个物品:岩盐
我们从一个最简单的物品开始:
- 这个物品叫「岩盐」,也有叫「石盐」的,英文名 Rock Salt。
- 模型和原版钻石一致。
- 你可以在原版创造物品栏的「杂项」一栏中找到它。
- 除此之外没有任何特别之处。
# 从注册物品开始
物品是非常典型的「需要注册才能使用的游戏对象」,所以我们要先注册这么一个物品。
public final class MyItems {
// 最后的 "my_mod" 是 mod id。
private static final DeferredRegister<Item> ITEMS = new DeferredRegister<>(ForgeRegistries.ITEMS, "my_mod");
// register 方法的第一个参数指定栏物品的注册名。
// 第二个参数是要注册的物品的 Supplier。
// 注意我们直接复用了原版的 Item 类——因为它没有任何特别的功能。
// 我们通过 Item.Properties#group 方法来指定它在哪个创造标签页下。
public static final RegistryObject<Item> ROCK_SALT = ITEMS.register("rock_salt",
() -> new Item(new Item.Properties().group(ItemGroup.MISC)));
// Dependency injection。
public MyItems(IEventBus theBus) {
/*
* 一个比较反直觉的设计,DeferredRegister.register(IEventBus) 的用途
* 是让 DeferredRegister 里的事件监听器注册进给定的事件总线里。
*/
ITEMS.register(theBus);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
然后在 Mod 主类里调用就行了:
@Mod("my_mod")
public final class MyMod {
public MyMod() {
final IEventBus bus = FMLJavaModLoadingContext.get().getModEventBus();
bus.addListener(this::commonSetup);
bus.addListener(this::clientSetup);
bus.addListener(this::serverSetup);
new MyItems(bus);
}
}
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# 语言文件
Minecraft 支持一大堆语言甚至是允许自定义新语言,所以我们不能把翻译写死进代码里。 关于语言文件的详细说明可参考[未完待续],这里我们只说明需要的内容。
Minecraft 使用 JSON 作为语言文件的载体。
Minecraft 的默认语言是美式英文(ISO-639-1 en_us
)。新建 assets/my_mod/lang/en_us.json
并填入:
{
"item.my_mod.rock_salt": "Rock Salt"
}
1
2
3
2
3
非常显然,我们需要简体中文(ISO-639-1 zh_cn
)翻译。新建 assets/my_mod/lang/zh_cn.json
并填入:
{
"item.my_mod.rock_salt": "岩盐"
}
1
2
3
2
3
# 模型
我们的目标是和原版钻石外观一致,那么我们只需要让它使用原版钻石的物品模型即可。
新建 assets/my_mod/models/item/rock_salt.json
并填入:
{
"parent": "minecraft:item/diamond"
}
1
2
3
2
3
完工。
接下来启动游戏,你应该能在创造模式物品栏里找到这个以假乱真的「岩盐」物品了。You salty now?