From a246ceabeb00b56874af023516184f8ef320c62f Mon Sep 17 00:00:00 2001 From: Aikar Date: Wed, 4 Jul 2018 15:22:06 -0400 Subject: [PATCH] Configurable Bed Search Radius Allows you to increase how far to check for a safe place to respawn a player near their bed, allowing a better chance to respawn the player at their bed should it of became obstructed. Defaults to vanilla 1. diff --git a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java index 06c54690f..50416f40a 100644 --- a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java +++ b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java @@ -529,4 +529,15 @@ public class PaperWorldConfig { private void scanForLegacyEnderDragon() { scanForLegacyEnderDragon = getBoolean("game-mechanics.scan-for-legacy-ender-dragon", true); } + + public int bedSearchRadius = 1; + private void bedSearchRadius() { + bedSearchRadius = getInt("bed-search-radius", 1); + if (bedSearchRadius < 1) { + bedSearchRadius = 1; + } + if (bedSearchRadius > 1) { + log("Bed Search Radius: " + bedSearchRadius); + } + } } diff --git a/src/main/java/net/minecraft/server/BlockBed.java b/src/main/java/net/minecraft/server/BlockBed.java index 9346bddff..f1a107991 100644 --- a/src/main/java/net/minecraft/server/BlockBed.java +++ b/src/main/java/net/minecraft/server/BlockBed.java @@ -155,6 +155,51 @@ public class BlockBed extends BlockFacingHorizontal implements ITileEntity { @Nullable public static BlockPosition a(World world, BlockPosition blockposition, int i) { EnumDirection enumdirection = (EnumDirection) world.getType(blockposition).get(BlockBed.FACING); + // Paper - replace whole method + int radius = world.paperConfig.bedSearchRadius; + for (int r = 1; r <= radius; r++) { + int x = -r; + int z = r; + + // Iterates the edge of half of the box; then negates for other half. + while (x <= r && z > -r) { + for (int y = -1; y <= 1; y++) { + BlockPosition pos = blockposition.add(x, y, z); + if (isSafeRespawn(world, pos)) { + if (i-- <= 0) { + return pos; + } + } + pos = blockposition.add(-x, y, -z); + if (isSafeRespawn(world, pos)) { + if (i-- <= 0) { + return pos; + } + } + + pos = blockposition.add(enumdirection.getAdjacentX() + x, y, enumdirection.getAdjacentZ() + z); + if (isSafeRespawn(world, pos)) { + if (i-- <= 0) { + return pos; + } + } + + pos = blockposition.add(enumdirection.getAdjacentX() - x, y, enumdirection.getAdjacentZ() - z); + if (isSafeRespawn(world, pos)) { + if (i-- <= 0) { + return pos; + } + } + } + if (x < r) { + x++; + } else { + z--; + } + } + } + + return null; /* // Paper comment out int j = blockposition.getX(); int k = blockposition.getY(); int l = blockposition.getZ(); @@ -180,9 +225,12 @@ public class BlockBed extends BlockFacingHorizontal implements ITileEntity { } } - return null; + return null;*/ // Paper } + protected static boolean isSafeRespawn(World world, BlockPosition blockposition) { // Paper - OBFHELPER + behavior improvement + return b(world, blockposition) && world.getType(blockposition.down()).getMaterial().isBuildable(); // Paper - ensure solid block + } protected static boolean b(World world, BlockPosition blockposition) { return world.getType(blockposition.down()).q() && !world.getType(blockposition).getMaterial().isBuildable() && !world.getType(blockposition.up()).getMaterial().isBuildable(); } -- 2.18.0