From bf9f070bd5c6e334801791d85ebb2af51a53a1e6 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 1607619bd..692206127 100644 --- a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java +++ b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java @@ -418,4 +418,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 6832eaac5..b9cb59fa7 100644 --- a/src/main/java/net/minecraft/server/BlockBed.java +++ b/src/main/java/net/minecraft/server/BlockBed.java @@ -172,7 +172,54 @@ public class BlockBed extends BlockFacingHorizontal implements ITileEntity { @Nullable public static BlockPosition a(IBlockAccess iblockaccess, BlockPosition blockposition, int i) { + World world = (World) iblockaccess; + EnumDirection enumdirection = (EnumDirection) iblockaccess.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(); @@ -198,9 +245,12 @@ public class BlockBed extends BlockFacingHorizontal implements ITileEntity { } } - return null; + return null;*/ // Paper } + protected static boolean isSafeRespawn(IBlockAccess iblockaccess, BlockPosition blockposition) { // Paper - OBFHELPER + behavior improvement + return a(iblockaccess, blockposition) && iblockaccess.getType(blockposition.down()).getMaterial().isBuildable(); // Paper - ensure solid block + } protected static boolean a(IBlockAccess iblockaccess, BlockPosition blockposition) { return iblockaccess.getType(blockposition.down()).q() && !iblockaccess.getType(blockposition).getMaterial().isBuildable() && !iblockaccess.getType(blockposition.up()).getMaterial().isBuildable(); } -- 2.18.0