问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

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
  }
}
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号