From 81efba80b124bec84939562973f9c93f1c81374e Mon Sep 17 00:00:00 2001 From: Pierre-Olivier GOIN Date: Wed, 22 Oct 2025 15:53:36 +0200 Subject: [PATCH 1/6] Expose tpType --- .../src/main/java/com/earth2me/essentials/AsyncTeleport.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Essentials/src/main/java/com/earth2me/essentials/AsyncTeleport.java b/Essentials/src/main/java/com/earth2me/essentials/AsyncTeleport.java index fc98e97e175..b5e687f2557 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/AsyncTeleport.java +++ b/Essentials/src/main/java/com/earth2me/essentials/AsyncTeleport.java @@ -457,6 +457,10 @@ public void back(final CompletableFuture future) { nowAsync(teleportOwner, new LocationTarget(teleportOwner.getLastLocation()), TeleportCause.COMMAND, future); } + public TeleportType getTpType() { + return this.tpType; + } + public void setTpType(final TeleportType tpType) { this.tpType = tpType; } From bb7fa35f74a2065b78f6ad9d89e36f1e81a9654f Mon Sep 17 00:00:00 2001 From: Pierre-Olivier GOIN Date: Wed, 22 Oct 2025 19:34:22 +0200 Subject: [PATCH 2/6] Add an event when the warmup is cancelled --- .../essentials/AsyncTimedTeleport.java | 17 ++++-- .../TeleportWarmupCancelledEvent.java | 55 +++++++++++++++++++ 2 files changed, 68 insertions(+), 4 deletions(-) create mode 100644 Essentials/src/main/java/net/ess3/api/events/teleport/TeleportWarmupCancelledEvent.java diff --git a/Essentials/src/main/java/com/earth2me/essentials/AsyncTimedTeleport.java b/Essentials/src/main/java/com/earth2me/essentials/AsyncTimedTeleport.java index 784b3eb89a1..3b1b0647a94 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/AsyncTimedTeleport.java +++ b/Essentials/src/main/java/com/earth2me/essentials/AsyncTimedTeleport.java @@ -1,12 +1,14 @@ package com.earth2me.essentials; -import net.ess3.api.IEssentials; -import net.ess3.api.IUser; +import java.util.UUID; +import java.util.concurrent.CompletableFuture; + import org.bukkit.Location; import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; -import java.util.UUID; -import java.util.concurrent.CompletableFuture; +import net.ess3.api.IEssentials; +import net.ess3.api.IUser; +import net.ess3.api.events.teleport.TeleportWarmupCancelledEvent; public class AsyncTimedTeleport implements Runnable { private static final double MOVE_CONSTANT = 0.3; @@ -149,6 +151,13 @@ void cancelTimer(final boolean notifyUser) { } try { ess.getServer().getScheduler().cancelTask(timer_task); + + final IUser teleportUser = ess.getUser(this.timer_teleportee); + if (teleportUser != null && teleportUser.getBase().isOnline()) { + final TeleportWarmupCancelledEvent event = new TeleportWarmupCancelledEvent(teleportUser.getBase(), this.teleport.getTpType(), notifyUser); + ess.getServer().getPluginManager().callEvent(event); + } + if (notifyUser) { teleportOwner.sendTl("pendingTeleportCancelled"); if (timer_teleportee != null && !timer_teleportee.equals(teleportOwner.getBase().getUniqueId())) { diff --git a/Essentials/src/main/java/net/ess3/api/events/teleport/TeleportWarmupCancelledEvent.java b/Essentials/src/main/java/net/ess3/api/events/teleport/TeleportWarmupCancelledEvent.java new file mode 100644 index 00000000000..576e89d6108 --- /dev/null +++ b/Essentials/src/main/java/net/ess3/api/events/teleport/TeleportWarmupCancelledEvent.java @@ -0,0 +1,55 @@ +package net.ess3.api.events.teleport; + +import org.bukkit.entity.Player; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +import com.earth2me.essentials.AsyncTeleport.TeleportType; + +/** + * Called when a player's teleport warmup is cancelled. + */ +public class TeleportWarmupCancelledEvent extends Event { + + private static final HandlerList handlers = new HandlerList(); + + private final Player player; + private final TeleportType teleportType; + private final boolean notifyUser; + + public TeleportWarmupCancelledEvent(final Player player, final TeleportType teleportType, final boolean notifyUser) { + this.player = player; + this.teleportType = teleportType; + this.notifyUser = notifyUser; + } + + public static HandlerList getHandlerList() { + return handlers; + } + + @Override + public HandlerList getHandlers() { + return handlers; + } + + /** + * @return The player object + */ + public Player getPlayer() { + return this.player; + } + + /** + * @return The teleport type + */ + public TeleportType getTeleportType() { + return this.teleportType; + } + + /** + * @return Is the player notified? + */ + public boolean isPlayerNotified() { + return this.notifyUser; + } +} From 7b6189142abcd67479485ea1a512807a76e2a5f0 Mon Sep 17 00:00:00 2001 From: Pierre-Olivier GOIN Date: Thu, 20 Nov 2025 19:03:43 +0100 Subject: [PATCH 3/6] Resolve requested changes --- .../earth2me/essentials/AsyncTeleport.java | 2 +- .../essentials/AsyncTimedTeleport.java | 6 ++-- .../api/events/teleport/TeleportEvent.java | 4 +-- .../TeleportWarmupCancelledEvent.java | 31 ++++++++++++++++--- .../api/v2/events}/TeleportWarmupEvent.java | 3 +- 5 files changed, 36 insertions(+), 10 deletions(-) rename Essentials/src/main/java/net/{ess3/api/events/teleport => essentialsx/api/v2/events}/TeleportWarmupEvent.java (94%) diff --git a/Essentials/src/main/java/com/earth2me/essentials/AsyncTeleport.java b/Essentials/src/main/java/com/earth2me/essentials/AsyncTeleport.java index b5e687f2557..13e5bb9266d 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/AsyncTeleport.java +++ b/Essentials/src/main/java/com/earth2me/essentials/AsyncTeleport.java @@ -10,7 +10,7 @@ import net.ess3.api.TranslatableException; import net.ess3.api.events.UserWarpEvent; import net.ess3.api.events.teleport.PreTeleportEvent; -import net.ess3.api.events.teleport.TeleportWarmupEvent; +import net.essentialsx.api.v2.events.TeleportWarmupEvent; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.entity.Player; diff --git a/Essentials/src/main/java/com/earth2me/essentials/AsyncTimedTeleport.java b/Essentials/src/main/java/com/earth2me/essentials/AsyncTimedTeleport.java index 3b1b0647a94..ec1e85f8227 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/AsyncTimedTeleport.java +++ b/Essentials/src/main/java/com/earth2me/essentials/AsyncTimedTeleport.java @@ -9,6 +9,7 @@ import net.ess3.api.IEssentials; import net.ess3.api.IUser; import net.ess3.api.events.teleport.TeleportWarmupCancelledEvent; +import net.ess3.api.events.teleport.TeleportWarmupCancelledEvent.CancelReason; public class AsyncTimedTeleport implements Runnable { private static final double MOVE_CONSTANT = 0.3; @@ -153,8 +154,9 @@ void cancelTimer(final boolean notifyUser) { ess.getServer().getScheduler().cancelTask(timer_task); final IUser teleportUser = ess.getUser(this.timer_teleportee); - if (teleportUser != null && teleportUser.getBase().isOnline()) { - final TeleportWarmupCancelledEvent event = new TeleportWarmupCancelledEvent(teleportUser.getBase(), this.teleport.getTpType(), notifyUser); + if (teleportUser != null) { + final TeleportWarmupCancelledEvent.CancelReason cancelReason = teleportUser.getBase().isOnline() ? CancelReason.MOVE : CancelReason.LEAVE; + final TeleportWarmupCancelledEvent event = new TeleportWarmupCancelledEvent(teleportUser.getBase(), this.teleport.getTpType(), cancelReason, notifyUser); ess.getServer().getPluginManager().callEvent(event); } diff --git a/Essentials/src/main/java/net/ess3/api/events/teleport/TeleportEvent.java b/Essentials/src/main/java/net/ess3/api/events/teleport/TeleportEvent.java index 0ce330008b1..0c7eb57848c 100644 --- a/Essentials/src/main/java/net/ess3/api/events/teleport/TeleportEvent.java +++ b/Essentials/src/main/java/net/ess3/api/events/teleport/TeleportEvent.java @@ -20,7 +20,7 @@ public abstract class TeleportEvent extends Event implements Cancellable { private final ITarget target; private boolean cancelled = false; - TeleportEvent(final IUser teleporter, final IUser teleportee, final PlayerTeleportEvent.TeleportCause cause, final ITarget target) { + protected TeleportEvent(final IUser teleporter, final IUser teleportee, final PlayerTeleportEvent.TeleportCause cause, final ITarget target) { super(!Bukkit.isPrimaryThread()); this.teleporter = teleporter; this.teleportee = teleportee; @@ -28,7 +28,7 @@ public abstract class TeleportEvent extends Event implements Cancellable { this.target = target; } - TeleportEvent(final IUser teleportee, final PlayerTeleportEvent.TeleportCause cause, final ITarget target) { + protected TeleportEvent(final IUser teleportee, final PlayerTeleportEvent.TeleportCause cause, final ITarget target) { this(teleportee, teleportee, cause, target); } diff --git a/Essentials/src/main/java/net/ess3/api/events/teleport/TeleportWarmupCancelledEvent.java b/Essentials/src/main/java/net/ess3/api/events/teleport/TeleportWarmupCancelledEvent.java index 576e89d6108..024f2588d0e 100644 --- a/Essentials/src/main/java/net/ess3/api/events/teleport/TeleportWarmupCancelledEvent.java +++ b/Essentials/src/main/java/net/ess3/api/events/teleport/TeleportWarmupCancelledEvent.java @@ -3,9 +3,12 @@ import org.bukkit.entity.Player; import org.bukkit.event.Event; import org.bukkit.event.HandlerList; +import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; import com.earth2me.essentials.AsyncTeleport.TeleportType; +import io.papermc.paper.datacomponent.item.consumable.ConsumeEffect; + /** * Called when a player's teleport warmup is cancelled. */ @@ -15,11 +18,13 @@ public class TeleportWarmupCancelledEvent extends Event { private final Player player; private final TeleportType teleportType; + private final CancelReason cancelReason; private final boolean notifyUser; - public TeleportWarmupCancelledEvent(final Player player, final TeleportType teleportType, final boolean notifyUser) { + public TeleportWarmupCancelledEvent(final Player player, final TeleportType teleportType, CancelReason cancelReason, final boolean notifyUser) { this.player = player; this.teleportType = teleportType; + this.cancelReason = cancelReason; this.notifyUser = notifyUser; } @@ -33,23 +38,41 @@ public HandlerList getHandlers() { } /** - * @return The player object + * @return the player whose teleport was canceled. */ public Player getPlayer() { return this.player; } /** - * @return The teleport type + * @return the type of teleport that was canceled. */ public TeleportType getTeleportType() { return this.teleportType; } /** - * @return Is the player notified? + * @return the reason the teleport was cancelled. + */ + public CancelReason getCancelReason() { + return this.cancelReason; + } + + /** + * @return true if the player was notified that the teleport was canceled, otherwise false. */ public boolean isPlayerNotified() { return this.notifyUser; } + + public enum CancelReason { + /** + * Indicates that the cancellation occurred because the player disconnected + */ + LEAVE, + /** + * Indicates that the cancellation occurred because the player moved + */ + MOVE, + } } diff --git a/Essentials/src/main/java/net/ess3/api/events/teleport/TeleportWarmupEvent.java b/Essentials/src/main/java/net/essentialsx/api/v2/events/TeleportWarmupEvent.java similarity index 94% rename from Essentials/src/main/java/net/ess3/api/events/teleport/TeleportWarmupEvent.java rename to Essentials/src/main/java/net/essentialsx/api/v2/events/TeleportWarmupEvent.java index 9035657c893..1f4a43a7c0a 100644 --- a/Essentials/src/main/java/net/ess3/api/events/teleport/TeleportWarmupEvent.java +++ b/Essentials/src/main/java/net/essentialsx/api/v2/events/TeleportWarmupEvent.java @@ -1,7 +1,8 @@ -package net.ess3.api.events.teleport; +package net.essentialsx.api.v2.events; import com.earth2me.essentials.ITarget; import net.ess3.api.IUser; +import net.ess3.api.events.teleport.TeleportEvent; import org.bukkit.event.HandlerList; import org.bukkit.event.player.PlayerTeleportEvent; From 6667506515ecbda3cda53ee5fcecc54653c360fd Mon Sep 17 00:00:00 2001 From: Pierre-Olivier GOIN Date: Thu, 20 Nov 2025 19:05:23 +0100 Subject: [PATCH 4/6] Fix possible npe --- .../main/java/com/earth2me/essentials/AsyncTimedTeleport.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Essentials/src/main/java/com/earth2me/essentials/AsyncTimedTeleport.java b/Essentials/src/main/java/com/earth2me/essentials/AsyncTimedTeleport.java index ec1e85f8227..ab40bcb6431 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/AsyncTimedTeleport.java +++ b/Essentials/src/main/java/com/earth2me/essentials/AsyncTimedTeleport.java @@ -154,7 +154,7 @@ void cancelTimer(final boolean notifyUser) { ess.getServer().getScheduler().cancelTask(timer_task); final IUser teleportUser = ess.getUser(this.timer_teleportee); - if (teleportUser != null) { + if (teleportUser != null && teleportUser.getBase() != null) { final TeleportWarmupCancelledEvent.CancelReason cancelReason = teleportUser.getBase().isOnline() ? CancelReason.MOVE : CancelReason.LEAVE; final TeleportWarmupCancelledEvent event = new TeleportWarmupCancelledEvent(teleportUser.getBase(), this.teleport.getTpType(), cancelReason, notifyUser); ess.getServer().getPluginManager().callEvent(event); From 7e0cde8ac1656ab206fbd521a47a36a95d033e15 Mon Sep 17 00:00:00 2001 From: Pierre-Olivier GOIN Date: Thu, 20 Nov 2025 19:12:40 +0100 Subject: [PATCH 5/6] Fixed wrong relocation :// --- .../src/main/java/com/earth2me/essentials/AsyncTeleport.java | 2 +- .../main/java/com/earth2me/essentials/AsyncTimedTeleport.java | 4 ++-- .../main/java/net/ess3/api/events/teleport/TeleportEvent.java | 4 ++-- .../api/events/teleport}/TeleportWarmupEvent.java | 3 +-- .../api/v2/events}/TeleportWarmupCancelledEvent.java | 2 +- 5 files changed, 7 insertions(+), 8 deletions(-) rename Essentials/src/main/java/net/{essentialsx/api/v2/events => ess3/api/events/teleport}/TeleportWarmupEvent.java (94%) rename Essentials/src/main/java/net/{ess3/api/events/teleport => essentialsx/api/v2/events}/TeleportWarmupCancelledEvent.java (98%) diff --git a/Essentials/src/main/java/com/earth2me/essentials/AsyncTeleport.java b/Essentials/src/main/java/com/earth2me/essentials/AsyncTeleport.java index 13e5bb9266d..b5e687f2557 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/AsyncTeleport.java +++ b/Essentials/src/main/java/com/earth2me/essentials/AsyncTeleport.java @@ -10,7 +10,7 @@ import net.ess3.api.TranslatableException; import net.ess3.api.events.UserWarpEvent; import net.ess3.api.events.teleport.PreTeleportEvent; -import net.essentialsx.api.v2.events.TeleportWarmupEvent; +import net.ess3.api.events.teleport.TeleportWarmupEvent; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.entity.Player; diff --git a/Essentials/src/main/java/com/earth2me/essentials/AsyncTimedTeleport.java b/Essentials/src/main/java/com/earth2me/essentials/AsyncTimedTeleport.java index ab40bcb6431..89efe17f87d 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/AsyncTimedTeleport.java +++ b/Essentials/src/main/java/com/earth2me/essentials/AsyncTimedTeleport.java @@ -8,8 +8,8 @@ import net.ess3.api.IEssentials; import net.ess3.api.IUser; -import net.ess3.api.events.teleport.TeleportWarmupCancelledEvent; -import net.ess3.api.events.teleport.TeleportWarmupCancelledEvent.CancelReason; +import net.essentialsx.api.v2.events.TeleportWarmupCancelledEvent; +import net.essentialsx.api.v2.events.TeleportWarmupCancelledEvent.CancelReason; public class AsyncTimedTeleport implements Runnable { private static final double MOVE_CONSTANT = 0.3; diff --git a/Essentials/src/main/java/net/ess3/api/events/teleport/TeleportEvent.java b/Essentials/src/main/java/net/ess3/api/events/teleport/TeleportEvent.java index 0c7eb57848c..0ce330008b1 100644 --- a/Essentials/src/main/java/net/ess3/api/events/teleport/TeleportEvent.java +++ b/Essentials/src/main/java/net/ess3/api/events/teleport/TeleportEvent.java @@ -20,7 +20,7 @@ public abstract class TeleportEvent extends Event implements Cancellable { private final ITarget target; private boolean cancelled = false; - protected TeleportEvent(final IUser teleporter, final IUser teleportee, final PlayerTeleportEvent.TeleportCause cause, final ITarget target) { + TeleportEvent(final IUser teleporter, final IUser teleportee, final PlayerTeleportEvent.TeleportCause cause, final ITarget target) { super(!Bukkit.isPrimaryThread()); this.teleporter = teleporter; this.teleportee = teleportee; @@ -28,7 +28,7 @@ protected TeleportEvent(final IUser teleporter, final IUser teleportee, final Pl this.target = target; } - protected TeleportEvent(final IUser teleportee, final PlayerTeleportEvent.TeleportCause cause, final ITarget target) { + TeleportEvent(final IUser teleportee, final PlayerTeleportEvent.TeleportCause cause, final ITarget target) { this(teleportee, teleportee, cause, target); } diff --git a/Essentials/src/main/java/net/essentialsx/api/v2/events/TeleportWarmupEvent.java b/Essentials/src/main/java/net/ess3/api/events/teleport/TeleportWarmupEvent.java similarity index 94% rename from Essentials/src/main/java/net/essentialsx/api/v2/events/TeleportWarmupEvent.java rename to Essentials/src/main/java/net/ess3/api/events/teleport/TeleportWarmupEvent.java index 1f4a43a7c0a..9035657c893 100644 --- a/Essentials/src/main/java/net/essentialsx/api/v2/events/TeleportWarmupEvent.java +++ b/Essentials/src/main/java/net/ess3/api/events/teleport/TeleportWarmupEvent.java @@ -1,8 +1,7 @@ -package net.essentialsx.api.v2.events; +package net.ess3.api.events.teleport; import com.earth2me.essentials.ITarget; import net.ess3.api.IUser; -import net.ess3.api.events.teleport.TeleportEvent; import org.bukkit.event.HandlerList; import org.bukkit.event.player.PlayerTeleportEvent; diff --git a/Essentials/src/main/java/net/ess3/api/events/teleport/TeleportWarmupCancelledEvent.java b/Essentials/src/main/java/net/essentialsx/api/v2/events/TeleportWarmupCancelledEvent.java similarity index 98% rename from Essentials/src/main/java/net/ess3/api/events/teleport/TeleportWarmupCancelledEvent.java rename to Essentials/src/main/java/net/essentialsx/api/v2/events/TeleportWarmupCancelledEvent.java index 024f2588d0e..b3f82f17a3f 100644 --- a/Essentials/src/main/java/net/ess3/api/events/teleport/TeleportWarmupCancelledEvent.java +++ b/Essentials/src/main/java/net/essentialsx/api/v2/events/TeleportWarmupCancelledEvent.java @@ -1,4 +1,4 @@ -package net.ess3.api.events.teleport; +package net.essentialsx.api.v2.events; import org.bukkit.entity.Player; import org.bukkit.event.Event; From fcb8fbe91454ef8492946ea4f72b6cc9ace05c2b Mon Sep 17 00:00:00 2001 From: Pierre-Olivier GOIN Date: Thu, 20 Nov 2025 19:17:55 +0100 Subject: [PATCH 6/6] Fix checkstyle --- .../java/com/earth2me/essentials/AsyncTimedTeleport.java | 2 +- .../api/v2/events/TeleportWarmupCancelledEvent.java | 7 +++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/Essentials/src/main/java/com/earth2me/essentials/AsyncTimedTeleport.java b/Essentials/src/main/java/com/earth2me/essentials/AsyncTimedTeleport.java index 89efe17f87d..d1c37423c06 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/AsyncTimedTeleport.java +++ b/Essentials/src/main/java/com/earth2me/essentials/AsyncTimedTeleport.java @@ -155,7 +155,7 @@ void cancelTimer(final boolean notifyUser) { final IUser teleportUser = ess.getUser(this.timer_teleportee); if (teleportUser != null && teleportUser.getBase() != null) { - final TeleportWarmupCancelledEvent.CancelReason cancelReason = teleportUser.getBase().isOnline() ? CancelReason.MOVE : CancelReason.LEAVE; + final TeleportWarmupCancelledEvent.CancelReason cancelReason = teleportUser.getBase().isOnline() ? CancelReason.MOVE : CancelReason.LEAVE; final TeleportWarmupCancelledEvent event = new TeleportWarmupCancelledEvent(teleportUser.getBase(), this.teleport.getTpType(), cancelReason, notifyUser); ess.getServer().getPluginManager().callEvent(event); } diff --git a/Essentials/src/main/java/net/essentialsx/api/v2/events/TeleportWarmupCancelledEvent.java b/Essentials/src/main/java/net/essentialsx/api/v2/events/TeleportWarmupCancelledEvent.java index b3f82f17a3f..58ac59f35e6 100644 --- a/Essentials/src/main/java/net/essentialsx/api/v2/events/TeleportWarmupCancelledEvent.java +++ b/Essentials/src/main/java/net/essentialsx/api/v2/events/TeleportWarmupCancelledEvent.java @@ -3,12 +3,8 @@ import org.bukkit.entity.Player; import org.bukkit.event.Event; import org.bukkit.event.HandlerList; -import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; - import com.earth2me.essentials.AsyncTeleport.TeleportType; -import io.papermc.paper.datacomponent.item.consumable.ConsumeEffect; - /** * Called when a player's teleport warmup is cancelled. */ @@ -65,6 +61,9 @@ public boolean isPlayerNotified() { return this.notifyUser; } + /** + * Indicates the reason why the teleportation was cancelled. + */ public enum CancelReason { /** * Indicates that the cancellation occurred because the player disconnected