Skip to content

fix: 修复未启用按键相关功能时 FixDebugKeyboardInput 失效的问题 - #143

Open
zhicheng233 wants to merge 9 commits into
MuNET-OSS:mainfrom
zhicheng233:fix/Esc-failure
Open

fix: 修复未启用按键相关功能时 FixDebugKeyboardInput 失效的问题#143
zhicheng233 wants to merge 9 commits into
MuNET-OSS:mainfrom
zhicheng233:fix/Esc-failure

Conversation

@zhicheng233

@zhicheng233 zhicheng233 commented Aug 24, 2026

Copy link
Copy Markdown
Contributor

该问题最直接的表现是:在未启用任何使用 KeyListener 的功能时(如虚拟投币、重置触摸面板),按下 ESC 无法退出游戏。其他依赖 FixDebugKeyboardInput 的按键功能也会受到同样影响。

由于 KeyListener.CheckLongPush() 的优先级在 GetKeyDown() 之前,导致 Mono JIT 在编译 GameMainObject.Update() 时(此时 DebugInput.GetKeyDown() 还没被Patch),将 GetKeyDown() 优化内联成 false
该方法用于在Patch DebugInput.GetKeyDown() 后重新Patch Update()Mono JIT 重新编译取消内联优化

Review in cubic

Sourcery 摘要

通过在相关内层方法补丁完成后重新编译外层调用方法,恢复受 Mono JIT 内联影响的按键和输入功能。

错误修复:

  • 修复因 Mono JIT 内联导致按键及其他依赖方法补丁失效的问题,确保相关功能在运行时正常工作。

改进:

  • 新增通用的 Mono 方法重新编译辅助工具,并在关键更新方法补丁完成后集中触发重新编译。
  • 将既有的临时补丁 workaround 统一替换为可复用的重编译机制,并支持具体 Mod 按需调用。
Original summary in English

Sourcery 总结

通过在相关内层方法完成补丁后重新编译调用方,确保 Mono JIT 使用最新的 Harmony 补丁实现。

错误修复:

  • 修复 Mono JIT 内联导致 Harmony 按键和输入相关补丁失效的问题,恢复 ESC 退出及其他依赖输入补丁的功能。

改进:

  • 新增可复用的 Mono 方法重编译辅助工具,并在关键游戏更新方法及触摸面板补丁完成后触发重编译。
  • 移除 TestProof 和 DisplayTouchInGame 中用于规避补丁失效的临时 workaround,改用统一的重编译机制。
Original summary in English

Summary by Sourcery

通过在相关内层方法完成补丁后重新编译调用方,确保 Mono JIT 使用最新的 Harmony 补丁实现。

Bug Fixes:

  • 修复 Mono JIT 内联导致 Harmony 按键和输入相关补丁失效的问题,恢复 ESC 退出及其他依赖输入补丁的功能。

Enhancements:

  • 新增可复用的 Mono 方法重编译辅助工具,并在关键游戏更新方法及触摸面板补丁完成后触发重编译。
  • 移除 TestProof 和 DisplayTouchInGame 中用于规避补丁失效的临时 workaround,改用统一的重编译机制。
Original summary in English

Sourcery 总结

通过在相关内层方法完成补丁后重新编译调用方,确保 Mono JIT 使用最新的 Harmony 补丁实现。

错误修复:

  • 修复 Mono JIT 内联导致 Harmony 按键和输入相关补丁失效的问题,恢复 ESC 退出及其他依赖输入补丁的功能。

改进:

  • 新增可复用的 Mono 方法重编译辅助工具,并在关键游戏更新方法及触摸面板补丁完成后触发重编译。
  • 移除 TestProof 和 DisplayTouchInGame 中用于规避补丁失效的临时 workaround,改用统一的重编译机制。
Original summary in English

Summary by Sourcery

通过在相关内层方法完成补丁后重新编译调用方,确保 Mono JIT 使用最新的 Harmony 补丁实现。

Bug Fixes:

  • 修复 Mono JIT 内联导致 Harmony 按键和输入相关补丁失效的问题,恢复 ESC 退出及其他依赖输入补丁的功能。

Enhancements:

  • 新增可复用的 Mono 方法重编译辅助工具,并在关键游戏更新方法及触摸面板补丁完成后触发重编译。
  • 移除 TestProof 和 DisplayTouchInGame 中用于规避补丁失效的临时 workaround,改用统一的重编译机制。
Original summary in English

Sourcery 摘要

通过在相关内层方法补丁完成后重新编译外层调用方法,恢复受 Mono JIT 内联影响的按键和输入功能。

错误修复:

  • 修复因 Mono JIT 内联导致按键及其他依赖方法补丁失效的问题,确保相关功能在运行时正常工作。

改进:

  • 新增通用的 Mono 方法重新编译辅助工具,并在关键更新方法补丁完成后集中触发重新编译。
  • 将既有的临时补丁 workaround 统一替换为可复用的重编译机制,并支持具体 Mod 按需调用。
Original summary in English

Sourcery 总结

通过在相关内层方法完成补丁后重新编译调用方,确保 Mono JIT 使用最新的 Harmony 补丁实现。

错误修复:

  • 修复 Mono JIT 内联导致 Harmony 按键和输入相关补丁失效的问题,恢复 ESC 退出及其他依赖输入补丁的功能。

改进:

  • 新增可复用的 Mono 方法重编译辅助工具,并在关键游戏更新方法及触摸面板补丁完成后触发重编译。
  • 移除 TestProof 和 DisplayTouchInGame 中用于规避补丁失效的临时 workaround,改用统一的重编译机制。
Original summary in English

Summary by Sourcery

通过在相关内层方法完成补丁后重新编译调用方,确保 Mono JIT 使用最新的 Harmony 补丁实现。

Bug Fixes:

  • 修复 Mono JIT 内联导致 Harmony 按键和输入相关补丁失效的问题,恢复 ESC 退出及其他依赖输入补丁的功能。

Enhancements:

  • 新增可复用的 Mono 方法重编译辅助工具,并在关键游戏更新方法及触摸面板补丁完成后触发重编译。
  • 移除 TestProof 和 DisplayTouchInGame 中用于规避补丁失效的临时 workaround,改用统一的重编译机制。
Original summary in English

Sourcery 总结

通过在相关内层方法完成补丁后重新编译调用方,确保 Mono JIT 使用最新的 Harmony 补丁实现。

错误修复:

  • 修复 Mono JIT 内联导致 Harmony 按键和输入相关补丁失效的问题,恢复 ESC 退出及其他依赖输入补丁的功能。

改进:

  • 新增可复用的 Mono 方法重编译辅助工具,并在关键游戏更新方法及触摸面板补丁完成后触发重编译。
  • 移除 TestProof 和 DisplayTouchInGame 中用于规避补丁失效的临时 workaround,改用统一的重编译机制。
Original summary in English

Summary by Sourcery

通过在相关内层方法完成补丁后重新编译调用方,确保 Mono JIT 使用最新的 Harmony 补丁实现。

Bug Fixes:

  • 修复 Mono JIT 内联导致 Harmony 按键和输入相关补丁失效的问题,恢复 ESC 退出及其他依赖输入补丁的功能。

Enhancements:

  • 新增可复用的 Mono 方法重编译辅助工具,并在关键游戏更新方法及触摸面板补丁完成后触发重编译。
  • 移除 TestProof 和 DisplayTouchInGame 中用于规避补丁失效的临时 workaround,改用统一的重编译机制。
Original summary in English

Sourcery 摘要

通过在相关内层方法补丁完成后重新编译外层调用方法,恢复受 Mono JIT 内联影响的按键和输入功能。

错误修复:

  • 修复因 Mono JIT 内联导致按键及其他依赖方法补丁失效的问题,确保相关功能在运行时正常工作。

改进:

  • 新增通用的 Mono 方法重新编译辅助工具,并在关键更新方法补丁完成后集中触发重新编译。
  • 将既有的临时补丁 workaround 统一替换为可复用的重编译机制,并支持具体 Mod 按需调用。
Original summary in English

Sourcery 总结

通过在相关内层方法完成补丁后重新编译调用方,确保 Mono JIT 使用最新的 Harmony 补丁实现。

错误修复:

  • 修复 Mono JIT 内联导致 Harmony 按键和输入相关补丁失效的问题,恢复 ESC 退出及其他依赖输入补丁的功能。

改进:

  • 新增可复用的 Mono 方法重编译辅助工具,并在关键游戏更新方法及触摸面板补丁完成后触发重编译。
  • 移除 TestProof 和 DisplayTouchInGame 中用于规避补丁失效的临时 workaround,改用统一的重编译机制。
Original summary in English

Summary by Sourcery

通过在相关内层方法完成补丁后重新编译调用方,确保 Mono JIT 使用最新的 Harmony 补丁实现。

Bug Fixes:

  • 修复 Mono JIT 内联导致 Harmony 按键和输入相关补丁失效的问题,恢复 ESC 退出及其他依赖输入补丁的功能。

Enhancements:

  • 新增可复用的 Mono 方法重编译辅助工具,并在关键游戏更新方法及触摸面板补丁完成后触发重编译。
  • 移除 TestProof 和 DisplayTouchInGame 中用于规避补丁失效的临时 workaround,改用统一的重编译机制。
Original summary in English

Sourcery 总结

通过在相关内层方法完成补丁后重新编译调用方,确保 Mono JIT 使用最新的 Harmony 补丁实现。

错误修复:

  • 修复 Mono JIT 内联导致 Harmony 按键和输入相关补丁失效的问题,恢复 ESC 退出及其他依赖输入补丁的功能。

改进:

  • 新增可复用的 Mono 方法重编译辅助工具,并在关键游戏更新方法及触摸面板补丁完成后触发重编译。
  • 移除 TestProof 和 DisplayTouchInGame 中用于规避补丁失效的临时 workaround,改用统一的重编译机制。
Original summary in English

Summary by Sourcery

通过在相关内层方法完成补丁后重新编译调用方,确保 Mono JIT 使用最新的 Harmony 补丁实现。

Bug Fixes:

  • 修复 Mono JIT 内联导致 Harmony 按键和输入相关补丁失效的问题,恢复 ESC 退出及其他依赖输入补丁的功能。

Enhancements:

  • 新增可复用的 Mono 方法重编译辅助工具,并在关键游戏更新方法及触摸面板补丁完成后触发重编译。
  • 移除 TestProof 和 DisplayTouchInGame 中用于规避补丁失效的临时 workaround,改用统一的重编译机制。
Original summary in English

Sourcery 摘要

通过在相关内层方法补丁完成后重新编译外层调用方法,恢复受 Mono JIT 内联影响的按键和输入功能。

错误修复:

  • 修复因 Mono JIT 内联导致按键及其他依赖方法补丁失效的问题,确保相关功能在运行时正常工作。

改进:

  • 新增通用的 Mono 方法重新编译辅助工具,并在关键更新方法补丁完成后集中触发重新编译。
  • 将既有的临时补丁 workaround 统一替换为可复用的重编译机制,并支持具体 Mod 按需调用。
Original summary in English

Sourcery 总结

通过在相关内层方法完成补丁后重新编译调用方,确保 Mono JIT 使用最新的 Harmony 补丁实现。

错误修复:

  • 修复 Mono JIT 内联导致 Harmony 按键和输入相关补丁失效的问题,恢复 ESC 退出及其他依赖输入补丁的功能。

改进:

  • 新增可复用的 Mono 方法重编译辅助工具,并在关键游戏更新方法及触摸面板补丁完成后触发重编译。
  • 移除 TestProof 和 DisplayTouchInGame 中用于规避补丁失效的临时 workaround,改用统一的重编译机制。
Original summary in English

Summary by Sourcery

通过在相关内层方法完成补丁后重新编译调用方,确保 Mono JIT 使用最新的 Harmony 补丁实现。

Bug Fixes:

  • 修复 Mono JIT 内联导致 Harmony 按键和输入相关补丁失效的问题,恢复 ESC 退出及其他依赖输入补丁的功能。

Enhancements:

  • 新增可复用的 Mono 方法重编译辅助工具,并在关键游戏更新方法及触摸面板补丁完成后触发重编译。
  • 移除 TestProof 和 DisplayTouchInGame 中用于规避补丁失效的临时 workaround,改用统一的重编译机制。
Original summary in English

Sourcery 总结

通过在相关内层方法完成补丁后重新编译调用方,确保 Mono JIT 使用最新的 Harmony 补丁实现。

错误修复:

  • 修复 Mono JIT 内联导致 Harmony 按键和输入相关补丁失效的问题,恢复 ESC 退出及其他依赖输入补丁的功能。

改进:

  • 新增可复用的 Mono 方法重编译辅助工具,并在关键游戏更新方法及触摸面板补丁完成后触发重编译。
  • 移除 TestProof 和 DisplayTouchInGame 中用于规避补丁失效的临时 workaround,改用统一的重编译机制。
Original summary in English

Summary by Sourcery

通过在相关内层方法完成补丁后重新编译调用方,确保 Mono JIT 使用最新的 Harmony 补丁实现。

Bug Fixes:

  • 修复 Mono JIT 内联导致 Harmony 按键和输入相关补丁失效的问题,恢复 ESC 退出及其他依赖输入补丁的功能。

Enhancements:

  • 新增可复用的 Mono 方法重编译辅助工具,并在关键游戏更新方法及触摸面板补丁完成后触发重编译。
  • 移除 TestProof 和 DisplayTouchInGame 中用于规避补丁失效的临时 workaround,改用统一的重编译机制。
Original summary in English

Sourcery 摘要

通过在相关内层方法补丁完成后重新编译外层调用方法,恢复受 Mono JIT 内联影响的按键和输入功能。

错误修复:

  • 修复因 Mono JIT 内联导致按键及其他依赖方法补丁失效的问题,确保相关功能在运行时正常工作。

改进:

  • 新增通用的 Mono 方法重新编译辅助工具,并在关键更新方法补丁完成后集中触发重新编译。
  • 将既有的临时补丁 workaround 统一替换为可复用的重编译机制,并支持具体 Mod 按需调用。
Original summary in English

Sourcery 总结

通过在相关内层方法完成补丁后重新编译调用方,确保 Mono JIT 使用最新的 Harmony 补丁实现。

错误修复:

  • 修复 Mono JIT 内联导致 Harmony 按键和输入相关补丁失效的问题,恢复 ESC 退出及其他依赖输入补丁的功能。

改进:

  • 新增可复用的 Mono 方法重编译辅助工具,并在关键游戏更新方法及触摸面板补丁完成后触发重编译。
  • 移除 TestProof 和 DisplayTouchInGame 中用于规避补丁失效的临时 workaround,改用统一的重编译机制。
Original summary in English

Summary by Sourcery

通过在相关内层方法完成补丁后重新编译调用方,确保 Mono JIT 使用最新的 Harmony 补丁实现。

Bug Fixes:

  • 修复 Mono JIT 内联导致 Harmony 按键和输入相关补丁失效的问题,恢复 ESC 退出及其他依赖输入补丁的功能。

Enhancements:

  • 新增可复用的 Mono 方法重编译辅助工具,并在关键游戏更新方法及触摸面板补丁完成后触发重编译。
  • 移除 TestProof 和 DisplayTouchInGame 中用于规避补丁失效的临时 workaround,改用统一的重编译机制。
Original summary in English

Sourcery 总结

通过在相关内层方法完成补丁后重新编译调用方,确保 Mono JIT 使用最新的 Harmony 补丁实现。

错误修复:

  • 修复 Mono JIT 内联导致 Harmony 按键和输入相关补丁失效的问题,恢复 ESC 退出及其他依赖输入补丁的功能。

改进:

  • 新增可复用的 Mono 方法重编译辅助工具,并在关键游戏更新方法及触摸面板补丁完成后触发重编译。
  • 移除 TestProof 和 DisplayTouchInGame 中用于规避补丁失效的临时 workaround,改用统一的重编译机制。
Original summary in English

Summary by Sourcery

通过在相关内层方法完成补丁后重新编译调用方,确保 Mono JIT 使用最新的 Harmony 补丁实现。

Bug Fixes:

  • 修复 Mono JIT 内联导致 Harmony 按键和输入相关补丁失效的问题,恢复 ESC 退出及其他依赖输入补丁的功能。

Enhancements:

  • 新增可复用的 Mono 方法重编译辅助工具,并在关键游戏更新方法及触摸面板补丁完成后触发重编译。
  • 移除 TestProof 和 DisplayTouchInGame 中用于规避补丁失效的临时 workaround,改用统一的重编译机制。
Original summary in English

Sourcery 摘要

通过在相关内层方法补丁完成后重新编译外层调用方法,恢复受 Mono JIT 内联影响的按键和输入功能。

错误修复:

  • 修复因 Mono JIT 内联导致按键及其他依赖方法补丁失效的问题,确保相关功能在运行时正常工作。

改进:

  • 新增通用的 Mono 方法重新编译辅助工具,并在关键更新方法补丁完成后集中触发重新编译。
  • 将既有的临时补丁 workaround 统一替换为可复用的重编译机制,并支持具体 Mod 按需调用。
Original summary in English

Sourcery 总结

通过在相关内层方法完成补丁后重新编译调用方,确保 Mono JIT 使用最新的 Harmony 补丁实现。

错误修复:

  • 修复 Mono JIT 内联导致 Harmony 按键和输入相关补丁失效的问题,恢复 ESC 退出及其他依赖输入补丁的功能。

改进:

  • 新增可复用的 Mono 方法重编译辅助工具,并在关键游戏更新方法及触摸面板补丁完成后触发重编译。
  • 移除 TestProof 和 DisplayTouchInGame 中用于规避补丁失效的临时 workaround,改用统一的重编译机制。
Original summary in English

Summary by Sourcery

通过在相关内层方法完成补丁后重新编译调用方,确保 Mono JIT 使用最新的 Harmony 补丁实现。

Bug Fixes:

  • 修复 Mono JIT 内联导致 Harmony 按键和输入相关补丁失效的问题,恢复 ESC 退出及其他依赖输入补丁的功能。

Enhancements:

  • 新增可复用的 Mono 方法重编译辅助工具,并在关键游戏更新方法及触摸面板补丁完成后触发重编译。
  • 移除 TestProof 和 DisplayTouchInGame 中用于规避补丁失效的临时 workaround,改用统一的重编译机制。
Original summary in English

Sourcery 总结

通过在相关内层方法完成补丁后重新编译调用方,确保 Mono JIT 使用最新的 Harmony 补丁实现。

错误修复:

  • 修复 Mono JIT 内联导致 Harmony 按键和输入相关补丁失效的问题,恢复 ESC 退出及其他依赖输入补丁的功能。

改进:

  • 新增可复用的 Mono 方法重编译辅助工具,并在关键游戏更新方法及触摸面板补丁完成后触发重编译。
  • 移除 TestProof 和 DisplayTouchInGame 中用于规避补丁失效的临时 workaround,改用统一的重编译机制。
Original summary in English

Summary by Sourcery

通过在相关内层方法完成补丁后重新编译调用方,确保 Mono JIT 使用最新的 Harmony 补丁实现。

Bug Fixes:

  • 修复 Mono JIT 内联导致 Harmony 按键和输入相关补丁失效的问题,恢复 ESC 退出及其他依赖输入补丁的功能。

Enhancements:

  • 新增可复用的 Mono 方法重编译辅助工具,并在关键游戏更新方法及触摸面板补丁完成后触发重编译。
  • 移除 TestProof 和 DisplayTouchInGame 中用于规避补丁失效的临时 workaround,改用统一的重编译机制。
Original summary in English

Sourcery 摘要

通过在相关内层方法补丁完成后重新编译外层调用方法,恢复受 Mono JIT 内联影响的按键和输入功能。

错误修复:

  • 修复因 Mono JIT 内联导致按键及其他依赖方法补丁失效的问题,确保相关功能在运行时正常工作。

改进:

  • 新增通用的 Mono 方法重新编译辅助工具,并在关键更新方法补丁完成后集中触发重新编译。
  • 将既有的临时补丁 workaround 统一替换为可复用的重编译机制,并支持具体 Mod 按需调用。
Original summary in English

Sourcery 总结

通过在相关内层方法完成补丁后重新编译调用方,确保 Mono JIT 使用最新的 Harmony 补丁实现。

错误修复:

  • 修复 Mono JIT 内联导致 Harmony 按键和输入相关补丁失效的问题,恢复 ESC 退出及其他依赖输入补丁的功能。

改进:

  • 新增可复用的 Mono 方法重编译辅助工具,并在关键游戏更新方法及触摸面板补丁完成后触发重编译。
  • 移除 TestProof 和 DisplayTouchInGame 中用于规避补丁失效的临时 workaround,改用统一的重编译机制。
Original summary in English

Summary by Sourcery

通过在相关内层方法完成补丁后重新编译调用方,确保 Mono JIT 使用最新的 Harmony 补丁实现。

Bug Fixes:

  • 修复 Mono JIT 内联导致 Harmony 按键和输入相关补丁失效的问题,恢复 ESC 退出及其他依赖输入补丁的功能。

Enhancements:

  • 新增可复用的 Mono 方法重编译辅助工具,并在关键游戏更新方法及触摸面板补丁完成后触发重编译。
  • 移除 TestProof 和 DisplayTouchInGame 中用于规避补丁失效的临时 workaround,改用统一的重编译机制。
Original summary in English

Sourcery 总结

通过在相关内层方法完成补丁后重新编译调用方,确保 Mono JIT 使用最新的 Harmony 补丁实现。

错误修复:

  • 修复 Mono JIT 内联导致 Harmony 按键和输入相关补丁失效的问题,恢复 ESC 退出及其他依赖输入补丁的功能。

改进:

  • 新增可复用的 Mono 方法重编译辅助工具,并在关键游戏更新方法及触摸面板补丁完成后触发重编译。
  • 移除 TestProof 和 DisplayTouchInGame 中用于规避补丁失效的临时 workaround,改用统一的重编译机制。
Original summary in English

Summary by Sourcery

通过在相关内层方法完成补丁后重新编译调用方,确保 Mono JIT 使用最新的 Harmony 补丁实现。

Bug Fixes:

  • 修复 Mono JIT 内联导致 Harmony 按键和输入相关补丁失效的问题,恢复 ESC 退出及其他依赖输入补丁的功能。

Enhancements:

  • 新增可复用的 Mono 方法重编译辅助工具,并在关键游戏更新方法及触摸面板补丁完成后触发重编译。
  • 移除 TestProof 和 DisplayTouchInGame 中用于规避补丁失效的临时 workaround,改用统一的重编译机制。
Original summary in English

Sourcery 摘要

通过在相关内层方法补丁完成后重新编译外层调用方法,恢复受 Mono JIT 内联影响的按键和输入功能。

错误修复:

  • 修复因 Mono JIT 内联导致按键及其他依赖方法补丁失效的问题,确保相关功能在运行时正常工作。

改进:

  • 新增通用的 Mono 方法重新编译辅助工具,并在关键更新方法补丁完成后集中触发重新编译。
  • 将既有的临时补丁 workaround 统一替换为可复用的重编译机制,并支持具体 Mod 按需调用。
Original summary in English

Sourcery 总结

通过在相关内层方法完成补丁后重新编译调用方,确保 Mono JIT 使用最新的 Harmony 补丁实现。

错误修复:

  • 修复 Mono JIT 内联导致 Harmony 按键和输入相关补丁失效的问题,恢复 ESC 退出及其他依赖输入补丁的功能。

改进:

  • 新增可复用的 Mono 方法重编译辅助工具,并在关键游戏更新方法及触摸面板补丁完成后触发重编译。
  • 移除 TestProof 和 DisplayTouchInGame 中用于规避补丁失效的临时 workaround,改用统一的重编译机制。
Original summary in English

Summary by Sourcery

通过在相关内层方法完成补丁后重新编译调用方,确保 Mono JIT 使用最新的 Harmony 补丁实现。

Bug Fixes:

  • 修复 Mono JIT 内联导致 Harmony 按键和输入相关补丁失效的问题,恢复 ESC 退出及其他依赖输入补丁的功能。

Enhancements:

  • 新增可复用的 Mono 方法重编译辅助工具,并在关键游戏更新方法及触摸面板补丁完成后触发重编译。
  • 移除 TestProof 和 DisplayTouchInGame 中用于规避补丁失效的临时 workaround,改用统一的重编译机制。
Original summary in English

Sourcery 总结

通过在相关内层方法完成补丁后重新编译调用方,确保 Mono JIT 使用最新的 Harmony 补丁实现。

错误修复:

  • 修复 Mono JIT 内联导致 Harmony 按键和输入相关补丁失效的问题,恢复 ESC 退出及其他依赖输入补丁的功能。

改进:

  • 新增可复用的 Mono 方法重编译辅助工具,并在关键游戏更新方法及触摸面板补丁完成后触发重编译。
  • 移除 TestProof 和 DisplayTouchInGame 中用于规避补丁失效的临时 workaround,改用统一的重编译机制。
Original summary in English

Summary by Sourcery

通过在相关内层方法完成补丁后重新编译调用方,确保 Mono JIT 使用最新的 Harmony 补丁实现。

Bug Fixes:

  • 修复 Mono JIT 内联导致 Harmony 按键和输入相关补丁失效的问题,恢复 ESC 退出及其他依赖输入补丁的功能。

Enhancements:

  • 新增可复用的 Mono 方法重编译辅助工具,并在关键游戏更新方法及触摸面板补丁完成后触发重编译。
  • 移除 TestProof 和 DisplayTouchInGame 中用于规避补丁失效的临时 workaround,改用统一的重编译机制。

Copilot AI lite review requested due to automatic review settings August 24, 2026 10:45
@sourcery-ai

sourcery-ai Bot commented Aug 24, 2026

Copy link
Copy Markdown

审查者指南

通过在相关内层方法完成 Harmony patch 后,使用独立 Harmony 实例对外层 caller 执行一次临时 patch/unpatch,强制 Mono JIT 重新编译并避免内联旧实现,从而恢复 ESC、输入检测及触摸面板等依赖功能;同时将既有临时 workaround 统一为可复用的全局或按 Mod 调用机制。

Harmony patch 后 Mono JIT 重新编译的时序图

sequenceDiagram
    participant Startup
    participant HarmonyPatchRecompile
    participant GameMainObject
    participant GameMain
    participant DebugInput
    participant InputManager

    Startup->>DebugInput: Harmony patch GetKeyDown
    Startup->>InputManager: Harmony patch GetSystemInputDown
    Startup->>HarmonyPatchRecompile: RecompileMethod(GameMainObject.Update)
    HarmonyPatchRecompile->>GameMainObject: temporary Patch(Update)
    HarmonyPatchRecompile->>GameMainObject: Unpatch(Update)
    Startup->>HarmonyPatchRecompile: RecompileMethod(GameMain.Update)
    HarmonyPatchRecompile->>GameMain: temporary Patch(Update)
    HarmonyPatchRecompile->>GameMain: Unpatch(Update)
    GameMainObject->>DebugInput: GetKeyDown
    GameMain->>InputManager: GetSystemInputDown
Loading

文件级变更

变更 详情 文件
新增通过临时 Harmony patch/unpatch 强制 Mono JIT 重新编译方法的通用辅助机制。
  • 使用独立 Harmony 实例注入并立即移除空 prefix,以避免影响现有业务 patch。
  • 提供按 MethodBase 或类型、方法名及参数类型定位目标方法的重编译 API,并记录失败警告。
  • 补充 Mono 内联导致 caller/callee patch 失效的背景、已知案例和使用约定。
AquaMai.Core/Helpers/HarmonyPatchRecompile.cs
在全局 patch 生命周期完成后重编译常见游戏更新方法,修复输入相关 patch 因内联失效的问题。
  • 在所有 Mod 的 OnAfterAllPatch 生命周期之后重编译 GameMainObject.Update 和 GameMain.Update。
  • 将集中式重编译放在错误状态检查前执行,并保留具体 Mod 按需触发重编译的扩展方式。
AquaMai.Core/Startup.cs
将既有的临时空 patch workaround 替换为显式的重编译调用。
  • 移除 TestProof 针对 GameMain.Update 的空 prefix workaround。
  • 移除 DisplayTouchInGame 针对 MouseTouchPanel.Start 的空 postfix,并通过 OnAfterPatch 调用重编译辅助方法。
AquaMai.Mods/GameSystem/TestProof.cs
AquaMai.Mods/Utils/DisplayTouchInGame.cs

提示和命令

与 Sourcery 交互

  • 触发新的审查: 在拉取请求中评论 @sourcery-ai review
  • 继续讨论: 直接回复 Sourcery 的审查评论。
  • 根据审查评论生成 GitHub issue: 回复审查评论,请 Sourcery 根据该评论创建 issue。你也可以回复审查评论并使用 @sourcery-ai issue,根据该评论创建 issue。
  • 生成拉取请求标题: 在拉取请求标题的任意位置写入 @sourcery-ai,即可随时生成标题。你也可以在拉取请求中评论 @sourcery-ai title,随时重新生成标题。
  • 生成拉取请求摘要: 在拉取请求正文中任意位置写入 @sourcery-ai summary,即可在指定位置随时生成 PR 摘要。你也可以在拉取请求中评论 @sourcery-ai summary,随时重新生成摘要。
  • 生成审查者指南: 在拉取请求中评论 @sourcery-ai guide,即可随时重新生成审查者指南。
  • 解决所有 Sourcery 评论: 在拉取请求中评论 @sourcery-ai resolve,即可解决所有 Sourcery 评论。如果你已经处理完所有评论且不想再看到它们,此功能会很有用。
  • 忽略所有 Sourcery 审查: 在拉取请求中评论 @sourcery-ai dismiss,即可忽略所有现有的 Sourcery 审查。如果你想从新的审查开始,这一功能尤其有用——别忘了评论 @sourcery-ai review 来触发新的审查!

自定义使用体验

访问你的控制面板

  • 启用或禁用审查功能,例如 Sourcery 生成的拉取请求摘要、审查者指南等。
  • 更改审查语言。
  • 添加、删除或编辑自定义审查说明。
  • 调整其他审查设置。

获取帮助

Original review guide in English

Reviewer's Guide

通过在相关内层方法完成 Harmony patch 后,使用独立 Harmony 实例对外层 caller 执行一次临时 patch/unpatch,强制 Mono JIT 重新编译并避免内联旧实现,从而恢复 ESC、输入检测及触摸面板等依赖功能;同时将既有临时 workaround 统一为可复用的全局或按 Mod 调用机制。

Sequence diagram for Mono JIT recompilation after Harmony patches

sequenceDiagram
    participant Startup
    participant HarmonyPatchRecompile
    participant GameMainObject
    participant GameMain
    participant DebugInput
    participant InputManager

    Startup->>DebugInput: Harmony patch GetKeyDown
    Startup->>InputManager: Harmony patch GetSystemInputDown
    Startup->>HarmonyPatchRecompile: RecompileMethod(GameMainObject.Update)
    HarmonyPatchRecompile->>GameMainObject: temporary Patch(Update)
    HarmonyPatchRecompile->>GameMainObject: Unpatch(Update)
    Startup->>HarmonyPatchRecompile: RecompileMethod(GameMain.Update)
    HarmonyPatchRecompile->>GameMain: temporary Patch(Update)
    HarmonyPatchRecompile->>GameMain: Unpatch(Update)
    GameMainObject->>DebugInput: GetKeyDown
    GameMain->>InputManager: GetSystemInputDown
Loading

File-Level Changes

Change Details Files
新增通过临时 Harmony patch/unpatch 强制 Mono JIT 重新编译方法的通用辅助机制。
  • 使用独立 Harmony 实例注入并立即移除空 prefix,以避免影响现有业务 patch。
  • 提供按 MethodBase 或类型、方法名及参数类型定位目标方法的重编译 API,并记录失败警告。
  • 补充 Mono 内联导致 caller/callee patch 失效的背景、已知案例和使用约定。
AquaMai.Core/Helpers/HarmonyPatchRecompile.cs
在全局 patch 生命周期完成后重编译常见游戏更新方法,修复输入相关 patch 因内联失效的问题。
  • 在所有 Mod 的 OnAfterAllPatch 生命周期之后重编译 GameMainObject.Update 和 GameMain.Update。
  • 将集中式重编译放在错误状态检查前执行,并保留具体 Mod 按需触发重编译的扩展方式。
AquaMai.Core/Startup.cs
将既有的临时空 patch workaround 替换为显式的重编译调用。
  • 移除 TestProof 针对 GameMain.Update 的空 prefix workaround。
  • 移除 DisplayTouchInGame 针对 MouseTouchPanel.Start 的空 postfix,并通过 OnAfterPatch 调用重编译辅助方法。
AquaMai.Mods/GameSystem/TestProof.cs
AquaMai.Mods/Utils/DisplayTouchInGame.cs

Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

@sourcery-ai sourcery-ai 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.

嗨——我已经审阅了你的更改,整体看起来很棒!

Sourcery 评估

已批准。


Sourcery 对开源项目免费——如果你喜欢我们的评审,欢迎分享 ✨
请帮助我变得更有用!请对每条评论点击 👍 或 👎,我会利用这些反馈来改进评审。
Original comment in English

Hey - I've reviewed your changes and they look great!

Sourcery assessment

Approved.


Sourcery is free for open source - if you like our reviews please consider sharing them ✨
Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.

Copilot AI 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.

Pull request overview

该 PR 针对 AquaMai 的 FixDebugKeyboardInput 修复项在特定场景下不生效的问题(表现为未启用按键相关功能时 ESC 无法退出等),通过额外对 GameMainObject.Update() 施加 Harmony Patch 来规避 Mono JIT 将 DebugInput.GetKeyDown() 优化内联为常量 false 的情况,从而恢复相关按键功能的可用性。

Changes:

  • FixDebugKeyboardInput 启用时,新增对 GameMainObject.Update() 的 Harmony Prefix Patch(空方法)以触发重新编译/取消内联优化。
  • 为引用 GameMainObject 增加 using Main;

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread AquaMai.Mods/Fix/Common.cs Outdated
Comment on lines +62 to +66
[HarmonyPrefix]
[HarmonyPatch(typeof(GameMainObject), "Update")]
private static void RepatchGameMainObjectUpdate()
{
}

@cubic-dev-ai cubic-dev-ai Bot 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.

All reported issues were addressed across 1 file

Reply with feedback, questions, or to request a fix.

Re-trigger cubic

Comment thread AquaMai.Mods/Fix/Common.cs Outdated

@cubic-dev-ai cubic-dev-ai Bot 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.

All reported issues were addressed across 1 file (changes from recent commits).

Reply with feedback, questions, or to request a fix.

Re-trigger cubic

Comment thread AquaMai.Mods/Fix/Common.cs Outdated
@Starrah

Starrah commented Aug 27, 2026

Copy link
Copy Markdown
Collaborator

如果是这样的话,那是不是, 983f887dbd22a0 本质上也都是这样的问题,(因为当时我们也是用类似的加一个空Patch的方法解决的)

[HarmonyPrefix]
[HarmonyPatch(typeof(GameMain), "Update")]
public static void Workaround() { }
/*
* 似乎是 0Harmony.dll 的 Bug,导致在 Maimoller 的 Mod Patch GameMain:Update 之后,
* 原本 GameMain:Update 调用的 InputManager:GetSystemInputDown 变回了未 Patch 过的原始版本
* 我觉得这是玄学 Bug,应该用玄学方法来修
* 尝试性放了一个这个在这里,诶,好了!
* 我觉得应该是有某种 Patch 顺序相关的问题
*/
}

@clansty

clansty commented Aug 27, 2026

Copy link
Copy Markdown
Member

能写成 [HarmonyPrefix] 这种形式吗

@clansty

clansty commented Aug 27, 2026

Copy link
Copy Markdown
Member

或者说我们是不是应该把 TestProof.cs 那边的移过去

@Starrah

Starrah commented Aug 27, 2026

Copy link
Copy Markdown
Collaborator

能写成 [HarmonyPrefix] 这种形式吗

他一开始倒正是这样写的,见 7dd58d3。但后面 ca6e3d0 刻意改成了现在的形式,也许是看了cubic-dev-ai的建议 #143 (comment) ,觉得OnAfterPatch里主动调用更好/更稳定?

或者说我们是不是应该把 TestProof.cs 那边的移过去

我觉得也许应该这样做。但具体的原理/最佳的修复方式,可能还得再研究/确认,以及用mml真机回归测试一下。我明天试试吧

@clansty

clansty commented Aug 27, 2026

Copy link
Copy Markdown
Member

好呀,那等你

@Starrah

Starrah commented Aug 27, 2026

Copy link
Copy Markdown
Collaborator

贴一点目前为止的分析:
image
所以问题的本质并不是HarmonyPriority的钩子优先级,而是Patch被应用的优先级,这部分是由AquaMai.Core通过比较复杂的逻辑控制的,但总之是AquaMai.Core/Startup.cs: Startup.Initialize中的这一堆先被patch,然后才轮到通过ConfigSection所开启的各个功能。

CollectWantedPatches(wantedPatches, typeof(EnableConditionHelper));
// Core helpers patched first
CollectWantedPatches(wantedPatches, typeof(MessageHelper));
CollectWantedPatches(wantedPatches, typeof(MusicDirHelper));
CollectWantedPatches(wantedPatches, typeof(SharedInstances));
CollectWantedPatches(wantedPatches, typeof(GuiSizes));
CollectWantedPatches(wantedPatches, typeof(KeyListener));
CollectWantedPatches(wantedPatches, typeof(Shim));
CollectWantedPatches(wantedPatches, typeof(NetPacketHook));
CollectWantedPatches(wantedPatches, typeof(ErrorFrame));

所以,加一个空patch就能好的本质,也就相当于把(PR开头提到的开启虚拟投币、重置触摸面板等涉及对GameMainObject.Update进行再次patch的功能)给保证强行开启一个
image

然后关于 #143 (comment) 中所提的。它们不是针对GameMainObject.Update的patch出现的问题,而是不同的Update函数。整体情况总结如下
image

据此我正在思考best practice的解决方案当中。等我后续的消息

@Starrah

Starrah commented Aug 27, 2026

Copy link
Copy Markdown
Collaborator

交了两个commit,尝试系统性地分析、记录和解决此问题。新增了 AquaMai.Core/Helpers/HarmonyPatchRecompile.cs

注意:还没在mml真机上做测试,所以我先draft掉,等我做好测试之后会ready回来。
另外,也想再麻烦 @zhicheng233 测试下,我现在版本的代码有没有解决你一开始的“未启用按键相关功能时 FixDebugKeyboardInput 失效的问题”,别我搞了半天发现回到一开始了()(之所以想麻烦您测是因为我这边其实不太复现得出来您这个bug,所以可能还是麻烦您自行测一下吧)

@Starrah
Starrah marked this pull request as draft August 27, 2026 19:28
@zhicheng233

Copy link
Copy Markdown
Contributor Author

交了两个commit,尝试系统性地分析、记录和解决此问题。新增了 AquaMai.Core/Helpers/HarmonyPatchRecompile.cs

注意:还没在mml真机上做测试,所以我先draft掉,等我做好测试之后会ready回来。 另外,也想再麻烦 @zhicheng233 测试下,我现在版本的代码有没有解决你一开始的“未启用按键相关功能时 FixDebugKeyboardInput 失效的问题”,别我搞了半天发现回到一开始了()(之所以想麻烦您测是因为我这边其实不太复现得出来您这个bug,所以可能还是麻烦您自行测一下吧)

先感谢 @Starrah@clansty 大晚上在看我的PR,辛苦了w
我刚刚测试了一下是解决了的
关于复现的问题,我在下方传了一份AquaMai.toml,该配置文件在 稳定通道 1.8.71-gbce5453 中稳定复现上述问题
AquaMai.zip

@zhicheng233

Copy link
Copy Markdown
Contributor Author

能写成 [HarmonyPrefix] 这种形式吗

他一开始倒正是这样写的,见 7dd58d3。但后面 ca6e3d0 刻意改成了现在的形式,也许是看了cubic-dev-ai的建议 #143 (comment) ,觉得OnAfterPatch里主动调用更好/更稳定?

或者说我们是不是应该把 TestProof.cs 那边的移过去

我觉得也许应该这样做。但具体的原理/最佳的修复方式,可能还得再研究/确认,以及用mml真机回归测试一下。我明天试试吧

确实是参考了cubic-dev-ai的建议,这样可以保证对 GameMainObject.Update() 的二次Patch是在 DebugInput.GetKeyDown() Patch完之后再进行的喵
图片

@Starrah

Starrah commented Aug 28, 2026

Copy link
Copy Markdown
Collaborator

关于复现的问题,我在下方传了一份AquaMai.toml,该配置文件在 稳定通道 1.8.71-gbce5453 中稳定复现上述问题 AquaMai.zip

我试了你的配置,发现在我这里还是没法复现。我看了我手上游戏的反编译代码,发现我这里的debugInput是正确的UnityEngine实现,可能根本不需要被patch。所以这应该是特定于“某些游戏版本”的问题。
所以我也就不测了,既然你测了可以解决问题那就好~

@Starrah
Starrah marked this pull request as ready for review August 28, 2026 06:05
@Starrah

Starrah commented Aug 28, 2026

Copy link
Copy Markdown
Collaborator

mml相关的两个问题,在我这里真机测试没有回归问题。
ready了

@sourcery-ai sourcery-ai 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 个问题

给 AI 代理的提示
请处理本次代码审查中的评论:

## 单独评论

### 评论 1
<location path="AquaMai.Core/Helpers/HarmonyPatchRecompile.cs" line_range="61" />
<code_context>
+    /// </summary>
+    /// <param name="type">和 methodName、argumentTypes 参数一起,指定需要触发重新编译的方法</param>
+    public static void RecompileMethod(Type type, string methodName, Type[] argumentTypes = null)
+        => RecompileMethod(AccessTools.Method(type, methodName, argumentTypes));
+
+    private static void DummyPrefixImpl()
</code_context>
<issue_to_address>
**issue (bug_risk):**`AccessTools.Method` 无法解析请求的方法时,该重载会将 `null` 传递给 `RecompileMethod(MethodBase)`。如果 `harmony.Patch` 拒绝该值,那么 catch 块在报告错误时会解引用 `method.DeclaringType`,导致原本应显示的警告被启动期间或模组的 `OnAfterPatch` 中未处理的 `NullReferenceException` 所替代。

**触发条件:** 当特定游戏版本的目标方法不存在,或调用方提供了无效的方法名称/签名时。

**建议修复:** 在执行修补前检查 `null`,并从该重载中记录类型和方法名称;或者直接返回,不调用 `MethodBase` 重载。
</issue_to_address>

Sourcery 评估

等待批准。 请先处理 1 个发现的问题。

阻塞性发现:AquaMai.Core/Helpers/HarmonyPatchRecompile.cs:61


Sourcery 对开源项目免费——如果您喜欢我们的审查,请考虑分享 ✨
帮助我变得更有用!请在每条评论上点击 👍 或 👎,我会利用反馈来改进审查结果。
Original comment in English

Hey - I've found 1 issue

Prompt for AI Agents
Please address the comments from this code review:

## Individual Comments

### Comment 1
<location path="AquaMai.Core/Helpers/HarmonyPatchRecompile.cs" line_range="61" />
<code_context>
+    /// </summary>
+    /// <param name="type">和 methodName、argumentTypes 参数一起,指定需要触发重新编译的方法</param>
+    public static void RecompileMethod(Type type, string methodName, Type[] argumentTypes = null)
+        => RecompileMethod(AccessTools.Method(type, methodName, argumentTypes));
+
+    private static void DummyPrefixImpl()
</code_context>
<issue_to_address>
**issue (bug_risk):** When `AccessTools.Method` cannot resolve the requested method, the overload passes `null` to `RecompileMethod(MethodBase)`. If `harmony.Patch` rejects that value, the catch block dereferences `method.DeclaringType` while reporting the error, so the intended warning is replaced by an unhandled `NullReferenceException` during startup or a mod's `OnAfterPatch`.

**Triggers:** When a game-version-specific target method is absent or a caller supplies an invalid method name/signature.

**Suggested fix:** Check for `null` before patching and log the type and method name from the overload, or return without calling the `MethodBase` overload.
</issue_to_address>

Sourcery assessment

Approval pending. 1 finding to address first.

Blocking findings: AquaMai.Core/Helpers/HarmonyPatchRecompile.cs:61


Sourcery is free for open source - if you like our reviews please consider sharing them ✨
Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.

Comment thread AquaMai.Core/Helpers/HarmonyPatchRecompile.cs

@cubic-dev-ai cubic-dev-ai Bot 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.

All reported issues were addressed across 4 files

Reply with feedback, questions, or to request a fix.

Re-trigger cubic

Comment thread AquaMai.Core/Helpers/HarmonyPatchRecompile.cs Outdated
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.

4 participants