diff --git a/src/main/java/org/skriptlang/skriptworldguard/elements/expressions/ExprRegions.java b/src/main/java/org/skriptlang/skriptworldguard/elements/expressions/ExprRegions.java new file mode 100644 index 0000000..dbf3c19 --- /dev/null +++ b/src/main/java/org/skriptlang/skriptworldguard/elements/expressions/ExprRegions.java @@ -0,0 +1,78 @@ +package org.skriptlang.skriptworldguard.elements.expressions; + +import ch.njol.skript.Skript; +import ch.njol.skript.doc.*; +import ch.njol.skript.lang.Expression; +import ch.njol.skript.lang.ExpressionType; +import ch.njol.skript.lang.SkriptParser.ParseResult; +import ch.njol.skript.lang.util.SimpleExpression; +import ch.njol.util.Kleenean; +import org.bukkit.World; +import org.bukkit.event.Event; +import org.jetbrains.annotations.Nullable; +import org.skriptlang.skriptworldguard.worldguard.RegionUtils; +import org.skriptlang.skriptworldguard.worldguard.WorldGuardRegion; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +@Name("All Regions") +@Description("Get all regions from all worlds or from a specific world.") +@Examples({ + "send all regions", + "set {_regions::*} to the regions in world \"world\"" +}) +@Since("INSERT VERSION") +@RequiredPlugins("WorldGuard 7") +public class ExprRegions extends SimpleExpression { + + static { + Skript.registerExpression(ExprRegions.class, WorldGuardRegion.class, ExpressionType.SIMPLE, + "(all [[of] the]|the) regions [(in|of|from) %-worlds%]"); + } + + private @Nullable Expression worlds; + + @Override + public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { + if (exprs[0] != null) + //noinspection unchecked + worlds = (Expression) exprs[0]; + return true; + } + + @Override + protected WorldGuardRegion @Nullable [] get(Event event) { + if (worlds == null) + return RegionUtils.getRegions(); + World[] worlds = this.worlds.getArray(event); + if (worlds.length == 0) + return null; + List regions = new ArrayList<>(); + for (World world : worlds) { + WorldGuardRegion[] worldRegions = RegionUtils.getRegions(world); + if (worldRegions == null || worldRegions.length == 0) + continue; + regions.addAll(Arrays.stream(worldRegions).collect(Collectors.toList())); + } + return regions.toArray(new WorldGuardRegion[0]); + } + + @Override + public boolean isSingle() { + return false; + } + + @Override + public Class getReturnType() { + return WorldGuardRegion.class; + } + + @Override + public String toString(@Nullable Event event, boolean debug) { + return "all of the regions" + (worlds == null ? "" : " " + worlds.toString(event, debug)); + } + +} diff --git a/src/main/java/org/skriptlang/skriptworldguard/worldguard/RegionUtils.java b/src/main/java/org/skriptlang/skriptworldguard/worldguard/RegionUtils.java index b35c8f3..306db84 100644 --- a/src/main/java/org/skriptlang/skriptworldguard/worldguard/RegionUtils.java +++ b/src/main/java/org/skriptlang/skriptworldguard/worldguard/RegionUtils.java @@ -4,6 +4,7 @@ import com.sk89q.worldedit.bukkit.BukkitAdapter; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.regions.Polygonal2DRegion; +import com.sk89q.worldedit.regions.Region; import com.sk89q.worldguard.WorldGuard; import com.sk89q.worldguard.bukkit.WorldGuardPlugin; import com.sk89q.worldguard.internal.platform.WorldGuardPlatform; @@ -12,6 +13,7 @@ import com.sk89q.worldguard.protection.regions.ProtectedPolygonalRegion; import com.sk89q.worldguard.protection.regions.ProtectedRegion; import com.sk89q.worldguard.protection.regions.RegionContainer; +import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.World; import org.bukkit.block.Block; @@ -19,9 +21,8 @@ import org.bukkit.util.Vector; import org.jetbrains.annotations.Nullable; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; +import java.util.*; +import java.util.Map.Entry; public class RegionUtils { @@ -136,9 +137,38 @@ public static RegionContainer getRegionContainer() { * - region data for the given world has failed to load * - support for regions has been disabled */ - @Nullable - public static RegionManager getRegionManager(World world) { + public static @Nullable RegionManager getRegionManager(World world) { return WorldGuard.getInstance().getPlatform().getRegionContainer().get(BukkitAdapter.adapt(world)); } + /** + * @return All regions of all worlds + */ + public static WorldGuardRegion @Nullable [] getRegions() { + return getRegions(null); + } + + /** + * Get all regions of all worlds or provide {@code world} to get all regions of that {@link World} + * @param world The {@link World} to get regions from, or {@code null} to get regions from all worlds + * @return All regions from the world, or all worlds if {@code world} is null. + */ + public static WorldGuardRegion @Nullable [] getRegions(@Nullable World world) { + WorldGuardPlatform platform = WorldGuard.getInstance().getPlatform(); + RegionContainer container = platform.getRegionContainer(); + Map managers = new HashMap<>(); + if (world == null) { + for (World world1 : Bukkit.getWorlds()) + managers.put(world1, container.get(BukkitAdapter.adapt(world1))); + } else { + managers.put(world, container.get(BukkitAdapter.adapt(world))); + } + List regions = new ArrayList<>(); + for (Entry managerEntry : managers.entrySet()) { + for (Entry regionEntry : managerEntry.getValue().getRegions().entrySet()) + regions.add(new WorldGuardRegion(managerEntry.getKey(), regionEntry.getValue())); + } + return regions.toArray(new WorldGuardRegion[0]); + } + }