diff --git a/pom.xml b/pom.xml
index ce02b18..255de71 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
cn.lunadeer
Dominion
- 1.33.7-beta
+ 1.33.7-global-tp-beta
jar
Dominion
diff --git a/src/main/java/cn/lunadeer/dominion/Cache.java b/src/main/java/cn/lunadeer/dominion/Cache.java
index 9d4c30a..3f465e3 100644
--- a/src/main/java/cn/lunadeer/dominion/Cache.java
+++ b/src/main/java/cn/lunadeer/dominion/Cache.java
@@ -4,6 +4,7 @@ import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.dominion.dtos.Flag;
import cn.lunadeer.dominion.dtos.PlayerDTO;
import cn.lunadeer.dominion.dtos.PlayerPrivilegeDTO;
+import cn.lunadeer.dominion.managers.GlobalTeleport;
import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.minecraftpluginutils.ParticleRender;
import cn.lunadeer.minecraftpluginutils.Scheduler;
@@ -65,7 +66,7 @@ public class Cache {
id_dominions = new ConcurrentHashMap<>();
world_dominion_tree = new ConcurrentHashMap<>();
dominion_children = new ConcurrentHashMap<>();
- List dominions = DominionDTO.selectAll();
+ List dominions = DominionDTO.selectAllOfServer(GlobalTeleport.instance.getThisServerId());
count = dominions.size();
Map> world_dominions = new HashMap<>();
for (DominionDTO d : dominions) {
diff --git a/src/main/java/cn/lunadeer/dominion/commands/DominionOperate.java b/src/main/java/cn/lunadeer/dominion/commands/DominionOperate.java
index b63ad5f..8602b5d 100644
--- a/src/main/java/cn/lunadeer/dominion/commands/DominionOperate.java
+++ b/src/main/java/cn/lunadeer/dominion/commands/DominionOperate.java
@@ -7,6 +7,7 @@ import cn.lunadeer.dominion.controllers.DominionController;
import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.dominion.dtos.Flag;
import cn.lunadeer.dominion.dtos.PlayerPrivilegeDTO;
+import cn.lunadeer.dominion.managers.GlobalTeleport;
import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.minecraftpluginutils.Scheduler;
import cn.lunadeer.minecraftpluginutils.Teleport;
@@ -15,6 +16,7 @@ import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
+import org.jetbrains.annotations.NotNull;
import java.time.LocalDateTime;
import java.util.Map;
@@ -22,6 +24,7 @@ import java.util.Map;
import static cn.lunadeer.dominion.DominionNode.isInDominion;
import static cn.lunadeer.dominion.commands.Apis.autoPoints;
import static cn.lunadeer.dominion.commands.Apis.playerOnly;
+import static cn.lunadeer.dominion.managers.GlobalTeleport.doTp;
public class DominionOperate {
/**
@@ -357,16 +360,7 @@ public class DominionOperate {
}
if (player.isOp() && Dominion.config.getLimitOpBypass()) {
Notification.warn(sender, "你是OP,将忽略领地传送限制");
- 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.getLocation().getY(), z);
- XLogger.warn("领地 %s 没有设置传送点,将尝试传送到中心点", dominionDTO.getName());
- }
- Teleport.doTeleportSafely(player, location);
- Notification.info(player, "已将你传送到 " + dominionDTO.getName());
+ doTp(player, dominionDTO);
return;
}
if (!Dominion.config.getTpEnable()) {
@@ -418,26 +412,7 @@ public class DominionOperate {
}
Cache.instance.NextTimeAllowTeleport.put(player.getUniqueId(), now.plusSeconds(Dominion.config.getTpCoolDown()));
Scheduler.runTaskLater(() -> {
- Location location = dominionDTO.getTpLocation();
- int center_x = (dominionDTO.getX1() + dominionDTO.getX2()) / 2;
- int center_z = (dominionDTO.getZ1() + dominionDTO.getZ2()) / 2;
- World world = Dominion.instance.getServer().getWorld(dominionDTO.getWorld());
- if (location == null) {
- location = new Location(world, center_x, player.getLocation().getY(), center_z);
- XLogger.warn("领地 %s 没有设置传送点,将尝试传送到中心点", dominionDTO.getName());
- } else if (!isInDominion(dominionDTO, location)) {
- location = new Location(world, center_x, player.getLocation().getY(), center_z);
- XLogger.warn("领地 %s 传送点不在领地内,将尝试传送到中心点", dominionDTO.getName());
- }
- if (player.isOnline()) {
- Teleport.doTeleportSafely(player, location).thenAccept(b -> {
- if (b) {
- Notification.info(player, "已将你传送到 " + dominionDTO.getName());
- } else {
- Notification.error(player, "传送失败,请重试");
- }
- });
- }
+ doTp(player, dominionDTO);
}, 20L * Dominion.config.getTpDelay());
}
diff --git a/src/main/java/cn/lunadeer/dominion/dtos/DominionDTO.java b/src/main/java/cn/lunadeer/dominion/dtos/DominionDTO.java
index cd488f4..d3b88d1 100644
--- a/src/main/java/cn/lunadeer/dominion/dtos/DominionDTO.java
+++ b/src/main/java/cn/lunadeer/dominion/dtos/DominionDTO.java
@@ -2,6 +2,7 @@ package cn.lunadeer.dominion.dtos;
import cn.lunadeer.dominion.Cache;
import cn.lunadeer.dominion.Dominion;
+import cn.lunadeer.dominion.managers.GlobalTeleport;
import cn.lunadeer.minecraftpluginutils.XLogger;
import cn.lunadeer.minecraftpluginutils.databse.DatabaseManager;
import cn.lunadeer.minecraftpluginutils.databse.Field;
@@ -47,13 +48,15 @@ public class DominionDTO {
flags.put(f, rs.getBoolean(f.getFlagName()));
}
String color = rs.getString("color");
+ Integer serverId = rs.getInt("server_id");
DominionDTO dominion = new DominionDTO(id, owner, name, world, x1, y1, z1, x2, y2, z2, parentDomId,
rs.getString("join_message"),
rs.getString("leave_message"),
flags,
tp_location,
- color
+ color,
+ serverId
);
dominions.add(dominion);
}
@@ -65,6 +68,11 @@ public class DominionDTO {
return query(sql);
}
+ public static List selectAllOfServer(Integer id) {
+ String sql = "SELECT * FROM dominion WHERE id > 0 AND server_id = ?;";
+ return query(sql, id);
+ }
+
public static List selectAll(String world) {
String sql = "SELECT * FROM dominion WHERE world = ? AND id > 0;";
return query(sql, world);
@@ -123,7 +131,7 @@ public class DominionDTO {
.field(dominion.x2).field(dominion.y2).field(dominion.z2)
.field(dominion.parentDomId)
.field(dominion.joinMessage).field(dominion.leaveMessage)
- .field(dominion.tp_location);
+ .field(dominion.tp_location).field(dominion.serverId);
for (Flag f : Flag.getDominionFlagsEnabled()) {
insert.field(new Field(f.getFlagName(), f.getDefaultValue()));
}
@@ -150,7 +158,7 @@ public class DominionDTO {
String joinMessage, String leaveMessage,
Map flags,
String tp_location,
- String color) {
+ String color, Integer serverId) {
this.id.value = id;
this.owner.value = owner.toString();
this.name.value = name;
@@ -167,6 +175,7 @@ public class DominionDTO {
this.flags.putAll(flags);
this.tp_location.value = tp_location;
this.color.value = color;
+ this.serverId.value = serverId;
}
@@ -207,7 +216,7 @@ public class DominionDTO {
private final Map flags = new HashMap<>();
private final Field tp_location = new Field("tp_location", "default");
private final Field color = new Field("color", "#00BFFF");
-
+ private final Field serverId = new Field("server_id", GlobalTeleport.instance.getThisServerId());
// getters and setters
public Integer getId() {
@@ -423,4 +432,12 @@ public class DominionDTO {
public String getColor() {
return (String) color.value;
}
+
+ public Integer getServerId() {
+ return (Integer) serverId.value;
+ }
+
+ public String getServerName() {
+ return GlobalTeleport.instance.getServerName(getServerId());
+ }
}
diff --git a/src/main/java/cn/lunadeer/dominion/dtos/ServerInfoDTO.java b/src/main/java/cn/lunadeer/dominion/dtos/ServerInfoDTO.java
index bf4be2a..f48490f 100644
--- a/src/main/java/cn/lunadeer/dominion/dtos/ServerInfoDTO.java
+++ b/src/main/java/cn/lunadeer/dominion/dtos/ServerInfoDTO.java
@@ -28,20 +28,8 @@ public class ServerInfoDTO {
return (String) name.value;
}
- private static void initTable() {
- TableColumn server_info_id = new TableColumn("id", FieldType.INT, true, true, true, true, 0);
- TableColumn server_info_name = new TableColumn("name", FieldType.STRING, false, false, true, false, "server");
- CreateTable privilege_template = new CreateTable().ifNotExists();
- privilege_template.table("server_info")
- .field(server_info_id)
- .field(server_info_name);
- privilege_template.execute();
- }
-
public static ServerInfoDTO initServerInfo(JavaPlugin plugin, File se) {
- initTable();
-
ServerInfoDTO serverInfoDTO = new ServerInfoDTO();
serverInfoDTO.name.value = plugin.getServer().getName();
InsertRow insertRow = new InsertRow();
diff --git a/src/main/java/cn/lunadeer/dominion/managers/DatabaseTables.java b/src/main/java/cn/lunadeer/dominion/managers/DatabaseTables.java
index f141507..5232fa4 100644
--- a/src/main/java/cn/lunadeer/dominion/managers/DatabaseTables.java
+++ b/src/main/java/cn/lunadeer/dominion/managers/DatabaseTables.java
@@ -1,6 +1,8 @@
package cn.lunadeer.dominion.managers;
+import cn.lunadeer.dominion.Dominion;
import cn.lunadeer.dominion.dtos.Flag;
+import cn.lunadeer.minecraftpluginutils.databse.DatabaseManager;
import cn.lunadeer.minecraftpluginutils.databse.Field;
import cn.lunadeer.minecraftpluginutils.databse.FieldType;
import cn.lunadeer.minecraftpluginutils.databse.TableColumn;
@@ -155,5 +157,25 @@ public class DatabaseTables {
// 1.31.6
TableColumn dominion_color = new TableColumn("color", FieldType.STRING, false, false, true, false, "'#00BFFF'");
new AddColumn(dominion_color).table("dominion").ifNotExists().execute();
+
+ // global teleport
+ TableColumn server_info_id = new TableColumn("id", FieldType.INT, true, true, true, true, 0);
+ TableColumn server_info_name = new TableColumn("name", FieldType.STRING, false, false, true, false, "server");
+ CreateTable server_info = new CreateTable().ifNotExists();
+ server_info.table("server_info")
+ .field(server_info_id)
+ .field(server_info_name);
+ server_info.execute();
+ new GlobalTeleport(Dominion.instance); // init server info
+ TableColumn server_id = new TableColumn("server_id", FieldType.INT, false, false, true, false, GlobalTeleport.instance.getThisServerId());
+ new AddColumn(server_id).table("dominion").ifNotExists().execute();
+
+ TableColumn bc_tp_cache_player_uuid = new TableColumn("player_uuid", FieldType.STRING, false, false, true, true, "''");
+ TableColumn bc_tp_cache_dom_id = new TableColumn("dom_id", FieldType.INT, false, false, true, false, -1);
+ CreateTable bc_tp_cache = new CreateTable().ifNotExists();
+ bc_tp_cache.table("bc_tp_cache")
+ .field(bc_tp_cache_player_uuid)
+ .field(bc_tp_cache_dom_id);
+ bc_tp_cache.execute();
}
}
diff --git a/src/main/java/cn/lunadeer/dominion/managers/GlobalTeleport.java b/src/main/java/cn/lunadeer/dominion/managers/GlobalTeleport.java
index 6cb3df8..8faf6a8 100644
--- a/src/main/java/cn/lunadeer/dominion/managers/GlobalTeleport.java
+++ b/src/main/java/cn/lunadeer/dominion/managers/GlobalTeleport.java
@@ -1,15 +1,35 @@
package cn.lunadeer.dominion.managers;
+import cn.lunadeer.dominion.Dominion;
+import cn.lunadeer.dominion.commands.DominionOperate;
+import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.dominion.dtos.ServerInfoDTO;
+import cn.lunadeer.minecraftpluginutils.Notification;
+import cn.lunadeer.minecraftpluginutils.Teleport;
+import cn.lunadeer.minecraftpluginutils.XLogger;
+import cn.lunadeer.minecraftpluginutils.databse.DatabaseManager;
+import cn.lunadeer.minecraftpluginutils.databse.Field;
+import cn.lunadeer.minecraftpluginutils.databse.syntax.InsertRow;
+import com.google.common.io.ByteArrayDataOutput;
+import com.google.common.io.ByteStreams;
+import org.bukkit.Location;
+import org.bukkit.World;
import org.bukkit.entity.Player;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.plugin.messaging.PluginMessageListener;
import org.jetbrains.annotations.NotNull;
+import javax.xml.crypto.Data;
import java.io.File;
+import java.sql.ResultSet;
import java.util.Map;
-public class GlobalTeleport implements PluginMessageListener {
+import static cn.lunadeer.dominion.DominionNode.isInDominion;
+
+public class GlobalTeleport implements PluginMessageListener, Listener {
public static GlobalTeleport instance;
@@ -22,6 +42,7 @@ public class GlobalTeleport implements PluginMessageListener {
File infoFile = new File(plugin.getDataFolder(), "server_info.json");
this.plugin.getServer().getMessenger().registerOutgoingPluginChannel(this.plugin, "BungeeCord");
this.plugin.getServer().getMessenger().registerIncomingPluginChannel(this.plugin, "BungeeCord", this);
+ this.plugin.getServer().getPluginManager().registerEvents(this, this.plugin);
instance = this;
if (!infoFile.exists()) {
@@ -36,6 +57,10 @@ public class GlobalTeleport implements PluginMessageListener {
return thisServerInfo.getName();
}
+ public int getThisServerId() {
+ return thisServerInfo.getId();
+ }
+
public String getServerName(int id) {
return allServerInfo.get(id);
}
@@ -52,4 +77,73 @@ public class GlobalTeleport implements PluginMessageListener {
public void onPluginMessageReceived(@NotNull String channel, @NotNull Player player, @NotNull byte[] message) {
}
+
+ private void teleportToServer(Player player, DominionDTO dominionDTO) {
+ Field player_uuid = new Field("player_uuid", player.getUniqueId().toString());
+ Field dom_id = new Field("dom_id", dominionDTO.getId());
+ InsertRow addCache = new InsertRow();
+ addCache.field(player_uuid)
+ .field(dom_id)
+ .onConflictOverwrite(player_uuid)
+ .table("bc_tp_cache");
+ addCache.execute();
+ ByteArrayDataOutput out = ByteStreams.newDataOutput();
+ out.writeUTF("Connect");
+ out.writeUTF(dominionDTO.getServerName());
+ player.sendPluginMessage(plugin, "BungeeCord", out.toByteArray());
+ }
+
+ @EventHandler
+ public void onJoin(PlayerJoinEvent event) {
+ Player player = event.getPlayer();
+ String sql = "SELECT dom_id FROM bc_tp_cache WHERE player_uuid = ?";
+ int dominionId;
+ try (ResultSet res = DatabaseManager.instance.query(sql, player.getUniqueId().toString())) {
+ if (res.next()) {
+ dominionId = res.getInt("dom_id");
+ } else {
+ XLogger.debug("玩家 %s 没有传送缓存", player.getName());
+ return;
+ }
+ } catch (Exception e) {
+ DatabaseManager.handleDatabaseError("获取玩家的传送缓存失败", e, sql);
+ return;
+ }
+ DominionDTO dominionDTO = DominionDTO.select(dominionId);
+ if (dominionDTO == null) {
+ Notification.error(player, "无法获取目标领地信息");
+ } else {
+ doTp(player, dominionDTO);
+ }
+ sql = "DELETE FROM bc_tp_cache WHERE player_uuid = ?";
+ DatabaseManager.instance.query(sql, player.getUniqueId().toString());
+ }
+
+ public static void doTp(@NotNull Player player, @NotNull DominionDTO dominionDTO) {
+ if (dominionDTO.getServerId() != GlobalTeleport.instance.getThisServerId()) {
+ GlobalTeleport.instance.teleportToServer(player, dominionDTO);
+ return;
+ }
+
+ Location location = dominionDTO.getTpLocation();
+ int center_x = (dominionDTO.getX1() + dominionDTO.getX2()) / 2;
+ int center_z = (dominionDTO.getZ1() + dominionDTO.getZ2()) / 2;
+ World world = Dominion.instance.getServer().getWorld(dominionDTO.getWorld());
+ if (location == null) {
+ location = new Location(world, center_x, player.getLocation().getY(), center_z);
+ XLogger.warn("领地 %s 没有设置传送点,将尝试传送到中心点", dominionDTO.getName());
+ } else if (!isInDominion(dominionDTO, location)) {
+ location = new Location(world, center_x, player.getLocation().getY(), center_z);
+ XLogger.warn("领地 %s 传送点不在领地内,将尝试传送到中心点", dominionDTO.getName());
+ }
+ if (player.isOnline()) {
+ Teleport.doTeleportSafely(player, location).thenAccept(b -> {
+ if (b) {
+ Notification.info(player, "已将你传送到 " + dominionDTO.getName());
+ } else {
+ Notification.error(player, "传送失败,请重试");
+ }
+ });
+ }
+ }
}