diff --git a/pom.xml b/pom.xml index 699075c..a9048b8 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ cn.lunadeer Dominion - 1.23.8-beta + 1.23.9-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 ffa8ab1..2a0069b 100644 --- a/src/main/java/cn/lunadeer/dominion/commands/DominionOperate.java +++ b/src/main/java/cn/lunadeer/dominion/commands/DominionOperate.java @@ -6,9 +6,13 @@ import cn.lunadeer.dominion.controllers.DominionController; import cn.lunadeer.dominion.dtos.DominionDTO; 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.World; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import org.bukkit.entity.Wolf; +import org.bukkit.event.player.PlayerTeleportEvent; import java.time.LocalDateTime; import java.util.Map; @@ -376,12 +380,6 @@ public class DominionOperate { } } - Location location = dominionDTO.getTpLocation(); - if (location == null) { - Notification.error(sender, "此领地没有设置传送点"); - return; - } - LocalDateTime now = LocalDateTime.now(); LocalDateTime next_time = Cache.instance.NextTimeAllowTeleport.get(player.getUniqueId()); if (next_time != null) { @@ -396,10 +394,25 @@ public class DominionOperate { } Cache.instance.NextTimeAllowTeleport.put(player.getUniqueId(), now.plusSeconds(Dominion.config.getTpCoolDown())); Dominion.scheduler.region.runDelayed(Dominion.instance, (instance) -> { + Location location = dominionDTO.getTpLocation(); + if (location == null) { + int x = (dominionDTO.getX1() + dominionDTO.getX2()) / 2; + int z = (dominionDTO.getZ1() + dominionDTO.getZ2()) / 2; + World world = Dominion.instance.getServer().getWorld(dominionDTO.getWorld()); + location = new Location(world, x, player.getY(), z); + XLogger.warn("领地 " + dominionDTO.getName() + " 没有设置传送点,将传送到中心点"); + } if (player.isOnline()) { - player.teleportAsync(location); + doTeleportSafely(player, location); Notification.info(player, "已将你传送到 " + dominionDTO.getName()); } }, Dominion.config.getTpDelay() == 0 ? 1 : 20L * Dominion.config.getTpDelay()); } + + private static void doTeleportSafely(Player player, Location location) { + location.getWorld().getChunkAtAsyncUrgently(location).thenAccept((chunk) -> { + location.setY(chunk.getWorld().getHighestBlockYAt(location) + 1); + player.teleportAsync(location, PlayerTeleportEvent.TeleportCause.PLUGIN); + }); + } }