diff --git a/pom.xml b/pom.xml index 98973f4..bc23e60 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ cn.lunadeer Dominion - 1.30.13-beta + 1.30.14-beta jar Dominion diff --git a/src/main/java/cn/lunadeer/dominion/Cache.java b/src/main/java/cn/lunadeer/dominion/Cache.java index f1f31e1..8f0d86f 100644 --- a/src/main/java/cn/lunadeer/dominion/Cache.java +++ b/src/main/java/cn/lunadeer/dominion/Cache.java @@ -125,7 +125,7 @@ public class Cache { last_dominion = id_dominions.get(last_in_dom_id); } if (isInDominion(last_dominion, player)) { - if (dominion_children.get(last_in_dom_id) == null) { + if (dominion_children.get(last_in_dom_id) == null || dominion_children.get(last_in_dom_id).size() == 0) { // 如果玩家仍在领地内,且领地没有子领地,则直接返回 return last_dominion; } @@ -171,6 +171,17 @@ public class Cache { return current_dominion; } + /** + * 玩家退出时调用 用于清除玩家当前所在领地 + * 会将玩家当前所在领地设置为null + * 这样当玩家下次进入领地时,会重新检查玩家所在位置 + * + * @param player 玩家 + */ + public void onPlayerQuit(Player player) { + player_current_dominion_id.put(player.getUniqueId(), null); + } + /** * 检查玩家是否需要设置为发光 * diff --git a/src/main/java/cn/lunadeer/dominion/controllers/DominionController.java b/src/main/java/cn/lunadeer/dominion/controllers/DominionController.java index 490e994..b327672 100644 --- a/src/main/java/cn/lunadeer/dominion/controllers/DominionController.java +++ b/src/main/java/cn/lunadeer/dominion/controllers/DominionController.java @@ -146,9 +146,9 @@ public class DominionController { if (Dominion.config.getEconomyEnable()) { int count; if (Dominion.config.getEconomyOnlyXZ()) { - count = (loc2.getBlockX() - loc1.getBlockX() + 1) * (loc2.getBlockZ() - loc1.getBlockZ() + 1); + count = dominion.getSquare(); } else { - count = (loc2.getBlockX() - loc1.getBlockX() + 1) * (loc2.getBlockY() - loc1.getBlockY() + 1) * (loc2.getBlockZ() - loc1.getBlockZ() + 1); + count = dominion.getVolume(); } float price = count * Dominion.config.getEconomyPrice(); if (Dominion.vault.getEconomy().getBalance(operator.getPlayer()) < price) { diff --git a/src/main/java/cn/lunadeer/dominion/dtos/DominionDTO.java b/src/main/java/cn/lunadeer/dominion/dtos/DominionDTO.java index 8e3057a..08f8089 100644 --- a/src/main/java/cn/lunadeer/dominion/dtos/DominionDTO.java +++ b/src/main/java/cn/lunadeer/dominion/dtos/DominionDTO.java @@ -326,11 +326,23 @@ public class DominionDTO { } public Integer getSquare() { - return (x2 - x1) * (z2 - z1); + return (x2 - x1 + 1) * (z2 - z1 + 1); } public Integer getVolume() { - return getSquare() * (y2 - y1); + return getSquare() * (y2 - y1 + 1); + } + + public Integer getWidthX() { + return x2 - x1 + 1; + } + + public Integer getHeight() { + return y2 - y1 + 1; + } + + public Integer getWidthZ() { + return z2 - z1 + 1; } public Integer getParentDomId() { diff --git a/src/main/java/cn/lunadeer/dominion/events/PlayerEvents.java b/src/main/java/cn/lunadeer/dominion/events/PlayerEvents.java index e281ea2..631f6e9 100644 --- a/src/main/java/cn/lunadeer/dominion/events/PlayerEvents.java +++ b/src/main/java/cn/lunadeer/dominion/events/PlayerEvents.java @@ -40,6 +40,12 @@ public class PlayerEvents implements Listener { player.onJoin(); // update name } + @EventHandler + public void onPlayerQuit(PlayerQuitEvent event) { + Player bukkitPlayer = event.getPlayer(); + Cache.instance.onPlayerQuit(bukkitPlayer); + } + @EventHandler(priority = EventPriority.HIGHEST) // anchor public void onRespawnAnchor(PlayerRespawnEvent event) { Player bukkitPlayer = event.getPlayer(); diff --git a/src/main/java/cn/lunadeer/dominion/events/SelectPointEvents.java b/src/main/java/cn/lunadeer/dominion/events/SelectPointEvents.java index 6c79636..a7cf062 100644 --- a/src/main/java/cn/lunadeer/dominion/events/SelectPointEvents.java +++ b/src/main/java/cn/lunadeer/dominion/events/SelectPointEvents.java @@ -1,6 +1,7 @@ package cn.lunadeer.dominion.events; import cn.lunadeer.dominion.Dominion; +import cn.lunadeer.dominion.dtos.DominionDTO; import cn.lunadeer.minecraftpluginutils.Notification; import cn.lunadeer.minecraftpluginutils.ParticleRender; import org.bukkit.Location; @@ -71,30 +72,23 @@ public class SelectPointEvents implements Listener { minY = Dominion.config.getLimitMinY(); maxY = Dominion.config.getLimitMaxY(); } + DominionDTO dominion = new DominionDTO(player.getUniqueId(), "", loc1.getWorld().getName(), + minX, minY, minZ, maxX, maxY, maxZ); if (Dominion.config.getEconomyEnable()) { int count; if (Dominion.config.getEconomyOnlyXZ()) { - count = (maxX - minX) * (maxZ - minZ); + count = dominion.getSquare(); } else { - count = (maxX - minX) * (maxY - minY) * (maxZ - minZ); + count = dominion.getVolume(); } float price = count * Dominion.config.getEconomyPrice(); Notification.info(player, "预计领地创建价格为 %.2f %s", price, Dominion.vault.getEconomy().currencyNamePlural()); } ParticleRender.showBoxFace(Dominion.instance, player, loc1, loc2); - Notification.info(player, "尺寸: %d x %d x %d", - Math.abs(points.get(1).getBlockX() - points.get(0).getBlockX()), - Math.abs(points.get(1).getBlockY() - points.get(0).getBlockY()), - Math.abs(points.get(1).getBlockZ() - points.get(0).getBlockZ())); - Notification.info(player, "面积: %d", - Math.abs(points.get(1).getBlockX() - points.get(0).getBlockX()) * - Math.abs(points.get(1).getBlockZ() - points.get(0).getBlockZ())); - Notification.info(player, "高度: %d", - Math.abs(points.get(1).getBlockY() - points.get(0).getBlockY())); - Notification.info(player, "体积: %d", - Math.abs(points.get(1).getBlockX() - points.get(0).getBlockX()) * - Math.abs(points.get(1).getBlockY() - points.get(0).getBlockY()) * - Math.abs(points.get(1).getBlockZ() - points.get(0).getBlockZ())); + Notification.info(player, "尺寸: %d x %d x %d", dominion.getWidthX(), dominion.getHeight(), dominion.getWidthZ()); + Notification.info(player, "面积: %d", dominion.getSquare()); + Notification.info(player, "高度: %d", dominion.getHeight()); + Notification.info(player, "体积: %d", dominion.getVolume()); } Dominion.pointsSelect.put(player.getUniqueId(), points); }