From 7d2862290475c8436b18de5001a5457458f31cc4 Mon Sep 17 00:00:00 2001 From: zhangyuheng Date: Wed, 12 Jun 2024 15:36:06 +0800 Subject: [PATCH 01/26] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=83=A8=E5=88=86?= =?UTF-8?q?=E8=8F=9C=E5=8D=95=E5=91=BD=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- src/main/java/cn/lunadeer/dominion/tuis/Menu.java | 2 +- src/main/java/cn/lunadeer/dominion/tuis/TemplateList.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index 3d4700e..cc02eea 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ cn.lunadeer Dominion - 1.31.1-beta + 1.31.2-beta jar Dominion diff --git a/src/main/java/cn/lunadeer/dominion/tuis/Menu.java b/src/main/java/cn/lunadeer/dominion/tuis/Menu.java index f719426..014a4a6 100644 --- a/src/main/java/cn/lunadeer/dominion/tuis/Menu.java +++ b/src/main/java/cn/lunadeer/dominion/tuis/Menu.java @@ -30,7 +30,7 @@ public class Menu { .append(Button.create("我的领地").setExecuteCommand("/dominion list").build()) .append("查看我的领地"); Line template = Line.create() - .append(Button.create("权限模板").setExecuteCommand("/dominion template_list").build()) + .append(Button.create("模板列表").setExecuteCommand("/dominion template_list").build()) .append("成员权限模板列表"); Line help = Line.create() .append(Button.create("指令帮助").setExecuteCommand("/dominion help").build()) diff --git a/src/main/java/cn/lunadeer/dominion/tuis/TemplateList.java b/src/main/java/cn/lunadeer/dominion/tuis/TemplateList.java index 8dce339..baad9ad 100644 --- a/src/main/java/cn/lunadeer/dominion/tuis/TemplateList.java +++ b/src/main/java/cn/lunadeer/dominion/tuis/TemplateList.java @@ -31,7 +31,7 @@ public class TemplateList { view.add(Line.create().append(create.build())); for (PrivilegeTemplateDTO template : templates) { - Button manage = Button.createGreen("管理").setExecuteCommand("/dominion template_manage " + template.getName()); + Button manage = Button.createGreen("配置").setExecuteCommand("/dominion template_manage " + template.getName()); Button delete = Button.createRed("删除").setExecuteCommand("/dominion template_delete " + template.getName()); Line line = Line.create() .append(delete.build()) From dc50603a91bcf41193cc02c48f69e297d10e9a8f Mon Sep 17 00:00:00 2001 From: zhangyuheng Date: Wed, 12 Jun 2024 16:07:09 +0800 Subject: [PATCH 02/26] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=91=8A=E7=A4=BA?= =?UTF-8?q?=E7=89=8C=E7=BC=96=E8=BE=91=E6=9D=83=E9=99=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- src/main/java/cn/lunadeer/dominion/dtos/Flag.java | 5 +++-- .../java/cn/lunadeer/dominion/events/PlayerEvents.java | 8 ++++++++ 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index cc02eea..8775157 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ cn.lunadeer Dominion - 1.31.2-beta + 1.31.3-beta jar Dominion diff --git a/src/main/java/cn/lunadeer/dominion/dtos/Flag.java b/src/main/java/cn/lunadeer/dominion/dtos/Flag.java index b491d33..9f93714 100644 --- a/src/main/java/cn/lunadeer/dominion/dtos/Flag.java +++ b/src/main/java/cn/lunadeer/dominion/dtos/Flag.java @@ -26,9 +26,10 @@ public enum Flag { CONTAINER("container", "一般容器", "包含:箱子/木桶/潜影盒/盔甲架/展示框", false, false, true), CRAFT("craft", "使用工作台", "是否可以使用工作台", false, false, true), CREEPER_EXPLODE("creeper_explode", "实体爆炸", "包含:苦力怕/凋零头颅/水晶爆炸", false, true, true), - COMPARER("comparer", "比较器交互", "是否可以与比较器交互", false, false, true), + COMPARER("comparer", "比较器交互", "是否可以修改比较器状态", false, false, true), DOOR("door", "门交互", "是否可以使用各种材质的门(包括活板门)", false, false, true), DYE("dye", "染色", "是否可以使用染料(对羊、狗项圈、猫项圈)染色", false, false, true), + EDIT_SIGN("edit_sign", "编辑告示牌", "是否可以编辑告示牌", false, false, true), EGG("egg", "扔鸡蛋", "是否可以扔鸡蛋", false, false, true), ENCHANT("enchant", "使用附魔台", "是否可以使用附魔台", false, false, true), ENDER_MAN("ender_man", "末影人行为", "包含:末影人是否可以生成、瞬移", false, true, true), @@ -41,7 +42,7 @@ public enum Flag { HARVEST("harvest", "收获", "收获庄稼、作物", false, false, true), HONEY("honey", "蜂巢交互", "是否可以采蜂蜜", false, false, true), HOOK("hook", "使用钓钩", "是否可以使用钓钩", false, false, true), - HOPPER("hopper", "特殊容器", "包含:漏斗/熔炉/发射器等", false, false, true), + HOPPER("hopper", "特殊容器", "包含:漏斗/熔炉/发射器/投掷器/高炉/烟熏炉", false, false, true), IGNITE("ignite", "点燃", "是否可以使用打火石点火", false, false, true), LEVER("lever", "使用拉杆", "是否可以使用拉杆", false, false, true), MOB_DROP_ITEM("mob_drop_item", "生物战利品掉落", "生物死亡时是否产生凋落物", true, true, true), diff --git a/src/main/java/cn/lunadeer/dominion/events/PlayerEvents.java b/src/main/java/cn/lunadeer/dominion/events/PlayerEvents.java index 6e26275..e182a60 100644 --- a/src/main/java/cn/lunadeer/dominion/events/PlayerEvents.java +++ b/src/main/java/cn/lunadeer/dominion/events/PlayerEvents.java @@ -16,6 +16,7 @@ import org.bukkit.event.Listener; import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.block.BlockIgniteEvent; import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.block.SignChangeEvent; import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.event.entity.EntityPlaceEvent; import org.bukkit.event.entity.ProjectileLaunchEvent; @@ -349,6 +350,13 @@ public class PlayerEvents implements Listener { checkFlag(dom, Flag.DYE, player, event); } + @EventHandler(priority = EventPriority.HIGHEST) // edit sign + public void onSignEdit(SignChangeEvent event) { + Player player = event.getPlayer(); + DominionDTO dom = Cache.instance.getDominion(event.getBlock().getLocation()); + checkFlag(dom, Flag.EDIT_SIGN, player, event); + } + @EventHandler(priority = EventPriority.HIGHEST) // egg public void onThrowingEgg(ProjectileLaunchEvent event) { if (!(event.getEntity().getShooter() instanceof Player)) { From d492663e8dea6372205aac2559de9502670b5277 Mon Sep 17 00:00:00 2001 From: zhangyuheng Date: Wed, 12 Jun 2024 23:42:37 +0800 Subject: [PATCH 03/26] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BA=86=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E5=8F=91=E5=85=89=E3=80=81=E9=A3=9E=E8=A1=8C=E6=9D=83?= =?UTF-8?q?=E9=99=90=E6=97=B6=E6=97=A0=E6=B3=95=E7=AB=8B=E5=8D=B3=E7=94=9F?= =?UTF-8?q?=E6=95=88=E5=8F=AA=E6=9C=89=E9=87=8D=E6=96=B0=E8=BF=9B=E5=87=BA?= =?UTF-8?q?=E9=A2=86=E5=9C=B0=E6=89=8D=E4=BC=9A=E7=94=9F=E6=95=88=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 4 ++-- src/main/java/cn/lunadeer/dominion/Cache.java | 19 +++++++++---------- .../java/cn/lunadeer/dominion/Dominion.java | 4 +++- 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/pom.xml b/pom.xml index 8775157..9a91d37 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ cn.lunadeer Dominion - 1.31.3-beta + 1.31.4-beta jar Dominion @@ -82,7 +82,7 @@ cn.lunadeer MinecraftPluginUtils - 1.3.1-SNAPSHOT + 1.3.2-SNAPSHOT com.github.BlueMap-Minecraft diff --git a/src/main/java/cn/lunadeer/dominion/Cache.java b/src/main/java/cn/lunadeer/dominion/Cache.java index ce65544..86b76fd 100644 --- a/src/main/java/cn/lunadeer/dominion/Cache.java +++ b/src/main/java/cn/lunadeer/dominion/Cache.java @@ -71,6 +71,7 @@ public class Cache { world_dominion_tree.put(entry.getKey(), DominionNode.BuildNodeTree(-1, entry.getValue())); } BlueMapConnect.render(); + recheckPlayerState = true; _last_update_dominion.set(System.currentTimeMillis()); } @@ -106,6 +107,7 @@ public class Cache { } player_uuid_to_privilege.get(player_uuid).put(privilege.getDomID(), privilege); } + recheckPlayerState = true; _last_update_privilege.set(System.currentTimeMillis()); } @@ -127,6 +129,11 @@ public class Cache { if (isInDominion(last_dominion, player)) { if (dominion_children.get(last_in_dom_id) == null || dominion_children.get(last_in_dom_id).size() == 0) { // 如果玩家仍在领地内,且领地没有子领地,则直接返回 + if (recheckPlayerState) { + lightOrNot(player, last_dominion); + flyOrNot(player, last_dominion); + recheckPlayerState = false; + } return last_dominion; } } @@ -137,19 +144,11 @@ public class Cache { return last_dominion; } if (last_dom_id != -1) { -// if (last_dominion.getParentDomId() == -1) -// Notification.info(player, "您已离开领地:%s", last_dominion.getName()); -// else -// Notification.info(player, "您已离开子领地:%s", last_dominion.getName()); String msg = last_dominion.getLeaveMessage(); msg = msg.replace("${DOM_NAME}", last_dominion.getName()); Notification.actionBar(player, msg); } if (current_dom_id != -1) { -// if (current_dominion.getParentDomId() == -1) -// Notification.info(player, "您正在进入领地:%s", current_dominion.getName()); -// else -// Notification.info(player, "您正在进入子领地:%s", current_dominion.getName()); String msg = current_dominion.getJoinMessage(); msg = msg.replace("${DOM_NAME}", current_dominion.getName()); Notification.actionBar(player, msg); @@ -315,7 +314,7 @@ public class Cache { private final AtomicBoolean _update_dominion_is_scheduled = new AtomicBoolean(false); private final AtomicLong _last_update_privilege = new AtomicLong(0); private final AtomicBoolean _update_privilege_is_scheduled = new AtomicBoolean(false); - private static final long UPDATE_INTERVAL = 1000 * 4; - + private static final long UPDATE_INTERVAL = 1000 * 5; + private boolean recheckPlayerState = false; // 是否需要重新检查玩家状态(发光、飞行) public final Map NextTimeAllowTeleport = new java.util.HashMap<>(); } diff --git a/src/main/java/cn/lunadeer/dominion/Dominion.java b/src/main/java/cn/lunadeer/dominion/Dominion.java index 03878ae..23dd2d4 100644 --- a/src/main/java/cn/lunadeer/dominion/Dominion.java +++ b/src/main/java/cn/lunadeer/dominion/Dominion.java @@ -37,7 +37,9 @@ public final class Dominion extends JavaPlugin { new Scheduler(this); AutoClean.run(); Cache.instance = new Cache(); - new VaultConnect(this); + if (config.getEconomyEnable()) { + new VaultConnect(this); + } Bukkit.getPluginManager().registerEvents(new PlayerEvents(), this); Bukkit.getPluginManager().registerEvents(new EnvironmentEvents(), this); From 78095df43ad7dd4711ce71db4d2c152a2d7025e2 Mon Sep 17 00:00:00 2001 From: zhangyuheng Date: Wed, 12 Jun 2024 23:43:40 +0800 Subject: [PATCH 04/26] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BA=86=E5=BD=93?= =?UTF-8?q?=E5=85=B3=E9=97=AD=E9=A2=86=E5=9C=B0=E4=BC=A0=E9=80=81=E6=97=B6?= =?UTF-8?q?=E6=8B=A5=E6=9C=89=E8=80=85=E4=B9=9F=E6=97=A0=E6=B3=95=E4=BC=A0?= =?UTF-8?q?=E9=80=81=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dominion/commands/DominionOperate.java | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/main/java/cn/lunadeer/dominion/commands/DominionOperate.java b/src/main/java/cn/lunadeer/dominion/commands/DominionOperate.java index d06ef4f..6607558 100644 --- a/src/main/java/cn/lunadeer/dominion/commands/DominionOperate.java +++ b/src/main/java/cn/lunadeer/dominion/commands/DominionOperate.java @@ -375,15 +375,17 @@ public class DominionOperate { } PlayerPrivilegeDTO privilegeDTO = PlayerPrivilegeDTO.select(player.getUniqueId(), dominionDTO.getId()); - if (privilegeDTO == null) { - if (!dominionDTO.getFlagValue(Flag.TELEPORT)) { - Notification.error(sender, "此领地禁止传送"); - return; - } - } else { - if (!privilegeDTO.getFlagValue(Flag.TELEPORT)) { - Notification.error(sender, "你不被允许传送到这个领地"); - return; + if (!player.getUniqueId().equals(dominionDTO.getOwner())) { // 领地所有人可以传送到自己的领地 + if (privilegeDTO == null) { + if (!dominionDTO.getFlagValue(Flag.TELEPORT)) { + Notification.error(sender, "此领地禁止传送"); + return; + } + } else { + if (!privilegeDTO.getFlagValue(Flag.TELEPORT)) { + Notification.error(sender, "你不被允许传送到这个领地"); + return; + } } } From 7328e9aff1c8ed7be5b47ab0fca75e0df75432d8 Mon Sep 17 00:00:00 2001 From: zhangyuheng Date: Fri, 14 Jun 2024 14:17:30 +0800 Subject: [PATCH 05/26] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BA=86=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=BA=93=E8=BF=9E=E6=8E=A5=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- src/main/java/cn/lunadeer/dominion/Dominion.java | 2 +- .../java/cn/lunadeer/dominion/managers/ConfigManager.java | 7 ------- 3 files changed, 2 insertions(+), 9 deletions(-) diff --git a/pom.xml b/pom.xml index 9a91d37..d78c077 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ cn.lunadeer Dominion - 1.31.4-beta + 1.31.5-beta jar Dominion diff --git a/src/main/java/cn/lunadeer/dominion/Dominion.java b/src/main/java/cn/lunadeer/dominion/Dominion.java index 23dd2d4..16417bc 100644 --- a/src/main/java/cn/lunadeer/dominion/Dominion.java +++ b/src/main/java/cn/lunadeer/dominion/Dominion.java @@ -27,7 +27,7 @@ public final class Dominion extends JavaPlugin { config = new ConfigManager(this); XLogger.setDebug(config.isDebug()); database = new DatabaseManager(this, - config.getDbType().equals("pgsql") ? DatabaseManager.TYPE.POSTGRESQL : DatabaseManager.TYPE.SQLITE, + DatabaseManager.TYPE.valueOf(config.getDbType().toUpperCase()), config.getDbHost(), config.getDbPort(), config.getDbName(), diff --git a/src/main/java/cn/lunadeer/dominion/managers/ConfigManager.java b/src/main/java/cn/lunadeer/dominion/managers/ConfigManager.java index a5a225a..42e3c15 100644 --- a/src/main/java/cn/lunadeer/dominion/managers/ConfigManager.java +++ b/src/main/java/cn/lunadeer/dominion/managers/ConfigManager.java @@ -22,10 +22,6 @@ public class ConfigManager { _debug = _file.getBoolean("Debug", false); XLogger.setDebug(_debug); _db_type = _file.getString("Database.Type", "sqlite"); - if (!_db_type.equals("pgsql") && !_db_type.equals("sqlite")) { - XLogger.err("当前数据库只支持 pgsql 或 sqlite,已重置为 sqlite"); - setDbType("sqlite"); - } _db_host = _file.getString("Database.Host", "localhost"); _db_port = _file.getString("Database.Port", "5432"); _db_name = _file.getString("Database.Name", "dominion"); @@ -171,9 +167,6 @@ public class ConfigManager { } public String getDbPass() { - if (_db_pass.contains("@")) { - setDbPass("'" + _db_pass + "'"); - } return _db_pass; } From 4bd817bd84329ce8e9a9e970cad7a04735812c7a Mon Sep 17 00:00:00 2001 From: zhangyuheng Date: Mon, 17 Jun 2024 10:31:25 +0800 Subject: [PATCH 06/26] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E4=BA=86=E5=8D=AB?= =?UTF-8?q?=E6=98=9F=E5=9C=B0=E5=9B=BE=E8=87=AA=E5=AE=9A=E4=B9=89=E8=89=B2?= =?UTF-8?q?=E5=9D=97=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- .../cn/lunadeer/dominion/BlueMapConnect.java | 12 ++--- .../java/cn/lunadeer/dominion/Commands.java | 13 ++++- .../dominion/commands/DominionOperate.java | 21 ++++++++ .../controllers/DominionController.java | 42 ++++++++++++++++ .../lunadeer/dominion/cuis/SetMapColor.java | 49 +++++++++++++++++++ .../lunadeer/dominion/dtos/DominionDTO.java | 46 +++++++++++++---- .../dominion/managers/DatabaseTables.java | 3 ++ .../dominion/tuis/DominionManage.java | 15 +++++- 9 files changed, 184 insertions(+), 19 deletions(-) create mode 100644 src/main/java/cn/lunadeer/dominion/cuis/SetMapColor.java diff --git a/pom.xml b/pom.xml index d78c077..df18227 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ cn.lunadeer Dominion - 1.31.5-beta + 1.31.6-beta jar Dominion diff --git a/src/main/java/cn/lunadeer/dominion/BlueMapConnect.java b/src/main/java/cn/lunadeer/dominion/BlueMapConnect.java index f061af8..0622a40 100644 --- a/src/main/java/cn/lunadeer/dominion/BlueMapConnect.java +++ b/src/main/java/cn/lunadeer/dominion/BlueMapConnect.java @@ -43,12 +43,12 @@ public class BlueMapConnect { double z = vectors.iterator().next().getY(); double y = dominion.getY1(); - Color line = new Color(0, 191, 255, 0.8F); - Color fill = new Color(0, 191, 255, 0.2F); - if (dominion.getParentDomId() != -1) { // for children dominion - line = new Color(240, 230, 140, 0.8F); - fill = new Color(240, 230, 140, 0.2F); - } + int r = dominion.getColorR(); + int g = dominion.getColorG(); + int b = dominion.getColorB(); + + Color line = new Color(r, g, b, 0.8F); + Color fill = new Color(r, g, b, 0.2F); ExtrudeMarker marker = ExtrudeMarker.builder() .label(dominion.getName()) .position(x, y, z) diff --git a/src/main/java/cn/lunadeer/dominion/Commands.java b/src/main/java/cn/lunadeer/dominion/Commands.java index 6b1699c..8f9dca3 100644 --- a/src/main/java/cn/lunadeer/dominion/Commands.java +++ b/src/main/java/cn/lunadeer/dominion/Commands.java @@ -174,6 +174,9 @@ public class Commands implements TabExecutor { case "select_template": SelectTemplate.show(sender, args); break; + case "set_map_color": + DominionOperate.setMapColor(sender, args); + break; // ---=== CUI ===--- case "cui_rename": RenameDominion.open(sender, args); @@ -193,6 +196,9 @@ public class Commands implements TabExecutor { case "cui_template_create": CreateTemplate.open(sender, args); break; + case "cui_set_map_color": + SetMapColor.open(sender, args); + break; default: return false; } @@ -233,7 +239,9 @@ public class Commands implements TabExecutor { "template_manage", "template_delete", "template_create", - "template_set_flag" + "template_set_flag", + "all_dominion", + "set_map_color" ); } if (args.length == 2) { @@ -281,6 +289,8 @@ public class Commands implements TabExecutor { return allTemplates(sender); case "template_create": return Collections.singletonList("输入模板名称"); + case "set_map_color": + return Collections.singletonList("输入颜色(16进制)"); } } if (args.length == 3) { @@ -300,6 +310,7 @@ public class Commands implements TabExecutor { case "set_enter_msg": case "set_leave_msg": case "apply_template": + case "set_map_color": return playerDominions(sender); case "rename": return Collections.singletonList("输入新领地名称"); diff --git a/src/main/java/cn/lunadeer/dominion/commands/DominionOperate.java b/src/main/java/cn/lunadeer/dominion/commands/DominionOperate.java index 6607558..b9b28f6 100644 --- a/src/main/java/cn/lunadeer/dominion/commands/DominionOperate.java +++ b/src/main/java/cn/lunadeer/dominion/commands/DominionOperate.java @@ -428,4 +428,25 @@ public class DominionOperate { } }, 20L * Dominion.config.getTpDelay()); } + + /** + * 设置领地卫星地图地块颜色 + * + * @param sender 命令发送者 + * @param args 命令参数 + */ + public static void setMapColor(CommandSender sender, String[] args) { + Player player = playerOnly(sender); + if (player == null) return; + if (args.length < 2) { + Notification.error(sender, "用法: /dominion set_map_color <颜色> [领地名称]"); + return; + } + BukkitPlayerOperator operator = BukkitPlayerOperator.create(player); + if (args.length == 2) { + DominionController.setMapColor(operator, args[1]); + } else { + DominionController.setMapColor(operator, args[1], args[2]); + } + } } diff --git a/src/main/java/cn/lunadeer/dominion/controllers/DominionController.java b/src/main/java/cn/lunadeer/dominion/controllers/DominionController.java index ca0a874..79ae057 100644 --- a/src/main/java/cn/lunadeer/dominion/controllers/DominionController.java +++ b/src/main/java/cn/lunadeer/dominion/controllers/DominionController.java @@ -655,6 +655,48 @@ public class DominionController { operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "成功将领地 %s 及其所有子领地转让给 %s", dom_name, player_name)); } + /** + * 设置领地的卫星地图地块颜色 + * + * @param operator 操作者 + * @param color 16进制颜色 例如 #ff0000 + * @param dom_name 领地名称 + */ + public static void setMapColor(AbstractOperator operator, String color, String dom_name) { + AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "设置领地地图颜色失败"); + DominionDTO dominion = getExistDomAndIsOwner(operator, dom_name); + if (dominion == null) { + return; + } + if (notOwner(operator, dominion)) { + operator.setResponse(FAIL.addMessage("你不是领地 %s 的拥有者", dom_name)); + return; + } + color = color.toUpperCase(); // 转换为大写 + if (!color.matches("^#[0-9a-fA-F]{6}$")) { + operator.setResponse(FAIL.addMessage("颜色格式不正确")); + return; + } + dominion.setColor(color); + operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "成功设置领地 %s 的卫星地图颜色为 %s", dom_name, color)); + } + + /** + * 设置领地的卫星地图地块颜色 + * + * @param operator 操作者 + * @param color 16进制颜色 例如 #ff0000 + */ + public static void setMapColor(AbstractOperator operator, String color) { + AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "设置领地地图颜色失败"); + DominionDTO dominion = getPlayerCurrentDominion(operator); + if (dominion == null) { + operator.setResponse(FAIL.addMessage("无法获取你所处的领地,请指定名称")); + return; + } + setMapColor(operator, color, dominion.getName()); + } + /** * 判断两个领地是否相交 */ diff --git a/src/main/java/cn/lunadeer/dominion/cuis/SetMapColor.java b/src/main/java/cn/lunadeer/dominion/cuis/SetMapColor.java new file mode 100644 index 0000000..c177bc5 --- /dev/null +++ b/src/main/java/cn/lunadeer/dominion/cuis/SetMapColor.java @@ -0,0 +1,49 @@ +package cn.lunadeer.dominion.cuis; + +import cn.lunadeer.dominion.controllers.BukkitPlayerOperator; +import cn.lunadeer.dominion.controllers.DominionController; +import cn.lunadeer.dominion.dtos.DominionDTO; +import cn.lunadeer.dominion.tuis.DominionManage; +import cn.lunadeer.minecraftpluginutils.Notification; +import cn.lunadeer.minecraftpluginutils.XLogger; +import cn.lunadeer.minecraftpluginutils.scui.CuiTextInput; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import static cn.lunadeer.dominion.commands.Apis.playerOnly; + +public class SetMapColor { + + private static class setMapColorCB implements CuiTextInput.InputCallback { + private final Player sender; + private final String dominionName; + + public setMapColorCB(Player sender, String dominionName) { + this.sender = sender; + this.dominionName = dominionName; + } + + @Override + public void handleData(String input) { + XLogger.debug("editLeaveMessageCB.run: %s", input); + BukkitPlayerOperator operator = BukkitPlayerOperator.create(sender); + DominionController.setMapColor(operator, input, dominionName); + DominionManage.show(sender, new String[]{"manage", dominionName}); + } + } + + public static void open(CommandSender sender, String[] args) { + Player player = playerOnly(sender); + if (player == null) return; + DominionDTO dominion = DominionDTO.select(args[1]); + if (dominion == null) { + Notification.error(sender, "领地不存在"); + return; + } + CuiTextInput.InputCallback setMapColorCB = new SetMapColor.setMapColorCB(player, dominion.getName()); + CuiTextInput view = CuiTextInput.create(setMapColorCB).setText(dominion.getColor()).title("输入卫星地图地块颜色(16进制)"); + view.setSuggestCommand("/dominion set_map_color <颜色> [领地名称]"); + view.open(player); + } + +} diff --git a/src/main/java/cn/lunadeer/dominion/dtos/DominionDTO.java b/src/main/java/cn/lunadeer/dominion/dtos/DominionDTO.java index 08f8089..2f3a548 100644 --- a/src/main/java/cn/lunadeer/dominion/dtos/DominionDTO.java +++ b/src/main/java/cn/lunadeer/dominion/dtos/DominionDTO.java @@ -6,9 +6,11 @@ import cn.lunadeer.minecraftpluginutils.XLogger; import org.bukkit.Location; import org.bukkit.World; +import java.awt.*; import java.sql.ResultSet; import java.sql.SQLException; import java.util.*; +import java.util.List; public class DominionDTO { private static List query(String sql, Object... args) { @@ -36,12 +38,14 @@ public class DominionDTO { for (Flag f : Flag.getDominionFlagsEnabled()) { flags.put(f, rs.getBoolean(f.getFlagName())); } + String color = rs.getString("color"); 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 + tp_location, + color ); dominions.add(dominion); } @@ -148,7 +152,7 @@ public class DominionDTO { Location loc = dominion.getTpLocation(); tp_location = loc.getBlockX() + ":" + loc.getBlockY() + ":" + loc.getBlockZ(); } - String sql = "UPDATE dominion SET " + + StringBuilder sql = new StringBuilder("UPDATE dominion SET " + "owner = ?," + "name = ?," + "world = ?," + @@ -160,19 +164,19 @@ public class DominionDTO { "z2 = " + dominion.getZ2() + ", " + "parent_dom_id = " + dominion.getParentDomId() + ", " + "join_message = ?," + - "leave_message = ?,"; + "leave_message = ?," + + "color = ?,"); for (Flag f : Flag.getDominionFlagsEnabled()) { - sql += f.getFlagName() + " = " + dominion.getFlagValue(f) + ","; + sql.append(f.getFlagName()).append(" = ").append(dominion.getFlagValue(f)).append(","); } - sql += "tp_location = ?" + - " WHERE id = " + dominion.getId() + - " RETURNING *;"; - List dominions = query(sql, + sql.append("tp_location = ?" + " WHERE id = ").append(dominion.getId()).append(" RETURNING *;"); + List dominions = query(sql.toString(), dominion.getOwner().toString(), dominion.getName(), dominion.getWorld(), dominion.getJoinMessage(), dominion.getLeaveMessage(), + dominion.getColor(), tp_location); if (dominions.size() == 0) return null; return dominions.get(0); @@ -183,7 +187,8 @@ public class DominionDTO { Integer parentDomId, String joinMessage, String leaveMessage, Map flags, - String tp_location) { + String tp_location, + String color) { this.id = id; this.owner = owner; this.name = name; @@ -199,6 +204,7 @@ public class DominionDTO { this.leaveMessage = leaveMessage; this.flags.putAll(flags); this.tp_location = tp_location; + this.color = color; } @@ -238,6 +244,7 @@ public class DominionDTO { private String leaveMessage = "再见"; private final Map flags = new HashMap<>(); private String tp_location; + private String color; // getters and setters public Integer getId() { @@ -421,4 +428,25 @@ public class DominionDTO { public Location getLocation2() { return new Location(Dominion.instance.getServer().getWorld(world), x2, y2, z2); } + + public DominionDTO setColor(String color) { + this.color = color; + return update(this); + } + + public int getColorR() { + return Integer.valueOf(color.substring(1, 3), 16); + } + + public int getColorG() { + return Integer.valueOf(color.substring(3, 5), 16); + } + + public int getColorB() { + return Integer.valueOf(color.substring(5, 7), 16); + } + + public String getColor() { + return color; + } } diff --git a/src/main/java/cn/lunadeer/dominion/managers/DatabaseTables.java b/src/main/java/cn/lunadeer/dominion/managers/DatabaseTables.java index 7450ba7..018ce1d 100644 --- a/src/main/java/cn/lunadeer/dominion/managers/DatabaseTables.java +++ b/src/main/java/cn/lunadeer/dominion/managers/DatabaseTables.java @@ -100,5 +100,8 @@ public class DatabaseTables { flag.getFlagName(), "BOOLEAN NOT NULL DEFAULT " + flag.getDefaultValue()); } + + // 1.31.6 + Dominion.database.addColumnIfNotExists("dominion", "color", "TEXT NOT NULL DEFAULT '#00BFFF'"); } } diff --git a/src/main/java/cn/lunadeer/dominion/tuis/DominionManage.java b/src/main/java/cn/lunadeer/dominion/tuis/DominionManage.java index a377bfd..5d0b849 100644 --- a/src/main/java/cn/lunadeer/dominion/tuis/DominionManage.java +++ b/src/main/java/cn/lunadeer/dominion/tuis/DominionManage.java @@ -1,10 +1,13 @@ package cn.lunadeer.dominion.tuis; +import cn.lunadeer.dominion.Dominion; import cn.lunadeer.dominion.dtos.DominionDTO; import cn.lunadeer.minecraftpluginutils.Notification; import cn.lunadeer.minecraftpluginutils.stui.ListView; import cn.lunadeer.minecraftpluginutils.stui.components.Button; import cn.lunadeer.minecraftpluginutils.stui.components.Line; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.TextColor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -43,6 +46,11 @@ public class DominionManage { Line leave_msg = Line.create() .append(Button.create("编辑离开提示语").setExecuteCommand("/dominion cui_edit_leave_message " + dominion.getName()).build()) .append("当玩家离开领地时显示的消息"); + Line map_color = Line.create() + .append(Button.create("设置颜色").setExecuteCommand("/dominion cui_set_map_color " + dominion.getName()).build()) + .append(Component.text("设置卫星地图上的地块颜色") + .append(Component.text(dominion.getColor(), + TextColor.color(dominion.getColorR(), dominion.getColorG(), dominion.getColorB())))); ListView view = ListView.create(10, "/dominion manage " + dominion.getName()); view.title("领地 " + dominion.getName() + " 管理界面") .navigator(Line.create() @@ -55,7 +63,10 @@ public class DominionManage { .add(set_tp) .add(rename) .add(join_msg) - .add(leave_msg) - .showOn(player, 1); + .add(leave_msg); + if (Dominion.config.getBlueMap()) { + view.add(map_color); + } + view.showOn(player, 1); } } From 2299630e15f556eb583697cddb04a6f62f60ba4f Mon Sep 17 00:00:00 2001 From: zhangyuheng Date: Mon, 17 Jun 2024 15:12:51 +0800 Subject: [PATCH 07/26] =?UTF-8?q?=E5=B0=86tnt=E7=88=86=E7=82=B8=E3=80=81?= =?UTF-8?q?=E7=81=AB=E7=84=B0=E8=94=93=E5=BB=B6=E7=AD=89=E9=A2=86=E5=9C=B0?= =?UTF-8?q?=E7=8B=AC=E6=9C=89=E7=9A=84=EF=BC=88=E9=9D=9E=E7=8E=A9=E5=AE=B6?= =?UTF-8?q?=E8=A1=8C=E4=B8=BA=EF=BC=89=E6=8E=A7=E5=88=B6=E4=BB=8E=E2=80=9C?= =?UTF-8?q?=E8=AE=BF=E5=AE=A2=E6=9D=83=E9=99=90=E2=80=9D=E7=A7=BB=E5=8A=A8?= =?UTF-8?q?=E5=88=B0=E2=80=9C=E7=8E=AF=E5=A2=83=E8=AE=BE=E7=BD=AE=E2=80=9D?= =?UTF-8?q?=EF=BC=8C=E9=81=BF=E5=85=8D=E6=AD=A7=E4=B9=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- .../java/cn/lunadeer/dominion/Commands.java | 3 + .../dominion/commands/DominionFlag.java | 11 +++- .../java/cn/lunadeer/dominion/dtos/Flag.java | 20 ++++++ .../dominion/tuis/DominionEnvInfo.java | 61 +++++++++++++++++++ .../dominion/tuis/DominionFlagInfo.java | 2 +- .../dominion/tuis/DominionManage.java | 4 ++ 7 files changed, 99 insertions(+), 4 deletions(-) create mode 100644 src/main/java/cn/lunadeer/dominion/tuis/DominionEnvInfo.java diff --git a/pom.xml b/pom.xml index df18227..651cdf6 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ cn.lunadeer Dominion - 1.31.6-beta + 1.32.0-beta jar Dominion diff --git a/src/main/java/cn/lunadeer/dominion/Commands.java b/src/main/java/cn/lunadeer/dominion/Commands.java index 8f9dca3..efeae3c 100644 --- a/src/main/java/cn/lunadeer/dominion/Commands.java +++ b/src/main/java/cn/lunadeer/dominion/Commands.java @@ -177,6 +177,9 @@ public class Commands implements TabExecutor { case "set_map_color": DominionOperate.setMapColor(sender, args); break; + case "env_info": + DominionEnvInfo.show(sender, args); + break; // ---=== CUI ===--- case "cui_rename": RenameDominion.open(sender, args); diff --git a/src/main/java/cn/lunadeer/dominion/commands/DominionFlag.java b/src/main/java/cn/lunadeer/dominion/commands/DominionFlag.java index 1ef2719..bb53985 100644 --- a/src/main/java/cn/lunadeer/dominion/commands/DominionFlag.java +++ b/src/main/java/cn/lunadeer/dominion/commands/DominionFlag.java @@ -2,6 +2,8 @@ package cn.lunadeer.dominion.commands; import cn.lunadeer.dominion.controllers.BukkitPlayerOperator; import cn.lunadeer.dominion.controllers.FlagsController; +import cn.lunadeer.dominion.dtos.Flag; +import cn.lunadeer.dominion.tuis.DominionEnvInfo; import cn.lunadeer.dominion.tuis.DominionFlagInfo; import cn.lunadeer.minecraftpluginutils.Notification; import org.bukkit.command.CommandSender; @@ -29,10 +31,15 @@ public class DominionFlag { } else if (args.length == 5) { FlagsController.setFlag(operator, args[1], Boolean.parseBoolean(args[2]), args[3]); String[] newArgs = new String[3]; - newArgs[0] = "flag_info"; + newArgs[0] = Flag.isDominionOnlyFlag(args[1]) ? "env_info" : "flag_info"; newArgs[1] = args[3]; newArgs[2] = args[4]; - DominionFlagInfo.show(sender, newArgs); + if (Flag.isDominionOnlyFlag(args[1])) { + DominionEnvInfo.show(sender, newArgs); + } else { + DominionFlagInfo.show(sender, newArgs); + } + } else { Notification.error(sender, "用法: /dominion set <权限名称> [领地名称]"); } diff --git a/src/main/java/cn/lunadeer/dominion/dtos/Flag.java b/src/main/java/cn/lunadeer/dominion/dtos/Flag.java index 9f93714..f658ad4 100644 --- a/src/main/java/cn/lunadeer/dominion/dtos/Flag.java +++ b/src/main/java/cn/lunadeer/dominion/dtos/Flag.java @@ -120,6 +120,26 @@ public enum Flag { return Arrays.asList(Flag.values()); } + public static List getDominionOnlyFlagsEnabled() { + List flags = new ArrayList<>(); + for (Flag flag : Flag.values()) { + if (!flag.dominion_only) { + continue; + } + if (!flag.enable) { + continue; + } + flags.add(flag); + } + Comparator comparator = Collator.getInstance(java.util.Locale.CHINA); + flags.sort((o1, o2) -> comparator.compare(o1.getDisplayName(), o2.getDisplayName())); + return flags; + } + + public static boolean isDominionOnlyFlag(String flagName) { + return getFlag(flagName).dominion_only; + } + public static List getDominionFlagsEnabled() { List flags = new ArrayList<>(); for (Flag flag : Flag.values()) { diff --git a/src/main/java/cn/lunadeer/dominion/tuis/DominionEnvInfo.java b/src/main/java/cn/lunadeer/dominion/tuis/DominionEnvInfo.java new file mode 100644 index 0000000..50c909e --- /dev/null +++ b/src/main/java/cn/lunadeer/dominion/tuis/DominionEnvInfo.java @@ -0,0 +1,61 @@ +package cn.lunadeer.dominion.tuis; + +import cn.lunadeer.dominion.dtos.DominionDTO; +import cn.lunadeer.dominion.dtos.Flag; +import cn.lunadeer.minecraftpluginutils.Notification; +import cn.lunadeer.minecraftpluginutils.stui.ListView; +import cn.lunadeer.minecraftpluginutils.stui.components.Button; +import cn.lunadeer.minecraftpluginutils.stui.components.Line; +import net.kyori.adventure.text.Component; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import static cn.lunadeer.dominion.commands.Apis.playerOnly; + +public class DominionEnvInfo { + + public static void show(CommandSender sender, String[] args) { + Player player = playerOnly(sender); + if (player == null) return; + if (args.length < 2) { + Notification.error(sender, "用法: /dominion env_info <领地名称> [页码]"); + return; + } + DominionDTO dominion = DominionDTO.select(args[1]); + if (dominion == null) { + Notification.error(sender, "领地 %s 不存在", args[1]); + return; + } + int page = 1; + if (args.length == 3) { + try { + page = Integer.parseInt(args[2]); + } catch (Exception ignored) { + } + } + ListView view = ListView.create(10, "/dominion env_info " + dominion.getName()); + view.title("领地 " + dominion.getName() + " 环境设置") + .navigator(Line.create() + .append(Button.create("主菜单").setExecuteCommand("/dominion menu").build()) + .append(Button.create("我的领地").setExecuteCommand("/dominion list").build()) + .append(Button.create("管理界面").setExecuteCommand("/dominion manage " + dominion.getName()).build()) + .append("环境设置")); + for (Flag flag : Flag.getDominionOnlyFlagsEnabled()) { + view.add(createOption(flag, dominion.getFlagValue(flag), dominion.getName(), page)); + } + view.showOn(player, page); + } + + private static Line createOption(Flag flag, boolean value, String dominion_name, int page) { + if (value) { + return Line.create() + .append(Button.createGreen("☑").setExecuteCommand("/dominion set " + flag.getFlagName() + " false " + dominion_name + " " + page).build()) + .append(Component.text(flag.getDisplayName()).hoverEvent(Component.text(flag.getDescription()))); + } else { + return Line.create() + .append(Button.createRed("☐").setExecuteCommand("/dominion set " + flag.getFlagName() + " true " + dominion_name + " " + page).build()) + .append(Component.text(flag.getDisplayName()).hoverEvent(Component.text(flag.getDescription()))); + } + } + +} diff --git a/src/main/java/cn/lunadeer/dominion/tuis/DominionFlagInfo.java b/src/main/java/cn/lunadeer/dominion/tuis/DominionFlagInfo.java index 574273b..4a9eb91 100644 --- a/src/main/java/cn/lunadeer/dominion/tuis/DominionFlagInfo.java +++ b/src/main/java/cn/lunadeer/dominion/tuis/DominionFlagInfo.java @@ -40,7 +40,7 @@ public class DominionFlagInfo { .append(Button.create("我的领地").setExecuteCommand("/dominion list").build()) .append(Button.create("管理界面").setExecuteCommand("/dominion manage " + dominion.getName()).build()) .append("访客权限")); - for (Flag flag : Flag.getDominionFlagsEnabled()) { + for (Flag flag : Flag.getPrivilegeFlagsEnabled()) { view.add(createOption(flag, dominion.getFlagValue(flag), dominion.getName(), page)); } view.showOn(player, page); diff --git a/src/main/java/cn/lunadeer/dominion/tuis/DominionManage.java b/src/main/java/cn/lunadeer/dominion/tuis/DominionManage.java index 5d0b849..92d62b8 100644 --- a/src/main/java/cn/lunadeer/dominion/tuis/DominionManage.java +++ b/src/main/java/cn/lunadeer/dominion/tuis/DominionManage.java @@ -28,6 +28,9 @@ public class DominionManage { Line size_info = Line.create() .append(Button.create("详细信息").setExecuteCommand("/dominion info " + dominion.getName()).build()) .append("查看领地详细信息"); + Line env_info = Line.create() + .append(Button.create("环境设置").setExecuteCommand("/dominion env_info " + dominion.getName()).build()) + .append("设置领地内的一些非玩家相关效果"); Line flag_info = Line.create() .append(Button.create("访客权限").setExecuteCommand("/dominion flag_info " + dominion.getName()).build()) .append("访客在此领地的权限"); @@ -58,6 +61,7 @@ public class DominionManage { .append(Button.create("我的领地").setExecuteCommand("/dominion list").build()) .append(dominion.getName())) .add(size_info) + .add(env_info) .add(flag_info) .add(privilege_list) .add(set_tp) From 03cb1af6035b7b901c3b83196b7a67e81a3904b5 Mon Sep 17 00:00:00 2001 From: zhangyuheng Date: Mon, 17 Jun 2024 17:51:43 +0800 Subject: [PATCH 08/26] =?UTF-8?q?=E5=88=9D=E6=AD=A5=E5=AE=9E=E7=8E=B0mysql?= =?UTF-8?q?=E9=80=82=E9=85=8D=EF=BC=8C=E4=BD=86=E6=9A=82=E6=97=B6=E5=AD=98?= =?UTF-8?q?=E5=9C=A8returning=E8=AF=AD=E6=B3=95=E7=BC=BA=E5=A4=B1=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 4 +- .../dominion/managers/DatabaseTables.java | 138 ++++++++++-------- src/main/resources/config.yml | 2 +- 3 files changed, 78 insertions(+), 66 deletions(-) diff --git a/pom.xml b/pom.xml index 651cdf6..6d66674 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ cn.lunadeer Dominion - 1.32.0-beta + 1.33.0-beta jar Dominion @@ -82,7 +82,7 @@ cn.lunadeer MinecraftPluginUtils - 1.3.2-SNAPSHOT + 1.3.3-SNAPSHOT com.github.BlueMap-Minecraft diff --git a/src/main/java/cn/lunadeer/dominion/managers/DatabaseTables.java b/src/main/java/cn/lunadeer/dominion/managers/DatabaseTables.java index 018ce1d..0dc1548 100644 --- a/src/main/java/cn/lunadeer/dominion/managers/DatabaseTables.java +++ b/src/main/java/cn/lunadeer/dominion/managers/DatabaseTables.java @@ -8,65 +8,78 @@ public class DatabaseTables { String sql = ""; // player name - sql = "CREATE TABLE IF NOT EXISTS player_name (" + - " id SERIAL PRIMARY KEY," + - " uuid VARCHAR(36) NOT NULL UNIQUE," + - " last_known_name TEXT NOT NULL," + - " last_join_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP" + - ");"; - Dominion.database.query(sql); + Dominion.database.createTableIfNotExists( + "player_name", + new String[]{"id", "uuid", "last_known_name", "last_join_at"}, + new String[]{"SERIAL PRIMARY KEY", "VARCHAR(36) NOT NULL UNIQUE", "TEXT NOT NULL", "TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP"}, + null + ); // dominion table - sql = "CREATE TABLE IF NOT EXISTS dominion (" + - " id SERIAL PRIMARY KEY," + - " owner VARCHAR(36) NOT NULL," + - " name TEXT NOT NULL UNIQUE," + - " world TEXT NOT NULL," + - " x1 INT NOT NULL," + - " y1 INT NOT NULL," + - " z1 INT NOT NULL," + - " x2 INT NOT NULL," + - " y2 INT NOT NULL," + - " z2 INT NOT NULL," + - " parent_dom_id INT NOT NULL DEFAULT -1," + - " join_message TEXT NOT NULL DEFAULT '欢迎', " + - " leave_message TEXT NOT NULL DEFAULT '再见', " + - - " FOREIGN KEY (owner) REFERENCES player_name(uuid) ON DELETE CASCADE," + - " FOREIGN KEY (parent_dom_id) REFERENCES dominion(id) ON DELETE CASCADE" + - ");"; - Dominion.database.query(sql); + Dominion.database.createTableIfNotExists( + "dominion", + new String[]{"id", + "owner", + "name", + "world", + "x1", "y1", "z1", "x2", "y2", "z2", + "parent_dom_id", + "join_message", + "leave_message"}, + new String[]{ + "SERIAL PRIMARY KEY", + "VARCHAR(36) NOT NULL", + "TEXT NOT NULL UNIQUE", + "TEXT NOT NULL", "INT NOT NULL", "INT NOT NULL", "INT NOT NULL", "INT NOT NULL", "INT NOT NULL", "INT NOT NULL", + "INT NOT NULL DEFAULT -1", + "TEXT NOT NULL DEFAULT '欢迎'", + "TEXT NOT NULL DEFAULT '再见'"}, + new String[]{ + "FOREIGN KEY (owner) REFERENCES player_name(uuid) ON DELETE CASCADE", + "FOREIGN KEY (parent_dom_id) REFERENCES dominion(id) ON DELETE CASCADE" + } + ); // player privilege - sql = "CREATE TABLE IF NOT EXISTS player_privilege (" + - " id SERIAL PRIMARY KEY," + - " player_uuid VARCHAR(36) NOT NULL," + - " dom_id INT NOT NULL," + + Dominion.database.createTableIfNotExists( + "player_privilege", + new String[]{"id", "player_uuid", "dom_id", "admin"}, + new String[]{"SERIAL PRIMARY KEY", "VARCHAR(36) NOT NULL", "INT NOT NULL", "BOOLEAN NOT NULL DEFAULT FALSE"}, + new String[]{ + "UNIQUE (player_uuid, dom_id)", + "FOREIGN KEY (player_uuid) REFERENCES player_name(uuid) ON DELETE CASCADE", + "FOREIGN KEY (dom_id) REFERENCES dominion(id) ON DELETE CASCADE" + } + ); - " admin BOOLEAN NOT NULL DEFAULT FALSE," + + Dominion.database.insertRowIfNotExists("player_name", + new String[]{"id", "uuid", "last_known_name"}, + new String[]{"-1", "00000000-0000-0000-0000-000000000000", "server"}, + 0 + ); - " UNIQUE (player_uuid, dom_id)," + - " FOREIGN KEY (player_uuid) REFERENCES player_name(uuid) ON DELETE CASCADE," + - " FOREIGN KEY (dom_id) REFERENCES dominion(id) ON DELETE CASCADE" + - ");"; - Dominion.database.query(sql); - - sql = "INSERT INTO player_name (" + - "id, uuid, last_known_name" + - ") VALUES (" + - "-1, '00000000-0000-0000-0000-000000000000', 'server'" + - ") ON CONFLICT DO NOTHING;"; - Dominion.database.query(sql); - - sql = "INSERT INTO dominion (" + - "id, owner, name, world, x1, y1, z1, x2, y2, z2, parent_dom_id, join_message, leave_message" + - ") VALUES (" + - "-1, '00000000-0000-0000-0000-000000000000', '根领地', 'all', " + - "-2147483648, -2147483648, -2147483648, " + - "2147483647, 2147483647, 2147483647, -1, " + - "'欢迎', '再见'" + - ") ON CONFLICT DO NOTHING;"; - Dominion.database.query(sql); + Dominion.database.insertRowIfNotExists("dominion", + new String[]{ + "id", + "owner", + "name", + "world", + "x1", "y1", "z1", "x2", "y2", "z2", + "parent_dom_id", + "join_message", + "leave_message"}, + new String[]{ + "-1", + "00000000-0000-0000-0000-000000000000", + "根领地", + "all", + "-2147483648", "-2147483648", "-2147483648", + "2147483647", "2147483647", "2147483647", + "-1", + "欢迎", + "再见"}, + 0 + ); for (Flag flag : Flag.getAllDominionFlags()) { Dominion.database.addColumnIfNotExists("dominion", @@ -84,16 +97,15 @@ public class DatabaseTables { Dominion.database.addColumnIfNotExists("dominion", "tp_location", "TEXT NOT NULL DEFAULT 'default'"); // 1.31.0 - sql = "CREATE TABLE IF NOT EXISTS privilege_template (" + - " id SERIAL PRIMARY KEY," + - " creator VARCHAR(36) NOT NULL," + - " name TEXT NOT NULL," + - " admin BOOLEAN NOT NULL DEFAULT FALSE," + - - " UNIQUE (creator, name)," + - " FOREIGN KEY (creator) REFERENCES player_name(uuid) ON DELETE CASCADE" + - ");"; - Dominion.database.query(sql); + Dominion.database.createTableIfNotExists( + "privilege_template", + new String[]{"id", "creator", "name", "admin"}, + new String[]{"SERIAL PRIMARY KEY", "VARCHAR(36) NOT NULL", "TEXT NOT NULL", "BOOLEAN NOT NULL DEFAULT FALSE"}, + new String[]{ + "UNIQUE (creator, name)", + "FOREIGN KEY (creator) REFERENCES player_name(uuid) ON DELETE CASCADE" + } + ); for (Flag flag : Flag.getAllPrivilegeFlags()) { Dominion.database.addColumnIfNotExists("privilege_template", diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index b99a985..fd791f3 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -1,5 +1,5 @@ Database: - Type: sqlite # pgsql, sqlite + Type: sqlite # pgsql, sqlite, mysql Host: localhost Port: 5432 Name: dominion From 268648e4925b6b66170230ede3b6e8fc3ff676b1 Mon Sep 17 00:00:00 2001 From: zhangyuheng Date: Tue, 18 Jun 2024 16:30:31 +0800 Subject: [PATCH 09/26] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=9F=90=E4=BA=9B?= =?UTF-8?q?=E6=83=85=E5=86=B5=E4=B8=8B=E6=97=A0=E6=B3=95=E6=AD=A3=E7=A1=AE?= =?UTF-8?q?hook=E5=88=B0=E7=BB=8F=E6=B5=8E=E6=8F=92=E4=BB=B6=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 651cdf6..6ddd656 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ cn.lunadeer Dominion - 1.32.0-beta + 1.32.1-beta jar Dominion From 7a6798bed14ae195594aeaf671f1f8684bbfee85 Mon Sep 17 00:00:00 2001 From: zhangyuheng Date: Wed, 19 Jun 2024 18:00:51 +0800 Subject: [PATCH 10/26] =?UTF-8?q?=E4=BF=AE=E6=94=B9dto=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E9=80=82=E9=85=8D=E6=96=B0=E6=95=B0=E6=8D=AE=E5=BA=93=E5=B7=A5?= =?UTF-8?q?=E5=85=B7=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- .../java/cn/lunadeer/dominion/Dominion.java | 9 +- .../lunadeer/dominion/dtos/DominionDTO.java | 3 +- .../dominion/managers/DatabaseTables.java | 218 +++++++++++------- 4 files changed, 137 insertions(+), 95 deletions(-) diff --git a/pom.xml b/pom.xml index 6d66674..319d6f3 100644 --- a/pom.xml +++ b/pom.xml @@ -82,7 +82,7 @@ cn.lunadeer MinecraftPluginUtils - 1.3.3-SNAPSHOT + 1.3.4-SNAPSHOT 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 16417bc..9b80fa2 100644 --- a/src/main/java/cn/lunadeer/dominion/Dominion.java +++ b/src/main/java/cn/lunadeer/dominion/Dominion.java @@ -6,6 +6,8 @@ import cn.lunadeer.dominion.events.SelectPointEvents; import cn.lunadeer.dominion.managers.ConfigManager; import cn.lunadeer.dominion.managers.DatabaseTables; import cn.lunadeer.minecraftpluginutils.*; +import cn.lunadeer.minecraftpluginutils.databse.DatabaseManager; +import cn.lunadeer.minecraftpluginutils.databse.DatabaseType; import cn.lunadeer.minecraftpluginutils.scui.CuiManager; import org.bukkit.Bukkit; import org.bukkit.Location; @@ -26,8 +28,8 @@ public final class Dominion extends JavaPlugin { new XLogger(this); config = new ConfigManager(this); XLogger.setDebug(config.isDebug()); - database = new DatabaseManager(this, - DatabaseManager.TYPE.valueOf(config.getDbType().toUpperCase()), + new DatabaseManager(this, + DatabaseType.valueOf(config.getDbType().toUpperCase()), config.getDbHost(), config.getDbPort(), config.getDbName(), @@ -74,12 +76,11 @@ public final class Dominion extends JavaPlugin { @Override public void onDisable() { // Plugin shutdown logic - database.close(); + DatabaseManager.instance.close(); } public static Dominion instance; public static ConfigManager config; - public static DatabaseManager database; public static Map> pointsSelect = new HashMap<>(); private GiteaReleaseCheck giteaReleaseCheck; } diff --git a/src/main/java/cn/lunadeer/dominion/dtos/DominionDTO.java b/src/main/java/cn/lunadeer/dominion/dtos/DominionDTO.java index 2f3a548..347b95c 100644 --- a/src/main/java/cn/lunadeer/dominion/dtos/DominionDTO.java +++ b/src/main/java/cn/lunadeer/dominion/dtos/DominionDTO.java @@ -3,6 +3,7 @@ package cn.lunadeer.dominion.dtos; import cn.lunadeer.dominion.Cache; import cn.lunadeer.dominion.Dominion; import cn.lunadeer.minecraftpluginutils.XLogger; +import cn.lunadeer.minecraftpluginutils.databse.DatabaseManager; import org.bukkit.Location; import org.bukkit.World; @@ -15,7 +16,7 @@ import java.util.List; public class DominionDTO { private static List query(String sql, Object... args) { List dominions = new ArrayList<>(); - try (ResultSet rs = Dominion.database.query(sql, args)) { + try (ResultSet rs = DatabaseManager.instance.query(sql, args)) { if (sql.contains("UPDATE") || sql.contains("DELETE") || sql.contains("INSERT")) { // 如果是更新操作,重新加载缓存 Cache.instance.loadDominions(); diff --git a/src/main/java/cn/lunadeer/dominion/managers/DatabaseTables.java b/src/main/java/cn/lunadeer/dominion/managers/DatabaseTables.java index 0dc1548..4d87c8a 100644 --- a/src/main/java/cn/lunadeer/dominion/managers/DatabaseTables.java +++ b/src/main/java/cn/lunadeer/dominion/managers/DatabaseTables.java @@ -1,119 +1,159 @@ package cn.lunadeer.dominion.managers; -import cn.lunadeer.dominion.Dominion; import cn.lunadeer.dominion.dtos.Flag; +import cn.lunadeer.minecraftpluginutils.databse.Field; +import cn.lunadeer.minecraftpluginutils.databse.FieldType; +import cn.lunadeer.minecraftpluginutils.databse.TableColumn; +import cn.lunadeer.minecraftpluginutils.databse.syntax.AddColumn; +import cn.lunadeer.minecraftpluginutils.databse.syntax.CreateTable; +import cn.lunadeer.minecraftpluginutils.databse.syntax.InsertRow; public class DatabaseTables { public static void migrate() { - String sql = ""; - // player name - Dominion.database.createTableIfNotExists( - "player_name", - new String[]{"id", "uuid", "last_known_name", "last_join_at"}, - new String[]{"SERIAL PRIMARY KEY", "VARCHAR(36) NOT NULL UNIQUE", "TEXT NOT NULL", "TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP"}, - null - ); + TableColumn player_name_id = new TableColumn("id", FieldType.INT, true, true, true, true, null); + TableColumn player_name_uuid = new TableColumn("uuid", FieldType.STRING, false, false, true, true, null); + TableColumn player_name_last_known_name = new TableColumn("last_known_name", FieldType.STRING, false, false, true, false, null); + TableColumn player_name_last_join_at = new TableColumn("last_join_at", FieldType.DATETIME, false, false, true, false, "CURRENT_TIMESTAMP"); + CreateTable player_name = new CreateTable().ifNotExists(); + player_name.table("player_name") + .field(player_name_id) + .field(player_name_uuid) + .field(player_name_last_known_name) + .field(player_name_last_join_at); + player_name.execute(); // dominion table - Dominion.database.createTableIfNotExists( - "dominion", - new String[]{"id", - "owner", - "name", - "world", - "x1", "y1", "z1", "x2", "y2", "z2", - "parent_dom_id", - "join_message", - "leave_message"}, - new String[]{ - "SERIAL PRIMARY KEY", - "VARCHAR(36) NOT NULL", - "TEXT NOT NULL UNIQUE", - "TEXT NOT NULL", "INT NOT NULL", "INT NOT NULL", "INT NOT NULL", "INT NOT NULL", "INT NOT NULL", "INT NOT NULL", - "INT NOT NULL DEFAULT -1", - "TEXT NOT NULL DEFAULT '欢迎'", - "TEXT NOT NULL DEFAULT '再见'"}, - new String[]{ - "FOREIGN KEY (owner) REFERENCES player_name(uuid) ON DELETE CASCADE", - "FOREIGN KEY (parent_dom_id) REFERENCES dominion(id) ON DELETE CASCADE" - } - ); + TableColumn dominion_id = new TableColumn("id", FieldType.INT, true, true, true, true, null); + TableColumn dominion_owner = new TableColumn("owner", FieldType.STRING, false, false, true, false, null); + TableColumn dominion_name = new TableColumn("name", FieldType.STRING, false, false, true, false, null); + TableColumn dominion_world = new TableColumn("world", FieldType.STRING, false, false, true, false, null); + TableColumn dominion_x1 = new TableColumn("x1", FieldType.INT, false, false, true, false, null); + TableColumn dominion_y1 = new TableColumn("y1", FieldType.INT, false, false, true, false, null); + TableColumn dominion_z1 = new TableColumn("z1", FieldType.INT, false, false, true, false, null); + TableColumn dominion_x2 = new TableColumn("x2", FieldType.INT, false, false, true, false, null); + TableColumn dominion_y2 = new TableColumn("y2", FieldType.INT, false, false, true, false, null); + TableColumn dominion_z2 = new TableColumn("z2", FieldType.INT, false, false, true, false, null); + TableColumn dominion_parent_dom_id = new TableColumn("parent_dom_id", FieldType.INT, false, false, true, false, -1); + TableColumn dominion_join_message = new TableColumn("join_message", FieldType.STRING, false, false, true, false, "'欢迎'"); + TableColumn dominion_leave_message = new TableColumn("leave_message", FieldType.STRING, false, false, true, false, "'再见'"); + CreateTable.ForeignKey dominion_owner_fk = new CreateTable.ForeignKey(dominion_owner, "player_name", player_name_uuid, true); + CreateTable.ForeignKey dominion_parent_dom_id_fk = new CreateTable.ForeignKey(dominion_parent_dom_id, "dominion", dominion_id, true); + CreateTable dominion = new CreateTable().ifNotExists(); + dominion.table("dominion") + .field(dominion_id) + .field(dominion_owner) + .field(dominion_name) + .field(dominion_world) + .field(dominion_x1) + .field(dominion_y1) + .field(dominion_z1) + .field(dominion_x2) + .field(dominion_y2) + .field(dominion_z2) + .field(dominion_parent_dom_id) + .field(dominion_join_message) + .field(dominion_leave_message) + .foreignKey(dominion_owner_fk) + .foreignKey(dominion_parent_dom_id_fk); + dominion.execute(); // player privilege - Dominion.database.createTableIfNotExists( - "player_privilege", - new String[]{"id", "player_uuid", "dom_id", "admin"}, - new String[]{"SERIAL PRIMARY KEY", "VARCHAR(36) NOT NULL", "INT NOT NULL", "BOOLEAN NOT NULL DEFAULT FALSE"}, - new String[]{ - "UNIQUE (player_uuid, dom_id)", - "FOREIGN KEY (player_uuid) REFERENCES player_name(uuid) ON DELETE CASCADE", - "FOREIGN KEY (dom_id) REFERENCES dominion(id) ON DELETE CASCADE" - } - ); + TableColumn player_privilege_id = new TableColumn("id", FieldType.INT, true, true, true, true, null); + TableColumn player_privilege_player_uuid = new TableColumn("player_uuid", FieldType.STRING, false, false, true, false, null); + TableColumn player_privilege_dom_id = new TableColumn("dom_id", FieldType.INT, false, false, true, false, null); + TableColumn player_privilege_admin = new TableColumn("admin", FieldType.BOOLEAN, false, false, true, false, false); + CreateTable.ForeignKey player_privilege_player_uuid_fk = new CreateTable.ForeignKey(player_privilege_player_uuid, "player_name", player_name_uuid, true); + CreateTable.ForeignKey player_privilege_dom_id_fk = new CreateTable.ForeignKey(player_privilege_dom_id, "dominion", dominion_id, true); + CreateTable player_privilege = new CreateTable().ifNotExists(); + player_privilege.table("player_privilege") + .field(player_privilege_id) + .field(player_privilege_player_uuid) + .field(player_privilege_dom_id) + .field(player_privilege_admin) + .foreignKey(player_privilege_player_uuid_fk) + .foreignKey(player_privilege_dom_id_fk) + .unique(player_privilege_player_uuid, player_privilege_dom_id); + player_name.execute(); - Dominion.database.insertRowIfNotExists("player_name", - new String[]{"id", "uuid", "last_known_name"}, - new String[]{"-1", "00000000-0000-0000-0000-000000000000", "server"}, - 0 - ); + // server root player name + Field server_player_name_id_field = new Field("id", -1); + Field server_player_name_uuid_field = new Field("uuid", "00000000-0000-0000-0000-000000000000"); + Field server_player_name_last_known_name_field = new Field("last_known_name", "server"); + InsertRow insert_server_player_name = new InsertRow().table("player_name").onConflictDoNothing(server_player_name_id_field) + .field(server_player_name_id_field) + .field(server_player_name_uuid_field) + .field(server_player_name_last_known_name_field); + insert_server_player_name.execute(); - Dominion.database.insertRowIfNotExists("dominion", - new String[]{ - "id", - "owner", - "name", - "world", - "x1", "y1", "z1", "x2", "y2", "z2", - "parent_dom_id", - "join_message", - "leave_message"}, - new String[]{ - "-1", - "00000000-0000-0000-0000-000000000000", - "根领地", - "all", - "-2147483648", "-2147483648", "-2147483648", - "2147483647", "2147483647", "2147483647", - "-1", - "欢迎", - "再见"}, - 0 - ); + // server root dominion + Field server_dom_id_field = new Field("id", -1); + Field server_dom_owner_field = new Field("owner", "00000000-0000-0000-0000-000000000000"); + Field server_dom_name_field = new Field("name", "根领地"); + Field server_dom_world_field = new Field("world", "all"); + Field server_dom_x1_field = new Field("x1", -2147483648); + Field server_dom_y1_field = new Field("y1", -2147483648); + Field server_dom_z1_field = new Field("z1", -2147483648); + Field server_dom_x2_field = new Field("x2", 2147483647); + Field server_dom_y2_field = new Field("y2", 2147483647); + Field server_dom_z2_field = new Field("z2", 2147483647); + Field server_dom_parent_dom_id_field = new Field("parent_dom_id", -1); + Field server_dom_join_message_field = new Field("join_message", "欢迎"); + Field server_dom_leave_message_field = new Field("leave_message", "再见"); + InsertRow insert_server_dom = new InsertRow().table("dominion").onConflictDoNothing(server_dom_id_field) + .field(server_dom_id_field) + .field(server_dom_owner_field) + .field(server_dom_name_field) + .field(server_dom_world_field) + .field(server_dom_x1_field) + .field(server_dom_y1_field) + .field(server_dom_z1_field) + .field(server_dom_x2_field) + .field(server_dom_y2_field) + .field(server_dom_z2_field) + .field(server_dom_parent_dom_id_field) + .field(server_dom_join_message_field) + .field(server_dom_leave_message_field); + insert_server_dom.execute(); for (Flag flag : Flag.getAllDominionFlags()) { - Dominion.database.addColumnIfNotExists("dominion", - flag.getFlagName(), - "BOOLEAN NOT NULL DEFAULT " + flag.getDefaultValue()); + TableColumn column = new TableColumn(flag.getFlagName(), FieldType.BOOLEAN, false, false, true, false, flag.getDefaultValue()); + new AddColumn(column).table("dominion").ifNotExists().execute(); } for (Flag flag : Flag.getAllPrivilegeFlags()) { - Dominion.database.addColumnIfNotExists("player_privilege", - flag.getFlagName(), - "BOOLEAN NOT NULL DEFAULT " + flag.getDefaultValue()); + TableColumn column = new TableColumn(flag.getFlagName(), FieldType.BOOLEAN, false, false, true, false, flag.getDefaultValue()); + new AddColumn(column).table("player_privilege").ifNotExists().execute(); } // 1.18.0 - Dominion.database.addColumnIfNotExists("dominion", "tp_location", "TEXT NOT NULL DEFAULT 'default'"); + TableColumn dominion_tp_location = new TableColumn("tp_location", FieldType.STRING, false, false, true, false, "'default'"); + new AddColumn(dominion_tp_location).table("dominion").ifNotExists().execute(); // 1.31.0 - Dominion.database.createTableIfNotExists( - "privilege_template", - new String[]{"id", "creator", "name", "admin"}, - new String[]{"SERIAL PRIMARY KEY", "VARCHAR(36) NOT NULL", "TEXT NOT NULL", "BOOLEAN NOT NULL DEFAULT FALSE"}, - new String[]{ - "UNIQUE (creator, name)", - "FOREIGN KEY (creator) REFERENCES player_name(uuid) ON DELETE CASCADE" - } - ); + TableColumn privilege_template_id = new TableColumn("id", FieldType.INT, true, true, true, true, null); + TableColumn privilege_template_creator = new TableColumn("creator", FieldType.STRING, false, false, true, false, null); + TableColumn privilege_template_name = new TableColumn("name", FieldType.STRING, false, false, true, false, null); + TableColumn privilege_template_admin = new TableColumn("admin", FieldType.BOOLEAN, false, false, true, false, false); + CreateTable.ForeignKey privilege_template_creator_fk = new CreateTable.ForeignKey(privilege_template_creator, "player_name", player_name_uuid, true); + CreateTable privilege_template = new CreateTable().ifNotExists(); + privilege_template.table("privilege_template") + .field(privilege_template_id) + .field(privilege_template_creator) + .field(privilege_template_name) + .field(privilege_template_admin) + .foreignKey(privilege_template_creator_fk) + .unique(privilege_template_creator, privilege_template_name); + privilege_template.execute(); + for (Flag flag : Flag.getAllPrivilegeFlags()) { - Dominion.database.addColumnIfNotExists("privilege_template", - flag.getFlagName(), - "BOOLEAN NOT NULL DEFAULT " + flag.getDefaultValue()); + TableColumn column = new TableColumn(flag.getFlagName(), FieldType.BOOLEAN, false, false, true, false, flag.getDefaultValue()); + new AddColumn(column).table("privilege_template").ifNotExists().execute(); } // 1.31.6 - Dominion.database.addColumnIfNotExists("dominion", "color", "TEXT NOT NULL DEFAULT '#00BFFF'"); + TableColumn dominion_color = new TableColumn("color", FieldType.STRING, false, false, true, false, "'#00BFFF'"); + new AddColumn(dominion_color).table("dominion").ifNotExists().execute(); } } From cac0b9173487b1e98beb122e342033ed767a8c4d Mon Sep 17 00:00:00 2001 From: zhangyuheng Date: Wed, 19 Jun 2024 21:01:20 +0800 Subject: [PATCH 11/26] =?UTF-8?q?=E5=88=9D=E6=AD=A5=E5=AE=9E=E7=8E=B0mysql?= =?UTF-8?q?=E9=80=82=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- .../lunadeer/dominion/dtos/DominionDTO.java | 176 +++++++++--------- .../cn/lunadeer/dominion/dtos/PlayerDTO.java | 85 ++++++--- .../dominion/dtos/PlayerPrivilegeDTO.java | 123 +++++++----- .../dominion/dtos/PrivilegeTemplateDTO.java | 64 +++++-- .../dominion/managers/DatabaseTables.java | 40 ++-- 6 files changed, 292 insertions(+), 198 deletions(-) diff --git a/pom.xml b/pom.xml index 319d6f3..0648b7f 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ cn.lunadeer Dominion - 1.33.0-beta + 1.33.1-beta jar Dominion diff --git a/src/main/java/cn/lunadeer/dominion/dtos/DominionDTO.java b/src/main/java/cn/lunadeer/dominion/dtos/DominionDTO.java index 347b95c..6a757ef 100644 --- a/src/main/java/cn/lunadeer/dominion/dtos/DominionDTO.java +++ b/src/main/java/cn/lunadeer/dominion/dtos/DominionDTO.java @@ -4,14 +4,15 @@ import cn.lunadeer.dominion.Cache; import cn.lunadeer.dominion.Dominion; 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 cn.lunadeer.minecraftpluginutils.databse.syntax.UpdateRow; import org.bukkit.Location; import org.bukkit.World; -import java.awt.*; import java.sql.ResultSet; import java.sql.SQLException; import java.util.*; -import java.util.List; public class DominionDTO { private static List query(String sql, Object... args) { @@ -21,37 +22,43 @@ public class DominionDTO { // 如果是更新操作,重新加载缓存 Cache.instance.loadDominions(); } - if (rs == null) return dominions; - while (rs.next()) { - Integer id = rs.getInt("id"); - UUID owner = UUID.fromString(rs.getString("owner")); - String name = rs.getString("name"); - String world = rs.getString("world"); - Integer x1 = rs.getInt("x1"); - Integer y1 = rs.getInt("y1"); - Integer z1 = rs.getInt("z1"); - Integer x2 = rs.getInt("x2"); - Integer y2 = rs.getInt("y2"); - Integer z2 = rs.getInt("z2"); - Integer parentDomId = rs.getInt("parent_dom_id"); - String tp_location = rs.getString("tp_location"); - Map flags = new HashMap<>(); - for (Flag f : Flag.getDominionFlagsEnabled()) { - flags.put(f, rs.getBoolean(f.getFlagName())); - } - String color = rs.getString("color"); - - 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 - ); - dominions.add(dominion); - } + return getDTOFromRS(rs); } catch (SQLException e) { - Dominion.database.handleDatabaseError("数据库操作失败: ", e, sql); + DatabaseManager.handleDatabaseError("数据库操作失败: ", e, sql); + } + return dominions; + } + + private static List getDTOFromRS(ResultSet rs) throws SQLException { + List dominions = new ArrayList<>(); + if (rs == null) return dominions; + while (rs.next()) { + Integer id = rs.getInt("id"); + UUID owner = UUID.fromString(rs.getString("owner")); + String name = rs.getString("name"); + String world = rs.getString("world"); + Integer x1 = rs.getInt("x1"); + Integer y1 = rs.getInt("y1"); + Integer z1 = rs.getInt("z1"); + Integer x2 = rs.getInt("x2"); + Integer y2 = rs.getInt("y2"); + Integer z2 = rs.getInt("z2"); + Integer parentDomId = rs.getInt("parent_dom_id"); + String tp_location = rs.getString("tp_location"); + Map flags = new HashMap<>(); + for (Flag f : Flag.getDominionFlagsEnabled()) { + flags.put(f, rs.getBoolean(f.getFlagName())); + } + String color = rs.getString("color"); + + 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 + ); + dominions.add(dominion); } return dominions; } @@ -111,33 +118,34 @@ public class DominionDTO { } public static DominionDTO insert(DominionDTO dominion) { - StringBuilder sql = new StringBuilder("INSERT INTO dominion (" + - "owner, name, world, x1, y1, z1, x2, y2, z2, "); - for (Flag f : Flag.getAllDominionFlags()) { - sql.append(f.getFlagName()).append(", "); + Field owner = new Field("owner", dominion.getOwner().toString()); + Field name = new Field("name", dominion.getName()); + Field world = new Field("world", dominion.getWorld()); + Field x1 = new Field("x1", dominion.getX1()); + Field y1 = new Field("y1", dominion.getY1()); + Field z1 = new Field("z1", dominion.getZ1()); + Field x2 = new Field("x2", dominion.getX2()); + Field y2 = new Field("y2", dominion.getY2()); + Field z2 = new Field("z2", dominion.getZ2()); + Field parentDomId = new Field("parent_dom_id", dominion.getParentDomId()); + Field joinMessage = new Field("join_message", "欢迎来到 ${DOM_NAME}!"); + Field leaveMessage = new Field("leave_message", "你正在离开 ${DOM_NAME},欢迎下次光临~"); + Field tpLocation = new Field("tp_location", "default"); + InsertRow insert = new InsertRow().returningAll().table("dominion").onConflictDoNothing(new Field("id", null)); + insert.field(owner).field(name).field(world).field(x1).field(y1).field(z1).field(x2).field(y2).field(z2) + .field(parentDomId).field(joinMessage).field(leaveMessage).field(tpLocation); + for (Flag f : Flag.getDominionFlagsEnabled()) { + insert.field(new Field(f.getFlagName(), f.getDefaultValue())); } - sql.append("tp_location, join_message, leave_message"); - sql.append(") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, "); - for (Flag f : Flag.getAllDominionFlags()) { - sql.append(f.getDefaultValue()).append(", "); + try (ResultSet rs = insert.execute()) { + Cache.instance.loadDominions(); + List dominions = getDTOFromRS(rs); + if (dominions.size() == 0) return null; + return dominions.get(0); + } catch (SQLException e) { + DatabaseManager.handleDatabaseError("数据库操作失败: ", e, insert.toString()); + return null; } - sql.append("'default', ?, ?"); - sql.append(") RETURNING *;"); - List dominions = query(sql.toString(), - dominion.getOwner(), - dominion.getName(), - dominion.getWorld(), - dominion.getX1(), - dominion.getY1(), - dominion.getZ1(), - dominion.getX2(), - dominion.getY2(), - dominion.getZ2(), - "欢迎来到 ${DOM_NAME}!", - "你正在离开 ${DOM_NAME},欢迎下次光临~" - ); - if (dominions.size() == 0) return null; - return dominions.get(0); } public static void delete(DominionDTO dominion) { @@ -153,34 +161,36 @@ public class DominionDTO { Location loc = dominion.getTpLocation(); tp_location = loc.getBlockX() + ":" + loc.getBlockY() + ":" + loc.getBlockZ(); } - StringBuilder sql = new StringBuilder("UPDATE dominion SET " + - "owner = ?," + - "name = ?," + - "world = ?," + - "x1 = " + dominion.getX1() + ", " + - "y1 = " + dominion.getY1() + ", " + - "z1 = " + dominion.getZ1() + ", " + - "x2 = " + dominion.getX2() + ", " + - "y2 = " + dominion.getY2() + ", " + - "z2 = " + dominion.getZ2() + ", " + - "parent_dom_id = " + dominion.getParentDomId() + ", " + - "join_message = ?," + - "leave_message = ?," + - "color = ?,"); + Field owner = new Field("owner", dominion.getOwner().toString()); + Field name = new Field("name", dominion.getName()); + Field world = new Field("world", dominion.getWorld()); + Field x1 = new Field("x1", dominion.getX1()); + Field y1 = new Field("y1", dominion.getY1()); + Field z1 = new Field("z1", dominion.getZ1()); + Field x2 = new Field("x2", dominion.getX2()); + Field y2 = new Field("y2", dominion.getY2()); + Field z2 = new Field("z2", dominion.getZ2()); + Field parentDomId = new Field("parent_dom_id", dominion.getParentDomId()); + Field joinMessage = new Field("join_message", dominion.getJoinMessage()); + Field leaveMessage = new Field("leave_message", dominion.getLeaveMessage()); + Field tpLocation = new Field("tp_location", tp_location); + Field color = new Field("color", dominion.getColor()); + Field id = new Field("id", dominion.getId()); + UpdateRow update = new UpdateRow().returningAll(id).table("dominion").where("id = ?", id.value); for (Flag f : Flag.getDominionFlagsEnabled()) { - sql.append(f.getFlagName()).append(" = ").append(dominion.getFlagValue(f)).append(","); + update.field(new Field(f.getFlagName(), dominion.getFlagValue(f))); + } + update.field(owner).field(name).field(world).field(x1).field(y1).field(z1).field(x2).field(y2).field(z2) + .field(parentDomId).field(joinMessage).field(leaveMessage).field(tpLocation).field(color); + try { + List dominions = getDTOFromRS(update.execute()); + Cache.instance.loadDominions(); + if (dominions.size() == 0) return null; + return dominions.get(0); + } catch (SQLException e) { + DatabaseManager.handleDatabaseError("数据库操作失败: ", e, update.toString()); + return null; } - sql.append("tp_location = ?" + " WHERE id = ").append(dominion.getId()).append(" RETURNING *;"); - List dominions = query(sql.toString(), - dominion.getOwner().toString(), - dominion.getName(), - dominion.getWorld(), - dominion.getJoinMessage(), - dominion.getLeaveMessage(), - dominion.getColor(), - tp_location); - if (dominions.size() == 0) return null; - return dominions.get(0); } private DominionDTO(Integer id, UUID owner, String name, String world, diff --git a/src/main/java/cn/lunadeer/dominion/dtos/PlayerDTO.java b/src/main/java/cn/lunadeer/dominion/dtos/PlayerDTO.java index 4825423..99d6eb1 100644 --- a/src/main/java/cn/lunadeer/dominion/dtos/PlayerDTO.java +++ b/src/main/java/cn/lunadeer/dominion/dtos/PlayerDTO.java @@ -1,10 +1,15 @@ package cn.lunadeer.dominion.dtos; -import cn.lunadeer.dominion.Dominion; +import cn.lunadeer.minecraftpluginutils.databse.DatabaseManager; +import cn.lunadeer.minecraftpluginutils.databse.Field; +import cn.lunadeer.minecraftpluginutils.databse.syntax.InsertRow; +import cn.lunadeer.minecraftpluginutils.databse.syntax.UpdateRow; import org.bukkit.entity.Player; import java.sql.ResultSet; import java.sql.SQLException; +import java.sql.Timestamp; +import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; import java.util.UUID; @@ -30,18 +35,24 @@ public class PlayerDTO { private static List query(String sql, Object... params) { List players = new ArrayList<>(); - try (ResultSet rs = Dominion.database.query(sql, params)) { - if (rs == null) return players; - while (rs.next()) { - Integer id = rs.getInt("id"); - UUID uuid = UUID.fromString(rs.getString("uuid")); - String lastKnownName = rs.getString("last_known_name"); - Long lastJoinAt = rs.getTimestamp("last_join_at").getTime(); - PlayerDTO player = new PlayerDTO(id, uuid, lastKnownName, lastJoinAt); - players.add(player); - } + try (ResultSet rs = DatabaseManager.instance.query(sql, params)) { + return getDTOFromRS(rs); } catch (SQLException e) { - Dominion.database.handleDatabaseError("查询玩家信息失败: ", e, sql); + DatabaseManager.handleDatabaseError("查询玩家信息失败: ", e, sql); + } + return players; + } + + private static List getDTOFromRS(ResultSet rs) throws SQLException { + List players = new ArrayList<>(); + if (rs == null) return players; + while (rs.next()) { + Integer id = rs.getInt("id"); + UUID uuid = UUID.fromString(rs.getString("uuid")); + String lastKnownName = rs.getString("last_known_name"); + Long lastJoinAt = rs.getTimestamp("last_join_at").getTime(); + PlayerDTO player = new PlayerDTO(id, uuid, lastKnownName, lastJoinAt); + players.add(player); } return players; } @@ -72,24 +83,44 @@ public class PlayerDTO { } private static PlayerDTO insert(PlayerDTO player) { - String sql = "INSERT INTO player_name (uuid, last_known_name, last_join_at) " + - "VALUES" + - " (?, ?, CURRENT_TIMESTAMP) " + - "RETURNING *;"; - List players = query(sql, player.getUuid().toString(), player.getLastKnownName()); - if (players.size() == 0) return null; - return players.get(0); + Field uuid = new Field("uuid", player.getUuid().toString()); + Field lastKnownName = new Field("last_known_name", player.getLastKnownName()); + Field lastJoinAt = new Field("last_join_at", Timestamp.valueOf(LocalDateTime.now())); + InsertRow insertRow = new InsertRow() + .table("player_name") + .field(uuid) + .field(lastKnownName) + .field(lastJoinAt) + .returningAll() + .onConflictOverwrite(new Field("id", null)); + try (ResultSet rs = insertRow.execute()) { + List players = getDTOFromRS(rs); + if (players.size() == 0) return null; + return players.get(0); + } catch (SQLException e) { + DatabaseManager.handleDatabaseError("插入玩家信息失败: ", e, insertRow.toString()); + return null; + } } private static PlayerDTO update(PlayerDTO player) { - String sql = "UPDATE player_name SET " + - "last_known_name = ?, " + - "last_join_at = CURRENT_TIMESTAMP " + - "WHERE uuid = ? " + - "RETURNING *;"; - List players = query(sql, player.getLastKnownName(), player.getUuid().toString()); - if (players.size() == 0) return null; - return players.get(0); + Field lastKnownName = new Field("last_known_name", player.getLastKnownName()); + Field uuid = new Field("uuid", player.getUuid().toString()); + Field lastJoinAt = new Field("last_join_at", Timestamp.valueOf(LocalDateTime.now())); + UpdateRow updateRow = new UpdateRow() + .table("player_name") + .field(lastKnownName) + .field(lastJoinAt) + .where("uuid = ?", uuid.value) + .returningAll(uuid); + try (ResultSet rs = updateRow.execute()) { + List players = getDTOFromRS(rs); + if (players.size() == 0) return null; + return players.get(0); + } catch (SQLException e) { + DatabaseManager.handleDatabaseError("更新玩家信息失败: ", e, updateRow.toString()); + return null; + } } private PlayerDTO(Integer id, UUID uuid, String lastKnownName, Long lastJoinAt) { diff --git a/src/main/java/cn/lunadeer/dominion/dtos/PlayerPrivilegeDTO.java b/src/main/java/cn/lunadeer/dominion/dtos/PlayerPrivilegeDTO.java index ec11ef1..1ffcbef 100644 --- a/src/main/java/cn/lunadeer/dominion/dtos/PlayerPrivilegeDTO.java +++ b/src/main/java/cn/lunadeer/dominion/dtos/PlayerPrivilegeDTO.java @@ -1,35 +1,84 @@ package cn.lunadeer.dominion.dtos; import cn.lunadeer.dominion.Cache; -import cn.lunadeer.dominion.Dominion; +import cn.lunadeer.minecraftpluginutils.databse.DatabaseManager; +import cn.lunadeer.minecraftpluginutils.databse.Field; +import cn.lunadeer.minecraftpluginutils.databse.syntax.InsertRow; +import cn.lunadeer.minecraftpluginutils.databse.syntax.UpdateRow; import java.sql.ResultSet; import java.util.*; public class PlayerPrivilegeDTO { + private static List getDTOFromRS(ResultSet rs) { + List players = new ArrayList<>(); + if (rs == null) return players; + try { + while (rs.next()) { + Map flags = new HashMap<>(); + for (Flag f : Flag.getPrivilegeFlagsEnabled()) { + flags.put(f, rs.getBoolean(f.getFlagName())); + } + PlayerPrivilegeDTO player = new PlayerPrivilegeDTO( + rs.getInt("id"), + UUID.fromString(rs.getString("player_uuid")), + rs.getBoolean("admin"), + rs.getInt("dom_id"), + flags + ); + players.add(player); + } + } catch (Exception e) { + DatabaseManager.handleDatabaseError("查询玩家权限失败: ", e, ""); + } + return players; + } + + private static PlayerPrivilegeDTO update(PlayerPrivilegeDTO player) { + Field admin = new Field("admin", player.getAdmin()); + Field domID = new Field("dom_id", player.getDomID()); + Field id = new Field("id", player.getId()); + UpdateRow updateRow = new UpdateRow().returningAll(id) + .table("player_privilege") + .field(admin) + .field(domID) + .where("id = ?", id.value); + for (Flag f : Flag.getPrivilegeFlagsEnabled()) { + updateRow.field(new Field(f.getFlagName(), player.getFlagValue(f))); + } + try (ResultSet rs = updateRow.execute()) { + Cache.instance.loadPlayerPrivileges(); + List players = getDTOFromRS(rs); + if (players.size() == 0) return null; + return players.get(0); + } catch (Exception e) { + DatabaseManager.handleDatabaseError("更新玩家权限失败: ", e, ""); + return null; + } + } + public static PlayerPrivilegeDTO insert(PlayerPrivilegeDTO player) { - StringBuilder sql = new StringBuilder("INSERT INTO player_privilege (player_uuid, admin, dom_id, "); - - for (Flag f : Flag.getAllPrivilegeFlags()) { - sql.append(f.getFlagName()).append(", "); + Field playerUUID = new Field("player_uuid", player.getPlayerUUID().toString()); + Field admin = new Field("admin", player.getAdmin()); + Field domID = new Field("dom_id", player.getDomID()); + InsertRow insertRow = new InsertRow().returningAll().onConflictDoNothing(new Field("id", null)) + .table("player_privilege") + .field(playerUUID) + .field(admin) + .field(domID); + for (Flag f : Flag.getPrivilegeFlagsEnabled()) { + insertRow.field(new Field(f.getFlagName(), player.getFlagValue(f))); } - sql = new StringBuilder(sql.substring(0, sql.length() - 2)); - - sql.append(") VALUES ('") - .append(player.getPlayerUUID()).append("', ") - .append(player.getAdmin()).append(", ") - .append(player.getDomID()).append(", "); - - for (Flag f : Flag.getAllPrivilegeFlags()) { - sql.append(player.getFlagValue(f)).append(", "); + try (ResultSet rs = insertRow.execute()) { + Cache.instance.loadPlayerPrivileges(); + List players = getDTOFromRS(rs); + if (players.size() == 0) return null; + return players.get(0); + } catch (Exception e) { + DatabaseManager.handleDatabaseError("插入玩家权限失败: ", e, ""); + return null; } - sql = new StringBuilder(sql.substring(0, sql.length() - 2)); - - sql.append(") RETURNING *;"); - List players = query(sql.toString()); - if (players.size() == 0) return null; - return players.get(0); } public static PlayerPrivilegeDTO select(UUID playerUUID, Integer dom_id) { @@ -125,44 +174,16 @@ public class PlayerPrivilegeDTO { private static List query(String sql, Object... params) { List players = new ArrayList<>(); - try (ResultSet rs = Dominion.database.query(sql, params)) { + try (ResultSet rs = DatabaseManager.instance.query(sql, params)) { if (sql.contains("UPDATE") || sql.contains("DELETE") || sql.contains("INSERT")) { // 如果是更新操作,重新加载缓存 Cache.instance.loadPlayerPrivileges(); } - if (rs == null) return players; - while (rs.next()) { - Map flags = new HashMap<>(); - for (Flag f : Flag.getPrivilegeFlagsEnabled()) { - flags.put(f, rs.getBoolean(f.getFlagName())); - } - PlayerPrivilegeDTO player = new PlayerPrivilegeDTO( - rs.getInt("id"), - UUID.fromString(rs.getString("player_uuid")), - rs.getBoolean("admin"), - rs.getInt("dom_id"), - flags - ); - players.add(player); - } + return getDTOFromRS(rs); } catch (Exception e) { - Dominion.database.handleDatabaseError("查询玩家权限失败: ", e, sql); + DatabaseManager.handleDatabaseError("查询玩家权限失败: ", e, sql); } return players; } - private static PlayerPrivilegeDTO update(PlayerPrivilegeDTO player) { - String sql = "UPDATE player_privilege SET " + - "admin = " + player.getAdmin() + ", " + - "dom_id = " + player.getDomID() + ", "; - for (Flag f : Flag.getPrivilegeFlagsEnabled()) { - sql += f.getFlagName() + " = " + player.getFlagValue(f) + ", "; - } - sql = sql.substring(0, sql.length() - 2); - sql += " WHERE id = " + player.getId() + " " + - "RETURNING *;"; - List players = query(sql); - if (players.size() == 0) return null; - return players.get(0); - } } diff --git a/src/main/java/cn/lunadeer/dominion/dtos/PrivilegeTemplateDTO.java b/src/main/java/cn/lunadeer/dominion/dtos/PrivilegeTemplateDTO.java index 67484e7..b12e1ad 100644 --- a/src/main/java/cn/lunadeer/dominion/dtos/PrivilegeTemplateDTO.java +++ b/src/main/java/cn/lunadeer/dominion/dtos/PrivilegeTemplateDTO.java @@ -1,6 +1,9 @@ package cn.lunadeer.dominion.dtos; -import cn.lunadeer.dominion.Dominion; +import cn.lunadeer.minecraftpluginutils.databse.DatabaseManager; +import cn.lunadeer.minecraftpluginutils.databse.Field; +import cn.lunadeer.minecraftpluginutils.databse.syntax.InsertRow; +import cn.lunadeer.minecraftpluginutils.databse.syntax.UpdateRow; import java.sql.ResultSet; import java.util.*; @@ -9,8 +12,18 @@ public class PrivilegeTemplateDTO { private static List query(String sql, Object... params) { List templates = new ArrayList<>(); - try (ResultSet rs = Dominion.database.query(sql, params)) { - if (rs == null) return templates; + try (ResultSet rs = DatabaseManager.instance.query(sql, params)) { + return getDTOFromRS(rs); + } catch (Exception e) { + DatabaseManager.handleDatabaseError("查询权限模版失败: ", e, sql); + } + return templates; + } + + private static List getDTOFromRS(ResultSet rs) { + List templates = new ArrayList<>(); + if (rs == null) return templates; + try { while (rs.next()) { Map flags = new HashMap<>(); for (Flag f : Flag.getPrivilegeFlagsEnabled()) { @@ -26,16 +39,26 @@ public class PrivilegeTemplateDTO { templates.add(template); } } catch (Exception e) { - Dominion.database.handleDatabaseError("查询权限模版失败: ", e, sql); + DatabaseManager.handleDatabaseError("查询权限模版失败: ", e, null); } return templates; } public static PrivilegeTemplateDTO create(UUID creator, String name) { - String sql = "INSERT INTO privilege_template (creator, name) VALUES (?, ?) RETURNING *;"; - List templates = query(sql, creator.toString(), name); - if (templates.size() == 0) return null; - return templates.get(0); + Field creatorField = new Field("creator", creator.toString()); + Field nameField = new Field("name", name); + InsertRow insertRow = new InsertRow().table("privilege_template").onConflictDoNothing(new Field("id", null)) + .field(creatorField) + .field(nameField) + .returningAll(); + try (ResultSet rs = insertRow.execute()) { + List templates = getDTOFromRS(rs); + if (templates.size() == 0) return null; + return templates.get(0); + } catch (Exception e) { + DatabaseManager.handleDatabaseError("创建权限模版失败: ", e, null); + return null; + } } public static PrivilegeTemplateDTO select(UUID creator, String name) { @@ -102,16 +125,25 @@ public class PrivilegeTemplateDTO { } private static PrivilegeTemplateDTO update(PrivilegeTemplateDTO template) { - StringBuilder sql = new StringBuilder("UPDATE privilege_template SET " + - "name = ?, " + - "admin = ?, "); + Field name = new Field("name", template.getName()); + Field admin = new Field("admin", template.getAdmin()); + Field id = new Field("id", template.getId()); + UpdateRow updateRow = new UpdateRow().table("privilege_template") + .field(name) + .field(admin) + .returningAll(id) + .where("id = ?", id.value); for (Flag f : Flag.getPrivilegeFlagsEnabled()) { - sql.append(f.getFlagName()).append(" = ").append(template.getFlagValue(f)).append(", "); + updateRow.field(new Field(f.getFlagName(), template.getFlagValue(f))); + } + try (ResultSet rs = updateRow.execute()) { + List templates = getDTOFromRS(rs); + if (templates.size() == 0) return null; + return templates.get(0); + } catch (Exception e) { + DatabaseManager.handleDatabaseError("更新权限模版失败: ", e, updateRow.toString()); + return null; } - sql = new StringBuilder(sql.substring(0, sql.length() - 2) + " WHERE id = ? RETURNING *;"); - List templates = query(sql.toString(), template.getName(), template.getAdmin(), template.getId()); - if (templates.size() == 0) return null; - return templates.get(0); } } diff --git a/src/main/java/cn/lunadeer/dominion/managers/DatabaseTables.java b/src/main/java/cn/lunadeer/dominion/managers/DatabaseTables.java index 4d87c8a..f141507 100644 --- a/src/main/java/cn/lunadeer/dominion/managers/DatabaseTables.java +++ b/src/main/java/cn/lunadeer/dominion/managers/DatabaseTables.java @@ -11,9 +11,9 @@ import cn.lunadeer.minecraftpluginutils.databse.syntax.InsertRow; public class DatabaseTables { public static void migrate() { // player name - TableColumn player_name_id = new TableColumn("id", FieldType.INT, true, true, true, true, null); - TableColumn player_name_uuid = new TableColumn("uuid", FieldType.STRING, false, false, true, true, null); - TableColumn player_name_last_known_name = new TableColumn("last_known_name", FieldType.STRING, false, false, true, false, null); + TableColumn player_name_id = new TableColumn("id", FieldType.INT, true, true, true, true, 0); + TableColumn player_name_uuid = new TableColumn("uuid", FieldType.STRING, false, false, true, true, "''"); + TableColumn player_name_last_known_name = new TableColumn("last_known_name", FieldType.STRING, false, false, true, false, "'unknown'"); TableColumn player_name_last_join_at = new TableColumn("last_join_at", FieldType.DATETIME, false, false, true, false, "CURRENT_TIMESTAMP"); CreateTable player_name = new CreateTable().ifNotExists(); player_name.table("player_name") @@ -24,16 +24,16 @@ public class DatabaseTables { player_name.execute(); // dominion table - TableColumn dominion_id = new TableColumn("id", FieldType.INT, true, true, true, true, null); - TableColumn dominion_owner = new TableColumn("owner", FieldType.STRING, false, false, true, false, null); - TableColumn dominion_name = new TableColumn("name", FieldType.STRING, false, false, true, false, null); - TableColumn dominion_world = new TableColumn("world", FieldType.STRING, false, false, true, false, null); - TableColumn dominion_x1 = new TableColumn("x1", FieldType.INT, false, false, true, false, null); - TableColumn dominion_y1 = new TableColumn("y1", FieldType.INT, false, false, true, false, null); - TableColumn dominion_z1 = new TableColumn("z1", FieldType.INT, false, false, true, false, null); - TableColumn dominion_x2 = new TableColumn("x2", FieldType.INT, false, false, true, false, null); - TableColumn dominion_y2 = new TableColumn("y2", FieldType.INT, false, false, true, false, null); - TableColumn dominion_z2 = new TableColumn("z2", FieldType.INT, false, false, true, false, null); + TableColumn dominion_id = new TableColumn("id", FieldType.INT, true, true, true, true, 0); + TableColumn dominion_owner = new TableColumn("owner", FieldType.STRING, false, false, true, false, "''"); + TableColumn dominion_name = new TableColumn("name", FieldType.STRING, false, false, true, false, "'未命名'"); + TableColumn dominion_world = new TableColumn("world", FieldType.STRING, false, false, true, false, "'world'"); + TableColumn dominion_x1 = new TableColumn("x1", FieldType.INT, false, false, true, false, 0); + TableColumn dominion_y1 = new TableColumn("y1", FieldType.INT, false, false, true, false, 0); + TableColumn dominion_z1 = new TableColumn("z1", FieldType.INT, false, false, true, false, 0); + TableColumn dominion_x2 = new TableColumn("x2", FieldType.INT, false, false, true, false, 0); + TableColumn dominion_y2 = new TableColumn("y2", FieldType.INT, false, false, true, false, 0); + TableColumn dominion_z2 = new TableColumn("z2", FieldType.INT, false, false, true, false, 0); TableColumn dominion_parent_dom_id = new TableColumn("parent_dom_id", FieldType.INT, false, false, true, false, -1); TableColumn dominion_join_message = new TableColumn("join_message", FieldType.STRING, false, false, true, false, "'欢迎'"); TableColumn dominion_leave_message = new TableColumn("leave_message", FieldType.STRING, false, false, true, false, "'再见'"); @@ -59,9 +59,9 @@ public class DatabaseTables { dominion.execute(); // player privilege - TableColumn player_privilege_id = new TableColumn("id", FieldType.INT, true, true, true, true, null); - TableColumn player_privilege_player_uuid = new TableColumn("player_uuid", FieldType.STRING, false, false, true, false, null); - TableColumn player_privilege_dom_id = new TableColumn("dom_id", FieldType.INT, false, false, true, false, null); + TableColumn player_privilege_id = new TableColumn("id", FieldType.INT, true, true, true, true, 0); + TableColumn player_privilege_player_uuid = new TableColumn("player_uuid", FieldType.STRING, false, false, true, false, "''"); + TableColumn player_privilege_dom_id = new TableColumn("dom_id", FieldType.INT, false, false, true, false, -1); TableColumn player_privilege_admin = new TableColumn("admin", FieldType.BOOLEAN, false, false, true, false, false); CreateTable.ForeignKey player_privilege_player_uuid_fk = new CreateTable.ForeignKey(player_privilege_player_uuid, "player_name", player_name_uuid, true); CreateTable.ForeignKey player_privilege_dom_id_fk = new CreateTable.ForeignKey(player_privilege_dom_id, "dominion", dominion_id, true); @@ -74,7 +74,7 @@ public class DatabaseTables { .foreignKey(player_privilege_player_uuid_fk) .foreignKey(player_privilege_dom_id_fk) .unique(player_privilege_player_uuid, player_privilege_dom_id); - player_name.execute(); + player_privilege.execute(); // server root player name Field server_player_name_id_field = new Field("id", -1); @@ -131,9 +131,9 @@ public class DatabaseTables { new AddColumn(dominion_tp_location).table("dominion").ifNotExists().execute(); // 1.31.0 - TableColumn privilege_template_id = new TableColumn("id", FieldType.INT, true, true, true, true, null); - TableColumn privilege_template_creator = new TableColumn("creator", FieldType.STRING, false, false, true, false, null); - TableColumn privilege_template_name = new TableColumn("name", FieldType.STRING, false, false, true, false, null); + TableColumn privilege_template_id = new TableColumn("id", FieldType.INT, true, true, true, true, 0); + TableColumn privilege_template_creator = new TableColumn("creator", FieldType.STRING, false, false, true, false, "''"); + TableColumn privilege_template_name = new TableColumn("name", FieldType.STRING, false, false, true, false, "'未命名'"); TableColumn privilege_template_admin = new TableColumn("admin", FieldType.BOOLEAN, false, false, true, false, false); CreateTable.ForeignKey privilege_template_creator_fk = new CreateTable.ForeignKey(privilege_template_creator, "player_name", player_name_uuid, true); CreateTable privilege_template = new CreateTable().ifNotExists(); From 6f0b97f458d42f40a217df3eaea2722535d890e8 Mon Sep 17 00:00:00 2001 From: zhangyuheng Date: Thu, 20 Jun 2024 00:53:46 +0800 Subject: [PATCH 12/26] =?UTF-8?q?=E5=88=9D=E6=AD=A5=E5=AE=9E=E7=8E=B0mysql?= =?UTF-8?q?=E6=94=AF=E6=8C=81=EF=BC=8C=E5=88=9D=E6=AD=A5=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E4=BA=86=E4=B8=89=E7=A7=8D=E6=95=B0=E6=8D=AE=E5=BA=93=EF=BC=88?= =?UTF-8?q?=E6=9A=82=E6=97=A0=E9=97=AE=E9=A2=98=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 +- pom.xml | 2 +- .../controllers/PrivilegeController.java | 9 +- .../lunadeer/dominion/dtos/DominionDTO.java | 111 ++++++++---------- .../dominion/dtos/PlayerPrivilegeDTO.java | 29 ++--- .../dominion/dtos/PrivilegeTemplateDTO.java | 41 +++---- .../lunadeer/dominion/tuis/PrivilegeInfo.java | 6 +- 7 files changed, 96 insertions(+), 106 deletions(-) diff --git a/README.md b/README.md index 9ba3a2f..feb2fa2 100644 --- a/README.md +++ b/README.md @@ -30,13 +30,13 @@ ## 功能介绍 -- 支持 Postgresql 或 sqlite 存储数据; +- 支持 Postgresql、Mysql、Sqlite3 存储数据; - 支持BlueMap卫星地图渲染; - 支持为玩家单独设置特权; - 支持设置领地管理员; - 支持子领地; - 采用 TUI 方式进行权限配置交互,简单快捷; -- 支持基础价格系统; +- 支持经济系统(需要 Vault 前置); - 领地区域可视化; - 管理员可在游戏内使用TUI配置领地系统; diff --git a/pom.xml b/pom.xml index 0648b7f..edee239 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ cn.lunadeer Dominion - 1.33.1-beta + 1.33.1-mysql-beta jar Dominion diff --git a/src/main/java/cn/lunadeer/dominion/controllers/PrivilegeController.java b/src/main/java/cn/lunadeer/dominion/controllers/PrivilegeController.java index c210837..218e909 100644 --- a/src/main/java/cn/lunadeer/dominion/controllers/PrivilegeController.java +++ b/src/main/java/cn/lunadeer/dominion/controllers/PrivilegeController.java @@ -103,12 +103,17 @@ public class PrivilegeController { privilege = createPlayerPrivilege(operator, player.getUuid(), dominion); if (privilege == null) return; } - if (flag.equals("admin") || privilege.getAdmin()) { + if (privilege.getAdmin()) { if (notOwner(operator, dominion)) { operator.setResponse(FAIL.addMessage("你不是领地 %s 的拥有者,无法修改其他管理员的权限", dominionName)); return; } - privilege.setAdmin(value); + if (flag.equals("admin")) { + privilege.setAdmin(value); + } else { + operator.setResponse(FAIL.addMessage("管理员拥有所有权限,无需单独设置权限")); + return; + } } else { Flag f = Flag.getFlag(flag); if (f == null) { diff --git a/src/main/java/cn/lunadeer/dominion/dtos/DominionDTO.java b/src/main/java/cn/lunadeer/dominion/dtos/DominionDTO.java index 6a757ef..56be995 100644 --- a/src/main/java/cn/lunadeer/dominion/dtos/DominionDTO.java +++ b/src/main/java/cn/lunadeer/dominion/dtos/DominionDTO.java @@ -153,46 +153,6 @@ public class DominionDTO { query(sql, dominion.getId()); } - private static DominionDTO update(DominionDTO dominion) { - String tp_location; - if (dominion.getTpLocation() == null) { - tp_location = "default"; - } else { - Location loc = dominion.getTpLocation(); - tp_location = loc.getBlockX() + ":" + loc.getBlockY() + ":" + loc.getBlockZ(); - } - Field owner = new Field("owner", dominion.getOwner().toString()); - Field name = new Field("name", dominion.getName()); - Field world = new Field("world", dominion.getWorld()); - Field x1 = new Field("x1", dominion.getX1()); - Field y1 = new Field("y1", dominion.getY1()); - Field z1 = new Field("z1", dominion.getZ1()); - Field x2 = new Field("x2", dominion.getX2()); - Field y2 = new Field("y2", dominion.getY2()); - Field z2 = new Field("z2", dominion.getZ2()); - Field parentDomId = new Field("parent_dom_id", dominion.getParentDomId()); - Field joinMessage = new Field("join_message", dominion.getJoinMessage()); - Field leaveMessage = new Field("leave_message", dominion.getLeaveMessage()); - Field tpLocation = new Field("tp_location", tp_location); - Field color = new Field("color", dominion.getColor()); - Field id = new Field("id", dominion.getId()); - UpdateRow update = new UpdateRow().returningAll(id).table("dominion").where("id = ?", id.value); - for (Flag f : Flag.getDominionFlagsEnabled()) { - update.field(new Field(f.getFlagName(), dominion.getFlagValue(f))); - } - update.field(owner).field(name).field(world).field(x1).field(y1).field(z1).field(x2).field(y2).field(z2) - .field(parentDomId).field(joinMessage).field(leaveMessage).field(tpLocation).field(color); - try { - List dominions = getDTOFromRS(update.execute()); - Cache.instance.loadDominions(); - if (dominions.size() == 0) return null; - return dominions.get(0); - } catch (SQLException e) { - DatabaseManager.handleDatabaseError("数据库操作失败: ", e, update.toString()); - return null; - } - } - private DominionDTO(Integer id, UUID owner, String name, String world, Integer x1, Integer y1, Integer z1, Integer x2, Integer y2, Integer z2, Integer parentDomId, @@ -262,18 +222,30 @@ public class DominionDTO { return id; } - public DominionDTO setId(Integer id) { - this.id = id; - return update(this); - } - public UUID getOwner() { return owner; } + private DominionDTO doUpdate(UpdateRow updateRow) { + Field id = new Field("id", this.id); + updateRow.returningAll(id) + .table("dominion") + .where("id = ?", id.value); + try (ResultSet rs = updateRow.execute()) { + List dominions = getDTOFromRS(rs); + if (dominions.size() == 0) return null; + Cache.instance.loadDominions(); + return dominions.get(0); + } catch (SQLException e) { + DatabaseManager.handleDatabaseError("更新领地信息失败: ", e, updateRow.toString()); + return null; + } + } + public DominionDTO setOwner(UUID owner) { this.owner = owner; - return update(this); + Field ownerField = new Field("owner", owner.toString()); + return doUpdate(new UpdateRow().field(ownerField)); } public String getName() { @@ -282,7 +254,8 @@ public class DominionDTO { public DominionDTO setName(String name) { this.name = name; - return update(this); + Field nameField = new Field("name", name); + return doUpdate(new UpdateRow().field(nameField)); } public String getWorld() { @@ -295,7 +268,8 @@ public class DominionDTO { public DominionDTO setX1(Integer x1) { this.x1 = x1; - return update(this); + Field x1Field = new Field("x1", x1); + return doUpdate(new UpdateRow().field(x1Field)); } public Integer getY1() { @@ -304,7 +278,8 @@ public class DominionDTO { public DominionDTO setY1(Integer y1) { this.y1 = y1; - return update(this); + Field y1Field = new Field("y1", y1); + return doUpdate(new UpdateRow().field(y1Field)); } public Integer getZ1() { @@ -313,7 +288,8 @@ public class DominionDTO { public DominionDTO setZ1(Integer z1) { this.z1 = z1; - return update(this); + Field z1Field = new Field("z1", z1); + return doUpdate(new UpdateRow().field(z1Field)); } public Integer getX2() { @@ -322,7 +298,8 @@ public class DominionDTO { public DominionDTO setX2(Integer x2) { this.x2 = x2; - return update(this); + Field x2Field = new Field("x2", x2); + return doUpdate(new UpdateRow().field(x2Field)); } public Integer getY2() { @@ -331,7 +308,8 @@ public class DominionDTO { public DominionDTO setY2(Integer y2) { this.y2 = y2; - return update(this); + Field y2Field = new Field("y2", y2); + return doUpdate(new UpdateRow().field(y2Field)); } public Integer getZ2() { @@ -340,7 +318,8 @@ public class DominionDTO { public DominionDTO setZ2(Integer z2) { this.z2 = z2; - return update(this); + Field z2Field = new Field("z2", z2); + return doUpdate(new UpdateRow().field(z2Field)); } public Integer getSquare() { @@ -369,7 +348,8 @@ public class DominionDTO { public DominionDTO setParentDomId(Integer parentDomId) { this.parentDomId = parentDomId; - return update(this); + Field parentDomIdField = new Field("parent_dom_id", parentDomId); + return doUpdate(new UpdateRow().field(parentDomIdField)); } public String getJoinMessage() { @@ -378,7 +358,8 @@ public class DominionDTO { public DominionDTO setJoinMessage(String joinMessage) { this.joinMessage = joinMessage; - return update(this); + Field joinMessageField = new Field("join_message", joinMessage); + return doUpdate(new UpdateRow().field(joinMessageField)); } public String getLeaveMessage() { @@ -387,7 +368,8 @@ public class DominionDTO { public DominionDTO setLeaveMessage(String leaveMessage) { this.leaveMessage = leaveMessage; - return update(this); + Field leaveMessageField = new Field("leave_message", leaveMessage); + return doUpdate(new UpdateRow().field(leaveMessageField)); } public Boolean getFlagValue(Flag flag) { @@ -397,7 +379,8 @@ public class DominionDTO { public DominionDTO setFlagValue(Flag flag, Boolean value) { flags.put(flag, value); - return update(this); + Field flagField = new Field(flag.getFlagName(), value); + return doUpdate(new UpdateRow().field(flagField)); } public DominionDTO setXYZ(Integer x1, Integer y1, Integer z1, Integer x2, Integer y2, Integer z2) { @@ -407,7 +390,13 @@ public class DominionDTO { this.x2 = x2; this.y2 = y2; this.z2 = z2; - return update(this); + Field x1Field = new Field("x1", x1); + Field y1Field = new Field("y1", y1); + Field z1Field = new Field("z1", z1); + Field x2Field = new Field("x2", x2); + Field y2Field = new Field("y2", y2); + Field z2Field = new Field("z2", z2); + return doUpdate(new UpdateRow().field(x1Field).field(y1Field).field(z1Field).field(x2Field).field(y2Field).field(z2Field)); } public Location getTpLocation() { @@ -429,7 +418,8 @@ public class DominionDTO { public DominionDTO setTpLocation(Location loc) { this.tp_location = loc.getBlockX() + ":" + loc.getBlockY() + ":" + loc.getBlockZ(); - return update(this); + Field tpLocationField = new Field("tp_location", tp_location); + return doUpdate(new UpdateRow().field(tpLocationField)); } public Location getLocation1() { @@ -442,7 +432,8 @@ public class DominionDTO { public DominionDTO setColor(String color) { this.color = color; - return update(this); + Field colorField = new Field("color", color); + return doUpdate(new UpdateRow().field(colorField)); } public int getColorR() { diff --git a/src/main/java/cn/lunadeer/dominion/dtos/PlayerPrivilegeDTO.java b/src/main/java/cn/lunadeer/dominion/dtos/PlayerPrivilegeDTO.java index 1ffcbef..eaa2338 100644 --- a/src/main/java/cn/lunadeer/dominion/dtos/PlayerPrivilegeDTO.java +++ b/src/main/java/cn/lunadeer/dominion/dtos/PlayerPrivilegeDTO.java @@ -1,6 +1,7 @@ package cn.lunadeer.dominion.dtos; import cn.lunadeer.dominion.Cache; +import cn.lunadeer.minecraftpluginutils.XLogger; import cn.lunadeer.minecraftpluginutils.databse.DatabaseManager; import cn.lunadeer.minecraftpluginutils.databse.Field; import cn.lunadeer.minecraftpluginutils.databse.syntax.InsertRow; @@ -35,22 +36,15 @@ public class PlayerPrivilegeDTO { return players; } - private static PlayerPrivilegeDTO update(PlayerPrivilegeDTO player) { - Field admin = new Field("admin", player.getAdmin()); - Field domID = new Field("dom_id", player.getDomID()); - Field id = new Field("id", player.getId()); - UpdateRow updateRow = new UpdateRow().returningAll(id) + private PlayerPrivilegeDTO doUpdate(UpdateRow updateRow) { + Field id = new Field("id", this.id); + updateRow.returningAll(id) .table("player_privilege") - .field(admin) - .field(domID) .where("id = ?", id.value); - for (Flag f : Flag.getPrivilegeFlagsEnabled()) { - updateRow.field(new Field(f.getFlagName(), player.getFlagValue(f))); - } try (ResultSet rs = updateRow.execute()) { - Cache.instance.loadPlayerPrivileges(); List players = getDTOFromRS(rs); if (players.size() == 0) return null; + Cache.instance.loadPlayerPrivileges(); return players.get(0); } catch (Exception e) { DatabaseManager.handleDatabaseError("更新玩家权限失败: ", e, ""); @@ -138,20 +132,27 @@ public class PlayerPrivilegeDTO { public PlayerPrivilegeDTO setFlagValue(Flag flag, Boolean value) { flags.put(flag, value); - return update(this); + Field f = new Field(flag.getFlagName(), value); + UpdateRow updateRow = new UpdateRow().field(f); + XLogger.debug("setFlagValue: " + updateRow.toString()); + return doUpdate(updateRow); } public PlayerPrivilegeDTO setAdmin(Boolean admin) { this.admin = admin; - return update(this); + Field f = new Field("admin", admin); + UpdateRow updateRow = new UpdateRow().field(f); + return doUpdate(updateRow); } public PlayerPrivilegeDTO applyTemplate(PrivilegeTemplateDTO template) { this.admin = template.getAdmin(); + UpdateRow updateRow = new UpdateRow().field(new Field("admin", admin)); for (Flag f : Flag.getPrivilegeFlagsEnabled()) { this.flags.put(f, template.getFlagValue(f)); + updateRow.field(new Field(f.getFlagName(), template.getFlagValue(f))); } - return update(this); + return doUpdate(updateRow); } private PlayerPrivilegeDTO(Integer id, UUID playerUUID, Boolean admin, Integer domID, Map flags) { diff --git a/src/main/java/cn/lunadeer/dominion/dtos/PrivilegeTemplateDTO.java b/src/main/java/cn/lunadeer/dominion/dtos/PrivilegeTemplateDTO.java index b12e1ad..6b48c89 100644 --- a/src/main/java/cn/lunadeer/dominion/dtos/PrivilegeTemplateDTO.java +++ b/src/main/java/cn/lunadeer/dominion/dtos/PrivilegeTemplateDTO.java @@ -61,6 +61,21 @@ public class PrivilegeTemplateDTO { } } + private PrivilegeTemplateDTO doUpdate(UpdateRow updateRow) { + Field id = new Field("id", this.id); + updateRow.returningAll(id) + .table("privilege_template") + .where("id = ?", id.value); + try (ResultSet rs = updateRow.execute()) { + List templates = getDTOFromRS(rs); + if (templates.size() == 0) return null; + return templates.get(0); + } catch (Exception e) { + DatabaseManager.handleDatabaseError("更新权限模版失败: ", e, null); + return null; + } + } + public static PrivilegeTemplateDTO select(UUID creator, String name) { String sql = "SELECT * FROM privilege_template WHERE creator = ? AND name = ?;"; List templates = query(sql, creator.toString(), name); @@ -116,34 +131,12 @@ public class PrivilegeTemplateDTO { public PrivilegeTemplateDTO setFlagValue(Flag flag, Boolean value) { flags.put(flag, value); - return update(this); + return doUpdate(new UpdateRow().field(new Field(flag.getFlagName(), value))); } public PrivilegeTemplateDTO setAdmin(Boolean admin) { this.admin = admin; - return update(this); - } - - private static PrivilegeTemplateDTO update(PrivilegeTemplateDTO template) { - Field name = new Field("name", template.getName()); - Field admin = new Field("admin", template.getAdmin()); - Field id = new Field("id", template.getId()); - UpdateRow updateRow = new UpdateRow().table("privilege_template") - .field(name) - .field(admin) - .returningAll(id) - .where("id = ?", id.value); - for (Flag f : Flag.getPrivilegeFlagsEnabled()) { - updateRow.field(new Field(f.getFlagName(), template.getFlagValue(f))); - } - try (ResultSet rs = updateRow.execute()) { - List templates = getDTOFromRS(rs); - if (templates.size() == 0) return null; - return templates.get(0); - } catch (Exception e) { - DatabaseManager.handleDatabaseError("更新权限模版失败: ", e, updateRow.toString()); - return null; - } + return doUpdate(new UpdateRow().field(new Field("admin", admin))); } } diff --git a/src/main/java/cn/lunadeer/dominion/tuis/PrivilegeInfo.java b/src/main/java/cn/lunadeer/dominion/tuis/PrivilegeInfo.java index 83a6f64..30f296c 100644 --- a/src/main/java/cn/lunadeer/dominion/tuis/PrivilegeInfo.java +++ b/src/main/java/cn/lunadeer/dominion/tuis/PrivilegeInfo.java @@ -63,9 +63,9 @@ public class PrivilegeInfo { view.add(Line.create() .append(Button.createRed("☐").setExecuteCommand("/dominion set_privilege " + playerName + " admin true " + dominion.getName() + " " + page).build()) .append("管理员")); - } - for (Flag flag : Flag.getPrivilegeFlagsEnabled()) { - view.add(createOption(flag, privilege.getFlagValue(flag), playerName, dominion.getName(), page)); + for (Flag flag : Flag.getPrivilegeFlagsEnabled()) { + view.add(createOption(flag, privilege.getFlagValue(flag), playerName, dominion.getName(), page)); + } } view.showOn(player, page); } From abab7967b03db2f60feb6c4101e770191bd2de2b Mon Sep 17 00:00:00 2001 From: zhangyuheng Date: Thu, 20 Jun 2024 17:58:33 +0800 Subject: [PATCH 13/26] =?UTF-8?q?=E4=BC=98=E5=8C=96dominion=20dto=E5=86=85?= =?UTF-8?q?=E5=AE=B9=E7=BB=93=E6=9E=84=EF=BC=8C=E5=B0=86=E5=8E=9F=E5=A7=8B?= =?UTF-8?q?=E5=8F=98=E9=87=8F=E5=90=88=E5=B9=B6=E5=88=B0Field=E4=B8=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lunadeer/dominion/dtos/DominionDTO.java | 244 ++++++++---------- 1 file changed, 110 insertions(+), 134 deletions(-) diff --git a/src/main/java/cn/lunadeer/dominion/dtos/DominionDTO.java b/src/main/java/cn/lunadeer/dominion/dtos/DominionDTO.java index 56be995..3552d50 100644 --- a/src/main/java/cn/lunadeer/dominion/dtos/DominionDTO.java +++ b/src/main/java/cn/lunadeer/dominion/dtos/DominionDTO.java @@ -5,6 +5,7 @@ import cn.lunadeer.dominion.Dominion; import cn.lunadeer.minecraftpluginutils.XLogger; import cn.lunadeer.minecraftpluginutils.databse.DatabaseManager; import cn.lunadeer.minecraftpluginutils.databse.Field; +import cn.lunadeer.minecraftpluginutils.databse.FieldType; import cn.lunadeer.minecraftpluginutils.databse.syntax.InsertRow; import cn.lunadeer.minecraftpluginutils.databse.syntax.UpdateRow; import org.bukkit.Location; @@ -118,22 +119,15 @@ public class DominionDTO { } public static DominionDTO insert(DominionDTO dominion) { - Field owner = new Field("owner", dominion.getOwner().toString()); - Field name = new Field("name", dominion.getName()); - Field world = new Field("world", dominion.getWorld()); - Field x1 = new Field("x1", dominion.getX1()); - Field y1 = new Field("y1", dominion.getY1()); - Field z1 = new Field("z1", dominion.getZ1()); - Field x2 = new Field("x2", dominion.getX2()); - Field y2 = new Field("y2", dominion.getY2()); - Field z2 = new Field("z2", dominion.getZ2()); - Field parentDomId = new Field("parent_dom_id", dominion.getParentDomId()); - Field joinMessage = new Field("join_message", "欢迎来到 ${DOM_NAME}!"); - Field leaveMessage = new Field("leave_message", "你正在离开 ${DOM_NAME},欢迎下次光临~"); - Field tpLocation = new Field("tp_location", "default"); InsertRow insert = new InsertRow().returningAll().table("dominion").onConflictDoNothing(new Field("id", null)); - insert.field(owner).field(name).field(world).field(x1).field(y1).field(z1).field(x2).field(y2).field(z2) - .field(parentDomId).field(joinMessage).field(leaveMessage).field(tpLocation); + insert.field(dominion.owner) + .field(dominion.name) + .field(dominion.world) + .field(dominion.x1).field(dominion.y1).field(dominion.z1) + .field(dominion.x2).field(dominion.y2).field(dominion.z2) + .field(dominion.parentDomId) + .field(dominion.joinMessage).field(dominion.leaveMessage) + .field(dominion.tp_location); for (Flag f : Flag.getDominionFlagsEnabled()) { insert.field(new Field(f.getFlagName(), f.getDefaultValue())); } @@ -160,39 +154,39 @@ public class DominionDTO { Map flags, String tp_location, String color) { - this.id = id; - this.owner = owner; - this.name = name; - this.world = world; - this.x1 = x1; - this.y1 = y1; - this.z1 = z1; - this.x2 = x2; - this.y2 = y2; - this.z2 = z2; - this.parentDomId = parentDomId; - this.joinMessage = joinMessage; - this.leaveMessage = leaveMessage; + this.id.value = id; + this.owner.value = owner; + this.name.value = name; + this.world.value = world; + this.x1.value = x1; + this.y1.value = y1; + this.z1.value = z1; + this.x2.value = x2; + this.y2.value = y2; + this.z2.value = z2; + this.parentDomId.value = parentDomId; + this.joinMessage.value = joinMessage; + this.leaveMessage.value = leaveMessage; this.flags.putAll(flags); - this.tp_location = tp_location; - this.color = color; + this.tp_location.value = tp_location; + this.color.value = color; } private DominionDTO(Integer id, UUID owner, String name, String world, Integer x1, Integer y1, Integer z1, Integer x2, Integer y2, Integer z2, Integer parentDomId) { - this.id = id; - this.owner = owner; - this.name = name; - this.world = world; - this.x1 = x1; - this.y1 = y1; - this.z1 = z1; - this.x2 = x2; - this.y2 = y2; - this.z2 = z2; - this.parentDomId = parentDomId; + this.id.value = id; + this.owner.value = owner; + this.name.value = name; + this.world.value = world; + this.x1.value = x1; + this.y1.value = y1; + this.z1.value = z1; + this.x2.value = x2; + this.y2.value = y2; + this.z2.value = z2; + this.parentDomId.value = parentDomId; } public DominionDTO(UUID owner, String name, String world, @@ -200,30 +194,31 @@ public class DominionDTO { this(null, owner, name, world, x1, y1, z1, x2, y2, z2, -1); } - private Integer id; - private UUID owner; - private String name; - private final String world; - private Integer x1; - private Integer y1; - private Integer z1; - private Integer x2; - private Integer y2; - private Integer z2; - private Integer parentDomId = -1; - private String joinMessage = "欢迎"; - private String leaveMessage = "再见"; + private final Field id = new Field("id", FieldType.INT); + private final Field owner = new Field("owner", FieldType.STRING); + private final Field name = new Field("name", FieldType.STRING); + private final Field world = new Field("world", FieldType.STRING); + private final Field x1 = new Field("x1", FieldType.INT); + private final Field y1 = new Field("y1", FieldType.INT); + private final Field z1 = new Field("z1", FieldType.INT); + private final Field x2 = new Field("x2", FieldType.INT); + private final Field y2 = new Field("y2", FieldType.INT); + private final Field z2 = new Field("z2", FieldType.INT); + private final Field parentDomId = new Field("parent_dom_id", -1); + private final Field joinMessage = new Field("join_message", "欢迎来到 ${DOM_NAME}!"); + private final Field leaveMessage = new Field("leave_message", "你正在离开 ${DOM_NAME},欢迎下次光临~"); private final Map flags = new HashMap<>(); - private String tp_location; - private String color; + private final Field tp_location = new Field("tp_location", "default"); + private final Field color = new Field("color", "#00BFFF"); + // getters and setters public Integer getId() { - return id; + return (Integer) id.value; } public UUID getOwner() { - return owner; + return UUID.fromString((String) owner.value); } private DominionDTO doUpdate(UpdateRow updateRow) { @@ -243,133 +238,122 @@ public class DominionDTO { } public DominionDTO setOwner(UUID owner) { - this.owner = owner; - Field ownerField = new Field("owner", owner.toString()); - return doUpdate(new UpdateRow().field(ownerField)); + this.owner.value = owner.toString(); + return doUpdate(new UpdateRow().field(this.owner)); } public String getName() { - return name; + return (String) name.value; } public DominionDTO setName(String name) { - this.name = name; - Field nameField = new Field("name", name); - return doUpdate(new UpdateRow().field(nameField)); + this.name.value = name; + return doUpdate(new UpdateRow().field(this.name)); } public String getWorld() { - return world; + return (String) world.value; } public Integer getX1() { - return x1; + return (Integer) x1.value; } public DominionDTO setX1(Integer x1) { - this.x1 = x1; - Field x1Field = new Field("x1", x1); - return doUpdate(new UpdateRow().field(x1Field)); + this.x1.value = x1; + return doUpdate(new UpdateRow().field(this.x1)); } public Integer getY1() { - return y1; + return (Integer) y1.value; } public DominionDTO setY1(Integer y1) { - this.y1 = y1; - Field y1Field = new Field("y1", y1); - return doUpdate(new UpdateRow().field(y1Field)); + this.y1.value = y1; + return doUpdate(new UpdateRow().field(this.y1)); } public Integer getZ1() { - return z1; + return (Integer) z1.value; } public DominionDTO setZ1(Integer z1) { - this.z1 = z1; - Field z1Field = new Field("z1", z1); - return doUpdate(new UpdateRow().field(z1Field)); + this.z1.value = z1; + return doUpdate(new UpdateRow().field(this.z1)); } public Integer getX2() { - return x2; + return (Integer) x2.value; } public DominionDTO setX2(Integer x2) { - this.x2 = x2; - Field x2Field = new Field("x2", x2); - return doUpdate(new UpdateRow().field(x2Field)); + this.x2.value = x2; + return doUpdate(new UpdateRow().field(this.x2)); } public Integer getY2() { - return y2; + return (Integer) y2.value; } public DominionDTO setY2(Integer y2) { - this.y2 = y2; - Field y2Field = new Field("y2", y2); - return doUpdate(new UpdateRow().field(y2Field)); + this.y2.value = y2; + return doUpdate(new UpdateRow().field(this.y2)); } public Integer getZ2() { - return z2; + return (Integer) z2.value; } public DominionDTO setZ2(Integer z2) { - this.z2 = z2; - Field z2Field = new Field("z2", z2); - return doUpdate(new UpdateRow().field(z2Field)); + this.z2.value = z2; + return doUpdate(new UpdateRow().field(this.z2)); } public Integer getSquare() { - return (x2 - x1 + 1) * (z2 - z1 + 1); + return (getX2() - getX1() + 1) * (getZ2() - getZ1() + 1); } public Integer getVolume() { - return getSquare() * (y2 - y1 + 1); + return getSquare() * (getY2() - getY1() + 1); } public Integer getWidthX() { - return x2 - x1 + 1; + return getX2() - getX1() + 1; } public Integer getHeight() { - return y2 - y1 + 1; + return getY2() - getY1() + 1; } public Integer getWidthZ() { - return z2 - z1 + 1; + return getZ2() - getZ1() + 1; } public Integer getParentDomId() { - return parentDomId; + return (Integer) parentDomId.value; } public DominionDTO setParentDomId(Integer parentDomId) { - this.parentDomId = parentDomId; - Field parentDomIdField = new Field("parent_dom_id", parentDomId); - return doUpdate(new UpdateRow().field(parentDomIdField)); + this.parentDomId.value = parentDomId; + return doUpdate(new UpdateRow().field(this.parentDomId)); } public String getJoinMessage() { - return joinMessage; + return (String) joinMessage.value; } public DominionDTO setJoinMessage(String joinMessage) { - this.joinMessage = joinMessage; - Field joinMessageField = new Field("join_message", joinMessage); - return doUpdate(new UpdateRow().field(joinMessageField)); + this.joinMessage.value = joinMessage; + return doUpdate(new UpdateRow().field(this.joinMessage)); } public String getLeaveMessage() { - return leaveMessage; + return (String) leaveMessage.value; } public DominionDTO setLeaveMessage(String leaveMessage) { - this.leaveMessage = leaveMessage; - Field leaveMessageField = new Field("leave_message", leaveMessage); - return doUpdate(new UpdateRow().field(leaveMessageField)); + this.leaveMessage.value = leaveMessage; + return doUpdate(new UpdateRow().field(this.leaveMessage)); } public Boolean getFlagValue(Flag flag) { @@ -384,19 +368,13 @@ public class DominionDTO { } public DominionDTO setXYZ(Integer x1, Integer y1, Integer z1, Integer x2, Integer y2, Integer z2) { - this.x1 = x1; - this.y1 = y1; - this.z1 = z1; - this.x2 = x2; - this.y2 = y2; - this.z2 = z2; - Field x1Field = new Field("x1", x1); - Field y1Field = new Field("y1", y1); - Field z1Field = new Field("z1", z1); - Field x2Field = new Field("x2", x2); - Field y2Field = new Field("y2", y2); - Field z2Field = new Field("z2", z2); - return doUpdate(new UpdateRow().field(x1Field).field(y1Field).field(z1Field).field(x2Field).field(y2Field).field(z2Field)); + this.x1.value = x1; + this.y1.value = y1; + this.z1.value = z1; + this.x2.value = x2; + this.y2.value = y2; + this.z2.value = z2; + return doUpdate(new UpdateRow().field(this.x1).field(this.y1).field(this.z1).field(this.x2).field(this.y2).field(this.z2)); } public Location getTpLocation() { @@ -404,8 +382,8 @@ public class DominionDTO { return null; } else { // 0:0:0 - String[] loc = tp_location.split(":"); - World w = Dominion.instance.getServer().getWorld(world); + String[] loc = ((String) tp_location.value).split(":"); + World w = Dominion.instance.getServer().getWorld(getWorld()); if (loc.length == 3 && w != null) { return new Location(w, Integer.parseInt(loc[0]), Integer.parseInt(loc[1]), Integer.parseInt(loc[2])); } else { @@ -417,38 +395,36 @@ public class DominionDTO { } public DominionDTO setTpLocation(Location loc) { - this.tp_location = loc.getBlockX() + ":" + loc.getBlockY() + ":" + loc.getBlockZ(); - Field tpLocationField = new Field("tp_location", tp_location); - return doUpdate(new UpdateRow().field(tpLocationField)); + this.tp_location.value = loc.getBlockX() + ":" + loc.getBlockY() + ":" + loc.getBlockZ(); + return doUpdate(new UpdateRow().field(tp_location)); } public Location getLocation1() { - return new Location(Dominion.instance.getServer().getWorld(world), x1, y1, z1); + return new Location(Dominion.instance.getServer().getWorld(getWorld()), getX1(), getY1(), getZ1()); } public Location getLocation2() { - return new Location(Dominion.instance.getServer().getWorld(world), x2, y2, z2); + return new Location(Dominion.instance.getServer().getWorld(getWorld()), getX2(), getY2(), getZ2()); } public DominionDTO setColor(String color) { - this.color = color; - Field colorField = new Field("color", color); - return doUpdate(new UpdateRow().field(colorField)); + this.color.value = color; + return doUpdate(new UpdateRow().field(this.color)); } public int getColorR() { - return Integer.valueOf(color.substring(1, 3), 16); + return Integer.valueOf(getColor().substring(1, 3), 16); } public int getColorG() { - return Integer.valueOf(color.substring(3, 5), 16); + return Integer.valueOf(getColor().substring(3, 5), 16); } public int getColorB() { - return Integer.valueOf(color.substring(5, 7), 16); + return Integer.valueOf(getColor().substring(5, 7), 16); } public String getColor() { - return color; + return (String) color.value; } } From ea9be48c68442555e6c6d440dddf91788c598c82 Mon Sep 17 00:00:00 2001 From: zhangyuheng Date: Fri, 21 Jun 2024 00:46:31 +0800 Subject: [PATCH 14/26] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E7=BC=93=E5=AD=98?= =?UTF-8?q?=E8=AE=A1=E6=97=B6=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/cn/lunadeer/dominion/Cache.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/cn/lunadeer/dominion/Cache.java b/src/main/java/cn/lunadeer/dominion/Cache.java index 86b76fd..7b4b7f6 100644 --- a/src/main/java/cn/lunadeer/dominion/Cache.java +++ b/src/main/java/cn/lunadeer/dominion/Cache.java @@ -51,6 +51,7 @@ public class Cache { } private void loadDominionsExecution() { + long start = System.currentTimeMillis(); id_dominions = new ConcurrentHashMap<>(); world_dominion_tree = new ConcurrentHashMap<>(); dominion_children = new ConcurrentHashMap<>(); @@ -73,6 +74,7 @@ public class Cache { BlueMapConnect.render(); recheckPlayerState = true; _last_update_dominion.set(System.currentTimeMillis()); + XLogger.debug("loadDominionsExecution cost: %d ms", System.currentTimeMillis() - start); } /** @@ -94,6 +96,7 @@ public class Cache { } private void loadPlayerPrivilegesExecution() { + long start = System.currentTimeMillis(); List all_privileges = PlayerPrivilegeDTO.selectAll(); if (all_privileges == null) { XLogger.err("加载玩家特权失败"); @@ -109,6 +112,7 @@ public class Cache { } recheckPlayerState = true; _last_update_privilege.set(System.currentTimeMillis()); + XLogger.debug("loadPlayerPrivilegesExecution cost: %d ms", System.currentTimeMillis() - start); } /** From d23c368d10f6facb26ad7b80c20776d35246906c Mon Sep 17 00:00:00 2001 From: zhangyuheng Date: Fri, 21 Jun 2024 00:58:34 +0800 Subject: [PATCH 15/26] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/cn/lunadeer/dominion/Cache.java | 4 ++++ src/main/java/cn/lunadeer/dominion/dtos/DominionDTO.java | 5 ++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/main/java/cn/lunadeer/dominion/Cache.java b/src/main/java/cn/lunadeer/dominion/Cache.java index 86b76fd..7b4b7f6 100644 --- a/src/main/java/cn/lunadeer/dominion/Cache.java +++ b/src/main/java/cn/lunadeer/dominion/Cache.java @@ -51,6 +51,7 @@ public class Cache { } private void loadDominionsExecution() { + long start = System.currentTimeMillis(); id_dominions = new ConcurrentHashMap<>(); world_dominion_tree = new ConcurrentHashMap<>(); dominion_children = new ConcurrentHashMap<>(); @@ -73,6 +74,7 @@ public class Cache { BlueMapConnect.render(); recheckPlayerState = true; _last_update_dominion.set(System.currentTimeMillis()); + XLogger.debug("loadDominionsExecution cost: %d ms", System.currentTimeMillis() - start); } /** @@ -94,6 +96,7 @@ public class Cache { } private void loadPlayerPrivilegesExecution() { + long start = System.currentTimeMillis(); List all_privileges = PlayerPrivilegeDTO.selectAll(); if (all_privileges == null) { XLogger.err("加载玩家特权失败"); @@ -109,6 +112,7 @@ public class Cache { } recheckPlayerState = true; _last_update_privilege.set(System.currentTimeMillis()); + XLogger.debug("loadPlayerPrivilegesExecution cost: %d ms", System.currentTimeMillis() - start); } /** diff --git a/src/main/java/cn/lunadeer/dominion/dtos/DominionDTO.java b/src/main/java/cn/lunadeer/dominion/dtos/DominionDTO.java index 3552d50..bef2c40 100644 --- a/src/main/java/cn/lunadeer/dominion/dtos/DominionDTO.java +++ b/src/main/java/cn/lunadeer/dominion/dtos/DominionDTO.java @@ -155,7 +155,7 @@ public class DominionDTO { String tp_location, String color) { this.id.value = id; - this.owner.value = owner; + this.owner.value = owner.toString(); this.name.value = name; this.world.value = world; this.x1.value = x1; @@ -177,7 +177,7 @@ public class DominionDTO { Integer x1, Integer y1, Integer z1, Integer x2, Integer y2, Integer z2, Integer parentDomId) { this.id.value = id; - this.owner.value = owner; + this.owner.value = owner.toString(); this.name.value = name; this.world.value = world; this.x1.value = x1; @@ -222,7 +222,6 @@ public class DominionDTO { } private DominionDTO doUpdate(UpdateRow updateRow) { - Field id = new Field("id", this.id); updateRow.returningAll(id) .table("dominion") .where("id = ?", id.value); From 2f9c4cd73afd5693c8e9dee33d591a160b90a7ac Mon Sep 17 00:00:00 2001 From: zhangyuheng Date: Fri, 21 Jun 2024 10:00:07 +0800 Subject: [PATCH 16/26] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dbukkit=E6=A0=B8?= =?UTF-8?q?=E5=BF=83=E6=97=A0=E6=B3=95=E4=BD=BF=E7=94=A8expand/contract?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- .../lunadeer/dominion/controllers/BukkitPlayerOperator.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index edee239..e0c94b9 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ cn.lunadeer Dominion - 1.33.1-mysql-beta + 1.33.2-mysql-beta jar Dominion diff --git a/src/main/java/cn/lunadeer/dominion/controllers/BukkitPlayerOperator.java b/src/main/java/cn/lunadeer/dominion/controllers/BukkitPlayerOperator.java index 64808d0..ef88d6f 100644 --- a/src/main/java/cn/lunadeer/dominion/controllers/BukkitPlayerOperator.java +++ b/src/main/java/cn/lunadeer/dominion/controllers/BukkitPlayerOperator.java @@ -45,8 +45,8 @@ public class BukkitPlayerOperator implements AbstractOperator { @Override public BlockFace getDirection() { - float yaw = player.getYaw(); - float pitch = player.getPitch(); + float yaw = player.getLocation().getYaw(); + float pitch = player.getLocation().getPitch(); if (pitch > -45 && pitch < 45) { if (yaw > -45 && yaw < 45) { return BlockFace.SOUTH; From 278ce8a68683e3df781c301185b9f1227444c7f2 Mon Sep 17 00:00:00 2001 From: zhangyuheng Date: Fri, 21 Jun 2024 14:33:21 +0800 Subject: [PATCH 17/26] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=88=90=E5=91=98?= =?UTF-8?q?=E6=9D=83=E9=99=90=E7=BC=93=E5=AD=98=E6=9B=B4=E6=96=B0=E5=8A=A0?= =?UTF-8?q?=E8=BD=BD=E7=AD=96=E7=95=A5=EF=BC=8C=E6=8F=90=E9=AB=98=E6=95=88?= =?UTF-8?q?=E7=8E=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- .../cn/lunadeer/dominion/BlueMapConnect.java | 199 +++++++++--------- src/main/java/cn/lunadeer/dominion/Cache.java | 105 +++++---- .../cn/lunadeer/dominion/DominionNode.java | 26 ++- .../controllers/PrivilegeController.java | 17 +- .../dominion/dtos/PlayerPrivilegeDTO.java | 5 +- 6 files changed, 194 insertions(+), 160 deletions(-) diff --git a/pom.xml b/pom.xml index e0c94b9..e2d1871 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ cn.lunadeer Dominion - 1.33.2-mysql-beta + 1.33.3-mysql-beta jar Dominion diff --git a/src/main/java/cn/lunadeer/dominion/BlueMapConnect.java b/src/main/java/cn/lunadeer/dominion/BlueMapConnect.java index 0622a40..cee9369 100644 --- a/src/main/java/cn/lunadeer/dominion/BlueMapConnect.java +++ b/src/main/java/cn/lunadeer/dominion/BlueMapConnect.java @@ -1,6 +1,7 @@ package cn.lunadeer.dominion; import cn.lunadeer.dominion.dtos.DominionDTO; +import cn.lunadeer.minecraftpluginutils.Scheduler; import cn.lunadeer.minecraftpluginutils.XLogger; import com.flowpowered.math.vector.Vector2d; import de.bluecolored.bluemap.api.BlueMapAPI; @@ -17,112 +18,116 @@ public class BlueMapConnect { if (!Dominion.config.getBlueMap()) { return; } - try { - BlueMapAPI.getInstance().ifPresent(api -> { - Map> world_dominions = new HashMap<>(); - for (DominionDTO dominion : Cache.instance.getDominions()) { - if (!world_dominions.containsKey(dominion.getWorld())) { - world_dominions.put(dominion.getWorld(), new ArrayList<>()); + Scheduler.runTaskAsync(() -> { + try { + BlueMapAPI.getInstance().ifPresent(api -> { + Map> world_dominions = new HashMap<>(); + for (DominionDTO dominion : Cache.instance.getDominions()) { + if (!world_dominions.containsKey(dominion.getWorld())) { + world_dominions.put(dominion.getWorld(), new ArrayList<>()); + } + world_dominions.get(dominion.getWorld()).add(dominion); } - world_dominions.get(dominion.getWorld()).add(dominion); - } - for (Map.Entry> d : world_dominions.entrySet()) { - api.getWorld(d.getKey()).ifPresent(world -> { - MarkerSet markerSet = MarkerSet.builder() - .label("Dominion") - .build(); - - for (DominionDTO dominion : d.getValue()) { - Collection vectors = new ArrayList<>(); - vectors.add(new Vector2d(dominion.getX1() + 0.001, dominion.getZ1() + 0.001)); - vectors.add(new Vector2d(dominion.getX2() - 0.001, dominion.getZ1() + 0.001)); - vectors.add(new Vector2d(dominion.getX2() - 0.001, dominion.getZ2() - 0.001)); - vectors.add(new Vector2d(dominion.getX1() + 0.001, dominion.getZ2() - 0.001)); - Shape shape = new Shape(vectors); - double x = vectors.iterator().next().getX(); - double z = vectors.iterator().next().getY(); - double y = dominion.getY1(); - - int r = dominion.getColorR(); - int g = dominion.getColorG(); - int b = dominion.getColorB(); - - Color line = new Color(r, g, b, 0.8F); - Color fill = new Color(r, g, b, 0.2F); - ExtrudeMarker marker = ExtrudeMarker.builder() - .label(dominion.getName()) - .position(x, y, z) - .shape(shape, dominion.getY1() + 0.001f, dominion.getY2() - 0.001f) - .lineColor(line) - .fillColor(fill) + for (Map.Entry> d : world_dominions.entrySet()) { + api.getWorld(d.getKey()).ifPresent(world -> { + MarkerSet markerSet = MarkerSet.builder() + .label("Dominion") .build(); - markerSet.getMarkers() - .put(dominion.getName(), marker); - } - for (BlueMapMap map : world.getMaps()) { - map.getMarkerSets().put(d.getKey() + "-" + markerSet.getLabel(), markerSet); - } - }); - } - }); - } catch (NoClassDefFoundError e) { - XLogger.warn("无法连接 BlueMap 插件,如果你不打算使用卫星地图渲染建议前往配置文件关闭此功能以避免下方的报错。"); - XLogger.err(e.getMessage()); - } + for (DominionDTO dominion : d.getValue()) { + Collection vectors = new ArrayList<>(); + vectors.add(new Vector2d(dominion.getX1() + 0.001, dominion.getZ1() + 0.001)); + vectors.add(new Vector2d(dominion.getX2() - 0.001, dominion.getZ1() + 0.001)); + vectors.add(new Vector2d(dominion.getX2() - 0.001, dominion.getZ2() - 0.001)); + vectors.add(new Vector2d(dominion.getX1() + 0.001, dominion.getZ2() - 0.001)); + Shape shape = new Shape(vectors); + double x = vectors.iterator().next().getX(); + double z = vectors.iterator().next().getY(); + double y = dominion.getY1(); + + int r = dominion.getColorR(); + int g = dominion.getColorG(); + int b = dominion.getColorB(); + + Color line = new Color(r, g, b, 0.8F); + Color fill = new Color(r, g, b, 0.2F); + ExtrudeMarker marker = ExtrudeMarker.builder() + .label(dominion.getName()) + .position(x, y, z) + .shape(shape, dominion.getY1() + 0.001f, dominion.getY2() - 0.001f) + .lineColor(line) + .fillColor(fill) + .build(); + markerSet.getMarkers() + .put(dominion.getName(), marker); + } + + for (BlueMapMap map : world.getMaps()) { + map.getMarkerSets().put(d.getKey() + "-" + markerSet.getLabel(), markerSet); + } + }); + } + }); + } catch (NoClassDefFoundError e) { + XLogger.warn("无法连接 BlueMap 插件,如果你不打算使用卫星地图渲染建议前往配置文件关闭此功能以避免下方的报错。"); + XLogger.err(e.getMessage()); + } + }); } public static void renderMCA(Map> mca_files) { if (!Dominion.config.getBlueMap()) { return; } - try { - BlueMapAPI.getInstance().ifPresent(api -> { - for (String world : mca_files.keySet()) { - api.getWorld(world).ifPresent(bmWorld -> { - MarkerSet markerSet = MarkerSet.builder() - .label("MCA") - .defaultHidden(true) - .build(); - for (String file : mca_files.get(world)) { - // r.-1.-1.mca - int mca_x = Integer.parseInt(file.split("\\.")[1]); - int mca_z = Integer.parseInt(file.split("\\.")[2]); - int world_x1 = mca_x * 512; - int world_x2 = (mca_x + 1) * 512; - int world_z1 = mca_z * 512; - int world_z2 = (mca_z + 1) * 512; - Collection vectors = new ArrayList<>(); - vectors.add(new Vector2d(world_x1 + 0.001, world_z1 + 0.001)); - vectors.add(new Vector2d(world_x2 - 0.001, world_z1 + 0.001)); - vectors.add(new Vector2d(world_x2 - 0.001, world_z2 - 0.001)); - vectors.add(new Vector2d(world_x1 + 0.001, world_z2 - 0.001)); - Shape shape = new Shape(vectors); - double x = vectors.iterator().next().getX(); - double z = vectors.iterator().next().getY(); - double y = -64; - - Color line = new Color(0, 204, 0, 0.8F); - Color fill = new Color(0, 204, 0, 0.2F); - ExtrudeMarker marker = ExtrudeMarker.builder() - .label(file) - .position(x, y, z) - .shape(shape, -64, 320) - .lineColor(line) - .fillColor(fill) + Scheduler.runTaskAsync(() -> { + try { + BlueMapAPI.getInstance().ifPresent(api -> { + for (String world : mca_files.keySet()) { + api.getWorld(world).ifPresent(bmWorld -> { + MarkerSet markerSet = MarkerSet.builder() + .label("MCA") + .defaultHidden(true) .build(); - markerSet.getMarkers() - .put(file, marker); - } - for (BlueMapMap map : bmWorld.getMaps()) { - map.getMarkerSets().put(world + "-" + markerSet.getLabel(), markerSet); - } - }); - } - }); - } catch (NoClassDefFoundError e) { - XLogger.warn("无法连接 BlueMap 插件,如果你不打算使用卫星地图渲染建议前往配置文件关闭此功能以避免下方的报错。"); - XLogger.err(e.getMessage()); - } + for (String file : mca_files.get(world)) { + // r.-1.-1.mca + int mca_x = Integer.parseInt(file.split("\\.")[1]); + int mca_z = Integer.parseInt(file.split("\\.")[2]); + int world_x1 = mca_x * 512; + int world_x2 = (mca_x + 1) * 512; + int world_z1 = mca_z * 512; + int world_z2 = (mca_z + 1) * 512; + Collection vectors = new ArrayList<>(); + vectors.add(new Vector2d(world_x1 + 0.001, world_z1 + 0.001)); + vectors.add(new Vector2d(world_x2 - 0.001, world_z1 + 0.001)); + vectors.add(new Vector2d(world_x2 - 0.001, world_z2 - 0.001)); + vectors.add(new Vector2d(world_x1 + 0.001, world_z2 - 0.001)); + Shape shape = new Shape(vectors); + double x = vectors.iterator().next().getX(); + double z = vectors.iterator().next().getY(); + double y = -64; + + Color line = new Color(0, 204, 0, 0.8F); + Color fill = new Color(0, 204, 0, 0.2F); + ExtrudeMarker marker = ExtrudeMarker.builder() + .label(file) + .position(x, y, z) + .shape(shape, -64, 320) + .lineColor(line) + .fillColor(fill) + .build(); + markerSet.getMarkers() + .put(file, marker); + } + for (BlueMapMap map : bmWorld.getMaps()) { + map.getMarkerSets().put(world + "-" + markerSet.getLabel(), markerSet); + } + }); + } + }); + } catch (NoClassDefFoundError e) { + XLogger.warn("无法连接 BlueMap 插件,如果你不打算使用卫星地图渲染建议前往配置文件关闭此功能以避免下方的报错。"); + XLogger.err(e.getMessage()); + } + }); } } diff --git a/src/main/java/cn/lunadeer/dominion/Cache.java b/src/main/java/cn/lunadeer/dominion/Cache.java index 7b4b7f6..793ddf2 100644 --- a/src/main/java/cn/lunadeer/dominion/Cache.java +++ b/src/main/java/cn/lunadeer/dominion/Cache.java @@ -51,68 +51,85 @@ public class Cache { } private void loadDominionsExecution() { - long start = System.currentTimeMillis(); - id_dominions = new ConcurrentHashMap<>(); - world_dominion_tree = new ConcurrentHashMap<>(); - dominion_children = new ConcurrentHashMap<>(); - List dominions = DominionDTO.selectAll(); - Map> world_dominions = new HashMap<>(); - for (DominionDTO d : dominions) { - if (!world_dominions.containsKey(d.getWorld())) { - world_dominions.put(d.getWorld(), new ArrayList<>()); + Scheduler.runTaskAsync(() -> { + long start = System.currentTimeMillis(); + id_dominions = new ConcurrentHashMap<>(); + world_dominion_tree = new ConcurrentHashMap<>(); + dominion_children = new ConcurrentHashMap<>(); + List dominions = DominionDTO.selectAll(); + Map> world_dominions = new HashMap<>(); + for (DominionDTO d : dominions) { + if (!world_dominions.containsKey(d.getWorld())) { + world_dominions.put(d.getWorld(), new ArrayList<>()); + } + world_dominions.get(d.getWorld()).add(d); + id_dominions.put(d.getId(), d); + if (!dominion_children.containsKey(d.getParentDomId())) { + dominion_children.put(d.getParentDomId(), new ArrayList<>()); + } + dominion_children.get(d.getParentDomId()).add(d.getId()); } - world_dominions.get(d.getWorld()).add(d); - id_dominions.put(d.getId(), d); - if (!dominion_children.containsKey(d.getParentDomId())) { - dominion_children.put(d.getParentDomId(), new ArrayList<>()); + for (Map.Entry> entry : world_dominions.entrySet()) { + world_dominion_tree.put(entry.getKey(), DominionNode.BuildNodeTree(-1, entry.getValue())); } - dominion_children.get(d.getParentDomId()).add(d.getId()); - } - for (Map.Entry> entry : world_dominions.entrySet()) { - world_dominion_tree.put(entry.getKey(), DominionNode.BuildNodeTree(-1, entry.getValue())); - } - BlueMapConnect.render(); - recheckPlayerState = true; - _last_update_dominion.set(System.currentTimeMillis()); - XLogger.debug("loadDominionsExecution cost: %d ms", System.currentTimeMillis() - start); + BlueMapConnect.render(); + recheckPlayerState = true; + _last_update_dominion.set(System.currentTimeMillis()); + XLogger.debug("loadDominionsExecution cost: %d ms for %d dominions" + , System.currentTimeMillis() - start, dominions.size()); + }); } /** * 从数据库加载所有玩家特权 + * 如果player_uuid为null,则加载所有玩家的特权 + * + * @param player_uuid 玩家UUID */ - public void loadPlayerPrivileges() { + public void loadPlayerPrivileges(UUID player_uuid) { if (_last_update_privilege.get() + UPDATE_INTERVAL < System.currentTimeMillis()) { - loadPlayerPrivilegesExecution(); + XLogger.debug("run loadPlayerPrivilegesExecution directly"); + loadPlayerPrivilegesExecution(player_uuid); } else { if (_update_privilege_is_scheduled.get()) return; + XLogger.debug("schedule loadPlayerPrivilegesExecution"); _update_privilege_is_scheduled.set(true); - long delay_tick = (UPDATE_INTERVAL - (System.currentTimeMillis() - _last_update_dominion.get())) / 1000 * 20L; + long delay_tick = (UPDATE_INTERVAL - (System.currentTimeMillis() - _last_update_privilege.get())) / 1000 * 20L; Scheduler.runTaskLaterAsync(() -> { - loadPlayerPrivilegesExecution(); + XLogger.debug("run loadPlayerPrivilegesExecution scheduled"); + loadPlayerPrivilegesExecution(player_uuid); _update_privilege_is_scheduled.set(false); }, delay_tick); } } - private void loadPlayerPrivilegesExecution() { - long start = System.currentTimeMillis(); - List all_privileges = PlayerPrivilegeDTO.selectAll(); - if (all_privileges == null) { - XLogger.err("加载玩家特权失败"); - return; - } - player_uuid_to_privilege = new ConcurrentHashMap<>(); - for (PlayerPrivilegeDTO privilege : all_privileges) { - UUID player_uuid = privilege.getPlayerUUID(); - if (!player_uuid_to_privilege.containsKey(player_uuid)) { - player_uuid_to_privilege.put(player_uuid, new ConcurrentHashMap<>()); + public void loadPlayerPrivileges() { + loadPlayerPrivileges(null); + } + + private void loadPlayerPrivilegesExecution(UUID player_to_update) { + Scheduler.runTaskAsync(() -> { + long start = System.currentTimeMillis(); + List all_privileges = new ArrayList<>(); + if (player_to_update == null) { + all_privileges = PlayerPrivilegeDTO.selectAll(); + player_uuid_to_privilege = new ConcurrentHashMap<>(); + } else { + all_privileges = PlayerPrivilegeDTO.selectAll(player_to_update); } - player_uuid_to_privilege.get(player_uuid).put(privilege.getDomID(), privilege); - } - recheckPlayerState = true; - _last_update_privilege.set(System.currentTimeMillis()); - XLogger.debug("loadPlayerPrivilegesExecution cost: %d ms", System.currentTimeMillis() - start); + for (PlayerPrivilegeDTO privilege : all_privileges) { + UUID player_uuid = privilege.getPlayerUUID(); + if (!player_uuid_to_privilege.containsKey(player_uuid)) { + player_uuid_to_privilege.put(player_uuid, new ConcurrentHashMap<>()); + } + player_uuid_to_privilege.get(player_uuid).put(privilege.getDomID(), privilege); + } + recheckPlayerState = true; + _last_update_privilege.set(System.currentTimeMillis()); + XLogger.debug("loadPlayerPrivilegesExecution cost: %d ms for %d privileges" + , System.currentTimeMillis() - start, all_privileges.size()); + }); } /** @@ -318,7 +335,7 @@ public class Cache { private final AtomicBoolean _update_dominion_is_scheduled = new AtomicBoolean(false); private final AtomicLong _last_update_privilege = new AtomicLong(0); private final AtomicBoolean _update_privilege_is_scheduled = new AtomicBoolean(false); - private static final long UPDATE_INTERVAL = 1000 * 5; + private static final long UPDATE_INTERVAL = 1000 * 4; private boolean recheckPlayerState = false; // 是否需要重新检查玩家状态(发光、飞行) public final Map NextTimeAllowTeleport = new java.util.HashMap<>(); } diff --git a/src/main/java/cn/lunadeer/dominion/DominionNode.java b/src/main/java/cn/lunadeer/dominion/DominionNode.java index 1ec848f..34db479 100644 --- a/src/main/java/cn/lunadeer/dominion/DominionNode.java +++ b/src/main/java/cn/lunadeer/dominion/DominionNode.java @@ -5,24 +5,38 @@ import org.bukkit.Location; import org.jetbrains.annotations.NotNull; import javax.annotation.Nullable; -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; +import java.util.*; public class DominionNode { public DominionDTO dominion; public List children = new ArrayList<>(); public static List BuildNodeTree(Integer rootId, List dominions) { - List dominionTree = new ArrayList<>(); + // 映射父节点ID到其子节点列表 + Map> parentToChildrenMap = new HashMap<>(); for (DominionDTO dominion : dominions) { - if (Objects.equals(dominion.getParentDomId(), rootId)) { + parentToChildrenMap + .computeIfAbsent(dominion.getParentDomId(), k -> new ArrayList<>()) + .add(dominion); + } + + // 递归构建节点树 + return buildTree(rootId, parentToChildrenMap); + } + + private static List buildTree(Integer rootId, Map> parentToChildrenMap) { + List dominionTree = new ArrayList<>(); + List children = parentToChildrenMap.get(rootId); + + if (children != null) { + for (DominionDTO dominion : children) { DominionNode node = new DominionNode(); node.dominion = dominion; - node.children = BuildNodeTree(dominion.getId(), dominions); + node.children = buildTree(dominion.getId(), parentToChildrenMap); dominionTree.add(node); } } + return dominionTree; } diff --git a/src/main/java/cn/lunadeer/dominion/controllers/PrivilegeController.java b/src/main/java/cn/lunadeer/dominion/controllers/PrivilegeController.java index 218e909..5ea74c7 100644 --- a/src/main/java/cn/lunadeer/dominion/controllers/PrivilegeController.java +++ b/src/main/java/cn/lunadeer/dominion/controllers/PrivilegeController.java @@ -103,18 +103,17 @@ public class PrivilegeController { privilege = createPlayerPrivilege(operator, player.getUuid(), dominion); if (privilege == null) return; } - if (privilege.getAdmin()) { - if (notOwner(operator, dominion)) { - operator.setResponse(FAIL.addMessage("你不是领地 %s 的拥有者,无法修改其他管理员的权限", dominionName)); - return; - } - if (flag.equals("admin")) { - privilege.setAdmin(value); - } else { + if ((flag.equals("admin") || privilege.getAdmin()) && notOwner(operator, dominion)) { + operator.setResponse(FAIL.addMessage("你不是领地 %s 的拥有者,无法修改其他玩家管理员的权限", dominionName)); + return; + } + if (flag.equals("admin")) { + privilege.setAdmin(value); + } else { + if (privilege.getAdmin()) { operator.setResponse(FAIL.addMessage("管理员拥有所有权限,无需单独设置权限")); return; } - } else { Flag f = Flag.getFlag(flag); if (f == null) { operator.setResponse(FAIL.addMessage("未知的领地权限 %s", flag)); diff --git a/src/main/java/cn/lunadeer/dominion/dtos/PlayerPrivilegeDTO.java b/src/main/java/cn/lunadeer/dominion/dtos/PlayerPrivilegeDTO.java index eaa2338..331a99c 100644 --- a/src/main/java/cn/lunadeer/dominion/dtos/PlayerPrivilegeDTO.java +++ b/src/main/java/cn/lunadeer/dominion/dtos/PlayerPrivilegeDTO.java @@ -44,7 +44,7 @@ public class PlayerPrivilegeDTO { try (ResultSet rs = updateRow.execute()) { List players = getDTOFromRS(rs); if (players.size() == 0) return null; - Cache.instance.loadPlayerPrivileges(); + Cache.instance.loadPlayerPrivileges(playerUUID); return players.get(0); } catch (Exception e) { DatabaseManager.handleDatabaseError("更新玩家权限失败: ", e, ""); @@ -65,7 +65,7 @@ public class PlayerPrivilegeDTO { insertRow.field(new Field(f.getFlagName(), player.getFlagValue(f))); } try (ResultSet rs = insertRow.execute()) { - Cache.instance.loadPlayerPrivileges(); + Cache.instance.loadPlayerPrivileges(player.getPlayerUUID()); List players = getDTOFromRS(rs); if (players.size() == 0) return null; return players.get(0); @@ -134,7 +134,6 @@ public class PlayerPrivilegeDTO { flags.put(flag, value); Field f = new Field(flag.getFlagName(), value); UpdateRow updateRow = new UpdateRow().field(f); - XLogger.debug("setFlagValue: " + updateRow.toString()); return doUpdate(updateRow); } From 723ac794fee99bdac5d1ac57388640ecd97fbb05 Mon Sep 17 00:00:00 2001 From: zhangyuheng Date: Fri, 21 Jun 2024 14:57:21 +0800 Subject: [PATCH 18/26] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=88=90=E5=91=98?= =?UTF-8?q?=E6=9D=83=E9=99=90=E7=BC=93=E5=AD=98=E6=9B=B4=E6=96=B0=E5=8A=A0?= =?UTF-8?q?=E8=BD=BD=E7=AD=96=E7=95=A5=EF=BC=8C=E6=8F=90=E9=AB=98=E6=95=88?= =?UTF-8?q?=E7=8E=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/cn/lunadeer/dominion/Cache.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/cn/lunadeer/dominion/Cache.java b/src/main/java/cn/lunadeer/dominion/Cache.java index 793ddf2..b62be76 100644 --- a/src/main/java/cn/lunadeer/dominion/Cache.java +++ b/src/main/java/cn/lunadeer/dominion/Cache.java @@ -111,12 +111,16 @@ public class Cache { private void loadPlayerPrivilegesExecution(UUID player_to_update) { Scheduler.runTaskAsync(() -> { long start = System.currentTimeMillis(); - List all_privileges = new ArrayList<>(); + List all_privileges; if (player_to_update == null) { all_privileges = PlayerPrivilegeDTO.selectAll(); player_uuid_to_privilege = new ConcurrentHashMap<>(); } else { all_privileges = PlayerPrivilegeDTO.selectAll(player_to_update); + if (!player_uuid_to_privilege.containsKey(player_to_update)) { + player_uuid_to_privilege.put(player_to_update, new ConcurrentHashMap<>()); + } + player_uuid_to_privilege.get(player_to_update).clear(); } for (PlayerPrivilegeDTO privilege : all_privileges) { UUID player_uuid = privilege.getPlayerUUID(); From 17870432fe299763a7d3b5d38b13b8de7196ed3e Mon Sep 17 00:00:00 2001 From: zhangyuheng Date: Fri, 21 Jun 2024 15:49:40 +0800 Subject: [PATCH 19/26] =?UTF-8?q?=E4=BC=98=E5=8C=96=E9=A2=86=E5=9C=B0?= =?UTF-8?q?=E7=BC=93=E5=AD=98=E6=9B=B4=E6=96=B0=E5=8A=A0=E8=BD=BD=E7=AD=96?= =?UTF-8?q?=E7=95=A5=EF=BC=8C=E6=8F=90=E9=AB=98=E6=95=88=E7=8E=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/cn/lunadeer/dominion/Cache.java | 63 ++++++++++++------- .../cn/lunadeer/dominion/DominionNode.java | 18 ++++-- .../lunadeer/dominion/dtos/DominionDTO.java | 7 +-- .../dominion/dtos/PlayerPrivilegeDTO.java | 25 ++++---- .../lunadeer/dominion/tuis/ListDominion.java | 8 +-- 5 files changed, 71 insertions(+), 50 deletions(-) diff --git a/src/main/java/cn/lunadeer/dominion/Cache.java b/src/main/java/cn/lunadeer/dominion/Cache.java index b62be76..9d4c30a 100644 --- a/src/main/java/cn/lunadeer/dominion/Cache.java +++ b/src/main/java/cn/lunadeer/dominion/Cache.java @@ -31,11 +31,14 @@ public class Cache { /** * 从数据库加载所有领地 + * 如果idToLoad为null,则加载所有领地 + * + * @param idToLoad 领地ID */ - public void loadDominions() { + public void loadDominions(Integer idToLoad) { if (_last_update_dominion.get() + UPDATE_INTERVAL < System.currentTimeMillis()) { XLogger.debug("run loadDominionsExecution directly"); - loadDominionsExecution(); + loadDominionsExecution(idToLoad); } else { if (_update_dominion_is_scheduled.get()) return; XLogger.debug("schedule loadDominionsExecution"); @@ -43,40 +46,56 @@ public class Cache { long delay_tick = (UPDATE_INTERVAL - (System.currentTimeMillis() - _last_update_dominion.get())) / 1000 * 20L; Scheduler.runTaskLaterAsync(() -> { XLogger.debug("run loadDominionsExecution scheduled"); - loadDominionsExecution(); + loadDominionsExecution(idToLoad); _update_dominion_is_scheduled.set(false); }, delay_tick); } } - private void loadDominionsExecution() { + public void loadDominions() { + loadDominions(null); + } + + private void loadDominionsExecution(Integer idToLoad) { Scheduler.runTaskAsync(() -> { long start = System.currentTimeMillis(); - id_dominions = new ConcurrentHashMap<>(); - world_dominion_tree = new ConcurrentHashMap<>(); - dominion_children = new ConcurrentHashMap<>(); - List dominions = DominionDTO.selectAll(); - Map> world_dominions = new HashMap<>(); - for (DominionDTO d : dominions) { - if (!world_dominions.containsKey(d.getWorld())) { - world_dominions.put(d.getWorld(), new ArrayList<>()); + int count = 0; + if (idToLoad == null) { + id_dominions = new ConcurrentHashMap<>(); + world_dominion_tree = new ConcurrentHashMap<>(); + dominion_children = new ConcurrentHashMap<>(); + List dominions = DominionDTO.selectAll(); + count = dominions.size(); + Map> world_dominions = new HashMap<>(); + for (DominionDTO d : dominions) { + if (!world_dominions.containsKey(d.getWorld())) { + world_dominions.put(d.getWorld(), new ArrayList<>()); + } + world_dominions.get(d.getWorld()).add(d); + id_dominions.put(d.getId(), d); + if (!dominion_children.containsKey(d.getParentDomId())) { + dominion_children.put(d.getParentDomId(), new ArrayList<>()); + } + dominion_children.get(d.getParentDomId()).add(d.getId()); } - world_dominions.get(d.getWorld()).add(d); - id_dominions.put(d.getId(), d); - if (!dominion_children.containsKey(d.getParentDomId())) { - dominion_children.put(d.getParentDomId(), new ArrayList<>()); + for (Map.Entry> entry : world_dominions.entrySet()) { + world_dominion_tree.put(entry.getKey(), DominionNode.BuildNodeTree(-1, entry.getValue())); + } + } else { + DominionDTO dominion = DominionDTO.select(idToLoad); + if (dominion == null && id_dominions.containsKey(idToLoad)) { + id_dominions.remove(idToLoad); + } else if (dominion != null) { + id_dominions.put(idToLoad, dominion); + count = 1; } - dominion_children.get(d.getParentDomId()).add(d.getId()); - } - for (Map.Entry> entry : world_dominions.entrySet()) { - world_dominion_tree.put(entry.getKey(), DominionNode.BuildNodeTree(-1, entry.getValue())); } BlueMapConnect.render(); recheckPlayerState = true; _last_update_dominion.set(System.currentTimeMillis()); XLogger.debug("loadDominionsExecution cost: %d ms for %d dominions" - , System.currentTimeMillis() - start, dominions.size()); + , System.currentTimeMillis() - start, count); }); } @@ -266,7 +285,7 @@ public class Cache { if (player == null) return dominionTree; for (List tree : world_dominion_tree.values()) { for (DominionNode node : tree) { - if (node.dominion.getOwner().equals(player.getUuid())) { + if (node.getDominion().getOwner().equals(player.getUuid())) { dominionTree.add(node); } } diff --git a/src/main/java/cn/lunadeer/dominion/DominionNode.java b/src/main/java/cn/lunadeer/dominion/DominionNode.java index 34db479..83eeab4 100644 --- a/src/main/java/cn/lunadeer/dominion/DominionNode.java +++ b/src/main/java/cn/lunadeer/dominion/DominionNode.java @@ -8,8 +8,16 @@ import javax.annotation.Nullable; import java.util.*; public class DominionNode { - public DominionDTO dominion; - public List children = new ArrayList<>(); + private Integer dominion_id; + private List children = new ArrayList<>(); + + public DominionDTO getDominion() { + return Cache.instance.getDominion(dominion_id); + } + + public List getChildren() { + return children; + } public static List BuildNodeTree(Integer rootId, List dominions) { // 映射父节点ID到其子节点列表 @@ -31,7 +39,7 @@ public class DominionNode { if (children != null) { for (DominionDTO dominion : children) { DominionNode node = new DominionNode(); - node.dominion = dominion; + node.dominion_id = dominion.getId(); node.children = buildTree(dominion.getId(), parentToChildrenMap); dominionTree.add(node); } @@ -42,7 +50,7 @@ public class DominionNode { public static DominionNode getLocInDominionNode(@NotNull List nodes, @NotNull Location loc) { for (DominionNode node : nodes) { - if (isInDominion(node.dominion, loc)) { + if (isInDominion(node.getDominion(), loc)) { if (node.children.isEmpty()) { return node; } else { @@ -62,7 +70,7 @@ public class DominionNode { if (nodes == null) return null; if (nodes.isEmpty()) return null; DominionNode dominionNode = getLocInDominionNode(nodes, loc); - return dominionNode == null ? null : dominionNode.dominion; + return dominionNode == null ? null : dominionNode.getDominion(); } public static boolean isInDominion(@Nullable DominionDTO dominion, Location location) { diff --git a/src/main/java/cn/lunadeer/dominion/dtos/DominionDTO.java b/src/main/java/cn/lunadeer/dominion/dtos/DominionDTO.java index bef2c40..cd488f4 100644 --- a/src/main/java/cn/lunadeer/dominion/dtos/DominionDTO.java +++ b/src/main/java/cn/lunadeer/dominion/dtos/DominionDTO.java @@ -19,10 +19,6 @@ public class DominionDTO { private static List query(String sql, Object... args) { List dominions = new ArrayList<>(); try (ResultSet rs = DatabaseManager.instance.query(sql, args)) { - if (sql.contains("UPDATE") || sql.contains("DELETE") || sql.contains("INSERT")) { - // 如果是更新操作,重新加载缓存 - Cache.instance.loadDominions(); - } return getDTOFromRS(rs); } catch (SQLException e) { DatabaseManager.handleDatabaseError("数据库操作失败: ", e, sql); @@ -145,6 +141,7 @@ public class DominionDTO { public static void delete(DominionDTO dominion) { String sql = "DELETE FROM dominion WHERE id = ?;"; query(sql, dominion.getId()); + Cache.instance.loadDominions(); } private DominionDTO(Integer id, UUID owner, String name, String world, @@ -228,7 +225,7 @@ public class DominionDTO { try (ResultSet rs = updateRow.execute()) { List dominions = getDTOFromRS(rs); if (dominions.size() == 0) return null; - Cache.instance.loadDominions(); + Cache.instance.loadDominions((Integer) id.value); return dominions.get(0); } catch (SQLException e) { DatabaseManager.handleDatabaseError("更新领地信息失败: ", e, updateRow.toString()); diff --git a/src/main/java/cn/lunadeer/dominion/dtos/PlayerPrivilegeDTO.java b/src/main/java/cn/lunadeer/dominion/dtos/PlayerPrivilegeDTO.java index 331a99c..ff62bab 100644 --- a/src/main/java/cn/lunadeer/dominion/dtos/PlayerPrivilegeDTO.java +++ b/src/main/java/cn/lunadeer/dominion/dtos/PlayerPrivilegeDTO.java @@ -12,6 +12,16 @@ import java.util.*; public class PlayerPrivilegeDTO { + private static List query(String sql, Object... params) { + List players = new ArrayList<>(); + try (ResultSet rs = DatabaseManager.instance.query(sql, params)) { + return getDTOFromRS(rs); + } catch (Exception e) { + DatabaseManager.handleDatabaseError("查询玩家权限失败: ", e, sql); + } + return players; + } + private static List getDTOFromRS(ResultSet rs) { List players = new ArrayList<>(); if (rs == null) return players; @@ -90,6 +100,7 @@ public class PlayerPrivilegeDTO { public static void delete(UUID player, Integer domID) { String sql = "DELETE FROM player_privilege WHERE player_uuid = ? AND dom_id = ?;"; query(sql, player.toString(), domID); + Cache.instance.loadPlayerPrivileges(player); } public static List selectAll() { @@ -172,18 +183,4 @@ public class PlayerPrivilegeDTO { } } - private static List query(String sql, Object... params) { - List players = new ArrayList<>(); - try (ResultSet rs = DatabaseManager.instance.query(sql, params)) { - if (sql.contains("UPDATE") || sql.contains("DELETE") || sql.contains("INSERT")) { - // 如果是更新操作,重新加载缓存 - Cache.instance.loadPlayerPrivileges(); - } - return getDTOFromRS(rs); - } catch (Exception e) { - DatabaseManager.handleDatabaseError("查询玩家权限失败: ", e, sql); - } - return players; - } - } diff --git a/src/main/java/cn/lunadeer/dominion/tuis/ListDominion.java b/src/main/java/cn/lunadeer/dominion/tuis/ListDominion.java index 56df9c6..ebf0138 100644 --- a/src/main/java/cn/lunadeer/dominion/tuis/ListDominion.java +++ b/src/main/java/cn/lunadeer/dominion/tuis/ListDominion.java @@ -47,11 +47,11 @@ public class ListDominion { prefix.append(" | "); } for (DominionNode node : dominionTree) { - TextComponent manage = Button.createGreen("管理").setExecuteCommand("/dominion manage " + node.dominion.getName()).build(); - TextComponent delete = Button.createRed("删除").setExecuteCommand("/dominion delete " + node.dominion.getName()).build(); - Line line = Line.create().append(delete).append(manage).append(prefix + node.dominion.getName()); + TextComponent manage = Button.createGreen("管理").setExecuteCommand("/dominion manage " + node.getDominion().getName()).build(); + TextComponent delete = Button.createRed("删除").setExecuteCommand("/dominion delete " + node.getDominion().getName()).build(); + Line line = Line.create().append(delete).append(manage).append(prefix + node.getDominion().getName()); lines.add(line); - lines.addAll(BuildTreeLines(node.children, depth + 1)); + lines.addAll(BuildTreeLines(node.getChildren(), depth + 1)); } return lines; } From a568d87ff689d01f3719914223c768cc7a731e31 Mon Sep 17 00:00:00 2001 From: zhangyuheng Date: Fri, 21 Jun 2024 23:54:07 +0800 Subject: [PATCH 20/26] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=8E=A9=E5=AE=B6?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=90=8D=E5=AD=97=E6=97=B6=E9=A2=86=E5=9C=B0?= =?UTF-8?q?=E4=B8=A2=E5=A4=B1=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- src/main/java/cn/lunadeer/dominion/dtos/PlayerDTO.java | 3 ++- src/main/java/cn/lunadeer/dominion/events/PlayerEvents.java | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index 6ddd656..684bdb9 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ cn.lunadeer Dominion - 1.32.1-beta + 1.32.2-beta jar Dominion diff --git a/src/main/java/cn/lunadeer/dominion/dtos/PlayerDTO.java b/src/main/java/cn/lunadeer/dominion/dtos/PlayerDTO.java index 4825423..4859975 100644 --- a/src/main/java/cn/lunadeer/dominion/dtos/PlayerDTO.java +++ b/src/main/java/cn/lunadeer/dominion/dtos/PlayerDTO.java @@ -24,7 +24,8 @@ public class PlayerDTO { return query(sql); } - public PlayerDTO onJoin() { + public PlayerDTO onJoin(String name) { + this.setLastKnownName(name); return update(this); } diff --git a/src/main/java/cn/lunadeer/dominion/events/PlayerEvents.java b/src/main/java/cn/lunadeer/dominion/events/PlayerEvents.java index e182a60..aaffa17 100644 --- a/src/main/java/cn/lunadeer/dominion/events/PlayerEvents.java +++ b/src/main/java/cn/lunadeer/dominion/events/PlayerEvents.java @@ -37,7 +37,7 @@ public class PlayerEvents implements Listener { public void onPlayerJoin(PlayerJoinEvent event) { Player bukkitPlayer = event.getPlayer(); PlayerDTO player = PlayerDTO.get(bukkitPlayer); - player.onJoin(); // update name + player.onJoin(bukkitPlayer.getName()); // update name } @EventHandler From f608041e9a794b2a5b69cdd610abaffa4b4c5414 Mon Sep 17 00:00:00 2001 From: zhangyuheng Date: Mon, 24 Jun 2024 10:50:22 +0800 Subject: [PATCH 21/26] =?UTF-8?q?=E7=A7=BB=E9=99=A4=E9=83=A8=E5=88=86?= =?UTF-8?q?=E6=97=A7=E4=BB=A3=E7=A0=81=EF=BC=8C=E4=BC=98=E5=8C=96import?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dominion/dtos/PlayerPrivilegeDTO.java | 1 - .../lunadeer/dominion/tuis/TemplateList.java | 1 - .../dominion/tuis/TemplateManage.java | 3 -- .../java/cn/lunadeer/dominion/utils/Time.java | 40 ------------------- 4 files changed, 45 deletions(-) delete mode 100644 src/main/java/cn/lunadeer/dominion/utils/Time.java diff --git a/src/main/java/cn/lunadeer/dominion/dtos/PlayerPrivilegeDTO.java b/src/main/java/cn/lunadeer/dominion/dtos/PlayerPrivilegeDTO.java index ff62bab..57d533c 100644 --- a/src/main/java/cn/lunadeer/dominion/dtos/PlayerPrivilegeDTO.java +++ b/src/main/java/cn/lunadeer/dominion/dtos/PlayerPrivilegeDTO.java @@ -1,7 +1,6 @@ package cn.lunadeer.dominion.dtos; import cn.lunadeer.dominion.Cache; -import cn.lunadeer.minecraftpluginutils.XLogger; import cn.lunadeer.minecraftpluginutils.databse.DatabaseManager; import cn.lunadeer.minecraftpluginutils.databse.Field; import cn.lunadeer.minecraftpluginutils.databse.syntax.InsertRow; diff --git a/src/main/java/cn/lunadeer/dominion/tuis/TemplateList.java b/src/main/java/cn/lunadeer/dominion/tuis/TemplateList.java index baad9ad..62603c6 100644 --- a/src/main/java/cn/lunadeer/dominion/tuis/TemplateList.java +++ b/src/main/java/cn/lunadeer/dominion/tuis/TemplateList.java @@ -4,7 +4,6 @@ import cn.lunadeer.dominion.dtos.PrivilegeTemplateDTO; import cn.lunadeer.minecraftpluginutils.stui.ListView; import cn.lunadeer.minecraftpluginutils.stui.components.Button; import cn.lunadeer.minecraftpluginutils.stui.components.Line; -import net.kyori.adventure.text.Component; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; diff --git a/src/main/java/cn/lunadeer/dominion/tuis/TemplateManage.java b/src/main/java/cn/lunadeer/dominion/tuis/TemplateManage.java index 39f5698..3a8d46c 100644 --- a/src/main/java/cn/lunadeer/dominion/tuis/TemplateManage.java +++ b/src/main/java/cn/lunadeer/dominion/tuis/TemplateManage.java @@ -10,10 +10,7 @@ import net.kyori.adventure.text.Component; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import java.util.List; - import static cn.lunadeer.dominion.commands.Apis.playerOnly; -import static cn.lunadeer.dominion.tuis.Apis.getPage; public class TemplateManage { diff --git a/src/main/java/cn/lunadeer/dominion/utils/Time.java b/src/main/java/cn/lunadeer/dominion/utils/Time.java deleted file mode 100644 index 8f95b54..0000000 --- a/src/main/java/cn/lunadeer/dominion/utils/Time.java +++ /dev/null @@ -1,40 +0,0 @@ -package cn.lunadeer.dominion.utils; - -import org.bukkit.Bukkit; - -import java.text.SimpleDateFormat; -import java.util.Date; - -public class Time { - - public static String nowStr() { - // yyyy-MM-dd HH:mm:ss - return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); - } - - /** - * 尝试获取folia的调度器 - * - * @return 是否成功 - */ - private static boolean tryFolia() { - try { - Bukkit.getAsyncScheduler(); - return true; - } catch (Throwable ignored) { - } - return false; - } - - private static Boolean IS_FOLIA = null; - - /** - * 判断是否是folia核心 - * - * @return 是否是folia核心 - */ - public static Boolean isFolia() { - if (IS_FOLIA == null) IS_FOLIA = tryFolia(); - return IS_FOLIA; - } -} From a090ea7bf1e97c7ba670628116dc3adcdfe822df Mon Sep 17 00:00:00 2001 From: zhangyuheng Date: Mon, 24 Jun 2024 13:49:46 +0800 Subject: [PATCH 22/26] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BA=86=E6=97=A0?= =?UTF-8?q?=E6=B3=95=E4=BF=AE=E6=94=B9=E7=AE=A1=E7=90=86=E5=91=98=E5=8F=91?= =?UTF-8?q?=E5=85=89=E6=95=88=E6=9E=9C=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- src/main/java/cn/lunadeer/dominion/tuis/PrivilegeInfo.java | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index edd708c..e136f64 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ cn.lunadeer Dominion - 1.33.4-beta + 1.33.5-beta jar Dominion diff --git a/src/main/java/cn/lunadeer/dominion/tuis/PrivilegeInfo.java b/src/main/java/cn/lunadeer/dominion/tuis/PrivilegeInfo.java index 30f296c..1999ad8 100644 --- a/src/main/java/cn/lunadeer/dominion/tuis/PrivilegeInfo.java +++ b/src/main/java/cn/lunadeer/dominion/tuis/PrivilegeInfo.java @@ -59,6 +59,7 @@ public class PrivilegeInfo { view.add(Line.create() .append(Button.createGreen("☑").setExecuteCommand("/dominion set_privilege " + playerName + " admin false " + dominion.getName() + " " + page).build()) .append("管理员")); + view.add(createOption(Flag.GLOW, privilege.getFlagValue(Flag.GLOW), playerName, dominion.getName(), page)); } else { view.add(Line.create() .append(Button.createRed("☐").setExecuteCommand("/dominion set_privilege " + playerName + " admin true " + dominion.getName() + " " + page).build()) From e33be83b079f0e6e2bcc4bbabf2c22799a25b129 Mon Sep 17 00:00:00 2001 From: zhangyuheng Date: Tue, 25 Jun 2024 09:31:48 +0800 Subject: [PATCH 23/26] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=9C=A8=E9=A2=86?= =?UTF-8?q?=E5=9C=B0=E5=A4=96=E4=BB=8D=E7=84=B6=E8=83=BD=E8=A7=A6=E5=8F=91?= =?UTF-8?q?=E6=8C=89=E9=92=AE=E7=9A=84=E6=9D=83=E9=99=90=E6=BC=8F=E6=B4=9E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/cn/lunadeer/dominion/events/PlayerEvents.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/cn/lunadeer/dominion/events/PlayerEvents.java b/src/main/java/cn/lunadeer/dominion/events/PlayerEvents.java index aaffa17..a920eac 100644 --- a/src/main/java/cn/lunadeer/dominion/events/PlayerEvents.java +++ b/src/main/java/cn/lunadeer/dominion/events/PlayerEvents.java @@ -160,7 +160,8 @@ public class PlayerEvents implements Listener { if (event.getClickedBlock() == null) { return; } - Material clicked = event.getClickedBlock().getType(); + Block block = event.getClickedBlock(); + Material clicked = block.getType(); if (clicked != Material.STONE_BUTTON && clicked != Material.BAMBOO_BUTTON && clicked != Material.OAK_BUTTON && @@ -176,7 +177,7 @@ public class PlayerEvents implements Listener { clicked != Material.CHERRY_BUTTON) { return; } - DominionDTO dom = Cache.instance.getPlayerCurrentDominion(player); + DominionDTO dom = Cache.instance.getDominion(block.getLocation()); checkFlag(dom, Flag.BUTTON, player, event); } From 26bc618b93b310d4d85d0b7e586bef12264750ae Mon Sep 17 00:00:00 2001 From: zhangyuheng Date: Tue, 25 Jun 2024 09:43:20 +0800 Subject: [PATCH 24/26] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=B2=A1=E6=9C=89?= =?UTF-8?q?=E6=9D=83=E9=99=90=E4=BB=8D=E7=84=B6=E8=83=BD=E9=80=9A=E8=BF=87?= =?UTF-8?q?=E5=BA=8A=E8=AE=BE=E7=BD=AE=E9=87=8D=E7=94=9F=E7=82=B9=E7=9A=84?= =?UTF-8?q?=E6=9D=83=E9=99=90=E6=BC=8F=E6=B4=9E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dominion/events/PlayerEvents.java | 27 +++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/src/main/java/cn/lunadeer/dominion/events/PlayerEvents.java b/src/main/java/cn/lunadeer/dominion/events/PlayerEvents.java index a920eac..25b6d70 100644 --- a/src/main/java/cn/lunadeer/dominion/events/PlayerEvents.java +++ b/src/main/java/cn/lunadeer/dominion/events/PlayerEvents.java @@ -103,9 +103,32 @@ public class PlayerEvents implements Listener { } @EventHandler(priority = EventPriority.HIGHEST) // bed - public void onBedUse(PlayerBedEnterEvent event) { + public void onBedUse(PlayerInteractEvent event) { Player bukkitPlayer = event.getPlayer(); - DominionDTO dom = Cache.instance.getDominion(event.getBed().getLocation()); + Block block = event.getClickedBlock(); + if (block == null) { + return; + } + Material clicked = block.getType(); + if (clicked != Material.RED_BED && + clicked != Material.ORANGE_BED && + clicked != Material.YELLOW_BED && + clicked != Material.LIME_BED && + clicked != Material.GREEN_BED && + clicked != Material.LIGHT_BLUE_BED && + clicked != Material.CYAN_BED && + clicked != Material.BLUE_BED && + clicked != Material.PURPLE_BED && + clicked != Material.MAGENTA_BED && + clicked != Material.PINK_BED && + clicked != Material.WHITE_BED && + clicked != Material.LIGHT_GRAY_BED && + clicked != Material.GRAY_BED && + clicked != Material.BLACK_BED && + clicked != Material.BROWN_BED) { + return; + } + DominionDTO dom = Cache.instance.getDominion(block.getLocation()); checkFlag(dom, Flag.BED, bukkitPlayer, event); } From 570ea0c75cdfd887b08acb1fe7247325ed96b0f1 Mon Sep 17 00:00:00 2001 From: zhangyuheng Date: Tue, 25 Jun 2024 10:15:54 +0800 Subject: [PATCH 25/26] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=B2=A1=E6=9C=89?= =?UTF-8?q?=E6=9D=83=E9=99=90=E4=BB=8D=E7=84=B6=E8=83=BD=E6=89=93=E5=BC=80?= =?UTF-8?q?=E5=91=8A=E7=A4=BA=E7=89=8C=E7=BC=96=E8=BE=91=E7=95=8C=E9=9D=A2?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98=EF=BC=88=E4=BF=AE=E5=A4=8D=E5=89=8D?= =?UTF-8?q?=EF=BC=9A=E5=8F=AF=E4=BB=A5=E6=89=93=E5=BC=80=EF=BC=8C=E4=BD=86?= =?UTF-8?q?=E6=98=AF=E4=B8=8D=E8=83=BD=E7=BC=96=E8=BE=91=EF=BC=9B=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E5=90=8E=E7=9B=B4=E6=8E=A5=E6=97=A0=E6=B3=95=E6=89=93?= =?UTF-8?q?=E5=BC=80=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dominion/events/EnvironmentEvents.java | 9 +- .../dominion/events/PlayerEvents.java | 151 +++++++----------- 2 files changed, 61 insertions(+), 99 deletions(-) diff --git a/src/main/java/cn/lunadeer/dominion/events/EnvironmentEvents.java b/src/main/java/cn/lunadeer/dominion/events/EnvironmentEvents.java index 02942d4..d71db23 100644 --- a/src/main/java/cn/lunadeer/dominion/events/EnvironmentEvents.java +++ b/src/main/java/cn/lunadeer/dominion/events/EnvironmentEvents.java @@ -97,6 +97,9 @@ public class EnvironmentEvents implements Listener { @EventHandler(priority = EventPriority.HIGHEST) // trample public void onFarmlandTrample(PlayerInteractEvent event) { + if (event.getAction() != Action.PHYSICAL) { + return; + } Block block = event.getClickedBlock(); if (block == null) { return; @@ -104,11 +107,7 @@ public class EnvironmentEvents implements Listener { if (block.getType() != FARMLAND) { return; } - if (event.getAction() != Action.PHYSICAL) { - return; - } - Location location = block.getLocation(); - DominionDTO dom = Cache.instance.getDominion(location); + DominionDTO dom = Cache.instance.getDominion(block.getLocation()); checkFlag(dom, Flag.TRAMPLE, event); } diff --git a/src/main/java/cn/lunadeer/dominion/events/PlayerEvents.java b/src/main/java/cn/lunadeer/dominion/events/PlayerEvents.java index 25b6d70..764e59b 100644 --- a/src/main/java/cn/lunadeer/dominion/events/PlayerEvents.java +++ b/src/main/java/cn/lunadeer/dominion/events/PlayerEvents.java @@ -8,15 +8,13 @@ import cn.lunadeer.minecraftpluginutils.Notification; import cn.lunadeer.minecraftpluginutils.Teleport; import org.bukkit.Location; import org.bukkit.Material; +import org.bukkit.Tag; import org.bukkit.block.Block; import org.bukkit.entity.*; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.event.block.BlockIgniteEvent; -import org.bukkit.event.block.BlockPlaceEvent; -import org.bukkit.event.block.SignChangeEvent; +import org.bukkit.event.block.*; import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.event.entity.EntityPlaceEvent; import org.bukkit.event.entity.ProjectileLaunchEvent; @@ -104,28 +102,15 @@ public class PlayerEvents implements Listener { @EventHandler(priority = EventPriority.HIGHEST) // bed public void onBedUse(PlayerInteractEvent event) { + if (!event.getAction().isRightClick()) { + return; + } Player bukkitPlayer = event.getPlayer(); Block block = event.getClickedBlock(); if (block == null) { return; } - Material clicked = block.getType(); - if (clicked != Material.RED_BED && - clicked != Material.ORANGE_BED && - clicked != Material.YELLOW_BED && - clicked != Material.LIME_BED && - clicked != Material.GREEN_BED && - clicked != Material.LIGHT_BLUE_BED && - clicked != Material.CYAN_BED && - clicked != Material.BLUE_BED && - clicked != Material.PURPLE_BED && - clicked != Material.MAGENTA_BED && - clicked != Material.PINK_BED && - clicked != Material.WHITE_BED && - clicked != Material.LIGHT_GRAY_BED && - clicked != Material.GRAY_BED && - clicked != Material.BLACK_BED && - clicked != Material.BROWN_BED) { + if (!(Tag.BEDS.isTagged(block.getType()))) { return; } DominionDTO dom = Cache.instance.getDominion(block.getLocation()); @@ -179,25 +164,15 @@ public class PlayerEvents implements Listener { @EventHandler(priority = EventPriority.HIGHEST) // button public void onButton(PlayerInteractEvent event) { + if (!event.getAction().isRightClick()) { + return; + } Player player = event.getPlayer(); if (event.getClickedBlock() == null) { return; } Block block = event.getClickedBlock(); - Material clicked = block.getType(); - if (clicked != Material.STONE_BUTTON && - clicked != Material.BAMBOO_BUTTON && - clicked != Material.OAK_BUTTON && - clicked != Material.SPRUCE_BUTTON && - clicked != Material.BIRCH_BUTTON && - clicked != Material.JUNGLE_BUTTON && - clicked != Material.ACACIA_BUTTON && - clicked != Material.DARK_OAK_BUTTON && - clicked != Material.CRIMSON_BUTTON && - clicked != Material.WARPED_BUTTON && - clicked != Material.POLISHED_BLACKSTONE_BUTTON && - clicked != Material.MANGROVE_BUTTON && - clicked != Material.CHERRY_BUTTON) { + if (!Tag.BUTTONS.isTagged(block.getType())) { return; } DominionDTO dom = Cache.instance.getDominion(block.getLocation()); @@ -206,10 +181,13 @@ public class PlayerEvents implements Listener { @EventHandler(priority = EventPriority.HIGHEST) // cake public void eatCake(PlayerInteractEvent event) { - if (event.getClickedBlock() == null) { + if (!event.getAction().isRightClick()) { return; } Block block = event.getClickedBlock(); + if (block == null) { + return; + } Material clicked = block.getType(); if (clicked != Material.CAKE) { return; @@ -301,7 +279,11 @@ public class PlayerEvents implements Listener { @EventHandler(priority = EventPriority.HIGHEST) // comparer public void comparerChange(PlayerInteractEvent event) { - if (event.getClickedBlock() == null) { + if (!event.getAction().isRightClick()) { + return; + } + Block block = event.getClickedBlock(); + if (block == null) { return; } Material clicked = event.getClickedBlock().getType(); @@ -315,45 +297,14 @@ public class PlayerEvents implements Listener { @EventHandler(priority = EventPriority.HIGHEST) // door public void doorUse(PlayerInteractEvent event) { - if (event.getClickedBlock() == null) { + if (!event.getAction().isRightClick()) { return; } - Material clicked = event.getClickedBlock().getType(); - if (clicked != Material.IRON_DOOR && - clicked != Material.OAK_DOOR && - clicked != Material.SPRUCE_DOOR && - clicked != Material.BIRCH_DOOR && - clicked != Material.JUNGLE_DOOR && - clicked != Material.ACACIA_DOOR && - clicked != Material.CHERRY_DOOR && - clicked != Material.DARK_OAK_DOOR && - clicked != Material.MANGROVE_DOOR && - clicked != Material.BAMBOO_DOOR && - clicked != Material.CRIMSON_DOOR && - clicked != Material.WARPED_DOOR && - clicked != Material.IRON_TRAPDOOR && - clicked != Material.OAK_TRAPDOOR && - clicked != Material.SPRUCE_TRAPDOOR && - clicked != Material.BIRCH_TRAPDOOR && - clicked != Material.JUNGLE_TRAPDOOR && - clicked != Material.ACACIA_TRAPDOOR && - clicked != Material.CHERRY_TRAPDOOR && - clicked != Material.DARK_OAK_TRAPDOOR && - clicked != Material.MANGROVE_TRAPDOOR && - clicked != Material.BAMBOO_TRAPDOOR && - clicked != Material.CRIMSON_TRAPDOOR && - clicked != Material.WARPED_TRAPDOOR && - clicked != Material.OAK_FENCE_GATE && - clicked != Material.SPRUCE_FENCE_GATE && - clicked != Material.BIRCH_FENCE_GATE && - clicked != Material.JUNGLE_FENCE_GATE && - clicked != Material.ACACIA_FENCE_GATE && - clicked != Material.CHERRY_FENCE_GATE && - clicked != Material.DARK_OAK_FENCE_GATE && - clicked != Material.MANGROVE_FENCE_GATE && - clicked != Material.BAMBOO_FENCE_GATE && - clicked != Material.CRIMSON_FENCE_GATE && - clicked != Material.WARPED_FENCE_GATE) { + Block block = event.getClickedBlock(); + if (block == null) { + return; + } + if (!Tag.DOORS.isTagged(block.getType())) { return; } Player player = event.getPlayer(); @@ -374,10 +325,28 @@ public class PlayerEvents implements Listener { checkFlag(dom, Flag.DYE, player, event); } + @EventHandler(priority = EventPriority.HIGHEST) // edit sign + public void onSignOpen(PlayerInteractEvent event) { + if (!event.getAction().isRightClick()) { + return; + } + Player player = event.getPlayer(); + Block block = event.getClickedBlock(); + if (block == null) { + return; + } + if (!(Tag.SIGNS.isTagged(block.getType()))) { + return; + } + DominionDTO dom = Cache.instance.getDominion(block.getLocation()); + checkFlag(dom, Flag.EDIT_SIGN, player, event); + } + @EventHandler(priority = EventPriority.HIGHEST) // edit sign public void onSignEdit(SignChangeEvent event) { Player player = event.getPlayer(); - DominionDTO dom = Cache.instance.getDominion(event.getBlock().getLocation()); + Block block = event.getBlock(); + DominionDTO dom = Cache.instance.getDominion(block.getLocation()); checkFlag(dom, Flag.EDIT_SIGN, player, event); } @@ -458,10 +427,13 @@ public class PlayerEvents implements Listener { @EventHandler(priority = EventPriority.HIGHEST) // honey public void honeyInteractive(PlayerInteractEvent event) { - if (event.getClickedBlock() == null) { + if (!event.getAction().isRightClick()) { return; } Block block = event.getClickedBlock(); + if (block == null) { + return; + } Material clicked = block.getType(); if (clicked != Material.BEEHIVE && clicked != Material.BEE_NEST) { return; @@ -513,10 +485,13 @@ public class PlayerEvents implements Listener { @EventHandler(priority = EventPriority.HIGHEST) // lever public void onLever(PlayerInteractEvent event) { - if (event.getClickedBlock() == null) { + if (!event.getAction().isRightClick()) { return; } Block block = event.getClickedBlock(); + if (block == null) { + return; + } Material clicked = block.getType(); if (clicked != Material.LEVER) { return; @@ -615,26 +590,14 @@ public class PlayerEvents implements Listener { @EventHandler(priority = EventPriority.HIGHEST) // pressure public void onPressure(PlayerInteractEvent event) { - if (event.getClickedBlock() == null) { + if (event.getAction() != Action.PHYSICAL) { return; } Block block = event.getClickedBlock(); - Material clicked = block.getType(); - if (clicked != Material.STONE_PRESSURE_PLATE && - clicked != Material.LIGHT_WEIGHTED_PRESSURE_PLATE && - clicked != Material.HEAVY_WEIGHTED_PRESSURE_PLATE && - clicked != Material.OAK_PRESSURE_PLATE && - clicked != Material.SPRUCE_PRESSURE_PLATE && - clicked != Material.BIRCH_PRESSURE_PLATE && - clicked != Material.JUNGLE_PRESSURE_PLATE && - clicked != Material.ACACIA_PRESSURE_PLATE && - clicked != Material.DARK_OAK_PRESSURE_PLATE && - clicked != Material.CRIMSON_PRESSURE_PLATE && - clicked != Material.WARPED_PRESSURE_PLATE && - clicked != Material.POLISHED_BLACKSTONE_PRESSURE_PLATE && - clicked != Material.MANGROVE_PRESSURE_PLATE && - clicked != Material.CHERRY_PRESSURE_PLATE && - clicked != Material.BAMBOO_PRESSURE_PLATE) { + if (block == null) { + return; + } + if (!Tag.PRESSURE_PLATES.isTagged(block.getType())) { return; } Player player = event.getPlayer(); From 90245ce5b6dd7dd13824998832136b7614a1d4ca Mon Sep 17 00:00:00 2001 From: zhangyuheng Date: Tue, 25 Jun 2024 10:37:21 +0800 Subject: [PATCH 26/26] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=E5=8A=A8?= =?UTF-8?q?=E7=89=A9=E7=94=9F=E6=88=90=EF=BC=88=E7=B9=81=E6=AE=96=EF=BC=89?= =?UTF-8?q?=E3=80=81=E5=AF=B9=E6=9D=91=E6=B0=91=E9=80=A0=E6=88=90=E4=BC=A4?= =?UTF-8?q?=E5=AE=B3=E3=80=81=E6=9D=91=E6=B0=91=E7=B9=81=E6=AE=96=EF=BC=8C?= =?UTF-8?q?=E4=B8=89=E7=A7=8D=E6=9D=83=E9=99=90=EF=BC=88=E8=A1=8C=E4=B8=BA?= =?UTF-8?q?=EF=BC=89=E6=8E=A7=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- .../java/cn/lunadeer/dominion/dtos/Flag.java | 6 +++-- .../dominion/events/EnvironmentEvents.java | 10 +++++++++ .../dominion/events/PlayerEvents.java | 22 ++++++++++++++++--- 4 files changed, 34 insertions(+), 6 deletions(-) diff --git a/pom.xml b/pom.xml index e136f64..ed507ed 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ cn.lunadeer Dominion - 1.33.5-beta + 1.33.6-beta jar Dominion diff --git a/src/main/java/cn/lunadeer/dominion/dtos/Flag.java b/src/main/java/cn/lunadeer/dominion/dtos/Flag.java index f658ad4..974150b 100644 --- a/src/main/java/cn/lunadeer/dominion/dtos/Flag.java +++ b/src/main/java/cn/lunadeer/dominion/dtos/Flag.java @@ -15,7 +15,7 @@ import java.util.List; public enum Flag { ANCHOR("anchor", "重生锚", "是否允许设置重生锚", false, false, true), ANIMAL_KILLING("animal_killing", "对动物造成伤害", "是否允许对动物造成伤害", false, false, true), - ANIMAL_SPAWN("animal_spawn", "动物生成", "是否允许动物生成", true, true, false), + ANIMAL_SPAWN("animal_spawn", "动物生成(繁殖)", "是否允许动物生成(包括繁殖)", true, true, false), ANVIL("anvil", "使用铁砧", "是否允许使用铁砧", false, false, true), BEACON("beacon", "信标交互", "是否允许与信标交互", false, false, true), BED("bed", "床交互", "是否允许使用床睡觉或设置重生点", false, false, true), @@ -34,7 +34,7 @@ public enum Flag { ENCHANT("enchant", "使用附魔台", "是否可以使用附魔台", false, false, true), ENDER_MAN("ender_man", "末影人行为", "包含:末影人是否可以生成、瞬移", false, true, true), ENDER_PEARL("ender_pearl", "投掷末影珍珠", "是否可以使用末影珍珠", false, false, true), - FEED("feed", "喂养", "是否可以喂养动物", false, false, true), + FEED("feed", "喂养动物", "是否可以喂养动物", false, false, true), FIRE_SPREAD("fire_spread", "火焰蔓延", "是否可以火焰蔓延", false, true, true), FLOW_IN_PROTECTION("flow_in_protection", "外部流体是否可以进入", "包含:岩浆、水(不会阻止领地内部的流体蔓延)", false, true, true), FLY("fly", "飞行", "不是翅鞘飞行,是类似于创造模式的飞行", false, false, false), @@ -62,6 +62,8 @@ public enum Flag { TRAMPLE("trample", "作物践踏", "是否可以践踏作物(关闭意味着保护耕地)", false, true, true), VEHICLE_DESTROY("vehicle_destroy", "破坏载具", "是否可以破坏载具(主要是矿车)", false, false, true), VEHICLE_SPAWN("vehicle_spawn", "生成载具", "是否可以生成载具(主要是矿车)", false, false, true), + VILLAGER_KILLING("villager_killing", "对村民造成伤害", "是否可以对村民造成伤害", false, false, true), + VILLAGER_SPAWN("villager_spawn", "村民繁殖", "是否允许村民繁殖", true, true, true), WITHER_SPAWN("wither_spawn", "凋零生成", "凋零生成", false, true, true), ; private final String flag_name; diff --git a/src/main/java/cn/lunadeer/dominion/events/EnvironmentEvents.java b/src/main/java/cn/lunadeer/dominion/events/EnvironmentEvents.java index d71db23..3b72a91 100644 --- a/src/main/java/cn/lunadeer/dominion/events/EnvironmentEvents.java +++ b/src/main/java/cn/lunadeer/dominion/events/EnvironmentEvents.java @@ -160,4 +160,14 @@ public class EnvironmentEvents implements Listener { DominionDTO dom = Cache.instance.getDominion(entity.getLocation()); checkFlag(dom, Flag.ANIMAL_SPAWN, event); } + + @EventHandler(priority = EventPriority.HIGHEST) // villager_spawn + public void onVillagerSpawn(CreatureSpawnEvent event) { + Entity entity = event.getEntity(); + if (entity.getType() != EntityType.VILLAGER) { + return; + } + DominionDTO dom = Cache.instance.getDominion(entity.getLocation()); + checkFlag(dom, Flag.VILLAGER_SPAWN, event); + } } diff --git a/src/main/java/cn/lunadeer/dominion/events/PlayerEvents.java b/src/main/java/cn/lunadeer/dominion/events/PlayerEvents.java index 764e59b..351b884 100644 --- a/src/main/java/cn/lunadeer/dominion/events/PlayerEvents.java +++ b/src/main/java/cn/lunadeer/dominion/events/PlayerEvents.java @@ -25,6 +25,7 @@ import org.bukkit.event.inventory.InventoryType; import org.bukkit.event.player.*; import org.bukkit.event.vehicle.VehicleDestroyEvent; import org.bukkit.inventory.Inventory; +import org.bukkit.material.Colorable; import org.spigotmc.event.entity.EntityMountEvent; import static cn.lunadeer.dominion.events.Apis.checkFlag; @@ -316,9 +317,7 @@ public class PlayerEvents implements Listener { public void dyeEvent(PlayerInteractEntityEvent event) { Player player = event.getPlayer(); Entity entity = event.getRightClicked(); - if (!(entity instanceof Sheep) - && !(entity instanceof Wolf) - && !(entity instanceof Cat)) { + if (!(entity instanceof Colorable)) { return; } DominionDTO dom = Cache.instance.getDominion(entity.getLocation()); @@ -394,6 +393,10 @@ public class PlayerEvents implements Listener { if (!(event.getRightClicked() instanceof Animals)) { return; } + // if shearing sheep instead + if (event.getPlayer().getInventory().getItem(event.getHand()).getType() == Material.SHEARS) { + return; + } Player player = event.getPlayer(); DominionDTO dom = Cache.instance.getDominion(event.getRightClicked().getLocation()); checkFlag(dom, Flag.FEED, player, event); @@ -688,4 +691,17 @@ public class PlayerEvents implements Listener { DominionDTO dom = Cache.instance.getDominion(entity.getLocation()); checkFlag(dom, Flag.VEHICLE_SPAWN, player, event); } + + @EventHandler(priority = EventPriority.HIGHEST) // villager_killing + public void onVillagerKilling(EntityDamageByEntityEvent event) { + if (!(event.getDamager() instanceof Player)) { + return; + } + if (!(event.getEntity() instanceof Villager)) { + return; + } + Player player = (Player) event.getDamager(); + DominionDTO dom = Cache.instance.getDominion(event.getEntity().getLocation()); + checkFlag(dom, Flag.VILLAGER_KILLING, player, event); + } }