diff --git a/AreaShop/pom.xml b/AreaShop/pom.xml index 3de575a..97aac44 100644 --- a/AreaShop/pom.xml +++ b/AreaShop/pom.xml @@ -38,6 +38,22 @@ 1.0.0-SNAPSHOT + + + com.sk89q + worldedit + system + any + ${project.basedir}/../dependencies/worldedit-bukkit-7.0.0-beta-04.jar + + + com.sk89q + worldguard + system + any + ${project.basedir}/../dependencies/worldguard-legacy-7.0.0-beta-02.jar + + me.wiefferink @@ -84,22 +100,6 @@ compile - - - com.sk89q - worldedit - system - any - ${project.basedir}/../dependencies/worldedit-bukkit-7.0.0-beta-04.jar - - - com.sk89q - worldguard - system - any - ${project.basedir}/../dependencies/worldguard-legacy-7.0.0-beta-02.jar - - me.wiefferink @@ -126,6 +126,11 @@ me.wiefferink areashop-worldedit-7_beta_4 latest + + + me.wiefferink + areashop-fastasyncworldedit + latest jar compile diff --git a/AreaShop/src/main/java/me/wiefferink/areashop/AreaShop.java b/AreaShop/src/main/java/me/wiefferink/areashop/AreaShop.java index e72b024..25b0ea0 100644 --- a/AreaShop/src/main/java/me/wiefferink/areashop/AreaShop.java +++ b/AreaShop/src/main/java/me/wiefferink/areashop/AreaShop.java @@ -34,6 +34,7 @@ import org.bukkit.plugin.Plugin; import org.bukkit.plugin.RegisteredServiceProvider; import org.bukkit.plugin.java.JavaPlugin; +import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -147,7 +148,7 @@ public final class AreaShop extends JavaPlugin implements AreaShopInterface { managers = new HashSet<>(); boolean error = false; - // Check if WorldEdit is present + // Find WorldEdit integration version to load String weVersion = null; String rawWeVersion = null; String weBeta = null; @@ -177,20 +178,11 @@ public final class AreaShop extends JavaPlugin implements AreaShopInterface { // beta-02 and beta-03 also have the new vector system already weVersion = "7_beta_4"; } - try { - final Class clazz = Class.forName("me.wiefferink.areashop.handlers.WorldEditHandler" + weVersion); - // Check if we have a NMSHandler class at that location. - if(WorldEditInterface.class.isAssignableFrom(clazz)) { // Make sure it actually implements WorldEditInterface - worldEditInterface = (WorldEditInterface)clazz.getConstructor(AreaShopInterface.class).newInstance(this); // Set our handler - } - } catch(final Exception e) { - error("Could not load the handler for WorldEdit (tried to load " + weVersion + "), report this problem to the author: " + ExceptionUtils.getStackTrace(e)); - error = true; - weVersion = null; - } + + weVersion = "WorldEditHandler" + weVersion; } - // Check if WorldGuard is present + // Find WorldGuard integration version to load String wgVersion = null; String rawWgVersion = null; int major = 0; @@ -266,18 +258,63 @@ public final class AreaShop extends JavaPlugin implements AreaShopInterface { warn("Parsing the WorldGuard version failed, assuming version 7_beta_2:", rawWgVersion); wgVersion = "7_beta_2"; } - // Load chosen implementation - try { - final Class clazz = Class.forName("me.wiefferink.areashop.handlers.WorldGuardHandler" + wgVersion); - // Check if we have a NMSHandler class at that location. - if(WorldGuardInterface.class.isAssignableFrom(clazz)) { // Make sure it actually implements WorldGuardInterface - worldGuardInterface = (WorldGuardInterface)clazz.getConstructor(AreaShopInterface.class).newInstance(this); // Set our handler + + wgVersion = "WorldGuardHandler" + wgVersion; + } + + // Check if FastAsyncWorldEdit is installed + boolean fawe; + try { + Class.forName("com.boydti.fawe.Fawe" ); + fawe = true; + } catch (ClassNotFoundException ignore) { + fawe = false; + } + + if (fawe) { + boolean useNewIntegration = true; + List standardIntegrationVersions = Arrays.asList("1.7", "1.8", "1.9", "1.10", "1.11", "1.12"); + for(String standardIntegrationVersion : standardIntegrationVersions) { + String version = Bukkit.getBukkitVersion(); + // Detects '1.8', '1.8.3', '1.8-pre1' style versions + if(version.equals(standardIntegrationVersion) + || version.startsWith(standardIntegrationVersion + ".") + || version.startsWith(standardIntegrationVersion + "-")) { + useNewIntegration = false; + break; } - } catch(final Exception e) { - error("Could not load the handler for WorldGuard (tried to load " + wgVersion + "), report this problem to the author:" + ExceptionUtils.getStackTrace(e)); - error = true; - wgVersion = null; } + + if (useNewIntegration) { + weVersion = "FastAsyncWorldEditHandler"; + wgVersion = "FastAsyncWorldEditWorldGuardHandler"; + } + } + + // Load WorldEdit + try { + final Class clazz = Class.forName("me.wiefferink.areashop.handlers." + weVersion); + // Check if we have a NMSHandler class at that location. + if(WorldEditInterface.class.isAssignableFrom(clazz)) { // Make sure it actually implements WorldEditInterface + worldEditInterface = (WorldEditInterface)clazz.getConstructor(AreaShopInterface.class).newInstance(this); // Set our handler + } + } catch(final Exception e) { + error("Could not load the handler for WorldEdit (tried to load " + weVersion + "), report this problem to the author: " + ExceptionUtils.getStackTrace(e)); + error = true; + weVersion = null; + } + + // Load WorldGuard + try { + final Class clazz = Class.forName("me.wiefferink.areashop.handlers." + wgVersion); + // Check if we have a NMSHandler class at that location. + if(WorldGuardInterface.class.isAssignableFrom(clazz)) { // Make sure it actually implements WorldGuardInterface + worldGuardInterface = (WorldGuardInterface)clazz.getConstructor(AreaShopInterface.class).newInstance(this); // Set our handler + } + } catch(final Exception e) { + error("Could not load the handler for WorldGuard (tried to load " + wgVersion + "), report this problem to the author:" + ExceptionUtils.getStackTrace(e)); + error = true; + wgVersion = null; } // Check if Vault is present diff --git a/AreaShop/src/main/resources/plugin.yml b/AreaShop/src/main/resources/plugin.yml index 00fccc3..81af238 100644 --- a/AreaShop/src/main/resources/plugin.yml +++ b/AreaShop/src/main/resources/plugin.yml @@ -3,7 +3,7 @@ main: me.wiefferink.areashop.AreaShop version: "${project.version}${build.number}" description: "Selling and renting WorldGuard regions to your players, highly configurable." depend: [Vault, WorldGuard, WorldEdit] -softdepend: [Multiverse-Core] +softdepend: [Multiverse-Core, FastAsyncWorldEdit] author: NLThijs48 website: https://github.com/NLthijs48/AreaShop commands: diff --git a/areashop-fastasyncworldedit/.gitignore b/areashop-fastasyncworldedit/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/areashop-fastasyncworldedit/.gitignore @@ -0,0 +1 @@ +/target diff --git a/areashop-fastasyncworldedit/pom.xml b/areashop-fastasyncworldedit/pom.xml new file mode 100644 index 0000000..452b6bb --- /dev/null +++ b/areashop-fastasyncworldedit/pom.xml @@ -0,0 +1,46 @@ + + 4.0.0 + areashop-fastasyncworldedit + jar + AreaShop FastAsyncWorldEdit + latest + + + me.wiefferink + areashop-parent + parent + + + + + org.bukkit + craftbukkit + 1.13-R0.1-SNAPSHOT + jar + true + + + com.sk89q + worldedit + system + any + ${project.basedir}/../dependencies/FastAsyncWorldEdit-bukkit-1.13.132.jar + + + com.sk89q + worldguard + system + any + ${project.basedir}/../dependencies/FastAsyncWorldEdit-worldguard-legacy-7.0.0-SNAPSHOT-dist.jar + + + + me.wiefferink + areashop-interface + latest + jar + + + + diff --git a/areashop-fastasyncworldedit/src/main/java/me/wiefferink/areashop/handlers/FastAsyncWorldEditHandler.java b/areashop-fastasyncworldedit/src/main/java/me/wiefferink/areashop/handlers/FastAsyncWorldEditHandler.java new file mode 100644 index 0000000..f18c948 --- /dev/null +++ b/areashop-fastasyncworldedit/src/main/java/me/wiefferink/areashop/handlers/FastAsyncWorldEditHandler.java @@ -0,0 +1,193 @@ +package me.wiefferink.areashop.handlers; + +import com.sk89q.worldedit.EditSession; +import com.sk89q.worldedit.IncompleteRegionException; +import com.sk89q.worldedit.LocalSession; +import com.sk89q.worldedit.MaxChangedBlocksException; +import com.sk89q.worldedit.Vector; +import com.sk89q.worldedit.bukkit.BukkitAdapter; +import com.sk89q.worldedit.extent.clipboard.BlockArrayClipboard; +import com.sk89q.worldedit.extent.clipboard.Clipboard; +import com.sk89q.worldedit.extent.clipboard.io.ClipboardFormat; +import com.sk89q.worldedit.extent.clipboard.io.ClipboardReader; +import com.sk89q.worldedit.extent.clipboard.io.ClipboardWriter; +import com.sk89q.worldedit.extent.transform.BlockTransformExtent; +import com.sk89q.worldedit.function.mask.Mask; +import com.sk89q.worldedit.function.mask.Mask2D; +import com.sk89q.worldedit.function.operation.ForwardExtentCopy; +import com.sk89q.worldedit.function.operation.Operations; +import com.sk89q.worldedit.regions.CuboidRegion; +import com.sk89q.worldedit.regions.Region; +import com.sk89q.worldedit.session.ClipboardHolder; +import com.sk89q.worldedit.util.io.Closer; +import com.sk89q.worldguard.protection.regions.ProtectedRegion; +import com.sk89q.worldguard.protection.regions.RegionType; +import me.wiefferink.areashop.interfaces.AreaShopInterface; +import me.wiefferink.areashop.interfaces.GeneralRegionInterface; +import me.wiefferink.areashop.interfaces.WorldEditInterface; +import me.wiefferink.areashop.interfaces.WorldEditSelection; +import org.apache.commons.lang.exception.ExceptionUtils; +import org.bukkit.entity.Player; + +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; + +// Future: this class could use the schematic save/paste api of FAWE: https://github.com/boy0001/FastAsyncWorldedit/wiki/Pasting-a-schematic +// This would not allow for shaping the schematic to a polygon region though +public class FastAsyncWorldEditHandler extends WorldEditInterface { + + public FastAsyncWorldEditHandler(AreaShopInterface pluginInterface) { + super(pluginInterface); + } + + @Override + public WorldEditSelection getPlayerSelection(Player player) { + try { + Region region = pluginInterface.getWorldEdit().getSession(player).getSelection(BukkitAdapter.adapt(player.getWorld())); + return new WorldEditSelection( + player.getWorld(), + BukkitAdapter.adapt(player.getWorld(), region.getMinimumPoint()), + BukkitAdapter.adapt(player.getWorld(), region.getMaximumPoint()) + ); + } catch (IncompleteRegionException e) { + return null; + } + } + + @Override + public boolean restoreRegionBlocks(File rawFile, GeneralRegionInterface regionInterface) { + // TODO implement using the FastAsyncWorldEdit api to paste async + File file = null; + ClipboardFormat format = null; + for (ClipboardFormat formatOption : ClipboardFormat.values()) { + if (new File(rawFile.getAbsolutePath() + "." + formatOption.getExtension()).exists()) { + file = new File(rawFile.getAbsolutePath() + "." + formatOption.getExtension()); + format = formatOption; + } + } + if(file == null) { + pluginInterface.getLogger().info("Did not restore region " + regionInterface.getName() + ", schematic file does not exist: " + rawFile.getAbsolutePath()); + return false; + } + pluginInterface.debugI("Trying to restore region", regionInterface.getName(), " from file", file.getAbsolutePath(), "with format", format.name()); + + com.sk89q.worldedit.world.World world = null; + if(regionInterface.getName() != null) { + world = BukkitAdapter.adapt(regionInterface.getWorld()); + } + if(world == null) { + pluginInterface.getLogger().info("Did not restore region " + regionInterface.getName() + ", world not found: " + regionInterface.getWorldName()); + return false; + } + EditSession editSession = pluginInterface.getWorldEdit().getWorldEdit().getEditSessionFactory().getEditSession(world, pluginInterface.getConfig().getInt("maximumBlocks")); + editSession.enableQueue(); + ProtectedRegion region = regionInterface.getRegion(); + // Get the origin and size of the region + Vector origin = new Vector(region.getMinimumPoint().getBlockX(), region.getMinimumPoint().getBlockY(), region.getMinimumPoint().getBlockZ()); + + // Read the schematic and paste it into the world + try(Closer closer = Closer.create()) { + FileInputStream fis = closer.register(new FileInputStream(file)); + BufferedInputStream bis = closer.register(new BufferedInputStream(fis)); + ClipboardReader reader = format.getReader(bis); + + LocalSession session = new LocalSession(pluginInterface.getWorldEdit().getLocalConfiguration()); + Clipboard clipboard = reader.read(); + if(clipboard.getDimensions().getY() != regionInterface.getHeight() + || clipboard.getDimensions().getX() != regionInterface.getWidth() + || clipboard.getDimensions().getZ() != regionInterface.getDepth()) { + pluginInterface.getLogger().warning("Size of the region " + regionInterface.getName() + " is not the same as the schematic to restore!"); + pluginInterface.debugI("schematic|region, x:" + clipboard.getDimensions().getX() + "|" + regionInterface.getWidth() + ", y:" + clipboard.getDimensions().getY() + "|" + regionInterface.getHeight() + ", z:" + clipboard.getDimensions().getZ() + "|" + regionInterface.getDepth()); + } + clipboard.setOrigin(clipboard.getMinimumPoint()); + ClipboardHolder clipboardHolder = new ClipboardHolder(clipboard); + session.setBlockChangeLimit(pluginInterface.getConfig().getInt("maximumBlocks")); + session.setClipboard(clipboardHolder); + + // Build operation + BlockTransformExtent extent = new BlockTransformExtent(clipboardHolder.getClipboard()); + ForwardExtentCopy copy = new ForwardExtentCopy(extent, clipboard.getRegion(), clipboard.getOrigin(), editSession, origin); + copy.setTransform(clipboardHolder.getTransform()); + // Mask to region (for polygon and other weird shaped regions) + // TODO make this more efficient (especially for polygon regions) + if(region.getType() != RegionType.CUBOID) { + copy.setSourceMask(new Mask() { + @Override + public boolean test(Vector vector) { + return region.contains(vector); + } + + @Override + public Mask2D toMask2D() { + return null; + } + }); + } + Operations.completeLegacy(copy); + } catch(MaxChangedBlocksException e) { + pluginInterface.getLogger().warning("exceeded the block limit while restoring schematic of " + regionInterface.getName() + ", limit in exception: " + e.getBlockLimit() + ", limit passed by AreaShop: " + pluginInterface.getConfig().getInt("maximumBlocks")); + return false; + } catch(IOException e) { + pluginInterface.getLogger().warning("An error occured while restoring schematic of " + regionInterface.getName() + ", enable debug to see the complete stacktrace"); + pluginInterface.debugI(ExceptionUtils.getStackTrace(e)); + return false; + } catch (Exception e) { + pluginInterface.getLogger().warning("crashed during restore of " + regionInterface.getName()); + pluginInterface.debugI(ExceptionUtils.getStackTrace(e)); + return false; + } + editSession.flushQueue(); + return true; + } + + @Override + public boolean saveRegionBlocks(File file, GeneralRegionInterface regionInterface) { + // TODO implement using the FastAsyncWorldEdit api to save async + ClipboardFormat format = ClipboardFormat.STRUCTURE; + // TODO allow selecting FAWE format in the config? (when enabled you cannot go back to vanilla WorldEdit easily) + + file = new File(file.getAbsolutePath() + "." + format.getExtension()); + pluginInterface.debugI("Trying to save region", regionInterface.getName(), " to file", file.getAbsolutePath(), "with format", format.name()); + com.sk89q.worldedit.world.World world = null; + if(regionInterface.getWorld() != null) { + world = BukkitAdapter.adapt(regionInterface.getWorld()); + } + if(world == null) { + pluginInterface.getLogger().warning("Did not save region " + regionInterface.getName() + ", world not found: " + regionInterface.getWorldName()); + return false; + } + EditSession editSession = pluginInterface.getWorldEdit().getWorldEdit().getEditSessionFactory().getEditSession(world, pluginInterface.getConfig().getInt("maximumBlocks")); + + // Create a clipboard + CuboidRegion selection = new CuboidRegion(world, regionInterface.getRegion().getMinimumPoint(), regionInterface.getRegion().getMaximumPoint()); + BlockArrayClipboard clipboard = new BlockArrayClipboard(selection); + clipboard.setOrigin(regionInterface.getRegion().getMinimumPoint()); + ForwardExtentCopy copy = new ForwardExtentCopy(editSession, new CuboidRegion(world, regionInterface.getRegion().getMinimumPoint(), regionInterface.getRegion().getMaximumPoint()), clipboard, regionInterface.getRegion().getMinimumPoint()); + try { + Operations.completeLegacy(copy); + } catch(MaxChangedBlocksException e) { + pluginInterface.getLogger().warning("Exceeded the block limit while saving schematic of " + regionInterface.getName() + ", limit in exception: " + e.getBlockLimit() + ", limit passed by AreaShop: " + pluginInterface.getConfig().getInt("maximumBlocks")); + return false; + } + + try(Closer closer = Closer.create()) { + FileOutputStream fos = closer.register(new FileOutputStream(file)); + BufferedOutputStream bos = closer.register(new BufferedOutputStream(fos)); + ClipboardWriter writer = closer.register(format.getWriter(bos)); + writer.write(clipboard); + } catch(IOException e) { + pluginInterface.getLogger().warning("An error occured while saving schematic of " + regionInterface.getName() + ", enable debug to see the complete stacktrace"); + pluginInterface.debugI(ExceptionUtils.getStackTrace(e)); + return false; + } catch (Exception e) { + pluginInterface.getLogger().warning("Crashed during save of " + regionInterface.getName()); + pluginInterface.debugI(ExceptionUtils.getStackTrace(e)); + return false; + } + return true; + } +} diff --git a/areashop-fastasyncworldedit/src/main/java/me/wiefferink/areashop/handlers/FastAsyncWorldEditWorldGuardHandler.java b/areashop-fastasyncworldedit/src/main/java/me/wiefferink/areashop/handlers/FastAsyncWorldEditWorldGuardHandler.java new file mode 100644 index 0000000..88fe114 --- /dev/null +++ b/areashop-fastasyncworldedit/src/main/java/me/wiefferink/areashop/handlers/FastAsyncWorldEditWorldGuardHandler.java @@ -0,0 +1,160 @@ +package me.wiefferink.areashop.handlers; + +import com.sk89q.worldedit.BlockVector; +import com.sk89q.worldedit.BlockVector2D; +import com.sk89q.worldedit.bukkit.BukkitAdapter; +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; +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 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 FastAsyncWorldEditWorldGuardHandler extends WorldGuardInterface { + + public FastAsyncWorldEditWorldGuardHandler(AreaShopInterface pluginInterface) { + super(pluginInterface); + } + + @Override + public RegionManager getRegionManager(World world) { + return WorldGuard.getInstance().getPlatform().getRegionContainer().get(BukkitAdapter.adapt(world)); + } + + @Override + public Set getApplicableRegionsSet(Location location) { + Set result = new HashSet<>(); + com.sk89q.worldedit.Vector vector = new com.sk89q.worldedit.Vector(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); + } + + @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()); + } + + @Override + public Vector getMinimumPoint(ProtectedRegion region) { + BlockVector min = region.getMinimumPoint(); + return new Vector(min.getX(), min.getY(), min.getZ()); + } + + @Override + public Vector getMaximumPoint(ProtectedRegion region) { + BlockVector min = region.getMaximumPoint(); + return new Vector(min.getX(), min.getY(), min.getZ()); + } + + @Override + public List getRegionPoints(ProtectedRegion region) { + List result = new ArrayList<>(); + for (BlockVector2D point : region.getPoints()) { + result.add(new Vector(point.getX(), 0,point.getZ())); + } + return result; + } + + @Override + public ProtectedCuboidRegion createCuboidRegion(String name, Vector corner1, Vector corner2) { + return new ProtectedCuboidRegion(name, new BlockVector(corner1.getBlockX(), corner1.getBlockY(), corner1.getBlockZ()), new BlockVector(corner2.getBlockX(), corner2.getBlockY(), corner2.getBlockZ())); + } +} diff --git a/areashop-worldguard-7_beta_1/pom.xml b/areashop-worldguard-7_beta_1/pom.xml index 51dd3c4..c5be73a 100644 --- a/areashop-worldguard-7_beta_1/pom.xml +++ b/areashop-worldguard-7_beta_1/pom.xml @@ -36,20 +36,6 @@ any ${project.basedir}/../dependencies/worldguard-legacy-7.0.0-beta-01.jar - - me.wiefferink - areashop-worldguard-6 - latest - jar - provided - - - me.wiefferink - areashop-worldguard-6_1_3 - latest - jar - provided - me.wiefferink 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 70bc1f1..9f816c5 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 @@ -1,12 +1,33 @@ package me.wiefferink.areashop.handlers; +import com.sk89q.worldedit.BlockVector; +import com.sk89q.worldedit.BlockVector2D; +import com.sk89q.worldedit.Vector; import com.sk89q.worldedit.bukkit.BukkitAdapter; 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; +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 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; -public class WorldGuardHandler7_beta_1 extends WorldGuardHandler6_1_3 { +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.UUID; + +public class WorldGuardHandler7_beta_1 extends WorldGuardInterface { public WorldGuardHandler7_beta_1(AreaShopInterface pluginInterface) { super(pluginInterface); @@ -16,4 +37,124 @@ 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 Set getApplicableRegionsSet(Location location) { + Set result = new HashSet<>(); + Vector vector = new Vector(location.getX(), location.getY(), location.getZ()); + for(ProtectedRegion region : getRegionManager(location.getWorld()).getRegions().values()) { + if(region.contains(vector)) { + result.add(region); + } + } + return result; + } + + @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 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; + } + + /** + * 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 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 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()); + } + + @Override + public org.bukkit.util.Vector getMinimumPoint(ProtectedRegion region) { + BlockVector min = region.getMinimumPoint(); + return new org.bukkit.util.Vector(min.getX(), min.getY(), min.getZ()); + } + + @Override + public org.bukkit.util.Vector getMaximumPoint(ProtectedRegion region) { + BlockVector min = region.getMaximumPoint(); + return new org.bukkit.util.Vector(min.getX(), min.getY(), min.getZ()); + } + + @Override + public List getRegionPoints(ProtectedRegion region) { + List result = new ArrayList<>(); + for (BlockVector2D point : region.getPoints()) { + result.add(new org.bukkit.util.Vector(point.getX(), 0,point.getZ())); + } + return result; + } + + @Override + public ProtectedCuboidRegion createCuboidRegion(String name, org.bukkit.util.Vector corner1, org.bukkit.util.Vector corner2) { + return new ProtectedCuboidRegion(name, new BlockVector(corner1.getBlockX(), corner1.getBlockY(), corner1.getBlockZ()), new BlockVector(corner2.getBlockX(), corner2.getBlockY(), corner2.getBlockZ())); + } } diff --git a/areashop-worldguard-7_beta_2/pom.xml b/areashop-worldguard-7_beta_2/pom.xml index 9bcf4a4..c2efebb 100644 --- a/areashop-worldguard-7_beta_2/pom.xml +++ b/areashop-worldguard-7_beta_2/pom.xml @@ -36,20 +36,6 @@ any ${project.basedir}/../dependencies/worldguard-legacy-7.0.0-beta-02.jar - - me.wiefferink - areashop-worldguard-6 - latest - jar - provided - - - me.wiefferink - areashop-worldguard-6_1_3 - latest - jar - provided - me.wiefferink diff --git a/dependencies/FastAsyncWorldEdit-bukkit-1.13.132.jar b/dependencies/FastAsyncWorldEdit-bukkit-1.13.132.jar new file mode 100644 index 0000000..74d1bc5 Binary files /dev/null and b/dependencies/FastAsyncWorldEdit-bukkit-1.13.132.jar differ diff --git a/dependencies/FastAsyncWorldEdit-worldguard-legacy-7.0.0-SNAPSHOT-dist.jar b/dependencies/FastAsyncWorldEdit-worldguard-legacy-7.0.0-SNAPSHOT-dist.jar new file mode 100644 index 0000000..766fe3a Binary files /dev/null and b/dependencies/FastAsyncWorldEdit-worldguard-legacy-7.0.0-SNAPSHOT-dist.jar differ diff --git a/pom.xml b/pom.xml index 43732b1..2957581 100644 --- a/pom.xml +++ b/pom.xml @@ -59,6 +59,7 @@ areashop-worldedit-6 areashop-worldedit-7_beta_1 areashop-worldedit-7_beta_4 + areashop-fastasyncworldedit AreaShop