diff --git a/pom.xml b/pom.xml
index 98fe73b..d7afc6d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -46,6 +46,12 @@
2.0
provided
+
+ com.github.angeschossen
+ LandsAPI
+ 6.15.0
+ provided
+
commons-codec
commons-codec
@@ -171,7 +177,10 @@
papermc
http://papermc.io/repo/repository/maven-public/
- pl3x-repohttp://repo.pl3x.net/
+
+ jitpack.io
+ https://jitpack.io
+
dynmap-repohttp://repo.mikeprimm.com/
imagejhttp://maven.imagej.net/content/repositories/public/
diff --git a/src/main/java/us/camin/regions/RegionManager.java b/src/main/java/us/camin/regions/RegionManager.java
index fbf2c05..82b6981 100644
--- a/src/main/java/us/camin/regions/RegionManager.java
+++ b/src/main/java/us/camin/regions/RegionManager.java
@@ -37,13 +37,72 @@ import us.camin.regions.events.RegionRemoveEvent;
import us.camin.regions.geometry.RegionSet;
import java.util.logging.Level;
+import me.angeschossen.lands.api.land.Land;
+import me.angeschossen.lands.api.land.Area;
+import me.angeschossen.lands.api.flags.Flags;
+import me.angeschossen.lands.api.integration.LandsIntegration;
+
public class RegionManager {
+ private final LandsIntegration m_lands;
+
+ public enum ValidationResult {
+ VALID,
+ UNKNOWN,
+ NO_PERMISSION,
+ TOO_CLOSE,
+ BAD_NAME,
+ }
+
+ public String validateRegionName(String name, Location location) {
+ Land thisLand = m_lands.getLand(location);
+ if (thisLand == null) {
+ return name;
+ } else {
+ return thisLand.getName();
+ }
+ }
+
+ public ValidationResult validateAnchorPoint(Player player, Location location, String proposedName) {
+ // Require basic permission
+ if (!player.hasPermission("regions.create")) {
+ return ValidationResult.NO_PERMISSION;
+ }
+
+ // Allow admins to create regions in unclaimed land
+ Area thisArea = m_lands.getAreaByLoc(location);
+ if (thisArea == null) {
+ if (proposedName == null) {
+ return ValidationResult.BAD_NAME;
+ } else if (player.hasPermission("regions.create.bypass")) {
+ return ValidationResult.VALID;
+ } else {
+ return ValidationResult.NO_PERMISSION;
+ }
+ }
+
+ // For claimed land, require claiming perms to place post
+ if (!thisArea.hasFlag(player, Flags.LAND_CLAIM, false)) {
+ return ValidationResult.NO_PERMISSION;
+ }
+
+ // Ensure this is the only region post for this region
+ for (Region region : regionsForWorld(location.getWorld())) {
+ Land thatLand = m_lands.getLand(region.interactLocation());
+ if (thatLand != null && thatLand.getId() == thisArea.getLand().getId()) {
+ return ValidationResult.TOO_CLOSE;
+ }
+ }
+
+ return ValidationResult.VALID;
+ }
+
Logger log = Logger.getLogger("Regions.RegionManager");
private Map m_regions;
private Server m_server;
public RegionManager(Plugin plugin, Server server) {
m_server = server;
+ m_lands = new LandsIntegration(plugin);
log.setLevel(Level.ALL);
clear();
}
diff --git a/src/main/java/us/camin/regions/RegionPostItemWatcher.java b/src/main/java/us/camin/regions/RegionPostItemWatcher.java
index 83c8553..d8bbe16 100644
--- a/src/main/java/us/camin/regions/RegionPostItemWatcher.java
+++ b/src/main/java/us/camin/regions/RegionPostItemWatcher.java
@@ -185,28 +185,32 @@ public class RegionPostItemWatcher implements Listener {
ItemStack compassItem = createCompass(nearest);
player.setItemInHand(compassItem);
player.sendMessage("Now tracking " + nearest.name());
- } else if (!event.isCancelled() && isRegionCreateItem(handStack, player) && event.getAction() == Action.RIGHT_CLICK_BLOCK && !event.getClickedBlock().getType().isInteractable() && player.hasPermission("regions.create")) {
+ } else if (!event.isCancelled() && isRegionCreateItem(handStack, player) && event.getAction() == Action.RIGHT_CLICK_BLOCK && !event.getClickedBlock().getType().isInteractable()) {
event.setUseItemInHand(Event.Result.DENY);
event.setCancelled(true);
- if (meta.getDisplayName().equals("") || meta.getDisplayName().equals("Region Post Anchor")) {
- player.sendMessage("You must first give this item a name!");
+ String postName = meta.getDisplayName();
+ if (postName.equals("") || postName.equals("Region Post Anchor")) {
+ postName = null;
+ }
+ postName = m_manager.validateRegionName(postName, event.getClickedBlock().getLocation());
+ RegionManager.ValidationResult result = m_manager.validateAnchorPoint(player, event.getClickedBlock().getLocation(), postName);
+ if (result == RegionManager.ValidationResult.VALID) {
+ Region r = new Region(postName, event.getClickedBlock().getRelative(event.getBlockFace()).getLocation());
+ m_plugin.getServer().getScheduler().runTask(m_plugin, () -> {
+ RegionPostBuilder builder = new RegionPostBuilder(r, m_plugin);
+ builder.build();
+ });
+ handStack.setAmount(handStack.getAmount()-1);
+ player.setItemInHand(handStack);
+ m_plugin.regionManager().addRegion(r);
+ m_plugin.saveRegions();
+ player.sendMessage("You established the region "+r.coloredName());
+ } else if (result == RegionManager.ValidationResult.TOO_CLOSE) {
+ player.sendMessage("You are too close to another region post!");
+ } else if (result == RegionManager.ValidationResult.BAD_NAME) {
+ player.sendMessage("You must first give this item a better name.");
} else {
- Region nearest = m_manager.nearestRegion(event.getClickedBlock().getLocation());
- if (nearest != null && event.getClickedBlock().getLocation().distance(nearest.interactLocation()) < 500) {
- int distance = 500 - (int)event.getClickedBlock().getLocation().distance(nearest.interactLocation());
- player.sendMessage("You are " + distance + " blocks too close to the region post for " + nearest.name() + ".");
- } else {
- Region r = new Region(meta.getDisplayName(), event.getClickedBlock().getRelative(event.getBlockFace()).getLocation());
- m_plugin.getServer().getScheduler().runTask(m_plugin, () -> {
- RegionPostBuilder builder = new RegionPostBuilder(r, m_plugin);
- builder.build();
- });
- handStack.setAmount(handStack.getAmount()-1);
- player.setItemInHand(handStack);
- m_plugin.regionManager().addRegion(r);
- m_plugin.saveRegions();
- player.sendMessage("You established the region "+r.coloredName());
- }
+ player.sendMessage("You aren't allowed to create a region here.");
}
}
}
diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml
index 58a7879..97c4c77 100644
--- a/src/main/resources/plugin.yml
+++ b/src/main/resources/plugin.yml
@@ -3,8 +3,8 @@ main: us.camin.regions.Plugin
author: Torrie Fischer
website: http://hackerbots.net/
version: ${version}
-api-version: 1.16
-softdepend: [dynmap, ProtocolLib, Pl3xMap]
+api-version: 1.19
+softdepend: [dynmap, ProtocolLib, Lands]
commands:
regions:
description: "List available regions."
@@ -21,6 +21,7 @@ permissions:
description: Allows use of all regions permissions
children:
regions.create: true
+ regions.create.bypass: true
regions.commands.*: true
regions.regen.*: true
regions.bypass.*: true
@@ -37,6 +38,9 @@ permissions:
regions.create:
default: true
description: Create a region with a region item
+ regions.create.bypass:
+ default: op
+ description: Bypass anything preventing creation of a new region
regions.setbanner:
default: true
description: Allows setting a region post banner