diff --git a/pom.xml b/pom.xml index cfed251..dfe28f3 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ cn.lunadeer Dominion - 1.0 + 1.0-beta jar Dominion diff --git a/src/main/java/cn/lunadeer/dominion/BlueMapConnect.java b/src/main/java/cn/lunadeer/dominion/BlueMapConnect.java index d0cf04e..02b2ae3 100644 --- a/src/main/java/cn/lunadeer/dominion/BlueMapConnect.java +++ b/src/main/java/cn/lunadeer/dominion/BlueMapConnect.java @@ -1,6 +1,7 @@ package cn.lunadeer.dominion; import cn.lunadeer.dominion.dtos.DominionDTO; +import cn.lunadeer.dominion.utils.XLogger; import com.flowpowered.math.vector.Vector2d; import de.bluecolored.bluemap.api.BlueMapAPI; import de.bluecolored.bluemap.api.BlueMapMap; @@ -19,46 +20,52 @@ public class BlueMapConnect { if (!Dominion.config.getBlueMap()) { return; } - BlueMapAPI.getInstance().ifPresent(api -> { - for (Map.Entry> world_dominions : Cache.instance.getWorldDominions().entrySet()) { - api.getWorld(world_dominions.getKey()).ifPresent(world -> { - MarkerSet markerSet = MarkerSet.builder() - .label("Dominion") - .build(); - - for (DominionDTO dominion : world_dominions.getValue()) { - Collection vectors = new ArrayList<>(); - vectors.add(new Vector2d(dominion.getX1(), dominion.getZ1())); - vectors.add(new Vector2d(dominion.getX2(), dominion.getZ1())); - vectors.add(new Vector2d(dominion.getX2(), dominion.getZ2())); - vectors.add(new Vector2d(dominion.getX1(), dominion.getZ2())); - Shape shape = new Shape(vectors); - double x = vectors.iterator().next().getX(); - double z = vectors.iterator().next().getY(); - double y = dominion.getY1(); - - Color line = new Color(0, 191, 255, 0.8F); - Color fill = new Color(0, 191, 255, 0.2F); - if (dominion.getParentDomId() != -1) { // for children dominion - line = new Color(240, 230, 140, 0.8F); - fill = new Color(240, 230, 140, 0.2F); - } - ExtrudeMarker marker = ExtrudeMarker.builder() - .label(dominion.getName()) - .position(x, y, z) - .shape(shape, dominion.getY1(), dominion.getY2()) - .lineColor(line) - .fillColor(fill) + try { + BlueMapAPI.getInstance().ifPresent(api -> { + for (Map.Entry> world_dominions : Cache.instance.getWorldDominions().entrySet()) { + api.getWorld(world_dominions.getKey()).ifPresent(world -> { + MarkerSet markerSet = MarkerSet.builder() + .label("Dominion") .build(); - markerSet.getMarkers() - .put(dominion.getName(), marker); - } - for (BlueMapMap map : world.getMaps()) { - map.getMarkerSets().put(world_dominions.getKey() + "-" + markerSet.getLabel(), markerSet); - } - }); - } - }); + for (Integer id : world_dominions.getValue()) { + DominionDTO dominion = Cache.instance.getDominion(id); + Collection vectors = new ArrayList<>(); + vectors.add(new Vector2d(dominion.getX1(), dominion.getZ1())); + vectors.add(new Vector2d(dominion.getX2(), dominion.getZ1())); + vectors.add(new Vector2d(dominion.getX2(), dominion.getZ2())); + vectors.add(new Vector2d(dominion.getX1(), dominion.getZ2())); + Shape shape = new Shape(vectors); + double x = vectors.iterator().next().getX(); + double z = vectors.iterator().next().getY(); + double y = dominion.getY1(); + + Color line = new Color(0, 191, 255, 0.8F); + Color fill = new Color(0, 191, 255, 0.2F); + if (dominion.getParentDomId() != -1) { // for children dominion + line = new Color(240, 230, 140, 0.8F); + fill = new Color(240, 230, 140, 0.2F); + } + ExtrudeMarker marker = ExtrudeMarker.builder() + .label(dominion.getName()) + .position(x, y, z) + .shape(shape, dominion.getY1(), dominion.getY2()) + .lineColor(line) + .fillColor(fill) + .build(); + markerSet.getMarkers() + .put(dominion.getName(), marker); + } + + for (BlueMapMap map : world.getMaps()) { + map.getMarkerSets().put(world_dominions.getKey() + "-" + markerSet.getLabel(), markerSet); + } + }); + } + }); + } catch (NoClassDefFoundError e) { + XLogger.warn("无法连接 BlueMap 插件,如果你不打算使用卫星地图渲染建议前往配置文件关闭此功能以避免下方的报错。"); + XLogger.err(e.getMessage()); + } } } diff --git a/src/main/java/cn/lunadeer/dominion/Cache.java b/src/main/java/cn/lunadeer/dominion/Cache.java index a893c36..f0baaa8 100644 --- a/src/main/java/cn/lunadeer/dominion/Cache.java +++ b/src/main/java/cn/lunadeer/dominion/Cache.java @@ -22,13 +22,15 @@ public class Cache { * 从数据库加载所有领地 */ public void loadDominions() { + id_dominions = new HashMap<>(); world_dominions = new HashMap<>(); List dominions = DominionDTO.selectAll(); for (DominionDTO d : dominions) { + id_dominions.put(d.getId(), d); if (!world_dominions.containsKey(d.getWorld())) { world_dominions.put(d.getWorld(), new ArrayList<>()); } - world_dominions.get(d.getWorld()).add(d); + world_dominions.get(d.getWorld()).add(d.getId()); } BlueMapConnect.render(); } @@ -37,7 +39,6 @@ public class Cache { * 从数据库加载所有玩家特权 */ public void loadPlayerPrivileges() { - player_current_dominion = new HashMap<>(); List all_privileges = PlayerPrivilegeDTO.selectAll(); if (all_privileges == null) { XLogger.err("加载玩家特权失败"); @@ -63,13 +64,12 @@ public class Cache { * @return 玩家当前所在领地 */ public DominionDTO getPlayerCurrentDominion(Player player) { - DominionDTO dominion = player_current_dominion.get(player.getUniqueId()); + Integer dominion_id = player_current_dominion.get(player.getUniqueId()); + DominionDTO dominion = id_dominions.get(dominion_id); if (dominion != null) { if (!isInDominion(dominion, player)) { // glow - if (player.isGlowing()) { - player.setGlowing(false); - } + player.setGlowing(false); Notification.info(player, "您已离开领地:" + dominion.getName()); Notification.info(player, dominion.getLeaveMessage()); player_current_dominion.put(player.getUniqueId(), null); @@ -78,10 +78,11 @@ public class Cache { } if (dominion == null) { String world = player.getWorld().getName(); - List dominions = world_dominions.get(world); - if (dominions == null) return null; + List dominions_id = world_dominions.get(world); + if (dominions_id == null) return null; List in_dominions = new ArrayList<>(); - for (DominionDTO d : dominions) { + for (Integer id : dominions_id) { + DominionDTO d = id_dominions.get(id); if (isInDominion(d, player)) { in_dominions.add(d); } @@ -89,20 +90,16 @@ public class Cache { if (in_dominions.size() == 0) return null; in_dominions.sort(Comparator.comparingInt(DominionDTO::getId)); dominion = in_dominions.get(in_dominions.size() - 1); - player_current_dominion.put(player.getUniqueId(), dominion); + player_current_dominion.put(player.getUniqueId(), dominion.getId()); // glow PlayerPrivilegeDTO privilege = getPlayerPrivilege(player, dominion); if (privilege != null) { if (privilege.getGlow()) { - if (player.isGlowing()) { - player.setGlowing(true); - } + player.setGlowing(true); } } else { if (dominion.getGlow()) { - if (player.isGlowing()) { - player.setGlowing(true); - } + player.setGlowing(true); } } Notification.info(player, "您正在进入领地:" + dominion.getName()); @@ -113,10 +110,11 @@ public class Cache { public DominionDTO getDominion(Location loc) { String world = loc.getWorld().getName(); - List dominions = world_dominions.get(world); - if (dominions == null) return null; + List dominions_id = world_dominions.get(world); + if (dominions_id == null) return null; List in_dominions = new ArrayList<>(); - for (DominionDTO d : dominions) { + for (Integer id : dominions_id) { + DominionDTO d = id_dominions.get(id); if (isInDominion(d, loc.getX(), loc.getY(), loc.getZ())) { in_dominions.add(d); } @@ -156,12 +154,17 @@ public class Cache { z >= dominion.getZ1() && z <= dominion.getZ2(); } - public Map> getWorldDominions() { + public Map> getWorldDominions() { return world_dominions; } + public DominionDTO getDominion(Integer id) { + return id_dominions.get(id); + } + public static Cache instance; - private Map> world_dominions; // 所有领地 + private Map id_dominions; + private Map> world_dominions; // 所有领地 private Map> player_uuid_to_privilege; // 玩家所有的特权 - private Map player_current_dominion; // 玩家当前所在领地 + private Map player_current_dominion; // 玩家当前所在领地 } diff --git a/src/main/java/cn/lunadeer/dominion/controllers/FlagsController.java b/src/main/java/cn/lunadeer/dominion/controllers/FlagsController.java index 3ab5959..61c1a66 100644 --- a/src/main/java/cn/lunadeer/dominion/controllers/FlagsController.java +++ b/src/main/java/cn/lunadeer/dominion/controllers/FlagsController.java @@ -64,7 +64,7 @@ public class FlagsController { case "hook": return dominion.setHook(value); case "ignite": return dominion.setIgnite(value); case "lever": return dominion.setLever(value); - case "mob_killing": return dominion.setMonsterKilling(value); + case "monster_killing": return dominion.setMonsterKilling(value); case "move": return dominion.setMove(value); case "place": return dominion.setPlace(value); case "pressure": return dominion.setPressure(value); diff --git a/src/main/java/cn/lunadeer/dominion/controllers/PrivilegeController.java b/src/main/java/cn/lunadeer/dominion/controllers/PrivilegeController.java index a52043b..948d79b 100644 --- a/src/main/java/cn/lunadeer/dominion/controllers/PrivilegeController.java +++ b/src/main/java/cn/lunadeer/dominion/controllers/PrivilegeController.java @@ -161,7 +161,7 @@ public class PrivilegeController { case "ignite": privilege.setIgnite(value); break; - case "mob_killing": + case "monster_killing": privilege.setMonsterKilling(value); break; case "move": diff --git a/src/main/java/cn/lunadeer/dominion/events/Apis.java b/src/main/java/cn/lunadeer/dominion/events/Apis.java index e3d2ec8..11d9590 100644 --- a/src/main/java/cn/lunadeer/dominion/events/Apis.java +++ b/src/main/java/cn/lunadeer/dominion/events/Apis.java @@ -7,6 +7,9 @@ import org.bukkit.entity.Player; public class Apis { public static boolean hasPermission(Player player, DominionDTO dom) { + if (player.isOp()) { + return true; + } if (dom == null) { return true; } diff --git a/src/main/java/cn/lunadeer/dominion/events/PlayerEvents.java b/src/main/java/cn/lunadeer/dominion/events/PlayerEvents.java index 7225788..f05fe78 100644 --- a/src/main/java/cn/lunadeer/dominion/events/PlayerEvents.java +++ b/src/main/java/cn/lunadeer/dominion/events/PlayerEvents.java @@ -7,11 +7,13 @@ import cn.lunadeer.dominion.dtos.PlayerPrivilegeDTO; 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.*; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.block.BlockDropItemEvent; import org.bukkit.event.block.BlockIgniteEvent; import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.event.entity.EntityDamageByEntityEvent; @@ -19,6 +21,7 @@ import org.bukkit.event.entity.ProjectileLaunchEvent; import org.bukkit.event.inventory.InventoryOpenEvent; import org.bukkit.event.inventory.InventoryType; import org.bukkit.event.player.*; +import org.bukkit.event.vehicle.VehicleDestroyEvent; import org.spigotmc.event.entity.EntityMountEvent; public class PlayerEvents implements Listener { @@ -348,7 +351,7 @@ public class PlayerEvents implements Listener { @EventHandler(priority = EventPriority.HIGHEST) // craft public void onCraft(InventoryOpenEvent event) { - if (event.getInventory().getType() != InventoryType.CRAFTING) { + if (event.getInventory().getType() != InventoryType.WORKBENCH) { return; } if (!(event.getPlayer() instanceof Player)) { @@ -474,11 +477,10 @@ public class PlayerEvents implements Listener { @EventHandler(priority = EventPriority.HIGHEST) // dye public void dyeEvent(EntityDyeEvent event) { - Entity entity = event.getEntity(); - if (!(entity instanceof Player)) { + Player player = event.getPlayer(); + if (player == null) { return; } - Player player = (Player) entity; DominionDTO dom = Cache.instance.getPlayerCurrentDominion(player); if (dom == null) { return; @@ -618,7 +620,26 @@ public class PlayerEvents implements Listener { } @EventHandler(priority = EventPriority.HIGHEST) // harvest - public void onHarvest(PlayerHarvestBlockEvent event) { + public void onHarvest(BlockBreakEvent event) { + Block block = event.getBlock(); + if (block.getType() != Material.COCOA && + block.getType() != Material.WHEAT && + block.getType() != Material.CARROTS && + block.getType() != Material.POTATOES && + block.getType() != Material.BEETROOTS && + block.getType() != Material.NETHER_WART && + block.getType() != Material.SWEET_BERRY_BUSH && + block.getType() != Material.MELON && + block.getType() != Material.PUMPKIN && + block.getType() != Material.SUGAR_CANE && + block.getType() != Material.BAMBOO && + block.getType() != Material.CACTUS && + block.getType() != Material.CHORUS_PLANT && + block.getType() != Material.CHORUS_FLOWER && + block.getType() != Material.KELP && + block.getType() != Material.KELP_PLANT) { + return; + } Player player = event.getPlayer(); DominionDTO dom = Cache.instance.getPlayerCurrentDominion(player); if (dom == null) { @@ -720,6 +741,7 @@ public class PlayerEvents implements Listener { } } Notification.error(player, "你没有点火的权限"); + event.setCancelled(true); } @EventHandler(priority = EventPriority.HIGHEST) // lever @@ -785,7 +807,7 @@ public class PlayerEvents implements Listener { } @EventHandler(priority = EventPriority.HIGHEST) // move - public void onPlayerMove(PlayerMoveEvent event){ + public void onPlayerMove(PlayerMoveEvent event) { Player player = event.getPlayer(); DominionDTO dom = Cache.instance.getPlayerCurrentDominion(player); if (dom == null) { @@ -809,7 +831,7 @@ public class PlayerEvents implements Listener { } @EventHandler(priority = EventPriority.HIGHEST) // place - public void onPlace(BlockPlaceEvent event){ + public void onPlace(BlockPlaceEvent event) { Player player = event.getPlayer(); DominionDTO dom = Cache.instance.getPlayerCurrentDominion(player); if (dom == null) { @@ -829,6 +851,7 @@ public class PlayerEvents implements Listener { } } Notification.error(player, "你没有放置方块的权限"); + event.setCancelled(true); } @EventHandler(priority = EventPriority.HIGHEST) // pressure @@ -955,6 +978,7 @@ public class PlayerEvents implements Listener { } } Notification.error(player, "你没有剪羊毛的权限"); + event.setCancelled(true); } @EventHandler(priority = EventPriority.HIGHEST) // shoot @@ -962,7 +986,9 @@ public class PlayerEvents implements Listener { if (!(event.getEntity().getShooter() instanceof Player)) { return; } - if (event.getEntity().getType() != EntityType.ARROW && event.getEntity().getType() != EntityType.SNOWBALL) { + if (event.getEntity().getType() != EntityType.ARROW && + event.getEntity().getType() != EntityType.SNOWBALL && + event.getEntity().getType() != EntityType.TRIDENT) { return; } Player player = (Player) event.getEntity().getShooter(); @@ -983,7 +1009,7 @@ public class PlayerEvents implements Listener { return; } } - Notification.error(player, "你没有发射弓箭或雪球的权限"); + Notification.error(player, "你没有发射弓箭、三叉戟或雪球的权限"); event.setCancelled(true); } @@ -1018,14 +1044,11 @@ public class PlayerEvents implements Listener { } @EventHandler(priority = EventPriority.HIGHEST) // vehicle_destroy - public void onVehicleDestroy(EntityDamageByEntityEvent event) { - if (!(event.getDamager() instanceof Player)) { + public void onVehicleDestroy(VehicleDestroyEvent event) { + if (!(event.getAttacker() instanceof Player)) { return; } - if (!(event.getEntity() instanceof Vehicle)) { - return; - } - Player player = (Player) event.getDamager(); + Player player = (Player) event.getAttacker(); DominionDTO dom = Cache.instance.getPlayerCurrentDominion(player); if (dom == null) { return; diff --git a/src/main/java/cn/lunadeer/dominion/tuis/DominionFlagInfo.java b/src/main/java/cn/lunadeer/dominion/tuis/DominionFlagInfo.java index 923cbae..b437757 100644 --- a/src/main/java/cn/lunadeer/dominion/tuis/DominionFlagInfo.java +++ b/src/main/java/cn/lunadeer/dominion/tuis/DominionFlagInfo.java @@ -140,11 +140,11 @@ public class DominionFlagInfo { if (dominion.getCreeperExplode()) { view.add(Line.create() .append(Button.createGreen("☑", "/dominion set creeper_explode false " + dominion.getName() + " " + page)) - .append("苦力怕爆炸")); + .append("苦力怕/凋零头颅爆炸")); } else { view.add(Line.create() .append(Button.createRed("☐", "/dominion set creeper_explode true " + dominion.getName() + " " + page)) - .append("苦力怕爆炸")); + .append("苦力怕/凋零头颅爆炸")); } if (dominion.getComparer()){ view.add(Line.create() @@ -347,11 +347,11 @@ public class DominionFlagInfo { if (dominion.getShoot()) { view.add(Line.create() .append(Button.createGreen("☑", "/dominion set shoot false " + dominion.getName() + " " + page)) - .append("射箭/雪球")); + .append("射箭/雪球/三叉戟")); } else { view.add(Line.create() .append(Button.createRed("☐", "/dominion set shoot true " + dominion.getName() + " " + page)) - .append("射箭/雪球")); + .append("射箭/雪球/三叉戟")); } if (dominion.getTntExplode()) { view.add(Line.create() diff --git a/src/main/java/cn/lunadeer/dominion/tuis/PrivilegeInfo.java b/src/main/java/cn/lunadeer/dominion/tuis/PrivilegeInfo.java index df2d6ba..b24fa74 100644 --- a/src/main/java/cn/lunadeer/dominion/tuis/PrivilegeInfo.java +++ b/src/main/java/cn/lunadeer/dominion/tuis/PrivilegeInfo.java @@ -335,11 +335,11 @@ public class PrivilegeInfo { if (privilege.getShoot()) { view.add(Line.create() .append(Button.createGreen("☑", "/dominion set_privilege " + playerName + " shoot false " + dominion.getName() + " " + page)) - .append("射箭/雪球")); + .append("射箭/雪球/三叉戟")); } else { view.add(Line.create() .append(Button.createRed("☐", "/dominion set_privilege " + playerName + " shoot true " + dominion.getName() + " " + page)) - .append("射箭/雪球")); + .append("射箭/雪球/三叉戟")); } if (privilege.getTrade()) { view.add(Line.create()