diff --git a/README.md b/README.md index 8b3dc35..e0c517d 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -
+
@@ -38,8 +38,9 @@ - 领地区域可视化; - 管理员可在游戏内使用TUI配置领地系统; - 支持[从 Residence 迁移](https://ssl.lunadeer.cn:14448/doc/73/)领地数据(1.33.7+); +- 超高性能(一个坐标在10127个领地内的搜索平均耗时不超过0.2ms,仅占用1tick的不到0.4%时间) -
+
创建领地 @@ -53,6 +54,9 @@ +高性能 + +
diff --git a/build.gradle.kts b/build.gradle.kts index 9d8c691..3724e09 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -4,7 +4,7 @@ plugins { } group = "cn.lunadeer" -version = "2.1.17-beta" +version = "2.1.18-beta" java { toolchain.languageVersion.set(JavaLanguageVersion.of(21)) diff --git a/core/src/main/java/cn/lunadeer/dominion/Cache.java b/core/src/main/java/cn/lunadeer/dominion/Cache.java index bdc1148..0074585 100644 --- a/core/src/main/java/cn/lunadeer/dominion/Cache.java +++ b/core/src/main/java/cn/lunadeer/dominion/Cache.java @@ -4,6 +4,7 @@ import cn.lunadeer.dominion.dtos.*; import cn.lunadeer.dominion.utils.MapRender; import cn.lunadeer.dominion.utils.Particle; import cn.lunadeer.dominion.utils.ResMigration; +import cn.lunadeer.minecraftpluginutils.AutoTimer; import cn.lunadeer.minecraftpluginutils.Notification; import cn.lunadeer.minecraftpluginutils.Scheduler; import cn.lunadeer.minecraftpluginutils.XLogger; @@ -213,51 +214,53 @@ public class Cache { * @return 玩家当前所在领地 */ public DominionDTO getPlayerCurrentDominion(Player player) { - Integer last_in_dom_id = player_current_dominion_id.get(player.getUniqueId()); - DominionDTO last_dominion = null; - if (last_in_dom_id != null) { - last_dominion = id_dominions.get(last_in_dom_id); - } - if (isInDominion(last_dominion, player.getLocation())) { - 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; + try (AutoTimer ignored = new AutoTimer(Dominion.config.TimerEnabled())) { + Integer last_in_dom_id = player_current_dominion_id.get(player.getUniqueId()); + DominionDTO last_dominion = null; + if (last_in_dom_id != null) { + last_dominion = id_dominions.get(last_in_dom_id); + } + if (isInDominion(last_dominion, player.getLocation())) { + if (dominion_children.get(last_in_dom_id) == null || dominion_children.get(last_in_dom_id).isEmpty()) { + // 如果玩家仍在领地内,且领地没有子领地,则直接返回 + if (recheckPlayerState) { + lightOrNot(player, last_dominion); + flyOrNot(player, last_dominion); + recheckPlayerState = false; + } + return last_dominion; } + } + DominionDTO current_dominion = dominion_trees.getLocInDominionDTO(player.getLocation()); + int last_dom_id = last_dominion == null ? -1 : last_dominion.getId(); + int current_dom_id = current_dominion == null ? -1 : current_dominion.getId(); + if (last_dom_id == current_dom_id) { return last_dominion; } - } - DominionDTO current_dominion = dominion_trees.getLocInDominionDTO(player.getLocation()); - int last_dom_id = last_dominion == null ? -1 : last_dominion.getId(); - int current_dom_id = current_dominion == null ? -1 : current_dominion.getId(); - if (last_dom_id == current_dom_id) { - return last_dominion; - } - if (last_dom_id != -1) { - String msg = last_dominion.getLeaveMessage(); - msg = msg.replace("${DOM_NAME}", last_dominion.getName()); - Notification.actionBar(player, msg); - } - if (current_dom_id != -1) { - String msg = current_dominion.getJoinMessage(); - msg = msg.replace("${DOM_NAME}", current_dominion.getName()); - Notification.actionBar(player, msg); - } + if (last_dom_id != -1) { + String msg = last_dominion.getLeaveMessage(); + msg = msg.replace("${DOM_NAME}", last_dominion.getName()); + Notification.actionBar(player, msg); + } + if (current_dom_id != -1) { + String msg = current_dominion.getJoinMessage(); + msg = msg.replace("${DOM_NAME}", current_dominion.getName()); + Notification.actionBar(player, msg); + } - lightOrNot(player, current_dominion); // 发光检查 - flyOrNot(player, current_dominion); // 飞行检查 - if (current_dominion == null) { - player_current_dominion_id.put(player.getUniqueId(), null); - return null; + lightOrNot(player, current_dominion); // 发光检查 + flyOrNot(player, current_dominion); // 飞行检查 + if (current_dominion == null) { + player_current_dominion_id.put(player.getUniqueId(), null); + return null; + } + player_current_dominion_id.put(player.getUniqueId(), current_dominion.getId()); + // show border + if (current_dominion.getFlagValue(Flag.SHOW_BORDER)) { + Particle.showBorder(player, current_dominion); + } + return current_dominion; } - player_current_dominion_id.put(player.getUniqueId(), current_dominion.getId()); - // show border - if (current_dominion.getFlagValue(Flag.SHOW_BORDER)) { - Particle.showBorder(player, current_dominion); - } - return current_dominion; } /** @@ -466,11 +469,13 @@ public class Cache { private ConcurrentHashMap> world_dominion_tree_sector_d; // x <= 0, z <= 0 public DominionDTO getLocInDominionDTO(@NotNull Location loc) { - List nodes = getNodes(loc); - if (nodes == null) return null; - if (nodes.isEmpty()) return null; - DominionNode dominionNode = getLocInDominionNode(nodes, loc); - return dominionNode == null ? null : dominionNode.getDominion(); + try (AutoTimer ignored = new AutoTimer(Dominion.config.TimerEnabled())) { + List nodes = getNodes(loc); + if (nodes == null) return null; + if (nodes.isEmpty()) return null; + DominionNode dominionNode = getLocInDominionNode(nodes, loc); + return dominionNode == null ? null : dominionNode.getDominion(); + } } diff --git a/core/src/main/java/cn/lunadeer/dominion/dtos/DominionDTO.java b/core/src/main/java/cn/lunadeer/dominion/dtos/DominionDTO.java index ebbae8f..b34f3f1 100644 --- a/core/src/main/java/cn/lunadeer/dominion/dtos/DominionDTO.java +++ b/core/src/main/java/cn/lunadeer/dominion/dtos/DominionDTO.java @@ -85,8 +85,8 @@ public class DominionDTO { } String sql = "SELECT * FROM dominion WHERE id = ? AND id > 0;"; List dominions = query(sql, id); - if (dominions.size() == 0) return null; - return dominions.get(0); + if (dominions.isEmpty()) return null; + return dominions.getFirst(); } public static List selectByParentId(String world, Integer parentId) { @@ -105,8 +105,8 @@ public class DominionDTO { public static DominionDTO select(String name) { String sql = "SELECT * FROM dominion WHERE name = ? AND id > 0;"; List dominions = query(sql, name); - if (dominions.size() == 0) return null; - return dominions.get(0); + if (dominions.isEmpty()) return null; + return dominions.getFirst(); } public static DominionDTO insert(DominionDTO dominion) { @@ -125,8 +125,8 @@ public class DominionDTO { try (ResultSet rs = insert.execute()) { Cache.instance.loadDominions(); List dominions = getDTOFromRS(rs); - if (dominions.size() == 0) return null; - return dominions.get(0); + if (dominions.isEmpty()) return null; + return dominions.getFirst(); } catch (SQLException e) { DatabaseManager.handleDatabaseError("数据库操作失败: ", e, insert.toString()); return null; @@ -224,9 +224,9 @@ public class DominionDTO { .where("id = ?", id.value); try (ResultSet rs = updateRow.execute()) { List dominions = getDTOFromRS(rs); - if (dominions.size() == 0) return null; + if (dominions.isEmpty()) return null; Cache.instance.loadDominions((Integer) id.value); - return dominions.get(0); + return dominions.getFirst(); } catch (SQLException e) { DatabaseManager.handleDatabaseError("更新领地信息失败: ", e, updateRow.toString()); return null; diff --git a/core/src/main/java/cn/lunadeer/dominion/managers/ConfigManager.java b/core/src/main/java/cn/lunadeer/dominion/managers/ConfigManager.java index 415b975..d0e811f 100644 --- a/core/src/main/java/cn/lunadeer/dominion/managers/ConfigManager.java +++ b/core/src/main/java/cn/lunadeer/dominion/managers/ConfigManager.java @@ -7,6 +7,7 @@ import cn.lunadeer.minecraftpluginutils.XLogger; import org.bukkit.Material; import org.bukkit.configuration.file.FileConfiguration; +import java.io.File; import java.util.List; public class ConfigManager { @@ -21,6 +22,7 @@ public class ConfigManager { _plugin.reloadConfig(); _file = _plugin.getConfig(); _debug = _file.getBoolean("Debug", false); + _timer = _file.getBoolean("Timer", false); XLogger.setDebug(_debug); _db_type = _file.getString("Database.Type", "sqlite"); _db_host = _file.getString("Database.Host", "localhost"); @@ -98,35 +100,65 @@ public class ConfigManager { } public void saveAll() { + // 删除旧文件 + new File(_plugin.getDataFolder(), "config.yml").delete(); + // 保存新文件 + _plugin.saveDefaultConfig(); + // 重新加载 + _plugin.reloadConfig(); + _file = _plugin.getConfig(); + + // 保存配置 + _file.set("Database.Type", _db_type); + _file.set("Database.Host", _db_host); + _file.set("Database.Port", _db_port); + _file.set("Database.Name", _db_name); + _file.set("Database.User", _db_user); + _file.set("Database.Pass", _db_pass); + _file.set("AutoCreateRadius", _auto_create_radius); + _file.set("Limit.SpawnProtection", _spawn_protection); + _file.set("Limit.MinY", _limit_min_y); + _file.set("Limit.MaxY", _limit_max_y); _file.set("Limit.SizeX", _limit_size_x); _file.set("Limit.SizeY", _limit_size_y); _file.set("Limit.SizeZ", _limit_size_z); - _file.set("BlueMap", _blue_map); - _file.set("Dynmap", _dynmap); - _file.set("AutoCleanAfterDays", _auto_clean_after_days); - _file.set("Limit.MinY", _limit_min_y); - _file.set("Limit.MaxY", _limit_max_y); _file.set("Limit.Amount", _limit_amount); _file.set("Limit.Depth", _limit_depth); _file.set("Limit.Vert", _limit_vert); - _file.set("Limit.OpByPass", _limit_op_bypass); _file.set("Limit.WorldBlackList", _world_black_list); - _file.set("CheckUpdate", _check_update); + _file.set("Limit.OpByPass", _limit_op_bypass); + _file.set("Teleport.Enable", _tp_enable); _file.set("Teleport.Delay", _tp_delay); _file.set("Teleport.CoolDown", _tp_cool_down); + + _file.set("AutoCleanAfterDays", _auto_clean_after_days); + _file.set("Tool", _tool); + _file.set("Economy.Enable", _economy_enable); _file.set("Economy.Price", _economy_price); _file.set("Economy.OnlyXZ", _economy_only_xz); _file.set("Economy.Refund", _economy_refund); + _file.set("FlyPermissionNodes", _fly_permission_nodes); + _file.set("ResidenceMigration", _residence_migration); + _file.set("GroupTitle.Enable", _group_title_enable); _file.set("GroupTitle.Prefix", _group_title_prefix); _file.set("GroupTitle.Suffix", _group_title_suffix); + + _file.set("BlueMap", _blue_map); + _file.set("Dynmap", _dynmap); + + _file.set("CheckUpdate", _check_update); + + _file.set("Debug", _debug); + _file.set("Timer", _timer); + _plugin.saveConfig(); } @@ -141,6 +173,10 @@ public class ConfigManager { XLogger.setDebug(debug); } + public Boolean TimerEnabled() { + return _timer; + } + public String getDbType() { return _db_type; } @@ -455,6 +491,7 @@ public class ConfigManager { private final Dominion _plugin; private FileConfiguration _file; private Boolean _debug; + private Boolean _timer; private String _db_type; private String _db_host; diff --git a/core/src/main/resources/config.yml b/core/src/main/resources/config.yml index 03b7799..22d3696 100644 --- a/core/src/main/resources/config.yml +++ b/core/src/main/resources/config.yml @@ -66,4 +66,6 @@ Dynmap: false CheckUpdate: true -Debug: false \ No newline at end of file +Debug: false + +Timer: false # 性能测试计时器 \ No newline at end of file