diff --git a/pom.xml b/pom.xml
index a9048b8..c073428 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
cn.lunadeer
Dominion
- 1.23.9-beta
+ 1.23.10-beta
jar
Dominion
diff --git a/src/main/java/cn/lunadeer/dominion/commands/DominionOperate.java b/src/main/java/cn/lunadeer/dominion/commands/DominionOperate.java
index 2a0069b..d311bd2 100644
--- a/src/main/java/cn/lunadeer/dominion/commands/DominionOperate.java
+++ b/src/main/java/cn/lunadeer/dominion/commands/DominionOperate.java
@@ -8,7 +8,10 @@ import cn.lunadeer.dominion.dtos.PlayerPrivilegeDTO;
import cn.lunadeer.dominion.utils.Notification;
import cn.lunadeer.dominion.utils.XLogger;
import org.bukkit.Location;
+import org.bukkit.Material;
import org.bukkit.World;
+import org.bukkit.block.Block;
+import org.bukkit.block.BlockFace;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.entity.Wolf;
@@ -411,7 +414,33 @@ public class DominionOperate {
private static void doTeleportSafely(Player player, Location location) {
location.getWorld().getChunkAtAsyncUrgently(location).thenAccept((chunk) -> {
- location.setY(chunk.getWorld().getHighestBlockYAt(location) + 1);
+ int max_attempts = 512;
+ while (location.getBlock().isPassable()) {
+ location.setY(location.getY() - 1);
+ max_attempts--;
+ if (max_attempts <= 0) {
+ Notification.error(player, "传送目的地不安全,已取消传送");
+ return;
+ }
+ }
+ Block up1 = location.getBlock().getRelative(BlockFace.UP);
+ Block up2 = up1.getRelative(BlockFace.UP);
+ max_attempts = 512;
+ while (!(up1.isPassable() && !up1.isLiquid()) || !(up2.isPassable() && !up2.isLiquid())) {
+ location.setY(location.getY() + 1);
+ up1 = location.getBlock().getRelative(BlockFace.UP);
+ up2 = up1.getRelative(BlockFace.UP);
+ max_attempts--;
+ if (max_attempts <= 0) {
+ Notification.error(player, "传送目的地不安全,已取消传送");
+ return;
+ }
+ }
+ location.setY(location.getY() + 1);
+ if (location.getBlock().getRelative(BlockFace.DOWN).getType() == Material.LAVA) {
+ Notification.error(player, "传送目的地不安全,已取消传送");
+ return;
+ }
player.teleportAsync(location, PlayerTeleportEvent.TeleportCause.PLUGIN);
});
}