From 40484bc94adee08a79cc5d3566959398207b5a1c Mon Sep 17 00:00:00 2001 From: akanyan Date: Thu, 23 Jan 2025 02:17:28 +0000 Subject: [PATCH] feat(UnlockGameEvents): mission event cycling * Makes the game use the first available non-cleared mission. * Rather than the first available mission period. * No longer unlocks missions marked as expired by the server. --- Mu3Mods.csproj | 2 +- .../MU3.Client/patch_PacketGetGameEvent.cs | 3 ++ .../patch_OperationManager.cs | 40 +++++++++++++++++++ 3 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 Unlockers/UnlockGameEvents/MU3.OperationManager/patch_OperationManager.cs diff --git a/Mu3Mods.csproj b/Mu3Mods.csproj index f94e3f6..a65a21c 100644 --- a/Mu3Mods.csproj +++ b/Mu3Mods.csproj @@ -2,7 +2,7 @@ net35 7EVENDAYS⇔HOLIDAYS - 3.2.0.0 + 3.3.0.0 true latest x64 diff --git a/Unlockers/UnlockGameEvents/MU3.Client/patch_PacketGetGameEvent.cs b/Unlockers/UnlockGameEvents/MU3.Client/patch_PacketGetGameEvent.cs index 6f84cc0..bfc40eb 100644 --- a/Unlockers/UnlockGameEvents/MU3.Client/patch_PacketGetGameEvent.cs +++ b/Unlockers/UnlockGameEvents/MU3.Client/patch_PacketGetGameEvent.cs @@ -19,6 +19,9 @@ class patch_PacketGetGameEvent: Packet { foreach(EventData eventData in SingletonStateMachine.instance.allEventData) { IdPeriod idPeriod = Enumerable.FirstOrDefault(_gameEvent.list, (IdPeriod e) => e.id == eventData.id); if(idPeriod != null) { + if(eventData.itemType == DataStudio.EventType.MissionEvent) { + continue; + } if(idPeriod.period.endDate < CustomDateTime.Now) { idPeriod.period.endDate = endDate; } diff --git a/Unlockers/UnlockGameEvents/MU3.OperationManager/patch_OperationManager.cs b/Unlockers/UnlockGameEvents/MU3.OperationManager/patch_OperationManager.cs new file mode 100644 index 0000000..e20b021 --- /dev/null +++ b/Unlockers/UnlockGameEvents/MU3.OperationManager/patch_OperationManager.cs @@ -0,0 +1,40 @@ +using MU3.Data; +using MU3.User; +using MU3.Util; +using System.Collections.Generic; + +namespace MU3.Operation; + +class patch_OperationManager: OperationManager { + private Dictionary _missionEventDataMap; + + public extern MissionEventData orig_getTargetMissionFromChapterID(int chapterId); + public new MissionEventData getTargetMissionFromChapterID(int chapterId) { + return overrideMission(orig_getTargetMissionFromChapterID(chapterId)); + } + + public extern MissionEventData orig_getTargetMissionFromStoryID(int storyId); + public new MissionEventData getTargetMissionFromStoryID(int storyId) { + return overrideMission(orig_getTargetMissionFromStoryID(storyId)); + } + + private MissionEventData overrideMission(MissionEventData orig) { + if(orig != null) { + foreach(KeyValuePair item in _missionEventDataMap) { + MissionEventData value = item.Value; + if(!value.isMissionEventActive || value.eventData == null) { + continue; + } + var userMissions = Singleton.instance.userMission; + if(userMissions != null && userMissions.TryGetValue(value.missionEventId, out UserMission um)) { + var rv = value.eventData.getNextEventPointBonus(out EventRewardInfo rewardInfo, um.Point); + if(!rv || rewardInfo.bonus_.RewardNameAndCounts[0].isLoop) { + continue; + } + } + return value; + } + } + return orig; + } +} \ No newline at end of file