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() {
@@ -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<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, 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
}