diff --git a/pom.xml b/pom.xml
index e15a53a..e895f83 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
cn.lunadeer
Dominion
- 1.8.2-beta
+ 1.9.0-beta
jar
Dominion
diff --git a/src/main/java/cn/lunadeer/dominion/commands/Helper.java b/src/main/java/cn/lunadeer/dominion/commands/Helper.java
index 7d45134..d1bf8ab 100644
--- a/src/main/java/cn/lunadeer/dominion/commands/Helper.java
+++ b/src/main/java/cn/lunadeer/dominion/commands/Helper.java
@@ -32,6 +32,7 @@ public class Helper {
"shear", "shoot",
"tnt_explode", "trade",
"vehicle_destroy",
+ "vehicle_spawn",
"wither_spawn");
}
@@ -51,7 +52,8 @@ public class Helper {
"place", "pressure", "riding", "repeater",
"shear", "shoot",
"trade",
- "vehicle_destroy");
+ "vehicle_destroy",
+ "vehicle_spawn");
}
/**
diff --git a/src/main/java/cn/lunadeer/dominion/controllers/DominionController.java b/src/main/java/cn/lunadeer/dominion/controllers/DominionController.java
index 0b8c503..cf379c3 100644
--- a/src/main/java/cn/lunadeer/dominion/controllers/DominionController.java
+++ b/src/main/java/cn/lunadeer/dominion/controllers/DominionController.java
@@ -53,6 +53,10 @@ public class DominionController {
public static DominionDTO create(Player owner, String name,
Location loc1, Location loc2,
String parent_dominion_name) {
+ if (name.contains(" ")) {
+ Notification.error(owner, "领地名称不能包含空格");
+ return null;
+ }
if (DominionDTO.select(name) != null) {
Notification.error(owner, "已经存在名称为 " + name + " 的领地");
return null;
@@ -413,6 +417,10 @@ public class DominionController {
* @param new_name 新名称
*/
public static void rename(Player operator, String old_name, String new_name) {
+ if (new_name.contains(" ")) {
+ Notification.error(operator, "领地名称不能包含空格");
+ return;
+ }
DominionDTO dominion = DominionDTO.select(old_name);
if (dominion == null) {
Notification.error(operator, "领地 " + old_name + " 不存在");
diff --git a/src/main/java/cn/lunadeer/dominion/controllers/FlagsController.java b/src/main/java/cn/lunadeer/dominion/controllers/FlagsController.java
index 9db4033..5439fca 100644
--- a/src/main/java/cn/lunadeer/dominion/controllers/FlagsController.java
+++ b/src/main/java/cn/lunadeer/dominion/controllers/FlagsController.java
@@ -76,6 +76,7 @@ public class FlagsController {
case "tnt_explode": return dominion.setTntExplode(value);
case "trade": return dominion.setTrade(value);
case "vehicle_destroy": return dominion.setVehicleDestroy(value);
+ case "vehicle_spawn": return dominion.setVehicleSpawn(value);
case "wither_spawn": return dominion.setWitherSpawn(value);
default:
Notification.error(operator, "未知的领地权限 " + flag);
diff --git a/src/main/java/cn/lunadeer/dominion/controllers/PrivilegeController.java b/src/main/java/cn/lunadeer/dominion/controllers/PrivilegeController.java
index e75f051..276cfe5 100644
--- a/src/main/java/cn/lunadeer/dominion/controllers/PrivilegeController.java
+++ b/src/main/java/cn/lunadeer/dominion/controllers/PrivilegeController.java
@@ -211,6 +211,9 @@ public class PrivilegeController {
case "vehicle_destroy":
privilege.setVehicleDestroy(value);
break;
+ case "vehicle_spawn":
+ privilege.setVehicleSpawn(value);
+ break;
default:
Notification.error(operator, "未知的领地权限 " + flag);
return false;
@@ -264,7 +267,8 @@ public class PrivilegeController {
dom.getRiding(), dom.getRepeater(),
dom.getShear(), dom.getShoot(),
dom.getTrade(),
- dom.getVehicleDestroy());
+ dom.getVehicleDestroy(),
+ dom.getVehicleSpawn());
privilege = PlayerPrivilegeDTO.insert(privilege);
if (privilege == null) {
Notification.error(operator, "创建玩家特权失败,可能是此玩家已存在特权");
diff --git a/src/main/java/cn/lunadeer/dominion/dtos/DominionDTO.java b/src/main/java/cn/lunadeer/dominion/dtos/DominionDTO.java
index f5b0f8d..c2854a6 100644
--- a/src/main/java/cn/lunadeer/dominion/dtos/DominionDTO.java
+++ b/src/main/java/cn/lunadeer/dominion/dtos/DominionDTO.java
@@ -70,6 +70,7 @@ public class DominionDTO {
rs.getBoolean("tnt_explode"),
rs.getBoolean("trade"),
rs.getBoolean("vehicle_destroy"),
+ rs.getBoolean("vehicle_spawn"),
rs.getBoolean("wither_spawn")
);
dominions.add(dominion);
@@ -215,6 +216,7 @@ public class DominionDTO {
"tnt_explode = " + dominion.getTntExplode() + ", " + // dom only
"trade = " + dominion.getTrade() + ", " +
"vehicle_destroy = " + dominion.getVehicleDestroy() + ", " +
+ "vehicle_spawn = " + dominion.getVehicleSpawn() + ", " +
"wither_spawn = " + dominion.getWitherSpawn() + " " + // dom only
" WHERE id = " + dominion.getId() +
" RETURNING *;";
@@ -243,6 +245,7 @@ public class DominionDTO {
Boolean shear, Boolean shoot,
Boolean tntExplode, Boolean trade,
Boolean vehicleDestroy,
+ Boolean vehicleSpawn,
Boolean witherSpawn) {
this.id = id;
this.owner = owner;
@@ -296,6 +299,7 @@ public class DominionDTO {
this.tntExplode = tntExplode;
this.trade = trade;
this.vehicleDestroy = vehicleDestroy;
+ this.vehicleSpawn = vehicleSpawn;
this.witherSpawn = witherSpawn;
}
@@ -311,7 +315,7 @@ public class DominionDTO {
false, false, false, false, true,
true, false, false, false, false, false, false,
false, true, false, false, false, false,
- false, false, false, false, false, false);
+ false, false, false, false, false, false, false);
}
public DominionDTO(UUID owner, String name, String world,
@@ -370,6 +374,7 @@ public class DominionDTO {
private Boolean tntExplode = false;
private Boolean trade = false;
private Boolean vehicleDestroy = false;
+ private Boolean vehicleSpawn = false;
private Boolean witherSpawn = false;
private Boolean harvest = false;
@@ -828,6 +833,15 @@ public class DominionDTO {
return update(this);
}
+ public Boolean getVehicleSpawn() {
+ return vehicleSpawn;
+ }
+
+ public DominionDTO setVehicleSpawn(Boolean vehicleSpawn) {
+ this.vehicleSpawn = vehicleSpawn;
+ return update(this);
+ }
+
public Boolean getWitherSpawn() {
return witherSpawn;
}
diff --git a/src/main/java/cn/lunadeer/dominion/dtos/PlayerPrivilegeDTO.java b/src/main/java/cn/lunadeer/dominion/dtos/PlayerPrivilegeDTO.java
index b552e6b..868fc96 100644
--- a/src/main/java/cn/lunadeer/dominion/dtos/PlayerPrivilegeDTO.java
+++ b/src/main/java/cn/lunadeer/dominion/dtos/PlayerPrivilegeDTO.java
@@ -28,7 +28,8 @@ public class PlayerPrivilegeDTO {
"riding, repeater, " +
"shear, shoot, " +
"trade, " +
- "vehicle_destroy" +
+ "vehicle_destroy, " +
+ "vehicle_spawn" +
") VALUES (" +
"'" + player.getPlayerUUID() + "', " + player.getAdmin() + ", " + player.getDomID() + ", " +
player.getAnchor() + ", " + player.getAnimalKilling() + ", " + player.getAnvil() + ", " +
@@ -46,7 +47,8 @@ public class PlayerPrivilegeDTO {
player.getRiding() + ", " + player.getRepeater() + ", " +
player.getShear() + ", " + player.getShoot() + ", " +
player.getTrade() + ", " +
- player.getVehicleDestroy() +
+ player.getVehicleDestroy() + ", " +
+ player.getVehicleSpawn() + " " +
") RETURNING *;";
List players = query(sql);
if (players.size() == 0) return null;
@@ -105,6 +107,7 @@ public class PlayerPrivilegeDTO {
private Boolean enderPearl;
private Boolean feed;
private Boolean glow;
+ private Boolean harvest;
private Boolean honey;
private Boolean hook;
private Boolean hopper;
@@ -120,7 +123,7 @@ public class PlayerPrivilegeDTO {
private Boolean shoot;
private Boolean trade;
private Boolean vehicleDestroy;
- private Boolean harvest;
+ private Boolean vehicleSpawn;
public Integer getId() {
return id;
@@ -214,6 +217,10 @@ public class PlayerPrivilegeDTO {
return glow;
}
+ public Boolean getHarvest() {
+ return harvest;
+ }
+
public Boolean getHoney() {
return honey;
}
@@ -274,8 +281,8 @@ public class PlayerPrivilegeDTO {
return vehicleDestroy;
}
- public Boolean getHarvest() {
- return harvest;
+ public Boolean getVehicleSpawn() {
+ return vehicleSpawn;
}
public PlayerPrivilegeDTO setAnchor(Boolean anchor) {
@@ -448,6 +455,11 @@ public class PlayerPrivilegeDTO {
return update(this);
}
+ public PlayerPrivilegeDTO setVehicleSpawn(Boolean vehicleSpawn) {
+ this.vehicleSpawn = vehicleSpawn;
+ return update(this);
+ }
+
public PlayerPrivilegeDTO setHarvest(Boolean harvest) {
this.harvest = harvest;
return update(this);
@@ -474,7 +486,8 @@ public class PlayerPrivilegeDTO {
Boolean riding, Boolean repeater,
Boolean shear, Boolean shoot,
Boolean trade,
- Boolean vehicleDestroy) {
+ Boolean vehicleDestroy,
+ Boolean vehicleSpawn) {
this.id = id;
this.playerUUID = playerUUID;
this.admin = admin;
@@ -514,6 +527,7 @@ public class PlayerPrivilegeDTO {
this.shoot = shoot;
this.trade = trade;
this.vehicleDestroy = vehicleDestroy;
+ this.vehicleSpawn = vehicleSpawn;
}
public PlayerPrivilegeDTO(UUID playerUUID, Integer domID,
@@ -532,7 +546,8 @@ public class PlayerPrivilegeDTO {
Boolean riding, Boolean repeater,
Boolean shear, Boolean shoot,
Boolean trade,
- Boolean vehicleDestroy
+ Boolean vehicleDestroy,
+ Boolean vehicleSpawn
) {
this(null, playerUUID, false, domID,
anchor, animalKilling, anvil,
@@ -550,7 +565,8 @@ public class PlayerPrivilegeDTO {
riding, repeater,
shear, shoot,
trade,
- vehicleDestroy);
+ vehicleDestroy,
+ vehicleSpawn);
}
private static List query(String sql) {
@@ -597,7 +613,8 @@ public class PlayerPrivilegeDTO {
rs.getBoolean("shear"),
rs.getBoolean("shoot"),
rs.getBoolean("trade"),
- rs.getBoolean("vehicle_destroy")
+ rs.getBoolean("vehicle_destroy"),
+ rs.getBoolean("vehicle_spawn")
);
players.add(player);
}
@@ -650,7 +667,8 @@ public class PlayerPrivilegeDTO {
"shear = " + player.getShear() + ", " +
"shoot = " + player.getShoot() + ", " +
"trade = " + player.getTrade() + ", " +
- "vehicle_destroy = " + player.getVehicleDestroy() + " " +
+ "vehicle_destroy = " + player.getVehicleDestroy() + ", " +
+ "vehicle_spawn = " + player.getVehicleSpawn() + " " +
"WHERE id = " + player.getId() + " " +
"RETURNING *;";
List players = query(sql);
diff --git a/src/main/java/cn/lunadeer/dominion/events/PlayerEvents.java b/src/main/java/cn/lunadeer/dominion/events/PlayerEvents.java
index 33ba471..9d7422f 100644
--- a/src/main/java/cn/lunadeer/dominion/events/PlayerEvents.java
+++ b/src/main/java/cn/lunadeer/dominion/events/PlayerEvents.java
@@ -8,10 +8,7 @@ import cn.lunadeer.dominion.utils.Notification;
import io.papermc.paper.event.entity.EntityDyeEvent;
import org.bukkit.Material;
import org.bukkit.block.Block;
-import org.bukkit.entity.Animals;
-import org.bukkit.entity.EntityType;
-import org.bukkit.entity.Monster;
-import org.bukkit.entity.Player;
+import org.bukkit.entity.*;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
@@ -19,6 +16,8 @@ import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.event.block.BlockIgniteEvent;
import org.bukkit.event.block.BlockPlaceEvent;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
+import org.bukkit.event.entity.EntityPlaceEvent;
+import org.bukkit.event.entity.EntitySpawnEvent;
import org.bukkit.event.entity.ProjectileLaunchEvent;
import org.bukkit.event.inventory.InventoryOpenEvent;
import org.bukkit.event.inventory.InventoryType;
@@ -1104,4 +1103,35 @@ public class PlayerEvents implements Listener {
Notification.error(player, "你没有破坏交通工具的权限");
event.setCancelled(true);
}
+
+ @EventHandler(priority = EventPriority.HIGHEST) // vehicle_spawn
+ public void onVehicleSpawn(EntityPlaceEvent event) {
+ Player player = event.getPlayer();
+ if (player == null) {
+ return;
+ }
+ Entity entity = event.getEntity();
+ if (!(entity instanceof Vehicle)) {
+ return;
+ }
+ DominionDTO dom = Cache.instance.getPlayerCurrentDominion(player);
+ if (dom == null) {
+ return;
+ }
+ if (Apis.hasPermission(player, dom)) {
+ return;
+ }
+ PlayerPrivilegeDTO privilege = Cache.instance.getPlayerPrivilege(player, dom);
+ if (privilege != null) {
+ if (privilege.getVehicleSpawn()) {
+ return;
+ }
+ } else {
+ if (dom.getVehicleSpawn()) {
+ return;
+ }
+ }
+ Notification.error(player, "你没有放置交通工具的权限");
+ event.setCancelled(true);
+ }
}
diff --git a/src/main/java/cn/lunadeer/dominion/tuis/DominionFlagInfo.java b/src/main/java/cn/lunadeer/dominion/tuis/DominionFlagInfo.java
index 7c50ed0..880b275 100644
--- a/src/main/java/cn/lunadeer/dominion/tuis/DominionFlagInfo.java
+++ b/src/main/java/cn/lunadeer/dominion/tuis/DominionFlagInfo.java
@@ -146,7 +146,7 @@ public class DominionFlagInfo {
.append(Button.createRed("☐", "/dominion set creeper_explode true " + dominion.getName() + " " + page))
.append("苦力怕/凋零头颅爆炸"));
}
- if (dominion.getComparer()){
+ if (dominion.getComparer()) {
view.add(Line.create()
.append(Button.createGreen("☑", "/dominion set comparer false " + dominion.getName() + " " + page))
.append("比较器交互"));
@@ -281,7 +281,7 @@ public class DominionFlagInfo {
.append(Button.createRed("☐", "/dominion set ignite true " + dominion.getName() + " " + page))
.append("点燃"));
}
- if (dominion.getLever()){
+ if (dominion.getLever()) {
view.add(Line.create()
.append(Button.createGreen("☑", "/dominion set lever false " + dominion.getName() + " " + page))
.append("使用拉杆"));
@@ -311,11 +311,11 @@ public class DominionFlagInfo {
if (dominion.getPlace()) {
view.add(Line.create()
.append(Button.createGreen("☑", "/dominion set place false " + dominion.getName() + " " + page))
- .append("放置"));
+ .append("放置方块"));
} else {
view.add(Line.create()
.append(Button.createRed("☐", "/dominion set place true " + dominion.getName() + " " + page))
- .append("放置"));
+ .append("放置方块"));
}
if (dominion.getPressure()) {
view.add(Line.create()
@@ -335,7 +335,7 @@ public class DominionFlagInfo {
.append(Button.createRed("☐", "/dominion set riding true " + dominion.getName() + " " + page))
.append("骑乘载具"));
}
- if (dominion.getRepeater()){
+ if (dominion.getRepeater()) {
view.add(Line.create()
.append(Button.createGreen("☑", "/dominion set repeater false " + dominion.getName() + " " + page))
.append("中继器交互"));
@@ -389,6 +389,15 @@ public class DominionFlagInfo {
.append(Button.createRed("☐", "/dominion set vehicle_destroy true " + dominion.getName() + " " + page))
.append("破坏载具"));
}
+ if (dominion.getVehicleSpawn()) {
+ view.add(Line.create()
+ .append(Button.createGreen("☑", "/dominion set vehicle_spawn false " + dominion.getName() + " " + page))
+ .append("放置载具"));
+ } else {
+ view.add(Line.create()
+ .append(Button.createRed("☐", "/dominion set vehicle_spawn true " + dominion.getName() + " " + page))
+ .append("放置载具"));
+ }
if (dominion.getWitherSpawn()) {
view.add(Line.create()
.append(Button.createGreen("☑", "/dominion set wither_spawn false " + dominion.getName() + " " + page))
diff --git a/src/main/java/cn/lunadeer/dominion/tuis/PrivilegeInfo.java b/src/main/java/cn/lunadeer/dominion/tuis/PrivilegeInfo.java
index f6be8c5..58fced9 100644
--- a/src/main/java/cn/lunadeer/dominion/tuis/PrivilegeInfo.java
+++ b/src/main/java/cn/lunadeer/dominion/tuis/PrivilegeInfo.java
@@ -307,11 +307,11 @@ public class PrivilegeInfo {
if (privilege.getPlace()) {
view.add(Line.create()
.append(Button.createGreen("☑", "/dominion set_privilege " + playerName + " place false " + dominion.getName() + " " + page))
- .append("放置"));
+ .append("放置方块"));
} else {
view.add(Line.create()
.append(Button.createRed("☐", "/dominion set_privilege " + playerName + " place true " + dominion.getName() + " " + page))
- .append("放置"));
+ .append("放置方块"));
}
if (privilege.getPressure()) {
view.add(Line.create()
@@ -376,6 +376,15 @@ public class PrivilegeInfo {
.append(Button.createRed("☐", "/dominion set_privilege " + playerName + " vehicle_destroy true " + dominion.getName() + " " + page))
.append("破坏载具"));
}
+ if (privilege.getVehicleSpawn()) {
+ view.add(Line.create()
+ .append(Button.createGreen("☑", "/dominion set_privilege " + playerName + " vehicle_spawn false " + dominion.getName() + " " + page))
+ .append("放置载具"));
+ } else {
+ view.add(Line.create()
+ .append(Button.createRed("☐", "/dominion set_privilege " + playerName + " vehicle_spawn true " + dominion.getName() + " " + page))
+ .append("放置载具"));
+ }
view.showOn(player, page);
}
}
diff --git a/src/main/java/cn/lunadeer/dominion/utils/Database.java b/src/main/java/cn/lunadeer/dominion/utils/Database.java
index b81faf6..d34a8b3 100644
--- a/src/main/java/cn/lunadeer/dominion/utils/Database.java
+++ b/src/main/java/cn/lunadeer/dominion/utils/Database.java
@@ -176,5 +176,11 @@ public class Database {
query(sql);
sql = "ALTER TABLE player_privilege ADD COLUMN IF NOT EXISTS hopper BOOLEAN NOT NULL DEFAULT FALSE;";
query(sql);
+
+ // 1.9.0
+ sql = "ALTER TABLE dominion ADD COLUMN IF NOT EXISTS vehicle_spawn BOOLEAN NOT NULL DEFAULT FALSE;";
+ query(sql);
+ sql = "ALTER TABLE player_privilege ADD COLUMN IF NOT EXISTS vehicle_spawn BOOLEAN NOT NULL DEFAULT FALSE;";
+ query(sql);
}
}