diff --git a/pom.xml b/pom.xml index a9048b8..527163b 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ cn.lunadeer Dominion - 1.23.9-beta + 1.23.11-beta jar Dominion @@ -78,12 +78,12 @@ org.xerial sqlite-jdbc - 3.34.0 + 3.41.2.2 org.postgresql postgresql - 42.6.0 + 42.7.2 com.github.BlueMap-Minecraft diff --git a/src/main/java/cn/lunadeer/dominion/Dominion.java b/src/main/java/cn/lunadeer/dominion/Dominion.java index ebc1fe1..0741274 100644 --- a/src/main/java/cn/lunadeer/dominion/Dominion.java +++ b/src/main/java/cn/lunadeer/dominion/Dominion.java @@ -3,7 +3,11 @@ package cn.lunadeer.dominion; import cn.lunadeer.dominion.events.EnvironmentEvents; import cn.lunadeer.dominion.events.PlayerEvents; import cn.lunadeer.dominion.events.SelectPointEvents; -import cn.lunadeer.dominion.utils.*; +import cn.lunadeer.dominion.managers.ConfigManager; +import cn.lunadeer.dominion.managers.DatabaseManager; +import cn.lunadeer.dominion.utils.GiteaReleaseCheck; +import cn.lunadeer.dominion.utils.Scheduler; +import cn.lunadeer.dominion.utils.XLogger; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.plugin.java.JavaPlugin; @@ -22,8 +26,8 @@ public final class Dominion extends JavaPlugin { // Plugin startup logic instance = this; config = new ConfigManager(this); - dbConnection = Database.createConnection(); - Database.migrate(); + dbConnection = DatabaseManager.createConnection(); + DatabaseManager.migrate(); scheduler = new Scheduler(this); AutoClean.run(); Cache.instance = new Cache(); diff --git a/src/main/java/cn/lunadeer/dominion/commands/DominionOperate.java b/src/main/java/cn/lunadeer/dominion/commands/DominionOperate.java index ffa8ab1..d311bd2 100644 --- a/src/main/java/cn/lunadeer/dominion/commands/DominionOperate.java +++ b/src/main/java/cn/lunadeer/dominion/commands/DominionOperate.java @@ -6,9 +6,16 @@ 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.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; +import org.bukkit.event.player.PlayerTeleportEvent; import java.time.LocalDateTime; import java.util.Map; @@ -376,12 +383,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 +397,51 @@ 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) -> { + 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); + }); + } } diff --git a/src/main/java/cn/lunadeer/dominion/dtos/DominionDTO.java b/src/main/java/cn/lunadeer/dominion/dtos/DominionDTO.java index 8991aff..407351f 100644 --- a/src/main/java/cn/lunadeer/dominion/dtos/DominionDTO.java +++ b/src/main/java/cn/lunadeer/dominion/dtos/DominionDTO.java @@ -2,7 +2,7 @@ package cn.lunadeer.dominion.dtos; import cn.lunadeer.dominion.Cache; import cn.lunadeer.dominion.Dominion; -import cn.lunadeer.dominion.utils.Database; +import cn.lunadeer.dominion.managers.DatabaseManager; import cn.lunadeer.dominion.utils.XLogger; import org.bukkit.Location; import org.bukkit.World; @@ -18,7 +18,7 @@ public class DominionDTO { private static List query(String sql) { List dominions = new ArrayList<>(); - try (ResultSet rs = Database.query(sql)) { + try (ResultSet rs = DatabaseManager.query(sql)) { if (sql.contains("UPDATE") || sql.contains("DELETE") || sql.contains("INSERT")) { // 如果是更新操作,重新加载缓存 Cache.instance.loadDominions(); diff --git a/src/main/java/cn/lunadeer/dominion/dtos/PlayerDTO.java b/src/main/java/cn/lunadeer/dominion/dtos/PlayerDTO.java index 39d1205..b84dbac 100644 --- a/src/main/java/cn/lunadeer/dominion/dtos/PlayerDTO.java +++ b/src/main/java/cn/lunadeer/dominion/dtos/PlayerDTO.java @@ -1,6 +1,6 @@ package cn.lunadeer.dominion.dtos; -import cn.lunadeer.dominion.utils.Database; +import cn.lunadeer.dominion.managers.DatabaseManager; import cn.lunadeer.dominion.utils.XLogger; import org.bukkit.entity.Player; @@ -31,7 +31,7 @@ public class PlayerDTO { private static List query(String sql) { List players = new ArrayList<>(); - try (ResultSet rs = Database.query(sql)) { + try (ResultSet rs = DatabaseManager.query(sql)) { if (rs == null) return players; while (rs.next()) { Integer id = rs.getInt("id"); diff --git a/src/main/java/cn/lunadeer/dominion/dtos/PlayerPrivilegeDTO.java b/src/main/java/cn/lunadeer/dominion/dtos/PlayerPrivilegeDTO.java index a09dd21..8a3a21a 100644 --- a/src/main/java/cn/lunadeer/dominion/dtos/PlayerPrivilegeDTO.java +++ b/src/main/java/cn/lunadeer/dominion/dtos/PlayerPrivilegeDTO.java @@ -1,7 +1,7 @@ package cn.lunadeer.dominion.dtos; import cn.lunadeer.dominion.Cache; -import cn.lunadeer.dominion.utils.Database; +import cn.lunadeer.dominion.managers.DatabaseManager; import cn.lunadeer.dominion.utils.XLogger; import java.sql.ResultSet; @@ -582,7 +582,7 @@ public class PlayerPrivilegeDTO { private static List query(String sql) { List players = new ArrayList<>(); - try (ResultSet rs = Database.query(sql)) { + try (ResultSet rs = DatabaseManager.query(sql)) { if (sql.contains("UPDATE") || sql.contains("DELETE") || sql.contains("INSERT")) { // 如果是更新操作,重新加载缓存 Cache.instance.loadPlayerPrivileges(); diff --git a/src/main/java/cn/lunadeer/dominion/utils/ConfigManager.java b/src/main/java/cn/lunadeer/dominion/managers/ConfigManager.java similarity index 99% rename from src/main/java/cn/lunadeer/dominion/utils/ConfigManager.java rename to src/main/java/cn/lunadeer/dominion/managers/ConfigManager.java index 25517da..12106ee 100644 --- a/src/main/java/cn/lunadeer/dominion/utils/ConfigManager.java +++ b/src/main/java/cn/lunadeer/dominion/managers/ConfigManager.java @@ -1,6 +1,7 @@ -package cn.lunadeer.dominion.utils; +package cn.lunadeer.dominion.managers; import cn.lunadeer.dominion.Dominion; +import cn.lunadeer.dominion.utils.XLogger; import org.bukkit.Material; import org.bukkit.configuration.file.FileConfiguration; diff --git a/src/main/java/cn/lunadeer/dominion/utils/Database.java b/src/main/java/cn/lunadeer/dominion/managers/DatabaseManager.java similarity index 99% rename from src/main/java/cn/lunadeer/dominion/utils/Database.java rename to src/main/java/cn/lunadeer/dominion/managers/DatabaseManager.java index 2d06c57..2791865 100644 --- a/src/main/java/cn/lunadeer/dominion/utils/Database.java +++ b/src/main/java/cn/lunadeer/dominion/managers/DatabaseManager.java @@ -1,10 +1,11 @@ -package cn.lunadeer.dominion.utils; +package cn.lunadeer.dominion.managers; import cn.lunadeer.dominion.Dominion; +import cn.lunadeer.dominion.utils.XLogger; import java.sql.*; -public class Database { +public class DatabaseManager { public static Connection createConnection() { try {