Skip to content

About

Fixes MC-35714/MC-96204 (GUI sound replay) for Minecraft 1.7.10

Resources

Stars

1 star

Watchers

0 watching

Forks

Latest commit

 

History

2 Commits

Folders and files

Repository files navigation

Sound Repeat Fix (1.7.10)

注:本 README 由 AI 生成。

一个 Minecraft 1.7.10 修复模组(CoreMod)。作者:Yuno。

只做一件事:修复 MC-35714 / MC-96204「Audio GUI Repeats Sound」 这个原版音效 bug ——快速打开/关闭任意 GUI(物品栏、箱子、工作台等)时,会把上一次播放的音效(例如方块破坏声)重新播放一遍。

修复原理

原版 1.7.10 的 net.minecraft.client.Minecraft.displayGuiScreen() 在关闭任意界面时都会调用 SoundHandler.resumeSounds(),即使音效系统根本没被暂停过。这次多余的调用会让底层 SoundSystem 把最近一次声音重新播放出来,从而产生「重复音效」。

本模组通过 ASM 对 Minecraft.displayGuiScreen() 做一个极小的局部改动(与官方后续版本 / GTNH 社区 Hodgepodge 的修法一致):

  1. 在方法开头把「上一个界面」存到局部变量;
  2. 把原来的 resumeSounds() 调用替换成 SoundRepeatFixHooks.maybeResumeSounds(...), 只有满足以下条件时才真正恢复声音:
    • 上一个界面是 GuiIngameMenu(游戏内暂停菜单);
    • 是单人游戏;
    • 且没有开放局域网(!getIntegratedServer().getPublic())。

这样其他任何 GUI 的开关都不会再触发声音重放,同时不影响正常的暂停菜单声音恢复。

兼容性(多模组客户端)

  • 无 Mixin 依赖:使用的是 1.7.10 原生的 FML CoreMod(IClassTransformer + ASM), 不需要 UniMixins / SpongeMixins 之类的 Mixin 加载器,也就不会和其它使用 Mixin 的模组抢版本。
  • 改动极小且只针对一处:只 patch Minecraft.displayGuiScreen 里 resumeSounds() 这一个调用点, 不替换整个方法,尽量避开其它 CoreMod 的改动区域。
  • 名字自适应:通过 FMLDeobfuscatingRemapper 在运行时解析混淆/非混淆的方法名, 不硬编码混淆后的方法名。
  • 失败安全:万一找不到目标方法/调用点,只会在日志里打印一行提示并保持原版行为,不会崩溃。
  • 所有对原版类的引用都集中在 SoundRepeatFixHooks 里,交给 Forge 标准构建流程做 reobfuscate,ASM 转换器本身不依赖混淆名。

构建

环境要求:

  • JDK 8(ForgeGradle 1.2 无法在 JDK 9+ 上运行;JAVA_HOME 需指向 JDK 8)
  • 能访问 https://maven.minecraftforge.net/ 和 https://jcenter.bintray.com/

仓库已自带 Gradle 5.6.4 的 wrapper(gradlew),无需单独安装 Gradle。 构建脚本使用 anatawa12 的 ForgeGradle fork(com.anatawa12.forge:ForgeGradle:1.2-1.0.+), 它兼容 Gradle 5.6.4(官方 ForgeGradle 1.2 只支持 Gradle 2.x)。

# Windows
gradlew.bat build

# Linux / macOS
./gradlew build

产物在 build/libs/SoundRepeatFix-1.7.10-1.0.0.jar(已 reobfuscate 成 SRG 名,可直接进客户端)。

安装

把 SoundRepeatFix-1.7.10-1.0.0.jar 丢进客户端的 mods/ 文件夹即可(仅客户端需要,服务端放不放都无影响)。

验证

装好后在单人游戏里:

  1. 破坏一个方块(听到破坏声);
  2. 立刻快速打开再关闭物品栏(E 键);
  3. 正常情况下应该不再重复播放刚才的方块破坏声。

如果 mod 正常工作,启动日志里会有一行:

[SoundRepeatFix] Patched Minecraft.displayGuiScreen (MC-35714 sound repeat fix).

项目结构

SoundRepeatFix/
├── build.gradle                       # 构建脚本(anatawa12 ForgeGradle fork)
├── gradle.properties
├── gradlew / gradlew.bat              # Gradle 5.6.4 wrapper
├── gradle/wrapper/                    # wrapper 配置 + 二进制 jar
└── src/main/
    ├── java/com/yuno/soundrepeatfix/
    │   ├── SoundRepeatFixPlugin.java      # IFMLLoadingPlugin(CoreMod 入口)
    │   ├── SoundRepeatFixTransformer.java # IClassTransformer(ASM 补丁)
    │   ├── SoundRepeatFixHooks.java       # 运行时钩子(引用原版 MCP 成员)
    │   └── SoundRepeatFixMod.java         # @Mod 容器(让模组出现在模组列表)
    └── resources/
        └── mcmod.info

许可证

MIT License · Copyright (c) 2026 YunoSeng

About

Fixes MC-35714/MC-96204 (GUI sound replay) for Minecraft 1.7.10

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages