diff --git a/paper-api/src/main/java/org/bukkit/event/player/PlayerRespawnEvent.java b/paper-api/src/main/java/org/bukkit/event/player/PlayerRespawnEvent.java index 07b1b4a15..757d8d699 100644 --- a/paper-api/src/main/java/org/bukkit/event/player/PlayerRespawnEvent.java +++ b/paper-api/src/main/java/org/bukkit/event/player/PlayerRespawnEvent.java @@ -21,6 +21,7 @@ public class PlayerRespawnEvent extends PlayerEvent { private final boolean isBedSpawn; private final boolean isAnchorSpawn; + private final boolean missingRespawnBlock; private final RespawnReason respawnReason; private final Set respawnFlags; private Location respawnLocation; @@ -40,16 +41,17 @@ public class PlayerRespawnEvent extends PlayerEvent { @ApiStatus.Internal @Deprecated(forRemoval = true) public PlayerRespawnEvent(@NotNull final Player respawnPlayer, @NotNull final Location respawnLocation, final boolean isBedSpawn, final boolean isAnchorSpawn, @NotNull final RespawnReason respawnReason) { - this(respawnPlayer, respawnLocation, isBedSpawn, isAnchorSpawn, respawnReason, com.google.common.collect.ImmutableSet.builder()); + this(respawnPlayer, respawnLocation, isBedSpawn, isAnchorSpawn, false, respawnReason, com.google.common.collect.ImmutableSet.builder()); } @ApiStatus.Internal - public PlayerRespawnEvent(@NotNull final Player respawnPlayer, @NotNull final Location respawnLocation, final boolean isBedSpawn, final boolean isAnchorSpawn, @NotNull final RespawnReason respawnReason, @NotNull final com.google.common.collect.ImmutableSet.Builder respawnFlags) { + public PlayerRespawnEvent(@NotNull final Player respawnPlayer, @NotNull final Location respawnLocation, final boolean isBedSpawn, final boolean isAnchorSpawn, final boolean missingRespawnBlock, @NotNull final RespawnReason respawnReason, @NotNull final com.google.common.collect.ImmutableSet.Builder respawnFlags) { super(respawnPlayer); this.respawnLocation = respawnLocation; this.isBedSpawn = isBedSpawn; this.isAnchorSpawn = isAnchorSpawn; this.respawnReason = respawnReason; + this.missingRespawnBlock = missingRespawnBlock; if (this.isBedSpawn) { respawnFlags.add(RespawnFlag.BED_SPAWN); } if (this.isAnchorSpawn) { respawnFlags.add(RespawnFlag.ANCHOR_SPAWN); } this.respawnFlags = respawnFlags.build(); @@ -95,6 +97,19 @@ public class PlayerRespawnEvent extends PlayerEvent { return this.isAnchorSpawn; } + /** + * Gets whether the player is missing a valid respawn block. + *

+ * This will occur if the players respawn block is obstructed, + * or it is the first death after it was either destroyed or + * in case of a respawn anchor, ran out of charges. + * + * @return whether the player is missing a valid respawn block + */ + public boolean isMissingRespawnBlock() { + return this.missingRespawnBlock; + } + /** * Gets the reason this respawn event was called. * diff --git a/paper-server/patches/sources/net/minecraft/server/level/ServerPlayer.java.patch b/paper-server/patches/sources/net/minecraft/server/level/ServerPlayer.java.patch index 887b2cf38..a19f70a25 100644 --- a/paper-server/patches/sources/net/minecraft/server/level/ServerPlayer.java.patch +++ b/paper-server/patches/sources/net/minecraft/server/level/ServerPlayer.java.patch @@ -491,7 +491,7 @@ } } -@@ -914,23 +_,81 @@ +@@ -914,23 +_,82 @@ } private boolean isPvpAllowed() { @@ -550,6 +550,7 @@ + location, + isBedSpawn, + isAnchorSpawn, ++ teleportTransition.missingRespawnBlock(), + respawnReason, + builder + );