注:本 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 的修法一致):
- 在方法开头把「上一个界面」存到局部变量;
- 把原来的
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/ 文件夹即可(仅客户端需要,服务端放不放都无影响)。
装好后在单人游戏里:
- 破坏一个方块(听到破坏声);
- 立刻快速打开再关闭物品栏(E 键);
- 正常情况下应该不再重复播放刚才的方块破坏声。
如果 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