Skip to content

Fixed the issue where heater damage in 26.1 would knock back players. 修复了26.1加热器伤害会击退玩家的问题#3779

Merged
Gu-ZT merged 1 commit into
Anvil-Dev:dev/26.1/1.6from
PigeonNian:hot/26.1/1.6
Jun 21, 2026
Merged

Fixed the issue where heater damage in 26.1 would knock back players. 修复了26.1加热器伤害会击退玩家的问题#3779
Gu-ZT merged 1 commit into
Anvil-Dev:dev/26.1/1.6from
PigeonNian:hot/26.1/1.6

Conversation

@PigeonNian

Copy link
Copy Markdown
Contributor
  • 在 DamageTypeTagLoader 中将 heaterBurn 伤害类型加入 NO_KNOCKBACK 标签
  • HeaterBlock 改用自定义 ModDamageTypes.heaterBurn 伤害来源替代 hotFloor
  • 更新 no_knockback.json 数据文件,包含 heater_burn 伤害类型
  • 修正 hammer_removable.json 文件格式问题,确保 JSON 正确闭合

- 在 DamageTypeTagLoader 中将 heaterBurn 伤害类型加入 NO_KNOCKBACK 标签
- HeaterBlock 改用自定义 ModDamageTypes.heaterBurn 伤害来源替代 hotFloor
- 更新 no_knockback.json 数据文件,包含 heater_burn 伤害类型
- 修正 hammer_removable.json 文件格式问题,确保 JSON 正确闭合

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

好的,这是对提交请求的代码审查。

问题 1:JSON 文件缺少末尾换行符

  • 文件: src/generated/resources/data/anvilcraft/tags/block/hammer_removable.json
  • 问题: 文件末尾缺少一个换行符 (\n)。这在 POSIX 标准中是一个小问题,可能会导致某些工具(如 diffcat)的行为不一致。
  • 建议: 在文件末尾添加一个换行符。这通常可以通过在编辑器中保存时启用“在文件末尾添加换行符”选项来解决。

问题 2:JSON 文件缺少末尾换行符

  • 文件: src/generated/resources/data/minecraft/tags/damage_type/no_knockback.json
  • 问题: 同样,文件末尾缺少一个换行符。
  • 建议: 在文件末尾添加一个换行符。

问题 3:DamageTypeTagLoader.java 中重复的 rawBuilder 调用

  • 文件: src/main/java/dev/dubhe/anvilcraft/data/tags/DamageTypeTagLoader.java

  • 问题: 代码中为 DamageTypeTags.NO_KNOCKBACK 标签调用了两次 provider.rawBuilder(...)。虽然这可能会正常工作(取决于 rawBuilder 的实现,它可能只是追加元素),但这不是最佳实践,并且可能表明存在逻辑错误或代码冗余。

  • 建议: 将两次调用合并为一次,如下所示:

    provider.rawBuilder(DamageTypeTags.NO_KNOCKBACK)
        .addOptionalElement(ModDamageTypes.LOST_IN_TIME.identifier())
        .addOptionalElement(ModDamageTypes.HEATER_BURN.identifier());

问题 4:HeaterBlock.java 中的伤害类型变更

  • 文件: src/main/java/dev/dubhe/anvilcraft/block/power/consumer/HeaterBlock.java
  • 问题: 将伤害类型从 level.damageSources().hotFloor() 更改为 ModDamageTypes.heaterBurn(level)
  • 建议:
    • 确认意图: 请确认 heater_burn 伤害类型是否确实旨在替代 hotFloorhotFloor 通常与岩浆块相关,而 heater_burn 可能是一个自定义伤害类型。请确保游戏逻辑上这是正确的。
    • 检查伤害类型定义: 确保 ModDamageTypes.heaterBurn(level) 返回的 DamageSource 对象已正确配置(例如,设置了正确的死亡消息、伤害类型标签等)。
    • 检查标签一致性: 您已将 heater_burn 添加到 no_knockback 标签中。请确认这是否是预期的行为。通常,烧伤不应该造成击退,所以这很合理。但请确保 heater_burn 没有意外地被添加到其他不应该存在的标签中。

总结

这是一个相对较小的更改,主要涉及添加新的伤害类型和相关的标签。主要问题是代码风格(缺少换行符)和代码冗余(重复的 rawBuilder 调用)。逻辑变更(伤害类型)看起来是合理的,但需要确认其意图和配置是否正确。

@Gu-ZT Gu-ZT merged commit ef588ed into Anvil-Dev:dev/26.1/1.6 Jun 21, 2026
3 checks passed
@anvil-craft

Copy link
Copy Markdown

⚠️ Dangerous command requires approval:

# Verify the generated JSON files are valid JSON
python3 -c "
import json
# Check hammer_removable.json
try:
    with open('/tmp/pr3779.diff') as f:
        diff = f.read()
    print('Diff loaded succ...

Reason: script execution via -e/-c flag

Reply /approve to execute, /approve session to approve this pattern for the session, /approve always to approve permanently, or /deny to cancel.

@anvil-craft

Copy link
Copy Markdown

审查已完成。以下是分析结果:


代码审查摘要:PR #3779

结论:✅ 批准 — 代码清晰、范围集中、修改精确。无阻塞性问题。

🟢 主要更改

文件 类型 说明
HeaterBlock.java 🎯 核心修复 加热器伤害来源从 hotFloor(原版热地板,带击退)改为自定义的 ModDamageTypes.heaterBurn(level)(无击退)
DamageTypeTagLoader.java 🎯 配套注册 HEATER_BURN 注册到 NO_KNOCKBACK 标签中
no_knockback.json 数据生成产物 JSON 中加入了 anvilcraft:heater_burn,与代码端注册一致
hammer_removable.json 🧹 格式修复 文件末尾补上换行符,修正 JSON 闭合

✅ 验证点

1. 语义正确性

  • 原代码 level.damageSources().hotFloor() 使用原版 hotFloor 伤害类型,该类型不在 NO_KNOCKBACK 标签中,因此玩家被加热器烫伤时会附带击退效果 — 这正是 issue 所描述的 bug。
  • 新代码改用自定义 heaterBurn 伤害类型,在 ModDamageTypes.java 中通过 bootstrap 注册,并在 DamageTypeTagLoader 中明确加入 NO_KNOCKBACK 标签。改动精确修复了问题。

2. 一致性检查

  • DamageTypeTagLoader.javaHEATER_BURN 使用 addOptionalElement,与 LOST_IN_TIME 的注册模式一致 ✅
  • ModDamageTypes.java 中的 heaterBurn(level) 工厂方法与 laser(level)lostInTime(level) 等已存在的方法模式一致 ✅
  • no_knockback.json"required": false 与其他条目标记一致,保持互操作性兼容性 ✅

3. 数据生成闭环

  • ModDamageTypes.bootstrap() 已注册 HEATER_BURN 伤害类型的定义(DamageEffects.BURNING + 0.1F 疲劳值)
  • DamageTypeTagLoader.init() 将其加入 NO_KNOCKBACK 标签
  • 生成的 no_knockback.json 与代码匹配

4. Hammer 移除 JSON 修复

  • 原文件末尾无换行符,修正后补上。改动虽小但符合 JSON 规范,避免某些工具报错。

💡 建议(非阻塞)

  • hammer_removable.json 的改动 属于自动生成的资源文件(src/generated/resources/),此类格式修正通常应在数据生成器中修复而非手工编辑 JSON。不过该 PR 仅修正了 EOF 换行,影响很小。

🔍 未发现的明显问题

  • ❌ 无暴露密钥 / 凭据
  • ❌ 无 SQL 注入或 XSS 风险
  • ❌ 无拼写错误或未使用的导入(新导入 ModDamageTypes 已在 stepOn 中使用)
  • ❌ 无并发或线程安全问题(伤害仅在 server tick 线程中处理)
  • ✅ 伤害值(4.0F)保持不变,未改变游戏平衡

📋 总结

这是一个精确的 Bug 修复 PR,改动量小(4 个文件,共 ~20 行有效变更),逻辑准确。核心思路清晰:将加热器的伤害来源从通用的 hotFloor 替换为自定义的 heaterBurn,并显式标记为不产生击退,从而消除了 26.1 版本中加热器伤害附带击退效果的 bug。


由 Hermes Agent 审查

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants