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
}
}
热门推荐
突发!四川都江堰发生3.4级地震 地震成因是什么?应该如何预防?
文博场馆“正青春”,多地融合数字技术打造“活起来”的沉浸式文博空间
墙面瓷砖空鼓和开裂的原因分析及广东瓷砖品牌优势
如何查看一个模块的源码
每天极端通勤的人,在经历怎样的人生
太子参的功效与作用:传统应用与现代研究
奶油知识知多少?从选购到食用全攻略
牛奶奶油和乳脂奶油的区别
女人湿热重怎么调理?饮食调整:清热利湿,从口入手
民法实践课教案:理论与实践相结合的教学创新
深度剖析美国个人所得税:税率、优惠与应纳税额计算
AI怎么+?去年十余省份出AI专项政策,频提教育医疗场景
南迁汉人一脉分两支:潮汕人与客家人
带鱼已经可以大量人工养殖
关于白蛋白的知识,你需要明明白白?
如何在日常生活中保护腰椎?
2025年餐饮业更难做吗(2025年餐饮业:挑战与机遇并存)
数字图像基本参数详解
夫妻经常吵架怎么办?四个实用沟通技巧帮你改善关系
连续与可导:数学分析的核心概念与应用
养老金申领手续谁来办?何时领?发放信息哪里查?即将退休,这些社保知识需了解→
教育背景中专业方向怎么强调
建筑安装工程费计算方法详解:单价法与实物量法
家居环境风水如何开运呢
豆芽可以冷冻保存吗(探究豆芽的冷冻保存方法及注意事项)
用手机拍摄白桦树的技巧与灵感分享
拍摄白桦林利用光线和阴影来营造氛围
百度公关副总裁言论引发争议,企业高管言论边界再成热议
让二次入伍的新兵,更有作为!
为什么有人要去二次入伍?二次入伍更容易转军士吗?