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
}
}
热门推荐
如何通过数字化转型为新型电商赋能
车与车之间怎样正确搭电?车和车搭电时有哪些安全事项?
喜用神为金戴什么好的全面指南
苹果手机垃圾清理攻略:全面优化存储与性能
深圳国家动漫画产业基地焕新升级,数字文化产业迎来新机遇
2024正常家庭一个月燃气费多少?洗澡30分钟用多少天然气?
双鸭山至榆树自驾攻略:6.8小时穿越东北雪原
乌龙茶的佼佼者——铁观音:量重如铁,形如观音,品味非凡
掌握六大茶的科学冲泡法及最佳饮用时机,提升品茗体验
茶食|喝茶怎么能少的了好的茶点
2025年除夕:连续五年都是“大年二十九”,这些传统习俗你知道吗?
暗示的深层含义与生活中的重要性探讨
自动挡车主必看!这6个操作误区,别让爱车提前“退休”
P档和N档怎样正确使用?使用时如何避免操作失误?
仙桃一条鱼,“游出”新质生产力
MBTI帮你找到最适合的学习style!
MBTI性格测试:如何在职场中实现高效沟通?
企业如何精细化监控与持续改进在线客服服务质量
使用八字排盘工具发掘核心性格特质
夫妻沟通小妙招:让婚姻更甜蜜!
喝对了酸奶,养生也能很有趣!
喝酸奶能减肥?真相在这里!
酮替芬是治疗过敏性鼻炎,支气管哮喘的药物,能当安眠药使用吗?
《全球开源生态洞察报告(2024年)》正式发布
面对婚姻危机,律师教你如何应对?
学会温柔表达,沟通不再伤人——《非暴力沟通》的智慧
为何挠痒感觉舒服:挠痒对免疫系统的益处
全鳞大鲳价格每斤超千元?宁波市场上的海鲜啥价位了?
为何不建议食用“野生大海鳗”?专家解读鳗鱼食用安全指南
如何让你的短视频头像吸粉无数?