@@ -221,90 +221,79 @@ public void populateScheduleForTask(Task task) {
221221 }
222222
223223 if (!task .getTimes ().isEmpty ()) {
224+ List <TaskTime > rangeTimes = new ArrayList <>();
225+ List <TaskTime > nonRangeTimes = new ArrayList <>();
226+
224227 for (TaskTime taskTime : task .getTimes ()) {
228+ if (taskTime .isRange ()) {
229+ rangeTimes .add (taskTime );
230+ } else {
231+ nonRangeTimes .add (taskTime );
232+ }
233+ }
234+
235+ for (TaskTime taskTime : rangeTimes ) {
225236 if (taskTime .isMinecraftTime ()) {
226237 World world = Bukkit .getWorld (taskTime .getWorld () == null ? "world" : taskTime .getWorld ());
227238 if (world == null ) {
228239 continue ;
229240 }
230241
231- if (taskTime .isRange ()) {
232- LocalTime startRange = taskTime .getTime1 ();
233- LocalTime endRange = taskTime .getTime2 ();
234-
235- LocalTime currentMcTime = Tools .getMinecraftTimeAt (world , ZonedDateTime .now ());
236- boolean currentlyInWindow = isTimeInRange (currentMcTime , startRange , endRange );
237-
238- int mcDay = 0 ;
239- boolean firstIteration = true ;
240- while (maxToSchedule > 0 ) {
241- ZonedDateTime windowStart ;
242- ZonedDateTime windowEnd ;
243-
244- if (firstIteration && currentlyInWindow ) {
245- windowStart = ZonedDateTime .now ();
246- windowEnd = Tools .getNextMinecraftTime (world , endRange , 0 );
247- if (windowEnd .isBefore (windowStart )) {
248- windowEnd = Tools .getNextMinecraftTime (world , endRange , 1 );
249- }
250- } else {
251- int dayOffset = (firstIteration && currentlyInWindow ) ? 1 : mcDay ;
252- if (firstIteration && !currentlyInWindow ) {
253- dayOffset = 0 ;
254- }
255- windowStart = Tools .getNextMinecraftTime (world , startRange , dayOffset );
256- windowEnd = Tools .getNextMinecraftTime (world , endRange , dayOffset );
257- if (windowEnd .isBefore (windowStart )) {
258- windowEnd = Tools .getNextMinecraftTime (world , endRange , dayOffset + 1 );
259- }
260- }
261- firstIteration = false ;
242+ LocalTime startRange = taskTime .getTime1 ();
243+ LocalTime endRange = taskTime .getTime2 ();
262244
263- if (!task .getDays ().contains (windowStart .toLocalDate ().getDayOfWeek ())) {
264- mcDay ++;
265- continue ;
266- }
245+ LocalTime currentMcTime = Tools .getMinecraftTimeAt (world , ZonedDateTime .now ());
246+ boolean currentlyInWindow = isTimeInRange (currentMcTime , startRange , endRange );
267247
268- if (windowEnd .isBefore (latestScheduledDate )) {
269- mcDay ++;
270- continue ;
248+ int mcDay = 0 ;
249+ boolean firstIteration = true ;
250+ while (maxToSchedule > 0 ) {
251+ ZonedDateTime windowStart ;
252+ ZonedDateTime windowEnd ;
253+
254+ if (firstIteration && currentlyInWindow ) {
255+ windowStart = ZonedDateTime .now ();
256+ windowEnd = Tools .getNextMinecraftTime (world , endRange , 0 );
257+ if (windowEnd .isBefore (windowStart )) {
258+ windowEnd = Tools .getNextMinecraftTime (world , endRange , 1 );
259+ }
260+ } else {
261+ int dayOffset = (firstIteration && currentlyInWindow ) ? 1 : mcDay ;
262+ if (firstIteration && !currentlyInWindow ) {
263+ dayOffset = 0 ;
264+ }
265+ windowStart = Tools .getNextMinecraftTime (world , startRange , dayOffset );
266+ windowEnd = Tools .getNextMinecraftTime (world , endRange , dayOffset );
267+ if (windowEnd .isBefore (windowStart )) {
268+ windowEnd = Tools .getNextMinecraftTime (world , endRange , dayOffset + 1 );
271269 }
270+ }
271+ firstIteration = false ;
272272
273- ZonedDateTime execTime = windowStart .isBefore (latestScheduledDate ) ? latestScheduledDate : windowStart ;
274- long intervalSeconds = task .getInterval ().toSeconds ();
275- if (intervalSeconds <= 0 ) intervalSeconds = 1 ;
273+ if (!task .getDays ().contains (windowStart .toLocalDate ().getDayOfWeek ())) {
274+ mcDay ++;
275+ continue ;
276+ }
276277
277- while (maxToSchedule > 0 && !execTime .isAfter (windowEnd )) {
278- if (!execTime .isBefore (latestScheduledDate )) {
279- scheduledTasks .add (new ScheduledTask (task , execTime ));
280- maxToSchedule --;
281- }
282- execTime = execTime .plusSeconds (intervalSeconds );
283- }
278+ if (windowEnd .isBefore (latestScheduledDate )) {
284279 mcDay ++;
280+ continue ;
285281 }
286- } else {
287- LocalTime time = taskTime .getTime1 ();
288282
289- int i = 0 ;
290- while (maxToSchedule > 0 ) {
291- ZonedDateTime nextMinecraftTime = Tools .getNextMinecraftTime (world , time , i );
292- if (!task .getDays ().contains (nextMinecraftTime .getDayOfWeek ())) {
293- i ++;
294- continue ;
295- }
283+ ZonedDateTime execTime = windowStart .isBefore (latestScheduledDate ) ? latestScheduledDate : windowStart ;
284+ long intervalSeconds = task .getInterval ().toSeconds ();
285+ if (intervalSeconds <= 0 ) intervalSeconds = 1 ;
296286
297- if (nextMinecraftTime .isBefore (latestScheduledDate )) {
298- i ++;
299- continue ;
287+ while (maxToSchedule > 0 && !execTime .isAfter (windowEnd )) {
288+ if (!execTime .isBefore (latestScheduledDate )) {
289+ scheduledTasks .add (new ScheduledTask (task , execTime ));
290+ maxToSchedule --;
300291 }
301-
302- scheduledTasks .add (new ScheduledTask (task , nextMinecraftTime ));
303- maxToSchedule --;
304- i ++;
292+ execTime = execTime .plusSeconds (intervalSeconds );
305293 }
294+ mcDay ++;
306295 }
307- } else if ( taskTime . isRange ()) {
296+ } else {
308297 LocalTime startRange = taskTime .getTime1 ();
309298 LocalTime endRange = taskTime .getTime2 ();
310299
@@ -317,7 +306,8 @@ public void populateScheduleForTask(Task task) {
317306 continue ;
318307 }
319308
320- if (!(date .toLocalTime ().isAfter (startRange ) && date .toLocalTime ().isBefore (endRange ))) {
309+ boolean isInRange = Tools .isTimeInRange (date .toLocalTime (), startRange , endRange );
310+ if (!isInRange ) {
321311 i ++;
322312 continue ;
323313 }
@@ -331,29 +321,59 @@ public void populateScheduleForTask(Task task) {
331321 maxToSchedule --;
332322 i ++;
333323 }
334- } else {
335- LocalTime time = taskTime .getTime1 ();
336-
337- int i = 0 ;
338- while (maxToSchedule > 0 ) {
339- ZonedDateTime date = ZonedDateTime .of (LocalDate .now (), time , ZoneId .systemDefault ())
340- .plusDays (i );
341- if (!task .getDays ().contains (date .getDayOfWeek ())) {
342- i ++;
324+ }
325+ }
326+
327+ if (!nonRangeTimes .isEmpty ()) {
328+ List <ZonedDateTime > allOccurrences = new ArrayList <>();
329+
330+ for (TaskTime taskTime : nonRangeTimes ) {
331+ if (taskTime .isMinecraftTime ()) {
332+ World world = Bukkit .getWorld (taskTime .getWorld () == null ? "world" : taskTime .getWorld ());
333+ if (world == null ) {
343334 continue ;
344335 }
345336
346- if (date .isBefore (latestScheduledDate )) {
337+ LocalTime time = taskTime .getTime1 ();
338+ int i = 0 ;
339+ int collected = 0 ;
340+ while (collected < maxToSchedule * 2 ) {
341+ ZonedDateTime nextMinecraftTime = Tools .getNextMinecraftTime (world , time , i );
342+ if (task .getDays ().contains (nextMinecraftTime .getDayOfWeek ())
343+ && !nextMinecraftTime .isBefore (latestScheduledDate )) {
344+ allOccurrences .add (nextMinecraftTime );
345+ collected ++;
346+ }
347347 i ++;
348- continue ;
349348 }
350-
351- scheduledTasks .add (new ScheduledTask (task , date ));
352- maxToSchedule --;
353- i ++;
349+ } else {
350+ LocalTime time = taskTime .getTime1 ();
351+ int i = 0 ;
352+ int collected = 0 ;
353+ while (collected < maxToSchedule * 2 ) {
354+ ZonedDateTime date = ZonedDateTime .of (LocalDate .now (), time , ZoneId .systemDefault ())
355+ .plusDays (i );
356+ if (task .getDays ().contains (date .getDayOfWeek ())
357+ && !date .isBefore (latestScheduledDate )) {
358+ allOccurrences .add (date );
359+ collected ++;
360+ }
361+ i ++;
362+ }
363+ }
364+ }
365+
366+ allOccurrences .sort (ZonedDateTime ::compareTo );
367+
368+ for (ZonedDateTime date : allOccurrences ) {
369+ if (maxToSchedule <= 0 ) {
370+ break ;
354371 }
372+ scheduledTasks .add (new ScheduledTask (task , date ));
373+ maxToSchedule --;
355374 }
356375 }
376+
357377 return ;
358378 }
359379
@@ -363,7 +383,7 @@ public void populateScheduleForTask(Task task) {
363383 return ;
364384 }
365385
366- int i = 0 ;
386+ int i = 1 ;
367387 while (maxToSchedule > 0 ) {
368388 ZonedDateTime date = latestScheduledDate .plusSeconds (i * task .getInterval ().toSeconds ());
369389 if (!task .getDays ().contains (date .getDayOfWeek ())) {
0 commit comments