diff --git a/paper-api/src/main/java/io/papermc/paper/event/world/border/WorldBorderBoundsChangeEvent.java b/paper-api/src/main/java/io/papermc/paper/event/world/border/WorldBorderBoundsChangeEvent.java new file mode 100644 index 0000000000..3c168b3522 --- /dev/null +++ b/paper-api/src/main/java/io/papermc/paper/event/world/border/WorldBorderBoundsChangeEvent.java @@ -0,0 +1,115 @@ +package io.papermc.paper.event.world.border; + +import org.bukkit.World; +import org.bukkit.WorldBorder; +import org.bukkit.event.Cancellable; +import org.bukkit.event.HandlerList; +import org.jetbrains.annotations.ApiStatus; +import org.jspecify.annotations.NullMarked; + +/** + * Called when a world border changes its bounds, either over time, or instantly. + */ +@NullMarked +public class WorldBorderBoundsChangeEvent extends WorldBorderEvent implements Cancellable { + + private static final HandlerList HANDLER_LIST = new HandlerList(); + + private Type type; + private final double oldSize; + private double newSize; + private long duration; + private boolean cancelled; + + @ApiStatus.Internal + public WorldBorderBoundsChangeEvent(final World world, final WorldBorder worldBorder, final Type type, final double oldSize, final double newSize, final long duration) { + super(world, worldBorder); + this.type = type; + this.oldSize = oldSize; + this.newSize = newSize; + this.duration = duration; + } + + /** + * Gets if this change is an instant change or over-time change. + * + * @return the change type + */ + public Type getType() { + return this.type; + } + + /** + * Gets the old size or the world border. + * + * @return the old size + */ + public double getOldSize() { + return this.oldSize; + } + + /** + * Gets the new size of the world border. + * + * @return the new size + */ + public double getNewSize() { + return this.newSize; + } + + /** + * Sets the new size of the world border. + * + * @param newSize the new size + */ + public void setNewSize(final double newSize) { + this.newSize = Math.min(this.worldBorder.getMaxSize(), Math.max(1.0D, newSize)); + } + + /** + * Gets the time in milliseconds for the change. Will be 0 if instant. + * + * @return the time in milliseconds for the change + */ + public long getDuration() { + return this.duration; + } + + /** + * Sets the time in milliseconds for the change. Will change {@link #getType()} to return + * {@link Type#STARTED_MOVE}. + * + * @param duration the time in milliseconds for the change + */ + public void setDuration(final long duration) { + // PAIL: TODO: Magic Values + this.duration = Math.min(9223372036854775L, Math.max(0L, duration)); + if (duration >= 0 && this.type == Type.INSTANT_MOVE) { + this.type = Type.STARTED_MOVE; + } + } + + @Override + public boolean isCancelled() { + return this.cancelled; + } + + @Override + public void setCancelled(final boolean cancel) { + this.cancelled = cancel; + } + + @Override + public HandlerList getHandlers() { + return HANDLER_LIST; + } + + public static HandlerList getHandlerList() { + return HANDLER_LIST; + } + + public enum Type { + STARTED_MOVE, + INSTANT_MOVE + } +} diff --git a/paper-api/src/main/java/io/papermc/paper/event/world/border/WorldBorderBoundsChangeFinishEvent.java b/paper-api/src/main/java/io/papermc/paper/event/world/border/WorldBorderBoundsChangeFinishEvent.java new file mode 100644 index 0000000000..6a26466089 --- /dev/null +++ b/paper-api/src/main/java/io/papermc/paper/event/world/border/WorldBorderBoundsChangeFinishEvent.java @@ -0,0 +1,66 @@ +package io.papermc.paper.event.world.border; + +import org.bukkit.World; +import org.bukkit.WorldBorder; +import org.bukkit.event.HandlerList; +import org.jetbrains.annotations.ApiStatus; +import org.jspecify.annotations.NullMarked; + +/** + * Called when a moving world border has finished its move. + */ +@NullMarked +public class WorldBorderBoundsChangeFinishEvent extends WorldBorderEvent { + + private static final HandlerList HANDLER_LIST = new HandlerList(); + + private final double oldSize; + private final double newSize; + private final double duration; + + @ApiStatus.Internal + public WorldBorderBoundsChangeFinishEvent(final World world, final WorldBorder worldBorder, final double oldSize, final double newSize, final double duration) { + super(world, worldBorder); + this.oldSize = oldSize; + this.newSize = newSize; + this.duration = duration; + } + + /** + * Gets the old size of the worldborder. + * + * @return the old size + */ + public double getOldSize() { + return this.oldSize; + } + + /** + * Gets the new size of the worldborder. + * + * @return the new size + */ + public double getNewSize() { + return this.newSize; + } + + /** + * Gets the duration this worldborder took to make the change. + *

+ * Can be 0 if handlers for {@link WorldBorderCenterChangeEvent} set the duration to 0. + * + * @return the duration of the transition + */ + public double getDuration() { + return this.duration; + } + + @Override + public HandlerList getHandlers() { + return HANDLER_LIST; + } + + public static HandlerList getHandlerList() { + return HANDLER_LIST; + } +} diff --git a/paper-api/src/main/java/io/papermc/paper/event/world/border/WorldBorderCenterChangeEvent.java b/paper-api/src/main/java/io/papermc/paper/event/world/border/WorldBorderCenterChangeEvent.java new file mode 100644 index 0000000000..74fe5ad505 --- /dev/null +++ b/paper-api/src/main/java/io/papermc/paper/event/world/border/WorldBorderCenterChangeEvent.java @@ -0,0 +1,76 @@ +package io.papermc.paper.event.world.border; + +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.WorldBorder; +import org.bukkit.event.Cancellable; +import org.bukkit.event.HandlerList; +import org.jetbrains.annotations.ApiStatus; +import org.jspecify.annotations.NullMarked; + +/** + * Called when a world border's center is changed. + */ +@NullMarked +public class WorldBorderCenterChangeEvent extends WorldBorderEvent implements Cancellable { + + private static final HandlerList HANDLER_LIST = new HandlerList(); + + private final Location oldCenter; + private Location newCenter; + + private boolean cancelled; + + @ApiStatus.Internal + public WorldBorderCenterChangeEvent(final World world, final WorldBorder worldBorder, final Location oldCenter, final Location newCenter) { + super(world, worldBorder); + this.oldCenter = oldCenter; + this.newCenter = newCenter; + } + + /** + * Gets the original center location of the world border. + * + * @return the old center + */ + public Location getOldCenter() { + return this.oldCenter.clone(); + } + + /** + * Gets the new center location for the world border. + * + * @return the new center + */ + public Location getNewCenter() { + return this.newCenter; + } + + /** + * Sets the new center location for the world border. Y coordinate is ignored. + * + * @param newCenter the new center + */ + public void setNewCenter(final Location newCenter) { + this.newCenter = newCenter; + } + + @Override + public boolean isCancelled() { + return this.cancelled; + } + + @Override + public void setCancelled(final boolean cancel) { + this.cancelled = cancel; + } + + @Override + public HandlerList getHandlers() { + return HANDLER_LIST; + } + + public static HandlerList getHandlerList() { + return HANDLER_LIST; + } +} diff --git a/paper-api/src/main/java/io/papermc/paper/event/world/border/WorldBorderEvent.java b/paper-api/src/main/java/io/papermc/paper/event/world/border/WorldBorderEvent.java new file mode 100644 index 0000000000..1f260e4d69 --- /dev/null +++ b/paper-api/src/main/java/io/papermc/paper/event/world/border/WorldBorderEvent.java @@ -0,0 +1,23 @@ +package io.papermc.paper.event.world.border; + +import org.bukkit.World; +import org.bukkit.WorldBorder; +import org.bukkit.event.world.WorldEvent; +import org.jetbrains.annotations.ApiStatus; +import org.jspecify.annotations.NullMarked; + +@NullMarked +public abstract class WorldBorderEvent extends WorldEvent { + + protected final WorldBorder worldBorder; + + @ApiStatus.Internal + protected WorldBorderEvent(final World world, final WorldBorder worldBorder) { + super(world); + this.worldBorder = worldBorder; + } + + public WorldBorder getWorldBorder() { + return this.worldBorder; + } +}