From 40c7b09ed4b4555aa8e1b84a8267e0e8840ea61d Mon Sep 17 00:00:00 2001 From: Jake Potrebic Date: Thu, 15 Dec 2022 10:33:34 -0800 Subject: [PATCH] Improve PortalEvents --- .../src/main/java/org/bukkit/PortalType.java | 6 +++ .../event/entity/EntityPortalEnterEvent.java | 37 +++++++++++++- .../event/entity/EntityPortalEvent.java | 48 ++++++++++++++++++- .../event/player/PlayerPortalEvent.java | 47 ++++++++++++++++++ 4 files changed, 136 insertions(+), 2 deletions(-) diff --git a/paper-api/src/main/java/org/bukkit/PortalType.java b/paper-api/src/main/java/org/bukkit/PortalType.java index 427cfbb8b5..e6120b8325 100644 --- a/paper-api/src/main/java/org/bukkit/PortalType.java +++ b/paper-api/src/main/java/org/bukkit/PortalType.java @@ -14,6 +14,12 @@ public enum PortalType { * This is an Ender portal. */ ENDER, + // Paper start + /** + * This is an end gateway + */ + END_GATEWAY, + // Paper end /** * This is a custom Plugin portal. diff --git a/paper-api/src/main/java/org/bukkit/event/entity/EntityPortalEnterEvent.java b/paper-api/src/main/java/org/bukkit/event/entity/EntityPortalEnterEvent.java index 6818e9f0ba..d3724db0a5 100644 --- a/paper-api/src/main/java/org/bukkit/event/entity/EntityPortalEnterEvent.java +++ b/paper-api/src/main/java/org/bukkit/event/entity/EntityPortalEnterEvent.java @@ -7,14 +7,25 @@ import org.jetbrains.annotations.NotNull; /** * Called when an entity comes into contact with a portal + *

+ * Cancelling this event prevents any further processing of the portal for that tick. + * @see io.papermc.paper.event.entity.EntityInsideBlockEvent */ -public class EntityPortalEnterEvent extends EntityEvent { +public class EntityPortalEnterEvent extends EntityEvent implements org.bukkit.event.Cancellable { // Paper private static final HandlerList handlers = new HandlerList(); private final Location location; + @Deprecated(since = "1.21") @io.papermc.paper.annotation.DoNotUse // Paper public EntityPortalEnterEvent(@NotNull final Entity entity, @NotNull final Location location) { + // Paper start + this(entity, location, org.bukkit.PortalType.CUSTOM); + } + @org.jetbrains.annotations.ApiStatus.Internal + public EntityPortalEnterEvent(@NotNull final Entity entity, @NotNull final Location location, @NotNull final org.bukkit.PortalType portalType) { + // Paper end super(entity); this.location = location; + this.portalType = portalType; // Paper } /** @@ -27,6 +38,30 @@ public class EntityPortalEnterEvent extends EntityEvent { return location; } + // Paper start + private boolean cancelled = false; + private final org.bukkit.PortalType portalType; + + /** + * Get the portal type. + * + * @return the portal type + */ + public org.bukkit.@NotNull PortalType getPortalType() { + return this.portalType; + } + + @Override + public boolean isCancelled() { + return this.cancelled; + } + + @Override + public void setCancelled(final boolean cancel) { + this.cancelled = cancel; + } + // Paper end + @NotNull @Override public HandlerList getHandlers() { diff --git a/paper-api/src/main/java/org/bukkit/event/entity/EntityPortalEvent.java b/paper-api/src/main/java/org/bukkit/event/entity/EntityPortalEvent.java index d70400236b..4544e7e155 100644 --- a/paper-api/src/main/java/org/bukkit/event/entity/EntityPortalEvent.java +++ b/paper-api/src/main/java/org/bukkit/event/entity/EntityPortalEvent.java @@ -3,6 +3,7 @@ package org.bukkit.event.entity; import org.bukkit.Location; import org.bukkit.entity.Entity; import org.bukkit.event.HandlerList; +import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -17,23 +18,68 @@ public class EntityPortalEvent extends EntityTeleportEvent { private int searchRadius = 128; private boolean canCreatePortal = true; private int creationRadius = 16; + private final org.bukkit.PortalType type; // Paper public EntityPortalEvent(@NotNull final Entity entity, @NotNull final Location from, @Nullable final Location to) { - super(entity, from, to); + this(entity, from, to, 128); // Paper } public EntityPortalEvent(@NotNull Entity entity, @NotNull Location from, @Nullable Location to, int searchRadius) { super(entity, from, to); this.searchRadius = searchRadius; + this.type = org.bukkit.PortalType.CUSTOM; // Paper } public EntityPortalEvent(@NotNull Entity entity, @NotNull Location from, @Nullable Location to, int searchRadius, boolean canCreatePortal, int creationRadius) { + // Paper start + this(entity, from, to, searchRadius, canCreatePortal, creationRadius, org.bukkit.PortalType.CUSTOM); + } + + @ApiStatus.Internal + public EntityPortalEvent(@NotNull Entity entity, @NotNull Location from, @Nullable Location to, int searchRadius, boolean canCreatePortal, int creationRadius, final @NotNull org.bukkit.PortalType portalType) { super(entity, from, to); + this.type = portalType; + // Paper end this.searchRadius = searchRadius; this.canCreatePortal = canCreatePortal; this.creationRadius = creationRadius; } + // Paper start + /** + * Get the portal type relating to this event. + * + * @return the portal type + */ + public @NotNull org.bukkit.PortalType getPortalType() { + return this.type; + } + /** + * For {@link org.bukkit.PortalType#NETHER}, this is initially just the starting point + * for the search for a portal to teleport to. It will initially just be the {@link #getFrom()} + * scaled for dimension scaling and clamped to be inside the world border. + *

+ * For {@link org.bukkit.PortalType#ENDER}, this will initially be the exact destination + * either, the world spawn for end->any world or end spawn for any world->end. + * + * @return starting point for search or exact destination + */ + @Override + public @Nullable Location getTo() { + return super.getTo(); + } + + /** + * See the description of {@link #getTo()}. + * @param to starting point for search or exact destination + * or null to cancel + */ + @Override + public void setTo(@Nullable final Location to) { + super.setTo(to); + } + // Paper end + /** * Set the Block radius to search in for available portals. * diff --git a/paper-api/src/main/java/org/bukkit/event/player/PlayerPortalEvent.java b/paper-api/src/main/java/org/bukkit/event/player/PlayerPortalEvent.java index 57eeeafae8..929a997671 100644 --- a/paper-api/src/main/java/org/bukkit/event/player/PlayerPortalEvent.java +++ b/paper-api/src/main/java/org/bukkit/event/player/PlayerPortalEvent.java @@ -32,6 +32,53 @@ public class PlayerPortalEvent extends PlayerTeleportEvent { this.canCreatePortal = canCreatePortal; this.creationRadius = creationRadius; } + // Paper start + /** + * For {@link TeleportCause#NETHER_PORTAL}, this is initially just the starting point + * for the search for a portal to teleport to. It will initially just be the {@link #getFrom()} + * scaled for dimension scaling and clamped to be inside the world border. + *

+ * For {@link TeleportCause#END_PORTAL}, this will initially be the exact destination + * either, the world spawn for end->any world or end spawn for any world->end. + * + * @return starting point for search or exact destination + */ + @Override + public @NotNull Location getTo() { + return super.getTo(); + } + + /** + * See the description of {@link #getTo()}. + * @param to starting point for search or exact destination + */ + @Override + public void setTo(@NotNull final Location to) { + super.setTo(to); + } + + /** + * No effect + * @return no effect + * @deprecated No effect + */ + @Deprecated + @Override + public boolean willDismountPlayer() { + return super.willDismountPlayer(); + } + + /** + * No effect + * @return no effect + * @deprecated No effect + */ + @Deprecated + @Override + public @NotNull java.util.Set getRelativeTeleportationFlags() { + return super.getRelativeTeleportationFlags(); + } + // Paper end /** * Set the Block radius to search in for available portals.