From 4bcd14488152b457fa08dd712255db5a5fd308b1 Mon Sep 17 00:00:00 2001 From: violetc <58360096+s-yh-china@users.noreply.github.com> Date: Sat, 3 Oct 2026 00:52:57 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E8=B7=B3=E8=BF=87=E4=B9=90=E6=9B=B2?= =?UTF-8?q?=E5=BC=80=E5=A7=8B=E4=B8=8E=E5=BC=80=E5=9C=BA=E8=A7=86=E9=A2=91?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E5=86=B2=E7=AA=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AquaMai.Mods/Fancy/CustomIntroCinematic.cs | 83 +++++++++++-------- .../Tweaks/TimeSaving/SkipTrackStart.cs | 3 + 2 files changed, 52 insertions(+), 34 deletions(-) diff --git a/AquaMai.Mods/Fancy/CustomIntroCinematic.cs b/AquaMai.Mods/Fancy/CustomIntroCinematic.cs index 52fec774..93d50f90 100644 --- a/AquaMai.Mods/Fancy/CustomIntroCinematic.cs +++ b/AquaMai.Mods/Fancy/CustomIntroCinematic.cs @@ -907,29 +907,65 @@ private void CleanupResources() [HarmonyPatch(typeof(MusicSelectProcess), "GameStart")] public static bool GameStartPrefix(MusicSelectProcess __instance) { + if (!TryGetCurrentVideo(out var videoPath)) return true; + + try + { + MelonLogger.Msg($"[CustomIntroCinematic] Play intro cinematic for music {GameManager.SelectMusicID[0]}"); + + // 使用反射获取 MusicSelectProcess 的 container 字段 + var containerField = typeof(ProcessBase).GetField("container", + System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); + var container = (ProcessDataContainer)containerField.GetValue(__instance); + + // 使用自定义的 SimpleMovieTrackStartProcess 替换 TrackStartProcess + container.processManager.AddProcess( + new FadeProcess(container, __instance, + new SimpleMovieTrackStartProcess(container, videoPath), + releaseCustomMaterial: false), 50); + + SoundManager.PreviewEnd(); + SoundManager.StopBGM(2); + + return false; // 阻止原方法执行 + } + catch (Exception e) + { + MelonLogger.Msg($"[CustomIntroCinematic] GameStartPrefix error: {e}"); + } + + return true; // 正常执行原方法 + } + + public static bool WillTakeOver => TryGetCurrentVideo(out _); + + public static bool TryGetCurrentVideo(out (string leftPath, string rightPath, string acbPath, string awbPath) videoPath) + { + videoPath = default; + try { - if (!_isInitialized) return true; + if (!_isInitialized) return false; // 复刻GameStart的检查逻辑 - if (GameManager.IsCourseMode) return true; - if (GameManager.IsKaleidxScopeMode) return true; - if (Singleton.Instance.IsSpecialMovie()) return true; + if (GameManager.IsCourseMode) return false; + if (GameManager.IsKaleidxScopeMode) return false; + if (Singleton.Instance.IsSpecialMovie()) return false; // 自由模式不生效 - if (GameManager.IsFreedomMode) return true; + if (GameManager.IsFreedomMode) return false; // 仅在 Normal 模式下生效 - if (!GameManager.IsNormalMode) return true; + if (!GameManager.IsNormalMode) return false; // 试玩模式不生效 - if (GameManager.IsTrialPlay) return true; + if (GameManager.IsTrialPlay) return false; // 联机对战不生效 Manager.Party.Party.IManager PartyManager = Manager.Party.Party.Party.Get(); if (SingletonStateMachine.Instance.Backup.gameSetting.MachineGroupID != DB.MachineGroupID.OFF && PartyManager != null && PartyManager.IsJoinAndActive()) - return true; - + return false; + //获取曲目ID var musicId = GameManager.SelectMusicID[0]; @@ -945,40 +981,19 @@ public static bool GameStartPrefix(MusicSelectProcess __instance) { playerData.ScoreDic[j].TryGetValue(musicId, out UserScore musicScore); if (musicScore != null) - return true; + return false; } } } } // 检查当前选择的歌曲是否为目标歌曲 - if (_targetIDMovieDict.TryGetValue(musicId, out var videoPath)) - { - MelonLogger.Msg($"[CustomIntroCinematic] Play intro cinematic for music {musicId}"); - - // 使用反射获取 MusicSelectProcess 的 container 字段 - var containerField = typeof(ProcessBase).GetField("container", - System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); - var container = (ProcessDataContainer)containerField.GetValue(__instance); - - // 使用自定义的 SimpleMovieTrackStartProcess 替换 TrackStartProcess - container.processManager.AddProcess( - new FadeProcess(container, __instance, - new SimpleMovieTrackStartProcess(container, videoPath), - releaseCustomMaterial: false), 50); - - SoundManager.PreviewEnd(); - SoundManager.StopBGM(2); - - return false; // 阻止原方法执行 - } + return _targetIDMovieDict.TryGetValue(musicId, out videoPath); } catch (Exception e) { - MelonLogger.Msg($"[CustomIntroCinematic] GameStartPrefix error: {e}"); + MelonLogger.Msg($"[CustomIntroCinematic] TryGetCurrentVideo error: {e}"); + return false; } - - return true; // 正常执行原方法 } - } diff --git a/AquaMai.Mods/Tweaks/TimeSaving/SkipTrackStart.cs b/AquaMai.Mods/Tweaks/TimeSaving/SkipTrackStart.cs index afd423d1..be90be85 100644 --- a/AquaMai.Mods/Tweaks/TimeSaving/SkipTrackStart.cs +++ b/AquaMai.Mods/Tweaks/TimeSaving/SkipTrackStart.cs @@ -1,4 +1,5 @@ using AquaMai.Config.Attributes; +using AquaMai.Mods.Fancy; using HarmonyLib; using Manager; using Process; @@ -22,6 +23,8 @@ public static void OnStart(ref TrackStartProcess.TrackStartSequence ____state) [HarmonyPatch(typeof (MusicSelectProcess), "GameStart")] public static bool GameStart(MusicSelectProcess __instance, ProcessDataContainer ___container) { + if (CustomIntroCinematic.WillTakeOver) return true; + ___container.processManager.AddProcess(new TrackStartProcess(___container), 50); ___container.processManager.ReleaseProcess(__instance); SoundManager.PreviewEnd();