
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 的核心系统,并可能破坏密封潜艇机制本身,因此有意不做处理:
- 潜艇内部仍可见熔岩表面纹理。 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 文件(作为编译引用——它们不在此重新分发)。
步骤
在项目根目录创建一个
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(可选依赖;没有它模组将空载运行)
如果你发现与其他模组的兼容性问题,请提交 issue。
许可协议
根据 MIT 许可协议发布。你可以自由使用、复制、修改和
重新分发本代码,包括在其他项目或模组中,前提是保留原始署名。
完整文本请参见 LICENSE。
任何人都可以重用本代码——包括 Create: Deep Seas 的作者,如果他们希望直接整合此修复。
正在加载版本记录…
正在加载评论…
评论在新手盒子客户端中发表,这里同步展示。