-
-
Notifications
You must be signed in to change notification settings - Fork 2.4k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
2 changed files
with
179 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,94 @@ | ||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 | ||
From: leguan <[email protected]> | ||
Date: Wed, 17 Jan 2024 19:58:51 +0100 | ||
Subject: [PATCH] Add PlayerPreTeleportEvent | ||
|
||
|
||
diff --git a/src/main/java/io/papermc/paper/event/player/PlayerPreTeleportEvent.java b/src/main/java/io/papermc/paper/event/player/PlayerPreTeleportEvent.java | ||
new file mode 100644 | ||
index 0000000000000000000000000000000000000000..8dd919ee1b0e4e130f763cd9feeb5257b07efc3c | ||
--- /dev/null | ||
+++ b/src/main/java/io/papermc/paper/event/player/PlayerPreTeleportEvent.java | ||
@@ -0,0 +1,82 @@ | ||
+package io.papermc.paper.event.player; | ||
+ | ||
+import io.papermc.paper.entity.TeleportFlag; | ||
+import org.bukkit.Location; | ||
+import org.bukkit.entity.Player; | ||
+import org.bukkit.event.HandlerList; | ||
+import org.bukkit.event.player.PlayerEvent; | ||
+import org.bukkit.event.player.PlayerTeleportEvent; | ||
+import org.jetbrains.annotations.NotNull; | ||
+import java.util.Collection; | ||
+import java.util.Collections; | ||
+import java.util.Set; | ||
+ | ||
+/** | ||
+ * Called before a {@link Player} is teleported. | ||
+ * This is helpful if certain preparations have to me made in order for the teleport to happen. | ||
+ */ | ||
+public class PlayerPreTeleportEvent extends PlayerEvent { | ||
+ | ||
+ private static final HandlerList HANDLER_LIST = new HandlerList(); | ||
+ | ||
+ private final Location from; | ||
+ private final Location to; | ||
+ private final PlayerTeleportEvent.TeleportCause cause; | ||
+ private final Set<TeleportFlag> flags; | ||
+ | ||
+ public PlayerPreTeleportEvent(@NotNull Player who, @NotNull Location from, @NotNull Location to, PlayerTeleportEvent.@NotNull TeleportCause cause) { | ||
+ this(who, from, to, cause, Collections.emptySet()); | ||
+ } | ||
+ | ||
+ public PlayerPreTeleportEvent(@NotNull Player who, @NotNull Location from, @NotNull Location to, PlayerTeleportEvent.@NotNull TeleportCause cause, java.util.Set<io.papermc.paper.entity.@NotNull TeleportFlag> flags) { | ||
+ super(who); | ||
+ this.from = from; | ||
+ this.to = to; | ||
+ this.cause = cause; | ||
+ this.flags = flags; | ||
+ } | ||
+ | ||
+ /** | ||
+ * Returns a clone of the player's current Location. | ||
+ * @return A clone of the player's current location. | ||
+ */ | ||
+ public @NotNull Location getFrom() { | ||
+ return from.clone(); | ||
+ } | ||
+ | ||
+ /** | ||
+ * Returns a clone of the target location. | ||
+ * @return A clone of the target location. | ||
+ */ | ||
+ public @NotNull Location getTo() { | ||
+ return to.clone(); | ||
+ } | ||
+ | ||
+ /** | ||
+ * Returns the initial cause of the location. | ||
+ * @see org.bukkit.event.player.PlayerTeleportEvent.TeleportCause | ||
+ * @return The initial cause of the location. | ||
+ */ | ||
+ public PlayerTeleportEvent.@NotNull TeleportCause getCause() { | ||
+ return cause; | ||
+ } | ||
+ | ||
+ /** | ||
+ * Returns the provided flags of the teleport call. | ||
+ * @see TeleportFlag | ||
+ * @return The flags of the teleport call. | ||
+ */ | ||
+ public @NotNull Collection<TeleportFlag> getFlags() { | ||
+ return flags; | ||
+ } | ||
+ | ||
+ @Override | ||
+ public @NotNull HandlerList getHandlers() { | ||
+ return HANDLER_LIST; | ||
+ } | ||
+ | ||
+ public static @NotNull HandlerList getHandlerList() { | ||
+ return HANDLER_LIST; | ||
+ } | ||
+ | ||
+} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,85 @@ | ||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 | ||
From: leguan <[email protected]> | ||
Date: Wed, 17 Jan 2024 19:59:06 +0100 | ||
Subject: [PATCH] Add PlayerPreTeleportEvent | ||
|
||
|
||
diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java | ||
index 0a1977905de97522cf3311f59a2cdc6c0a5f98f9..dd1f4d9f2a313e3a09aa042dfc67ed7370908a8e 100644 | ||
--- a/src/main/java/net/minecraft/server/level/ServerPlayer.java | ||
+++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java | ||
@@ -1211,6 +1211,11 @@ public class ServerPlayer extends Player { | ||
*/ | ||
// CraftBukkit end | ||
PortalInfo shapedetectorshape = this.findDimensionEntryPoint(worldserver); | ||
+ // Paper start - Add PlayerPreTeleportEvent | ||
+ Location enter = this.getBukkitEntity().getLocation(); | ||
+ Location exit = (worldserver == null) ? null : CraftLocation.toBukkit(shapedetectorshape.pos, worldserver.getWorld(), shapedetectorshape.yRot, shapedetectorshape.xRot); | ||
+ new io.papermc.paper.event.player.PlayerPreTeleportEvent(this.getBukkitEntity(), enter, exit, cause).callEvent(); | ||
+ // Paper end - Add PlayerPreTeleportEvent | ||
|
||
if (shapedetectorshape != null) { | ||
worldserver1.getProfiler().push("moving"); | ||
@@ -1225,8 +1230,10 @@ public class ServerPlayer extends Player { | ||
} else { | ||
return null; | ||
} | ||
- Location enter = this.getBukkitEntity().getLocation(); | ||
- Location exit = (worldserver == null) ? null : CraftLocation.toBukkit(shapedetectorshape.pos, worldserver.getWorld(), shapedetectorshape.yRot, shapedetectorshape.xRot); | ||
+ // Paper start - Add PlayerPreTeleportEvent | ||
+ // Location enter = this.getBukkitEntity().getLocation(); | ||
+ // Location exit = (worldserver == null) ? null : CraftLocation.toBukkit(shapedetectorshape.pos, worldserver.getWorld(), shapedetectorshape.yRot, shapedetectorshape.xRot); | ||
+ // Paper end - Add PlayerPreTeleportEvent | ||
PlayerTeleportEvent tpEvent = new PlayerTeleportEvent(this.getBukkitEntity(), enter, exit, cause); | ||
Bukkit.getServer().getPluginManager().callEvent(tpEvent); | ||
if (tpEvent.isCancelled() || tpEvent.getTo() == null) { | ||
@@ -1292,6 +1299,7 @@ public class ServerPlayer extends Player { | ||
protected CraftPortalEvent callPortalEvent(Entity entity, ServerLevel exitWorldServer, Vec3 exitPosition, TeleportCause cause, int searchRadius, int creationRadius) { | ||
Location enter = this.getBukkitEntity().getLocation(); | ||
Location exit = CraftLocation.toBukkit(exitPosition, exitWorldServer.getWorld(), this.getYRot(), this.getXRot()); | ||
+ new io.papermc.paper.event.player.PlayerPreTeleportEvent(this.getBukkitEntity(), enter, exit, cause).callEvent(); // Paper - Add PlayerPreTeleportEvent | ||
PlayerPortalEvent event = new PlayerPortalEvent(this.getBukkitEntity(), enter, exit, cause, searchRadius, true, creationRadius); | ||
Bukkit.getServer().getPluginManager().callEvent(event); | ||
if (event.isCancelled() || event.getTo() == null || event.getTo().getWorld() == null) { | ||
diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java | ||
index 8568de90c39838e1627f286c5c3ca4b0f19002cb..c3e9b784f06078396f55f45ee7c40ed1a8c63c14 100644 | ||
--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java | ||
+++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java | ||
@@ -1705,7 +1705,12 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl | ||
for (RelativeMovement relativeArgument : set) { | ||
relativeFlags.add(org.bukkit.craftbukkit.entity.CraftPlayer.toApiRelativeFlag(relativeArgument)); | ||
} | ||
- PlayerTeleportEvent event = new PlayerTeleportEvent(player, from.clone(), to.clone(), cause, java.util.Set.copyOf(relativeFlags)); | ||
+ // Paper start - Add PlayerPreTeleportEvent | ||
+ Location fromLocation = from.clone(); | ||
+ Location toLocation = to.clone(); | ||
+ new io.papermc.paper.event.player.PlayerPreTeleportEvent(player, fromLocation, toLocation, cause, java.util.Set.copyOf(relativeFlags)).callEvent(); | ||
+ PlayerTeleportEvent event = new PlayerTeleportEvent(player, fromLocation, toLocation, cause, java.util.Set.copyOf(relativeFlags)); | ||
+ // Paper end - Add PlayerPreTeleportEvent | ||
// Paper end | ||
this.cserver.getPluginManager().callEvent(event); | ||
|
||
diff --git a/src/main/java/net/minecraft/world/level/block/entity/TheEndGatewayBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/TheEndGatewayBlockEntity.java | ||
index b7a0d8ffd1823a1d1edee6baaa62c15f69e6af3d..0aff69a1b0c5040f78d5f10cc2cc70b146433234 100644 | ||
--- a/src/main/java/net/minecraft/world/level/block/entity/TheEndGatewayBlockEntity.java | ||
+++ b/src/main/java/net/minecraft/world/level/block/entity/TheEndGatewayBlockEntity.java | ||
@@ -218,6 +218,7 @@ public class TheEndGatewayBlockEntity extends TheEndPortalBlockEntity { | ||
location.setPitch(player.getLocation().getPitch()); | ||
location.setYaw(player.getLocation().getYaw()); | ||
|
||
+ new io.papermc.paper.event.player.PlayerPreTeleportEvent(player, player.getLocation(), location, PlayerTeleportEvent.TeleportCause.END_GATEWAY); // Paper - Add PlayerPreTeleportEvent | ||
PlayerTeleportEvent teleEvent = new com.destroystokyo.paper.event.player.PlayerTeleportEndGatewayEvent(player, player.getLocation(), location, new org.bukkit.craftbukkit.block.CraftEndGateway(worldserver.getWorld(), blockEntity)); // Paper | ||
Bukkit.getPluginManager().callEvent(teleEvent); | ||
if (teleEvent.isCancelled()) { | ||
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java | ||
index 99830dfacc0d4ff78f43f970b2d1486710c83ef3..ba3444444d7f7494e56fba6d31c3f3904a900391 100644 | ||
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java | ||
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java | ||
@@ -1339,6 +1339,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { | ||
// Paper end - Teleport API | ||
Preconditions.checkArgument(location != null, "location"); | ||
Preconditions.checkArgument(location.getWorld() != null, "location.world"); | ||
+ new io.papermc.paper.event.player.PlayerPreTeleportEvent(this, this.getLocation(), location, cause, allFlags).callEvent(); // Paper - Add PlayerPreTeleportEvent | ||
// Paper start - Teleport passenger API | ||
// Don't allow teleporting between worlds while keeping passengers | ||
if (ignorePassengers && entity.isVehicle() && location.getWorld() != this.getWorld()) { |