为 Architectury 添加 Kotlin 支持并将 Forge 和 Mojang 映射替换成 NeoForge 和 Yarn

可能不准哦, 这个很老了哦!

感谢 Coder2(Jack253-png) 为我的项目迁移提供大量帮助 (≧∀≦)ゞ

啊, 没错, 为了搞定这个问题, 我又搞了一个月 =D

开始之前......

  • 你需要确保你使用的是 IntelliJ IDEA 而不是 Visual Studio Code 或其它编辑器, 只是因为迁移需要用到 IntelliJ IDEA 的一些功能。但是如果你仅是想要使用 NeoForge, 你可以使用任意一个编辑器 (记事本除外😡)
  • 你需要确保你的 Minecraft 版本是 1.20.2+, 如果你要使用 NeoForge 的话.
  • 你需要确保你的项目的 Architectury Loom 版本是 1.4+, 如果你要使用 NeoForge 的话.
  • 没了(

Rwagsu 的项目环境.....

为项目添加(或将 Forge 替换为) NeoForge 开发环境

升级 Architectury Loom

如果你的 Architectury Loom 版本是 1.4 以下, 你应该把它升级到 1.4 或以上.

更改 settings.gradle

pluginManagement {
    repositories {
        maven { url "https://maven.fabricmc.net/" }
        maven { url "https://maven.architectury.dev/" }
        maven { url "https://maven.minecraftforge.net/" }         maven { url "https://maven.neoforged.net/releases/" }         gradlePluginPortal()
    }
}
plugins {
    id 'org.gradle.toolchains.foojay-resolver-convention' version '0.5.0'
}

include("common")
include("fabric")
include("forge") include("neoforge") 

更改 gradle.properties

org.gradle.jvmargs=-Xmx2048M

minecraft_version=1.20.2
# 你可以选择添加 NeoForge 或者干别的事情, 但是这两个属性你只能保留其中一个.
# 如果你只想要 NeoForge:
enabled_platforms=fabric,neoforge
# 如果你想要 Forge 和 NeoForge 并存:
enabled_platforms=fabric,forge,neoforge

archives_base_name=LearnModApp
mod_version=1.0-ThanksFabric
maven_group=org.rwagsu.learnmodapp

architectury_version=10.1.20

fabric_loader_version=0.15.9
fabric_api_version=0.91.6+1.20.2

forge_version=1.20.2-48.1.0 
neoforge_version=20.2.88 

其中的 neoforge_version 需要按需更改, 你可以在 [https://projects.neoforged.net/neoforged/neoforge](NeoForge 官网) 看到所有NeoForge的版本.

构建项目

构建你的项目, 如果构建成功, 你的项目应该会多出一个 neoforge 的模块.

复制文件

将forge模块中的 src, build.gradle, gradle.properties 复制一份到NeoForge模块中.

更改 neoforge/gradle.properties

loom.platform=forge loom.platform=neoforge 

更改 neoforge/build.gradle

plugins {
    id "com.github.johnrengelman.shadow" version "7.1.2"
}
loom {
    forge {         mixinConfig "modmcmc-common.mixins.json"        mixinConfig "modmcmc.mixins.json"    } }
architectury {
    platformSetupLoomIde()
    forge()     neoForge() }

configurations {
    common
    shadowCommon // Don't use shadow from the shadow plugin since it *excludes* files.
    compileClasspath.extendsFrom common
    runtimeClasspath.extendsFrom common
    developmentForge.extendsFrom common     developmentNeoForge.extendsFrom common }

dependencies {
    forge "net.minecraftforge:forge:${rootProject.forge_version}"    neoForge "net.neoforged:neoforge:${rootProject.neoforge_version}"    // Remove the next line if you don't want to depend on the API
    modApi "dev.architectury:architectury-forge:${rootProject.architectury_version}"    modApi "dev.architectury:architectury-neoforge:${rootProject.architectury_version}"    common(project(path: ":common", configuration: "namedElements")) { transitive false }
    shadowCommon(project(path: ":common", configuration: "transformProductionForge")) { transitive = false }     shadowCommon(project(path: ":common", configuration: "transformProductionNeoForge")) { transitive = false } }

下面其实还有个叫 mavenForge 的东西, 暂时不知道干嘛用的, 你可以自己研究研究(

更改 neoforge/src/main/resources/META-INF/mods.toml

[[dependencies.modmcmc]] #optional
    # the modid of the dependency
    modId="forge" #mandatory    modId="neoforge" #mandatory    # Does this dependency have to exist - if not, ordering below must be specified
    mandatory=true #mandatory
    # The version range of the dependency
    versionRange="[49,)" #mandatory    versionRange="[20,)" #mandatory    # An ordering relationship for the dependency - BEFORE or AFTER required if the  relationship is not mandatory
    ordering="NONE"
    # Side this dependency is applied on - BOTH, CLIENT or SERVER
    side="BOTH"

更改 neoforge 模块

更改 neoforge 模块中的 src/main/java/<你的Mod命名空间>.forge 软件包名为 src/main/java/<你的Mod命名空间>.neoforge, 并将 <Mod名> Forge 改成 <Mod名>NeoForge, 并更改 <Mod名>NeoForge 中的内容.

// 不要忘了更改软件包名!我在这里没有放出是因为每个人的软件包名都不一样.

@Mod(MODMCMC.MOD_ID)
public class MODMCMCForge { public class MODMCMCNeoForge {     public MODMCMCForge() {
        // Submit our event bus to let architectury register our content on the right time
        // 这行代码貌似在NeoForge中无法使用.
        EventBuses.registerModEventBus(MODMCMC.MOD_ID, FMLJavaModLoadingContext.get().getModEventBus());         MODMCMC.init();
    }
}

并且更改 neoforge/src/main/resources/<你的Mod名全小写>.mixins.json 中的内容:

{
  "required": true,
  "minVersion": "0.8",
  "package": "org.starcloudsea.learnmodapp.learnmodapp.forge.mixin",   "package": "org.starcloudsea.learnmodapp.learnmodapp.neoforge.mixin",   "compatibilityLevel": "JAVA_17",
  "mixins": [
  ],
  "client": [
  ],
  "injectors": {
    "defaultRequire": 1
  }
}

构建 mod

构建你的 Mod, 如果没报错且运行成功, 那么你的 NeoForge 就设置完成了! q(≧▽≦q)

删除 Forge 模块 (可选)

然后, 如果你只想要 NeoForge, 那么你就可以删除 Forge 模块了(

为项目添加Kotlin支持

配置 Kotlin

右键 common/src/main/java/<你Mod的命名空间>/LearnModApp.java 文件, 选择 "将 Java 文件转换为 Kotlin 文件".

安装 Kotlin 依赖

修改 fabric/build.gradle

dependencies {
    modImplementation "net.fabricmc:fabric-loader:${rootProject.fabric_loader_version}"
    modApi "net.fabricmc.fabric-api:fabric-api:${rootProject.fabric_api_version}"
    modApi "dev.architectury:architectury-fabric:${rootProject.architectury_version}"
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8"    modImplementation("net.fabricmc:fabric-language-kotlin:<Fabric Language Kotlin版本>+kotlin.<Kotlin版本>")     common(project(path: ":common", configuration: "namedElements")) { transitive false }
    shadowCommon(project(path: ":common", configuration: "transformProductionFabric")) { transitive false }
}

修改 fabric/src/main/resources/fabric.mod.json

{
    // 在我的项目中, 这个键的值默认就是1, 我不知道 Fabric 为什么要把这个东西也算到迁移代码里...... (明明迁移代码除了这个只给出了关键数值)
    // 不过, 我猜测可能有一些例外, 如果你的这个键的值不是1, 你可以考虑将这个值改为1, 如果你的 Fabric 模块没有什么代码或依赖需要用到其它数字.
    "schemaVersion": 1,
    "id": "learnmodapp",
    "version": "${version}",
  
    "name": "LearnModApp",
    "description": "全世界最难的 Json 莫过于 Fabric 和 Kotlin 冲突的 Gson",
    "authors": [],
    "contact": {},
  
    "license": "Apache 2.0",
    "icon": "icon.png",
  
    "environment": "*",
    "entrypoints": {
      "main": [
        "org.starcloudsea.learnmodapp.learnmodapp.fabric.LearnModAppFabric",
        {           "adapter": "kotlin",           "value": "org.starcloudsea.learnmodapp.learnmodapp.fabric.LearnModAppFabric"        }   
      ]
    },
    "mixins": [
      "learnmodapp.mixins.json",
      "learnmodapp-common.mixins.json"
    ],
    "depends": {
      "fabricloader": ">=0.15.9",
      "minecraft": ">=1.20.2",
      "fabric-language-kotlin": ">=<Fabric Language Kotlin版本>+kotlin.<Kotlin版本>"    }
}

然后, 你的 Fabric 就可以使用 Kotlin 了, 不过别人想要使用你Mod的话就需要加 Fabric Language Kotlin 这个Mod作为前置😜

构建整个项目.

重新转换为 Kotlin

现在你需要再按照第一步, 将 Java 文件转换为 Kotlin, 只需要做这一步, 因为 IntelliJ IDEA 在找不到依赖时仅会让你添加依赖而不会为你转换, 在添加依赖后, 你需要重新把 Java 文件转成 Kotlin 文件.

好力,开搞吧!(喜)

将Mojang原版映射替换成Yarn

这个很简单, 你只需要在 build.gradle 中将 mappings loom.officialMojangMappings() 注释掉, 然后将 // mappings "net.fabricmc:yarn:@YARN_MAPPINGS@:v2" 取消注释并指定版本就好了 (。・ω・。)

就像这样:

dependencies {
    minecraft "com.mojang:minecraft:${rootProjectminecraft_version}"
    // The following line declares the mojmap mappings, you mayuse other mappings as well.
    // mappings loom.officialMojangMappings()
    // The following line declares the yarn mappings you mayselect this one as well.
    mappings "net.fabricmc:yarn:1.20.2+build.4:v2"}

4.4 更新: 用过 Yarn 了, 完全不会用 🥴

你可以在 Fabric - Yarn 找到 Yarn 的所有版本(

别看字数 1w 多, 其实很容易的, 细心一点就好(