From ae7fcbb8aa5c5de02b81b8cc75a3f20f7d8c9a6c Mon Sep 17 00:00:00 2001 From: Eric Date: Fri, 3 Aug 2018 17:26:23 +0200 Subject: [PATCH] Add basic region getters Only supports names and flags for now. --- .../implementation/AbstractRegion.java | 18 +++++++ .../IWorldGuardImplementation.java | 32 ++++++++++++ .../v6/WorldGuardImplementation.java | 51 ++++++++++++++++++ .../v7/WorldGuardImplementation.java | 52 +++++++++++++++++++ 4 files changed, 153 insertions(+) create mode 100644 implementation/interface/src/main/java/org/codemc/worldguardwrapper/implementation/AbstractRegion.java diff --git a/implementation/interface/src/main/java/org/codemc/worldguardwrapper/implementation/AbstractRegion.java b/implementation/interface/src/main/java/org/codemc/worldguardwrapper/implementation/AbstractRegion.java new file mode 100644 index 0000000..92c1194 --- /dev/null +++ b/implementation/interface/src/main/java/org/codemc/worldguardwrapper/implementation/AbstractRegion.java @@ -0,0 +1,18 @@ +package org.codemc.worldguardwrapper.implementation; + +import java.util.Map; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public abstract class AbstractRegion { + + private String id; + + public abstract Object getFlag(String name); + + public abstract Map getFlags(); + +} \ No newline at end of file diff --git a/implementation/interface/src/main/java/org/codemc/worldguardwrapper/implementation/IWorldGuardImplementation.java b/implementation/interface/src/main/java/org/codemc/worldguardwrapper/implementation/IWorldGuardImplementation.java index 17bacf2..c1fbb21 100644 --- a/implementation/interface/src/main/java/org/codemc/worldguardwrapper/implementation/IWorldGuardImplementation.java +++ b/implementation/interface/src/main/java/org/codemc/worldguardwrapper/implementation/IWorldGuardImplementation.java @@ -1,8 +1,11 @@ package org.codemc.worldguardwrapper.implementation; +import java.util.Map; import java.util.Optional; +import java.util.Set; import org.bukkit.Location; +import org.bukkit.World; import org.bukkit.entity.Player; import org.bukkit.plugin.java.JavaPlugin; @@ -73,4 +76,33 @@ public interface IWorldGuardImplementation { * @return Whether the flag has been registered */ boolean registerFlag(@NonNull AbstractFlag flag); + + /** + * Get a region by its ID. + * + * @param world The world + * @param id ID of the region + * @return The region + */ + Optional getRegion(World world, String id); + + /** + * Get an unmodifiable map of regions containing the state of the + * index at the time of call. + * + *

This call is relatively heavy (and may block other threads), + * so refrain from calling it frequently.

+ * + * @param world The world + * @return A map of regions + */ + Map getRegions(World world); + + /** + * Get a set of regions at the given location. + * + * @param location The location + * @return A set of regions + */ + Set getRegions(Location location); } diff --git a/implementation/v6/src/main/java/org/codemc/worldguardwrapper/implementation/v6/WorldGuardImplementation.java b/implementation/v6/src/main/java/org/codemc/worldguardwrapper/implementation/v6/WorldGuardImplementation.java index 072bf8e..a2fde66 100644 --- a/implementation/v6/src/main/java/org/codemc/worldguardwrapper/implementation/v6/WorldGuardImplementation.java +++ b/implementation/v6/src/main/java/org/codemc/worldguardwrapper/implementation/v6/WorldGuardImplementation.java @@ -1,6 +1,10 @@ package org.codemc.worldguardwrapper.implementation.v6; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; import java.util.Optional; +import java.util.Set; import com.sk89q.worldguard.LocalPlayer; import com.sk89q.worldguard.bukkit.WorldGuardPlugin; @@ -12,12 +16,14 @@ import com.sk89q.worldguard.protection.flags.StateFlag; import com.sk89q.worldguard.protection.flags.registry.FlagConflictException; import com.sk89q.worldguard.protection.flags.registry.FlagRegistry; import com.sk89q.worldguard.protection.managers.RegionManager; +import com.sk89q.worldguard.protection.regions.ProtectedRegion; import org.bukkit.Location; import org.bukkit.World; import org.bukkit.entity.Player; import org.bukkit.plugin.java.JavaPlugin; import org.codemc.worldguardwrapper.implementation.AbstractFlag; +import org.codemc.worldguardwrapper.implementation.AbstractRegion; import org.codemc.worldguardwrapper.implementation.AbstractWorldGuardImplementation; import lombok.NonNull; @@ -52,6 +58,22 @@ public class WorldGuardImplementation extends AbstractWorldGuardImplementation { return getApplicableRegions(location).map(applicableRegions -> applicableRegions.queryState(wrapPlayer(player).orElse(null), stateFlags)); } + private AbstractRegion toRegion(ProtectedRegion region) { + return new AbstractRegion(region.getId()) { + @Override + public Map getFlags() { + Map map = new HashMap<>(); + region.getFlags().forEach((flag, value) -> map.put(flag.getName(), value)); + return map; + } + + @Override + public Object getFlag(String name) { + return region.getFlag(flagRegistry.get(name)); + } + }; + } + @Override public JavaPlugin getWorldGuardPlugin() { return WorldGuardPlugin.inst(); @@ -123,4 +145,33 @@ public class WorldGuardImplementation extends AbstractWorldGuardImplementation { } return false; } + + @Override + public Optional getRegion(World world, String id) { + return getWorldManager(world).map(regionManager -> toRegion(regionManager.getRegion(id))); + } + + @Override + public Map getRegions(World world) { + RegionManager regionManager = plugin.getRegionManager(world); + Map regions = regionManager.getRegions(); + + Map map = new HashMap<>(); + regions.forEach((name, region) -> map.put(name, toRegion(region))); + + return map; + } + + @Override + public Set getRegions(Location location) { + ApplicableRegionSet regionSet = getApplicableRegions(location).orElse(null); + Set set = new HashSet<>(); + + if (regionSet == null) { + return set; + } + + regionSet.forEach(region -> set.add(toRegion(region))); + return set; + } } diff --git a/implementation/v7/src/main/java/org/codemc/worldguardwrapper/implementation/v7/WorldGuardImplementation.java b/implementation/v7/src/main/java/org/codemc/worldguardwrapper/implementation/v7/WorldGuardImplementation.java index 227418c..b0e8029 100644 --- a/implementation/v7/src/main/java/org/codemc/worldguardwrapper/implementation/v7/WorldGuardImplementation.java +++ b/implementation/v7/src/main/java/org/codemc/worldguardwrapper/implementation/v7/WorldGuardImplementation.java @@ -1,8 +1,13 @@ package org.codemc.worldguardwrapper.implementation.v7; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; import java.util.Optional; +import java.util.Set; import com.sk89q.worldedit.bukkit.BukkitAdapter; +import com.sk89q.worldedit.bukkit.BukkitWorld; import com.sk89q.worldguard.LocalPlayer; import com.sk89q.worldguard.WorldGuard; import com.sk89q.worldguard.bukkit.WorldGuardPlugin; @@ -15,6 +20,7 @@ import com.sk89q.worldguard.protection.flags.StateFlag; import com.sk89q.worldguard.protection.flags.registry.FlagConflictException; import com.sk89q.worldguard.protection.flags.registry.FlagRegistry; import com.sk89q.worldguard.protection.managers.RegionManager; +import com.sk89q.worldguard.protection.regions.ProtectedRegion; import com.sk89q.worldguard.protection.regions.RegionContainer; import org.bukkit.Bukkit; @@ -23,6 +29,7 @@ import org.bukkit.World; import org.bukkit.entity.Player; import org.bukkit.plugin.java.JavaPlugin; import org.codemc.worldguardwrapper.implementation.AbstractFlag; +import org.codemc.worldguardwrapper.implementation.AbstractRegion; import org.codemc.worldguardwrapper.implementation.AbstractWorldGuardImplementation; import lombok.NonNull; @@ -65,6 +72,22 @@ public class WorldGuardImplementation extends AbstractWorldGuardImplementation { return getApplicableRegions(location).map(applicableRegions -> applicableRegions.queryState(wrapPlayer(player).orElse(null), stateFlags)); } + private AbstractRegion toRegion(ProtectedRegion region) { + return new AbstractRegion(region.getId()) { + @Override + public Map getFlags() { + Map map = new HashMap<>(); + region.getFlags().forEach((flag, value) -> map.put(flag.getName(), value)); + return map; + } + + @Override + public Object getFlag(String name) { + return region.getFlag(flagRegistry.get(name)); + } + }; + } + @Override public JavaPlugin getWorldGuardPlugin() { return WorldGuardPlugin.inst(); @@ -136,4 +159,33 @@ public class WorldGuardImplementation extends AbstractWorldGuardImplementation { } return false; } + + @Override + public Optional getRegion(World world, String id) { + return getWorldManager(world).map(regionManager -> toRegion(regionManager.getRegion(id))); + } + + @Override + public Map getRegions(World world) { + RegionManager regionManager = container.get(new BukkitWorld(world)); + Map regions = regionManager.getRegions(); + + Map map = new HashMap<>(); + regions.forEach((name, region) -> map.put(name, toRegion(region))); + + return map; + } + + @Override + public Set getRegions(Location location) { + ApplicableRegionSet regionSet = getApplicableRegions(location).orElse(null); + Set set = new HashSet<>(); + + if (regionSet == null) { + return set; + } + + regionSet.forEach(region -> set.add(toRegion(region))); + return set; + } }