Improve teleport behavior for home command

This commit is contained in:
Phillipp Glanz 2024-03-06 21:59:17 +01:00
parent 5344efd1b7
commit 087ba07bfd
No known key found for this signature in database
4 changed files with 32 additions and 9 deletions

View File

@ -261,6 +261,11 @@ public class BukkitUtil extends WorldUtil {
}); });
} }
@Override
public boolean isSmallBlock(Location location) {
return adapt(location).getBlock().getBoundingBox().getHeight() < 0.25;
}
@Override @Override
@NonNegative @NonNegative
public int getHighestBlockSynchronous(final @NonNull String world, final int x, final int z) { public int getHighestBlockSynchronous(final @NonNull String world, final int x, final int z) {

View File

@ -577,6 +577,8 @@ public class Settings extends Config {
public static boolean PER_WORLD_VISIT = false; public static boolean PER_WORLD_VISIT = false;
@Comment("Search merged plots for having multiple owners when using the visit command") @Comment("Search merged plots for having multiple owners when using the visit command")
public static boolean VISIT_MERGED_OWNERS = true; 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;
} }

View File

@ -1420,6 +1420,9 @@ public class Plot {
); );
} }
Location location = toHomeLocation(bottom, home); 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()) { if (!this.worldUtil.getBlockSynchronous(location).getBlockType().getMaterial().isAir()) {
location = location.withY( location = location.withY(
Math.max(1 + this.worldUtil.getHighestBlockSynchronous( Math.max(1 + this.worldUtil.getHighestBlockSynchronous(
@ -1453,15 +1456,21 @@ public class Plot {
} }
Location bottom = this.getBottomAbs(); Location bottom = this.getBottomAbs();
Location location = toHomeLocation(bottom, home); Location location = toHomeLocation(bottom, home);
this.worldUtil.getBlock(location, block -> { if (Settings.Teleport.SIZED_BASED && this.worldUtil.isSmallBlock(location) && this.worldUtil.isSmallBlock(location.add(0,1,0))) {
if (!block.getBlockType().getMaterial().isAir()) { result.accept(location);
this.worldUtil.getHighestBlock(this.getWorldName(), location.getX(), location.getZ(), } else {
y -> result.accept(location.withY(Math.max(1 + y, bottom.getY()))) this.worldUtil.getBlock(location, block -> {
);
} else { if (!block.getBlockType().getMaterial().isAir()) {
result.accept(location); this.worldUtil.getHighestBlock(this.getWorldName(), location.getX(), location.getZ(),
} y -> result.accept(location.withY(Math.max(1 + y, bottom.getY())))
}); );
} else {
result.accept(location);
}
});
}
} }
} }

View File

@ -168,6 +168,13 @@ public abstract class WorldUtil {
*/ */
public abstract void getBlock(@NonNull Location location, @NonNull Consumer<BlockState> result); public abstract void getBlock(@NonNull Location location, @NonNull Consumer<BlockState> 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) * Get the block at a given location (synchronously)
* *