From 15301c540f5fb65f399541050b6730e699bf9200 Mon Sep 17 00:00:00 2001 From: Luck Date: Tue, 26 May 2020 22:25:04 +0100 Subject: [PATCH] Add queryApplicableFlags method --- .../IWorldGuardImplementation.java | 9 +++++ .../legacy/WorldGuardImplementation.java | 33 +++++++++++++++++++ .../legacy/region/WrappedRegion.java | 5 ++- .../utility/WorldGuardFlagUtilities.java | 10 ++++++ .../v6/WorldGuardImplementation.java | 33 +++++++++++++++++++ .../v6/region/WrappedRegion.java | 5 ++- .../v6/utility/WorldGuardFlagUtilities.java | 10 ++++++ .../v7/WorldGuardImplementation.java | 33 +++++++++++++++++++ .../v7/region/WrappedRegion.java | 5 ++- .../v7/utility/WorldGuardFlagUtilities.java | 11 +++++++ 10 files changed, 145 insertions(+), 9 deletions(-) diff --git a/api/src/main/java/org/codemc/worldguardwrapper/implementation/IWorldGuardImplementation.java b/api/src/main/java/org/codemc/worldguardwrapper/implementation/IWorldGuardImplementation.java index cd1b3fe..80aa6fa 100644 --- a/api/src/main/java/org/codemc/worldguardwrapper/implementation/IWorldGuardImplementation.java +++ b/api/src/main/java/org/codemc/worldguardwrapper/implementation/IWorldGuardImplementation.java @@ -39,6 +39,15 @@ public interface IWorldGuardImplementation { */ Optional queryFlag(Player player, @NonNull Location location, @NonNull IWrappedFlag flag); + /** + * Queries all applicable flags for a given player at a given location. + * + * @param player The player + * @param location The location + * @return The flags + */ + Map, Object> queryApplicableFlags(Player player, Location location); + /** * Returns the flag with the given name. * diff --git a/implementation/legacy/src/main/java/org/codemc/worldguardwrapper/implementation/legacy/WorldGuardImplementation.java b/implementation/legacy/src/main/java/org/codemc/worldguardwrapper/implementation/legacy/WorldGuardImplementation.java index d0ac7ba..fa28f13 100644 --- a/implementation/legacy/src/main/java/org/codemc/worldguardwrapper/implementation/legacy/WorldGuardImplementation.java +++ b/implementation/legacy/src/main/java/org/codemc/worldguardwrapper/implementation/legacy/WorldGuardImplementation.java @@ -1,5 +1,6 @@ package org.codemc.worldguardwrapper.implementation.legacy; +import com.google.common.collect.Maps; import com.sk89q.worldguard.LocalPlayer; import com.sk89q.worldguard.bukkit.WorldGuardPlugin; import com.sk89q.worldguard.protection.ApplicableRegionSet; @@ -79,6 +80,38 @@ public class WorldGuardImplementation implements IWorldGuardImplementation { return queryValue(player, location, wrappedFlag.getHandle()).flatMap(value -> wrappedFlag.fromWGValue(value)); } + @Override + public Map, Object> queryApplicableFlags(Player player, Location location) { + ApplicableRegionSet applicableSet = getApplicableRegions(location).orElse(null); + if (applicableSet == null) { + return Collections.emptyMap(); + } + + LocalPlayer localPlayer = wrapPlayer(player).orElse(null); + Map, Object> flags = new HashMap<>(); + Set seen = new HashSet<>(); + + for (ProtectedRegion region : applicableSet.getRegions()) { + for (Flag flag : region.getFlags().keySet()) { + if (seen.add(flag.getName())) { + Object value = applicableSet.queryValue(localPlayer, flag); + if (value == null) { + continue; + } + + try { + Map.Entry, Object> wrapped = WorldGuardFlagUtilities.wrap(flag, value); + flags.put(wrapped.getKey(), wrapped.getValue()); + } catch (IllegalArgumentException e) { + return null; // Unsupported flag type + } + } + } + } + + return flags; + } + @Override public Optional> registerFlag(String name, Class type, T defaultValue) { throw new UnsupportedOperationException("Custom flags aren't supported in this version of WorldGuard!"); diff --git a/implementation/legacy/src/main/java/org/codemc/worldguardwrapper/implementation/legacy/region/WrappedRegion.java b/implementation/legacy/src/main/java/org/codemc/worldguardwrapper/implementation/legacy/region/WrappedRegion.java index 62a9975..12052e4 100644 --- a/implementation/legacy/src/main/java/org/codemc/worldguardwrapper/implementation/legacy/region/WrappedRegion.java +++ b/implementation/legacy/src/main/java/org/codemc/worldguardwrapper/implementation/legacy/region/WrappedRegion.java @@ -80,9 +80,8 @@ public class WrappedRegion implements IWrappedRegion { handle.getFlags().forEach((flag, value) -> { if (value != null) { try { - IWrappedFlag wrappedFlag = WorldGuardFlagUtilities.wrapFixType(flag, value.getClass()); - Optional wrappedValue = ((AbstractWrappedFlag) wrappedFlag).fromWGValue(value); - wrappedValue.ifPresent(val -> result.put(wrappedFlag, val)); + Map.Entry, Object> wrapped = WorldGuardFlagUtilities.wrap(flag, value); + result.put(wrapped.getKey(), wrapped.getValue()); } catch (IllegalArgumentException ignored) {/* Unsupported flag type */} } }); diff --git a/implementation/legacy/src/main/java/org/codemc/worldguardwrapper/implementation/legacy/utility/WorldGuardFlagUtilities.java b/implementation/legacy/src/main/java/org/codemc/worldguardwrapper/implementation/legacy/utility/WorldGuardFlagUtilities.java index 0813477..9bd623f 100644 --- a/implementation/legacy/src/main/java/org/codemc/worldguardwrapper/implementation/legacy/utility/WorldGuardFlagUtilities.java +++ b/implementation/legacy/src/main/java/org/codemc/worldguardwrapper/implementation/legacy/utility/WorldGuardFlagUtilities.java @@ -1,5 +1,6 @@ package org.codemc.worldguardwrapper.implementation.legacy.utility; +import com.google.common.collect.Maps; import com.sk89q.worldedit.bukkit.BukkitWorld; import com.sk89q.worldguard.protection.flags.Flag; import com.sk89q.worldguard.protection.flags.StateFlag; @@ -10,11 +11,14 @@ import org.bukkit.World; import org.bukkit.util.Vector; import org.codemc.worldguardwrapper.flag.IWrappedFlag; import org.codemc.worldguardwrapper.flag.WrappedState; +import org.codemc.worldguardwrapper.implementation.legacy.flag.AbstractWrappedFlag; import org.codemc.worldguardwrapper.implementation.legacy.flag.WrappedPrimitiveFlag; import org.codemc.worldguardwrapper.implementation.legacy.flag.WrappedStatusFlag; import lombok.experimental.UtilityClass; +import java.util.Map; + @UtilityClass public class WorldGuardFlagUtilities { @@ -60,6 +64,12 @@ public class WorldGuardFlagUtilities { return wrap(flag, type); } + public Map.Entry, Object> wrap(Flag flag, Object value) { + IWrappedFlag wrappedFlag = wrapFixType(flag, value.getClass()); + Object wrappedValue = ((AbstractWrappedFlag) wrappedFlag).fromWGValue(value).get(); // value is non-null + return Maps.immutableEntry(wrappedFlag, wrappedValue); + } + public Vector adaptVector(com.sk89q.worldedit.Vector vector) { return new Vector(vector.getX(), vector.getY(), vector.getZ()); } diff --git a/implementation/v6/src/main/java/org/codemc/worldguardwrapper/implementation/v6/WorldGuardImplementation.java b/implementation/v6/src/main/java/org/codemc/worldguardwrapper/implementation/v6/WorldGuardImplementation.java index 265a028..1bdbeb6 100644 --- a/implementation/v6/src/main/java/org/codemc/worldguardwrapper/implementation/v6/WorldGuardImplementation.java +++ b/implementation/v6/src/main/java/org/codemc/worldguardwrapper/implementation/v6/WorldGuardImplementation.java @@ -1,5 +1,6 @@ package org.codemc.worldguardwrapper.implementation.v6; +import com.google.common.collect.Maps; import com.sk89q.worldguard.LocalPlayer; import com.sk89q.worldguard.bukkit.WorldGuardPlugin; import com.sk89q.worldguard.protection.ApplicableRegionSet; @@ -79,6 +80,38 @@ public class WorldGuardImplementation implements IWorldGuardImplementation { return queryValue(player, location, wrappedFlag.getHandle()).flatMap(value -> wrappedFlag.fromWGValue(value)); } + @Override + public Map, Object> queryApplicableFlags(Player player, Location location) { + ApplicableRegionSet applicableSet = getApplicableRegions(location).orElse(null); + if (applicableSet == null) { + return Collections.emptyMap(); + } + + LocalPlayer localPlayer = wrapPlayer(player).orElse(null); + Map, Object> flags = new HashMap<>(); + Set seen = new HashSet<>(); + + for (ProtectedRegion region : applicableSet.getRegions()) { + for (Flag flag : region.getFlags().keySet()) { + if (seen.add(flag.getName())) { + Object value = applicableSet.queryValue(localPlayer, flag); + if (value == null) { + continue; + } + + try { + Map.Entry, Object> wrapped = WorldGuardFlagUtilities.wrap(flag, value); + flags.put(wrapped.getKey(), wrapped.getValue()); + } catch (IllegalArgumentException e) { + return null; // Unsupported flag type + } + } + } + } + + return flags; + } + @SuppressWarnings("unchecked") @Override public Optional> registerFlag(String name, Class type, T defaultValue) { diff --git a/implementation/v6/src/main/java/org/codemc/worldguardwrapper/implementation/v6/region/WrappedRegion.java b/implementation/v6/src/main/java/org/codemc/worldguardwrapper/implementation/v6/region/WrappedRegion.java index ce06403..b1cfb38 100644 --- a/implementation/v6/src/main/java/org/codemc/worldguardwrapper/implementation/v6/region/WrappedRegion.java +++ b/implementation/v6/src/main/java/org/codemc/worldguardwrapper/implementation/v6/region/WrappedRegion.java @@ -80,9 +80,8 @@ public class WrappedRegion implements IWrappedRegion { handle.getFlags().forEach((flag, value) -> { if (value != null) { try { - IWrappedFlag wrappedFlag = WorldGuardFlagUtilities.wrapFixType(flag, value.getClass()); - Optional wrappedValue = ((AbstractWrappedFlag) wrappedFlag).fromWGValue(value); - wrappedValue.ifPresent(val -> result.put(wrappedFlag, val)); + Map.Entry, Object> wrapped = WorldGuardFlagUtilities.wrap(flag, value); + result.put(wrapped.getKey(), wrapped.getValue()); } catch (IllegalArgumentException ignored) {/* Unsupported flag type */} } }); diff --git a/implementation/v6/src/main/java/org/codemc/worldguardwrapper/implementation/v6/utility/WorldGuardFlagUtilities.java b/implementation/v6/src/main/java/org/codemc/worldguardwrapper/implementation/v6/utility/WorldGuardFlagUtilities.java index 9ebae01..5836f49 100644 --- a/implementation/v6/src/main/java/org/codemc/worldguardwrapper/implementation/v6/utility/WorldGuardFlagUtilities.java +++ b/implementation/v6/src/main/java/org/codemc/worldguardwrapper/implementation/v6/utility/WorldGuardFlagUtilities.java @@ -1,5 +1,6 @@ package org.codemc.worldguardwrapper.implementation.v6.utility; +import com.google.common.collect.Maps; import com.sk89q.worldedit.bukkit.BukkitWorld; import com.sk89q.worldguard.protection.flags.Flag; import com.sk89q.worldguard.protection.flags.StateFlag; @@ -9,11 +10,14 @@ import org.bukkit.World; import org.bukkit.util.Vector; import org.codemc.worldguardwrapper.flag.IWrappedFlag; import org.codemc.worldguardwrapper.flag.WrappedState; +import org.codemc.worldguardwrapper.implementation.v6.flag.AbstractWrappedFlag; import org.codemc.worldguardwrapper.implementation.v6.flag.WrappedPrimitiveFlag; import org.codemc.worldguardwrapper.implementation.v6.flag.WrappedStatusFlag; import lombok.experimental.UtilityClass; +import java.util.Map; + @UtilityClass public class WorldGuardFlagUtilities { @@ -59,6 +63,12 @@ public class WorldGuardFlagUtilities { return wrap(flag, type); } + public Map.Entry, Object> wrap(Flag flag, Object value) { + IWrappedFlag wrappedFlag = wrapFixType(flag, value.getClass()); + Object wrappedValue = ((AbstractWrappedFlag) wrappedFlag).fromWGValue(value).get(); // value is non-null + return Maps.immutableEntry(wrappedFlag, wrappedValue); + } + public Vector adaptVector(com.sk89q.worldedit.Vector vector) { return new Vector(vector.getX(), vector.getY(), vector.getZ()); } diff --git a/implementation/v7/src/main/java/org/codemc/worldguardwrapper/implementation/v7/WorldGuardImplementation.java b/implementation/v7/src/main/java/org/codemc/worldguardwrapper/implementation/v7/WorldGuardImplementation.java index 8f7a1ed..46fcc7b 100644 --- a/implementation/v7/src/main/java/org/codemc/worldguardwrapper/implementation/v7/WorldGuardImplementation.java +++ b/implementation/v7/src/main/java/org/codemc/worldguardwrapper/implementation/v7/WorldGuardImplementation.java @@ -1,5 +1,6 @@ package org.codemc.worldguardwrapper.implementation.v7; +import com.google.common.collect.Maps; import com.sk89q.worldedit.bukkit.BukkitAdapter; import com.sk89q.worldedit.bukkit.BukkitWorld; import com.sk89q.worldedit.math.BlockVector2; @@ -83,6 +84,38 @@ public class WorldGuardImplementation implements IWorldGuardImplementation { return queryValue(player, location, wrappedFlag.getHandle()).flatMap(value -> wrappedFlag.fromWGValue(value)); } + @Override + public Map, Object> queryApplicableFlags(Player player, Location location) { + ApplicableRegionSet applicableSet = getApplicableRegions(location).orElse(null); + if (applicableSet == null) { + return Collections.emptyMap(); + } + + LocalPlayer localPlayer = wrapPlayer(player).orElse(null); + Map, Object> flags = new HashMap<>(); + Set seen = new HashSet<>(); + + for (ProtectedRegion region : applicableSet.getRegions()) { + for (Flag flag : region.getFlags().keySet()) { + if (seen.add(flag.getName())) { + Object value = applicableSet.queryValue(localPlayer, flag); + if (value == null) { + continue; + } + + try { + Map.Entry, Object> wrapped = WorldGuardFlagUtilities.wrap(flag, value); + flags.put(wrapped.getKey(), wrapped.getValue()); + } catch (IllegalArgumentException e) { + return null; // Unsupported flag type + } + } + } + } + + return flags; + } + @SuppressWarnings("unchecked") @Override public Optional> registerFlag(String name, Class type, T defaultValue) { diff --git a/implementation/v7/src/main/java/org/codemc/worldguardwrapper/implementation/v7/region/WrappedRegion.java b/implementation/v7/src/main/java/org/codemc/worldguardwrapper/implementation/v7/region/WrappedRegion.java index ae7fc5e..5573bd6 100644 --- a/implementation/v7/src/main/java/org/codemc/worldguardwrapper/implementation/v7/region/WrappedRegion.java +++ b/implementation/v7/src/main/java/org/codemc/worldguardwrapper/implementation/v7/region/WrappedRegion.java @@ -80,9 +80,8 @@ public class WrappedRegion implements IWrappedRegion { handle.getFlags().forEach((flag, value) -> { if (value != null) { try { - IWrappedFlag wrappedFlag = WorldGuardFlagUtilities.wrapFixType(flag, value.getClass()); - Optional wrappedValue = ((AbstractWrappedFlag) wrappedFlag).fromWGValue(value); - wrappedValue.ifPresent(val -> result.put(wrappedFlag, val)); + Map.Entry, Object> wrapped = WorldGuardFlagUtilities.wrap(flag, value); + result.put(wrapped.getKey(), wrapped.getValue()); } catch (IllegalArgumentException ignored) {/* Unsupported flag type */} } }); diff --git a/implementation/v7/src/main/java/org/codemc/worldguardwrapper/implementation/v7/utility/WorldGuardFlagUtilities.java b/implementation/v7/src/main/java/org/codemc/worldguardwrapper/implementation/v7/utility/WorldGuardFlagUtilities.java index 84652d5..1950b36 100644 --- a/implementation/v7/src/main/java/org/codemc/worldguardwrapper/implementation/v7/utility/WorldGuardFlagUtilities.java +++ b/implementation/v7/src/main/java/org/codemc/worldguardwrapper/implementation/v7/utility/WorldGuardFlagUtilities.java @@ -1,5 +1,6 @@ package org.codemc.worldguardwrapper.implementation.v7.utility; +import com.google.common.collect.Maps; import com.sk89q.worldedit.math.Vector3; import com.sk89q.worldguard.protection.flags.Flag; import com.sk89q.worldguard.protection.flags.StateFlag; @@ -8,11 +9,15 @@ import org.bukkit.Location; import org.bukkit.util.Vector; import org.codemc.worldguardwrapper.flag.IWrappedFlag; import org.codemc.worldguardwrapper.flag.WrappedState; +import org.codemc.worldguardwrapper.implementation.v7.flag.AbstractWrappedFlag; import org.codemc.worldguardwrapper.implementation.v7.flag.WrappedPrimitiveFlag; import org.codemc.worldguardwrapper.implementation.v7.flag.WrappedStatusFlag; import lombok.experimental.UtilityClass; +import java.util.Map; +import java.util.Optional; + @UtilityClass public class WorldGuardFlagUtilities { @@ -58,6 +63,12 @@ public class WorldGuardFlagUtilities { return wrap(flag, type); } + public Map.Entry, Object> wrap(Flag flag, Object value) { + IWrappedFlag wrappedFlag = wrapFixType(flag, value.getClass()); + Object wrappedValue = ((AbstractWrappedFlag) wrappedFlag).fromWGValue(value).get(); // value is non-null + return Maps.immutableEntry(wrappedFlag, wrappedValue); + } + public Vector adaptVector(Vector3 vector) { return new Vector(vector.getX(), vector.getY(), vector.getZ()); }