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
}
}
热门推荐
鼻子总是堵塞呼吸不畅太难受,6个方法帮你“通通气”!
巴音郭楞州健康饮食与家庭保健的实用小窍门和方法
正月初七各地都吃啥 传统美食庆人日
道路安全意识提升:减少交通事故的关键措施
安全驾驶培训中应包含哪些关键内容?
圆明园遗址的数字重生:《梦回圆明园》项目揭秘
菠菜鸡蛋汤的家常做法,这样做最好喝,鸡蛋不散花菠菜不发涩
春天多给家人吃些菠菜,有5种健康好处
如何通过汽车标志判断汽车品牌的档次?
探索50款汽车品牌的标志含义
《蛟龙行动》机械狗引发争议:艺术创作与现实技术的差距
全科医学科唐宽晓详解"一站式"诊疗优势
牙龈上长脓包是怎么回事?牙龈炎/牙周炎/根尖周炎都有可能~不会自愈!一定要警惕!
牙周病(牙龈)--它是什么,如何治疗?
低体温?这些饮食习惯帮你升温!
盘点《权力的游戏》剧中出现过的几把瓦雷利亚钢剑及拥有者
电动汽车排放真相:行驶过程零排放,污染来自制造和回收环节
八大关摄影攻略:如何拍出绝美青岛照
秋日打卡:青岛崂山&金沙滩美景不容错过!
青岩寺歪脖老母:千年灵验传说揭秘
厦门最美公园榜单出炉!
急性阑尾炎怎么回事?如何治疗?预防记住3点!
“血常规”怎样能突破常规?《自然》新进展
春节餐饮市场活力涌动!年夜饭线上预订量涨超3倍
《唐砖VR》:你最爱的唐朝角色是谁?
《唐砖VR》揭秘:李世民时代的唐朝生活
《唐砖VR》:王天辰带你穿越大唐
宁古塔:从边疆重镇到文旅新地标
书法中的“古今字”,你真的懂吗?
五月天25周年:从台北到拉斯维加斯的音乐旅程