Don't consume anchor charge if loc changes (#12835)

This commit is contained in:
Jake Potrebic
2025-07-12 12:03:48 -07:00
committed by GitHub
parent ba7c982605
commit 533d93c758

View File

@@ -501,7 +501,7 @@
} }
} }
@@ -927,23 +_,77 @@ @@ -927,23 +_,84 @@
} }
private boolean isPvpAllowed() { private boolean isPvpAllowed() {
@@ -515,6 +515,7 @@
+ TeleportTransition teleportTransition; + TeleportTransition teleportTransition;
+ boolean isBedSpawn = false; + boolean isBedSpawn = false;
+ boolean isAnchorSpawn = false; + boolean isAnchorSpawn = false;
+ Runnable consumeAnchorCharge = null;
+ // CraftBukkit end + // CraftBukkit end
ServerPlayer.RespawnConfig respawnConfig = this.getRespawnConfig(); ServerPlayer.RespawnConfig respawnConfig = this.getRespawnConfig();
ServerLevel level = this.server.getLevel(ServerPlayer.RespawnConfig.getDimensionOrDefault(respawnConfig)); ServerLevel level = this.server.getLevel(ServerPlayer.RespawnConfig.getDimensionOrDefault(respawnConfig));
@@ -526,6 +527,7 @@
+ // CraftBukkit start + // CraftBukkit start
+ isBedSpawn = respawnPosAngle.isBedSpawn(); + isBedSpawn = respawnPosAngle.isBedSpawn();
+ isAnchorSpawn = respawnPosAngle.isAnchorSpawn(); + isAnchorSpawn = respawnPosAngle.isAnchorSpawn();
+ consumeAnchorCharge = respawnPosAngle.consumeAnchorCharge();
+ teleportTransition = new TeleportTransition(level, respawnPosAngle.position(), Vec3.ZERO, respawnPosAngle.yaw(), 0.0F, postTeleportTransition); + teleportTransition = new TeleportTransition(level, respawnPosAngle.position(), Vec3.ZERO, respawnPosAngle.yaw(), 0.0F, postTeleportTransition);
+ // CraftBukkit end + // CraftBukkit end
} else { } else {
@@ -567,6 +569,11 @@
+ } + }
+ // Spigot end + // 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(); + location = respawnEvent.getRespawnLocation();
+ +
+ return new TeleportTransition( + return new TeleportTransition(
@@ -585,16 +592,23 @@
} }
public boolean isReceivingWaypoints() { public boolean isReceivingWaypoints() {
@@ -978,10 +_,10 @@ @@ -974,14 +_,16 @@
level.setBlock(blockPos, blockState.setValue(RespawnAnchorBlock.CHARGE, blockState.getValue(RespawnAnchorBlock.CHARGE) - 1), 3); Block block = blockState.getBlock();
if (block instanceof RespawnAnchorBlock && (flag || blockState.getValue(RespawnAnchorBlock.CHARGE) > 0) && RespawnAnchorBlock.canSetSpawn(level)) {
Optional<Vec3> 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));
+ 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)) { } else if (block instanceof BedBlock && BedBlock.canSetSpawn(level)) {
return BedBlock.findStandUpPosition(EntityType.PLAYER, level, blockPos, blockState.getValue(BedBlock.FACING), f) 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));
+ .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) { } else if (!flag) {
return Optional.empty(); return Optional.empty();
} else { } else {
@@ -603,7 +617,7 @@
boolean isPossibleToRespawnInThis1 = blockState1.getBlock().isPossibleToRespawnInThis(blockState1); boolean isPossibleToRespawnInThis1 = blockState1.getBlock().isPossibleToRespawnInThis(blockState1);
return isPossibleToRespawnInThis && isPossibleToRespawnInThis1 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))
+ ? 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(); : Optional.empty();
} }
} }
@@ -1399,9 +1413,9 @@
- public static ServerPlayer.RespawnPosAngle of(Vec3 position, BlockPos towardsPos) { - public static ServerPlayer.RespawnPosAngle of(Vec3 position, BlockPos towardsPos) {
- return new ServerPlayer.RespawnPosAngle(position, calculateLookAtYaw(position, towardsPos)); - return new ServerPlayer.RespawnPosAngle(position, calculateLookAtYaw(position, towardsPos));
+ // CraftBukkit start + // CraftBukkit start
+ public record RespawnPosAngle(Vec3 position, float yaw, boolean isBedSpawn, boolean 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) { + 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); + return new ServerPlayer.RespawnPosAngle(position, calculateLookAtYaw(position, towardsPos), isBedSpawn, isAnchorSpawn, consumeAnchorCharge);
+ // CraftBukkit end + // CraftBukkit end
} }