aboutsummaryrefslogtreecommitdiffhomepage
path: root/Spigot-Server-Patches/0280-Configurable-Bed-Search-Radius.patch
diff options
context:
space:
mode:
Diffstat (limited to 'Spigot-Server-Patches/0280-Configurable-Bed-Search-Radius.patch')
-rw-r--r--Spigot-Server-Patches/0280-Configurable-Bed-Search-Radius.patch105
1 files changed, 105 insertions, 0 deletions
diff --git a/Spigot-Server-Patches/0280-Configurable-Bed-Search-Radius.patch b/Spigot-Server-Patches/0280-Configurable-Bed-Search-Radius.patch
new file mode 100644
index 0000000000..015b2448c5
--- /dev/null
+++ b/Spigot-Server-Patches/0280-Configurable-Bed-Search-Radius.patch
@@ -0,0 +1,105 @@
+From f1cf963f3f14757f6fb2f07fe26fdd50e8201883 Mon Sep 17 00:00:00 2001
+From: Aikar <[email protected]>
+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 aa2be2ede6..f5b2e88f3b 100644
+--- a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
++++ b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
+@@ -452,4 +452,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 06f627002c..d81a2db6cd 100644
+--- a/src/main/java/net/minecraft/server/BlockBed.java
++++ b/src/main/java/net/minecraft/server/BlockBed.java
+@@ -187,6 +187,52 @@ public class BlockBed extends BlockFacingHorizontal implements ITileEntity {
+ @Nullable
+ public static BlockPosition a(IBlockAccess iblockaccess, BlockPosition blockposition, int i) {
+ EnumDirection enumdirection = (EnumDirection) iblockaccess.getType(blockposition).get(BlockBed.FACING);
++ // Paper - replace whole method
++ World world = (World) iblockaccess;
++ 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();
+@@ -212,9 +258,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.21.0
+