diff --git a/Core/src/main/java/com/plotsquared/core/events/PlayerTeleportToPlotEvent.java b/Core/src/main/java/com/plotsquared/core/events/PlayerTeleportToPlotEvent.java index c8936571b..90c74fb64 100644 --- a/Core/src/main/java/com/plotsquared/core/events/PlayerTeleportToPlotEvent.java +++ b/Core/src/main/java/com/plotsquared/core/events/PlayerTeleportToPlotEvent.java @@ -21,10 +21,7 @@ package com.plotsquared.core.events; import com.plotsquared.core.location.Location; import com.plotsquared.core.player.PlotPlayer; import com.plotsquared.core.plot.Plot; -import org.jetbrains.annotations.NotNull; - -import java.util.Objects; -import java.util.function.Consumer; +import org.checkerframework.checker.nullness.qual.Nullable; /** * Called when a player teleports to a plot @@ -34,23 +31,21 @@ public class PlayerTeleportToPlotEvent extends PlotPlayerEvent implements Cancel private final TeleportCause cause; private Result eventResult; private final Location from; - private Location location; + private LocationTransformer locationTransformer; /** * PlayerTeleportToPlotEvent: Called when a player teleports to a plot * - * @param player That was teleported - * @param from The origin location, from where the teleport was triggered (players location most likely) - * @param location The initial location where the player will be teleported to - * @param plot Plot to which the player was teleported - * @param cause Why the teleport is being completed + * @param player That was teleported + * @param from The origin location, from where the teleport was triggered (players location most likely) + * @param plot Plot to which the player was teleported + * @param cause Why the teleport is being completed * @since 6.1.0 */ - public PlayerTeleportToPlotEvent(PlotPlayer player, Location from, Location location, Plot plot, TeleportCause cause) { + public PlayerTeleportToPlotEvent(PlotPlayer player, Location from, Plot plot, TeleportCause cause) { super(player, plot); this.from = from; - this.location = location; this.cause = cause; } @@ -75,26 +70,24 @@ public class PlayerTeleportToPlotEvent extends PlotPlayerEvent implements Cancel } /** - * Get the current location where the player will be teleported to. - * Defaults to {@link Plot#getHome(Consumer)} or {@link Plot#getDefaultHome(boolean, Consumer)} + * Gets the currently applied {@link LocationTransformer} or null, if none was set * - * @return Location + * @return LocationTransformer * @since TODO */ - public Location getLocation() { - return this.location; + public @Nullable LocationTransformer getLocationTransformer() { + return this.locationTransformer; } /** - * Set the new location where the player should be teleported to. - * Must be not-null. If your intention is to cancel this teleport, see {@link #setEventResult(Result)} - * @param location The new location + * Sets the {@link LocationTransformer} to mutate the location where the player will be teleported to. + * May be {@code null}, if any previous set transformations should be discarded. + * + * @param locationTransformer The new transformer * @since TODO */ - public void setLocation(@NotNull Location location) { - Objects.requireNonNull(location, "PlayerTeleportToPlotEvent#location may never be null. " + - "If you intend to cancel the teleport, use PlayerTeleportToPlotEvent#setEventResult"); - this.location = location; + public void setLocationTransformer(@Nullable LocationTransformer locationTransformer) { + this.locationTransformer = locationTransformer; } @Override @@ -107,4 +100,17 @@ public class PlayerTeleportToPlotEvent extends PlotPlayerEvent implements Cancel this.eventResult = e; } + public interface LocationTransformer { + + /** + * Transforms an input location {@code origin} to a new location + * + * @param origin The origin location which should be transformed + * @return The transformed location + * @since TODO + */ + Location transform(Location origin); + + } + } diff --git a/Core/src/main/java/com/plotsquared/core/plot/Plot.java b/Core/src/main/java/com/plotsquared/core/plot/Plot.java index 9bb040cdd..fb992e42b 100644 --- a/Core/src/main/java/com/plotsquared/core/plot/Plot.java +++ b/Core/src/main/java/com/plotsquared/core/plot/Plot.java @@ -2615,17 +2615,20 @@ public class Plot { */ public void teleportPlayer(final PlotPlayer player, TeleportCause cause, Consumer resultConsumer) { Plot plot = this.getBasePlot(false); + + PlayerTeleportToPlotEvent event = this.eventDispatcher.callTeleport(player, player.getLocation(), plot, cause); + if (event.getEventResult() == Result.DENY) { + player.sendMessage( + TranslatableCaption.of("events.event_denied"), + TagResolver.resolver("value", Tag.inserting(Component.text("Teleport"))) + ); + resultConsumer.accept(false); + return; + } + final Consumer locationConsumer = calculatedLocation -> { - PlayerTeleportToPlotEvent event = this.eventDispatcher.callTeleport(player, player.getLocation(), calculatedLocation, plot, cause); - if (event.getEventResult() == Result.DENY) { - player.sendMessage( - TranslatableCaption.of("events.event_denied"), - TagResolver.resolver("value", Tag.inserting(Component.text("Teleport"))) - ); - resultConsumer.accept(false); - return; - } - Location location = event.getLocation(); + Location location = event.getLocationTransformer() == null ? + calculatedLocation : event.getLocationTransformer().transform(calculatedLocation); if (Settings.Teleport.DELAY == 0 || player.hasPermission("plots.teleport.delay.bypass")) { player.sendMessage(TranslatableCaption.of("teleport.teleported_to_plot")); player.teleport(location, cause); diff --git a/Core/src/main/java/com/plotsquared/core/util/EventDispatcher.java b/Core/src/main/java/com/plotsquared/core/util/EventDispatcher.java index 62133cf97..4de989601 100644 --- a/Core/src/main/java/com/plotsquared/core/util/EventDispatcher.java +++ b/Core/src/main/java/com/plotsquared/core/util/EventDispatcher.java @@ -158,9 +158,8 @@ public class EventDispatcher { return event; } - public PlayerTeleportToPlotEvent callTeleport(PlotPlayer player, Location from, Location location, Plot plot, - TeleportCause cause) { - PlayerTeleportToPlotEvent event = new PlayerTeleportToPlotEvent(player, from, location, plot, cause); + public PlayerTeleportToPlotEvent callTeleport(PlotPlayer player, Location from, Plot plot, TeleportCause cause) { + PlayerTeleportToPlotEvent event = new PlayerTeleportToPlotEvent(player, from, plot, cause); callEvent(event); return event; }