关于 MC 的 Forge 模组开发(三):第一个物品与语言文件

关于 MC 的 Forge 模组开发(三):第一个物品与语言文件

一、物品创建

创建物品不是什么难事,我们先新建一个 items 包,存放我们的物品。

接着,我们计划加入的第一个物品是 “不完整的 C++” (先叫这个鬼畜名字),它的获取方式我们暂时不管。

在 items 目录下添加 Java 类:IncompleteC__ 和 ItemRegistry。它们将完成我们第一个物品的注册。

在 IncompleteC__ 中加入以下代码:

package com.OI.olympiadininformatics.items;

import net.minecraft.item.Item;
import net.minecraft.item.ItemGroup;

public class IncompleteC__ extends Item {
    public IncompleteC__() {
        super(new Properties().tab(ItemGroup.TAB_MATERIALS));
    }
}

事实上,以我目前的知识水平,并不能为你解释这里面的实际内容,因为我也是刚刚接触 Java(此前只写过神奇 C++),不过我们了解它就行了。

简单讲一下语法,给像我这样的小白:

在 Java 的语法中,package 有的类似于 C++ 的命名空间 namespace,而 import 则是像 Python 中,或者是 C++ 的 include 一样,用于导入某个文件。之后的代码中,我们将不会展示 packageimport 的内容。

public 是一个修饰符,它表示对外公开,也就是可以由外部访问的。

class 是声明类的关键字,这其实就是“对象”的概念。

extends 也是一个关键字,它指明了 IncompleteC__ 的父类,其中父类为 Item,并且我们通过 super 为关键字访问父类的成员。

此处 super() 为调用父类的构造函数,这个 public IncompleteC__() 本身也是个对外公开的构造函数。

此外,我们调用了 Properties 类,它的功能我还不了解,大概是对物品属性的规定,不过其成员 tab 方法可以返回一个 group 类型的变量,这个表示了物品栏。

ItemGroup.TAB_MATERIALS 表示的是物品栏-杂项。

一个值得注意的是,不同版本的方法名不一定一样,我所参考的教程版本中就不存在 tab 方法,而是 group 方法。

接下来对我们的 ItemRegistry 文件动手脚,它将注册我们的物品:

public class ItemRegistry {
    public static final DeferredRegister<Item> ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, Utils.MOD_ID);
    public static final RegistryObject<Item> c__fragments = ITEMS.register("incompletec__", IncompleteC__::new);
}

这里 DeferredRegister 中的第一个参数代表我们创建的是物品,第二个则指明了 MOD_ID。

RegistryObject 的第一个参数是物品名称,第二个则要求传入一个实例(可以简单地理解为一个真实创建的对象,而不是类这样的模板),我们直接用 new 关键字声明一个新物品传入即可。

现在进入游戏就可以发现,我们的物品出现了!尽管它没有贴图,名字也很奇怪

二、模型贴图

还记得 resources 文件夹吗?就是有着 mods.toml 文件的那个。

我们在它下面建立另一个目录,名为 assets ,然后随便拉若干级目录,建立 models.item 目录和 textures.item 目录(分开的)。

现在目录长这样(请暂时忽略那两个文件)

image-20221210141856647

接着我们添加分别文件 incompletec__.json 和 incompletec__.png(注意位置),然后进入 incompletec__.json 中,编写如下代码:

{
  "parent": "item/generated",
  "textures": {
    "layer0": "olympiadininformatics:item/incompletec__"
  }
}

这里……算了我解释不了,就引用一下文末第二个链接(结合我的例子,有改动)。

这里的内容非常简单:"parent": "item/generated” 指定了这个模型的「父模型」是什么,而 "layer0": "olympiadininformatics:item/incompletec__” 指定了具体的材质。olympiadininformatics: 代表这个是在我们自己的assets 文件下,item/incompletec__ 代表了是 textures/item/obsidian_ingot.png 这张图片。

大概就是这样,先随便整张图下来糊弄一下(我还在学习 BlockBench,之后再自己做模型):

补:

我去水了一段时间,还是没看怎么懂 BlockBench 的用法……

不过自己一通瞎搞,还是整了个丑得多的模型出来。

图在后面会有。

三、语言文件

这里我没有截图,但你应该留意到了,我们物品的名字是一串不正常的字符。

而平时在游玩 mod 的时候,遇到没有官方汉化的 mod,我们也会在网上找到一个名为 zh_cn.json 的文件。

事实上,这个就是我们的语言文件,它包含这样的模板:

{
  A: B,
  C:D
}

可以看到这是一个键值对,将 A 命名为 BC 命名为 D

现在我们创建这个文件,目录结构如下:

然后加入我们的语言文件:

{
  item.olympiadininformatics.incompletec__:残缺的C++
}

左边是我们的物品在游戏中显示的名称,右边是我们要给它的名字。

现在启动游戏,就可以看见我们的物品有名字了。

请注意的是,不同版本的方法有所不同,我所参考的教程多了一对引号,而网上一些教程则采用了 = 而不是 :,并且存在更多的差异,如果加载失败请自行尝试。

现在就能看见我们的物品了!

参考链接:

第一个物品

物品材质与模型

语言文件与本地化

posted @   LQ636721  阅读(306)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示