From e45c3530309e7a96f18eb5e280606b67c41d3a71 Mon Sep 17 00:00:00 2001 From: Thijs Wiefferink Date: Tue, 1 Jan 2019 19:30:16 +0100 Subject: [PATCH] Fix detecting region by location when using WorldEdit 7 beta-2 or later - The WorldEdit 7 beta-2 handler was inheriting a function from the handler of older version that uses the old Vector class - Fixes #466 - Fixes #467 --- .../interfaces/WorldGuardInterface.java | 3 +- .../handlers/WorldGuardHandler7_beta_1.java | 21 ----- .../handlers/WorldGuardHandler7_beta_2.java | 88 ++++++++++++++++++- 3 files changed, 89 insertions(+), 23 deletions(-) diff --git a/areashop-interface/src/main/java/me/wiefferink/areashop/interfaces/WorldGuardInterface.java b/areashop-interface/src/main/java/me/wiefferink/areashop/interfaces/WorldGuardInterface.java index cde6972..305efc0 100644 --- a/areashop-interface/src/main/java/me/wiefferink/areashop/interfaces/WorldGuardInterface.java +++ b/areashop-interface/src/main/java/me/wiefferink/areashop/interfaces/WorldGuardInterface.java @@ -81,7 +81,7 @@ public abstract class WorldGuardInterface { */ public abstract RegionAccessSet getOwners(ProtectedRegion region); - // New flag system was introcuded in version 6.1.3, requiring different flag parsing + // New flag system was introduced in version 6.1.3, requiring different flag parsing /** * Get a flag from the name of a flag. * @param flagName The name of the flag to get @@ -108,6 +108,7 @@ public abstract class WorldGuardInterface { */ public abstract RegionGroup parseFlagGroupInput(RegionGroupFlag flag, String input) throws InvalidFlagFormat; + // WorldEdit Vector -> BlockVector3 refactor in WorldEdit 7 beta-2 /** * Get the minimum point of a region. * @param region The region to get it for diff --git a/areashop-worldguard-7_beta_1/src/main/java/me/wiefferink/areashop/handlers/WorldGuardHandler7_beta_1.java b/areashop-worldguard-7_beta_1/src/main/java/me/wiefferink/areashop/handlers/WorldGuardHandler7_beta_1.java index 7edd4bf..70bc1f1 100644 --- a/areashop-worldguard-7_beta_1/src/main/java/me/wiefferink/areashop/handlers/WorldGuardHandler7_beta_1.java +++ b/areashop-worldguard-7_beta_1/src/main/java/me/wiefferink/areashop/handlers/WorldGuardHandler7_beta_1.java @@ -2,12 +2,6 @@ package me.wiefferink.areashop.handlers; import com.sk89q.worldedit.bukkit.BukkitAdapter; import com.sk89q.worldguard.WorldGuard; -import com.sk89q.worldguard.protection.flags.Flag; -import com.sk89q.worldguard.protection.flags.FlagContext; -import com.sk89q.worldguard.protection.flags.Flags; -import com.sk89q.worldguard.protection.flags.InvalidFlagFormat; -import com.sk89q.worldguard.protection.flags.RegionGroup; -import com.sk89q.worldguard.protection.flags.RegionGroupFlag; import com.sk89q.worldguard.protection.managers.RegionManager; import me.wiefferink.areashop.interfaces.AreaShopInterface; import org.bukkit.World; @@ -22,19 +16,4 @@ public class WorldGuardHandler7_beta_1 extends WorldGuardHandler6_1_3 { public RegionManager getRegionManager(World world) { return WorldGuard.getInstance().getPlatform().getRegionContainer().get(BukkitAdapter.adapt(world)); } - - @Override - public Flag fuzzyMatchFlag(String flagName) { - return Flags.fuzzyMatchFlag(WorldGuard.getInstance().getFlagRegistry(), flagName); - } - - @Override - public V parseFlagInput(Flag flag, String input) throws InvalidFlagFormat { - return flag.parseInput(FlagContext.create().setInput(input).build()); - } - - @Override - public RegionGroup parseFlagGroupInput(RegionGroupFlag flag, String input) throws InvalidFlagFormat { - return flag.parseInput(FlagContext.create().setInput(input).build()); - } } diff --git a/areashop-worldguard-7_beta_2/src/main/java/me/wiefferink/areashop/handlers/WorldGuardHandler7_beta_2.java b/areashop-worldguard-7_beta_2/src/main/java/me/wiefferink/areashop/handlers/WorldGuardHandler7_beta_2.java index d739e7b..189ba28 100644 --- a/areashop-worldguard-7_beta_2/src/main/java/me/wiefferink/areashop/handlers/WorldGuardHandler7_beta_2.java +++ b/areashop-worldguard-7_beta_2/src/main/java/me/wiefferink/areashop/handlers/WorldGuardHandler7_beta_2.java @@ -4,6 +4,7 @@ import com.sk89q.worldedit.bukkit.BukkitAdapter; import com.sk89q.worldedit.math.BlockVector2; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldguard.WorldGuard; +import com.sk89q.worldguard.domains.DefaultDomain; import com.sk89q.worldguard.protection.flags.Flag; import com.sk89q.worldguard.protection.flags.FlagContext; import com.sk89q.worldguard.protection.flags.Flags; @@ -14,13 +15,19 @@ import com.sk89q.worldguard.protection.managers.RegionManager; import com.sk89q.worldguard.protection.regions.ProtectedCuboidRegion; import com.sk89q.worldguard.protection.regions.ProtectedRegion; import me.wiefferink.areashop.interfaces.AreaShopInterface; +import me.wiefferink.areashop.interfaces.RegionAccessSet; +import me.wiefferink.areashop.interfaces.WorldGuardInterface; +import org.bukkit.Location; import org.bukkit.World; import org.bukkit.util.Vector; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; +import java.util.UUID; -public class WorldGuardHandler7_beta_2 extends WorldGuardHandler6_1_3 { +public class WorldGuardHandler7_beta_2 extends WorldGuardInterface { public WorldGuardHandler7_beta_2(AreaShopInterface pluginInterface) { super(pluginInterface); @@ -31,6 +38,85 @@ public class WorldGuardHandler7_beta_2 extends WorldGuardHandler6_1_3 { return WorldGuard.getInstance().getPlatform().getRegionContainer().get(BukkitAdapter.adapt(world)); } + @Override + public Set getApplicableRegionsSet(Location location) { + Set result = new HashSet<>(); + BlockVector3 vector = BlockVector3.at(location.getX(), location.getY(), location.getZ()); + for(ProtectedRegion region : getRegionManager(location.getWorld()).getRegions().values()) { + if(region.contains(vector)) { + result.add(region); + } + } + return result; + } + + /** + * Build a DefaultDomain from a RegionAccessSet. + * @param regionAccessSet RegionAccessSet to read + * @return DefaultDomain containing the entities from the RegionAccessSet + */ + private DefaultDomain buildDomain(RegionAccessSet regionAccessSet) { + DefaultDomain owners = new DefaultDomain(); + + for(String playerName : regionAccessSet.getPlayerNames()) { + owners.addPlayer(playerName); + } + + for(UUID uuid : regionAccessSet.getPlayerUniqueIds()) { + owners.addPlayer(uuid); + } + + for(String group : regionAccessSet.getGroupNames()) { + owners.addGroup(group); + } + + return owners; + } + + @Override + public void setOwners(ProtectedRegion region, RegionAccessSet regionAccessSet) { + DefaultDomain defaultDomain = buildDomain(regionAccessSet); + if(!region.getOwners().toUserFriendlyString().equals(defaultDomain.toUserFriendlyString())) { + region.setOwners(defaultDomain); + } + } + + @Override + public void setMembers(ProtectedRegion region, RegionAccessSet regionAccessSet) { + DefaultDomain defaultDomain = buildDomain(regionAccessSet); + if(!region.getMembers().toUserFriendlyString().equals(defaultDomain.toUserFriendlyString())) { + region.setMembers(defaultDomain); + } + } + + @Override + public boolean containsMember(ProtectedRegion region, UUID player) { + return region.getMembers().contains(player); + } + + @Override + public boolean containsOwner(ProtectedRegion region, UUID player) { + return region.getOwners().contains(player); + } + + @Override + public RegionAccessSet getMembers(ProtectedRegion region) { + RegionAccessSet result = new RegionAccessSet(); + result.getGroupNames().addAll(region.getMembers().getGroups()); + result.getPlayerNames().addAll(region.getMembers().getPlayers()); + result.getPlayerUniqueIds().addAll(region.getMembers().getUniqueIds()); + return result; + } + + @Override + public RegionAccessSet getOwners(ProtectedRegion region) { + RegionAccessSet result = new RegionAccessSet(); + result.getGroupNames().addAll(region.getOwners().getGroups()); + result.getPlayerNames().addAll(region.getOwners().getPlayers()); + result.getPlayerUniqueIds().addAll(region.getOwners().getUniqueIds()); + return result; + } + @Override public Flag fuzzyMatchFlag(String flagName) { return Flags.fuzzyMatchFlag(WorldGuard.getInstance().getFlagRegistry(), flagName);