跳到正文

Aeronautics Display Link Fix

作者:FQO3

修复 Create: Aeronautics 中的一个错误:当显示链接与目标告示牌位于同一构造体上时,物理组装或拆卸会导致显示链接的 TargetOffset 被破坏。

收藏

介绍

介绍由机器翻译自 Modrinth 原页面,仅供参考。

Aeronautics Display Link Fix [ADLF]

航空学显示链接器修复 [ADLF]

中文 | English


中文

简介

修复 Create: Aeronautics(机械动力航空学)中显示链接器(Display Link)在物理化/反物理化后
TargetOffset 被损坏的问题。覆盖所有场景:无论告示牌在飞行器上、在地面、还是在另一飞行器上。

问题根源

Sable 物理化时通过 saveWithFullMetadata / loadWithComponents 搬运方块实体。
物理化空间中,DisplayLink 的 target() 方法使用物理化空间坐标计算相对偏移:

offset = 告示牌物理化坐标 - DisplayLink物理化坐标
     → 产生巨大异常值(如 -20481038)

这个损坏的偏移被持久化到 NBT 中,反物理化后带回真实世界,导致 DisplayLink
无法正确寻址告示牌。

修复原理

通过 Mixin 注入 Sable 的 SubLevelAssemblyHelper.moveBlocks():

  1. Phase 1(loadWithComponents 之前):捕获所有正在移动的 DisplayLink 的原始 TargetOffset, 并预计算正确的旋转结果 correctedOffset = originalOffset.rotate(rot)
  2. Phase 2(moveBlocks TAIL):无条件将每个 DisplayLink 的 TargetOffset 恢复为正确值

不再需要 Case 3 检测——任何被物理化的 DisplayLink 都要保护。

特性

  • ✅ 全面覆盖:修复所有场景(DL 在飞行器上,告示牌在任意位置)
  • ✅ 旋转感知:正确应用 Sable 装配旋转变换
  • ✅ 零误判:无 Case 1/2/3 分类,无条件修复
  • ✅ 高性能:只处理 DisplayLink 本身,与结构大小无关
  • ✅ 可配置日志:adlf-common.toml 中 debug = true 开启详细追踪

版本历史

| 版本 | 说明 |
|——|——|
| v1.3 | 全面保护:移除 Case 3 检测,无条件保护所有 DisplayLink |
| v1.2.3 | 大型结构性能优化(O(n²) → O(n)) |
| v1.2 | 旋转感知偏移修正 + 配置文件 |
| v1.1 | 初始修复:双层 Case 3 判定 |

构建

# 前置条件:JDK 21
git clone <repo>
cd Aeronautics-display-link-fix
./gradlew build
# jar 输出:build/libs/aeronautics_display_link_fix-<version>.jar

依赖

  • Minecraft 1.21.1 + NeoForge 21.1.233
  • Create 6.0.10
  • Sable 1.2.2
  • Create: Simulated 1.2.1
  • Create: Aeronautics 1.2.1

注意事项

  • 🧠 本项目由 AI 辅助编写,代码结构和实现细节由 AI 辅助生成。
  • 🔧 由于作者不保证持续维护,后续版本兼容性可能滞后。
  • 🏢 Create / Sable / Aeronautics 官方未来可能会在架构层面修复此 Bug, 届时本 Mod 将不再需要。请关注官方更新日志。

英语

简介

修复 Create: Aeronautics 中的一个问题:物理化装配/拆卸过程中,显示链接器的 TargetOffset 会
遭到损坏。覆盖所有场景:无论
目标告示牌位于同一飞行器上、地面上,还是另一架
飞行器上。

问题根源

物理化装配时,Sable 通过
saveWithFullMetadata / loadWithComponents移动方块实体。在物理化子层空间中,
DisplayLink 的 target() 方法会使用子层
坐标计算相对偏移:

offset = signSublevelPos - DLSublevelPos
     → huge garbage value (e.g. -20481038)

这个损坏的偏移会被写入 NBT,并在反物理化后带回真实世界,
导致 DisplayLink 无法正确定位目标。

工作原理

通过 Mixin 注入 Sable 的 SubLevelAssemblyHelper.moveBlocks():

  1. 阶段 1(在 loadWithComponents 之前):捕获每个正在移动的 DisplayLink 的原始 TargetOffset,并预先计算正确旋转后的值:correctedOffset = originalOffset.rotate(rot)
  2. 阶段 2(moveBlocks TAIL):无条件将每个 DisplayLink 的 TargetOffset 恢复为正确值

不再需要 Case 3 检测——每个正在移动的 DisplayLink 都需要保护。

特性

  • ✅ 全面覆盖:修复所有场景(DisplayLink 位于飞行器上,告示牌位置不限)
  • ✅ 支持旋转:正确应用 Sable 的装配旋转变换
  • ✅ 杜绝误判:不区分 Case 1/2/3,一律修复
  • ✅ 高性能:只处理 DisplayLink 本身,耗时不受结构大小影响
  • ✅ 可配置日志:在 adlf-common.toml 中切换 debug = true,以启用详细追踪

版本历史

| 版本 | 描述 |
|———|————-|
| v1.3 | 通用保护:移除案例 3 检测,无条件保护所有 DisplayLink |
| v1.2.3 | 大型结构性能优化(O(n²) → O(n)) |
| v1.2 | 感知旋转的偏移修正 + 配置文件 |
| v1.1 | 初始修复:双层案例 3 检测 |

构建

# Prerequisites: JDK 21
git clone <repo>
cd Aeronautics-display-link-fix
./gradlew build
# Output: build/libs/aeronautics_display_link_fix-<version>.jar

依赖

  • Minecraft 1.21.1 + NeoForge 21.1.233
  • Create 6.0.10
  • Sable 1.2.2
  • Create: Simulated 1.2.1
  • Create: Aeronautics 1.2.1

备注

  • 🧠 此模组在 AI 的协助下开发——部分代码结构和实现细节由 AI 生成。
  • 🔧 作者不保证持续维护。未来版本的兼容更新可能会滞后。
  • 🏢 Create / Sable / Aeronautics 未来可能会从架构层面修复此问题,届时将不再需要此模组。请查阅官方更新日志。

常见问题

Aeronautics Display Link Fix 支持哪些 Minecraft 版本?

Aeronautics Display Link Fix 支持 Minecraft Java 版 1.21.1,可用的加载器:NeoForge。下载时注意选择和你游戏版本一致的文件。

Aeronautics Display Link Fix 怎么安装?

先用 PCL2 或 HMCL 启动器安装对应版本的 NeoForge,再把下载的 .jar 文件放进游戏目录的 mods 文件夹,重新启动游戏即可。开启了版本隔离的,mods 文件夹在 versions/版本名 下面。运行环境:客户端 / 服务端。

评论

登录后评论和评分