新回归移植

新回归移植

将各种Neoforge / 1.21.1特性反向移植到1.20.1,以便于在版本间进行维护。

一个用于在 Forge 1.20.1 上使用 NeoForge 1.21.1 特性与方法的库

本模组旨在作为库被其他模组一同包含使用。目前,唯一的独立功能是模糊的 1.21 风格 GUI 背景。手动安装比打包版本更新的版本仅对修复 bug 有用

当前功能包括:

  • 数据映射(Datamaps)
  • 数据组件(Data components)
  • 数据附加(Data attachments)
  • 流编解码器(Stream codecs)
  • 模糊 GUI 背景(通过内置资源包启用)
  • DeferredHolders(及其子类型)
  • 1.21.1 风格网络
  • 带编解码器的配方序列化器
  • 方块的 useItemOn 和 useWithoutItem 方法

……以及大量便捷的接口扩展

问答

  • 为什么要向后移植到 1.20.1?帮助开发者向上移植而不是向下移植不是更合理吗?
  • 为前向移植做一个库根本毫无意义,因为它会带来技术债务,并且每出一个新版本都需要把库向上移植。开发者永远不会习惯新特性,即使它们客观上更好,还会做出更卡顿、更多 bug 的模组。这样做的方式让我们既能满足 1.20 用户群,同时又能推动他们走向更新的版本
  • 这听起来像 Sinytra Connector 类型的模组,它能那样工作吗?
  • 理论上,如果我投入大量工作,它可以让非常小的 1.21.1 模组在 1.20.1 上运行,但支持会极其有限,所以不值得花时间。TLDR:不行

安装说明

由于本库使用了接口注入,因此必须从 ForgeGradle 切换到 ModDevGradle Legacy Gradle 插件。文档见此处,可用的 MDK 见此处

在 build.gradle 中:

repositories {
    // Some other repositories you might have...
maven {
    url = '<a href="" target="_blank" rel="nofollow">https://nikdo53.github.io&#x27;</a>
}

}

dependencies { // Some other dependencies you might have...

jarJar(modImplementation(&quot;net.nikdo53:NeoBackports:${neobackports_version}&quot;))
interfaceInjectionData(&quot;net.nikdo53:NeoBackports:${neobackports_version}&quot;)

}

在 gradle.properties 中:

# Set to whatever is latest
neobackports_version=1.4.1

技术差异

特性并非 1 比 1 向后移植(由于版本之间的后端差异),但应该足够相似,使大多数模组无需重大改动即可正常工作

类名

为了区分原始 Forge/原版类和向后移植的类,向后移植的类会加上“neo”后缀,例如:

  • SmithingRecipe -> SmithingRecipeNeo
  • PacketDistributor -> PacketDistributorNeo
  • DeferredRegister -> DeferredRegisterTyped(这个不一样,因为我忘了)

数据组件/附加

与 1.21.1 不同,这些只是对现有特性(分别为物品 NBT 和能力)的巧妙包装,这意味着不使用此 API 的其他模组应该能够像平常一样访问它们。

数据映射(Datamaps)

这些已经(经许可)直接从 NeoForge 的代码移植过来,差异极小。请注意,用于握手已知数据映射的登录数据包已被移除,并且通常不支持非强制性数据映射。我将来可能会重新处理这个问题,但由于本模组在客户端和服务端都必需,它可能不太有用(而且 1.20.1 的登录数据包很奇怪)

流编解码器

ByteBuf 泛型已被移除,因为所有内容都使用 FriendlyByteBuf:

StreamCodec<RegistryFriendlyByteBuf, SomeClass> -> StreamCodec<SomeClass>

图标是一只藏狐,它看起来很生气,因为它被迫使用 Forge