From d55b46f65742aaef0ed7572d2de809b3011fdef1 Mon Sep 17 00:00:00 2001 From: zhangyuheng Date: Fri, 29 Mar 2024 09:09:50 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9Emca=E5=AE=89=E5=85=A8?= =?UTF-8?q?=E5=8C=BA=E8=BE=93=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- .../cn/lunadeer/dominion/BlueMapConnect.java | 54 ++++++++++ src/main/java/cn/lunadeer/dominion/Cache.java | 4 + .../java/cn/lunadeer/dominion/Commands.java | 6 +- .../java/cn/lunadeer/dominion/Dominion.java | 14 ++- .../lunadeer/dominion/commands/Operator.java | 98 +++++++++++++++++-- .../dominion/events/EnvironmentEvents.java | 1 - .../dominion/events/PlayerEvents.java | 2 - .../lunadeer/dominion/utils/Notification.java | 1 + .../cn/lunadeer/dominion/utils/Scheduler.java | 15 +++ .../java/cn/lunadeer/dominion/utils/Time.java | 21 ---- 11 files changed, 183 insertions(+), 35 deletions(-) create mode 100644 src/main/java/cn/lunadeer/dominion/utils/Scheduler.java diff --git a/pom.xml b/pom.xml index 105477c..a72f84c 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ cn.lunadeer Dominion - 1.12.2-beta + 1.13.4-beta jar Dominion diff --git a/src/main/java/cn/lunadeer/dominion/BlueMapConnect.java b/src/main/java/cn/lunadeer/dominion/BlueMapConnect.java index 6ebe1e8..6d0b51c 100644 --- a/src/main/java/cn/lunadeer/dominion/BlueMapConnect.java +++ b/src/main/java/cn/lunadeer/dominion/BlueMapConnect.java @@ -68,4 +68,58 @@ public class BlueMapConnect { 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) + .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 2737a47..1ee7f60 100644 --- a/src/main/java/cn/lunadeer/dominion/Cache.java +++ b/src/main/java/cn/lunadeer/dominion/Cache.java @@ -206,6 +206,10 @@ public class Cache { return id_dominions.get(id); } + public List getDominions() { + return new ArrayList<>(id_dominions.values()); + } + public static Cache instance; private ConcurrentHashMap id_dominions; private ConcurrentHashMap> world_dominions; // 所有领地 diff --git a/src/main/java/cn/lunadeer/dominion/Commands.java b/src/main/java/cn/lunadeer/dominion/Commands.java index 3bd90a7..cf5f1cc 100644 --- a/src/main/java/cn/lunadeer/dominion/Commands.java +++ b/src/main/java/cn/lunadeer/dominion/Commands.java @@ -134,6 +134,9 @@ public class Commands implements TabExecutor { case "reload_cache": Operator.reloadCache(sender, args); break; + case "export_mca": + Operator.exportMca(sender, args); + break; default: return false; } @@ -163,7 +166,8 @@ public class Commands implements TabExecutor { "set_leave_msg", "rename", "give", - "reload_cache" + "reload_cache", + "export_mca" ); } if (args.length == 2) { diff --git a/src/main/java/cn/lunadeer/dominion/Dominion.java b/src/main/java/cn/lunadeer/dominion/Dominion.java index 865b13d..3d0fc3b 100644 --- a/src/main/java/cn/lunadeer/dominion/Dominion.java +++ b/src/main/java/cn/lunadeer/dominion/Dominion.java @@ -5,7 +5,7 @@ import cn.lunadeer.dominion.events.PlayerEvents; import cn.lunadeer.dominion.events.SelectPointEvents; import cn.lunadeer.dominion.utils.ConfigManager; import cn.lunadeer.dominion.utils.Database; -import cn.lunadeer.dominion.utils.Time; +import cn.lunadeer.dominion.utils.Scheduler; import cn.lunadeer.dominion.utils.XLogger; import org.bukkit.Bukkit; import org.bukkit.Location; @@ -16,6 +16,7 @@ import java.util.HashMap; import java.util.Map; import java.util.Objects; import java.util.UUID; +import java.util.concurrent.TimeUnit; public final class Dominion extends JavaPlugin { @@ -26,6 +27,7 @@ public final class Dominion extends JavaPlugin { config = new ConfigManager(this); dbConnection = Database.createConnection(); Database.migrate(); + scheduler = new Scheduler(this); Cache.instance = new Cache(); Bukkit.getPluginManager().registerEvents(new PlayerEvents(), this); @@ -46,8 +48,13 @@ public final class Dominion extends JavaPlugin { XLogger.info(" |_____/ \\___/|_| |_| |_|_|_| |_|_|\\___/|_| |_|"); XLogger.info(" "); - Time.runLater(this, AutoClean::run, 20 * 30); - Time.runLater(this, BlueMapConnect::render, 20 * 60); + scheduler.async.runDelayed(this, scheduledTask -> { + AutoClean.run(); + }, 30, TimeUnit.SECONDS); + + scheduler.async.runDelayed(this, scheduledTask -> { + BlueMapConnect.render(); + }, 40, TimeUnit.SECONDS); } @Override @@ -59,4 +66,5 @@ public final class Dominion extends JavaPlugin { public static ConfigManager config; public static Connection dbConnection; public static Map> pointsSelect = new HashMap<>(); + public static Scheduler scheduler; } diff --git a/src/main/java/cn/lunadeer/dominion/commands/Operator.java b/src/main/java/cn/lunadeer/dominion/commands/Operator.java index d7f70ff..6227689 100644 --- a/src/main/java/cn/lunadeer/dominion/commands/Operator.java +++ b/src/main/java/cn/lunadeer/dominion/commands/Operator.java @@ -1,20 +1,106 @@ package cn.lunadeer.dominion.commands; +import cn.lunadeer.dominion.BlueMapConnect; import cn.lunadeer.dominion.Cache; +import cn.lunadeer.dominion.Dominion; +import cn.lunadeer.dominion.dtos.DominionDTO; import cn.lunadeer.dominion.utils.Notification; +import cn.lunadeer.dominion.utils.XLogger; import org.bukkit.command.CommandSender; +import java.io.File; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + import static cn.lunadeer.dominion.commands.Apis.notOpOrConsole; public class Operator { - public static void reloadCache(CommandSender sender, String[] args){ + public static void reloadCache(CommandSender sender, String[] args) { if (notOpOrConsole(sender)) return; - Notification.info(sender, "正在从数据库重新加载领地缓存..."); - Cache.instance.loadDominions(); - Notification.info(sender, "正在从数据库重新加载玩家权限缓存..."); - Cache.instance.loadPlayerPrivileges(); - Notification.info(sender, "缓存刷新完成"); + Dominion.scheduler.async.runNow(Dominion.instance, ScheduledTask -> { + Notification.info(sender, "正在从数据库重新加载领地缓存..."); + Cache.instance.loadDominions(); + Notification.info(sender, "领地缓存已重新加载"); + }); + Dominion.scheduler.async.runNow(Dominion.instance, ScheduledTask -> { + Notification.info(sender, "正在从数据库重新加载玩家权限缓存..."); + Cache.instance.loadPlayerPrivileges(); + Notification.info(sender, "玩家权限缓存已重新加载"); + }); + } + + public static void exportMca(CommandSender sender, String[] args) { + if (notOpOrConsole(sender)) return; + Dominion.scheduler.async.runNow(Dominion.instance, ScheduledTask -> { + Notification.info(sender, "正在导出拥有领地的MCA文件列表..."); + Map> mca_cords = new HashMap<>(); + List doms = Cache.instance.getDominions(); + for (DominionDTO dom : doms) { + if (!mca_cords.containsKey(dom.getWorld())) { + mca_cords.put(dom.getWorld(), new ArrayList<>()); + } + Integer world_x1 = dom.getX1(); + Integer world_x2 = dom.getX2(); + Integer world_z1 = dom.getZ1(); + Integer world_z2 = dom.getZ2(); + int mca_x1 = world_x1 / 512 - 1; + int mca_x2 = world_x2 / 512 + 1; + int mca_z1 = world_z1 / 512 - 1; + int mca_z2 = world_z2 / 512 + 1; + for (int x = mca_x1; x <= mca_x2; x++) { + for (int z = mca_z1; z <= mca_z2; z++) { + String file_name = "r." + x + "." + z + ".mca"; + if (mca_cords.get(dom.getWorld()).contains(file_name)) { + continue; + } + mca_cords.get(dom.getWorld()).add(file_name); + } + } + } + File folder = new File(Dominion.instance.getDataFolder(), "ExportedMCAList"); + if (!folder.exists()) { + boolean success = folder.mkdirs(); + if (!success) { + Notification.error(sender, "创建导出文件夹失败"); + return; + } + } + for (String world : mca_cords.keySet()) { + File file = new File(folder, world + ".txt"); + Notification.info(sender, "正在导出 " + world + " 的MCA文件列表..."); + try { + if (file.exists()) { + boolean success = file.delete(); + if (!success) { + Notification.error(sender, "删除 " + world + " 的MCA文件列表失败"); + continue; + } + } + boolean success = file.createNewFile(); + if (!success) { + Notification.error(sender, "创建 " + world + " 的MCA文件列表失败"); + continue; + } + List cords = mca_cords.get(world); + for (String cord : cords) { + XLogger.debug("正在写入 " + cord + "..."); + try { + java.nio.file.Files.write(file.toPath(), (cord + "\n").getBytes(), java.nio.file.StandardOpenOption.APPEND); + } catch (Exception e) { + Notification.error(sender, "写入 " + cord + " 失败"); + } + } + } catch (Exception e) { + Notification.error(sender, "导出 " + world + " 的MCA文件列表失败"); + Notification.error(sender, e.getMessage()); + } + } + BlueMapConnect.renderMCA(mca_cords); + Notification.info(sender, "MCA文件列表已导出到 " + folder.getAbsolutePath()); + }); } } diff --git a/src/main/java/cn/lunadeer/dominion/events/EnvironmentEvents.java b/src/main/java/cn/lunadeer/dominion/events/EnvironmentEvents.java index a990f1b..f260322 100644 --- a/src/main/java/cn/lunadeer/dominion/events/EnvironmentEvents.java +++ b/src/main/java/cn/lunadeer/dominion/events/EnvironmentEvents.java @@ -16,7 +16,6 @@ import org.bukkit.event.block.BlockFromToEvent; import org.bukkit.event.block.BlockIgniteEvent; import org.bukkit.event.entity.CreatureSpawnEvent; import org.bukkit.event.entity.EntityDeathEvent; -import org.bukkit.event.entity.EntityDropItemEvent; import org.bukkit.event.entity.EntityExplodeEvent; import org.bukkit.event.player.PlayerInteractEvent; diff --git a/src/main/java/cn/lunadeer/dominion/events/PlayerEvents.java b/src/main/java/cn/lunadeer/dominion/events/PlayerEvents.java index 03cc4d2..3e9987b 100644 --- a/src/main/java/cn/lunadeer/dominion/events/PlayerEvents.java +++ b/src/main/java/cn/lunadeer/dominion/events/PlayerEvents.java @@ -7,7 +7,6 @@ import cn.lunadeer.dominion.dtos.PlayerPrivilegeDTO; import cn.lunadeer.dominion.utils.Notification; import io.papermc.paper.event.entity.EntityDyeEvent; import org.bukkit.Material; -import org.bukkit.NamespacedKey; import org.bukkit.block.Block; import org.bukkit.entity.*; import org.bukkit.event.EventHandler; @@ -23,7 +22,6 @@ import org.bukkit.event.inventory.InventoryOpenEvent; import org.bukkit.event.inventory.InventoryType; import org.bukkit.event.player.*; import org.bukkit.event.vehicle.VehicleDestroyEvent; -import org.bukkit.persistence.PersistentDataType; import org.spigotmc.event.entity.EntityMountEvent; public class PlayerEvents implements Listener { diff --git a/src/main/java/cn/lunadeer/dominion/utils/Notification.java b/src/main/java/cn/lunadeer/dominion/utils/Notification.java index dd13b01..e96c9ba 100644 --- a/src/main/java/cn/lunadeer/dominion/utils/Notification.java +++ b/src/main/java/cn/lunadeer/dominion/utils/Notification.java @@ -10,6 +10,7 @@ public class Notification { private static final Style i_style = Style.style(TextColor.color(139, 255, 123)); private static final Style w_style = Style.style(TextColor.color(255, 185, 69)); private static final Style e_style = Style.style(TextColor.color(255, 96, 72)); + private static final Style d_style = Style.style(TextColor.color(0, 255, 255)); private static final String prefix = "[Dominion] "; diff --git a/src/main/java/cn/lunadeer/dominion/utils/Scheduler.java b/src/main/java/cn/lunadeer/dominion/utils/Scheduler.java new file mode 100644 index 0000000..1970df9 --- /dev/null +++ b/src/main/java/cn/lunadeer/dominion/utils/Scheduler.java @@ -0,0 +1,15 @@ +package cn.lunadeer.dominion.utils; + +import io.papermc.paper.threadedregions.scheduler.AsyncScheduler; +import io.papermc.paper.threadedregions.scheduler.GlobalRegionScheduler; +import org.bukkit.plugin.java.JavaPlugin; + +public class Scheduler { + public Scheduler(JavaPlugin plugin) { + region = plugin.getServer().getGlobalRegionScheduler(); + async = plugin.getServer().getAsyncScheduler(); + } + + public GlobalRegionScheduler region; + public AsyncScheduler async; +} diff --git a/src/main/java/cn/lunadeer/dominion/utils/Time.java b/src/main/java/cn/lunadeer/dominion/utils/Time.java index 5f60282..8f95b54 100644 --- a/src/main/java/cn/lunadeer/dominion/utils/Time.java +++ b/src/main/java/cn/lunadeer/dominion/utils/Time.java @@ -1,11 +1,9 @@ package cn.lunadeer.dominion.utils; import org.bukkit.Bukkit; -import org.bukkit.plugin.Plugin; import java.text.SimpleDateFormat; import java.util.Date; -import java.util.concurrent.TimeUnit; public class Time { @@ -39,23 +37,4 @@ public class Time { if (IS_FOLIA == null) IS_FOLIA = tryFolia(); return IS_FOLIA; } - - /** - * 定时异步任务 - * - * @param plugin 插件 - * @param runnable 任务 - * @param ticks 间隔 - */ - public static void runAtFixedRateAsync(Plugin plugin, Runnable runnable, int ticks) { - if (isFolia()) - Bukkit.getAsyncScheduler().runAtFixedRate(plugin, (task) -> runnable.run(), ticks / 20, ticks / 20, TimeUnit.SECONDS); - else Bukkit.getScheduler().runTaskTimerAsynchronously(plugin, runnable, ticks, ticks); - } - - public static void runLater(Plugin plugin, Runnable runnable, int ticks) { - if (isFolia()) - Bukkit.getAsyncScheduler().runDelayed(plugin, (task) -> runnable.run(), ticks / 20, TimeUnit.SECONDS); - else Bukkit.getScheduler().runTaskLater(plugin, runnable, ticks); - } }