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. 包的声明与导入:
路径:/src/main/java/com.example.examplemod/ExampleMod.javapackage:这是你的模组代码所在包。你可以把它改成你自己的包名,比如 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 准备好后,再统一注册。
BLOCKS、ITEMS、CREATIVE_MODE_TABS:分别为你的方块、物品、创造模式标签页创建了“注册器”。
EXAMPLE_BLOCK、EXAMPLE_ITEM:这些都是模板生成的示例,你可以把它们替换成你自己的方块和物品。
4. 构造函数
public ExampleMod(IEventBus modEventBus, ModContainer modContainer) { BLOCKS.register(modEventBus); ITEMS.register(modEventBus); // ... modEventBus.addListener(this::commonSetup); NeoForge.EVENT_BUS.register(this); // ...}这是模组加载时执行的第一个方法。
它把之前定义的 BLOCKS、ITEMS 等注册器挂载到事件总线上,让它们生效。
modEventBus.addListener(this::commonSetup); 这一行,就是在“注册” commonSetup 这个方法,让它在模组初始化阶段被调用。
5. 事件记录
private void commonSetup(FMLCommonSetupEvent event) { LOGGER.info("HELLO FROM COMMON SETUP"); // ...}
@SubscribeEventpublic void onServerStarting(ServerStartingEvent event) { LOGGER.info("HELLO from server starting");}这里演示了事件监听的两种方式:
在构造方法中通过 modEventBus.addListener 添加。
在方法上使用 @SubscribeEvent 注解,由事件总线自动发现。
这些日志可以在控制台看到,方便你调试。
4. 那么,来实现第一个功能吧
就从最简单的事情下手吧!在玩家进入世界时发送 Hello World!
模板已经了解完了,先从新建一个包,把自己的功能独立出来吧。
删除原有的 example 的包体。而后新建一个属于自己的包,这次就叫它 helloworld 好了。
mkdir src/main/java/com/helloworldtouch HelloWorld.javatouch 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,所以别忘了一并更新:
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)哦!
{ "springtsuki.tab": "Hello World"}那么一切就准备就绪了!运行启动吧!
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!













