feat: ability to overwrite spawn location for plot teleports

This commit is contained in:
Pierre Maurice Schwang 2023-10-02 18:04:39 +02:00
parent a3bc3968a5
commit d4ba0f414e
3 changed files with 54 additions and 19 deletions

View File

@ -21,28 +21,36 @@ package com.plotsquared.core.events;
import com.plotsquared.core.location.Location; import com.plotsquared.core.location.Location;
import com.plotsquared.core.player.PlotPlayer; import com.plotsquared.core.player.PlotPlayer;
import com.plotsquared.core.plot.Plot; import com.plotsquared.core.plot.Plot;
import org.jetbrains.annotations.NotNull;
import java.util.Objects;
import java.util.function.Consumer;
/** /**
* Called when a player teleports to a plot * Called when a player teleports to a plot
*/ */
public class PlayerTeleportToPlotEvent extends PlotPlayerEvent implements CancellablePlotEvent { public class PlayerTeleportToPlotEvent extends PlotPlayerEvent implements CancellablePlotEvent {
private final Location from;
private final TeleportCause cause; private final TeleportCause cause;
private Result eventResult; private Result eventResult;
private final Location from;
private Location location;
/** /**
* PlayerTeleportToPlotEvent: Called when a player teleports to a plot * PlayerTeleportToPlotEvent: Called when a player teleports to a plot
* *
* @param player That was teleported * @param player That was teleported
* @param from Start location * @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 plot Plot to which the player was teleported
* @param cause Why the teleport is being completed * @param cause Why the teleport is being completed
* @since 6.1.0 * @since 6.1.0
*/ */
public PlayerTeleportToPlotEvent(PlotPlayer<?> player, Location from, Plot plot, TeleportCause cause) { public PlayerTeleportToPlotEvent(PlotPlayer<?> player, Location from, Location location, Plot plot, TeleportCause cause) {
super(player, plot); super(player, plot);
this.from = from; this.from = from;
this.location = location;
this.cause = cause; this.cause = cause;
} }
@ -57,7 +65,8 @@ public class PlayerTeleportToPlotEvent extends PlotPlayerEvent implements Cancel
} }
/** /**
* Get the from location * Get the location, from where the teleport was triggered
* (the players current location when executing the home command for example)
* *
* @return Location * @return Location
*/ */
@ -65,6 +74,29 @@ public class PlayerTeleportToPlotEvent extends PlotPlayerEvent implements Cancel
return this.from; return this.from;
} }
/**
* Get the current location where the player will be teleported to.
* Defaults to {@link Plot#getHome(Consumer)} or {@link Plot#getDefaultHome(boolean, Consumer)}
*
* @return Location
* @since TODO
*/
public Location getLocation() {
return this.location;
}
/**
* Set the new location where the player should be teleported to.
* <b>Must</b> be not-null. If your intention is to cancel this teleport, see {@link #setEventResult(Result)}
* @param location The new location
* @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;
}
@Override @Override
public Result getEventResult() { public Result getEventResult() {
return eventResult; return eventResult;

View File

@ -29,6 +29,7 @@ import com.plotsquared.core.configuration.caption.CaptionUtility;
import com.plotsquared.core.configuration.caption.StaticCaption; import com.plotsquared.core.configuration.caption.StaticCaption;
import com.plotsquared.core.configuration.caption.TranslatableCaption; import com.plotsquared.core.configuration.caption.TranslatableCaption;
import com.plotsquared.core.database.DBFunc; import com.plotsquared.core.database.DBFunc;
import com.plotsquared.core.events.PlayerTeleportToPlotEvent;
import com.plotsquared.core.events.Result; import com.plotsquared.core.events.Result;
import com.plotsquared.core.events.TeleportCause; import com.plotsquared.core.events.TeleportCause;
import com.plotsquared.core.generator.ClassicPlotWorld; import com.plotsquared.core.generator.ClassicPlotWorld;
@ -2614,8 +2615,9 @@ public class Plot {
*/ */
public void teleportPlayer(final PlotPlayer<?> player, TeleportCause cause, Consumer<Boolean> resultConsumer) { public void teleportPlayer(final PlotPlayer<?> player, TeleportCause cause, Consumer<Boolean> resultConsumer) {
Plot plot = this.getBasePlot(false); Plot plot = this.getBasePlot(false);
Result result = this.eventDispatcher.callTeleport(player, player.getLocation(), plot, cause).getEventResult(); final Consumer<Location> locationConsumer = calculatedLocation -> {
if (result == Result.DENY) { PlayerTeleportToPlotEvent event = this.eventDispatcher.callTeleport(player, player.getLocation(), calculatedLocation, plot, cause);
if (event.getEventResult() == Result.DENY) {
player.sendMessage( player.sendMessage(
TranslatableCaption.of("events.event_denied"), TranslatableCaption.of("events.event_denied"),
TagResolver.resolver("value", Tag.inserting(Component.text("Teleport"))) TagResolver.resolver("value", Tag.inserting(Component.text("Teleport")))
@ -2623,7 +2625,7 @@ public class Plot {
resultConsumer.accept(false); resultConsumer.accept(false);
return; return;
} }
final Consumer<Location> locationConsumer = location -> { Location location = event.getLocation();
if (Settings.Teleport.DELAY == 0 || player.hasPermission("plots.teleport.delay.bypass")) { if (Settings.Teleport.DELAY == 0 || player.hasPermission("plots.teleport.delay.bypass")) {
player.sendMessage(TranslatableCaption.of("teleport.teleported_to_plot")); player.sendMessage(TranslatableCaption.of("teleport.teleported_to_plot"));
player.teleport(location, cause); player.teleport(location, cause);

View File

@ -158,8 +158,9 @@ public class EventDispatcher {
return event; return event;
} }
public PlayerTeleportToPlotEvent callTeleport(PlotPlayer<?> player, Location from, Plot plot, TeleportCause cause) { public PlayerTeleportToPlotEvent callTeleport(PlotPlayer<?> player, Location from, Location location, Plot plot,
PlayerTeleportToPlotEvent event = new PlayerTeleportToPlotEvent(player, from, plot, cause); TeleportCause cause) {
PlayerTeleportToPlotEvent event = new PlayerTeleportToPlotEvent(player, from, location, plot, cause);
callEvent(event); callEvent(event);
return event; return event;
} }