Minecraft Forge模组开发入门教程
创作时间:
作者:
@小白创作中心
Minecraft Forge模组开发入门教程
引用
1
来源
1.
https://www.mcmod.cn/post/3853.html
本文将详细介绍如何使用Forge在Minecraft中开发模组。文章将使用IntelliJ IDEA作为开发工具,通过创建一个简单的NoFall功能模组,帮助读者了解模组开发的基本流程和关键步骤。
项目的构建与运行
首先需要打开IntelliJ IDEA的插件页面,搜索并安装Minecraft Development插件,然后重启IDEA。
重启后,点击新建项目,选择生成器Minecraft,然后依次选择Mod、Forge、1.18.1。在高级配置中,可以设置模组简介、作者、网址和更新地址等信息(可选)。
创建项目并等待构建。如果项目构建失败或构建速度太慢,可以使用DevSidecar加速构建。构建完成后,可能会对com.mojang.logging.LogUtils进行报错,这时只需将报错的文件中的内容删除成以下形式:
package cn.ksmcbrigade.em;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.fml.common.Mod;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@Mod("em")
public class ExampleMod {
private static Logger LOGGER = LogManager.getLogger();
public ExampleMod() {
MinecraftForge.EVENT_BUS.register(this);
}
}
然后在IDEA右侧的Gradle面板中,依次打开Tasks、forgegradle runs,最后点击RunClient即可启动游戏。
简易功能实现
接下来以NoFall功能为例,介绍如何实现一个简单的模组功能。
首先需要注册玩家刻事件:
package cn.ksmcbrigade.em;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.event.TickEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@Mod("em")
@Mod.EventBusSubscriber
public class ExampleMod {
private static Logger LOGGER = LogManager.getLogger();
public ExampleMod() {
MinecraftForge.EVENT_BUS.register(this);
}
@SubscribeEvent
public void PlayerTick(TickEvent.PlayerTickEvent event) {
}
}
接下来实现NoFall功能。在PlayerTick事件中判断玩家摔落高度是否大于等于3,若大于则发送OnGround数据包以重置摔落高度:
@SubscribeEvent
public void PlayerTick(TickEvent.PlayerTickEvent event) {
if(event.player.fallDistance >= 3) {
ClientPacketListener connection = Minecraft.getInstance().getConnection();
if(connection != null) {
connection.getConnection().send(new ServerboundMovePlayerPacket.StatusOnly(true));
}
}
}
最后再次运行RunClient进行测试是否成功。以下是完整代码:
package cn.ksmcbrigade.em;
import net.minecraft.client.Minecraft;
import net.minecraft.client.multiplayer.ClientPacketListener;
import net.minecraft.network.protocol.game.ServerboundMovePlayerPacket;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.event.TickEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@Mod("em")
@Mod.EventBusSubscriber
public class ExampleMod {
private static Logger LOGGER = LogManager.getLogger();
public ExampleMod() {
MinecraftForge.EVENT_BUS.register(this);
}
@SubscribeEvent
public void PlayerTick(TickEvent.PlayerTickEvent event) {
if(event.player.fallDistance >= 3) {
ClientPacketListener connection = Minecraft.getInstance().getConnection();
if(connection != null) {
connection.getConnection().send(new ServerboundMovePlayerPacket.StatusOnly(true));
}
}
}
}
其他文件说明
mods.toml
这是一个示例mods.toml文件,包含了加载模组的相关数据。以下是文件的主要内容:
# 这是一个示例mods.toml文件。它包含了加载模组的相关数据。
# 有几个必填字段(#mandatory),还有很多可选字段(#optional)。
# 整体格式是标准的TOML格式,v0.5.0。
# 注意这个文件中有一些TOML列表。
# 更多关于TOML格式的信息,请访问:https://github.com/toml-lang/toml
# 模组加载器的类型名称 - 对于常规的FML @Mod模组,应该是javafml
modLoader = "javafml" #mandatory
# 模组加载器的版本范围 - 对于常规的FML @Mod,将是forge版本
loaderVersion = "${loader_version_range}" #mandatory 这通常在每次Minecraft版本更新时由Forge更新。请查看我们的下载页面获取版本列表。
# 模组的许可证。这是一个必填的元数据,允许更容易地理解你的再分发属性。
# 请访问https://choosealicense.com/查看你的选项。所有权利保留是默认的版权立场,因此这里也是默认值。
license = "${mod_license}"
# 模组所使用的开源协议
# 当出现与该模组相关的问题时,指向人们查询的URL
#issueTrackerURL="https://change.me.to.your.issue.tracker.example.invalid/" #optional
# 一个模组列表 - 允许的数量由各个模组加载器决定
[[mods]] #mandatory
# 模组的modid
modId = "${mod_id}" #mandatory
# 模组版本
version = "${mod_version}" #mandatory
# 模组的显示名称
displayName = "${mod_name}" #mandatory
# 用于查询该模组更新的URL。请查看JSON更新规范:https://docs.minecraftforge.net/en/latest/misc/updatechecker/
#updateJSONURL="https://change.me.example.invalid/updates.json" #optional
# 显示在模组UI中的"主页"URL
#displayURL="https://change.me.to.your.mods.homepage.example.invalid/" #optional
# 一个文件名(在模组JAR的根目录中),包含在模组详细页面显示的logo
#logoFile="em.png" #optional
# 模组详细页面显示的图片
# 显示在模组UI中的文本字段
#credits="Thanks for this example mod goes to Java" #optional
# 显示在模组UI中的文本字段
authors = "${mod_authors}" #optional
# 模组作者
# 模组的描述文本(多行!)(#mandatory)
description = '''${mod_description}'''
# 模组简绍
# 一个依赖项 - 使用.来表示对特定modid的依赖。依赖项是可选的。
[[dependencies.${ mod_id }]] #optional
# 依赖项的modid
modId = "forge" #mandatory
# 这个依赖项是否必须存在 - 如果不是,下面的排序必须指定
mandatory = true #mandatory
# 依赖项的版本范围
versionRange = "${forge_version_range}" #mandatory
# 模组所需的Forge版本
# 模组的加载顺序
# BEFORE - 提前加载
# AFTER - 最后加载
ordering = "NONE"
# 依赖项应用的边 - BOTH, CLIENT, 或 SERVER
#BOTH 服务器和客户端都要加
#CLIENT 仅客户端需要,比如以上的NoFall就只需要CLIENT即可实现。
#SERVER 仅服务器需要
side = "CLIENT"
# Here's another dependency
[[dependencies.${ mod_id }]]
modId = "minecraft"
mandatory = true
# 这个版本范围声明了从当前minecraft版本到但不包括下一个主要版本的最小版本
versionRange = "${minecraft_version_range}"
# 模组所需的游戏版本
ordering = "NONE"
side = "BOTH"
modid.mixins.json
这是一个示例modid.mixins.json文件,包含了mixin配置的相关数据。以下是文件的主要内容:
{
"required": true,
"minVersion": "0.8",
"package": "cn.ksmcbrigade.em.mixin",
"compatibilityLevel": "JAVA_8",
"refmap": "modid.refmap.json",
"mixins": [
],
"client": [
],
"injectors": {
"defaultRequire": 1
}
}
热门推荐
紫微斗数四化:命理学中的重要概念
如何妥善存储书籍以保持其完好无损?
女人为什么要嫁人:探索女性婚姻选择的多元视角
为何古代政权后期,往往只有斩杀贪官才能避免政权倾覆?
哪里可以查询到最新的工伤待遇政策?
警惕健康误区:科学饮食与健康生活
利尿药对肾脏的副作用和影响
财务核算制度的内容包括哪些
40岁男性全方位健康指南:科学运动与营养策略助你保持活力
IAEA工作组发布第二份报告:福岛核废水排放符合国际安全标准
草莓和酸奶能一起吃吗
浙江省委机关报连发“两问”,探究创新创业的“浙大现象”
痛经的治疗方法有哪些?热敷按摩都是止痛良方
这5本经典名著建议多读
驾驶证怎么合并
与腕关节有关的 5 种疼痛综合征
项羽:英勇与悲剧交织的西楚霸王
实战图解 | 如何画好支撑线,新手必看
果酒保质期要求
堆内存管理详解:从堆块到低碎片堆(LFH)
美术生在家自学绘画需要注意的事项
忘却的艺术:如何优雅地放下一段感情
四款Steam独立游戏推荐:冒险、艺术和情感体验的极致佳作
关于1到5维空间的解释,尤其是五维空间的存在性与特殊性
杨瀚森:从CBA到NBA,中国篮球新星崭露头角
中国历史上十大著名女诗人:文学史上的璀璨星辰
如何成为成功的自媒体时尚博主?
塑胶篮球场每平方米价格
3亿汉人被300万满清八旗,统治了276年,为何不反抗?
轮胎鼓包大揭秘:你的安全行驶暗藏危机!汽车必备安全知识!