跳到正文

Create: Deep Seas – Lava Fix

作者:Diyksfol

修复 Create: Deep Seas 中的一个错误:潜艇内部已正确排空,但玩家在被熔岩淹没时,身处密封潜艇内仍会受到火焰/熔岩伤害。

收藏

介绍

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

Create: Deep Seas – Lava Fix

一款适用于 Minecraft 1.21.1 的小型 NeoForge 模组,用于修复
Create: Deep Seas
(CDS)中的一个漏洞:潜艇完全密封并潜入熔岩后,玩家在舱内仍会受到火焰/熔岩伤害,尽管 CDS 已正确排空舱内的熔岩。

> 作者: Diyksfol
> 许可证: MIT
> 说明: 本模组是在 AI 助手的帮助下开发的;我主要负责测试和指导。完整源码见此处,任何人(包括 Create: Deep Seas 的作者)都可以查看、复用或整合。


修复内容

在 Create: Deep Seas 中,密封潜艇可以排出舱内的所有流体(包括熔岩),
让你能像在露天环境中一样在舱内活动。然而,
游戏的伤害代码仍会对站在这片“已排空”区域内的玩家造成火焰/熔岩伤害,
因为伤害判定没有考虑密封潜艇的情况。

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

具体修复内容

  • 站在浸没于熔岩中的密封潜艇内时受到的火焰/熔岩伤害。
  • 在熔岩表面的舱口/门口(进出潜艇时)受到的伤害。
  • 坐在座椅上(Create 座椅)、爬梯子或站在潜艇内部的门口时受到的伤害。
  • 船体被破坏后重新密封,仍会持续受到火焰伤害的问题。
  • 身处潜艇内部时持续显示的火焰覆盖效果(屏幕底部的火焰)。

未修复的内容(及原因)

以下行为属于 Create: Deep Seas 内部机制。若通过外部模组修复,
就必须覆盖 CDS 的核心系统,还可能破坏密封潜艇机制本身,因此我们有意不作改动:

  1. 潜艇内部仍能看到熔岩表面纹理。 CDS 会在视觉上隐藏水面,但不会隐藏熔岩。这属于 CDS 的渲染问题。
  2. 潜艇内部低于熔岩/水位时,活板门无法作为可攀爬的“梯子”使用。 CDS 会隐藏流体,而原版的活板门攀爬机制依赖流体存在,因此无法攀爬。在 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 中的文件名。

  1. 构建:
   ./gradlew build

在 Windows 上:

   .\gradlew.bat build
  1. 编译后的 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(可选依赖;没有它时此模组不会执行任何操作)

如果你发现与其他模组存在兼容性问题,请提交问题报告。


许可证

基于 MIT License 发布。你可以自由使用、复制、修改和
重新分发此代码,包括在其他项目或模组中使用,但须保留原始
署名。完整内容请参阅 LICENSE。

欢迎任何人复用此代码——包括 Create: Deep Seas 的作者,
如果他们希望直接集成此修复的话。

常见问题

Create: Deep Seas – Lava Fix 支持哪些 Minecraft 版本?

Create: Deep Seas – Lava Fix 支持 Minecraft Java 版 1.21.1–1.21.11,共 11 个版本,可用的加载器:NeoForge。下载时注意选择和你游戏版本一致的文件。

Create: Deep Seas – Lava Fix 怎么安装?

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

评论

登录后评论和评分