帕皮瑞斯

一个为 Fabric 加载器 MappingResolver 提供各种命名映射的模组

基础库

Papyrus

Papyrus 为 Fabric 加载器的 MappingResolver 提供了多种命名映射。这使得在运行时访问映射对开发者更友好,例如在反射中使用命名类而不是 intermediary。

Papyrus 在任意给定版本首次运行时下载映射,并将缓存映射以 tiny v2 格式存储在 ${game_dir}/cache/papyrus/${mapping}_${version}.tiny

使用 Papyrus

要使用 Papyrus,只需将托管 Papyrus 的 Maven 仓库添加到你的 Gradle 构建脚本中:

# Kotlin DSL
repositories {
    maven("https://maven.nelind.dk/releases") {
        name = "Nelind Maven"
    }
}

# Groovy DSL
repositories {
    maven {
        name 'Nelind Maven'
        url 'https://maven.nelind.dk/releases'
    }
}

然后使用标准的 loom "include" Gradle 配置将 Papyrus 作为 JIJ 包含进来:

# Kotlin DSL
modRuntimeOnly(include("dk.nelind:papyrus:(version)")!!)

# Groovy DSL
modRuntimeOnly include("dk.nelind:papyrus:(version)")

你也可以选择不将 Papyrus 作为 JIJ 包含进来,这种情况下请确保在 fabric.mod.json 中手动将 Papyrus 添加为依赖项。如果你需要访问 Papyrus 的内部实现,也可以使用 modApi 配置代替 modRuntimeOnly 配置来添加 Papyrus。

然后,在你的 fabric.mod.json 中需要告诉 Papyrus 你需要访问哪些映射及其版本:

{
  ...
  "custom": {
    "papyrus": {
      "mappings": [
        "mojmap",
        "yarn:build.1"
      ]
    }
  }
}

然后使用任意已添加的映射命名空间获取并使用 MappingResolver

MappingResolver mappingResolver = FabricLoader.getInstance().getMappingResolver();
String runtimeClassNameFromYarnName = mappingResolver.mapClassName("yarn:build.1", yarnClassName);
String runtimeClassNameFromMojmapName = mappingResolver.mapClassname("mojmap", mojmapClassName);

使用说明:

  • Papyrus 在 preLaunch 阶段注入所添加的映射,因此你只应在此之后使用 Papyrus。 如果这里和那里谈到可能的未来 Fabric 加载器插件,那么在有意义让 Papyrus 成为加载器插件的地方它就会成为。 希望届时能在 preLaunch 阶段提供额外的映射。

  • Mojmap 处理继承的类成员的方式与 Intermediary 和 Yarn 不同! Intermediary 和 Yarn 仅在该类的映射定义中为直接在该类中定义的成员提供映射,而 Mojmap 为类拥有的所有成员提供名称,无论是否继承。在实践中,这意味着如果你向映射解析器询问某个类中的 Mojmap 方法名称,而该类继承了该方法,同时运行时映射是 Intermediary 或 Yarn,你将得到 null,因为解析器能够找到该名称(在 Mojmap 中),但该方法的名称在运行时映射中没有定义。这对你意味着什么? 如果你使用 Mojmap 名称作为映射解析器的输入,你应该使用方法或字段所声明在的类的类名,而不是你想要修改的类。或者,你可以进行 null 检查并以编程方式查找类的超类,然后以该超类作为所属类向映射解析器询问成员名称。

提供的映射

映射 映射解析器中使用的命名空间
Mojang 映射 mojmap
Yarn yarn

关于版本号的说明

由于 Papyrus 几乎完全独立于游戏本身的版本。模组版本表示该构建所对应的 Java 版本。例如 Papyrus x.y.z+java.17 是针对 Java 17 构建的,因此支持同样针对 Java 17 构建的任何游戏版本(即从 1.18 到 1.20.4 之间的任何版本,含首尾)。