mirror of
https://github.com/PaperMC/Paper.git
synced 2025-07-26 09:42:06 -07:00
Don't consume anchor charge if loc changes (#12835)
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user