Skip to content

Commit c77dda0

Browse files
committed
Make can build actually query the given regions rather than their locations.
1 parent 8d6c7e4 commit c77dda0

File tree

2 files changed

+36
-13
lines changed

2 files changed

+36
-13
lines changed

src/main/java/org/skriptlang/skriptworldguard/elements/conditions/CondCanBuildInRegions.java

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,13 @@
1212
import ch.njol.skript.lang.util.SimpleExpression;
1313
import ch.njol.skript.util.Direction;
1414
import ch.njol.util.Kleenean;
15-
import com.sk89q.worldedit.math.BlockVector3;
16-
import org.jetbrains.annotations.NotNull;
17-
import org.jetbrains.annotations.Nullable;
18-
import org.skriptlang.skriptworldguard.worldguard.WorldGuardRegion;
19-
import org.skriptlang.skriptworldguard.worldguard.RegionUtils;
2015
import org.bukkit.Location;
2116
import org.bukkit.entity.Player;
2217
import org.bukkit.event.Event;
18+
import org.jetbrains.annotations.NotNull;
19+
import org.jetbrains.annotations.Nullable;
20+
import org.skriptlang.skriptworldguard.worldguard.RegionUtils;
21+
import org.skriptlang.skriptworldguard.worldguard.WorldGuardRegion;
2322

2423
@Name("Can Build In Regions")
2524
@Description("A condition that tests whether the given players can build in the given regions or the regions of the given locations.")
@@ -66,7 +65,7 @@ public boolean init(Expression<?>[] exprs, int matchedPattern, @NotNull Kleenean
6665
@Override
6766
public boolean check(@NotNull Event event) {
6867
if (locations != null) {
69-
Location[] locations = this.locations.getAll(event);
68+
Location[] locations = this.locations.getAll(event); // get all to avoid double-eval + permit or lists.
7069
return players.check(event, player -> SimpleExpression.check(
7170
locations,
7271
location -> RegionUtils.canBuild(player, location),
@@ -75,14 +74,10 @@ public boolean check(@NotNull Event event) {
7574
), isNegated());
7675
} else {
7776
assert regions != null;
78-
WorldGuardRegion[] regions = this.regions.getAll(event);
77+
WorldGuardRegion[] regions = this.regions.getAll(event); // get all to avoid double-eval + permit or lists.
7978
return players.check(event, player -> SimpleExpression.check(
8079
regions,
81-
region -> { // Convert region to location essentially
82-
BlockVector3 minPoint = region.getRegion().getMinimumPoint();
83-
Location location = new Location(region.getWorld(), minPoint.getX(), minPoint.getY(), minPoint.getZ());
84-
return RegionUtils.canBuild(player, location);
85-
},
80+
region -> RegionUtils.canBuild(player, region),
8681
false,
8782
this.regions.getAnd()
8883
), isNegated());

src/main/java/org/skriptlang/skriptworldguard/worldguard/RegionUtils.java

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@
77
import com.sk89q.worldguard.WorldGuard;
88
import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
99
import com.sk89q.worldguard.internal.platform.WorldGuardPlatform;
10+
import com.sk89q.worldguard.protection.ApplicableRegionSet;
11+
import com.sk89q.worldguard.protection.RegionResultSet;
12+
import com.sk89q.worldguard.protection.flags.Flags;
1013
import com.sk89q.worldguard.protection.managers.RegionManager;
1114
import com.sk89q.worldguard.protection.regions.ProtectedCuboidRegion;
1215
import com.sk89q.worldguard.protection.regions.ProtectedPolygonalRegion;
@@ -17,11 +20,14 @@
1720
import org.bukkit.block.Block;
1821
import org.bukkit.entity.Player;
1922
import org.bukkit.util.Vector;
23+
import org.jetbrains.annotations.NotNull;
2024
import org.jetbrains.annotations.Nullable;
2125

2226
import java.util.ArrayList;
27+
import java.util.Arrays;
2328
import java.util.Collection;
2429
import java.util.List;
30+
import java.util.stream.Collectors;
2531

2632
public class RegionUtils {
2733

@@ -70,7 +76,13 @@ public static Collection<WorldGuardRegion> getRegionsAt(Location location) {
7076
return regions;
7177
}
7278

73-
public static boolean canBuild(Player player, Location location) {
79+
/**
80+
* Tests if a player can build at a given location.
81+
* @param player The player to test with
82+
* @param location The location to test at
83+
* @return Whether the given player can build at the location.
84+
*/
85+
public static boolean canBuild(Player player, @NotNull Location location) {
7486
World world = location.getWorld();
7587
if (world == null) {
7688
return false;
@@ -82,6 +94,22 @@ public static boolean canBuild(Player player, Location location) {
8294
return getRegionContainer().createQuery().testBuild(BukkitAdapter.adapt(location), WorldGuardPlugin.inst().wrapPlayer(player));
8395
}
8496

97+
/**
98+
* Tests if a player can build in all the given regions.
99+
* @param player The player to test with
100+
* @param regions The regions to test against
101+
* @return Whether the given player can build in all the regions.
102+
*/
103+
public static boolean canBuild(Player player, WorldGuardRegion... regions) {
104+
// create queryable set of regions
105+
ApplicableRegionSet regionSet = new RegionResultSet(
106+
(List<ProtectedRegion>) Arrays.stream(regions)
107+
.map(WorldGuardRegion::getRegion)
108+
.collect(Collectors.toCollection(ArrayList::new)), null);
109+
return regionSet.testState(WorldGuardPlugin.inst().wrapPlayer(player), Flags.BUILD);
110+
}
111+
112+
85113
public static List<Block> getBlocksInRegion(WorldGuardRegion region) {
86114
ProtectedRegion protectedRegion = region.getRegion();
87115
List<Block> blocks = new ArrayList<>();

0 commit comments

Comments
 (0)