# 构建开发环境

类似于 fabric, architectury plugin 也提供了相对应的 example-mod 来方便我们搭建环境。

首先来到 Architectury-Templates 的 Releases 页面,选择合适的版本

目前 Architectury 仅支持 1.16 + 的版本

Architectury 提供下面这几种 Templates 可供选择

  • 1.18.2-forge.zip: 1.18.2 的基于 Forge-Loom Forge 开发环境
  • 1.18.2-architectury.zip: 1.18.2 跨加载器的开发环境
  • 1.18.2-architectury-mixin.zip: 1.18.2 使用 Mixin 的跨加载器开发环境

相信阅读过初识 Architectury 章节的读者已经明白自己需要下载的版本了

这里我们不着重介绍 Mixin, 感兴趣的读者可以阅读笔者先前的文章

本文基于 Minecraft 1.18.2 版本,并且我们不需要 Mixin, 所以我们下载 1.18.2-architectury.zip

将下载到的文件进行解压,直接使用 Intellij IDEA 来导入文件夹中的 build.gradle 文件

类似于 Fabric 和 Forge 的环境构建,这里 Gradle 会帮助我们下载必要的文件,并且自动使用 Loom 进行反混淆,读者需要稍加等待

build.gradle 中的一些常量现在移动到了 gradle.properties

<img src="https://s2.loli.net/2022/04/01/iaMLz2vOkusrQoB.png" alt="image.png" data-size="original">

构建完成后,Gradle 会自动为我们生成针对两个平台的运行配置

在 Architectury 项目创建完成后,请尽量避免移动项目的位置或者给项目的目录改名。可能会产生找不到 architectury-transformer-agent.jar 的问题

如果产生了这个问题,可以自行修改启动配置中 - javaagent 的路径

恭喜你,你已经构建好了一个完整的开发环境

# 简析目录结构

重新审视我们构建好的开发环境,我们的目录结构类似这样

  • common
    • src/main/java/net.examplemod
      • ExampleMod.java
      • ExampleExpectPlatform.java
  • forge
    • src/main/java/net.examplemod.forge
      • ExampleModForge.java
      • ExampleExpectPlatformImpl.java
  • fabric
    • src/main/java/net.examplemod.fabric
      • ExampleModFabric.java
      • ExampleExpectPlatformImpl.java

经过简单的观察,我们发现

  • 实例代码在主类 ExampleMod 中进行了物品的注册和一些基本操作
  • ExampleModForge 中添加了 @Mod 注解,并调用 ExampleMod 中的 init
  • ExampleModFabric 类实现了 ModInitializer 方法,并调用 ExampleMod 中的 init
  • 实例代码在 ExampleExpectPlatform 中写了一个 **"没有方法体"** 的方法 getConfigDirectory
  • common 模块中的某些代码调用了 getConfigDirectory
  • forge 模块中的 ExampleExpectPlatformImpl 用 forge 独有的方式补全了方法体
  • fabric 模块中的 ExampleExpectPlatformImpl 用 fabric 独有的方式补全了方法体

可以发现,我们模组的共性部分在 common 模块中,而非共性部分则分别在 forge 和 fabric 包中展现.

针对一个需要考虑兼容性的方法,我们往往先定义 "接口", 然后为接口写不同的实现 (Impl), 这是 Architechtury 以及大部分跨平台程序设计中所共有的思想

实际上 ExampleExpectPlatform 在这里类似于接口.

# 开始旅程

实例代码已经为我们提供了一个清晰的思路,现在我们已经可以删除掉他们,开始我们自己的旅途了.

在 common, forge, fabric 三个模块中分别建立 trou.arch (.forge/.fabric) 包,并创建对应的 Arch, ArchForge, ArchFabric 类.

位于common: trou/arch/Arch.java
public static final String MOD_ID = "arch";
public class Arch {
    public static void init() {
        System.out.println("Hello Architectury!");
    }
}
位于forge: trou/arch/forge/ArchForge.java
@Mod(Arch.MOD_ID)
public class ArchForge {
    public ArchForge() {
        Arch.init();
    }
}
位于fabric: trou/arch/fabric/ArchFabric.java
public class ArchFabric implements ModInitializer {
    @Override
    public void onInitialize() {
        Arch.init();
    }
}

根据读者以往开发 Forge 或 Fabric 的经验修改必要的文件名和参数变量,分别启动游戏,应该可以看到 Hello Architectury! 消息输出在控制台中

# 可能出现的问题

因为涉及到很多 transform 和黑科技,对规范性的要求比较高,读者可能会出现一些疏忽,下面是一些可能出现的常见问题 (笔者搭建环境的时候出现的问题)

# 开发中出现错误,其中有 examplemod 字样

检查是否有遗漏的 examplemod 没有修改,请主要检查

  • fabric.mod.json
  • gradle.properties
  • mods.toml
  • (accesswidener)
  • (mixins.json)

Architectury Templates

# 运行 Fabric 调试,模组没有加载

请检查自己是否修改了 fabric.mod.json, 其中定义了 Mod 主类入口

打开 fabric 模块中的 resources/fabric.mod.json, 修改 entrypoints

"entrypoints": {
    "main": [
      "trou.arch.fabric.ArchFabric"
    ]
  },

# 运行 Forge 调试,抛出 Modules generated 错误

请检查自己的 Forge 主类是否放在了 forge 模块的对应 forge 包

我们项目的 ArchForge 应位于 forge\src\main\java\trou\arch**\forge\**ArchForge.java

# 实验性内容:使用 Parchment

此项内容读者可以选择性阅读. Architectury 并未主动支持 Parchment. 以下内容均出自笔者尝试,不能保证是否出现问题,如果读者想要使用,出现了编译类问题,请首先尝试移除 Parchment

众所周知,现在 Forge 和 Fabric 默认使用 Mojang 官方混淆表,但官方混淆表并没有放出参数的混淆信息,这导致高版本默认反编译的参数表是很难阅读的,Parchment 解决了这一问题,Parchment 提供了参数表的反混淆方式。这里笔者不过多赘述 Parchment 本身,国内也有相关的介绍和使用教程,读者可以自行翻阅查看.

这里我们尝试在 Architectury 中引入 Parchment

首先打开项目根目录的 build.gradle, 在 subprojects 中按需添加如下内容

subprojects {
    repositories {
        maven { url = 'https://maven.parchmentmc.org' }
    }

    dependencies {
        minecraft "com.mojang:minecraft:${rootProject.minecraft_version}"
        mappings loom.layered() {
            officialMojangMappings()
            parchment("org.parchmentmc.data:parchment-1.18.2:2022.03.13@zip")
        }
        // mappings loom.officialMojangMappings()
    }
}

之后刷新 Gradle 项目,等待 Parchment 下载并自动部署后,再次查看参数表,已经反混淆过了.