Paper/patches/unapplied/api/0277-Add-worldborder-events.patch
2021-11-30 19:26:33 +01:00

309 lines
8.9 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Jake Potrebic <jake.m.potrebic@gmail.com>
Date: Mon, 4 Jan 2021 22:40:26 -0800
Subject: [PATCH] Add worldborder events
diff --git a/src/main/java/io/papermc/paper/event/world/border/WorldBorderBoundsChangeEvent.java b/src/main/java/io/papermc/paper/event/world/border/WorldBorderBoundsChangeEvent.java
new file mode 100644
index 0000000000000000000000000000000000000000..126fe50b519a8d7cd158f799058cb235f9c4cbdb
--- /dev/null
+++ b/src/main/java/io/papermc/paper/event/world/border/WorldBorderBoundsChangeEvent.java
@@ -0,0 +1,114 @@
+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.NotNull;
+
+/**
+ * Called when a world border changes its bounds, either over time, or instantly.
+ */
+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;
+
+ public WorldBorderBoundsChangeEvent(@NotNull World world, @NotNull WorldBorder worldBorder, @NotNull Type type, double oldSize, double newSize, 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
+ */
+ @NotNull
+ public Type getType() {
+ return type;
+ }
+
+ /**
+ * Gets the old size or the world border.
+ *
+ * @return the old size
+ */
+ public double getOldSize() {
+ return oldSize;
+ }
+
+ /**
+ * Gets the new size of the world border.
+ *
+ * @return the new size
+ */
+ public double getNewSize() {
+ return newSize;
+ }
+
+ /**
+ * Sets the new size of the world border.
+ *
+ * @param newSize the new size
+ */
+ public void setNewSize(double newSize) {
+ // PAIL: TODO: Magic Values
+ this.newSize = Math.min(6.0E7D, 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 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(long duration) {
+ // PAIL: TODO: Magic Values
+ this.duration = Math.min(9223372036854775L, Math.max(0L, duration));
+ if (duration >= 0 && type == Type.INSTANT_MOVE) type = Type.STARTED_MOVE;
+ }
+
+ @Override
+ public boolean isCancelled() {
+ return cancelled;
+ }
+
+ @Override
+ public void setCancelled(boolean cancel) {
+ this.cancelled = cancel;
+ }
+
+ @NotNull
+ @Override
+ public HandlerList getHandlers() {
+ return HANDLER_LIST;
+ }
+
+ @NotNull
+ public static HandlerList getHandlerList() {
+ return HANDLER_LIST;
+ }
+
+ public enum Type {
+ STARTED_MOVE,
+ INSTANT_MOVE
+ }
+}
diff --git a/src/main/java/io/papermc/paper/event/world/border/WorldBorderBoundsChangeFinishEvent.java b/src/main/java/io/papermc/paper/event/world/border/WorldBorderBoundsChangeFinishEvent.java
new file mode 100644
index 0000000000000000000000000000000000000000..c3d578ae2c5615b0ebace99d9bacf100b086c971
--- /dev/null
+++ b/src/main/java/io/papermc/paper/event/world/border/WorldBorderBoundsChangeFinishEvent.java
@@ -0,0 +1,65 @@
+package io.papermc.paper.event.world.border;
+
+import org.bukkit.World;
+import org.bukkit.WorldBorder;
+import org.bukkit.event.HandlerList;
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * Called when a moving world border has finished it's move.
+ */
+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;
+
+ public WorldBorderBoundsChangeFinishEvent(@NotNull World world, @NotNull WorldBorder worldBorder, double oldSize, double newSize, 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 oldSize;
+ }
+
+ /**
+ * Gets the new size of the worldborder.
+ *
+ * @return the new size
+ */
+ public double getNewSize() {
+ return newSize;
+ }
+
+ /**
+ * Gets the duration this worldborder took to make the change.
+ * <p>
+ * Can be 0 if handlers for {@link io.papermc.paper.event.world.border.WorldBorderCenterChangeEvent} set the duration to 0.
+ *
+ * @return the duration of the transition
+ */
+ public double getDuration() {
+ return duration;
+ }
+
+ @NotNull
+ @Override
+ public HandlerList getHandlers() {
+ return HANDLER_LIST;
+ }
+
+ @NotNull
+ public static HandlerList getHandlerList() {
+ return HANDLER_LIST;
+ }
+}
diff --git a/src/main/java/io/papermc/paper/event/world/border/WorldBorderCenterChangeEvent.java b/src/main/java/io/papermc/paper/event/world/border/WorldBorderCenterChangeEvent.java
new file mode 100644
index 0000000000000000000000000000000000000000..4a10c773a8d05a596066e63306dead74c1363fd7
--- /dev/null
+++ b/src/main/java/io/papermc/paper/event/world/border/WorldBorderCenterChangeEvent.java
@@ -0,0 +1,77 @@
+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.bukkit.event.world.WorldEvent;
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * Called when a world border's center is changed.
+ */
+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;
+
+ public WorldBorderCenterChangeEvent(@NotNull World world, @NotNull WorldBorder worldBorder, @NotNull Location oldCenter, @NotNull Location newCenter) {
+ super(world, worldBorder);
+ this.oldCenter = oldCenter;
+ this.newCenter = newCenter;
+ }
+
+ /**
+ * Gets the original center location of the world border.
+ *
+ * @return the old center
+ */
+ @NotNull
+ public Location getOldCenter() {
+ return oldCenter;
+ }
+
+ /**
+ * Gets the new center location for the world border.
+ *
+ * @return the new center
+ */
+ @NotNull
+ public Location getNewCenter() {
+ return newCenter;
+ }
+
+ /**
+ * Sets the new center location for the world border. Y coordinate is ignored.
+ *
+ * @param newCenter the new center
+ */
+ public void setNewCenter(@NotNull Location newCenter) {
+ this.newCenter = newCenter;
+ }
+
+ @Override
+ public boolean isCancelled() {
+ return cancelled;
+ }
+
+ @Override
+ public void setCancelled(boolean cancel) {
+ this.cancelled = cancel;
+ }
+
+ @NotNull
+ @Override
+ public HandlerList getHandlers() {
+ return HANDLER_LIST;
+ }
+
+ @NotNull
+ public static HandlerList getHandlerList() {
+ return HANDLER_LIST;
+ }
+}
diff --git a/src/main/java/io/papermc/paper/event/world/border/WorldBorderEvent.java b/src/main/java/io/papermc/paper/event/world/border/WorldBorderEvent.java
new file mode 100644
index 0000000000000000000000000000000000000000..67bd469d3680c9554ce6c1d5493826a252682835
--- /dev/null
+++ b/src/main/java/io/papermc/paper/event/world/border/WorldBorderEvent.java
@@ -0,0 +1,22 @@
+package io.papermc.paper.event.world.border;
+
+import org.bukkit.World;
+import org.bukkit.WorldBorder;
+import org.bukkit.event.Cancellable;
+import org.bukkit.event.world.WorldEvent;
+import org.jetbrains.annotations.NotNull;
+
+public abstract class WorldBorderEvent extends WorldEvent {
+
+ private final WorldBorder worldBorder;
+
+ public WorldBorderEvent(@NotNull World world, @NotNull WorldBorder worldBorder) {
+ super(world);
+ this.worldBorder = worldBorder;
+ }
+
+ @NotNull
+ public WorldBorder getWorldBorder() {
+ return worldBorder;
+ }
+}