Aeronautics Display Link Fix
修复 Create: Aeronautics 中的一个错误:当显示链接与目标告示牌位于同一构造体上时,物理组装或拆卸会导致显示链接的 TargetOffset 被破坏。
介绍
Aeronautics Display Link Fix [ADLF]
航空学显示链接器修复 [ADLF]
中文
简介
修复 Create: Aeronautics(机械动力航空学)中显示链接器(Display Link)在物理化/反物理化后
TargetOffset 被损坏的问题。覆盖所有场景:无论告示牌在飞行器上、在地面、还是在另一飞行器上。
问题根源
Sable 物理化时通过 saveWithFullMetadata / loadWithComponents 搬运方块实体。
物理化空间中,DisplayLink 的 target() 方法使用物理化空间坐标计算相对偏移:
offset = 告示牌物理化坐标 - DisplayLink物理化坐标
→ 产生巨大异常值(如 -20481038)
这个损坏的偏移被持久化到 NBT 中,反物理化后带回真实世界,导致 DisplayLink
无法正确寻址告示牌。
修复原理
通过 Mixin 注入 Sable 的 SubLevelAssemblyHelper.moveBlocks():
- Phase 1(
loadWithComponents之前):捕获所有正在移动的 DisplayLink 的原始 TargetOffset, 并预计算正确的旋转结果correctedOffset = originalOffset.rotate(rot) - Phase 2(
moveBlocksTAIL):无条件将每个 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(在
loadWithComponents之前):捕获每个正在移动的 DisplayLink 的原始 TargetOffset,并预先计算正确旋转后的值:correctedOffset = originalOffset.rotate(rot) - 阶段 2(
moveBlocksTAIL):无条件将每个 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/版本名 下面。运行环境:客户端 / 服务端。
评论
登录后评论和评分