From b796dfbfcd69b6d3fe9a4e484b1439d4145e9982 Mon Sep 17 00:00:00 2001 From: Aapo Katila Date: Thu, 7 May 2026 18:53:31 +0300 Subject: [PATCH 1/6] change WorldBorder timeToTargetDiameter to ticks --- .../world/border/SpongeWorldBorderBuilder.java | 16 +++++++--------- .../border/WorldBorderMixin_Settings_API.java | 5 +++-- .../world/level/border/WorldBorderMixin.java | 5 +++-- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/main/java/org/spongepowered/common/world/border/SpongeWorldBorderBuilder.java b/src/main/java/org/spongepowered/common/world/border/SpongeWorldBorderBuilder.java index 80e3318f7eb..a1565750052 100644 --- a/src/main/java/org/spongepowered/common/world/border/SpongeWorldBorderBuilder.java +++ b/src/main/java/org/spongepowered/common/world/border/SpongeWorldBorderBuilder.java @@ -24,6 +24,7 @@ */ package org.spongepowered.common.world.border; +import org.spongepowered.api.util.Ticks; import org.spongepowered.api.world.border.WorldBorder; import org.spongepowered.common.accessor.world.level.border.WorldBorder_SettingsAccessor; import org.spongepowered.common.bridge.world.level.border.WorldBorderBridge; @@ -35,7 +36,7 @@ public final class SpongeWorldBorderBuilder implements WorldBorder.Builder { private double diameter = -1; private double initialDiameter = -1; - private Duration time = Duration.ZERO; + private Ticks ticks = Ticks.zero(); private Vector2d center = Vector2d.ZERO; //use a default value otherwise null is used private Duration warningTime = Duration.ZERO; private double warningDistance; @@ -50,7 +51,7 @@ public WorldBorder.Builder from(final WorldBorderBridge border) { public WorldBorder.Builder from(final WorldBorder border) { this.diameter = border.targetDiameter(); this.initialDiameter = border.diameter(); - this.time = border.timeUntilTargetDiameter(); + this.ticks = border.timeUntilTargetDiameter(); this.center = border.center(); this.warningTime = border.warningTime(); this.warningDistance = border.warningDistance(); @@ -77,11 +78,8 @@ public WorldBorder.Builder targetDiameter(final double diameter) { } @Override - public WorldBorder.Builder timeToTargetDiameter(final Duration time) { - if (time.isNegative()) { - throw new IllegalArgumentException("time cannot be negative"); - } - this.time = time; + public WorldBorder.Builder timeToTargetDiameter(final Ticks ticks) { + this.ticks = ticks; return this; } @@ -153,7 +151,7 @@ public WorldBorder build() throws IllegalStateException { (int) this.warningDistance, (int) this.warningTime.getSeconds(), this.initialDiameter == -1 ? this.diameter : this.initialDiameter, - this.time.toMillis(), + this.ticks.ticks(), this.diameter ); } @@ -165,7 +163,7 @@ public WorldBorder.Builder reset() { this.safeZone = 0; this.diameter = -1; this.initialDiameter = -1; - this.time = Duration.ZERO; + this.ticks = Ticks.zero(); this.warningDistance = 0; this.warningTime = Duration.ZERO; return this; diff --git a/src/mixins/java/org/spongepowered/common/mixin/api/minecraft/world/level/border/WorldBorderMixin_Settings_API.java b/src/mixins/java/org/spongepowered/common/mixin/api/minecraft/world/level/border/WorldBorderMixin_Settings_API.java index 68985d69c1d..82a7b1071fd 100644 --- a/src/mixins/java/org/spongepowered/common/mixin/api/minecraft/world/level/border/WorldBorderMixin_Settings_API.java +++ b/src/mixins/java/org/spongepowered/common/mixin/api/minecraft/world/level/border/WorldBorderMixin_Settings_API.java @@ -25,6 +25,7 @@ package org.spongepowered.common.mixin.api.minecraft.world.level.border; import net.minecraft.world.level.border.WorldBorder; +import org.spongepowered.api.util.Ticks; import org.spongepowered.asm.mixin.Implements; import org.spongepowered.asm.mixin.Interface; import org.spongepowered.asm.mixin.Intrinsic; @@ -61,8 +62,8 @@ public double targetDiameter() { } @Override - public Duration timeUntilTargetDiameter() { - return Duration.ofMillis(this.shadow$lerpTime()); + public Ticks timeUntilTargetDiameter() { + return Ticks.of(this.shadow$lerpTime()); } @Override diff --git a/src/mixins/java/org/spongepowered/common/mixin/core/world/level/border/WorldBorderMixin.java b/src/mixins/java/org/spongepowered/common/mixin/core/world/level/border/WorldBorderMixin.java index 9c9e020ec12..8eb5d9bc63b 100644 --- a/src/mixins/java/org/spongepowered/common/mixin/core/world/level/border/WorldBorderMixin.java +++ b/src/mixins/java/org/spongepowered/common/mixin/core/world/level/border/WorldBorderMixin.java @@ -30,6 +30,7 @@ import org.spongepowered.api.Sponge; import org.spongepowered.api.event.SpongeEventFactory; import org.spongepowered.api.event.world.ChangeWorldBorderEvent; +import org.spongepowered.api.util.Ticks; import org.spongepowered.api.world.server.ServerWorld; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; @@ -83,13 +84,13 @@ public abstract class WorldBorderMixin implements WorldBorderBridge { } @Inject(method = "lerpSizeBetween", at = @At(value = "HEAD"), cancellable = true) - private void impl$onLerping(final double initial, final double target, final long milliseconds, final long delay, final CallbackInfo ci) { + private void impl$onLerping(final double initial, final double target, final long ticks, final long delay, final CallbackInfo ci) { if (this.impl$fireEvent) { final Supplier proposed = () -> new SpongeWorldBorderBuilder().from(this) .initialDiameter(initial) .targetDiameter(target) - .timeToTargetDiameter(Duration.ofMillis(milliseconds)) + .timeToTargetDiameter(Ticks.of(ticks)) .build(); if (this.impl$suppressOriginalAction(proposed)) { ci.cancel(); From 36dda5de5d04a03f9aa646a81a187c4a0c579282 Mon Sep 17 00:00:00 2001 From: Aapo Katila Date: Thu, 7 May 2026 19:40:43 +0300 Subject: [PATCH 2/6] Update SpongeAPI for CI --- SpongeAPI | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SpongeAPI b/SpongeAPI index 0a773a9b19e..a23d64402d6 160000 --- a/SpongeAPI +++ b/SpongeAPI @@ -1 +1 @@ -Subproject commit 0a773a9b19ef37f61708ac136a54fb2bf9f79f2d +Subproject commit a23d64402d606019cb4e5e82f691d9b02427aa24 From 1ac2238d4a81afb78bd49f6c25542fe6981ab780 Mon Sep 17 00:00:00 2001 From: Aapo Katila Date: Thu, 7 May 2026 20:04:16 +0300 Subject: [PATCH 3/6] fix infinite ticks --- .../common/world/border/SpongeWorldBorderBuilder.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/org/spongepowered/common/world/border/SpongeWorldBorderBuilder.java b/src/main/java/org/spongepowered/common/world/border/SpongeWorldBorderBuilder.java index a1565750052..f2a5f932e42 100644 --- a/src/main/java/org/spongepowered/common/world/border/SpongeWorldBorderBuilder.java +++ b/src/main/java/org/spongepowered/common/world/border/SpongeWorldBorderBuilder.java @@ -79,6 +79,9 @@ public WorldBorder.Builder targetDiameter(final double diameter) { @Override public WorldBorder.Builder timeToTargetDiameter(final Ticks ticks) { + if (ticks.isInfinite()) { + return this; + } this.ticks = ticks; return this; } From bcc39c8d7212ef49558858964e506b3d16bc6752 Mon Sep 17 00:00:00 2001 From: Aapo Katila Date: Sat, 9 May 2026 19:42:21 +0300 Subject: [PATCH 4/6] fix logic issues --- .../common/world/border/SpongeWorldBorderBuilder.java | 5 +---- .../world/level/border/WorldBorderMixin_Settings_API.java | 2 +- .../mixin/core/world/level/border/WorldBorderMixin.java | 2 +- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/spongepowered/common/world/border/SpongeWorldBorderBuilder.java b/src/main/java/org/spongepowered/common/world/border/SpongeWorldBorderBuilder.java index f2a5f932e42..58ef39015f7 100644 --- a/src/main/java/org/spongepowered/common/world/border/SpongeWorldBorderBuilder.java +++ b/src/main/java/org/spongepowered/common/world/border/SpongeWorldBorderBuilder.java @@ -79,9 +79,6 @@ public WorldBorder.Builder targetDiameter(final double diameter) { @Override public WorldBorder.Builder timeToTargetDiameter(final Ticks ticks) { - if (ticks.isInfinite()) { - return this; - } this.ticks = ticks; return this; } @@ -154,7 +151,7 @@ public WorldBorder build() throws IllegalStateException { (int) this.warningDistance, (int) this.warningTime.getSeconds(), this.initialDiameter == -1 ? this.diameter : this.initialDiameter, - this.ticks.ticks(), + this.ticks.isInfinite() ? -1 : this.ticks.ticks(), this.diameter ); } diff --git a/src/mixins/java/org/spongepowered/common/mixin/api/minecraft/world/level/border/WorldBorderMixin_Settings_API.java b/src/mixins/java/org/spongepowered/common/mixin/api/minecraft/world/level/border/WorldBorderMixin_Settings_API.java index 82a7b1071fd..30b85efa871 100644 --- a/src/mixins/java/org/spongepowered/common/mixin/api/minecraft/world/level/border/WorldBorderMixin_Settings_API.java +++ b/src/mixins/java/org/spongepowered/common/mixin/api/minecraft/world/level/border/WorldBorderMixin_Settings_API.java @@ -63,7 +63,7 @@ public double targetDiameter() { @Override public Ticks timeUntilTargetDiameter() { - return Ticks.of(this.shadow$lerpTime()); + return this.shadow$lerpTime() == -1 ? Ticks.infinite() : Ticks.of(this.shadow$lerpTime()); } @Override diff --git a/src/mixins/java/org/spongepowered/common/mixin/core/world/level/border/WorldBorderMixin.java b/src/mixins/java/org/spongepowered/common/mixin/core/world/level/border/WorldBorderMixin.java index 8eb5d9bc63b..c28d902e50e 100644 --- a/src/mixins/java/org/spongepowered/common/mixin/core/world/level/border/WorldBorderMixin.java +++ b/src/mixins/java/org/spongepowered/common/mixin/core/world/level/border/WorldBorderMixin.java @@ -226,7 +226,7 @@ public abstract class WorldBorderMixin implements WorldBorderBridge { // TODO - figure out how to get the appropriate game time ((WorldBorder) (Object) this).lerpSizeBetween(worldBorder.size(), worldBorder.lerpTarget(), worldBorder.lerpTime(), SpongeCommon.server().overworld().getGameTime()); } else { - ((WorldBorder) (Object) this).setSize(worldBorder.size()); + ((WorldBorder) (Object) this).setSize(worldBorder.lerpTime() == -1 ? worldBorder.size() : worldBorder.lerpTarget()); } } From 6a3a4ff35fdd68ddee0060a6661747a1a78ae315 Mon Sep 17 00:00:00 2001 From: Aapo Katila Date: Sat, 9 May 2026 20:43:35 +0300 Subject: [PATCH 5/6] cleanup --- .../world/level/border/WorldBorderMixin_Settings_API.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/mixins/java/org/spongepowered/common/mixin/api/minecraft/world/level/border/WorldBorderMixin_Settings_API.java b/src/mixins/java/org/spongepowered/common/mixin/api/minecraft/world/level/border/WorldBorderMixin_Settings_API.java index 30b85efa871..7247b7f8fa2 100644 --- a/src/mixins/java/org/spongepowered/common/mixin/api/minecraft/world/level/border/WorldBorderMixin_Settings_API.java +++ b/src/mixins/java/org/spongepowered/common/mixin/api/minecraft/world/level/border/WorldBorderMixin_Settings_API.java @@ -31,6 +31,7 @@ import org.spongepowered.asm.mixin.Intrinsic; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.common.util.SpongeTicks; import org.spongepowered.math.vector.Vector2d; import java.time.Duration; @@ -63,7 +64,7 @@ public double targetDiameter() { @Override public Ticks timeUntilTargetDiameter() { - return this.shadow$lerpTime() == -1 ? Ticks.infinite() : Ticks.of(this.shadow$lerpTime()); + return SpongeTicks.ticksOrInfinite(this.shadow$lerpTime(), -1); } @Override From 218a985b284f9fc0cdfb74af1054c0d1501891be Mon Sep 17 00:00:00 2001 From: Aapo Katila Date: Sun, 10 May 2026 11:15:03 +0300 Subject: [PATCH 6/6] fix infinity ticks --- .../mixin/core/world/level/border/WorldBorderMixin.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/mixins/java/org/spongepowered/common/mixin/core/world/level/border/WorldBorderMixin.java b/src/mixins/java/org/spongepowered/common/mixin/core/world/level/border/WorldBorderMixin.java index c28d902e50e..ab9a9734109 100644 --- a/src/mixins/java/org/spongepowered/common/mixin/core/world/level/border/WorldBorderMixin.java +++ b/src/mixins/java/org/spongepowered/common/mixin/core/world/level/border/WorldBorderMixin.java @@ -30,7 +30,6 @@ import org.spongepowered.api.Sponge; import org.spongepowered.api.event.SpongeEventFactory; import org.spongepowered.api.event.world.ChangeWorldBorderEvent; -import org.spongepowered.api.util.Ticks; import org.spongepowered.api.world.server.ServerWorld; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; @@ -40,6 +39,7 @@ import org.spongepowered.common.SpongeCommon; import org.spongepowered.common.bridge.world.level.border.WorldBorderBridge; import org.spongepowered.common.event.tracking.PhaseTracker; +import org.spongepowered.common.util.SpongeTicks; import org.spongepowered.common.world.border.SpongeWorldBorderBuilder; import java.time.Duration; @@ -90,7 +90,7 @@ public abstract class WorldBorderMixin implements WorldBorderBridge { () -> new SpongeWorldBorderBuilder().from(this) .initialDiameter(initial) .targetDiameter(target) - .timeToTargetDiameter(Ticks.of(ticks)) + .timeToTargetDiameter(SpongeTicks.ticksOrInfinite(ticks, -1)) .build(); if (this.impl$suppressOriginalAction(proposed)) { ci.cancel();