Create: Deep Seas - 熔岩修复

Create: Deep Seas - 熔岩修复

修复了 Create: Deep Seas 中的一个错误,该错误导致玩家在密封的潜艇内仍会受到火焰/熔岩伤害,即使潜艇内部已被正确排空。

工具

Create: Deep Seas - 熔岩修复

一个适用于 Minecraft 1.21.1 的 NeoForge 小模组,用于修复 Create: Deep Seas (CDS) 中的漏洞:当潜艇完全浸入熔岩时,即使 CDS 正确清空了舱内熔岩,内部玩家仍会受到火焰/熔岩伤害。

作者: Diyksfol
许可协议: MIT
注意: 本模组在 AI 助手的帮助下开发;我主要担任测试和指导角色。完整源代码提供于此处,任何人(包括 Create: Deep Seas 的作者)都可以研究、重用或整合它。


修复内容

在 Create: Deep Seas 中,密封潜艇可以泵出内部所有流体(包括熔岩),让你如同在开放空气中一样在内部移动。然而,游戏伤害代码仍会对手站在这个"被清空"空间中的玩家施加火焰/熔岩伤害,因为伤害检测没有考虑到密封潜艇。

本模组检测玩家是否在密封舱内(或正在爬出密封舱),并在此情况下抑制火焰/熔岩伤害和屏幕上的火焰覆盖效果。

具体修复

  • 站在密封且浸入熔岩的潜艇内部时受到的火焰/熔岩伤害。
  • 在熔岩表面的舱口/门口(入口/出口)处受到的伤害。
  • 在潜艇内部坐(Create 座椅)在、爬梯子上或处于门口时受到的伤害。
  • 船体破裂后重新密封时无限持续的火焰 tick。
  • 在潜艇内部持续显示的火焰覆盖效果(屏幕底部的火焰)。

未修复内容(及原因)

以下行为属于 Create: Deep Seas 的内部特性。从外部模组修复它们需要覆盖 CDS 的核心系统,并可能破坏密封潜艇机制本身,因此有意不做处理:

  1. 潜艇内部仍可见熔岩表面纹理。 CDS 在视觉上隐藏了水表面,但没有隐藏熔岩。这是 CDS 的渲染问题。
  2. 潜艇内部水位/熔岩位以下,活板门不能作为可攀爬的"梯子"。 CDS 隐藏了流体,而原版的活板门攀爬机制依赖于流体的存在,因此无法攀爬。使用水时也会出现同样的效果。
  3. 玩家在潜艇内部放置的火焰会产生类似流体的效果。 站在火焰中会受到缓慢效果,在熔岩中还会被点燃。这是 CDS 的交互问题。
  4. 在潜艇内部直接倒下的熔岩或水不会造成伤害/溺水。 这是 CDS 有意为之的特性(内部被视为密封),并非漏洞。
  5. 潜艇内的生物和动物仍会受到火焰/熔岩伤害。 修复仅保护玩家。其他实体不受保护——不要在浸入熔岩的潜艇内存放宠物或被动型生物。
  6. 压力系统在熔岩下无法工作。

如果 Create: Deep Seas 的作者希望解决以上任何问题,他们欢迎以本代码作为起点。


安装(玩家)

  1. 为 Minecraft 1.21.1 安装 NeoForge。
  2. 安装 Create: Deep Seas 及其依赖项(Create、Sable 等)。
  3. 将 submarinefix-1.0.1.jar 放入你的 mods/ 文件夹。
  4. 启动游戏。即可。

即使没有安装 Create: Deep Seas,本模组也可以安全安装——在这种情况下它什么也不做。


从源码编译(开发者)

本仓库包含未编译的源代码。要自行构建 jar 文件:

先决条件

  • JDK 21
  • Create: Deep Seas jar 文件和捆绑的 Sable Companion jar 文件(作为编译引用——它们不在此重新分发)。

步骤

  1. 克隆本仓库:https://github.com/Diyksfol/create-deep-seas-lava-fix

  2. 在项目根目录创建一个 libs/ 文件夹,并将两个 jar 文件放入其中:

    • create_submarine-2.1.6.jar —— 来自你的 Create: Deep Seas 下载。
    • sable-companion-common-1.21.1-1.5.0.jar —— 从 CDS jar 文件的 META-INF/jarjar/ 文件夹中提取(CDS 绑定了它)。

    你的 build.gradle 已通过 compileOnly files(...) 引用了它们:

    compileOnly files('libs/create_submarine-2.1.6.jar')
    compileOnly files('libs/sable-companion-common-1.21.1-1.5.0.jar')
    

    如果你的 CDS 版本不同,请相应更新 build.gradle 中的文件名。

  3. 编译:

    ./gradlew build
    

    在 Windows 上:

    .\gradlew.bat build
    
  4. 编译后的 jar 文件将在 build/libs/ 中。

这些 jar 文件是第三方文件,有意不包含在本仓库中。你需要从自己的 Create: Deep Seas 安装中自行提供它们。


工作原理(技术概述)

修复结合了多个层级:

  • LivingIncomingDamageEvent(服务器,主要): 当玩家在密封舱内时,取消传入的 LAVA / IN_FIRE / ON_FIRE / HOT_FLOOR 伤害。
  • Entity#baseTick 混入(服务器): 抑制 lavaHurt() 调用。
  • LocalPlayer#baseTick 混入(客户端): 抑制客户端的 lavaHurt(),从而不在本地产生火焰 tick。
  • ScreenEffectRenderer#renderFire 混入(客户端): 在潜艇内部时隐藏火焰覆盖效果。
  • PlayerTickEvent.Post(服务器): 每个 tick 清除残留的火焰 tick。

检测方法

为了判断玩家是否在"密封潜艇内部",模组:

  1. 通过 CompartmentTracker.getSubsSnapshot() 遍历已注册的潜艇。
  2. 排除其世界坐标系 AABB(getWorldAABB)不包含玩家的潜艇。
  3. 通过 subLevelAccess.logicalPose().transformPositionInverse(...) 将玩家的世界位置转换为潜艇的地块局部空间。
  4. 检查结果方块是否在 CompartmentTracker.getCompartments(uuid) 中每个密封 Component 的 internal() 和 hull() 集合中。
  5. 同时检查脚和眼睛位置(因此坐着的玩家、爬梯子的玩家和处于门口的玩家都能被覆盖),并且——当玩家在可攀爬方块上时——额外垂直扫描以覆盖延伸到船体上方的梯子通道。

这镜像了 CDS 自身使用的内部逻辑,但避免了 CDS 中只能在潜艇层级内部调用的公共方法。


兼容性

  • Minecraft: 1.21.1
  • 模组加载器: NeoForge 21.1+
  • 需要: Create: Deep Seas(可选依赖;没有它模组将空载运行)

如果你发现与其他模组的兼容性问题,请提交 issue。


许可协议

根据 MIT 许可协议发布。你可以自由使用、复制、修改和 重新分发本代码,包括在其他项目或模组中,前提是保留原始署名。 完整文本请参见 LICENSE。

任何人都可以重用本代码——包括 Create: Deep Seas 的作者,如果他们希望直接整合此修复。