diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/util/BukkitUtil.java b/Bukkit/src/main/java/com/plotsquared/bukkit/util/BukkitUtil.java index 124e766e9b..babaf22ba2 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/util/BukkitUtil.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/util/BukkitUtil.java @@ -261,6 +261,11 @@ public void getHighestBlock(final @NonNull String world, final int x, final int }); } + @Override + public boolean isSmallBlock(Location location) { + return adapt(location).getBlock().getBoundingBox().getHeight() < 0.25; + } + @Override @NonNegative public int getHighestBlockSynchronous(final @NonNull String world, final int x, final int z) { diff --git a/Core/src/main/java/com/plotsquared/core/configuration/Settings.java b/Core/src/main/java/com/plotsquared/core/configuration/Settings.java index 03ac33e78a..7f89af39ae 100644 --- a/Core/src/main/java/com/plotsquared/core/configuration/Settings.java +++ b/Core/src/main/java/com/plotsquared/core/configuration/Settings.java @@ -577,6 +577,8 @@ public static final class Teleport { public static boolean PER_WORLD_VISIT = false; @Comment("Search merged plots for having multiple owners when using the visit command") public static boolean VISIT_MERGED_OWNERS = true; + @Comment("Allows to teleport based on block size instead to spawn on the highest block at the home command") + public static boolean SIZED_BASED = true; } diff --git a/Core/src/main/java/com/plotsquared/core/plot/Plot.java b/Core/src/main/java/com/plotsquared/core/plot/Plot.java index 67db8a698e..c4eb396bdb 100644 --- a/Core/src/main/java/com/plotsquared/core/plot/Plot.java +++ b/Core/src/main/java/com/plotsquared/core/plot/Plot.java @@ -1420,6 +1420,9 @@ public Location getHomeSynchronous() { ); } Location location = toHomeLocation(bottom, home); + if (Settings.Teleport.SIZED_BASED && this.worldUtil.isSmallBlock(location) && this.worldUtil.isSmallBlock(location.add(0,1,0))) { + return location; + } if (!this.worldUtil.getBlockSynchronous(location).getBlockType().getMaterial().isAir()) { location = location.withY( Math.max(1 + this.worldUtil.getHighestBlockSynchronous( @@ -1453,15 +1456,21 @@ public void getHome(final Consumer result) { } Location bottom = this.getBottomAbs(); Location location = toHomeLocation(bottom, home); - this.worldUtil.getBlock(location, block -> { - if (!block.getBlockType().getMaterial().isAir()) { - this.worldUtil.getHighestBlock(this.getWorldName(), location.getX(), location.getZ(), - y -> result.accept(location.withY(Math.max(1 + y, bottom.getY()))) - ); - } else { - result.accept(location); - } - }); + if (Settings.Teleport.SIZED_BASED && this.worldUtil.isSmallBlock(location) && this.worldUtil.isSmallBlock(location.add(0,1,0))) { + result.accept(location); + } else { + this.worldUtil.getBlock(location, block -> { + + if (!block.getBlockType().getMaterial().isAir()) { + this.worldUtil.getHighestBlock(this.getWorldName(), location.getX(), location.getZ(), + y -> result.accept(location.withY(Math.max(1 + y, bottom.getY()))) + ); + } else { + result.accept(location); + } + }); + } + } } diff --git a/Core/src/main/java/com/plotsquared/core/util/WorldUtil.java b/Core/src/main/java/com/plotsquared/core/util/WorldUtil.java index d00ce0e21f..9ef896df1c 100644 --- a/Core/src/main/java/com/plotsquared/core/util/WorldUtil.java +++ b/Core/src/main/java/com/plotsquared/core/util/WorldUtil.java @@ -168,6 +168,13 @@ public abstract void setSign( */ public abstract void getBlock(@NonNull Location location, @NonNull Consumer result); + /** + * Checks if the block smaller as a slab + * @param location Block location + * @return true if it smaller as a slab + */ + public abstract boolean isSmallBlock(@NonNull Location location); + /** * Get the block at a given location (synchronously) *