diff --git a/pom.xml b/pom.xml index c66274bd..c633ac60 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ com.songoda SongodaCore 4.0.0 - 1 + 1.0 clean install SongodaCore-${project.version} diff --git a/src/main/java/com/songoda/core/library/hooks/WorldGuardHook.java b/src/main/java/com/songoda/core/library/hooks/WorldGuardHook.java index c47af695..2b39f938 100644 --- a/src/main/java/com/songoda/core/library/hooks/WorldGuardHook.java +++ b/src/main/java/com/songoda/core/library/hooks/WorldGuardHook.java @@ -1,289 +1,72 @@ -/** - * Hooks for adding a custom WorldGuard flag - * - * Note: Hooks must be added before WG loads! - */ package com.songoda.core.library.hooks; -import com.sk89q.worldedit.bukkit.BukkitAdapter; -import com.sk89q.worldedit.math.BlockVector3; -import com.sk89q.worldguard.WorldGuard; -import com.sk89q.worldguard.protection.ApplicableRegionSet; -import com.sk89q.worldguard.protection.association.RegionAssociable; -import com.sk89q.worldguard.protection.flags.Flag; -import com.sk89q.worldguard.protection.flags.StateFlag; -import com.sk89q.worldguard.protection.flags.StateFlag.State; -import com.sk89q.worldguard.protection.managers.RegionManager; -import com.sk89q.worldguard.protection.regions.ProtectedCuboidRegion; -import com.sk89q.worldguard.protection.regions.RegionContainer; -import com.sk89q.worldguard.protection.regions.RegionQuery; -import java.lang.reflect.Constructor; -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.lang.reflect.Modifier; -import java.util.HashMap; -import java.util.Map; -import java.util.logging.Level; -import java.util.stream.Stream; -import org.bukkit.Bukkit; +import com.songoda.core.library.hooks.hooks.WorldGuardFlagHandler; import org.bukkit.Chunk; import org.bukkit.Location; public class WorldGuardHook { - - static Boolean wgPlugin = null; - static Object worldGuardPlugin; - static boolean legacy = false; - static boolean hooksInstalled = false; - static Map flags = new HashMap(); + + static boolean canHook, checkedCanHook = false; + + private static void init() { + if(checkedCanHook) return; + + try { + // if this class exists, we're good to use WG classes + Class.forName("com.sk89q.worldguard.protection.flags.Flag"); + canHook = true; + } catch (ClassNotFoundException ex) { + } + + checkedCanHook = true; + } /** - * Attempt to register a worldGuard flag (ALLOW/DENY) - * @param flag - * @param state + * Attempt to register a worldGuard flag (ALLOW/DENY)
+ * Note: This must be called before WorldGuard loads, or it will fail. + * + * @param flag name of the flag to set + * @param state default value of the flag */ public static void addHook(String flag, boolean state) { - if (wgPlugin == null && (wgPlugin = (worldGuardPlugin = Bukkit.getPluginManager().getPlugin("WorldGuard")) != null)) { - try { - // if this class exists, we're on an older version - Class.forName("com.sk89q.worldguard.protection.flags.registry.SimpleFlagRegistry"); - legacy = true; - } catch (ClassNotFoundException ex) { - } - } - if (!wgPlugin) return; - - if (legacy) { - addLegacyHook(flag, state); - return; - } - - StateFlag addFlag = new StateFlag(flag, state); - try { - WorldGuard.getInstance().getFlagRegistry().register(addFlag); - flags.put(flag, addFlag); - } catch (Exception ex) { - Bukkit.getServer().getLogger().log(Level.WARNING, "Could not add flag {0} to WorldGuard", addFlag.getName()); - Flag wgFlag = (StateFlag) WorldGuard.getInstance().getFlagRegistry().get(addFlag.getName()); - if (wgFlag == null) { - wgPlugin = false; - Bukkit.getServer().getLogger().log(Level.WARNING, "Could not hook WorldGuard"); - } else { - flags.put(flag, wgFlag); - Bukkit.getServer().getLogger().log(Level.WARNING, "Loaded existing {1} {0}", new Object[] {wgFlag.getName(), wgFlag.getClass().getSimpleName()}); - } - } - } - - // reflection to add hooks - private static void addLegacyHook(String flag, boolean state) { - try { - // 6.0 has the same classpath for StateFlag as the current version does - // does this flag exist already? - Class defaultFlagClazz = Class.forName("com.sk89q.worldguard.protection.flags.DefaultFlag"); - Field flagField = defaultFlagClazz.getField("flagsList"); - Flag[] flagsOld = (Flag[]) flagField.get(null); - Flag wgFlag = Stream.of(flagsOld) - .filter(f -> ((Flag)f).getName().equalsIgnoreCase(flag)) - .findFirst().orElse(null); - if (wgFlag != null) { - // we already have one - flags.put(flag, wgFlag); - Bukkit.getServer().getLogger().log(Level.WARNING, "Loaded existing {1} {0}", new Object[] {wgFlag.getName(), wgFlag.getClass().getSimpleName()}); - return; - } - - // if not, we need to add one - wgFlag = new StateFlag(flag, state); - - // we need to sneak our flag into the array - // make a copy first - Flag[] flagsNew = new Flag[flagsOld.length + 1]; - System.arraycopy(flagsOld, 0, flagsNew, 0, flagsOld.length); - - // add ours - flagsNew[flagsNew.length - 1] = wgFlag; - - // and put the new list into place - setStaticField(flagField, flagsNew); - - // register this flag in the registry - Object flagRegistry = getPrivateField(worldGuardPlugin.getClass(), worldGuardPlugin, "flagRegistry"); - Class simpleFlagRegistryClazz = Class.forName("com.sk89q.worldguard.protection.flags.registry.SimpleFlagRegistry"); - Method registerSimpleFlagRegistry = simpleFlagRegistryClazz.getDeclaredMethod("register", Flag.class); - registerSimpleFlagRegistry.invoke(flagRegistry, wgFlag); - - // all good! - flags.put(flag, wgFlag); - } catch (Exception ex) { - //Bukkit.getServer().getLogger().log(Level.WARNING, "Failed to set legacy WorldGuard Flags", ex); - Bukkit.getServer().getLogger().log(Level.WARNING, "Could not add flag {0} to WorldGuard", flag); - Bukkit.getServer().getLogger().log(Level.WARNING, "Could not hook WorldGuard"); + init(); + if(canHook) { + WorldGuardFlagHandler.addHook(flag, state); } } - private static Object getPrivateField(Class c, Object handle, String fieldName) throws Exception { - Field field = c.getDeclaredField(fieldName); - field.setAccessible(true); - return field.get(handle); - } - - private static void setStaticField(Field field, Object value) throws Exception { - field.setAccessible(true); - Field modifier = Field.class.getDeclaredField("modifiers"); - modifier.setAccessible(true); - modifier.setInt(field, field.getModifiers() & ~Modifier.FINAL); - field.set(null, value); - } - + /** + * Check to see if WorldGuard is installed and hooked + * + * @return true if and only if WorldGuard exists and addHook() has been + * called and added successfully + */ public static boolean isEnabled() { - return wgPlugin != null && wgPlugin; + init(); + return canHook && WorldGuardFlagHandler.isEnabled(); } /** * Checks this location to see what this flag is set to + * * @param l location to check * @param flag ALLOW/DENY flag to check * @return flag state, or null if undefined */ public static Boolean getBooleanFlag(Location l, String flag) { - if (wgPlugin == null || !wgPlugin) return null; - Object flagObj = flags.get(flag); - // There's a different way to get this in the old version - if (legacy) - return flagObj == null ? null : getBooleanFlagLegacy(l, flagObj); - - // for convinience, we can load a flag if we don't know it - if (flagObj == null && !legacy) - flags.put(flag, flagObj = WorldGuard.getInstance().getFlagRegistry().get(flag)); - - // so, what's up? - if (flagObj instanceof StateFlag) { - RegionContainer container = WorldGuard.getInstance().getPlatform().getRegionContainer(); - RegionQuery query = container.createQuery(); - com.sk89q.worldedit.util.Location loc = BukkitAdapter.adapt(l); - return query.testState(loc, (RegionAssociable) null, (StateFlag) flagObj); - } - return null; + init(); + return canHook ? WorldGuardFlagHandler.getBooleanFlag(l, flag) : null; } /** * Query all regions that are in or intersect this chunk + * * @param c chunk to check for regions in * @param flag ALLOW/DENY flag to check * @return flag state, or null if undefined */ public static Boolean getBooleanFlag(Chunk c, String flag) { - if (wgPlugin == null || !wgPlugin) return null; - Object flagObj = flags.get(flag); - // There's a different way to get this in the old version - if (legacy) - return flagObj == null ? null : getBooleanFlagLegacy(c, flagObj); - - // for convinience, we can load a flag if we don't know it - if (flagObj == null) - flags.put(flag, flagObj = WorldGuard.getInstance().getFlagRegistry().get(flag)); - - // so, what's up? - if (flagObj instanceof StateFlag) { - RegionManager worldManager = WorldGuard.getInstance().getPlatform().getRegionContainer().get(BukkitAdapter.adapt(c.getWorld())); - if (worldManager == null) - return null; - ProtectedCuboidRegion chunkRegion = new ProtectedCuboidRegion("__TEST__", - BlockVector3.at(c.getX() << 4, c.getWorld().getMaxHeight(), c.getZ() << 4), - BlockVector3.at((c.getX() << 4) + 15, 0, (c.getZ() << 4) + 15)); - ApplicableRegionSet set = worldManager.getApplicableRegions(chunkRegion); - State result = set.queryState((RegionAssociable) null, (StateFlag) flagObj); - if (result == null && set.size() == 0) - return null; - return result == State.ALLOW; - } - return null; - } - - static Method legacy_getRegionManager = null; - static Method legacy_getApplicableRegions_Region = null; - static Method legacy_getApplicableRegions_Location = null; - static Constructor legacy_newProtectedCuboidRegion; - static Class legacy_blockVectorClazz; - static Constructor legacy_newblockVector; - - private static Boolean getBooleanFlagLegacy(Location l, Object flag) { - try { - // cache reflection methods - if (legacy_getRegionManager == null) { - legacy_getRegionManager = worldGuardPlugin.getClass() - .getDeclaredMethod("getRegionManager", org.bukkit.World.class); - legacy_getApplicableRegions_Region = RegionManager.class.getDeclaredMethod("getApplicableRegions", - Class.forName("com.sk89q.worldguard.protection.regions.ProtectedRegion")); - legacy_getApplicableRegions_Location = RegionManager.class.getDeclaredMethod("getApplicableRegions", - Location.class); - legacy_blockVectorClazz = Class.forName("com.sk89q.worldedit.BlockVector"); - legacy_newblockVector = legacy_blockVectorClazz.getConstructor(int.class, int.class, int.class); - legacy_newProtectedCuboidRegion = Class.forName("com.sk89q.worldguard.protection.regions.ProtectedCuboidRegion") - .getConstructor(String.class, legacy_blockVectorClazz, legacy_blockVectorClazz); - } - - // grab the applicable manager for this world - Object worldManager = (RegionManager) legacy_getRegionManager.invoke(worldGuardPlugin, l.getWorld()); - if (worldManager == null) - return null; - - // now look for any intersecting regions - ApplicableRegionSet set = (ApplicableRegionSet) legacy_getApplicableRegions_Region.invoke(worldManager, l); - - // so what's the verdict? - State result = set.queryState((RegionAssociable) null, (StateFlag) flag); - if (result == null && set.size() == 0) - return null; - return result == State.ALLOW; - - } catch (Exception ex) { - Bukkit.getServer().getLogger().log(Level.WARNING, "Could not grab flags from WorldGuard", ex); - } - return null; - } - - private static Boolean getBooleanFlagLegacy(Chunk c, Object flag) { - // ApplicableRegionSet and RegionManager have the same classpath as the current version - // ProtectedCuboidRegion uses a different constructor, though - try { - // cache reflection methods - if (legacy_getRegionManager == null) { - legacy_getRegionManager = worldGuardPlugin.getClass() - .getDeclaredMethod("getRegionManager", org.bukkit.World.class); - legacy_getApplicableRegions_Region = RegionManager.class.getDeclaredMethod("getApplicableRegions", - Class.forName("com.sk89q.worldguard.protection.regions.ProtectedRegion")); - legacy_getApplicableRegions_Location = RegionManager.class.getDeclaredMethod("getApplicableRegions", - Location.class); - legacy_blockVectorClazz = Class.forName("com.sk89q.worldedit.BlockVector"); - legacy_newblockVector = legacy_blockVectorClazz.getConstructor(int.class, int.class, int.class); - legacy_newProtectedCuboidRegion = Class.forName("com.sk89q.worldguard.protection.regions.ProtectedCuboidRegion") - .getConstructor(String.class, legacy_blockVectorClazz, legacy_blockVectorClazz); - } - - // grab the applicable manager for this world - Object worldManager = (RegionManager) legacy_getRegionManager.invoke(worldGuardPlugin, c.getWorld()); - if (worldManager == null) - return null; - - // Create a legacy ProtectedCuboidRegion - Object chunkRegion = legacy_newProtectedCuboidRegion.newInstance("__TEST__", - legacy_newblockVector.newInstance(c.getX() << 4, c.getWorld().getMaxHeight(), c.getZ() << 4), - legacy_newblockVector.newInstance((c.getX() << 4) + 15, 0, (c.getZ() << 4) + 15)); - - // now look for any intersecting regions - ApplicableRegionSet set = (ApplicableRegionSet) legacy_getApplicableRegions_Region.invoke(worldManager, chunkRegion); - - // so what's the verdict? - State result = set.queryState((RegionAssociable) null, (StateFlag) flag); - if (result == null && set.size() == 0) - return null; - return result == State.ALLOW; - - } catch (Exception ex) { - Bukkit.getServer().getLogger().log(Level.WARNING, "Could not grab flags from WorldGuard", ex); - } - return null; + init(); + return canHook ? WorldGuardFlagHandler.getBooleanFlag(c, flag) : null; } } diff --git a/src/main/java/com/songoda/core/library/hooks/hooks/WorldGuardFlagHandler.java b/src/main/java/com/songoda/core/library/hooks/hooks/WorldGuardFlagHandler.java new file mode 100644 index 00000000..a8aa4f9b --- /dev/null +++ b/src/main/java/com/songoda/core/library/hooks/hooks/WorldGuardFlagHandler.java @@ -0,0 +1,292 @@ +/** + * Hooks for adding a custom WorldGuard flag + * + * Note: Hooks must be added before WG loads! + */ +package com.songoda.core.library.hooks.hooks; + +import com.sk89q.worldedit.bukkit.BukkitAdapter; +import com.sk89q.worldedit.math.BlockVector3; +import com.sk89q.worldguard.WorldGuard; +import com.sk89q.worldguard.protection.ApplicableRegionSet; +import com.sk89q.worldguard.protection.association.RegionAssociable; +import com.sk89q.worldguard.protection.flags.Flag; +import com.sk89q.worldguard.protection.flags.StateFlag; +import com.sk89q.worldguard.protection.flags.StateFlag.State; +import com.sk89q.worldguard.protection.managers.RegionManager; +import com.sk89q.worldguard.protection.regions.ProtectedCuboidRegion; +import com.sk89q.worldguard.protection.regions.RegionContainer; +import com.sk89q.worldguard.protection.regions.RegionQuery; +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.util.HashMap; +import java.util.Map; +import java.util.logging.Level; +import java.util.stream.Stream; +import org.bukkit.Bukkit; +import org.bukkit.Chunk; +import org.bukkit.Location; + +public class WorldGuardFlagHandler { + + static Boolean wgPlugin = null; + static Object worldGuardPlugin; + static boolean legacy = false; + static boolean hooksInstalled = false; + static Map flags = new HashMap(); + + /** + * Attempt to register a worldGuard flag (ALLOW/DENY)
+ * Note: This must be called before WorldGuard loads, or it will fail. + * + * @param flag name of the flag to set + * @param state default value of the flag + */ + public static void addHook(String flag, boolean state) { + if (wgPlugin == null && (wgPlugin = (worldGuardPlugin = Bukkit.getPluginManager().getPlugin("WorldGuard")) != null)) { + try { + // if this class exists, we're on an older version + Class.forName("com.sk89q.worldguard.protection.flags.registry.SimpleFlagRegistry"); + legacy = true; + } catch (ClassNotFoundException ex) { + } + } + if (!wgPlugin) return; + + if (legacy) { + addLegacyHook(flag, state); + return; + } + + StateFlag addFlag = new StateFlag(flag, state); + try { + WorldGuard.getInstance().getFlagRegistry().register(addFlag); + flags.put(flag, addFlag); + } catch (Exception ex) { + Bukkit.getServer().getLogger().log(Level.WARNING, "Could not add flag {0} to WorldGuard", addFlag.getName()); + Flag wgFlag = (StateFlag) WorldGuard.getInstance().getFlagRegistry().get(addFlag.getName()); + if (wgFlag == null) { + wgPlugin = false; + Bukkit.getServer().getLogger().log(Level.WARNING, "Could not hook WorldGuard"); + } else { + flags.put(flag, wgFlag); + Bukkit.getServer().getLogger().log(Level.WARNING, "Loaded existing {1} {0}", new Object[] {wgFlag.getName(), wgFlag.getClass().getSimpleName()}); + } + } + } + + // reflection to add hooks + private static void addLegacyHook(String flag, boolean state) { + try { + // 6.0 has the same classpath for StateFlag as the current version does + // does this flag exist already? + Class defaultFlagClazz = Class.forName("com.sk89q.worldguard.protection.flags.DefaultFlag"); + Field flagField = defaultFlagClazz.getField("flagsList"); + Flag[] flagsOld = (Flag[]) flagField.get(null); + Flag wgFlag = Stream.of(flagsOld) + .filter(f -> ((Flag)f).getName().equalsIgnoreCase(flag)) + .findFirst().orElse(null); + if (wgFlag != null) { + // we already have one + flags.put(flag, wgFlag); + Bukkit.getServer().getLogger().log(Level.WARNING, "Loaded existing {1} {0}", new Object[] {wgFlag.getName(), wgFlag.getClass().getSimpleName()}); + return; + } + + // if not, we need to add one + wgFlag = new StateFlag(flag, state); + + // we need to sneak our flag into the array + // make a copy first + Flag[] flagsNew = new Flag[flagsOld.length + 1]; + System.arraycopy(flagsOld, 0, flagsNew, 0, flagsOld.length); + + // add ours + flagsNew[flagsNew.length - 1] = wgFlag; + + // and put the new list into place + setStaticField(flagField, flagsNew); + + // register this flag in the registry + Object flagRegistry = getPrivateField(worldGuardPlugin.getClass(), worldGuardPlugin, "flagRegistry"); + Class simpleFlagRegistryClazz = Class.forName("com.sk89q.worldguard.protection.flags.registry.SimpleFlagRegistry"); + Method registerSimpleFlagRegistry = simpleFlagRegistryClazz.getDeclaredMethod("register", Flag.class); + registerSimpleFlagRegistry.invoke(flagRegistry, wgFlag); + + // all good! + flags.put(flag, wgFlag); + } catch (Exception ex) { + //Bukkit.getServer().getLogger().log(Level.WARNING, "Failed to set legacy WorldGuard Flags", ex); + Bukkit.getServer().getLogger().log(Level.WARNING, "Could not add flag {0} to WorldGuard", flag); + Bukkit.getServer().getLogger().log(Level.WARNING, "Could not hook WorldGuard"); + wgPlugin = false; + } + } + + private static Object getPrivateField(Class c, Object handle, String fieldName) throws Exception { + Field field = c.getDeclaredField(fieldName); + field.setAccessible(true); + return field.get(handle); + } + + private static void setStaticField(Field field, Object value) throws Exception { + field.setAccessible(true); + Field modifier = Field.class.getDeclaredField("modifiers"); + modifier.setAccessible(true); + modifier.setInt(field, field.getModifiers() & ~Modifier.FINAL); + field.set(null, value); + } + + public static boolean isEnabled() { + return wgPlugin != null && wgPlugin; + } + + /** + * Checks this location to see what this flag is set to + * @param l location to check + * @param flag ALLOW/DENY flag to check + * @return flag state, or null if undefined + */ + public static Boolean getBooleanFlag(Location l, String flag) { + if (wgPlugin == null || !wgPlugin) return null; + Object flagObj = flags.get(flag); + // There's a different way to get this in the old version + if (legacy) + return flagObj == null ? null : getBooleanFlagLegacy(l, flagObj); + + // for convinience, we can load a flag if we don't know it + if (flagObj == null && !legacy) + flags.put(flag, flagObj = WorldGuard.getInstance().getFlagRegistry().get(flag)); + + // so, what's up? + if (flagObj instanceof StateFlag) { + RegionContainer container = WorldGuard.getInstance().getPlatform().getRegionContainer(); + RegionQuery query = container.createQuery(); + com.sk89q.worldedit.util.Location loc = BukkitAdapter.adapt(l); + return query.testState(loc, (RegionAssociable) null, (StateFlag) flagObj); + } + return null; + } + + /** + * Query all regions that are in or intersect this chunk + * @param c chunk to check for regions in + * @param flag ALLOW/DENY flag to check + * @return flag state, or null if undefined + */ + public static Boolean getBooleanFlag(Chunk c, String flag) { + if (wgPlugin == null || !wgPlugin) return null; + Object flagObj = flags.get(flag); + // There's a different way to get this in the old version + if (legacy) + return flagObj == null ? null : getBooleanFlagLegacy(c, flagObj); + + // for convinience, we can load a flag if we don't know it + if (flagObj == null) + flags.put(flag, flagObj = WorldGuard.getInstance().getFlagRegistry().get(flag)); + + // so, what's up? + if (flagObj instanceof StateFlag) { + RegionManager worldManager = WorldGuard.getInstance().getPlatform().getRegionContainer().get(BukkitAdapter.adapt(c.getWorld())); + if (worldManager == null) + return null; + ProtectedCuboidRegion chunkRegion = new ProtectedCuboidRegion("__TEST__", + BlockVector3.at(c.getX() << 4, c.getWorld().getMaxHeight(), c.getZ() << 4), + BlockVector3.at((c.getX() << 4) + 15, 0, (c.getZ() << 4) + 15)); + ApplicableRegionSet set = worldManager.getApplicableRegions(chunkRegion); + State result = set.queryState((RegionAssociable) null, (StateFlag) flagObj); + if (result == null && set.size() == 0) + return null; + return result == State.ALLOW; + } + return null; + } + + static Method legacy_getRegionManager = null; + static Method legacy_getApplicableRegions_Region = null; + static Method legacy_getApplicableRegions_Location = null; + static Constructor legacy_newProtectedCuboidRegion; + static Class legacy_blockVectorClazz; + static Constructor legacy_newblockVector; + + private static Boolean getBooleanFlagLegacy(Location l, Object flag) { + try { + // cache reflection methods + if (legacy_getRegionManager == null) { + legacy_getRegionManager = worldGuardPlugin.getClass() + .getDeclaredMethod("getRegionManager", org.bukkit.World.class); + legacy_getApplicableRegions_Region = RegionManager.class.getDeclaredMethod("getApplicableRegions", + Class.forName("com.sk89q.worldguard.protection.regions.ProtectedRegion")); + legacy_getApplicableRegions_Location = RegionManager.class.getDeclaredMethod("getApplicableRegions", + Location.class); + legacy_blockVectorClazz = Class.forName("com.sk89q.worldedit.BlockVector"); + legacy_newblockVector = legacy_blockVectorClazz.getConstructor(int.class, int.class, int.class); + legacy_newProtectedCuboidRegion = Class.forName("com.sk89q.worldguard.protection.regions.ProtectedCuboidRegion") + .getConstructor(String.class, legacy_blockVectorClazz, legacy_blockVectorClazz); + } + + // grab the applicable manager for this world + Object worldManager = (RegionManager) legacy_getRegionManager.invoke(worldGuardPlugin, l.getWorld()); + if (worldManager == null) + return null; + + // now look for any intersecting regions + ApplicableRegionSet set = (ApplicableRegionSet) legacy_getApplicableRegions_Region.invoke(worldManager, l); + + // so what's the verdict? + State result = set.queryState((RegionAssociable) null, (StateFlag) flag); + if (result == null && set.size() == 0) + return null; + return result == State.ALLOW; + + } catch (Exception ex) { + Bukkit.getServer().getLogger().log(Level.WARNING, "Could not grab flags from WorldGuard", ex); + } + return null; + } + + private static Boolean getBooleanFlagLegacy(Chunk c, Object flag) { + // ApplicableRegionSet and RegionManager have the same classpath as the current version + // ProtectedCuboidRegion uses a different constructor, though + try { + // cache reflection methods + if (legacy_getRegionManager == null) { + legacy_getRegionManager = worldGuardPlugin.getClass() + .getDeclaredMethod("getRegionManager", org.bukkit.World.class); + legacy_getApplicableRegions_Region = RegionManager.class.getDeclaredMethod("getApplicableRegions", + Class.forName("com.sk89q.worldguard.protection.regions.ProtectedRegion")); + legacy_getApplicableRegions_Location = RegionManager.class.getDeclaredMethod("getApplicableRegions", + Location.class); + legacy_blockVectorClazz = Class.forName("com.sk89q.worldedit.BlockVector"); + legacy_newblockVector = legacy_blockVectorClazz.getConstructor(int.class, int.class, int.class); + legacy_newProtectedCuboidRegion = Class.forName("com.sk89q.worldguard.protection.regions.ProtectedCuboidRegion") + .getConstructor(String.class, legacy_blockVectorClazz, legacy_blockVectorClazz); + } + + // grab the applicable manager for this world + Object worldManager = (RegionManager) legacy_getRegionManager.invoke(worldGuardPlugin, c.getWorld()); + if (worldManager == null) + return null; + + // Create a legacy ProtectedCuboidRegion + Object chunkRegion = legacy_newProtectedCuboidRegion.newInstance("__TEST__", + legacy_newblockVector.newInstance(c.getX() << 4, c.getWorld().getMaxHeight(), c.getZ() << 4), + legacy_newblockVector.newInstance((c.getX() << 4) + 15, 0, (c.getZ() << 4) + 15)); + + // now look for any intersecting regions + ApplicableRegionSet set = (ApplicableRegionSet) legacy_getApplicableRegions_Region.invoke(worldManager, chunkRegion); + + // so what's the verdict? + State result = set.queryState((RegionAssociable) null, (StateFlag) flag); + if (result == null && set.size() == 0) + return null; + return result == State.ALLOW; + + } catch (Exception ex) { + Bukkit.getServer().getLogger().log(Level.WARNING, "Could not grab flags from WorldGuard", ex); + } + return null; + } +}