Skip to content

Fix celestial audio and forging view 修复天体演化音效与锻造界面恢复 - #5132

Merged
PigeonNian merged 1 commit into
Anvil-Dev:dev/1.21/1.6from
WhereisFff:codex/fix-5131-celestial-audio-view
Oct 2, 2026
Merged

PigeonNian merged 1 commit into
Anvil-Dev:dev/1.21/1.6from
WhereisFff:codex/fix-5131-celestial-audio-view

Conversation

@WhereisFff

Copy link
Copy Markdown
Contributor

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

Copy link
Copy Markdown
Collaborator

⚠️ Dangerous command requires approval:

cd /opt/data/workspace/mcprobe && python3 - <<'EOF' 2>/dev/null || echo "heredoc failed"
EOF
python3 -c "print()" 2>/dev/null; unzip -p client-1.21.1.jar assets/minecraft/sounds.json > /tmp/vanilla_so...

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:

curl -s "https://api.github.com/repos/Anvil-Dev/AnvilCraft/issues/5131" -o /tmp/i5131.json; wc -c /tmp/i5131.json; head -c 400 /tmp/i5131.json; echo; echo "=== body ==="; python3 -c "
import json
d=js...

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:

cd /tmp && curl -s "https://piston-meta.mojang.com/v1/packages/22a1966494dfa4eeb5ee778c8e6ed5b774839582/1.21.1.json" -o /tmp/v1211.json && python3 /opt/data/workspace/gh_json.py /tmp/v1211.json 2>/dev...

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 #5132

操作: opened(PR 当前 open,mergeable_state: clean,1 commit,未合并)
范围: 5 文件 / +12 −3(3 Java + 1 生成 JSON + 1 二进制 ogg)
对账: 本地 rvbase1216 = 5c9ee48613、rvhead5132 = 66ec677620 与 API 的 base/head sha 完全一致;3-dot diff 即本 PR 的 5 个文件(head 与 base tip 在 TriggerUtil/advancement 等无关文件上分叉,GitHub 判 clean,无冲突,合并后以 base 版本为准即可)
标题: 已是 <English> <中文> 且准确,未修改


📋 声称验证(3 条 + fix #5131 全部核实)

声称 结论 证据(离线取证)
演化音乐归入唱片音量分类 ✅ 1.21.1 SoundEngine.play 中 SoundInstance.getSource() 仅有一处调用点,紧接 calculateVolume(float, SoundSource)(音量分类);全类 SoundSource 静态字段只读到 MASTER,没有 MUSIC/RECORDS 的衰减或暂停特判 ⇒ 此改动正好治 #5131 第一症状(关掉「音乐」滑块完全听不到),且不影响距离衰减
单声道实现 64 格原生距离衰减 ✅ 字节码核实链路:sounds.json 条目 attenuation_distance(int,默认 16,键名在 SoundEventRegistrationSerializer 中确认) → Sound.attenuationDistance → SoundEngine.play → Attenuation.LINEAR 时 Channel.linearAttenuation()。旧文件 立体声/48 kHz/192 kbps,新文件 单声道/48 kHz/239.9 kbps,时长同为 71.77 s;与 (L+R)/2 参考解码相关系数 0.9999、电平差 +0.05 dB、RMS 均 −16.3 dBFS、峰值 −0.3 dBFS ⇒ 干净降混,无电平漂移/相位抵消
音效与字幕听距一致 ✅ 同一个 attenuation 值也传给 SoundEventListener.onPlaySound(instance, …, float) → SubtitleOverlay 的 Subtitle 持有该 range ⇒ 改 sounds.json 会同时改字幕可见距离,描述准确。字幕 key subtitles.anvilcraft.quenched_out 在 base 已存在(en_us/en_ud),能显示
fixed #5131 ✅ Issue 两条症状(关音乐后听不到;点锻造→关 UI→重开回到初始界面)与本 PR 三处改动一一对应

根因补充(建议写进 PR 描述,对维护者价值高): ModSoundEvents.QUENCHED_OUT 早已是 createFixedRangeEvent(loc, 64),但它只决定服务端发包半径(SoundEvent.getRange 的调用者只有 Level/ServerLevel.playSound* 系;SoundEngine 全类不引用 SoundEvent 任何方法)。也就是说改动前是「包发到 64 格、客户端 16 格外静音、字幕 16 格外消失」的不对称 —— 这正是本次真正修掉的根因,而 sounds.json 的 attenuation_distance: 64 才是客户端生效的那一半。


🔴 关键问题

无。

⚠️ 警告(非阻塞,建议合并前后处理)

  1. 同步包仍会先跑一遍「持久化加载器」(CelestialForgingAnvilBlockEntity.java:1187 的 super.handleUpdateTag):
    loadWithComponents → loadAdditional → CfaSearchController.loadPersistent(...)。而 getUpdateTag 不写 searchCapturedSeed / searchSeedStateKnown(只有 saveAdditional 经 searchController.save 才写),因此 loadPersistent 在 searching == true 时必然命中 "older saves" 分支执行 stop(false, false):
    • 这就是原 bug 的根因:旧路径 onDataPacket → loadWithComponents → loadPersistent 让每收到一次同步包就把客户端搜索态清零 → 重开 UI 显示「最开始」;
    • 现在能修好,靠的是随后的 loadSynced(...) 覆盖回来 + 目前 stop() 无副作用(只改本地字段,不 sync、不清天体数据)。依赖「先持久化、后同步」的执行顺序,比较脆弱:将来若给 stop()/loadPersistent 加副作用(清天体数据、触发动画、发包),bug 会原地复活。
    • 建议二选一:(a) 同步路径不调 super(handleUpdateTag 只做同步解码);(b) 更彻底:让 CfaSearchController.loadPersistent 显式区分「磁盘加载」与「同步应用」(参数/标志位,或按 tag 标记判断),把 seed 启发式限制在真正的持久化路径上。
  2. 区块首次加载路径可能仍有同一根因:BE 第 1110 行注释认为客户端区块加载走 loadAdditional(vanilla ClientPacketListener 中 (ClientboundBlockEntityDataPacket, BlockEntity) 辅助方法确实调用 loadWithComponents,NeoForge 把它换成了 onDataPacket)。若这条路径同样触发上面的 stop(),玩家首次加载/重进区块时会短暂显示非锻造态,直到下一次 sendBlockUpdated(搜索/加速期间每 tick sync(),通常立刻自愈)。建议确认这条路径,或在上面 (b) 方案里一并统一。

💡 建议

  1. 新版 onDataPacket 去掉了原版/NeoForge 默认实现里的 if (packet.getTag() != null) 判空,而 handleUpdateTag 第一行就 tag.getBoolean("amplified")。虽然正常路径 tag 非空,但保留判空可维持「null 时静默忽略」的原语义,避免理论 NPE。
  2. 长曲目可考虑 stream(true):原版 music_disc.* 一律 {"name": "records/…", "stream": true};本曲 71.77 s,单声道解码后 PCM ≈ 6.9 MB(改 mono 已从 ≈13.8 MB 砍半),不流式会把整段 PCM 常驻 OpenAL buffer。非本 PR 引入,仅建议(provider 加 .stream(true) 并重跑 runData)。
  3. 描述里「以单声道音源实现 64 格原生距离衰减」宜补一句限定:客户端可听距离由 sounds.json attenuation_distance 决定,createFixedRangeEvent(64) 只管服务端发包半径(见上)。另:64 超过原版自用上限(1.21.1 显式声明共 145 条、最大 48,无范围校验,合法),是有意为之、与代码注释「让围观超新星的玩家都能听到」一致。

🟢 看起来不错

  • 改法最小且与仓库既有约定一致:onDataPacket → handleUpdateTag 正是本仓库其他 BE(FeCollector/PowerConverter/Charger/Discharger/MonolithCore/SpacetimeSupercomputer…)已有的模式,本 PR 把该模式补到唯一漏掉的 CFA BE 上。
  • 已核对同族 BE(CelestialForgingAnvilFluidInterfaceBlockEntity、…LaserInterfaceBlockEntity、…PortalBlockEntity、CreativeLaserBlockEntity):它们的 handleUpdateTag 与 loadAdditional 读同一批 key,没有同类隐患 ⇒ 本次只改 CFA 是正确的最小范围。
  • 单声道化与原版约定完全对齐:实测原版 records/cat.ogg、records/11.ogg 为单声道 44.1 kHz,music/game/* 为立体声且以 Attenuation.NONE 非定位播放 —— 「唱片 = 单声道 + RECORDS」正是原版做法。
  • provider 与生成物同步更新(.attenuationDistance(64) ↔ src/generated/resources/.../sounds.json 的 {"attenuation_distance": 64, "name": …}),键名/类型与 1.21.1 原版解析器一致,无 runData 漂移。
  • 新增 import 字典序正确,行长 128 < checkstyle LineLength max=140 ✓。

🧪 测试建议

被测目标 推荐场景 优先级
CelestialForgingAnvilBlockEntity.onDataPacket/handleUpdateTag 起搜索 → 投递数据包 → 断言客户端 isSearching()/getSearchTicksRemaining() 保持;再断言重开 UI 状态不回退 🔴
CfaSearchController.loadPersistent 传入「不含 searchCapturedSeed/searchSeedStateKnown 的同步 tag」→ 断言不触发 stop()(或状态未被清零) 🔴
QuenchedOutSound + sounds.json 断言音源为 RECORDS、Attenuation.LINEAR、attenuation_distance=64;/stopsound records 能停;音量滑块归「唱片」 🟡
ModSoundDefinitionsProvider runData 幂等(重跑无 diff) 🟢

结论: 建议合并(无阻塞项) —— 三处改动定位准确、有据可查,两条 ⚠️ 属健壮性/维护性问题,建议(尤其第 1 条)择机处理。


由 Hermes Agent 审查(离线取证:本地 1.21.1 client jar + Mojang mappings 反汇编、原版 sounds.json 镜像、ogg 头解析与 PCM 对账)

@WhereisFff
WhereisFff marked this pull request as ready for review October 2, 2026 10:11
Copilot AI balanced review requested due to automatic review settings October 2, 2026 10:11

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@Gugle2308

Copy link
Copy Markdown
Collaborator

⏳ Retrying in 2.1s (attempt 1/3)...

@Gugle2308

Copy link
Copy Markdown
Collaborator

⏳ Retrying in 4.1s (attempt 2/3)...

@Gugle2308

Copy link
Copy Markdown
Collaborator

❌ API failed after 3 retries — HTTP 503: Service temporarily unavailable

@Gugle2308

Copy link
Copy Markdown
Collaborator

API call failed after 3 retries: HTTP 503: Service temporarily unavailable

@Gugle2308

Copy link
Copy Markdown
Collaborator

⏳ Retrying in 2.2s (attempt 1/3)...

@Gugle2308

Copy link
Copy Markdown
Collaborator

⏳ Retrying in 4.3s (attempt 2/3)...

@Gugle2308

Copy link
Copy Markdown
Collaborator

❌ API failed after 3 retries — HTTP 503: Service temporarily unavailable

@Gugle2308

Copy link
Copy Markdown
Collaborator

API call failed after 3 retries: HTTP 503: Service temporarily unavailable

@PigeonNian
PigeonNian merged commit 6273f60 into Anvil-Dev:dev/1.21/1.6 Oct 2, 2026
2 checks passed
@Gugle2308

Copy link
Copy Markdown
Collaborator

PR #5132 已 closed(由 @PigeonNian 合并入 Anvil-Dev:dev/1.21/1.6,merge commit 6273f60d7380988b1f5e367c69d987dc609b7414,页面 data-status="pullMerged" / 内嵌 "state":"MERGED" 双路一致)。

按 webhook 约定,closed 事件跳过内容审查,本轮不作评论、不改标题。

由 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.

[Bug] 锻星砧演化时播放的音乐走的类型不对,锻造天体时退出UI重进没有保持锻造UI

4 participants