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);
}