From 1374b87829c10ab73f3fe2a04d5e9274a5c95170 Mon Sep 17 00:00:00 2001 From: Tristan Vermeesch Date: Thu, 11 Dec 2025 21:04:46 +0100 Subject: [PATCH] fix: incorrect minecraft time calculations --- build.gradle | 4 +- java17-build.gradle | 4 +- java21-build.gradle | 4 +- .../playbosswar/com/tasks/TasksManager.java | 67 +++++++++++++++---- .../me/playbosswar/com/utils/Messages.java | 1 - src/main/resources/plugin.yml | 2 +- 6 files changed, 61 insertions(+), 21 deletions(-) diff --git a/build.gradle b/build.gradle index 4136594..334dcb0 100644 --- a/build.gradle +++ b/build.gradle @@ -9,7 +9,7 @@ java { } group = 'me.playbosswar.com' -version = '8.15.0' +version = '8.15.1' description = 'CommandTimer' repositories { @@ -74,7 +74,7 @@ publishing { maven(MavenPublication) { groupId = 'me.playbosswar.com' artifactId = 'commandtimer' - version = '8.15.0' + version = '8.15.1' from components.java } diff --git a/java17-build.gradle b/java17-build.gradle index 6d5cb24..4410299 100644 --- a/java17-build.gradle +++ b/java17-build.gradle @@ -10,7 +10,7 @@ java { group = 'me.playbosswar.com' -version = '8.15.0' +version = '8.15.1' description = 'CommandTimer' repositories { @@ -63,7 +63,7 @@ publishing { maven(MavenPublication) { groupId = 'me.playbosswar.com' artifactId = 'commandtimer-java17' - version = '8.15.0' + version = '8.15.1' from components.java } diff --git a/java21-build.gradle b/java21-build.gradle index e116da2..09de9db 100644 --- a/java21-build.gradle +++ b/java21-build.gradle @@ -10,7 +10,7 @@ java { group = 'me.playbosswar.com' -version = '8.15.0' +version = '8.15.1' description = 'CommandTimer' repositories { @@ -67,7 +67,7 @@ publishing { maven(MavenPublication) { groupId = 'me.playbosswar.com' artifactId = 'commandtimer-java21' - version = '8.15.0' + version = '8.15.1' from components.java } } diff --git a/src/main/java/me/playbosswar/com/tasks/TasksManager.java b/src/main/java/me/playbosswar/com/tasks/TasksManager.java index bd6f0af..c233fe9 100644 --- a/src/main/java/me/playbosswar/com/tasks/TasksManager.java +++ b/src/main/java/me/playbosswar/com/tasks/TasksManager.java @@ -180,6 +180,11 @@ public void populateScheduleForTask(Task task) { return; } + boolean usesMinecraftTime = task.getTimes().stream().anyMatch(TaskTime::isMinecraftTime); + if (usesMinecraftTime) { + scheduledTasks.removeIf(st -> st.getTask().getId().equals(task.getId())); + } + int executionLimit = task.getExecutionLimit(); int timesExecuted = task.getTimesExecuted(); long alreadyScheduled = scheduledTasks.stream() @@ -228,28 +233,56 @@ public void populateScheduleForTask(Task task) { LocalTime startRange = taskTime.getTime1(); LocalTime endRange = taskTime.getTime2(); - int i = 0; + LocalTime currentMcTime = Tools.getMinecraftTimeAt(world, ZonedDateTime.now()); + boolean currentlyInWindow = isTimeInRange(currentMcTime, startRange, endRange); + + int mcDay = 0; + boolean firstIteration = true; while (maxToSchedule > 0) { - ZonedDateTime date = Tools.getNextMinecraftTime(world, startRange, i); - if (!task.getDays().contains(date.getDayOfWeek())) { - i++; - continue; + ZonedDateTime windowStart; + ZonedDateTime windowEnd; + + if (firstIteration && currentlyInWindow) { + windowStart = ZonedDateTime.now(); + windowEnd = Tools.getNextMinecraftTime(world, endRange, 0); + if (windowEnd.isBefore(windowStart)) { + windowEnd = Tools.getNextMinecraftTime(world, endRange, 1); + } + } else { + int dayOffset = (firstIteration && currentlyInWindow) ? 1 : mcDay; + if (firstIteration && !currentlyInWindow) { + dayOffset = 0; + } + windowStart = Tools.getNextMinecraftTime(world, startRange, dayOffset); + windowEnd = Tools.getNextMinecraftTime(world, endRange, dayOffset); + if (windowEnd.isBefore(windowStart)) { + windowEnd = Tools.getNextMinecraftTime(world, endRange, dayOffset + 1); + } } + firstIteration = false; - LocalTime mcTimeAtExecution = Tools.getMinecraftTimeAt(world, date); - if (!(mcTimeAtExecution.isAfter(startRange) && mcTimeAtExecution.isBefore(endRange))) { - i++; + if (!task.getDays().contains(windowStart.toLocalDate().getDayOfWeek())) { + mcDay++; continue; } - if (date.isBefore(latestScheduledDate)) { - i++; + if (windowEnd.isBefore(latestScheduledDate)) { + mcDay++; continue; } - scheduledTasks.add(new ScheduledTask(task, date)); - maxToSchedule--; - i++; + ZonedDateTime execTime = windowStart.isBefore(latestScheduledDate) ? latestScheduledDate : windowStart; + long intervalSeconds = task.getInterval().toSeconds(); + if (intervalSeconds <= 0) intervalSeconds = 1; + + while (maxToSchedule > 0 && !execTime.isAfter(windowEnd)) { + if (!execTime.isBefore(latestScheduledDate)) { + scheduledTasks.add(new ScheduledTask(task, execTime)); + maxToSchedule--; + } + execTime = execTime.plusSeconds(intervalSeconds); + } + mcDay++; } } else { LocalTime time = taskTime.getTime1(); @@ -367,6 +400,14 @@ public int getNextTaskCommandIndex(Task task) { return selectedCommandIndex; } + private boolean isTimeInRange(LocalTime time, LocalTime start, LocalTime end) { + if (start.isBefore(end)) { + return !time.isBefore(start) && !time.isAfter(end); + } else { + return !time.isBefore(start) || !time.isAfter(end); + } + } + public void disable() { List tasksToStore = loadedTasks.stream().filter(Task::isActive).collect(Collectors.toList()); tasksToStore.forEach(Task::storeInstance); diff --git a/src/main/java/me/playbosswar/com/utils/Messages.java b/src/main/java/me/playbosswar/com/utils/Messages.java index 4598843..6dd20b3 100644 --- a/src/main/java/me/playbosswar/com/utils/Messages.java +++ b/src/main/java/me/playbosswar/com/utils/Messages.java @@ -101,7 +101,6 @@ public static void sendHelpMessage(CommandSender sender) { Messages.sendMessage(sender, "§e/cmt activate - §7Activate a task"); Messages.sendMessage(sender, "§e/cmt deactivate - §7Deactivate a task"); Messages.sendMessage(sender, "§e/cmt execute - §7Instantly execute a task"); - Messages.sendMessage(sender, "§e/cmt nextexecutions - §7Show next 10 executions for a task"); Messages.sendMessage(sender, "§e/cmt schedule [-after 1h10m5s] [-gender CONSOLE] - §7Schedule a one-time command"); Messages.sendMessage(sender, "§e/cmt reload - §7Reload the plugin"); Messages.sendMessage(sender, "§e/cmt migrateToDatabase - §7Migrate JSON files to database"); diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 55f7868..4c83ba4 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,6 +1,6 @@ main: me.playbosswar.com.CommandTimerPlugin name: "CommandTimer" -version: "8.15.0" +version: "8.15.1" description: "Schedule commands like you want" author: PlayBossWar api-version: 1.13