NeoBackports

NeoBackports

将各种Neoforge / 1.21.1的功能向后移植到1.20.1,以便在不同版本之间更容易维护

基础库

一个用于在 Forge 1.20.1 上使用 Neoforge 1.21.1 特性和方法的库。

此模组旨在作为其他模组的库文件使用。目前,唯一独立的特性是 1.21 风格的模糊化 GUI 背景。手动安装比打包版本更新的版本仅用于修复漏洞。

当前特性包括:

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

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

问答

  • 为什么要反向移植到 1.20.1?帮助开发者向上移植而不是向下移植不是更有意义吗?
  • 制作一个用于向前移植的库从根本上来说是毫无意义的,因为它会带来技术债务,并且每个新版本都需要移植该库。开发者永远无法适应新特性,即使这些特性客观上更好,并且会导致模组更卡顿、更多漏洞。采用这种方式意味着我们既能满足 1.20 版本用户的需求,又能推动他们向新版本迁移。
  • 这听起来像是一种 Synitra 连接器类型的模组,它能这样工作吗?
  • 理论上,如果我投入大量精力,可能能让非常小的 1.21.1 模组在 1.20.1 上运行,但支持会极其有限,因此不值得花时间。简而言之:不能

安装说明

由于此库使用接口注入,因此需要从 ForgeGradle 切换到 ModDevGradle Legacy gradle 插件。相关文档在此,可用的 MDK 在此

在 build.gradle 中:

repositories {
    // 你可能有的其他仓库...
    
    maven {
        url = 'https://nikdo53.github.io/NeoBackports'
    }
}

dependencies {
    // 你可能有的其他依赖项...

    jarJar(modImplementation("net.nikdo53:NeoBackports:${neobackports_version}"))
    interfaceInjectionData("net.nikdo53:NeoBackports:${neobackports_version}")
}

在 gradle.properties 中:

# 将其设置为最新版本
neobackports_version=1.2.2

技术差异

功能并非完全一对一移植(由于版本间底层差异),但应足够相似,使得大多数模组无需重大差异即可直接运行。

类名

为了区分原始 Forge/原版类与移植类,移植类会添加 "neo" 后缀,例如:

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

数据组件/附加

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

数据映射

这些(经许可)直接从 Neoforge 代码移植而来,差异极小。请注意,用于握手已知数据映射的登录包已被移除,非强制性的数据映射通常不受支持。我未来可能会重新考虑这个问题,但由于此模组需要在客户端和服务器上都安装,所以可能不是很有用(而且 1.20.1 的登录包很奇怪)。

流编解码器

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

StreamCodec<RegistryFriendlyByteBuf, SomeClass> -> StreamCodec

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