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