MC Forge 开发笔记00-准备工作

提醒

在开发mod前,首先应该知道要实现的功能是否需要一个mod来解决。

  • 一部分简单的逻辑,或者修改合成配方,用数据包即可。

  • 如果只是修改模型、贴图、语言文件,用资源包(材质包)即可。

排除上面的情况之后,就要正式开始制作mod了!

准备工作

编程相关

作为mod开发者,需要一定的Java/Kotlin基础。

当然,编程语言基本都是互通的,所以有其它语言的基础也会有很大帮助没有也没太大关系

只要你有举一反三复制粘贴看懂单词的能力,开发mod也不是什么难事。

软件下载

开发Java/Kotlin的工具,首先推荐Intellij Idea。个人开发者推荐使用社区版(Community)或者使用一些破解工具

下载并安装完成后,打开Idea,在左边找到Plugins,下载Minecraft Development插件。

在同样的位置,可以找到官方支持的简体中文插件。为了保持统一,这里的图片中不使用这些插件(如果下载了也可以根据位置对照)。

创建mod项目

  • 首先创建项目(New Project),根据以下提示填写基本信息。

    创建项目示例图片

    由上到下:

    • Name:项目名称,一般为Mod名称。
    • Minecraft Version:Mod对应的Minecraft版本。
    • Forge Version:Mod对应的Forge版本。
    • Mod Id:由数字(0~9),字母(大小写),下划线(_)组成,在游戏内按下F3+H可以看到每个物品对应的Mod ID(例如,泥土minecraft:dirt对应minecraft,机械手create:deployer对应create),一个Mod ID只能对应一个mod。
    • Mod Name:Mod名称,可随意指定。
    • Main Class:Mod的入口(主类),我的习惯是设置为Main。其中,com.example_domain是域名的倒置,命名规则和Mod ID一致。com.example_domain.example_mod包名Main类名

    注意:如果要修改原版的代码(通常需要),可以提前勾选上Mixin。

  • 等待构建完成,如果构建失败可以使用镜像源,具体见镜像配置

  • 删除Config.java和Mod主类中多余的内容,稍作修改之后:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    package com.example_domain.example_mod;

    import com.mojang.logging.LogUtils;
    import net.minecraftforge.fml.common.Mod;
    import org.slf4j.Logger;

    // The value here should match an entry in the META-INF/mods.toml file
    @Mod(Main.MOD_ID)
    public class Main {

    // Define mod id in a common place for everything to reference
    public static final String MOD_ID = "example_mod";
    // Directly reference a slf4j logger
    public static final Logger LOGGER = LogUtils.getLogger();
    }

    代码部分的详细解释见代码解释部分。

操作

  • 运行客户端:选择runClient
  • 运行服务端:选择runServer(通常不会选)。
  • 导出为Jar文件:在右边的Gradle中,依次选择Tasks->build->build,等待之后在左边文件夹build/libs中可以找到Mod的jar文件。
  • 修改mod版本:在gradle.properties中找到mod_version,修改即可。切忌把版本号改小!

完成

至此,一个Minecraft Mod项目就制作完毕了。

虽然目前这个Mod还没有任何功能,但是已经可以改变这个世界的一切了,不是吗?

代码解释

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package com.example_domain.example_mod;

import com.mojang.logging.LogUtils;
import net.minecraftforge.fml.common.Mod;
import org.slf4j.Logger;

// The value here should match an entry in the META-INF/mods.toml file
@Mod(Main.MOD_ID)
public class Main {

// Define mod id in a common place for everything to reference
public static final String MOD_ID = "example_mod";
// Directly reference a slf4j logger
public static final Logger LOGGER = LogUtils.getLogger();
}

每条语句之后要有分号!!!

逐行:

  • package之后的内容和包名保持一致。

  • import暂时不用关注。

  • @Mod(string)@Mod注解,放在类的定义之前,表示下面的类是Mod主类,string是Mod ID。

  • public class Main:定义一个类,Main与上面的类名保持一致,大括号中是这个类的内容。它会被上一行标记为Mod主类

  • public static final String MOD_ID:定义一个变量,它具有如下性质:

    • public:在任何地方都可以访问。

    • static:不需要创建一个对象(实例化),使用类名.变量名的方式就可以访问(如Main.MOD_ID) 。

    • final:变量不可以被修改(常量)。

    • String:变量的类型为字符串(可以理解为一堆字就是字符串)。每个变量都要有类型,以下是常用的类型:

      • int:整型,存放整数。
      • float:浮点型(可以理解为小数)。
      • double:双精度浮点型,比float更精确。
      • String:字符串。
    • MOD_ID:表示这个变量的名称为MOD_ID

  • "example_mod":表示一个字符串,所有的字符串都要使用双引号。

  • LOGGER:日志记录器。可以很方便的调试程序,分不同的等级,常用的有infoerrordebug。用法:LOGGER.info(string),string表示日志输出的内容(字符串)。

  • //后表示注释,给人看的东西,随便写其实很少有人写

吐槽

怎么一不小心写了这么多…?