From f705236ab0d72e2759eaa894876edd46641b5eba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Zieli=C5=84ski?= <111442524+ChudziudgiToJa@users.noreply.github.com> Date: Fri, 17 Oct 2025 14:24:33 +0200 Subject: [PATCH 1/2] fix: Improve progress calculation and reduce update interval in BossBarService --- .../notice/resolver/bossbar/BossBarService.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/multification-core/src/com/eternalcode/multification/notice/resolver/bossbar/BossBarService.java b/multification-core/src/com/eternalcode/multification/notice/resolver/bossbar/BossBarService.java index a26bc7e..646d036 100644 --- a/multification-core/src/com/eternalcode/multification/notice/resolver/bossbar/BossBarService.java +++ b/multification-core/src/com/eternalcode/multification/notice/resolver/bossbar/BossBarService.java @@ -42,11 +42,14 @@ private void updateProgress(Instant expiration, Duration duration, BossBar bossB } Duration remaining = Duration.between(Instant.now(), expiration); - float progress = 1 - (float) remaining.getSeconds() / duration.getSeconds(); + double totalMillis = duration.toMillis(); + double remainingMillis = Math.max(0, remaining.toMillis()); + float progress = (float) (remainingMillis / totalMillis); + progress = Math.max(0.0f, Math.min(1.0f, progress)); bossBar.progress(progress); - this.scheduler.schedule(() -> updateProgress(expiration, duration, bossBar, viewer), 500L, TimeUnit.MILLISECONDS); + this.scheduler.schedule(() -> updateProgress(expiration, duration, bossBar, viewer), 100L, TimeUnit.MILLISECONDS); } } From 66d25ea609b586001f9b77527e656204a5cdb959 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Zieli=C5=84ski?= <111442524+ChudziudgiToJa@users.noreply.github.com> Date: Sat, 18 Oct 2025 02:06:43 +0200 Subject: [PATCH 2/2] fix: Add configurable update interval for progress updates in BossBarService --- .../resolver/bossbar/BossBarService.java | 42 ++++++++++++++++--- 1 file changed, 37 insertions(+), 5 deletions(-) diff --git a/multification-core/src/com/eternalcode/multification/notice/resolver/bossbar/BossBarService.java b/multification-core/src/com/eternalcode/multification/notice/resolver/bossbar/BossBarService.java index 646d036..520589a 100644 --- a/multification-core/src/com/eternalcode/multification/notice/resolver/bossbar/BossBarService.java +++ b/multification-core/src/com/eternalcode/multification/notice/resolver/bossbar/BossBarService.java @@ -15,6 +15,31 @@ public class BossBarService { private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(8); + // Configurable update interval in milliseconds (used for scheduling progress updates) + private final long updateIntervalMillis; + + // Default constructor: reads system property 'multification.bossbar.update-interval-ms' or falls back to 100ms + public BossBarService() { + this(getUpdateIntervalFromSystemProperty()); + } + + // Constructor allowing explicit configuration (useful for tests or programmatic configuration) + public BossBarService(long updateIntervalMillis) { + this.updateIntervalMillis = Math.max(1L, updateIntervalMillis); + } + + private static long getUpdateIntervalFromSystemProperty() { + final String key = "multification.bossbar.update-interval-ms"; + final long fallback = 100L; + String value = System.getProperty(key); + if (value == null) return fallback; + try { + return Long.parseLong(value); + } catch (NumberFormatException ex) { + return fallback; + } + } + void sendBossBar( ComponentSerializer serializer, BossBarContent content, @@ -42,14 +67,21 @@ private void updateProgress(Instant expiration, Duration duration, BossBar bossB } Duration remaining = Duration.between(Instant.now(), expiration); - double totalMillis = duration.toMillis(); - double remainingMillis = Math.max(0, remaining.toMillis()); - float progress = (float) (remainingMillis / totalMillis); - progress = Math.max(0.0f, Math.min(1.0f, progress)); + double totalMillis = Math.max(0.0, duration.toMillis()); + double remainingMillis = Math.max(0.0, remaining.toMillis()); + + float progress; + if (totalMillis <= 0.0) { + progress = 0.0f; + } else { + double fraction = remainingMillis / totalMillis; + progress = (float) fraction; + progress = Math.max(0.0f, Math.min(1.0f, progress)); + } bossBar.progress(progress); - this.scheduler.schedule(() -> updateProgress(expiration, duration, bossBar, viewer), 100L, TimeUnit.MILLISECONDS); + this.scheduler.schedule(() -> updateProgress(expiration, duration, bossBar, viewer), this.updateIntervalMillis, TimeUnit.MILLISECONDS); } }