Skip to content

The text regarding celestial death has been corrected, and some progress has been made. 修正了天体死亡文本,增加了一些进度 - #5129

Merged
WhereisFff merged 9 commits into
Anvil-Dev:dev/1.21/1.6from
PigeonNian:CFAADV/1.21/1.6
Oct 2, 2026
Merged

WhereisFff merged 9 commits into
Anvil-Dev:dev/1.21/1.6from
PigeonNian:CFAADV/1.21/1.6

Conversation

@PigeonNian

Copy link
Copy Markdown
Contributor
  • 添加了三种新伤害类型(继承原有伤害来源)使天体击杀有了独立提示信息
  • 添加了进度

Pigeon_Nian and others added 9 commits October 2, 2026 14:54
- 新增 CelestialEvolutionTrigger 用于天体质量进化判定
- 在触发 util 中添加 celestialEvolution 方法,触发成就判定
- 在加速器逻辑中调用触发方法进行成就检测
- 添加无残留(no_remnant)挑战成就,要求64质量铁砧的天体进化至终局
- 将成就文本翻译添加至英文语言文件和特殊字符文件
- 在成就数据中注册无残留成就及其触发条件
- 新增PlanetDetonationTrigger用于行星毁灭事件的判定
- 在ExcavatorHandler中增加触发行星毁灭触发器的逻辑
- 在AdvancementLineHelper中集成planetDetonation方法方便创建该成就
- 在AnvilCraftAdvancement中添加efficiency成就分支,绑定行星毁灭触发器
- 更新语言文件,添加行星毁灭成就的标题与描述
- 注册PlanetDetonationTrigger触发器并完善其触发实现
- 新增efficiency成就JSON配置文件,定义触发条件及显示信息
- 添加了 PlanetaryCollapseDeathTrigger 触发器类及其数据结构
- 在 ModCriterionTriggers 中注册 planetary_collapse_death 触发器
- 在 AdvancementLineHelper 中新增 planetaryCollapseDeath 方法便于调用
- 在 AnvilCraftAdvancement 中添加 Cannon Fodder 成就,绑定行星坍缩死亡触发器
- 在语言文件中添加 Cannon Fodder 成就标题与描述的多语言支持
- 在 OverworldLikeEventListener 中监听行星坍缩死亡事件并触发相应成就
- 在 TriggerUtil 中实现 planetaryCollapseDeath 方法来触发成就判定
- 新增 Cannon Fodder 成就的 JSON 配置文件,包含父级与图标等信息
- 修改效率成就添加隐藏属性,改善游戏内成就展示体验
- TriggerUtil新增支持根据StellarTerminal.Kind触发星体演化成就
- CelestialEvolutionTrigger增加对终局类型的判定和对应触发方法
- AdvancementLineHelper新增celestialEvolution重载方法支持终局类型参数
- AnvilCraftAdvancement中增加黑洞和中子星分支成就定义和保存
- AdvancementLang添加黑洞与中子星成就名称及描述多语言支持
- 语言文件(en_us, en_ud)增加对应成就的描述和标题
- 新增黑洞和中子星成就JSON数据文件,定义触发条件和显示信息
- 添加黑洞接触、恒星接触及行星接触三种新伤害类型
- 天体接触伤害采用独立类型以实现专属死亡提示
- 更新伤害标签,支持新伤害类型绕过护甲、抗性、击退等效果
- 修改重力控制器中伤害来源,替换为对应新天体接触伤害类型
- 保持星体及行星接触伤害原版燃烧和摔落效果表现不变
- 增加对应的语言文本显示新伤害的死亡描述信息
- 修正玩家攻击混入对行星接触伤害的判定,保持原摔落伤害一致性
- 新增相关资源数据文件,完善伤害类型和标签配置
- 新增 StarContactDeathTrigger 实现星接触死亡触发器
- 注册并初始化星接触死亡触发条件 ModCriterionTriggers.STAR_CONTACT_DEATH
- AdvancementLineHelper 新增 starContactDeath 方法支持该触发器
- AnvilCraftAdvancement 新增“come_at_night”任务,使用星接触死亡触发器
- AdvancementLang 中添加“come_at_night”进度名称及描述文本
- OverworldLikeEventListener 监听星接触死亡事件触发进度
- TriggerUtil 新增 starContactDeath 方法简化触发调用
- 新增“advancements.anvilcraft.come_at_night”标题的本地化文本
- 新增“advancements.anvilcraft.come_at_night”描述的本地化文本
- 中文描述内容为“被星光笼罩”
- 英文标题内容为“Showdown at Night”倒转样式
- 创建新的隐藏成就“come_at_night”
- 设置成就触发器为“star_contact_death”
- 指定成就图标为“celestial_forging_anvil”
- 定义成就的父级为“the_start”
- 启用成就的遥测事件发送
@Gugle2308

Copy link
Copy Markdown
Collaborator

⚠️ Dangerous command requires approval:

cd /opt/data/workspace/AnvilCraft; echo "=== mass_64 terminal in stellar_tracks.json ==="; git show rvpr5129:src/main/resources/data/anvilcraft/stellar_tracks.json | grep -o '"mass_6[0-9]"[^}]*' | hea...

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.

@Gugle2308

Copy link
Copy Markdown
Collaborator

⚠️ Dangerous command requires approval:

for t in bypasses_armor is_fall is_fire no_knockback bypasses_resistance bypasses_shield bypasses_invulnerability; do
  echo "=== $t ==="
  curl -sL "https://raw.githubusercontent.com/misode/mcmeta/1....

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.

@Gugle2308

Copy link
Copy Markdown
Collaborator

代码审查摘要 — PR #5129

操作: synchronize(PR 状态:open,未合并)
范围: 34 个文件(17 Java / 17 生成资源)/ 1113 行 diff / 新增生成文件 13 个
作者: PigeonNian(CFAADV/1.21/1.6 → dev/1.21/1.6,head 26bba56c,base 9e750b31)


🔴 必须处理

1. AdvancementLang.java 有 4 行超过 checkstyle LineLength(140),style_check 会失败

style.xml 的 LineLength max=140,ignorePattern 只放过 package/import/href/http(s)/ftp,新增行不匹配任何豁免;style_check.yml 用 checkstyle 13.6.0 + reviewdog(-filter-mode 默认 added,-fail-level=any),只对新增行报错。实测新增行长度(head 行号):

行 长度 键
AdvancementLang.java:163 145 efficiency.description
AdvancementLang.java:166 166 no_remnant.description
AdvancementLang.java:172 144 black_hole.description
AdvancementLang.java:175 144 neutron_star.description

旁证:最近一个改该文件的已合并 PR #5125(ed2e9f67)新增行最长恰好 139——说明这条规则在新增行上是实际生效并被遵守的(文件里那 19 行历史超长行只是没被 reviewdog 计入)。建议按同一 PR 里 OtherLang.java 的写法折行:

provider.add("advancements.anvilcraft.no_remnant.description",
    "Evolve a celestial body forged with 64 mass anvils to the end and watch it leave no remnant");

2. new_cycle.json 生成数据与 datagen 代码不一致(漏跑 runData)

no_remnant 走的是主线 industrialLine.next()(AnvilCraftAdvancement.java:459),而不是像其它 5 个挑战那样用 industrialLine.createBranch().next()。AdvancementHelper.save() 会把 lineHelper.parent 置为刚保存的节点(AdvancementLineHelper.java:696),因此紧随其后的 new_cycle(:463)的 parent 会从 the_start 变成 no_remnant。

但 PR 里没有 new_cycle.json 的改动;我已直接核对 head 树:

head 代码: ...save("no_remnant"); 然后 industrialLine.next()....save("new_cycle");
head 数据: new_cycle.json => "parent": "anvilcraft:anvilcraft/the_start"   ← 仍是旧值

即代码与提交的生成数据不一致:现在游戏内加载的是旧数据(the_start → new_cycle),可任何人下次跑 runData 都会冒出一份与本 PR 无关的 new_cycle.json diff(CI 没有 datagen 校验,所以现在不会红,但会变成后续 PR 的噪音/冲突源)。
二选一: 若想让 no_remnant 与其它 5 个挑战一样并列挂在 the_start 下(与已提交数据一致),改成 industrialLine.createBranch().next();若确实要把主线延长成 the_start → no_remnant → new_cycle,请重跑 runData 并把 new_cycle.json 的 parent 变更一起提交。


⚠️ 建议确认

  • TriggerUtil.planetDetonation 半径 7(TriggerUtil.java:222) — efficiency 要求玩家在天体爆发时离锻星砧 7 格内。5/7 是本仓库既有的惯例半径(其它多方块触发同款),若伽马激光是由远处激光发射器射到激光接口、玩家站在十几格外操作,进度就不会给。建议确认是否和实际玩法距离匹配(celestialEvolution 用 32 并注明"对齐震屏半径"——已核对 AcceleratorHandler.SUPERNOVA_SHAKE_RADIUS = 32.0f,注释属实 👍)。
  • PlayerHitEntityMixin 语义提醒 — 新增 || source.is(ModDamageTypes.PLANET_CONTACT) 会保留旧行为:佩戴铁砧锤帽 + 鞘翅滑翔时,行星接触伤害(38)会被"撞击分支"取消(改为命中附近实体)。我核对 base source.type().equals(fall) 确认改动前就是这个行为,属正确的等价保留;只是提醒这继承了旧怪癖——若希望天体接触伤害不可规避,需要另作处理。

💡 建议

  • no_remnant 判据用 mass_anvils: exactly(64):已核对 stellar_tracks.json,mass_64 是唯一 terminal.kind = "disruption"(无残骸)的轨道,且文案强调"64 个质量铁砧",当前等价 ✅。若想更贴合"无残骸"语义,也可直接用 StellarTerminal.Kind.NONE(这样将来新增高档位无残骸轨道也能生效)。
  • PlanetDetonationTrigger / PlanetaryCollapseDeathTrigger / StarContactDeathTrigger 三个类几乎逐字相同,OverworldLikeEventListener 里两个 LivingDeathEvent 处理也高度重复;与现有 criterion 包风格一致,属可接受的重复,若愿意可抽一个带 ResourceKey<DamageType> 参数的通用 trigger。
  • black_hole / neutron_star 两个挑战未设 hidden(图标直接暴露终局物品名),其它 4 个都隐藏了;确认是否有意。

🟢 看起来不错

  • "继承原有伤害来源"做得精确且完整(这是本 PR 最容易出错的地方,逐项核对通过):
    • star_contact:0.1f + DamageEffects.BURNING = 原版 in_fire 等价,且加入 IS_FIRE ⇒ 抗火效果、火焰免疫实体、红宝石护符(RUBY_AMULET_VALID = IS_FIRE)、全套防护服(EquipmentAbilities.isImmune)全部保持原样。
    • planet_contact:0.0f + HURT = 原版 fall 等价,且加入 IS_FALL ⇒ 羽毛护符、缓冲靴、EntityTypeTags.FALL_DAMAGE_IMMUNE、保护附魔全部保持原样。
    • black_hole_contact:0.1f 无 effects = lost_in_time 等价,且只镜像了 lost_in_time 原有的 4 个标签(bypasses_armor / bypasses_resistance / no_knockback / is_magic),没有多塞 BYPASSES_SHIELD/INVULNERABILITY/...(那些原本就只属于 planetary_collapse)——没有过度扩大豁免。
    • 全库扫描确认没有别处再依赖 LOST_IN_TIME 检测黑洞击杀(只剩时间扭曲 TimeWarpPlayerBehavior 与腐化信标,属正确保留)。
  • 触发时机与作用域正确:completeEvolution 有 terminalApplied() 守卫只触发一次(AcceleratorHandler.java:582);判据用 evolutionState.initialMass()(质量铁砧档位,StellarEvolutionState:602)而不是被清 0 的 stellarMass(:590-594 会把 mass 清 0,若取错源会永远拿不到);searchPlayerByPos 同维度、每次返回唯一玩家;planetDetonation 不会重复触发(clearMegastructure 后 receivedGamma 不再成立)。
  • 生成数据与代码逐项对齐(除上述 new_cycle.json):6 个新 advancement JSON 的 parent/frame/hidden/icon/trigger/conditions/requirements 全部与 AnvilCraftAdvancement 和 criterion codec 对上(含 mass_anvils: 64 的常量形式、terminal: "black_hole" 与 Kind.id 一致);3 个 damage_type JSON 与 DamageType 构造参数一致;en_us/en_ud 同步;is_fall.json 是新增文件、与 mod 现有"仅含本模组条目 + required:false"的写法一致(依赖标签并集合并不覆盖原版 ✅)。
  • 新死亡文案质量高("discovered the Roche limit, in pieces" / "is now part of the corona" / "thought they could outrun light"),OtherLang 折行写法与 style.xml 合规。
  • 新 criterion 类与既有 MultiBlockFormTrigger 等结构、import 顺序、this. 用法完全一致;is_fire/is_fall 的注解式注释把"为什么要继承"写清楚了,对后续维护很友好。

📋 声称验证表

声称 状态 证据
添加三种新伤害类型,继承原有伤害来源 ✅ star_contact/planet_contact/black_hole_contact + 标签继承准确(见上)
使天体击杀有独立死亡提示 ✅ OtherLang + 生成的 en_us/en_ud;同步处理了 PlayerHitEntityMixin、护符/缓冲靴/防护服依赖
添加了进度 ⚠️ 6 个新 advancement(efficiency / cannon_fodder / black_hole / neutron_star / come_at_night / no_remnant)齐全且可达;new_cycle.json 生成数据未同步
修正天体死亡文本 ✅ 原 in_fire/fall/lost_in_time 提示被专属文案替换,行为(标签/表现/数值)逐项等价

结论: REQUEST_CHANGES — 内容本身实现正确、等价性验证通过,只需两处收尾:折行 4 条超长 lang 行(会让 style_check 变红),以及解决 new_cycle.json 的代码/生成数据不一致(改 createBranch() 或重跑 runData)。

🧪 测试建议

被测目标 场景 优先级
runData + git diff --exit-code 应在当前提交即可复现 new_cycle.json 漂移(也是本 PR 最有效的自检) 🔴
DamageTypeTagLoader 标签继承 红宝石/羽毛护符、缓冲靴、全套防护服分别对恒星/行星接触伤害生效;火焰/摔落免疫实体不吃新类型 🔴
PlayerHitEntityMixin 滑翔铁砧锤帽撞行星体:仍取消自身伤害并命中附近实体(与改动前一致) 🟡
触发半径 站在 7 格内/外分别验证 efficiency;32 格内/外验证 black_hole/neutron_star/no_remnant 🟡
死亡进度 cannon_fodder(行星崩解)、come_at_night(恒星接触 66 点致死)在死亡同帧后正确授予且死亡后重登不丢 🟡
存档兼容 旧存档中正在演化的天体(initialMass 从 NBT 恢复)终局时 no_remnant 判据正确 🟢

🏷️ 标题

现标题 The text regarding celestial death has been corrected, and some progress has been made. 修正了天体死亡文本,增加了一些进度 描述偏笼统,建议改为更明确的形态,例如:

Add dedicated celestial contact damage types and 6 celestial advancements 新增天体接触伤害类型与天体进度

本次未能自动修改:gh auth status 显示 token invalid(/opt/data/home/.config/gh/hosts.yml),按流程不尝试导出 token 修复,故仅在此给出建议标题。


由 Hermes Agent 审查(diff 与 head 树均已交叉验证:patch-diff 34 文件 / pr5129head = 26bba56c)

@Gugle2308

Copy link
Copy Markdown
Collaborator

All verification complete. Here's my review.


代码审查摘要 — PR #5129

操作: opened | 状态: 仍为开启(review 期间作者推送了新 head:b96b72b → 26bba56c,全部结论已对最新 head 26bba56 复核)
范围: 34 个文件(17 Java / 17 生成资源,新增 14 个) / +608 / −9
版本线: dev/1.21/1.6(1.21.x 常规 feature PR,非 26.1 迁移,故跳过 API 迁移健康度检查)
CI: build ✅ success | checkstyle ✅ success


✅ 伤害类型/标签等价性核对(本 PR 最关键的部分,逐项验证通过)

新伤害类型 替换的原版来源 需继承的标签 结果
black_hole_contact lost_in_time(原黑洞即死) bypasses_armor / bypasses_resistance / no_knockback / is_magic ✅ 4/4 全部保留(原 lost_in_time 在 base 中恰好只在这 4 个标签里,全部平移到新类型)
star_contact level.damageSources().inFire() is_fire ✅(DamageEffects.BURNING、exhaustion 0.1 与原版 in_fire 一致)
planet_contact level.damageSources().fall() is_fall ✅(DamageEffects.HURT、exhaustion 0.0 与原版 fall 一致)
  • 接线完整性:全仓库核对,天体接触伤害只有 CfaGravityController.applyCelestialDamage 三条路径(黑洞/恒星/行星),三条全部改造完毕,无遗留 damageSources().fall()/inFire()(ResinBlock/LargeCauldron/MunTravel/HurtType 等残留均与天体无关,属既有行为)。
  • lost_in_time 仍被 TimeWarpPlayerBehavior、CorruptedBeaconActivatorItem 使用 → 未成为死类型,保留注册正确。
  • PlayerHitEntityMixin 补充 source.is(ModDamageTypes.PLANET_CONTACT):原来靠 fall() 类型嗅探的「鞘翅+砧锤头撞」逻辑,在伤害类型换新后仍生效 ✅(用 source.is(ResourceKey) 而非比较 type() 实例,写法正确)。

📋 声称验证表

声称 状态 证据
添加三种新伤害类型,继承原有伤害来源 ✅ ModDamageTypes 3 个 ResourceKey + bootstrap + 3 个 damage_type/*.json + 5 个标签 JSON;标签等价性见上表
天体击杀有独立提示信息 ✅ OtherLang 3 条 death.attack.anvilcraft.{star_contact,planet_contact,black_hole_contact},message_id 与 lang key 对得上
添加进度 ✅ 6 个进度(efficiency/cannon_fodder/black_hole/neutron_star/come_at_night/no_remnant),4 个新 Trigger + ModCriterionTriggers 注册 + 6 个 advancement JSON + 15 条 lang key(en_us/en_ud 完全对称)
图标/条件合法性 ✅ 6 个 icon(earth_core_shard/player_head/black_hole/magnetar_coil_component/celestial_forging_anvil/stellar_evolution_accelerator_component)均在 ModItems/ModBlocks 中注册;frame/hidden 与 .challenge()/.task() 参数逐一吻合
「64 质量→无残骸」前提 ✅ stellar_tracks.json 实测 mass_64 的 terminal 为 "kind": "disruption"(= Kind.NONE,无残骸);mass 41=keep、42–55=white_dwarf、56–58=neutron_star、59–63=black_hole、64=disruption,成就唯一可达
「efficiency = 投喂伽马激光炸行星」 ✅ ExcavatorHandler.tryShatterPlanet 首行即 receivedGamma 硬前置,描述与实现一致
生成资源完整 ✅ 6 个 advancement JSON + 3 个 damage_type JSON + 5 个标签 JSON 全部随 Java 变更同步提交(en_ud 反转文本亦已重新生成)

🔴 关键问题

无。

⚠️ 警告(非阻塞,建议确认)

  1. TriggerUtil.planetDetonation 搜索半径 7 与同 PR 的 32 不成比例且无注释说明
    celestialEvolution 显式取 32 并注明「对齐震屏半径 SUPERNOVA_SHAKE_RADIUS=32.0f」(已核对常量确实为 32.0f,注释准确)。而 planetDetonation 只有 7,且行星解体走的是 level.explode(..., 3.0f) 前的同 tick 触发。若伽马激光是经发射器/自动化远程供给(isReceivedGamma() 由激光接口块长期保持),玩家完全可能在 7 格外等待,从而拿不到 efficiency。建议确认半径是否符合设计意图,或补一句注释说明依据。

  2. black_hole / neutron_star 未标 hidden,与同批另外 4 个进度不一致
    同一批新增里 efficiency、cannon_fodder、come_at_night、no_remnant 都传了 hidden=true,只有 black_hole、neutron_star 用 .challenge(icon, id)(默认可见)。非 hidden 的进度在父进度解锁后会直接以灰色图标出现在成就树中,会剧透「黑洞/中子星终局」以及描述文字。若是有意作为引导提示可忽略,否则建议统一为 hidden=true。

💡 建议

  1. no_remnant 的判据只钉了质量、没钉终局类型
    celestialEvolution("no_remnant", MinMaxBounds.Ints.exactly(64)) 只匹配 mass_anvils == 64(生成 JSON 为 "mass_anvils": 64),未附加 terminal。当前 64 号轨道恰好是唯一 disruption 轨道(已核对),所以行为正确;但显式写成 matches(64, NONE)(可再补一个 evolved(MinMaxBounds, Kind) 重载)更能表达「演化到无残骸」的语义,也不会在未来轨道表调整时静默改变含义。

  2. 两个死亡触发器放在了 OverworldLikeEventListener 里
    该类的文档注释是 "Connects overworld-like lifecycle state to server and player events",而 onPlanetaryCollapseDeath / onStarContactDeath 服务的是天体进度系统。功能无误,但归属上建议移到天体/进度相关的事件类,避免这个类继续膨胀成杂项监听器。

  3. AdvancementLang 有 4 条新增行超过 style.xml 的 LineLength max=140(166/145/144/144 字符)—— 目前 checkstyle 检查是绿的(同文件既有 10+ 条更长历史行,属既有惯例),故仅作提示:若后续收紧样式门禁,这 4 行会被翻出来。cannon_fodder 那条 137 字符是安全的。

🟢 看起来不错

  • 新 Trigger 类完全遵循仓库既有范式(PlacerPlaceTrigger 对照:EntityPredicate.ADVANCEMENT_CODEC.optionalFieldOf("player") + implements SimpleInstance + record player 组件 + 静态工厂 + matches),CelestialEvolutionTrigger.matches 的空 Optional 短路语义正确(massAnvils 与 terminal 各自独立可选)。
  • DamageTypeTagLoader 里那段说明「换用独立类型以显示专属死亡提示,因此需各自继承被替换原版类型的标签,否则护符/抗性提升无法规避」是教科书级的解释性注释,且实现与注释完全一致。
  • 死亡提示文案有梗(planet_contact 的 Roche limit、black_hole_contact 的 outrun light)且 %1$s 占位符在 en_us/en_ud 中均为 1 个、位置正确。
  • 生成资源与代码没有出现「先加代码后忘跑 runData」的常见漏项(come_at_night.json 已随最新 head 补齐,en_us/en_ud 同步)。
  • TriggerUtil 新增方法用 PlayerUtil.searchPlayerByPos 复用既有半径搜索,死亡类触发器明确注释「只涉及当事玩家,不按位置搜索」,取舍交代清楚。

🧪 测试建议

被测目标 建议场景 优先级
CelestialEvolutionTrigger.TriggerInstance.matches 只带 mass_anvils / 只带 terminal / 两者都带且不匹配 → 三条分支;64 与 63 的边界 🟡
标签等价回归 戴红宝石护符吃不掉 star_contact 的 IS_FIRE 减免、羽毛护符对 planet_contact 生效、抗性提升无效于 black_hole_contact 🟠
PlayerHitEntityMixin 鞘翅+砧锤头撞、伤害源为 PLANET_CONTACT 时应转为伤害周围实体并取消自身伤害 🟡
进度可达性 手动授予 6 个进度确认 lang/图标/父子关系渲染正常;mass 64 演化终局后确认 no_remnant 触发 🟡

结论: APPROVE(LGTM,附非阻塞建议) — 三种新伤害类型对原版来源的标签继承逐项等价、三条天体伤害路径无遗漏改造、6 个进度与生成资源/双语 lang 完全对齐,且「64 质量=无残骸」「伽马激光=行星解体」两个关键前提已对 stellar_tracks.json 与 ExcavatorHandler 源码交叉验证为真。上面 2 条警告(半径 7、hidden 不一致)建议确认后再合并,不影响本次正确性。

标题建议

gh auth status 显示 token 已失效(Active account 存在但 token invalid),按流程未执行 gh pr edit。当前标题 "The text regarding celestial death has been corrected, and some progress has been made." 描述性不足,建议改为:

Add celestial damage types, death messages and advancements 新增天体接触伤害类型、专属死亡提示与 6 个进度

由 Hermes Agent 审查(基于 head 26bba56,34 文件 / +608 −9)

@Gugle2308

Copy link
Copy Markdown
Collaborator

💾 Self-improvement review: Patched SKILL.md in skill 'offline-pr-evidence-verification' (1 replacement). · Patched SKILL.md in skill 'advancement-criterion-pr-review' (1 replacement).

@Gugle2308

Copy link
Copy Markdown
Collaborator

已完成全部核查(diff 完整性与本地 git diff 对账一致:+555/−9、34 文件、14 新增)。以下为审查意见。


代码审查摘要 — PR #5129

操作: synchronize(PR 状态 pullOpened,base 9e750b31,head 26bba56c)
范围: 34 个文件(17 Java:4 新增 / 13 修改;17 资源:2 lang、6 advancement、3 damage_type、6 tag JSON)/ +555 −9

新增伤害类型与 6 个进度均已逐项落到源码验证,逻辑基本正确;但有 1 处生成数据与数据生成器不同步(必修) 和 1 处标签继承不完整导致的静默行为变更。

🔴 关键

1. new_cycle.json 未随 datagen 更新 —— parent 漂移(生成物 ≠ 生成器输出)

新增的 no_remnant 用的是主线 industrialLine.next(),它插在 the_start 与 new_cycle 之间:

industrialLine.next().challenge(... "no_remnant", true).save("no_remnant");   // parent = the_start
industrialLine.next().challenge(... "new_cycle", true)...save("new_cycle");   // ← datagen 会给 parent = no_remnant

依据(均为 base 源码实证,非推测):

  • AdvancementLineHelper.save(id) 末尾执行 this.lineHelper.parent = holder;next() 构造 AdvancementHelper 时 if (lineHelper.parent != null) this.current.parent(lineHelper.parent)。
  • 交叉验证:the_start.json 的 parent 正是链上紧邻的 the_end(anvilcraft:anvilcraft/the_end),证明「next() 紧跟 save(X) ⇒ parent = X」。
  • 5 个 createBranch() 分支快照的 parent 是 调用时刻 的 industrialLine.parent(仍为 the_start),所以它们的 parent: the_start 与 JSON 一致 ✅ —— 只有主线被打断的 new_cycle 受影响。

⇒ 仓库里的 new_cycle.json 仍是 "parent": "anvilcraft:anvilcraft/the_start",而 runData 会产出 .../no_remnant。修法二选一:把 no_remnant 改成 industrialLine.createBranch().next()(与其余 5 个一致,推荐),或一并提交 new_cycle.json 的 parent 变更。

⚠️ 警告

2. planet_contact / star_contact 的标签继承不完整 ⇒ 与"仅改死亡提示"的目标不符(静默机制变更)

DamageTypeTagLoader 的注释明确写了"需要各自继承被替换原版类型的标签",但只继承了护符相关的部分。与 1.21.1 原版标签实据(misode/mcmeta 1.21.1-data)对照:

被替换类型 原版标签 新类型已继承 缺失
fall → planet_contact bypasses_armor、is_fall、no_knockback(并因 bypasses_shield 含 #bypasses_armor 而穿透盾牌) is_fall ❌ bypasses_armor、❌ no_knockback(连带 ❌ bypasses_shield)
in_fire → star_contact is_fire、no_knockback is_fire ❌ no_knockback
lost_in_time → black_hole_contact bypasses_armor、bypasses_resistance、no_knockback、is_magic 4 项全中 ✅ 无

实际影响(CfaGravityController:PLANET_CONTACT_DAMAGE = 38.0f、STAR_CONTACT_DAMAGE = 66.0f):

  • 行星接触 38 点伤害此前无视护甲,改动后会被护甲/保护减免、且开始造成击退、可被盾牌格挡;
  • 恒星接触 66 点新增击退。
    护符路径 ✅(RUBY_AMULET_VALID → #is_fire、FEATHER_AMULET_VALID → #is_fall 均通过标签继承生效),但上述三条建议补 BYPASSES_ARMOR / NO_KNOCKBACK 以保持等价;若确为有意调整平衡,请在 PR 描述里点明。

💡 建议(非阻塞)

  • zh_cn 文案缺失:12 条进度文案(6×title/description)+ 3 条死亡提示(star_contact/planet_contact/black_hole_contact)在 zh_cn.json 中不存在。Crowdin workflow 仅在 releases/1.21 触发,dev 线不会自动补;同批的 new_cycle 已有中文文案,建议顺手补齐。
  • frame 不统一:come_at_night 用 task(),同为"死亡类"的 cannon_fodder 用 challenge(),其余 4 个也是 challenge。若非有意区分,建议统一。
  • 可见性:black_hole / neutron_star 未设 hidden,会直接出现在 the_start 之后的树里并透露后期内容;同批其余均为隐藏挑战,建议确认是否为预期。
  • 可把 PlayerHitEntityMixin 里"行星接触沿用飞行撞击表现"的同款理由,在标签处补一行注释(避免后人再次漏继承)。

🟢 看起来不错(已核实证据)

  • no_remnant 可达且描述准确:CelestialMassTable 恰 64 条(at(anvils) 上限 64),stellar_tracks.json 存在 mass_64,其 terminal.kind = "disruption" ⇒ StellarTerminal.Kind.NONE ⇒ completeEvolution 的 case NONE 清空天体数据(确实"不留残骸")。MinMaxBounds.Ints.exactly(64) 打在上限端点,可达成 ✅。
  • criterion 编码与手写 JSON 同构:Kind.CODEC 用字符串 id(white_dwarf/neutron_star/black_hole/disruption/keep),手写 conditions.terminal: "black_hole"/"neutron_star" ✅;MinMaxBounds.Ints.exactly(64) 编码为裸数字 64 ✅;无条件键的 criterion(planet_detonation 等)省略 conditions ✅(同 new_cycle 的 impossible 形态)。
  • 生成 JSON 手改与 datagen 同构:键序 parent → criteria → display → requirements → (rewards) → sends_telemetry_event、display 内 description/frame/hidden/icon/title、icon.count:1、conditions 在 trigger 前、frame 仅非 task 才出现(come_at_night 无 frame = task,与全仓 25 个既有文件一致)、无隐藏时省略 hidden、文件末尾无换行(lost_in_time.json 实据同款)✅。
  • 触发点唯一且幂等:completeEvolution 首行有 terminalApplied() 守卫 + markTerminalApplied(),超新星多次 tick 不会重复发奖;planetDetonation 仅 ExcavatorHandler.tryShatterPlanet;半径 32 与 SUPERNOVA_SHAKE_RADIUS = 32.0f 一致(注释准确)。
  • 死亡触发不会在客户端误发:LivingDeathEvent 用 instanceof ServerPlayer 过滤;planetaryCollapse 唯一施加点是 OverworldLikeResetManager(Overworld-Like 世界),与 cannon_fodder 描述"inside an Overworld-Like planet"一致。
  • 无死代码:lostInTime 仍被 TimeWarpPlayerBehavior、CorruptedBeaconActivatorItem 使用。
  • 风格/门禁:新 criterion 类的 import 布局与 MultiBlockFormTrigger 完全一致;celestialEvolution 两个重载相邻(OverloadMethodsDeclarationOrder);MissingJavadocMethod 在 style.xml 中已注释;仓库无 runData 门禁(style_check.yml 仅 checkstyle 13.6.0,crowdin.yml 仅监听 releases/1.21)。
  • diff 完整性:patch-diff 与本地 git diff rvbase5129 rvhead5129 的 ± 逐字一致(+555/−9),无截断;EOF 无换行仅出现在 generated JSON,属仓库既有惯例。

📋 声称验证表

声称 状态 证据
三种新伤害类型(继承原有伤害来源),天体击杀有独立提示 ✅ star_contact/planet_contact/black_hole_contact ← in_fire/fall/lost_in_time;三处 message_id 与 OtherLang + en_us/en_ud 死亡文案齐全;star_contact 保留 burning、planet_contact 保留 exhaustion 0.0/HURT
添加了进度 ✅ 6 个 efficiency/cannon_fodder/black_hole/neutron_star/come_at_night/no_remnant(各自 criterion 注册 + 触发点 + 图标物品真实存在,black_hole 有 .item() 故图标可解析)
修正了天体死亡文本 ✅ CfaGravityController.applyCelestialDamage 三处 hurt 换源,行为面(燃烧/摔落表现、飞行撞击路径)已同步
生成数据已同步 ❌ new_cycle.json parent 漂移(见 🔴 1)

结论: REQUEST_CHANGES — 逻辑与文案主体正确、可达性已核实;但 new_cycle.json 的生成物/生成器不一致必须修掉,planet_contact/star_contact 的 BYPASSES_ARMOR/NO_KNOCKBACK 继承建议补齐或明确说明为有意调整。两处改动量都很小。

🧪 手动验收建议(本仓库此类改动无单测,未虚构测试文件)

场景 预期
带满护甲+保护站在行星接触区 若维持原语义应仍无视护甲(38 点);若已接受改动则记录新值
恒星接触致死(66 点,不足以致死时可叠加) 显示 death.attack.anvilcraft.star_contact,且死亡后发 come_at_night(隐藏 task)
行星崩解致死于 Overworld-Like 世界 发 cannon_fodder,非该世界来源不应发
64 枚质量铁砧演化至终局(mass_64,disruption) 发 no_remnant,且不留残骸
5963 号质量演化(black_hole)/ 5658(neutron_star) 分别发 black_hole / neutron_star
挖掘机被伽马激光击碎行星 半径 7 内玩家发 efficiency
超新星多次 tick / 重登 不重复发奖(terminalApplied 守卫)

由 Hermes Agent 审查

附:gh auth status 显示 token 已失效(未认证),故未自动执行 gh pr edit。建议标题:Add celestial contact death messages and 6 celestial advancements 新增天体专属死亡提示与 6 个天体进度(现标题「The text regarding celestial death has been corrected, and some progress has been made」过于含糊,未说明是新增伤害类型与进度)。

@Gugle2308

Copy link
Copy Markdown
Collaborator

💾 Self-improvement review: Patched references/head-sha-freshness-and-prior-review-verification.md in skill 'github-webhook-pr-review' (1 replacement). · Patched SKILL.md in skill 'advancement-criterion-pr-review' (1 replacement).

@Gugle2308

Copy link
Copy Markdown
Collaborator

💾 Self-improvement review: Patched references/damage-type-and-death-message-review.md in skill 'minecraft-modding' (1 replacement). · Skill updated · Patched SKILL.md in skill 'advancement-criterion-pr-review' (1 replacement).

@WhereisFff
WhereisFff merged commit 5c9ee48 into Anvil-Dev:dev/1.21/1.6 Oct 2, 2026
2 checks passed
@Gugle2308

Copy link
Copy Markdown
Collaborator

PR #5129 的 webhook 操作类型为 closed,且经核实该 PR 实际已合并(data-status="pullMerged",merge commit 5c9ee48,"merged 9 commits into")。

按审查约束第 1 条(closed/labeled → 停止,不发布评论),本次跳过完整审查,不发表评审意见。

说明:如需对该合并结果做 post-merge 复盘(三种天体伤害类型 + 进度项的落库情况),请以 synchronize/edited/reopened 等事件重新触发,或直接告知。


由 Hermes Agent 审查

PigeonNian added a commit that referenced this pull request Oct 3, 2026
…修复到26.1 (#5143)

* The text regarding celestial death has been corrected, and some progress has been made. 修正了天体死亡文本,增加了一些进度 (#5129)

* feat(advancement): 添加天体进化挑战成就及触发器

- 新增 CelestialEvolutionTrigger 用于天体质量进化判定
- 在触发 util 中添加 celestialEvolution 方法,触发成就判定
- 在加速器逻辑中调用触发方法进行成就检测
- 添加无残留(no_remnant)挑战成就,要求64质量铁砧的天体进化至终局
- 将成就文本翻译添加至英文语言文件和特殊字符文件
- 在成就数据中注册无残留成就及其触发条件

* feat(advancement): 添加行星毁灭成就及触发器支持

- 新增PlanetDetonationTrigger用于行星毁灭事件的判定
- 在ExcavatorHandler中增加触发行星毁灭触发器的逻辑
- 在AdvancementLineHelper中集成planetDetonation方法方便创建该成就
- 在AnvilCraftAdvancement中添加efficiency成就分支,绑定行星毁灭触发器
- 更新语言文件,添加行星毁灭成就的标题与描述
- 注册PlanetDetonationTrigger触发器并完善其触发实现
- 新增efficiency成就JSON配置文件,定义触发条件及显示信息

* feat(advancement): 新增因行星坍缩死亡的成就触发器

- 添加了 PlanetaryCollapseDeathTrigger 触发器类及其数据结构
- 在 ModCriterionTriggers 中注册 planetary_collapse_death 触发器
- 在 AdvancementLineHelper 中新增 planetaryCollapseDeath 方法便于调用
- 在 AnvilCraftAdvancement 中添加 Cannon Fodder 成就,绑定行星坍缩死亡触发器
- 在语言文件中添加 Cannon Fodder 成就标题与描述的多语言支持
- 在 OverworldLikeEventListener 中监听行星坍缩死亡事件并触发相应成就
- 在 TriggerUtil 中实现 planetaryCollapseDeath 方法来触发成就判定
- 新增 Cannon Fodder 成就的 JSON 配置文件,包含父级与图标等信息
- 修改效率成就添加隐藏属性,改善游戏内成就展示体验

* feat(advancement): 新增黑洞和中子星终局星体成就

- TriggerUtil新增支持根据StellarTerminal.Kind触发星体演化成就
- CelestialEvolutionTrigger增加对终局类型的判定和对应触发方法
- AdvancementLineHelper新增celestialEvolution重载方法支持终局类型参数
- AnvilCraftAdvancement中增加黑洞和中子星分支成就定义和保存
- AdvancementLang添加黑洞与中子星成就名称及描述多语言支持
- 语言文件(en_us, en_ud)增加对应成就的描述和标题
- 新增黑洞和中子星成就JSON数据文件,定义触发条件和显示信息

* feat(damage): 新增天体接触伤害类型及独立标签支持

- 添加黑洞接触、恒星接触及行星接触三种新伤害类型
- 天体接触伤害采用独立类型以实现专属死亡提示
- 更新伤害标签,支持新伤害类型绕过护甲、抗性、击退等效果
- 修改重力控制器中伤害来源,替换为对应新天体接触伤害类型
- 保持星体及行星接触伤害原版燃烧和摔落效果表现不变
- 增加对应的语言文本显示新伤害的死亡描述信息
- 修正玩家攻击混入对行星接触伤害的判定,保持原摔落伤害一致性
- 新增相关资源数据文件,完善伤害类型和标签配置

* feat(advancement): 添加“夜晚来访”星接触死亡进度条件

- 新增 StarContactDeathTrigger 实现星接触死亡触发器
- 注册并初始化星接触死亡触发条件 ModCriterionTriggers.STAR_CONTACT_DEATH
- AdvancementLineHelper 新增 starContactDeath 方法支持该触发器
- AnvilCraftAdvancement 新增“come_at_night”任务,使用星接触死亡触发器
- AdvancementLang 中添加“come_at_night”进度名称及描述文本
- OverworldLikeEventListener 监听星接触死亡事件触发进度
- TriggerUtil 新增 starContactDeath 方法简化触发调用

* feat(locale): 添加“come_at_night”成就的中英文描述

- 新增“advancements.anvilcraft.come_at_night”标题的本地化文本
- 新增“advancements.anvilcraft.come_at_night”描述的本地化文本
- 中文描述内容为“被星光笼罩”
- 英文标题内容为“Showdown at Night”倒转样式

* feat(advancement): 添加“come_at_night”隐藏成就

- 创建新的隐藏成就“come_at_night”
- 设置成就触发器为“star_contact_death”
- 指定成就图标为“celestial_forging_anvil”
- 定义成就的父级为“the_start”
- 启用成就的遥测事件发送

---------

Co-authored-by: Pigeon_Nian <adove2005@163.com>

* fix(celestial): 修复演化音效衰减与锻造界面恢复 (#5131) (#5132)

- 将演化音乐归入唱片音量分类,并以单声道音源实现 64 格原生距离衰减。
- 保持音效与字幕的听距一致。
- 通过实时同步入口恢复锻造状态,避免重开界面时丢失正在锻造的进度。

* fix(building): 修复幻灵铁砧虚影撤销时重复返还物品 (#5134)

- 撤销无掉落幻灵铁砧虚影时不再结算基础物品
- 保留实体铁砧与其他下落方块的资源结算

fixed #5133

* fix(item-splitter): 修复物品分配器掉落物超出堆叠上限 (#5136)

按物品实际堆叠上限拆分每个目标位置的掉落物,保留均分份额、余数、零动量和拾取延迟。

修复 #5135

* fix(button): 修复大红按钮遮挡边缘交互与按压动画 (#5141)

- 使用实际命中位置进行服务端射线校验,修复按钮可见但底座中心被遮挡时无法按下的问题。
- 按住按钮后等待服务端确认再播放手部动画,并忽略已释放或已切换目标的过期确认。
- fixed #5138

* fix(storage-port): 修复服务端扫描仓储端口时崩溃 (#5140)

- 优先使用原版 includeData 标志控制数据复制,避免服务端扫描读取客户端按键状态
- 保留 26.1 服务端中键克隆时的缓存、标记与流体数据

(cherry picked from commit d7c2f74)

---------

Co-authored-by: PigeonNian <78527064+PigeonNian@users.noreply.github.com>
Co-authored-by: Pigeon_Nian <adove2005@163.com>
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