From 83fb438a08e5a9931ba35fc87a111085876584fa Mon Sep 17 00:00:00 2001 From: Dyrox <66360381+Dyrox@users.noreply.github.com> Date: Sat, 3 Jan 2026 02:21:04 +0000 Subject: [PATCH 1/2] fix: account for JudgeAdjust.B offset in UnstableRate display --- AquaMai.Mods/Utils/UnstableRate.cs | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/AquaMai.Mods/Utils/UnstableRate.cs b/AquaMai.Mods/Utils/UnstableRate.cs index 5ee5fac2..c5eb1176 100644 --- a/AquaMai.Mods/Utils/UnstableRate.cs +++ b/AquaMai.Mods/Utils/UnstableRate.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Reflection; using AquaMai.Config.Attributes; using HarmonyLib; using MAI2.Util; @@ -6,6 +7,7 @@ using Monitor; using Process; using UnityEngine; +using AquaMai.Mods.GameSettings; namespace AquaMai.Mods.Utils; @@ -54,6 +56,24 @@ private struct Timing private static GameObject[] baseObjects = new GameObject[2]; private static LinePool[] linePools = new LinePool[2]; + private static FieldInfo _judgeAdjustBField; + private static bool _fieldChecked = false; + + private static double GetJudgeAdjustB() + { + if (!_fieldChecked) + { + // 尝试通过反射获取 AquaMai.Mods.GameSettings.JudgeAdjust 类中的私有字段 'b' + _judgeAdjustBField = AccessTools.Field(typeof(JudgeAdjust), "b"); + _fieldChecked = true; + } + + if (_judgeAdjustBField != null) + { + return (double)_judgeAdjustBField.GetValue(null); + } + return 0; + } [HarmonyPostfix] [HarmonyPatch(typeof(GameProcess), "OnStart")] @@ -87,6 +107,10 @@ public static void OnJudge(NoteBase __instance, float ___JudgeTimingDiffMsec) var optionJudgeTiming = Singleton.Instance.GetGameScore(__instance.MonitorId).UserOption.GetJudgeTimingFrame(); msec -= optionJudgeTiming * TimingBin; + // Account for the mod adjustment B judgement offset + double modAdjustB = GetJudgeAdjustB(); + msec += (float)(modAdjustB * TimingBin); + // Don't process misses var timing = GetTiming(msec); if (timing.windowStart == Miss.windowStart) From 25314089ffdd36955e510969f93ca73882e8e0e6 Mon Sep 17 00:00:00 2001 From: Dyrox <66360381+Dyrox@users.noreply.github.com> Date: Sat, 3 Jan 2026 02:43:22 +0000 Subject: [PATCH 2/2] refactor: use static constructor for thread safety --- AquaMai.Mods/Utils/UnstableRate.cs | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/AquaMai.Mods/Utils/UnstableRate.cs b/AquaMai.Mods/Utils/UnstableRate.cs index c5eb1176..2b0d4dd9 100644 --- a/AquaMai.Mods/Utils/UnstableRate.cs +++ b/AquaMai.Mods/Utils/UnstableRate.cs @@ -56,18 +56,16 @@ private struct Timing private static GameObject[] baseObjects = new GameObject[2]; private static LinePool[] linePools = new LinePool[2]; - private static FieldInfo _judgeAdjustBField; - private static bool _fieldChecked = false; + private static readonly FieldInfo _judgeAdjustBField; - private static double GetJudgeAdjustB() + static UnstableRate() { - if (!_fieldChecked) - { - // 尝试通过反射获取 AquaMai.Mods.GameSettings.JudgeAdjust 类中的私有字段 'b' - _judgeAdjustBField = AccessTools.Field(typeof(JudgeAdjust), "b"); - _fieldChecked = true; - } + // 尝试通过反射获取 AquaMai.Mods.GameSettings.JudgeAdjust 类中的私有字段 'b' + _judgeAdjustBField = AccessTools.Field(typeof(JudgeAdjust), "b"); + } + private static double GetJudgeAdjustB() + { if (_judgeAdjustBField != null) { return (double)_judgeAdjustBField.GetValue(null);