Create: Deep Seas – Lava Fix
修复 Create: Deep Seas 中的一个错误:潜艇内部已正确排空,但玩家在被熔岩淹没时,身处密封潜艇内仍会受到火焰/熔岩伤害。
介绍
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 的核心系统,还可能破坏密封潜艇机制本身,因此我们有意不作改动:
- 潜艇内部仍能看到熔岩表面纹理。 CDS 会在视觉上隐藏水面,但不会隐藏熔岩。这属于 CDS 的渲染问题。
- 潜艇内部低于熔岩/水位时,活板门无法作为可攀爬的“梯子”使用。 CDS 会隐藏流体,而原版的活板门攀爬机制依赖流体存在,因此无法攀爬。在 CDS 中遇到水时也会出现相同情况。
- 玩家在潜艇内部放置的火焰会产生类似流体的效果。站在火焰中会获得缓慢效果;若火焰位于熔岩上方,还会受到燃烧伤害。这是 CDS 的交互行为。
- 直接向潜艇内部倒入熔岩或水,不会造成伤害/溺水。这是 CDS 的设计特性(舱内被视为密封空间),并非漏洞。
- 潜艇内的生物和动物仍会受到火焰/熔岩伤害。此修复仅保护玩家,不适用于其他实体——请勿将动物或被动生物留在浸没于熔岩中的潜艇内。
- 压力系统在熔岩下方无法工作。
如果 Create: Deep Seas 的作者希望处理上述任何问题,欢迎将此代码用作起点。
安装方法(玩家)
- 为 Minecraft 1.21.1 安装 NeoForge。
- 安装 Create: Deep Seas 及其依赖项(Create、Sable 等)。
- 将
submarinefix-1.0.1.jar放入mods/文件夹。 - 启动游戏即可。
即使没有安装 Create: Deep Seas,也可以安全安装此模组——在这种
情况下,它不会执行任何操作。
从源代码构建(开发者)
此仓库包含未编译的源代码。如需自行构建 jar:
前置条件
- JDK 21
- Create: Deep Seas 的 jar,以及随附的 Sable Companion jar(用作仅编译时引用——此处不会重新分发这些文件)。
步骤
- 克隆此仓库:https://github.com/Diyksfol/create-deep-seas-lava-fix
- 在项目根目录中创建一个
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 中的文件名。
- 构建:
./gradlew build
在 Windows 上:
.\gradlew.bat build
- 编译后的 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。
检测方式
为了判断玩家是否“处于密封潜艇内”,此模组会:
- 通过
CompartmentTracker.getSubsSnapshot()遍历已注册的潜艇。 - 排除世界空间 AABB(
getWorldAABB)未包含玩家的潜艇。 - 通过
subLevelAccess.logicalPose().transformPositionInverse(...),将玩家的世界坐标转换到潜艇的绘图局部空间。 - 根据
CompartmentTracker.getCompartments(uuid),检查转换后的位置对应的方块是否属于各个密封Component的internal()和hull()集合。 - 同时检查双脚和眼睛的位置(因此也涵盖坐着的玩家、爬梯子的玩家以及处于门口的玩家);如果玩家正处于可攀爬物上,还会额外向垂直方向扫描,以涵盖延伸到船体上方的梯井。
这与 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/版本名 下面。运行环境:客户端和服务端都要装。
评论
登录后评论和评分