diff --git a/src/main/java/org/mvplugins/multiverse/core/command/MVCommandContexts.java b/src/main/java/org/mvplugins/multiverse/core/command/MVCommandContexts.java index 19ce84675..616f1d613 100644 --- a/src/main/java/org/mvplugins/multiverse/core/command/MVCommandContexts.java +++ b/src/main/java/org/mvplugins/multiverse/core/command/MVCommandContexts.java @@ -42,6 +42,7 @@ import org.mvplugins.multiverse.core.locale.message.Message; import org.mvplugins.multiverse.core.utils.PlayerFinder; import org.mvplugins.multiverse.core.utils.REPatterns; +import org.mvplugins.multiverse.core.utils.tick.TickDuration; import org.mvplugins.multiverse.core.world.LoadedMultiverseWorld; import org.mvplugins.multiverse.core.world.MultiverseWorld; import org.mvplugins.multiverse.core.world.WorldManager; @@ -93,6 +94,7 @@ public class MVCommandContexts extends PaperCommandContexts { registerIssuerAwareContext(PlayerArrayValue.class, playerArrayContextBuilder().generateContext(PlayerArrayValue::new)); registerIssuerAwareContext(PlayerLocation.class, this::parsePlayerLocation); registerContext(SpawnCategory[].class, this::parseSpawnCategories); + registerContext(TickDuration.class, this::parseTickDuration); } private MVCommandIssuer parseMVCommandIssuer(BukkitCommandExecutionContext context) { @@ -393,4 +395,13 @@ private SpawnCategory[] parseSpawnCategories(BukkitCommandExecutionContext conte } return categories.toArray(new SpawnCategory[0]); } + + private TickDuration parseTickDuration(BukkitCommandExecutionContext context) { + String arg = context.popFirstArg(); + return TickDuration.parseString(arg) + .getOrElseThrow(failure -> + new InvalidCommandArgument("Invalid time duration format: \"" +arg + "\". Use a number " + + "followed by an optional suffix (s for seconds, d for game days) or just a number " + + "for ticks. Examples: 100, 5s, 2d")); + } } diff --git a/src/main/java/org/mvplugins/multiverse/core/commands/WorldBorderCommand.java b/src/main/java/org/mvplugins/multiverse/core/commands/WorldBorderCommand.java index 94e1e8cb2..06bf70850 100644 --- a/src/main/java/org/mvplugins/multiverse/core/commands/WorldBorderCommand.java +++ b/src/main/java/org/mvplugins/multiverse/core/commands/WorldBorderCommand.java @@ -12,8 +12,11 @@ import org.mvplugins.multiverse.core.command.MVCommandIssuer; import org.mvplugins.multiverse.core.locale.MVCorei18n; import org.mvplugins.multiverse.core.locale.message.MessageReplacement.Replace; +import org.mvplugins.multiverse.core.utils.compatibility.WorldBorderCompatibility; +import org.mvplugins.multiverse.core.utils.tick.TickDuration; import org.mvplugins.multiverse.core.world.LoadedMultiverseWorld; +import java.time.temporal.ChronoUnit; import java.util.function.Consumer; import static org.mvplugins.multiverse.core.locale.message.MessageReplacement.replace; @@ -33,15 +36,14 @@ void onWorldBorderAdd( @Optional @Default("0") @Syntax("[time]") - int time, + TickDuration duration, @Flags("resolve=issuerAware,maxArgForAware=0") @Syntax("[world]") LoadedMultiverseWorld world ) { - worldBorderAction(issuer, world, worldBorder -> { - onWorldBorderSet(issuer, worldBorder.getSize() + size, time, world); - }); + worldBorderAction(issuer, world, worldBorder -> + onWorldBorderSet(issuer, worldBorder.getSize() + size, duration, world)); } @Subcommand("center") @@ -145,7 +147,7 @@ void onWorldBorderSet( @Optional @Default("0") @Syntax("[time]") - int time, + TickDuration duration, @Flags("resolve=issuerAware,maxArgForAware=0") @Syntax("[world]") @@ -158,15 +160,18 @@ void onWorldBorderSet( Replace.WORLD.with(world.getAliasOrName())); return; } - worldBorder.setSize(size, time); - if (time <= 0) { + if (!WorldBorderCompatibility.supportsChangeSizeInTicks() && !duration.isExactTo(ChronoUnit.SECONDS)) { + setRoundOffError(issuer, duration); + } + WorldBorderCompatibility.changeSizeDuration(worldBorder, size, duration); + if (duration.toTicks() <= 0) { issuer.sendMessage(MVCorei18n.WORLDBORDER_SET_IMMEDIATE, replace("{size}").with(worldBorder.getSize()), Replace.WORLD.with(world.getAliasOrName())); } else { issuer.sendMessage(previousSize > size ? MVCorei18n.WORLDBORDER_SET_GROWING : MVCorei18n.WORLDBORDER_SET_SHRINKING, replace("{size}").with(size), - replace("{time}").with(time), + replace("{time}").with(String.format("%.2f", duration.toSeconds())), Replace.WORLD.with(world.getAliasOrName())); } }); @@ -201,25 +206,34 @@ void onWorldBorderWarningTime( MVCommandIssuer issuer, @Syntax("