diff --git a/pom.xml b/pom.xml
index a9048b8f..527163bb 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 ebc1fe1e..07412741 100644
--- a/src/main/java/cn/lunadeer/dominion/Dominion.java
+++ b/src/main/java/cn/lunadeer/dominion/Dominion.java
@@ -3,7 +3,11 @@
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 void onEnable() {
// 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 ffa8ab11..d311bd28 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.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 static void teleportToDominion(CommandSender sender, String[] args) {
}
}
- 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 static void teleportToDominion(CommandSender sender, String[] args) {
}
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 8991aff7..407351f8 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 @@
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 39d1205e..b84dbac2 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 PlayerDTO onJoin() {
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 a09dd216..8a3a21a8 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 PlayerPrivilegeDTO(UUID playerUUID, Integer domID,
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 25517da8..12106ee7 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 2d06c576..2791865a 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 {