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:
@ -7,8 +7,7 @@ using System.Linq;
|
||||
namespace MU3.Client;
|
||||
|
||||
class patch_PacketGetGameEvent: Packet {
|
||||
public Operation.GameEvent _gameEvent;
|
||||
public Operation.GameEvent gameEvent => _gameEvent;
|
||||
private Operation.GameEvent _gameEvent;
|
||||
|
||||
public extern State orig_proc();
|
||||
public override State proc() {
|
||||
@ -16,12 +15,15 @@ class patch_PacketGetGameEvent: Packet {
|
||||
if(state == State.Done) {
|
||||
DateTime endDate = DateTime.Parse("2099-01-01 05:00:00.0");
|
||||
_gameEvent ??= new Operation.GameEvent();
|
||||
|
||||
bool skipMissions = checkMissionEvents();
|
||||
|
||||
foreach(EventData eventData in SingletonStateMachine<DataManager, DataManager.EState>.instance.allEventData) {
|
||||
IdPeriod idPeriod = Enumerable.FirstOrDefault(_gameEvent.list, (IdPeriod e) => e.id == eventData.id);
|
||||
if(idPeriod != null) {
|
||||
if(eventData.itemType == DataStudio.EventType.MissionEvent) {
|
||||
if(skipMissions && eventData.itemType == DataStudio.EventType.MissionEvent) {
|
||||
continue;
|
||||
}
|
||||
if(idPeriod != null) {
|
||||
if(idPeriod.period.endDate < CustomDateTime.Now) {
|
||||
idPeriod.period.endDate = endDate;
|
||||
}
|
||||
@ -37,4 +39,22 @@ class patch_PacketGetGameEvent: Packet {
|
||||
}
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
@ -2,6 +2,7 @@
|
||||
using MU3.User;
|
||||
using MU3.Util;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
||||
namespace MU3.Operation;
|
||||
|
||||
@ -20,7 +21,7 @@ class patch_OperationManager: OperationManager {
|
||||
|
||||
private MissionEventData overrideMission(MissionEventData orig) {
|
||||
if(orig != null) {
|
||||
foreach(KeyValuePair<int, MissionEventData> item in _missionEventDataMap) {
|
||||
foreach(KeyValuePair<int, MissionEventData> item in _missionEventDataMap.Reverse()) {
|
||||
MissionEventData value = item.Value;
|
||||
if(!value.isMissionEventActive || value.eventData == null) {
|
||||
continue;
|
||||
|
Reference in New Issue
Block a user