航空学 Levitite 服务器修复

航空学 Levitite 服务器修复

让Levitite Blend在Create: Aeronautics 1.2.1及更早版本的专用服务器上结晶(该问题已在1.3.0版本的上游修复)。

工具

航空学 微光粉服务端修复

一个针对 Create: Aeronautics 的小型服务端修复模组,让 微光粉混合物 能在专用服务器上结晶。

你需要这个吗? 仅当你运行 Create: Aeronautics 1.2.1 或更早版本 的专用服务器时才需要。 此漏洞已在 Aeronautics 1.3.0 的上游版本中修复——如果你能升级到 1.3.0+,请直接升级,无需此模组。(1.3.0 需要 Sable 2.0,因此本模组为那些锁定在 Aeronautics ≤1.2.1 / Sable 1.x 的整合包而存在。)

问题描述

在专用服务器上,使用催化剂(火把、打火石、火焰弹、营火)右键点击微光粉混合物没有任何反应,并且服务器日志会抛出:

java.lang.RuntimeException: Attempted to load class
  net/minecraft/client/player/LocalPlayer for invalid dist DEDICATED_SERVER
    at net.neoforged.fml.common.asm.RuntimeDistCleaner.processClassWithFlags
    at dev.eriksonn.aeronautics.network.packets.LevititeCatalystCrystallizationPacket.handle(:38)
→ Failed to process a synchronized task of the payload: aeronautics:levitite_blend_crystallize

它在单人游戏中可以正常工作,因为集成服务器共享了客户端分发类型。

原因: 服务端结晶数据包处理器调用了 LevititeCatalyzerHandler.isCatalyzer(...)。该类已被客户端污染——其 onUse 方法引用了仅客户端存在的 LocalPlayer——因此,在专用服务器上加载它会导致 NeoForge 的 RuntimeDistCleaner 报错,数据包处理失败,结晶过程也就不会发生。

(上游追踪见 Simulated-Project issue #664;由提交 a86bd1d 修复,已在 Aeronautics 1.3.0 中发布。)

修复方案

一个单独的 Mixin 将该有问题的调用重定向到一个服务端安全的物品标签内联检查——这正是 isCatalyzer 内部计算的内容(item.is(#aeronautics:levitite_catalyzer) || item.is(#aeronautics:levitite_soul_catalyzer))。这样,专用服务器就不会再加载被客户端污染的类,而处理器其余部分(本身已是分发安全的)可以正常结晶。

  • 无需编译时依赖 Aeronautics——Mixin 仅通过名称引用它。
  • Mixin 配置为 非必须:在 Aeronautics 1.3.0+(其中该方法已被重构移除)中,它只是找不到目标并无害地空操作,而不会崩溃。因此,在更新 Aeronautics 时,保留此模组是安全的。

安装

  • 仅限 NeoForge 1.21.1。
  • 将 jar 文件放入你的服务器的 mods/ 文件夹。客户端不需要此模组(单人游戏已经可用),但保留它也无害。
  • 需要 Create: Aeronautics 才能生效;单独使用时不起作用。

兼容性

Aeronautics 版本 此模组的效果
≤ 1.2.1 修复 服务端微光粉结晶问题
≥ 1.3.0 空操作(上游已修复)——移除是安全的

许可协议

MIT。不包含任何 Create: Aeronautics 代码——Mixin 仅通过名称引用它。

鸣谢

  • Create: Aeronautics 由 Eriksonn / The Creators of Aeronautics 开发。
  • 根本原因分析和修复由 DaciteRocks 完成。