1
0
forked from akanyan/mu3-mods

fix(UnlockGameEvents): rework mission event cycling

* Iterate in reverse, from latest to oldest.
* Unlock all missions again, unless the server has returned
  exactly one active mission and that mission is present
  on the client's machine..
This commit is contained in:
2025-01-24 20:20:37 +00:00
parent 40484bc94a
commit fefadfc243
2 changed files with 27 additions and 6 deletions

View File

@ -7,8 +7,7 @@ using System.Linq;
namespace MU3.Client; namespace MU3.Client;
class patch_PacketGetGameEvent: Packet { class patch_PacketGetGameEvent: Packet {
public Operation.GameEvent _gameEvent; private Operation.GameEvent _gameEvent;
public Operation.GameEvent gameEvent => _gameEvent;
public extern State orig_proc(); public extern State orig_proc();
public override State proc() { public override State proc() {
@ -16,12 +15,15 @@ class patch_PacketGetGameEvent: Packet {
if(state == State.Done) { if(state == State.Done) {
DateTime endDate = DateTime.Parse("2099-01-01 05:00:00.0"); DateTime endDate = DateTime.Parse("2099-01-01 05:00:00.0");
_gameEvent ??= new Operation.GameEvent(); _gameEvent ??= new Operation.GameEvent();
bool skipMissions = checkMissionEvents();
foreach(EventData eventData in SingletonStateMachine<DataManager, DataManager.EState>.instance.allEventData) { foreach(EventData eventData in SingletonStateMachine<DataManager, DataManager.EState>.instance.allEventData) {
IdPeriod idPeriod = Enumerable.FirstOrDefault(_gameEvent.list, (IdPeriod e) => e.id == eventData.id); IdPeriod idPeriod = Enumerable.FirstOrDefault(_gameEvent.list, (IdPeriod e) => e.id == eventData.id);
if(skipMissions && eventData.itemType == DataStudio.EventType.MissionEvent) {
continue;
}
if(idPeriod != null) { if(idPeriod != null) {
if(eventData.itemType == DataStudio.EventType.MissionEvent) {
continue;
}
if(idPeriod.period.endDate < CustomDateTime.Now) { if(idPeriod.period.endDate < CustomDateTime.Now) {
idPeriod.period.endDate = endDate; idPeriod.period.endDate = endDate;
} }
@ -37,4 +39,22 @@ class patch_PacketGetGameEvent: Packet {
} }
return state; return state;
} }
// Check whether there is only one active mission event
private bool checkMissionEvents() {
bool found = false;
foreach(EventData eventData in SingletonStateMachine<DataManager, DataManager.EState>.instance.allEventData) {
if(eventData.itemType == DataStudio.EventType.MissionEvent) {
IdPeriod idPeriod = Enumerable.FirstOrDefault(_gameEvent.list, (IdPeriod e) => e.id == eventData.id);
if(idPeriod?.period.startDate < CustomDateTime.Now && idPeriod?.period.endDate > CustomDateTime.Now) {
if(!found) {
found = true;
} else {
return false;
}
}
}
}
return found;
}
} }

View File

@ -2,6 +2,7 @@
using MU3.User; using MU3.User;
using MU3.Util; using MU3.Util;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
namespace MU3.Operation; namespace MU3.Operation;
@ -20,7 +21,7 @@ class patch_OperationManager: OperationManager {
private MissionEventData overrideMission(MissionEventData orig) { private MissionEventData overrideMission(MissionEventData orig) {
if(orig != null) { if(orig != null) {
foreach(KeyValuePair<int, MissionEventData> item in _missionEventDataMap) { foreach(KeyValuePair<int, MissionEventData> item in _missionEventDataMap.Reverse()) {
MissionEventData value = item.Value; MissionEventData value = item.Value;
if(!value.isMissionEventActive || value.eventData == null) { if(!value.isMissionEventActive || value.eventData == null) {
continue; continue;