Skip to content

Commit

Permalink
Add PlayerPreTeleportEvent
Browse files Browse the repository at this point in the history
  • Loading branch information
Leguan16 committed Jan 19, 2024
1 parent 94807a1 commit 30137d7
Show file tree
Hide file tree
Showing 2 changed files with 179 additions and 0 deletions.
94 changes: 94 additions & 0 deletions patches/api/0455-Add-PlayerPreTeleportEvent.patch
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;
+ }
+
+}
85 changes: 85 additions & 0 deletions patches/server/1048-Add-PlayerPreTeleportEvent.patch
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()) {

0 comments on commit 30137d7

Please sign in to comment.