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 c5cdbe3385..325bd2461e 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 @@ -501,7 +501,7 @@ } } -@@ -927,23 +_,77 @@ +@@ -927,23 +_,84 @@ } private boolean isPvpAllowed() { @@ -515,6 +515,7 @@ + TeleportTransition teleportTransition; + boolean isBedSpawn = false; + boolean isAnchorSpawn = false; ++ Runnable consumeAnchorCharge = null; + // CraftBukkit end ServerPlayer.RespawnConfig respawnConfig = this.getRespawnConfig(); ServerLevel level = this.server.getLevel(ServerPlayer.RespawnConfig.getDimensionOrDefault(respawnConfig)); @@ -526,6 +527,7 @@ + // CraftBukkit start + isBedSpawn = respawnPosAngle.isBedSpawn(); + isAnchorSpawn = respawnPosAngle.isAnchorSpawn(); ++ consumeAnchorCharge = respawnPosAngle.consumeAnchorCharge(); + teleportTransition = new TeleportTransition(level, respawnPosAngle.position(), Vec3.ZERO, respawnPosAngle.yaw(), 0.0F, postTeleportTransition); + // CraftBukkit end } else { @@ -567,6 +569,11 @@ + } + // Spigot end + ++ // Paper start - consume anchor charge if location hasn't changed ++ if (location.equals(respawnEvent.getRespawnLocation()) && consumeAnchorCharge != null) { ++ consumeAnchorCharge.run(); ++ } ++ // Paper end - consume anchor charge if location hasn't changed + location = respawnEvent.getRespawnLocation(); + + return new TeleportTransition( @@ -585,16 +592,23 @@ } public boolean isReceivingWaypoints() { -@@ -978,10 +_,10 @@ - level.setBlock(blockPos, blockState.setValue(RespawnAnchorBlock.CHARGE, blockState.getValue(RespawnAnchorBlock.CHARGE) - 1), 3); +@@ -974,14 +_,16 @@ + Block block = blockState.getBlock(); + if (block instanceof RespawnAnchorBlock && (flag || blockState.getValue(RespawnAnchorBlock.CHARGE) > 0) && RespawnAnchorBlock.canSetSpawn(level)) { + Optional optional = RespawnAnchorBlock.findStandUpPosition(EntityType.PLAYER, level, blockPos); ++ Runnable consumeAnchorCharge = null; // Paper - Fix SPIGOT-5989 (don't use charge until after respawn event) + if (!flag && useCharge && optional.isPresent()) { +- level.setBlock(blockPos, blockState.setValue(RespawnAnchorBlock.CHARGE, blockState.getValue(RespawnAnchorBlock.CHARGE) - 1), 3); ++ consumeAnchorCharge = () -> level.setBlock(blockPos, blockState.setValue(RespawnAnchorBlock.CHARGE, blockState.getValue(RespawnAnchorBlock.CHARGE) - 1), 3); // Paper - Fix SPIGOT-5989 (don't use charge until after respawn event) } ++ final Runnable finalConsumeAnchorCharge = consumeAnchorCharge; // Paper - Fix SPIGOT-5989 - return optional.map(pos -> ServerPlayer.RespawnPosAngle.of(pos, blockPos)); -+ return optional.map(pos -> ServerPlayer.RespawnPosAngle.of(pos, blockPos, false, true)); // CraftBukkit ++ return optional.map(pos -> ServerPlayer.RespawnPosAngle.of(pos, blockPos, false, true, finalConsumeAnchorCharge)); // Paper - Fix SPIGOT-5989 (don't use charge until after respawn event) } else if (block instanceof BedBlock && BedBlock.canSetSpawn(level)) { return BedBlock.findStandUpPosition(EntityType.PLAYER, level, blockPos, blockState.getValue(BedBlock.FACING), f) - .map(pos -> ServerPlayer.RespawnPosAngle.of(pos, blockPos)); -+ .map(pos -> ServerPlayer.RespawnPosAngle.of(pos, blockPos, true, false)); // CraftBukkit ++ .map(pos -> ServerPlayer.RespawnPosAngle.of(pos, blockPos, true, false, null)); // Paper - Fix SPIGOT-5989 } else if (!flag) { return Optional.empty(); } else { @@ -603,7 +617,7 @@ boolean isPossibleToRespawnInThis1 = blockState1.getBlock().isPossibleToRespawnInThis(blockState1); return isPossibleToRespawnInThis && isPossibleToRespawnInThis1 - ? Optional.of(new ServerPlayer.RespawnPosAngle(new Vec3(blockPos.getX() + 0.5, blockPos.getY() + 0.1, blockPos.getZ() + 0.5), f)) -+ ? Optional.of(new ServerPlayer.RespawnPosAngle(new Vec3(blockPos.getX() + 0.5, blockPos.getY() + 0.1, blockPos.getZ() + 0.5), f, false, false)) // CraftBukkit ++ ? Optional.of(new ServerPlayer.RespawnPosAngle(new Vec3(blockPos.getX() + 0.5, blockPos.getY() + 0.1, blockPos.getZ() + 0.5), f, false, false, null)) // Paper - Fix SPIGOT-5989 : Optional.empty(); } } @@ -1399,9 +1413,9 @@ - public static ServerPlayer.RespawnPosAngle of(Vec3 position, BlockPos towardsPos) { - return new ServerPlayer.RespawnPosAngle(position, calculateLookAtYaw(position, towardsPos)); + // CraftBukkit start -+ public record RespawnPosAngle(Vec3 position, float yaw, boolean isBedSpawn, boolean isAnchorSpawn) { -+ public static ServerPlayer.RespawnPosAngle of(Vec3 position, BlockPos towardsPos, boolean isBedSpawn, boolean isAnchorSpawn) { -+ return new ServerPlayer.RespawnPosAngle(position, calculateLookAtYaw(position, towardsPos), isBedSpawn, isAnchorSpawn); ++ public record RespawnPosAngle(Vec3 position, float yaw, boolean isBedSpawn, boolean isAnchorSpawn, @Nullable Runnable consumeAnchorCharge) { ++ public static ServerPlayer.RespawnPosAngle of(Vec3 position, BlockPos towardsPos, boolean isBedSpawn, boolean isAnchorSpawn, @Nullable Runnable consumeAnchorCharge) { ++ return new ServerPlayer.RespawnPosAngle(position, calculateLookAtYaw(position, towardsPos), isBedSpawn, isAnchorSpawn, consumeAnchorCharge); + // CraftBukkit end }