Java 路线与后续安排

1438 字
7 分钟
Java 路线与后续安排

由于现在想做更加高级且拓展的 Minecraft Mod!所以还是要学习 Java 开发的啦!也弥补了后端语言只会 Python 的尴尬。所以 Java 是时候捡起来了!

第一阶段(预计一周)#

基本语法、数据类型、控制流

面向对象:类、继承、接口、多态

集合框架(List、Map、Set 会用就行)

异常处理和泛型基础

第二阶段(直接上手)#

由于目前打算学习的是 Neoforge,也算是未来的大势所趋,所以还是基于此框架进行学习吧!

知识点:

Gradle构建工具:Neoforge 项目全靠它管理依赖和打包

事件系统:@SubscribeEvent,模组与游戏交互的核心

注册系统:DeferredRegister,注册方块、物品、实体等

数据生成:自动生成 JSON 模型、配方、战利品表

Mixin:高级技巧,直接修改原版代码的行为

废话不多说,尝试构建第一个 Neoforge 项目吧!#

1. 导入 Neoforge MDK#

Java 安装和 IDEA 的安装旧不再赘述。直接快进到 MDK 安装即可。

相关链接:https://github.com/NeoForgeMDKs/MDK-1.21-ModDevGradle

下载开发包后将其导入 IDEA,初次使用时,Gradle 将会下载 NeoForge 的所有依赖,包括 Minecraft 本体对其进行反编译。可能会花上一阵子。用自己的网络手段想想办法吧!

下载完后就可以测试运行了。

2. 构建测试环境#

在构建运行配置的时候可以选择 Clinet 与 Server(即客户端环境与服务端环境,由于我们现在是在编写客户端模组,所以构建 Client 运行环境即可)

3. 标准模板里面是什么?#

在 excamplemod 下的 ExampleMod.java 生成了一个标注模板,它把注册新物品,新方法以及创造模式标签页等重复性工作搭好了框架。以下则为逐级对其进行拆解。

1. 包的声明与导入:#
Terminal window
路径:
/src/main/java/com.example.examplemod/ExampleMod.java

package:这是你的模组代码所在包。你可以把它改成你自己的包名,比如 com.yourname.yourmodid

package com.example.examplemod;
// ... 大量 import 语句 ...
2. @Mod 与 主类#
@Mod(ExampleMod.MODID)
public class ExampleMod {
public static final String MODID = "examplemod";
// ...
}

@Mod(ExampleMod.MODID):这是标识模组入口的核心注解。NeoForge 在加载模组时,会找到这个注解所在的类,并实例化它。

MODID:你的模组唯一标识符,它必须和 META-INF/neoforge.mods.toml 文件里定义的一致。

3. 模组的注册中心#
public static final DeferredRegister.Blocks BLOCKS = DeferredRegister.createBlocks(MODID);
public static final DeferredRegister.Items ITEMS = DeferredRegister.createItems(MODID);
// ...
public static final DeferredBlock<Block> EXAMPLE_BLOCK = BLOCKS.registerSimpleBlock(...);
public static final DeferredItem<Item> EXAMPLE_ITEM = ITEMS.registerSimpleItem(...);

这是模板里最核心的部分:

DeferredRegister:这是 NeoForge 推荐的延迟注册机制。它的好处是,你可以先定义好你想要添加的方块和物品,等 Minecraft 准备好后,再统一注册。

BLOCKSITEMSCREATIVE_MODE_TABS:分别为你的方块、物品、创造模式标签页创建了“注册器”。

EXAMPLE_BLOCKEXAMPLE_ITEM:这些都是模板生成的示例,你可以把它们替换成你自己的方块和物品。

4. 构造函数#
public ExampleMod(IEventBus modEventBus, ModContainer modContainer) {
BLOCKS.register(modEventBus);
ITEMS.register(modEventBus);
// ...
modEventBus.addListener(this::commonSetup);
NeoForge.EVENT_BUS.register(this);
// ...
}

这是模组加载时执行的第一个方法。

它把之前定义的 BLOCKSITEMS 等注册器挂载到事件总线上,让它们生效。

modEventBus.addListener(this::commonSetup); 这一行,就是在“注册” commonSetup 这个方法,让它在模组初始化阶段被调用。

5. 事件记录#
private void commonSetup(FMLCommonSetupEvent event) {
LOGGER.info("HELLO FROM COMMON SETUP");
// ...
}
@SubscribeEvent
public void onServerStarting(ServerStartingEvent event) {
LOGGER.info("HELLO from server starting");
}

这里演示了事件监听的两种方式:

在构造方法中通过 modEventBus.addListener 添加。

在方法上使用 @SubscribeEvent 注解,由事件总线自动发现。

这些日志可以在控制台看到,方便你调试。

4. 那么,来实现第一个功能吧#

就从最简单的事情下手吧!在玩家进入世界时发送 Hello World!

模板已经了解完了,先从新建一个包,把自己的功能独立出来吧。

删除原有的 example 的包体。而后新建一个属于自己的包,这次就叫它 helloworld 好了。

Terminal window
mkdir src/main/java/com/helloworld
touch HelloWorld.java
touch ModEvents.java

将模组的主入口写在 HelloWorld 的类里,而后使用其它类定义模组的事件、监听与处理等。那么接下来就完成主入口与第一条事件的写法吧!

HelloWorld.java#
package com.helloworld;
import net.neoforged.bus.api.IEventBus;
import net.neoforged.fml.common.Mod;
@Mod(HelloWorld.MODID)
public class HelloWorld {
public static final String MODID = "helloworld";
public HelloWorld(IEventBus modEventBus) {
// 模组初始化——目前不需要额外操作
}
}
ModEvents.java#
package com.example.helloworld;
import net.minecraft.network.chat.Component;
import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.fml.common.EventBusSubscriber;
import net.neoforged.neoforge.event.entity.player.PlayerEvent;
@EventBusSubscriber(modid = HelloWorldMod.MODID)
public class ModEvents {
@SubscribeEvent
public static void onPlayerLogin(PlayerEvent.PlayerLoggedInEvent event) {
event.getEntity().sendSystemMessage(Component.literal("Hello World!"));
}
}

最后,不要忘记了修改 META-INF 对于 modid 的定义,由于已经将其修改为 helloworld,所以别忘了一并更新:

Terminal window
modId = "helloworld"
version = "1.0.0"
displayName = "Hello World Mod"
description = "进入世界时在聊天栏发送 Hello World!"

那么最后,编译运行吧!

5. 第二个功能#

第一个功能实现了,那么接下来尝试添加一个创造模式的标签栏吧!

首先,需要在主类中添加一个DeferredRegister来注册创造模式标签页。同时,为了让标签页有内容,可以先添加一个占位物品。

package com.helloworld;
import net.minecraft.core.registries.Registries;
import net.minecraft.network.chat.Component;
import net.minecraft.world.item.CreativeModeTab;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
import net.neoforged.bus.api.IEventBus;
import net.neoforged.fml.common.Mod;
import net.neoforged.neoforge.registries.DeferredRegister;
@Mod(HelloWorldMod.MODID)
public class HelloWorld {
public static final String MODID = "helloworld";
// 使用 Registries 的注册器
public static final DeferredRegister<CreativeModeTab> CREATIVE_TABS =
DeferredRegister.create(Registries.CREATIVE_MODE_TAB, MODID);
// 注册一个标签页,暂时使用原版物品作为图标
public static final DeferredHolder<CreativeModeTab, CreativeModeTab> EXAMPLE_TAB =
CREATIVE_TABS.register("example_tab", () -> CreativeModeTab.builder()
.title(Component.translatable("springtsuki.tab"))
.icon(() -> new ItemStack(Items.DIAMOND))
.displayItems((parameters, output) -> {
output.accept(Items.COBBLESTONE);
output.accept(Items.OAK_PLANKS);
})
.build());
public HelloWorld(IEventBus modEventBus) {
// 注册创造模式物品栏
CREATIVE_TABS.register(modEventBus);
}
}

以及,不要忘记了在资源(assest)中注册文本(lang)哦!

resources/assets/helloworld/lang/zh_cn.json
{
"springtsuki.tab": "Hello World"
}

那么一切就准备就绪了!运行启动吧!

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!

打赏
Java 路线与后续安排
https://springtsuki.xucjno.com/posts/springtsuki/notes/java/2026/87-1/
作者
SpringTsuki
发布于
2026-08-07
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
SpringTsuki
你好,我是浅月。
公告
浅月的开发小窝!欢迎你来到这里!
音乐
封面

音乐

暂未播放

0:000:00
暂无歌词
分类
标签
站点统计
文章
17
分类
8
标签
16
总字数
19,430
运行时长
0
最后活动
0 天前
站点信息
构建平台
GitHub Actions
博客版本
Firefly v6.13.5
文章许可
CC BY-NC-SA 4.0

文章目录