diff --git a/src/MHServerEmu.Leaderboards/Leaderboard.cs b/src/MHServerEmu.Leaderboards/Leaderboard.cs index 3fd168f2..f935875d 100644 --- a/src/MHServerEmu.Leaderboards/Leaderboard.cs +++ b/src/MHServerEmu.Leaderboards/Leaderboard.cs @@ -173,8 +173,8 @@ namespace MHServerEmu.Leaderboards if (CanReset && newInstanceDb == null && Scheduler.IsEnabled) { - DateTime nextActivationTime = Scheduler.CalcNextUtcActivationTime(instance.ActivationTime, updateTime); - if (nextActivationTime == instance.ActivationTime || Scheduler.CheckMaxResetCount(nextActivationTime) == false) + DateTime nextActivationTime = Scheduler.CalcNextUtcActivationDate(instance.ActivationTime, updateTime); + if (nextActivationTime == instance.ActivationTime) continue; newInstanceDb = new() diff --git a/src/MHServerEmu.Leaderboards/LeaderboardDatabase.cs b/src/MHServerEmu.Leaderboards/LeaderboardDatabase.cs index 6e21c41a..b50f52b6 100644 --- a/src/MHServerEmu.Leaderboards/LeaderboardDatabase.cs +++ b/src/MHServerEmu.Leaderboards/LeaderboardDatabase.cs @@ -136,7 +136,7 @@ namespace MHServerEmu.Leaderboards { // IsEnabled: False -> True // Add new instance - DateTime activationDate = scheduler.CalcNextUtcActivationTime(); + DateTime activationDate = scheduler.CalcNextUtcActivationDate(); updatedInstances.Add(new DBLeaderboardInstance { @@ -180,7 +180,7 @@ namespace MHServerEmu.Leaderboards if (scheduler.StartTime != oldDbLeaderboard.GetStartDateTime()) { // Find next activation time - DateTime nextEvent = scheduler.CalcNextUtcActivationTime(); + DateTime nextEvent = scheduler.CalcNextUtcActivationDate(); activationDate = Clock.DateTimeToTimestamp(nextEvent); } diff --git a/src/MHServerEmu.Leaderboards/LeaderboardInstance.cs b/src/MHServerEmu.Leaderboards/LeaderboardInstance.cs index 934954c3..1a64cfe7 100644 --- a/src/MHServerEmu.Leaderboards/LeaderboardInstance.cs +++ b/src/MHServerEmu.Leaderboards/LeaderboardInstance.cs @@ -49,7 +49,7 @@ namespace MHServerEmu.Leaderboards if (dbInstance.ActivationDate == 0 && leaderboard.CanReset) { - DateTime activationDate = _leaderboard.Scheduler.CalcNextUtcActivationTime(); + DateTime activationDate = _leaderboard.Scheduler.CalcNextUtcActivationDate(); dbInstance.SetActivationDateTime(activationDate); var dbManager = LeaderboardDatabase.Instance.DBManager; dbManager.UpdateInstanceActivationDate(dbInstance); diff --git a/src/MHServerEmu.Leaderboards/LeaderboardScheduler.cs b/src/MHServerEmu.Leaderboards/LeaderboardScheduler.cs index 902b347f..a8a8fd91 100644 --- a/src/MHServerEmu.Leaderboards/LeaderboardScheduler.cs +++ b/src/MHServerEmu.Leaderboards/LeaderboardScheduler.cs @@ -110,7 +110,7 @@ namespace MHServerEmu.Leaderboards } } - public DateTime CalcNextUtcActivationTime(DateTime? referenceTimeArg = null, DateTime? currentTimeArg = null) + public DateTime CalcNextUtcActivationDate(DateTime? referenceTimeArg = null, DateTime? currentTimeArg = null) { // Fall back to StartTime if no referenceTime is provided DateTime referenceTime = referenceTimeArg ?? StartTime; @@ -122,10 +122,23 @@ namespace MHServerEmu.Leaderboards currentTime = new DateTime(currentTime.Year, currentTime.Month, currentTime.Day, currentTime.Hour, currentTime.Minute, 0, currentTime.Kind); // Calculate the next reset time relative to the reference time - return CalcNextUtcActivationTimeHelper(referenceTime, currentTime); + DateTime activationTime = CalcNextUtcActivationDateHelper(referenceTime, currentTime); + + // Check reset cap if needed + if (MaxResetCount > 0) + { + DateTime finalActivationTime = StartTime; + for (int i = 0; i < MaxResetCount; i++) + finalActivationTime = CalcResetTime(finalActivationTime); + + if (activationTime > finalActivationTime) + return finalActivationTime; + } + + return activationTime; } - private DateTime CalcNextUtcActivationTimeHelper(DateTime activationTime, DateTime currentTime) + private DateTime CalcNextUtcActivationDateHelper(DateTime activationTime, DateTime currentTime) { DateTime expirationTime = currentTime; if (activationTime == currentTime || activationTime == StartTime) @@ -141,21 +154,6 @@ namespace MHServerEmu.Leaderboards return activationTime; } - public bool CheckMaxResetCount(DateTime activationTime) - { - // TODO: Should probably be combined with CalcNextUtcActivationTime to apply in all cases - - // <= 0 means that MaxResetCount is disabled - if (MaxResetCount <= 0) - return true; - - DateTime finalActivationTime = StartTime; - for (int i = 0; i < MaxResetCount; i++) - finalActivationTime = CalcResetTime(finalActivationTime); - - return activationTime <= finalActivationTime; - } - public DateTime CalcExpirationTime(DateTime activationTime) { return GetPrototype().Duration switch