PaperMC/patches/api/0353-More-Teleport-API.patch

276 lines
10 KiB
Diff
Raw Normal View History

2022-07-22 21:36:43 +02:00
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Owen1212055 <23108066+Owen1212055@users.noreply.github.com>
Date: Sun, 5 Sep 2021 00:36:05 -0400
Subject: [PATCH] More Teleport API
diff --git a/src/main/java/io/papermc/paper/entity/LookAnchor.java b/src/main/java/io/papermc/paper/entity/LookAnchor.java
new file mode 100644
index 0000000000000000000000000000000000000000..544eec787ea837f7d29df6519255840d6fe087d7
2022-07-22 21:36:43 +02:00
--- /dev/null
+++ b/src/main/java/io/papermc/paper/entity/LookAnchor.java
@@ -0,0 +1,24 @@
2022-07-22 21:36:43 +02:00
+package io.papermc.paper.entity;
+
+import io.papermc.paper.math.Position;
2022-07-22 21:36:43 +02:00
+import org.bukkit.entity.Entity;
+import org.bukkit.entity.LivingEntity;
+
+/**
+ * Represents what part of the entity should be used when determining where to face a position/entity.
2022-07-22 21:36:43 +02:00
+ *
+ * @see org.bukkit.entity.Player#lookAt(Position, LookAnchor)
2022-07-22 21:36:43 +02:00
+ * @see org.bukkit.entity.Player#lookAt(Entity, LookAnchor, LookAnchor)
+ */
+public enum LookAnchor {
+ /**
+ * Represents the entity's feet.
+ * @see LivingEntity#getLocation()
+ */
+ FEET,
+ /**
+ * Represents the entity's eyes.
+ * @see LivingEntity#getEyeLocation()
+ */
+ EYES;
+}
diff --git a/src/main/java/io/papermc/paper/entity/TeleportFlag.java b/src/main/java/io/papermc/paper/entity/TeleportFlag.java
2022-07-22 21:36:43 +02:00
new file mode 100644
index 0000000000000000000000000000000000000000..c8b5b570d44da9524bfc59c7e11b2ae59d4b79b9
2022-07-22 21:36:43 +02:00
--- /dev/null
+++ b/src/main/java/io/papermc/paper/entity/TeleportFlag.java
@@ -0,0 +1,79 @@
2022-07-22 21:36:43 +02:00
+package io.papermc.paper.entity;
+
+import org.bukkit.Location;
+import org.bukkit.event.player.PlayerTeleportEvent;
+
+/**
+ * Represents a flag that can be set on teleportation that may
+ * slightly modify the behavior.
2022-07-22 21:36:43 +02:00
+ *
+ * @see EntityState
+ * @see Relative
2022-07-22 21:36:43 +02:00
+ */
+public sealed interface TeleportFlag permits TeleportFlag.EntityState, TeleportFlag.Relative {
+
2022-07-22 21:36:43 +02:00
+ /**
+ * Note: These flags only work on {@link org.bukkit.entity.Player} entities.
+ * <p>
+ * Represents coordinates in a teleportation that should be handled relatively.
+ * <p>
+ * Coordinates of the location that the client should handle as relative teleportation
+ * Relative teleportation flags are only used client side, and cause the player to not lose velocity in that
+ * specific coordinate. The location of the teleportation will not change.
+ *
+ * @see org.bukkit.entity.Player#teleport(Location, PlayerTeleportEvent.TeleportCause, TeleportFlag...)
2022-07-22 21:36:43 +02:00
+ */
+ enum Relative implements TeleportFlag {
+ /**
+ * Represents the player's X coordinate
+ */
+ X,
+ /**
+ * Represents the player's Y coordinate
+ */
+ Y,
+ /**
+ * Represents the player's Z coordinate
+ */
+ Z,
+ /**
+ * Represents the player's yaw
+ */
+ YAW,
+ /**
+ * Represents the player's pitch
+ */
+ PITCH;
+ }
+
2022-07-22 21:36:43 +02:00
+ /**
+ * Represents flags that effect the entity's state on
+ * teleportation.
2022-07-22 21:36:43 +02:00
+ */
+ enum EntityState implements TeleportFlag {
+ /**
+ * If all passengers should not be required to be removed prior to teleportation.
+ * <p>
+ * Note:
+ * Teleporting to a different world with this flag present while the entity has entities riding it
+ * will cause this teleportation to return false and not occur.
+ */
+ RETAIN_PASSENGERS,
+ /**
+ * If the entity should not be dismounted if they are riding another entity.
+ * <p>
+ * Note:
+ * Teleporting to a different world with this flag present while this entity is riding another entity will
+ * cause this teleportation to return false and not occur.
+ */
+ RETAIN_VEHICLE,
+ /**
+ * Indicates that a player should not have their current open inventory closed when teleporting.
+ * <p>
+ * Note:
+ * This option will be ignored when teleported to a different world.
+ */
+ RETAIN_OPEN_INVENTORY;
+ }
2022-07-22 21:36:43 +02:00
+
+}
diff --git a/src/main/java/org/bukkit/entity/Entity.java b/src/main/java/org/bukkit/entity/Entity.java
Update upstream (Bukkit/CraftBukkit/Spigot) (#10875) Upstream has released updates that appear to apply and compile correctly. This update has not been tested by PaperMC and as with ANY update, please do your own testing Bukkit Changes: 376e37db SPIGOT-7677: Update which entities are marked as spawnable 06c4add3 SPIGOT-7737: Add separate TreeType.MEGA_PINE 19b7caaa SPIGOT-7731: Spawn eggs cannot have damage e585297e PR-1022: Add force option to Player#spawnParticle d26e0094 PR-1018: Add methods to get players seeing specific chunks 8df1ed18 PR-978: Add Material#isCompostable and Material#getCompostChance 4b9b59c7 SPIGOT-7676: Enforce locale parameter in toLowerCase and toUpperCase method calls and always use root locale 8d1e700a PR-1020: Cast instead of using #typed when getting BlockType and ItemType to better work with testing / mocks fa28607a PR-1016: Fix incorrect assumption of Fireball having constant speed 4c6c8586 PR-1015: Add a tool component to ItemMeta 6f6b2123 PR-1014: Add PotionEffectTypeCategory to distinguish between beneficial and harmful effects f511cfe1 PR-1013, SPIGOT-4288, SPIGOT-6202: Add material rerouting in preparation for the switch to ItemType and BlockType def44cbf SPIGOT-7669: Fix typo in ProjectileHitEvent#getHitBlockFace documentation 53fa4f72 PR-1011: Throw an exception if a RecipeChoice is ever supplied air CraftBukkit Changes: ee95e171a SPIGOT-7737: Add separate TreeType.MEGA_PINE 0dae4c62c Fix spawn egg equality check and copy constructor ab59e847c Fix spawn eggs with no entity creating invalid stacks and disconnect creative clients 3b6093b28 SPIGOT-7736: Creative spawn egg use loses components c6b4d5a87 SPIGOT-7731: Spawn eggs cannot have damage 340ccd57f SPIGOT-7735: Fix serialization of player heads with note block sound fd2f41834 SPIGOT-7734: Can't register a custom advancement using unsafe() 02456e2a5 PR-1413: Add force option to Player#spawnParticle 6a61f38b2 SPIGOT-7680: Per-world weather command 58c41cebb PR-1409: Add methods to get players seeing specific chunks 16c976797 PR-1412: Fix shipwreck loot tables not being set for BlockTransformers 7189ba636 PR-1360: Add Material#isCompostable and Material#getCompostChance 900384556 SPIGOT-7676: Enforce locale parameter in toLowerCase and toUpperCase method calls and always use root locale bdb40c5f1 Increase outdated build delay d6607c7dd SPIGOT-7675: Fix FoodComponent config deserialization b148ed332 PR-1406: Fix incorrect assumption of Fireball having constant speed 3ec31ca75 PR-1405: Add a tool component to ItemMeta 5d7d675b9 PR-1404: Add PotionEffectTypeCategory to distinguish between beneficial and harmful effects 960827981 PR-1403, SPIGOT-4288, SPIGOT-6202: Add material rerouting in preparation for the switch to ItemType and BlockType 94e44ec93 PR-1401: Add a config option to accept old keys in registry get calls a43701920 PR-1402: Fix ChunkSnapshot#isSectionEmpty() is always false 87d0a3368 SPIGOT-7668: Move NONE Registry updater to FieldRename to avoid some class loader issues 2ea1e7ac2 PR-1399: Fix regression preventing positive .setDamage value from causing knockback for 0 damage events ba2d49d21 Increase outdated build delay Spigot Changes: fcd94e21 Rebuild patches 342f4939 SPIGOT-7661: Add experimental unload-frozen-chunks option
2024-06-13 16:45:27 +02:00
index f51f3f04ba9efe15f68620c5531b502710078b6e..8bada7f7f0200103edc415ad003132d96ae09607 100644
2022-07-22 21:36:43 +02:00
--- a/src/main/java/org/bukkit/entity/Entity.java
+++ b/src/main/java/org/bukkit/entity/Entity.java
2023-12-05 18:33:18 +01:00
@@ -126,10 +126,32 @@ public interface Entity extends Metadatable, CommandSender, Nameable, Persistent
2022-07-22 21:36:43 +02:00
*
* @param yaw the yaw
* @param pitch the pitch
- * @throws UnsupportedOperationException if used for players
*/
public void setRotation(float yaw, float pitch);
+ // Paper start - Teleport API
+ /**
+ * Teleports this entity to the given location.
+ *
+ * @param location New location to teleport this entity to
+ * @param teleportFlags Flags to be used in this teleportation
2022-07-22 21:36:43 +02:00
+ * @return <code>true</code> if the teleport was successful
+ */
+ default boolean teleport(@NotNull Location location, @NotNull io.papermc.paper.entity.TeleportFlag @NotNull... teleportFlags) {
+ return this.teleport(location, TeleportCause.PLUGIN, teleportFlags);
2022-07-22 21:36:43 +02:00
+ }
+
+ /**
+ * Teleports this entity to the given location.
+ *
+ * @param location New location to teleport this entity to
+ * @param cause The cause of this teleportation
+ * @param teleportFlags Flags to be used in this teleportation
2022-07-22 21:36:43 +02:00
+ * @return <code>true</code> if the teleport was successful
+ */
+ boolean teleport(@NotNull Location location, @NotNull TeleportCause cause, @NotNull io.papermc.paper.entity.TeleportFlag @NotNull... teleportFlags);
2022-07-22 21:36:43 +02:00
+ // Paper end - Teleport API
+
/**
* Teleports this entity to the given location. If this entity is riding a
* vehicle, it will be dismounted prior to teleportation.
diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java
2024-06-13 17:45:43 +02:00
index 48b3154ee164b9de74433556d8727e8b818ffbe5..fc6a7fcb7a3f1c92f725715eaea55500d6f553c1 100644
2022-07-22 21:36:43 +02:00
--- a/src/main/java/org/bukkit/entity/Player.java
+++ b/src/main/java/org/bukkit/entity/Player.java
2024-06-13 17:45:43 +02:00
@@ -3521,6 +3521,45 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
2022-07-22 21:36:43 +02:00
String getClientBrandName();
// Paper end
+ // Paper start - Teleport API
+ /**
+ * Sets the player's rotation.
+ *
+ * @param yaw the yaw
+ * @param pitch the pitch
+ */
+ void setRotation(float yaw, float pitch);
+
+ /**
+ * Causes the player to look towards the given position.
+ *
+ * @param x x coordinate
+ * @param y y coordinate
+ * @param z z coordinate
+ * @param playerAnchor What part of the player should face the given position
+ */
+ void lookAt(double x, double y, double z, @NotNull io.papermc.paper.entity.LookAnchor playerAnchor);
+
+ /**
+ * Causes the player to look towards the given position.
2022-07-22 21:36:43 +02:00
+ *
+ * @param position Position to look at in the player's current world
+ * @param playerAnchor What part of the player should face the given position
2022-07-22 21:36:43 +02:00
+ */
+ default void lookAt(@NotNull io.papermc.paper.math.Position position, @NotNull io.papermc.paper.entity.LookAnchor playerAnchor) {
+ this.lookAt(position.x(), position.y(), position.z(), playerAnchor);
2022-07-22 21:36:43 +02:00
+ }
+
+ /**
+ * Causes the player to look towards the given entity.
+ *
+ * @param entity Entity to look at
+ * @param playerAnchor What part of the player should face the entity
+ * @param entityAnchor What part of the entity the player should face
+ */
+ void lookAt(@NotNull org.bukkit.entity.Entity entity, @NotNull io.papermc.paper.entity.LookAnchor playerAnchor, @NotNull io.papermc.paper.entity.LookAnchor entityAnchor);
+ // Paper end - Teleport API
+
@NotNull
@Override
Spigot spigot();
diff --git a/src/main/java/org/bukkit/event/player/PlayerTeleportEvent.java b/src/main/java/org/bukkit/event/player/PlayerTeleportEvent.java
index 2deae344c88920ab95eefd2f65df5c858e04750b..ccfb08af8c57ddac3062c2cec28d7ff428082709 100644
2022-07-22 21:36:43 +02:00
--- a/src/main/java/org/bukkit/event/player/PlayerTeleportEvent.java
+++ b/src/main/java/org/bukkit/event/player/PlayerTeleportEvent.java
@@ -13,8 +13,14 @@ public class PlayerTeleportEvent extends PlayerMoveEvent {
private static final HandlerList handlers = new HandlerList();
private TeleportCause cause = TeleportCause.UNKNOWN;
+ // Paper start - Teleport API
+ private boolean dismounted = true;
+ private final java.util.Set<io.papermc.paper.entity.TeleportFlag.Relative> teleportFlagSet;
2022-07-22 21:36:43 +02:00
+ // Paper end
+
public PlayerTeleportEvent(@NotNull final Player player, @NotNull final Location from, @Nullable final Location to) {
super(player, from, to);
+ teleportFlagSet = java.util.Collections.emptySet(); // Paper - Teleport API
}
public PlayerTeleportEvent(@NotNull final Player player, @NotNull final Location from, @Nullable final Location to, @NotNull final TeleportCause cause) {
2023-03-15 00:10:18 +01:00
@@ -23,6 +29,15 @@ public class PlayerTeleportEvent extends PlayerMoveEvent {
2022-07-22 21:36:43 +02:00
this.cause = cause;
}
+ // Paper start - Teleport API
+ @org.jetbrains.annotations.ApiStatus.Internal
2023-03-15 00:10:18 +01:00
+ public PlayerTeleportEvent(@NotNull final Player player, @NotNull final Location from, @Nullable final Location to, @NotNull final TeleportCause cause, @NotNull java.util.Set<io.papermc.paper.entity.TeleportFlag.@NotNull Relative> teleportFlagSet) {
2022-07-22 21:36:43 +02:00
+ super(player, from, to);
+ this.teleportFlagSet = teleportFlagSet;
+ this.cause = cause;
+ }
+ // Paper end
+
/**
* Gets the cause of this teleportation event
*
@@ -88,6 +103,30 @@ public class PlayerTeleportEvent extends PlayerMoveEvent {
2022-07-22 21:36:43 +02:00
UNKNOWN;
}
+ // Paper start - Teleport API
+ /**
+ * Gets if the player will be dismounted in this teleportation.
+ *
+ * @return dismounted or not
2023-03-15 00:10:18 +01:00
+ * @deprecated dismounting on tp is no longer controlled by the server
2022-07-22 21:36:43 +02:00
+ */
2023-03-15 00:10:18 +01:00
+ @Deprecated(forRemoval = true)
2022-07-22 21:36:43 +02:00
+ public boolean willDismountPlayer() {
+ return this.dismounted;
+ }
+
+ /**
+ * Returns the relative teleportation flags used in this teleportation.
+ * This determines which axis the player will not lose their velocity in.
+ *
+ * @return an immutable set of relative teleportation flags
+ */
+ @NotNull
+ public java.util.Set<io.papermc.paper.entity.TeleportFlag.@NotNull Relative> getRelativeTeleportationFlags() {
2022-07-22 21:36:43 +02:00
+ return this.teleportFlagSet;
+ }
+ // Paper end
+
@NotNull
@Override
public HandlerList getHandlers() {