From bc109013f364cbc943b406b6c88b2717996bd24f Mon Sep 17 00:00:00 2001 From: stijnb1234 Date: Thu, 21 May 2020 21:31:34 +0200 Subject: [PATCH] Fixed region selector --- MCTPAudio.iml | 20 +- src/me/mctp/MCTPAudioCmd.java | 11 +- src/me/mctp/Main.java | 18 ++ src/me/mctp/listener/WGListener.java | 14 + src/me/mctp/managers/WGManager.java | 295 ++++++++++++++++++++ src/me/mctp/utils/SpigotPlayerSelector.java | 11 +- src/plugin.yml | 1 + 7 files changed, 366 insertions(+), 4 deletions(-) create mode 100644 src/me/mctp/managers/WGManager.java diff --git a/MCTPAudio.iml b/MCTPAudio.iml index 88ba95d..bb5f66f 100644 --- a/MCTPAudio.iml +++ b/MCTPAudio.iml @@ -32,7 +32,25 @@ - + + + + + + + + + + + + + + + + + + + diff --git a/src/me/mctp/MCTPAudioCmd.java b/src/me/mctp/MCTPAudioCmd.java index 5be96dc..e06e969 100644 --- a/src/me/mctp/MCTPAudioCmd.java +++ b/src/me/mctp/MCTPAudioCmd.java @@ -134,7 +134,16 @@ public class MCTPAudioCmd implements CommandExecutor { return true; } else if (args.length == 3 && args[0].equalsIgnoreCase("setregion")) { String regionName = args[1]; - String url = args[1]; + String url = args[2]; + + Main.getPlugin().getConfig().set("Regions." + regionName, url); + Main.getPlugin().saveConfig(); + + sender.sendMessage(prefix + "De region zal vanaf nu muziek afspelen."); + return true; + } else if (args.length == 3 && args[0].equalsIgnoreCase("sethueregion")) { + String regionName = args[1]; + String url = args[2]; Main.getPlugin().getConfig().set("Regions." + regionName, url); Main.getPlugin().saveConfig(); diff --git a/src/me/mctp/Main.java b/src/me/mctp/Main.java index b41d9f8..0edbcf3 100644 --- a/src/me/mctp/Main.java +++ b/src/me/mctp/Main.java @@ -2,6 +2,7 @@ package me.mctp; import me.mctp.listener.LogoutListener; import me.mctp.listener.WGListener; +import me.mctp.managers.WGManager; import me.mctp.socket.Client; import org.bukkit.Bukkit; import org.bukkit.ChatColor; @@ -21,6 +22,12 @@ public class Main extends JavaPlugin implements Listener { Bukkit.getLogger().info(prefix + "loading..."); + if (!setupPlugins()) { + Bukkit.getLogger().severe(String.format("[%s] Disabled due to no WorldGuard dependency found!", getDescription().getName())); + getServer().getPluginManager().disablePlugin(this); + return; + } + getConfig().addDefault("Regions.demosound", "https://audiopagina.mcthemeparks.eu/gallery/voletarium.mp3"); getConfig().options().copyDefaults(true); saveConfig(); @@ -50,6 +57,17 @@ public class Main extends JavaPlugin implements Listener { Bukkit.getLogger().info(prefix + "successfully disabled!"); } + private boolean setupPlugins() { + if (hasWorldGuardOnServer()) { + WGManager.setWorldGuard(getServer().getPluginManager().getPlugin("WorldGuard")); + return true; + } + return false; + } + private static boolean hasWorldGuardOnServer() { + return Bukkit.getPluginManager().getPlugin("WorldGuard") != null; + } + public static Plugin getPlugin() { return pl; } diff --git a/src/me/mctp/listener/WGListener.java b/src/me/mctp/listener/WGListener.java index 83baecb..6460cf7 100644 --- a/src/me/mctp/listener/WGListener.java +++ b/src/me/mctp/listener/WGListener.java @@ -17,6 +17,7 @@ public class WGListener implements Listener { @EventHandler public void onRegionEnter(RegionsEnteredEvent e) { Set list = Main.getPlugin().getConfig().getConfigurationSection("Regions").getKeys(false); + Set list2 = Main.getPlugin().getConfig().getConfigurationSection("HueRegions").getKeys(false); if (!Collections.disjoint(list, e.getRegionsNames())) { //One element is the same -> In a region @@ -34,11 +35,18 @@ public class WGListener implements Listener { data.put("uuid", e.getPlayer().getUniqueId().toString().replace("-", "")); Main.getClient().sendData(data); } + + if (!Collections.disjoint(list2, e.getRegionsNames())) { + //One element is the same -> In a region + + //TODO Add hue support + } } @EventHandler public void onRegionExit(RegionsLeftEvent e) { Set list = Main.getPlugin().getConfig().getConfigurationSection("Regions").getKeys(false); + Set list2 = Main.getPlugin().getConfig().getConfigurationSection("HueRegions").getKeys(false); if (!Collections.disjoint(list, e.getRegionsNames())) { //One element is the same -> In a region @@ -51,5 +59,11 @@ public class WGListener implements Listener { data.put("uuid", e.getPlayer().getUniqueId().toString().replace("-", "")); Main.getClient().sendData(data); } + + if (!Collections.disjoint(list2, e.getRegionsNames())) { + //One element is the same -> In a region + + //TODO Add hue support + } } } diff --git a/src/me/mctp/managers/WGManager.java b/src/me/mctp/managers/WGManager.java new file mode 100644 index 0000000..b2a2049 --- /dev/null +++ b/src/me/mctp/managers/WGManager.java @@ -0,0 +1,295 @@ +package me.mctp.managers; + +import com.sk89q.worldedit.IncompleteRegionException; +import com.sk89q.worldedit.LocalSession; +import com.sk89q.worldedit.WorldEdit; +import com.sk89q.worldedit.bukkit.BukkitAdapter; +import com.sk89q.worldedit.bukkit.WorldEditPlugin; +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.domains.DefaultDomain; +import com.sk89q.worldguard.protection.ApplicableRegionSet; +import com.sk89q.worldguard.protection.flags.Flags; +import com.sk89q.worldguard.protection.flags.RegionGroup; +import com.sk89q.worldguard.protection.flags.StateFlag.State; +import com.sk89q.worldguard.protection.managers.RegionManager; +import com.sk89q.worldguard.protection.managers.storage.StorageException; +import com.sk89q.worldguard.protection.regions.ProtectedCuboidRegion; +import com.sk89q.worldguard.protection.regions.ProtectedPolygonalRegion; +import com.sk89q.worldguard.protection.regions.ProtectedRegion; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.OfflinePlayer; +import org.bukkit.World; +import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.UUID; + +/** + * WorldGuard class to make the usage of WorldGuard easy. This is the 1.14.x version! + * + * Note that if you do use this in one of your projects, leave this notice. + * Please do credit me if you do use this in one of your projects. + * + * @author SBDeveloper [Fixed 1.13+ support] + */ +public class WGManager { + + public static WorldGuardPlugin wgp; + public static WorldEditPlugin wep; + + public static boolean hasWorldGuard() { + return wgp != null; + } + + public static boolean hasWorldEdit() { + return wep != null; + } + + public static boolean setWorldGuard(Plugin plugin) { + wgp = (WorldGuardPlugin) plugin; + return true; + } + + public static boolean setWorldEdit(Plugin plugin) { + wep = (WorldEditPlugin) plugin; + return true; + } + + public static ProtectedRegion createRegion(Player p, String id) throws StorageException { + LocalSession l = WorldEdit.getInstance().getSessionManager().get(BukkitAdapter.adapt(p)); + Region s; + try { + s = l.getSelection(l.getSelectionWorld()); + } catch (IncompleteRegionException e) { + return null; + } + RegionManager rm = WorldGuard.getInstance().getPlatform().getRegionContainer().get(BukkitAdapter.adapt(p.getWorld())); + rm.removeRegion(id); + ProtectedRegion region; + // Detect the type of region from WorldEdit + if (s instanceof Polygonal2DRegion) { + Polygonal2DRegion polySel = (Polygonal2DRegion) s; + int minY = polySel.getMinimumY(); + int maxY = polySel.getMaximumY(); + region = new ProtectedPolygonalRegion(id, polySel.getPoints(), minY, maxY); + } else { /// default everything to cuboid + region = new ProtectedCuboidRegion(id, + s.getMinimumPoint(), + s.getMaximumPoint()); + } + region.setPriority(11); /// some relatively high priority + region.setFlag(Flags.INTERACT, State.DENY); + region.setFlag(Flags.INTERACT.getRegionGroupFlag(), RegionGroup.NON_MEMBERS); + rm.addRegion(region); + rm.save(); + return region; + } + + public static ArrayList getRegionsIn(Location loc) { + ArrayList inRegions = new ArrayList<>(); + + RegionManager rm = WorldGuard.getInstance().getPlatform().getRegionContainer().get(BukkitAdapter.adapt(loc.getWorld())); + + for (ProtectedRegion protectedRegion : rm.getApplicableRegions(BukkitAdapter.asBlockVector(loc))) inRegions.add(protectedRegion); + + return inRegions; + } + + public static ProtectedRegion getRegionfromStringList(List str, Location loc) { + RegionManager rm = WorldGuard.getInstance().getPlatform().getRegionContainer().get(BukkitAdapter.adapt(loc.getWorld())); + ApplicableRegionSet mogreg = rm.getApplicableRegions(BukkitAdapter.asBlockVector(loc)); + for (ProtectedRegion mogregion : mogreg) { + for (String strgo : str) { + if(strgo.equalsIgnoreCase(mogregion.getId())) { + return mogregion; + } + } + } + + //Niks gevonden! + return null; + } + + public static ProtectedRegion getRegionfromString(String str, Location loc) { + RegionManager rm = WorldGuard.getInstance().getPlatform().getRegionContainer().get(BukkitAdapter.adapt(loc.getWorld())); + ApplicableRegionSet mogreg = rm.getApplicableRegions(BukkitAdapter.asBlockVector(loc)); + for (ProtectedRegion mogregion : mogreg) { + if(str.equalsIgnoreCase(mogregion.getId())) { + return mogregion; + } + } + + //Niks gevonden! + return null; + } + + public static ProtectedRegion getRegionfromStringListInWorld(List str, Location loc) { + RegionManager rm = WorldGuard.getInstance().getPlatform().getRegionContainer().get(BukkitAdapter.adapt(loc.getWorld())); + Map mp = rm.getRegions(); + for (Entry pair : mp.entrySet()) { + for (String string : str) { + if (pair.getValue().getId().equals(string)) { + return pair.getValue(); + } + } + } + + //Niks gevonden! + return null; + } + + public static ProtectedRegion getRegionfromStringInWorld(String str, Location loc) { + String strgood = str.toLowerCase(); + RegionManager rm = WorldGuard.getInstance().getPlatform().getRegionContainer().get(BukkitAdapter.adapt(loc.getWorld())); + Map mp = rm.getRegions(); + return mp.get(strgood); + } + + public static boolean isMember(Player p, ProtectedRegion region, OfflinePlayer target) { + World w = p.getWorld(); + RegionManager rm = WorldGuard.getInstance().getPlatform().getRegionContainer().get(BukkitAdapter.adapt(w)); + + ProtectedRegion currentRegion = rm.getRegion(region.getId()); + DefaultDomain currentMembers = currentRegion.getMembers(); + return currentMembers.contains(target.getUniqueId()); + } + + public static boolean isOwner(Player p, ProtectedRegion region, OfflinePlayer target) { + World w = p.getWorld(); + RegionManager rm = WorldGuard.getInstance().getPlatform().getRegionContainer().get(BukkitAdapter.adapt(w)); + + ProtectedRegion currentRegion = rm.getRegion(region.getId()); + DefaultDomain currentOwners = currentRegion.getOwners(); + return currentOwners.contains(target.getUniqueId()); + } + + public static boolean addMember(Player p, ProtectedRegion region, OfflinePlayer newmember) { + try { + World w = p.getWorld(); + RegionManager rm = WorldGuard.getInstance().getPlatform().getRegionContainer().get(BukkitAdapter.adapt(w)); + + ProtectedRegion currentRegion = rm.getRegion(region.getId()); + DefaultDomain currentMembers = currentRegion.getMembers(); + currentMembers.addPlayer(UUID.fromString(newmember.getUniqueId().toString())); + + rm.save(); + + return true; + } + catch (StorageException e) { + return false; + } + } + + public static boolean addOwner(Player p, ProtectedRegion region, OfflinePlayer newowner) { + try { + World w = p.getWorld(); + RegionManager rm = WorldGuard.getInstance().getPlatform().getRegionContainer().get(BukkitAdapter.adapt(w)); + + ProtectedRegion currentRegion = rm.getRegion(region.getId()); + DefaultDomain currentOwners = currentRegion.getOwners(); + currentOwners.addPlayer(UUID.fromString(newowner.getUniqueId().toString())); + + rm.save(); + + return true; + } + catch (StorageException e) { + return false; + } + } + + public static boolean removeMember(Player p, ProtectedRegion region, OfflinePlayer newmember) { + try { + World w = p.getWorld(); + RegionManager rm = WorldGuard.getInstance().getPlatform().getRegionContainer().get(BukkitAdapter.adapt(w)); + + ProtectedRegion currentRegion = rm.getRegion(region.getId()); + DefaultDomain currentMembers = currentRegion.getMembers(); + currentMembers.removePlayer(UUID.fromString(newmember.getUniqueId().toString())); + + rm.save(); + + return true; + } + catch (StorageException e) { + return false; + } + } + + public static boolean removeOwner(Player p, ProtectedRegion region, UUID newowner) { + try { + World w = p.getWorld(); + RegionManager rm = WorldGuard.getInstance().getPlatform().getRegionContainer().get(BukkitAdapter.adapt(w)); + + ProtectedRegion currentRegion = rm.getRegion(region.getId()); + DefaultDomain currentOwners = currentRegion.getOwners(); + currentOwners.removePlayer(newowner); + + rm.save(); + + return true; + } + catch (StorageException e) { + return false; + } + } + + public static ArrayList getMembers(Player p, ProtectedRegion region) { + World w = p.getWorld(); + RegionManager rm = WorldGuard.getInstance().getPlatform().getRegionContainer().get(BukkitAdapter.adapt(w)); + + ProtectedRegion currentRegion = rm.getRegion(region.getId()); + DefaultDomain currentMembers = currentRegion.getMembers(); + + ArrayList members = new ArrayList<>(); + for (UUID uuid : currentMembers.getUniqueIds()) { + OfflinePlayer member = Bukkit.getServer().getOfflinePlayer(uuid); + members.add(member.getName()); + } + return members; + } + + public static ArrayList getOwners(Player p, ProtectedRegion region) { + World w = p.getWorld(); + RegionManager rm = WorldGuard.getInstance().getPlatform().getRegionContainer().get(BukkitAdapter.adapt(w)); + + ProtectedRegion currentRegion = rm.getRegion(region.getId()); + DefaultDomain currentOwners = currentRegion.getOwners(); + + ArrayList owners = new ArrayList<>(); + for (UUID uuid : currentOwners.getUniqueIds()) { + OfflinePlayer owner = Bukkit.getServer().getOfflinePlayer(uuid); + owners.add(owner.getName()); + } + return owners; + } + + public static boolean removeRegion(Player p, String name) { + try { + World w = p.getWorld(); + RegionManager rm = WorldGuard.getInstance().getPlatform().getRegionContainer().get(BukkitAdapter.adapt(w)); + + ProtectedRegion currentRegion = rm.getRegion(name); + if (currentRegion == null) { + return false; + } + + rm.removeRegion(name); + rm.save(); + + return true; + } + catch (StorageException e) { + return false; + } + } +} \ No newline at end of file diff --git a/src/me/mctp/utils/SpigotPlayerSelector.java b/src/me/mctp/utils/SpigotPlayerSelector.java index d51078b..f93ba8d 100644 --- a/src/me/mctp/utils/SpigotPlayerSelector.java +++ b/src/me/mctp/utils/SpigotPlayerSelector.java @@ -1,5 +1,7 @@ package me.mctp.utils; +import com.sk89q.worldguard.protection.regions.ProtectedRegion; +import me.mctp.managers.WGManager; import org.bukkit.Bukkit; import org.bukkit.Location; @@ -66,8 +68,13 @@ public class SpigotPlayerSelector { Location standPoint = getLocation(commandSender); if (getArgument("region").length() != 0) { - //TODO FIX REGION SELECTOR - throw new UnsupportedOperationException("The region argument is not supported."); + String regionID = getArgument("region"); + for (Player p : Bukkit.getOnlinePlayers()) { + ArrayList regions = WGManager.getRegionsIn(p.getLocation()); + if (regions.stream().anyMatch(region -> region.getId().equalsIgnoreCase(regionID))) { + players.add(p); + } + } } else if (getArgument("r").length() != 0) { int radius = Integer.parseInt(getArgument("r")); players.addAll(Bukkit.getOnlinePlayers().stream() diff --git a/src/plugin.yml b/src/plugin.yml index bb3e8b3..5410f17 100644 --- a/src/plugin.yml +++ b/src/plugin.yml @@ -4,6 +4,7 @@ version: 1.0 api-version: 1.14 author: MaybeFromNL_SBDeveloper description: Copyright MaybeFromNL & SBDeveloper +depend: ['WorldGuard'] commands: mctpaudio: