@@ -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