mirror of
https://github.com/ColdeZhang/Dominion.git
synced 2024-10-18 21:16:45 +08:00
引入计时器统计性能
This commit is contained in:
parent
3fe0ebfe3c
commit
0e638e00b2
@ -1,4 +1,4 @@
|
||||
<div align="center">
|
||||
<div style="text-align: center;">
|
||||
|
||||
<img src="https://ssl.lunadeer.cn:14437/i/2024/03/28/6604f0cec0f0e.png" alt="" width="70%">
|
||||
|
||||
@ -38,8 +38,9 @@
|
||||
- 领地区域可视化;
|
||||
- 管理员可在游戏内使用TUI配置领地系统;
|
||||
- 支持[从 Residence 迁移](https://ssl.lunadeer.cn:14448/doc/73/)领地数据(1.33.7+);
|
||||
- 超高性能(一个坐标在10127个领地内的搜索平均耗时不超过0.2ms,仅占用1tick的不到0.4%时间)
|
||||
|
||||
<div align="center">
|
||||
<div style="text-align: center;">
|
||||
|
||||
创建领地
|
||||
|
||||
@ -53,6 +54,9 @@
|
||||
|
||||
<img src="https://ssl.lunadeer.cn:14437/i/2024/05/10/663debec11dad.gif" alt="" width="60%">
|
||||
|
||||
高性能
|
||||
|
||||
<img src="https://ssl.lunadeer.cn:14437/i/2024/08/13/66bad56cc9fac.png" alt="" width="60%">
|
||||
|
||||
</div>
|
||||
|
||||
|
@ -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))
|
||||
|
@ -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<String, List<DominionNode>> world_dominion_tree_sector_d; // x <= 0, z <= 0
|
||||
|
||||
public DominionDTO getLocInDominionDTO(@NotNull Location loc) {
|
||||
List<DominionNode> 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<DominionNode> nodes = getNodes(loc);
|
||||
if (nodes == null) return null;
|
||||
if (nodes.isEmpty()) return null;
|
||||
DominionNode dominionNode = getLocInDominionNode(nodes, loc);
|
||||
return dominionNode == null ? null : dominionNode.getDominion();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -85,8 +85,8 @@ public class DominionDTO {
|
||||
}
|
||||
String sql = "SELECT * FROM dominion WHERE id = ? AND id > 0;";
|
||||
List<DominionDTO> 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<DominionDTO> 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<DominionDTO> 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<DominionDTO> 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<DominionDTO> 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;
|
||||
|
@ -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;
|
||||
|
@ -66,4 +66,6 @@ Dynmap: false
|
||||
|
||||
CheckUpdate: true
|
||||
|
||||
Debug: false
|
||||
Debug: false
|
||||
|
||||
Timer: false # 性能测试计时器
|
Loading…
Reference in New Issue
Block a user