diff --git a/AquaMai.Mods/Utils/UnstableRate.cs b/AquaMai.Mods/Utils/UnstableRate.cs index 5ee5fac2..2b0d4dd9 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,22 @@ private struct Timing private static GameObject[] baseObjects = new GameObject[2]; private static LinePool[] linePools = new LinePool[2]; + private static readonly FieldInfo _judgeAdjustBField; + + static UnstableRate() + { + // 尝试通过反射获取 AquaMai.Mods.GameSettings.JudgeAdjust 类中的私有字段 'b' + _judgeAdjustBField = AccessTools.Field(typeof(JudgeAdjust), "b"); + } + + private static double GetJudgeAdjustB() + { + if (_judgeAdjustBField != null) + { + return (double)_judgeAdjustBField.GetValue(null); + } + return 0; + } [HarmonyPostfix] [HarmonyPatch(typeof(GameProcess), "OnStart")] @@ -87,6 +105,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)