本篇教程由作者设定未经允许禁止转载。

前言

对于拥有制作一个优秀整合包愿望的有志作者,crt的力量终究是有限的;因此,如果要想对模组进行较为深度的魔改,对模组间的联动动手,mcr显然难以满足你的需求,那么你可能需要编写模组来实现效果。

所以在这个教程里,我作为一个刚刚学会mod开发的新人,以新手的视角总结了自己在学习模组开发过程中的经验,希望这能对你的魔改之路有所帮助,也希望能结识更多志同道合的朋友一起交流。

那么,让我们开始吧!

补充:我没细说的问题,你大都能从百度和b站上找到答案,但如果你连这种动动手指去寻找答案都懒得去做的话,那基本你就可以洗洗睡了,开发模组不适合你,自己一边玩去

首先,我们需要构建一个带mixin的1.12.2Forge开发环境

为此,你需要做四件事

第一

下载java8的开发软件包(JDK)这里是下载地址(当然你还需要注册一个Oracle账号来下载)Java Downloads | Oracle 中国如何搭建带mixin的1.12.2Forge开发环境并为匠魂2编写模组(1)-第1张图片

你要下载的是这个打横线的64位文件,然后接下来的安装步骤我就不多说了,B站上的java教程很多。


第二

去Forge官网下载1.12.2的最新mdk文件Downloads for Minecraft Forge for Minecraft 1.12.2

如何搭建带mixin的1.12.2Forge开发环境并为匠魂2编写模组(1)-第2张图片以及你将要用到的开发工具idea下载 IntelliJ IDEA – 领先的 Java 和 Kotlin IDE (jetbrains.com.cn)

如果你是大学生的话,可以用学校为你们注册的学生邮箱申请学生许可证,没有的话用下面的社区版也行,至于idea的安装和汉化请详见b站


第三

正式搭建和调试开发环境(适用于win11)

先搞定jdk的配置:系统属性——高级系统设置——环境变量——新建系统变量

变量名:GRADLE_OPTS

变量值:-Dfile.encoding=utf-8

变量名:JAVA_HOME

变量值:C:\Program Files\Java\jdk1.8.0_251其值为你安装的JDK的所在位置。

编辑Path变量,新建添加一个环境变量:      %JAVA_HOME%\bin

现在打开控制台(右击打开任意一个文件夹,在弹出的菜单中选择“在终端中打开”),然后输入javac -version

如果出现javac 1.8.0_xxx的字样,则说明安装成功了,否则说明你在前面某个步骤出现了问题。

接下来就是处理之前下载好的mdk了

下载后的文件名应该是forge-1.12.2 - 14.23.5.2860-mdk.zip, 把该下载文件中的所有内容解压到一个你想要作为主开发目录的文件夹下

这里对于主开发目录有一点建议,就是这个目录的绝对路径不要出现非ASCII字符,不要出现空格,同时目录名尽量只使用英文字母、数字和下画线。不满足这些条件的目录,有可能会导致难以预知的编译问题

解压完成后,使用已经安装好的idea打开这个文件夹中的build.gradle文件如果你看不到.***的这团东西那是因为win11默认不展示扩展名,至于解决方法请自行百度,并选择作为项目打开,那么idea就会自行加载配置好项目文件,你只需等待即可如果加载太慢,那是网络问题,除了多次尝试也可以花钱购买VPN进行加速  ,话说到这个我觉得有必要提醒一下,我之所以使用.2860这个版本的mdk,是因为它使用了新版本的gradle,可以在新版本的idea上运行(新版本有中文插件对你们好些),而且这个版本已经删去了./gradlew.bat setupDecompWorkspace的环境构建命令,不要试图乱套用那些老的开发教程,构建只需要项目打开build.gradle文件就行

然后你需要为项目指定开发使用的JDK和文件编码

选择文件——项目结构,将SDK设置为1.8

如何搭建带mixin的1.12.2Forge开发环境并为匠魂2编写模组(1)-第3张图片文件——设置——编辑器——文件编码,将所有编码格式都设置为UTF-8

如何搭建带mixin的1.12.2Forge开发环境并为匠魂2编写模组(1)-第4张图片然后关键的来了,有很多教程都会忽略的一点就是要记得用记事本打开gradlew.bat文件,修改它的JVM指定的编码格式为UTF-8,就像这样

如何搭建带mixin的1.12.2Forge开发环境并为匠魂2编写模组(1)-第5张图片防止某些人在完成模组后试图导出jar文件时编译失败(当然这是小部分特殊情况,保险起见可以做)

这样你的基础环境就基本安装完成了

第四

为安装好的开发环境添加模组依赖以及引导Mixin虽然新手可能不太会用到Mixin,但折腾这个确实麻烦就不让你们以后受折磨了

添加模组依赖

首先在项目文件夹下新建一个libs文件夹,就像这样

如何搭建带mixin的1.12.2Forge开发环境并为匠魂2编写模组(1)-第6张图片然后下载你想添加模组依赖的模组,将它的jar文件放进libs文件夹里

如何搭建带mixin的1.12.2Forge开发环境并为匠魂2编写模组(1)-第7张图片

接下来打开build.gradle文件,按照compile files('libs/****模组文件名.jar')的格式添加

dependencies {
    // Specify the version of Minecraft to use, If this is any group other then 'net.minecraft' it is assumed
    // that the dep is a ForgeGradle 'patcher' dependency. And it's patches will be applied.
    // The userdev artifact is a special name and will get all sorts of transformations applied to it.
    minecraft 'net.minecraftforge:forge:1.12.2-14.23.5.2860'

    //implementation fg.deobf("zone.rong:mixinbooter:${mixinbooter_version}")
    //annotationProcessor 'org.spongepowered:mixin:0.8.5:processor'

    compile files('libs/[辅助][地幔]Mantle-1.3.3.55.jar')
    compile files('libs/[匠魂][匠魂2]TConstruct-2.13.0.183.jar')
    compile files('libs/[匠魂][匠魂兵工厂]conarm-1.2.5.9.jar')
    compile files('libs/[伤害显示] torohealth-1.12.2-11.jar')
    compile files('libs/[匠魂][匠魂悠悠]yoyos_1.12.2-1.3.3.25.jar')
    compile files('libs/【psi】Psi-r1.1-78.2.jar')
    compile files('libs/[内容][夸克前置]AutoRegLib-1.3-32.jar')
    compile files('libs/!mixinbooter-8.3.jar')
    // You may put jars on which you depend on in ./libs or you may define them like so..
    // compile "some.group:artifact:version:classifier"
    // compile "some.group:artifact:version"

    // Real examples
    // compile 'com.mod-buildcraft:buildcraft:6.0.8:dev'  // adds buildcraft to the dev env
    // compile 'com.googlecode.efficient-java-matrix-library:ejml:0.24' // adds ejml to the dev env

    // The 'provided' configuration is for optional dependencies that exist at compile-time but might not at runtime.
    // provided 'com.mod-buildcraft:buildcraft:6.0.8:dev'

    // These dependencies get remapped to your current MCP mappings
    // deobf 'com.mod-buildcraft:buildcraft:6.0.8:dev'

    // For more info...
    // http://www.gradle.org/docs/current/userguide/artifact_dependencies_tutorial.html
    // http://www.gradle.org/docs/current/userguide/dependency_management.html

}


引导Mixin(非必要)后面是Mixin的开发文档,想学可以看看5 Mixin - CoreModTutor (gitbook.io)

我十分推荐使用MixinBooter来简化Mixin的引导过程,具体操作如下

首先是buildscript这一段,改成如下这样

buildscript {
    repositories {
        maven { url = 'https://maven.minecraftforge.net/'}
        maven { url = 'https://repo.spongepowered.org/maven' }
        mavenCentral()
    }
    dependencies {
        classpath 'net.minecraftforge.gradle:ForgeGradle:3.+'
        classpath 'org.spongepowered:mixingradle:0.7-SNAPSHOT'
    }
}

然后是这一段

apply plugin: 'net.minecraftforge.gradle'
// Only edit below this line, the above code adds and enables the necessary things for Forge to be setup.
apply plugin: 'eclipse'
apply plugin: 'maven-publish'

在其末尾加上

apply plugin: 'org.spongepowered.mixin'

接下来把下面这段放到  jar {...}这堆东西之前就行

mixin {
    //把parasitic_technology_mixin_affiliation换成你自己modid就行
    add sourceSets.main, "mixins.parasitic_technology_mixin_affiliation.refmap.json"
}
repositories {
    maven { url = "https://repo.spongepowered.org/maven" }
}

完成build.gradle的mixin配置后就在resources文件夹下新建mixins.parasitic_technology_mixin_affiliation这里换成你的modID.json文件

如何搭建带mixin的1.12.2Forge开发环境并为匠魂2编写模组(1)-第8张图片

内容一般为

{
  "required": true,
  "compatibilityLevel": "JAVA_8",
  "package": "com.cszxymzx.parasitictechnologymixinaffiliation.Mixin",//填你的mod主类所在的包名
  "minVersion": "0.8",
  "setSourceFile": true,
  "priority": 0,
  "refmap": "mixins.parasitic_technology_mixin_affiliation.refmap.json",//把parasitic_technology_mixin_affiliation换成你的modID
  "mixins": [
    "CommonProxyMixin"//这里填入的是你在客户端和服务端都要mixin的mixin类名,不过你现在还没mixin不用填
  ],
  "client": [
    "ClientProxyMixin"//这里填入的是你只在客户端要mixin的mixin类名,不过你现在还没mixin不用填
  ]
  "server": [
   //这里填入的是你只在服务端要mixin的mixin类名,不过你现在还没mixin不用填
  ],
}

最后在完成上面操作重新构筑一下,将刚才的更改应用后,环境搭建就完成了

如果做了mixin的话还需要你新建一个java类把这段东西写进去才算完成引导

@MixinLoader
public class MixinInit {
    public MixinInit(){
        Mixins.addConfiguration("mixins.parasitic_technology_mixin_affiliation.json");//把parasitic_technology_mixin_affiliation换成你的modID
    }
}

至于后面的编写模组内容我先看看反馈如何,好的话我就加快写()