From fdb22ab8b5ce428d6c1b3edd394bece4a67c4a77 Mon Sep 17 00:00:00 2001 From: JOO200 Date: Sun, 12 Dec 2021 21:42:59 +0100 Subject: [PATCH] feat: Added WorldEdit Integration * New config option to enable WorldEdit integration * New command "/portal we-selection " to select the Portal as WorldEdit selection * When enabled: Create portals with WorldEdit selections, disable AdvancedPortal's Wand --- build.gradle | 2 + .../bukkit/AdvancedPortalsCommand.java | 546 ++++++++++-------- .../bukkit/AdvancedPortalsPlugin.java | 11 + .../advancedportals/bukkit/Settings.java | 11 +- .../bukkit/config/ConfigHelper.java | 1 + .../bukkit/listeners/Listeners.java | 73 +-- .../bukkit/util/WorldEditIntegration.java | 47 ++ src/main/resources/config.yml | 4 + src/main/resources/plugin.yml | 4 + 9 files changed, 420 insertions(+), 279 deletions(-) create mode 100644 src/main/java/com/sekwah/advancedportals/bukkit/util/WorldEditIntegration.java diff --git a/build.gradle b/build.gradle index 1b143a7..768403a 100644 --- a/build.gradle +++ b/build.gradle @@ -79,6 +79,7 @@ repositories { maven { url "https://oss.sonatype.org/content/repositories/snapshots/" } maven { url "https://nexus.velocitypowered.com/repository/maven-public/" } maven { url 'https://papermc.io/repo/repository/maven-public/' } + maven { url 'https://maven.enginehub.org/repo/' } // WorldEdit } // includeLibs just says to include the library in the final jar @@ -94,6 +95,7 @@ dependencies { implementation "io.netty:netty-all:4.1.71.Final" compileOnly 'com.destroystokyo.paper:paper-api:1.16.5-R0.1-SNAPSHOT' + implementation "com.sk89q.worldedit:worldedit-bukkit:7.2.6" //compile fileTree(dir: 'libs', include: ['*.jar']) } diff --git a/src/main/java/com/sekwah/advancedportals/bukkit/AdvancedPortalsCommand.java b/src/main/java/com/sekwah/advancedportals/bukkit/AdvancedPortalsCommand.java index dd7772a..d20ef4b 100644 --- a/src/main/java/com/sekwah/advancedportals/bukkit/AdvancedPortalsCommand.java +++ b/src/main/java/com/sekwah/advancedportals/bukkit/AdvancedPortalsCommand.java @@ -6,6 +6,7 @@ import com.sekwah.advancedportals.bukkit.config.ConfigAccessor; import com.sekwah.advancedportals.bukkit.listeners.Listeners; import com.sekwah.advancedportals.bukkit.portals.AdvancedPortal; import com.sekwah.advancedportals.bukkit.portals.Portal; +import com.sekwah.advancedportals.bukkit.util.WorldEditIntegration; import net.md_5.bungee.api.ChatColor; import net.md_5.bungee.api.chat.*; import org.bukkit.*; @@ -120,6 +121,11 @@ public class AdvancedPortalsCommand implements CommandExecutor, TabCompleter { break; case "wand": case "selector": + if (plugin.isWorldEditActive()) { + sender.sendMessage(PluginMessages.customPrefix + + " Use the WorldEdit wand to select stuff. Checkout //wand."); + return true; + } String ItemID = config.getConfig().getString("AxeItemId"); Material WandMaterial = Material.getMaterial(ItemID); @@ -187,244 +193,7 @@ public class AdvancedPortalsCommand implements CommandExecutor, TabCompleter { PluginMessages.customPrefix + " You have been given a \u00A7ePortal Block\u00A7a!"); break; case "create": - if (player.hasMetadata("Pos1World") && player.hasMetadata("Pos2World")) { - if (player.getMetadata("Pos1World").get(0).asString() - .equals(player.getMetadata("Pos2World").get(0).asString()) - && player.getMetadata("Pos1World").get(0).asString() - .equals(player.getLocation().getWorld().getName())) { - if (args.length >= 2) { // may make this next piece of code more efficient, maybe check - // against a list of available variables or something - // TODO change system to use arrays and hashmaps - boolean hasName = false; - boolean hasTriggerBlock = false; - boolean hasDestination = false; - boolean isBungeePortal = false; - boolean needsPermission = false; - boolean executesCommand = false; - String destination = null; - String portalName = null; - String triggerBlock = null; - String serverName = null; - String permission = null; - String portalCommand = null; - - ArrayList extraData = new ArrayList<>(); - - // Is completely changed in the recode but for now im leaving it as this - // horrible mess... - for (int i = 1; i < args.length; i++) { - if (startsWithPortalArg("name:", args[i])) { - portalName = args[i].replaceFirst("name:", ""); - if (portalName.equals("")) { - player.sendMessage(PluginMessages.customPrefixFail - + " You must include a name for the portal that isnt nothing!"); - return true; - } - hasName = true; - portalName = args[i].replaceFirst("name:", ""); - } else if (startsWithPortalArg("destination:", args[i])) { - hasDestination = true; - destination = args[i].toLowerCase().replaceFirst("destination:", ""); - } else if (startsWithPortalArg("desti:", args[i])) { - hasDestination = true; - destination = args[i].toLowerCase().replaceFirst("desti:", ""); - } else if (startsWithPortalArg("triggerblock:", args[i])) { - hasTriggerBlock = true; - triggerBlock = args[i].toLowerCase().replaceFirst("triggerblock:", ""); - } else if (this.startsWithPortalArg("bungee:", args[i])) { - isBungeePortal = true; - serverName = args[i].substring("bungee:".length()); - } else if (startsWithPortalArg("permission:", args[i])) { - needsPermission = true; - permission = args[i].toLowerCase().replaceFirst("permission:", ""); - extraData.add(new PortalArg("permission", permission)); - } else if (startsWithPortalArg("delayed:", args[i])) { - boolean delayed = Boolean - .parseBoolean(args[i].toLowerCase().replaceFirst("delayed:", "")); - extraData.add(new PortalArg("delayed", Boolean.toString(delayed))); - } else if (startsWithPortalArg("message:", args[i])) { - String message = parseArgVariable(args, i, "message:"); - if (message == null) { - player.sendMessage( - PluginMessages.customPrefixFail + " Message quotes not closed!"); - return true; - } - extraData.add(new PortalArg("message", message)); - } else if (startsWithPortalArg("command:", args[i])) { - executesCommand = true; - portalCommand = parseArgVariable(args, i, "command:"); - if (portalCommand == null) { - player.sendMessage( - PluginMessages.customPrefixFail + " Command quotes not closed!"); - return true; - } - i += this.portalArgsStringLength - 1; - if (portalCommand.startsWith("#") - && !(this.plugin.getSettings().enabledCommandLevel("c") - && (sender.hasPermission( - "advancedportals.createportal.commandlevel.console") - || sender.isOp()))) { - player.sendMessage(PluginMessages.customPrefixFail - + " You need permission to make a console command portal!"); - return true; - } else if (portalCommand.startsWith("!") - && !(this.plugin.getSettings().enabledCommandLevel("o") - && (sender.hasPermission( - "advancedportals.createportal.commandlevel.op") - || sender.isOp()))) { - player.sendMessage(PluginMessages.customPrefixFail - + " You need permission to make a op command portal!"); - return true; - } else if (portalCommand.startsWith("%") - && !(this.plugin.getSettings().enabledCommandLevel("b") - && (sender.hasPermission( - "advancedportals.createportal.commandlevel.bungee") - || sender.isOp()))) { - player.sendMessage(PluginMessages.customPrefixFail - + " You need permission to make a bungee command portal!"); - return true; - } else if (portalCommand.startsWith("^") - && !(this.plugin.getSettings().enabledCommandLevel("p") - && (sender.hasPermission( - "advancedportals.createportal.commandlevel.perms") - || sender.isOp()))) { - player.sendMessage(PluginMessages.customPrefixFail - + " You need permission to make a all perms command portal!"); - return true; - } - extraData.add(new PortalArg("command.1", portalCommand)); - } else if (startsWithPortalArg("cooldowndelay:", args[i])) { - String cooldownDelay = parseArgVariable(args, i, "cooldowndelay:"); - extraData.add(new PortalArg("cooldowndelay", cooldownDelay)); - } else if (startsWithPortalArg("leavedesti:", args[i])) { - String leaveDesti = parseArgVariable(args, i, "leavedesti:"); - extraData.add(new PortalArg("leavedesti", leaveDesti)); - } else if (startsWithPortalArg("particlein:", args[i])) { - String value = parseArgVariable(args, i, "particlein:"); - extraData.add(new PortalArg("particlein", value)); - } else if (startsWithPortalArg("particleout:", args[i])) { - String value = parseArgVariable(args, i, "particleout:"); - extraData.add(new PortalArg("particleout", value)); - } - } - if (!hasName) { - player.sendMessage(PluginMessages.customPrefixFail - + " You must include a name for the portal that you are creating in the variables!"); - return true; - } - - World world = org.bukkit.Bukkit - .getWorld(player.getMetadata("Pos1World").get(0).asString()); - Location pos1 = new Location(world, player.getMetadata("Pos1X").get(0).asInt(), - player.getMetadata("Pos1Y").get(0).asInt(), - player.getMetadata("Pos1Z").get(0).asInt()); - Location pos2 = new Location(world, player.getMetadata("Pos2X").get(0).asInt(), - player.getMetadata("Pos2Y").get(0).asInt(), - player.getMetadata("Pos2Z").get(0).asInt()); - - ConfigAccessor desticonfig = new ConfigAccessor(plugin, "destinations.yml"); - String destiPosX = desticonfig.getConfig().getString(destination + ".pos.X"); - - if (!Portal.portalExists(portalName)) { - - player.sendMessage(""); - player.sendMessage(PluginMessages.customPrefix - + "\u00A7e You have created a new portal with the following details:"); - player.sendMessage("\u00A7aname: \u00A7e" + portalName); - if (hasDestination) { - if (!isBungeePortal && destiPosX == null) { - player.sendMessage("\u00A7cdestination: \u00A7e" + destination - + " (destination does not exist)"); - return true; - } else { - player.sendMessage("\u00A7adestination: \u00A7e" + destination); - } - - } else { - player.sendMessage( - "\u00A7cdestination: \u00A7eN/A (will not teleport to a location)"); - } - - if (isBungeePortal) { - player.sendMessage("\u00A7abungee: \u00A7e" + serverName); - } - - if (needsPermission) { - player.sendMessage("\u00A7apermission: \u00A7e" + permission); - } else { - player.sendMessage("\u00A7apermission: \u00A7e(none needed)"); - } - - for (PortalArg portalArg : extraData) { - if (!ignoreExtras.contains(portalArg.argName)) { - player.sendMessage( - "\u00A7a" + portalArg.argName + ": \u00A7e" + portalArg.value); - } - } - - if (executesCommand) { - player.sendMessage("\u00A7acommand: \u00A7e" + portalCommand); - } - - if (hasTriggerBlock) { - Set materialSet = Portal - .getMaterialSet(triggerBlock.toUpperCase().split(",")); - if (materialSet.size() != 0) { - player.sendMessage( - "\u00A7atriggerBlock: \u00A7e" + triggerBlock.toUpperCase()); - PortalArg[] portalArgs = new PortalArg[extraData.size()]; - portalArgs = extraData.toArray(portalArgs); - player.sendMessage(Portal.create(pos1, pos2, portalName, destination, - materialSet, serverName, portalArgs)); - if(materialSet.contains(Material.END_GATEWAY)) { - AdvancedPortal portal = Portal.getPortal(portalName); - if(portal != null) { - disableBeacons(portal); - } - } - } else { - ConfigAccessor Config = new ConfigAccessor(plugin, "config.yml"); - player.sendMessage("\u00A7ctriggerBlock: \u00A7edefault(" - + Config.getConfig().getString("DefaultPortalTriggerBlock") + ")"); - - player.sendMessage("\u00A7c" + triggerBlock.toUpperCase() - + " no valid blocks were listed so the default has been set."); - PortalArg[] portalArgs = new PortalArg[extraData.size()]; - portalArgs = extraData.toArray(portalArgs); - player.sendMessage(Portal.create(pos1, pos2, portalName, destination, - serverName, portalArgs)); - } - } else { - ConfigAccessor Config = new ConfigAccessor(plugin, "config.yml"); - player.sendMessage("\u00A7atriggerBlock: \u00A7edefault(" - + Config.getConfig().getString("DefaultPortalTriggerBlock") + ")"); - PortalArg[] portalArgs = new PortalArg[extraData.size()]; - portalArgs = extraData.toArray(portalArgs); - player.sendMessage(Portal.create(pos1, pos2, portalName, destination, - serverName, portalArgs)); - } - } else { - sender.sendMessage( - PluginMessages.customPrefixFail + " A portal by that name already exists!"); - } - - // add code to save the portal to the portal config and reload the portals - - player.sendMessage(""); - } else { - player.sendMessage(PluginMessages.customPrefixFail - + " You need to at least add the name of the portal as a variable, \u00A7cType \u00A7e/portal variables\u00A7c" - + " for a full list of currently available variables and an example command!"); - } - } else { - player.sendMessage(PluginMessages.customPrefixFail - + " The points you have selected need to be in the same world!"); - } - } else { - player.sendMessage(PluginMessages.customPrefixFail - + " You need to have two points selected to make a portal!"); - } - break; + return createPortalRequest(player, args); case "variables": sender.sendMessage( PluginMessages.customPrefix + @@ -666,6 +435,24 @@ public class AdvancedPortalsCommand implements CommandExecutor, TabCompleter { } } break; + case "we-selection": + if (!Bukkit.getPluginManager().isPluginEnabled("WorldEdit")) { + player.sendMessage(PluginMessages.customPrefixFail + " WorldEdit is not enabled."); + return true; + } + if (args.length <= 1) { + player.sendMessage(PluginMessages.customPrefixFail + " Specify a portal name!"); + return true; + } + AdvancedPortal wePortal = Portal.getPortal(args[1]); + if (wePortal == null) { + sender.sendMessage(PluginMessages.customPrefixFail + " No portal by that name exists!"); + return true; + } + WorldEditIntegration.explainRegion(player, wePortal.getPos1(), wePortal.getPos2()); + player.sendMessage(PluginMessages.customPrefix + + " The portal has been selected with worldedit!"); + break; case "reload": sender.sendMessage(PluginMessages.customPrefix + " Reloaded values!"); Listeners.reloadValues(plugin); @@ -719,6 +506,272 @@ public class AdvancedPortalsCommand implements CommandExecutor, TabCompleter { } } + private boolean checkValidSelection(Player player) { + if (plugin.isWorldEditActive()) { + if (!WorldEditIntegration.validateSelection(player)) { + player.sendMessage(PluginMessages.customPrefixFail + + " Your WorldEdit selection is invalid!"); + return false; + } + } else { + if (!player.hasMetadata("Pos1World") || !player.hasMetadata("Pos2World")) { + player.sendMessage(PluginMessages.customPrefixFail + + " You need to have two points selected to make a portal!"); + return false; + } + if (player.getMetadata("Pos1World").get(0).asString() + .equals(player.getMetadata("Pos2World").get(0).asString()) + && player.getMetadata("Pos1World").get(0).asString() + .equals(player.getLocation().getWorld().getName())) { + player.sendMessage(PluginMessages.customPrefixFail + + " The points you have selected need to be in the same world!"); + return false; + } + } + return true; + } + + private boolean createPortalRequest(Player player, String[] args) { + if (!checkValidSelection(player)) { + return true; + } + + if (args.length < 2) { + player.sendMessage(PluginMessages.customPrefixFail + + " You need to at least add the name of the portal as a variable, \u00A7cType \u00A7e/portal variables\u00A7c" + + " for a full list of currently available variables and an example command!"); + return true; + } + + // may make this next piece of code more efficient, maybe check + // against a list of available variables or something + // TODO change system to use arrays and hashmaps + boolean hasName = false; + boolean hasTriggerBlock = false; + boolean hasDestination = false; + boolean isBungeePortal = false; + boolean needsPermission = false; + boolean executesCommand = false; + String destination = null; + String portalName = null; + String triggerBlock = null; + String serverName = null; + String permission = null; + String portalCommand = null; + + ArrayList extraData = new ArrayList<>(); + + // Is completely changed in the recode but for now im leaving it as this + // horrible mess... + for (int i = 1; i < args.length; i++) { + if (startsWithPortalArg("name:", args[i])) { + portalName = args[i].replaceFirst("name:", ""); + if (portalName.equals("")) { + player.sendMessage(PluginMessages.customPrefixFail + + " You must include a name for the portal that isnt nothing!"); + return true; + } + hasName = true; + portalName = args[i].replaceFirst("name:", ""); + } else if (startsWithPortalArg("destination:", args[i])) { + hasDestination = true; + destination = args[i].toLowerCase().replaceFirst("destination:", ""); + } else if (startsWithPortalArg("desti:", args[i])) { + hasDestination = true; + destination = args[i].toLowerCase().replaceFirst("desti:", ""); + } else if (startsWithPortalArg("triggerblock:", args[i])) { + hasTriggerBlock = true; + triggerBlock = args[i].toLowerCase().replaceFirst("triggerblock:", ""); + } else if (this.startsWithPortalArg("bungee:", args[i])) { + isBungeePortal = true; + serverName = args[i].substring("bungee:".length()); + } else if (startsWithPortalArg("permission:", args[i])) { + needsPermission = true; + permission = args[i].toLowerCase().replaceFirst("permission:", ""); + extraData.add(new PortalArg("permission", permission)); + } else if (startsWithPortalArg("delayed:", args[i])) { + boolean delayed = Boolean + .parseBoolean(args[i].toLowerCase().replaceFirst("delayed:", "")); + extraData.add(new PortalArg("delayed", Boolean.toString(delayed))); + } else if (startsWithPortalArg("message:", args[i])) { + String message = parseArgVariable(args, i, "message:"); + if (message == null) { + player.sendMessage( + PluginMessages.customPrefixFail + " Message quotes not closed!"); + return true; + } + extraData.add(new PortalArg("message", message)); + } else if (startsWithPortalArg("command:", args[i])) { + executesCommand = true; + portalCommand = parseArgVariable(args, i, "command:"); + if (portalCommand == null) { + player.sendMessage( + PluginMessages.customPrefixFail + " Command quotes not closed!"); + return true; + } + i += this.portalArgsStringLength - 1; + if (portalCommand.startsWith("#") + && !(this.plugin.getSettings().enabledCommandLevel("c") + && (player.hasPermission( + "advancedportals.createportal.commandlevel.console") + || player.isOp()))) { + player.sendMessage(PluginMessages.customPrefixFail + + " You need permission to make a console command portal!"); + return true; + } else if (portalCommand.startsWith("!") + && !(this.plugin.getSettings().enabledCommandLevel("o") + && (player.hasPermission( + "advancedportals.createportal.commandlevel.op") + || player.isOp()))) { + player.sendMessage(PluginMessages.customPrefixFail + + " You need permission to make a op command portal!"); + return true; + } else if (portalCommand.startsWith("%") + && !(this.plugin.getSettings().enabledCommandLevel("b") + && (player.hasPermission( + "advancedportals.createportal.commandlevel.bungee") + || player.isOp()))) { + player.sendMessage(PluginMessages.customPrefixFail + + " You need permission to make a bungee command portal!"); + return true; + } else if (portalCommand.startsWith("^") + && !(this.plugin.getSettings().enabledCommandLevel("p") + && (player.hasPermission( + "advancedportals.createportal.commandlevel.perms") + || player.isOp()))) { + player.sendMessage(PluginMessages.customPrefixFail + + " You need permission to make a all perms command portal!"); + return true; + } + extraData.add(new PortalArg("command.1", portalCommand)); + } else if (startsWithPortalArg("cooldowndelay:", args[i])) { + String cooldownDelay = parseArgVariable(args, i, "cooldowndelay:"); + extraData.add(new PortalArg("cooldowndelay", cooldownDelay)); + } else if (startsWithPortalArg("leavedesti:", args[i])) { + String leaveDesti = parseArgVariable(args, i, "leavedesti:"); + extraData.add(new PortalArg("leavedesti", leaveDesti)); + } else if (startsWithPortalArg("particlein:", args[i])) { + String value = parseArgVariable(args, i, "particlein:"); + extraData.add(new PortalArg("particlein", value)); + } else if (startsWithPortalArg("particleout:", args[i])) { + String value = parseArgVariable(args, i, "particleout:"); + extraData.add(new PortalArg("particleout", value)); + } + } + if (!hasName) { + player.sendMessage(PluginMessages.customPrefixFail + + " You must include a name for the portal that you are creating in the variables!"); + return true; + } + + Location pos1, pos2; + if (plugin.isWorldEditActive()) { + pos1 = WorldEditIntegration.getPos1(player); + pos2 = WorldEditIntegration.getPos2(player); + } else { + World world = Bukkit + .getWorld(player.getMetadata("Pos1World").get(0).asString()); + pos1 = new Location(world, player.getMetadata("Pos1X").get(0).asInt(), + player.getMetadata("Pos1Y").get(0).asInt(), + player.getMetadata("Pos1Z").get(0).asInt()); + pos2 = new Location(world, player.getMetadata("Pos2X").get(0).asInt(), + player.getMetadata("Pos2Y").get(0).asInt(), + player.getMetadata("Pos2Z").get(0).asInt()); + } + + ConfigAccessor desticonfig = new ConfigAccessor(plugin, "destinations.yml"); + String destiPosX = desticonfig.getConfig().getString(destination + ".pos.X"); + + if (!Portal.portalExists(portalName)) { + + player.sendMessage(""); + player.sendMessage(PluginMessages.customPrefix + + "\u00A7e You have created a new portal with the following details:"); + player.sendMessage("\u00A7aname: \u00A7e" + portalName); + if (hasDestination) { + if (!isBungeePortal && destiPosX == null) { + player.sendMessage("\u00A7cdestination: \u00A7e" + destination + + " (destination does not exist)"); + return true; + } else { + player.sendMessage("\u00A7adestination: \u00A7e" + destination); + } + + } else { + player.sendMessage( + "\u00A7cdestination: \u00A7eN/A (will not teleport to a location)"); + } + + if (isBungeePortal) { + player.sendMessage("\u00A7abungee: \u00A7e" + serverName); + } + + if (needsPermission) { + player.sendMessage("\u00A7apermission: \u00A7e" + permission); + } else { + player.sendMessage("\u00A7apermission: \u00A7e(none needed)"); + } + + for (PortalArg portalArg : extraData) { + if (!ignoreExtras.contains(portalArg.argName)) { + player.sendMessage( + "\u00A7a" + portalArg.argName + ": \u00A7e" + portalArg.value); + } + } + + if (executesCommand) { + player.sendMessage("\u00A7acommand: \u00A7e" + portalCommand); + } + + if (hasTriggerBlock) { + Set materialSet = Portal + .getMaterialSet(triggerBlock.toUpperCase().split(",")); + if (materialSet.size() != 0) { + player.sendMessage( + "\u00A7atriggerBlock: \u00A7e" + triggerBlock.toUpperCase()); + PortalArg[] portalArgs = new PortalArg[extraData.size()]; + portalArgs = extraData.toArray(portalArgs); + player.sendMessage(Portal.create(pos1, pos2, portalName, destination, + materialSet, serverName, portalArgs)); + if(materialSet.contains(Material.END_GATEWAY)) { + AdvancedPortal portal = Portal.getPortal(portalName); + if(portal != null) { + disableBeacons(portal); + } + } + } else { + ConfigAccessor Config = new ConfigAccessor(plugin, "config.yml"); + player.sendMessage("\u00A7ctriggerBlock: \u00A7edefault(" + + Config.getConfig().getString("DefaultPortalTriggerBlock") + ")"); + + player.sendMessage("\u00A7c" + triggerBlock.toUpperCase() + + " no valid blocks were listed so the default has been set."); + PortalArg[] portalArgs = new PortalArg[extraData.size()]; + portalArgs = extraData.toArray(portalArgs); + player.sendMessage(Portal.create(pos1, pos2, portalName, destination, + serverName, portalArgs)); + } + } else { + ConfigAccessor Config = new ConfigAccessor(plugin, "config.yml"); + player.sendMessage("\u00A7atriggerBlock: \u00A7edefault(" + + Config.getConfig().getString("DefaultPortalTriggerBlock") + ")"); + PortalArg[] portalArgs = new PortalArg[extraData.size()]; + portalArgs = extraData.toArray(portalArgs); + player.sendMessage(Portal.create(pos1, pos2, portalName, destination, + serverName, portalArgs)); + } + } else { + player.sendMessage( + PluginMessages.customPrefixFail + " A portal by that name already exists!"); + } + + // add code to save the portal to the portal config and reload the portals + + player.sendMessage(""); + return true; + } + + private boolean startsWithPortalArg(String portalArg, String arg) { return arg.toLowerCase().startsWith(portalArg) && arg.length() > portalArg.length(); } @@ -726,7 +779,8 @@ public class AdvancedPortalsCommand implements CommandExecutor, TabCompleter { private void helpCommand(CommandSender sender, String command, String[] args) { // Add pages if there starts to become too many if (args.length == 1) { - sendMenu(sender, "Help Menu", "\u00A76/" + command + " selector \u00A7a- gives you a region selector", + sendMenu(sender, "Help Menu", + "\u00A76/" + command + " selector \u00A7a- gives you a region selector", "\u00A76/" + command + " create \u00A7c[tags] \u00A7a- creates a portal with a selection ", "\u00A76/" + command + " portalblock \u00A7a- gives you a portal block", "\u00A76/" + command + " endportalblock \u00A7a- gives you an end portal block", @@ -897,8 +951,14 @@ public class AdvancedPortalsCommand implements CommandExecutor, TabCompleter { if (sender.hasPermission("advancedportals.createportal")) { if (args.length == 1 || (args.length == 2 && args[0].equalsIgnoreCase("help"))) { autoComplete.addAll(Arrays.asList("create", "list", "portalblock", "select", "unselect", "command", - "selector", "show", "gatewayblock", "endportalblock", "variables", "wand", "disablebeacon", "remove", "rename", + "show", "gatewayblock", "endportalblock", "variables", "disablebeacon", "remove", "rename", "help", "bukkitpage", "helppage")); + if (Bukkit.getPluginManager().isPluginEnabled("WorldEdit")) { + autoComplete.add("we-selection"); + } + if (!plugin.isWorldEditActive()) { + autoComplete.addAll(Arrays.asList("selector", "wand")); + } } else if (args[0].equalsIgnoreCase("create")) { boolean hasName = false; @@ -1004,8 +1064,10 @@ public class AdvancedPortalsCommand implements CommandExecutor, TabCompleter { } } } - else if (args.length == 2 && (args[0].equalsIgnoreCase("remove") - || args[0].equalsIgnoreCase("disablebeacon"))) { + else if (args.length == 2 && + (args[0].equalsIgnoreCase("remove") + || args[0].equalsIgnoreCase("disablebeacon") + || args[0].equalsIgnoreCase("we-selection"))) { for (AdvancedPortal portal : Portal.portals) { autoComplete.add(portal.getName()); } diff --git a/src/main/java/com/sekwah/advancedportals/bukkit/AdvancedPortalsPlugin.java b/src/main/java/com/sekwah/advancedportals/bukkit/AdvancedPortalsPlugin.java index 719e0a9..cd5f136 100644 --- a/src/main/java/com/sekwah/advancedportals/bukkit/AdvancedPortalsPlugin.java +++ b/src/main/java/com/sekwah/advancedportals/bukkit/AdvancedPortalsPlugin.java @@ -9,6 +9,7 @@ import com.sekwah.advancedportals.bukkit.listeners.*; import com.sekwah.advancedportals.bukkit.metrics.Metrics; import com.sekwah.advancedportals.bukkit.portals.Portal; import com.sekwah.advancedportals.bungee.BungeeMessages; +import org.bukkit.Bukkit; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.entity.Player; @@ -26,6 +27,8 @@ public class AdvancedPortalsPlugin extends JavaPlugin { protected boolean forceRegisterProxyChannels = false; protected boolean disableProxyWarning = false; + private boolean worldEditActive = false; + protected static final Map PLAYER_DESTI_MAP = new HashMap<>(); @Override @@ -79,6 +82,10 @@ public class AdvancedPortalsPlugin extends JavaPlugin { player.removeMetadata(Listeners.LAVA_WARPED, this); } + if (settings.enabledWorldEditIntegration() && Bukkit.getPluginManager().isPluginEnabled("WorldEdit")) { + worldEditActive = true; + } + // thanks to the new config accessor code the config.saveDefaultConfig(); will now // only copy the file if it doesnt exist! } @@ -172,4 +179,8 @@ public class AdvancedPortalsPlugin extends JavaPlugin { public Settings getSettings() { return settings; } + + public boolean isWorldEditActive() { + return worldEditActive; + } } diff --git a/src/main/java/com/sekwah/advancedportals/bukkit/Settings.java b/src/main/java/com/sekwah/advancedportals/bukkit/Settings.java index b7efb63..8dc7679 100644 --- a/src/main/java/com/sekwah/advancedportals/bukkit/Settings.java +++ b/src/main/java/com/sekwah/advancedportals/bukkit/Settings.java @@ -15,10 +15,13 @@ public class Settings { private String commandLevels = "n"; + private boolean worldEditEnabled = false; + public enum PortalConfigOption { COMMAND_LEVELS("CommandLevels"), WARP_PARTICLES("WarpParticles"), - WARP_SOUND("WarpSound"); + WARP_SOUND("WarpSound"), + WORLDEDIT_INTEGRATION("WorldEditIntegration"); private final String target; @@ -38,6 +41,8 @@ public class Settings { commandLevels = config.getConfig().getString(COMMAND_LEVELS.value(), "opcb"); + worldEditEnabled = config.getConfig().getBoolean(WORLDEDIT_INTEGRATION.value(), false); + assert commandLevels != null; if(commandLevels.equals("opchek")) { commandLevels = "opcb"; @@ -63,4 +68,8 @@ public class Settings { public int getCurrentWarpParticles() { return currentWarpParticles; } + + public boolean enabledWorldEditIntegration() { + return worldEditEnabled; + } } diff --git a/src/main/java/com/sekwah/advancedportals/bukkit/config/ConfigHelper.java b/src/main/java/com/sekwah/advancedportals/bukkit/config/ConfigHelper.java index e9ed7a3..edca424 100644 --- a/src/main/java/com/sekwah/advancedportals/bukkit/config/ConfigHelper.java +++ b/src/main/java/com/sekwah/advancedportals/bukkit/config/ConfigHelper.java @@ -35,6 +35,7 @@ public class ConfigHelper { } else if(configVersion.equals("0.5.4")) { config.set(ConfigHelper.CONFIG_VERSION, "0.5.11"); config.set(ConfigHelper.COMMAND_LOGS, true); + update(); } else if(configVersion.equals("0.5.10") || configVersion.equals("0.5.11")) { config.set(ConfigHelper.CONFIG_VERSION, "0.5.13"); config.set(ConfigHelper.FORCE_ENABLE_PROXY_SUPPORT, false); diff --git a/src/main/java/com/sekwah/advancedportals/bukkit/listeners/Listeners.java b/src/main/java/com/sekwah/advancedportals/bukkit/listeners/Listeners.java index da106a4..908b427 100644 --- a/src/main/java/com/sekwah/advancedportals/bukkit/listeners/Listeners.java +++ b/src/main/java/com/sekwah/advancedportals/bukkit/listeners/Listeners.java @@ -329,49 +329,50 @@ public class Listeners implements Listener { } if (player.hasPermission("advancedportals.createportal")) { + if (!plugin.getSettings().enabledWorldEditIntegration()) { + if (event.getItem() != null && event.getItem().getType() == WandMaterial // was type id + && (!UseOnlyServerAxe || (checkItemForName(event.getItem()) && event.getItem().getItemMeta() + .getDisplayName().equals("\u00A7ePortal Region Selector")))) { - if (event.getItem() != null && event.getItem().getType() == WandMaterial // was type id - && (!UseOnlyServerAxe || (checkItemForName(event.getItem()) && event.getItem().getItemMeta() - .getDisplayName().equals("\u00A7ePortal Region Selector")))) { + // This checks if the action was a left or right click and if it was directly + // effecting a block. + if (event.getAction() == Action.LEFT_CLICK_BLOCK) { + Location blockloc = event.getClickedBlock().getLocation(); + // stores the selection as metadata on the character so then it isn't saved + // anywhere, if the player logs out it will + // have to be selected again if the player joins, also it does not affect any + // other players. + player.setMetadata("Pos1X", new FixedMetadataValue(plugin, blockloc.getBlockX())); + player.setMetadata("Pos1Y", new FixedMetadataValue(plugin, blockloc.getBlockY())); + player.setMetadata("Pos1Z", new FixedMetadataValue(plugin, blockloc.getBlockZ())); + player.setMetadata("Pos1World", new FixedMetadataValue(plugin, blockloc.getWorld().getName())); + player.sendMessage( + "\u00A7eYou have selected pos1! X:" + blockloc.getBlockX() + " Y:" + blockloc.getBlockY() + + " Z:" + blockloc.getBlockZ() + " World: " + blockloc.getWorld().getName()); - // This checks if the action was a left or right click and if it was directly - // effecting a block. - if (event.getAction() == Action.LEFT_CLICK_BLOCK) { - Location blockloc = event.getClickedBlock().getLocation(); - // stores the selection as metadata on the character so then it isn't saved - // anywhere, if the player logs out it will - // have to be selected again if the player joins, also it does not affect any - // other players. - player.setMetadata("Pos1X", new FixedMetadataValue(plugin, blockloc.getBlockX())); - player.setMetadata("Pos1Y", new FixedMetadataValue(plugin, blockloc.getBlockY())); - player.setMetadata("Pos1Z", new FixedMetadataValue(plugin, blockloc.getBlockZ())); - player.setMetadata("Pos1World", new FixedMetadataValue(plugin, blockloc.getWorld().getName())); - player.sendMessage( - "\u00A7eYou have selected pos1! X:" + blockloc.getBlockX() + " Y:" + blockloc.getBlockY() - + " Z:" + blockloc.getBlockZ() + " World: " + blockloc.getWorld().getName()); + // Stops the event so the block is not damaged + event.setCancelled(true); - // Stops the event so the block is not damaged - event.setCancelled(true); + // Returns the event so no more code is executed(stops unnecessary code being + // executed) + } else if (event.getAction() == Action.RIGHT_CLICK_BLOCK) { + Location blockloc = event.getClickedBlock().getLocation(); + player.setMetadata("Pos2X", new FixedMetadataValue(plugin, blockloc.getBlockX())); + player.setMetadata("Pos2Y", new FixedMetadataValue(plugin, blockloc.getBlockY())); + player.setMetadata("Pos2Z", new FixedMetadataValue(plugin, blockloc.getBlockZ())); + player.setMetadata("Pos2World", new FixedMetadataValue(plugin, blockloc.getWorld().getName())); + player.sendMessage( + "\u00A7eYou have selected pos2! X:" + blockloc.getBlockX() + " Y:" + blockloc.getBlockY() + + " Z:" + blockloc.getBlockZ() + " World: " + blockloc.getWorld().getName()); - // Returns the event so no more code is executed(stops unnecessary code being - // executed) - } else if (event.getAction() == Action.RIGHT_CLICK_BLOCK) { - Location blockloc = event.getClickedBlock().getLocation(); - player.setMetadata("Pos2X", new FixedMetadataValue(plugin, blockloc.getBlockX())); - player.setMetadata("Pos2Y", new FixedMetadataValue(plugin, blockloc.getBlockY())); - player.setMetadata("Pos2Z", new FixedMetadataValue(plugin, blockloc.getBlockZ())); - player.setMetadata("Pos2World", new FixedMetadataValue(plugin, blockloc.getWorld().getName())); - player.sendMessage( - "\u00A7eYou have selected pos2! X:" + blockloc.getBlockX() + " Y:" + blockloc.getBlockY() - + " Z:" + blockloc.getBlockZ() + " World: " + blockloc.getWorld().getName()); + // Stops the event so the block is not interacted with + event.setCancelled(true); - // Stops the event so the block is not interacted with - event.setCancelled(true); + // Returns the event so no more code is executed(stops unnecessary code being + // executed) + } - // Returns the event so no more code is executed(stops unnecessary code being - // executed) } - } else if (checkItemForName(event.getItem()) && event.getItem().getItemMeta().getDisplayName().equals("\u00A75Portal Block Placer") && event.getAction() == Action.LEFT_CLICK_BLOCK diff --git a/src/main/java/com/sekwah/advancedportals/bukkit/util/WorldEditIntegration.java b/src/main/java/com/sekwah/advancedportals/bukkit/util/WorldEditIntegration.java new file mode 100644 index 0000000..ecf3730 --- /dev/null +++ b/src/main/java/com/sekwah/advancedportals/bukkit/util/WorldEditIntegration.java @@ -0,0 +1,47 @@ +package com.sekwah.advancedportals.bukkit.util; + +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.regions.CuboidRegion; +import com.sk89q.worldedit.regions.Region; +import com.sk89q.worldedit.regions.RegionSelector; +import com.sk89q.worldedit.regions.selector.CuboidRegionSelector; +import org.bukkit.Location; +import org.bukkit.entity.Player; + +public class WorldEditIntegration { + private static Region getCurrentSelection(Player player) { + LocalSession localSession = WorldEdit.getInstance().getSessionManager().get(BukkitAdapter.adapt(player)); + try { + return localSession.getSelection(BukkitAdapter.adapt(player.getWorld())); + } catch (IncompleteRegionException e) { + return null; + } + } + + public static boolean validateSelection(Player player) { + return getCurrentSelection(player) instanceof CuboidRegion; + } + + public static Location getPos1(Player player) { + Region currentSelection = getCurrentSelection(player); + if (!(currentSelection instanceof CuboidRegion)) return null; + return BukkitAdapter.adapt(player.getWorld(), ((CuboidRegion) currentSelection).getPos1()); + } + + public static Location getPos2(Player player) { + Region currentSelection = getCurrentSelection(player); + if (currentSelection == null) return null;; + return BukkitAdapter.adapt(player.getWorld(), ((CuboidRegion) currentSelection).getPos2()); + } + + public static void explainRegion(Player player, Location pos1, Location pos2) { + LocalSession localSession = WorldEdit.getInstance().getSessionManager().get(BukkitAdapter.adapt(player)); + RegionSelector selector = new CuboidRegionSelector(BukkitAdapter.adapt(player.getWorld()), BukkitAdapter.asBlockVector(pos1), BukkitAdapter.asBlockVector(pos2)); + localSession.setRegionSelector(BukkitAdapter.adapt(player.getWorld()), selector); + selector.explainRegionAdjust(BukkitAdapter.adapt(player), localSession); + + } +} diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 352c6ad..575bd9b 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -101,3 +101,7 @@ ProxyTeleportDelay: 0 # Just in case you are not using the proxy and dont want the warning message DisableProxyWarning: false + +# Whether the integration with worldedit should be enabled. +# This will force AdvancedPortals to use WorldEdit selections. +WorldEditIntegration: false \ No newline at end of file diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 3861491..9fa9457 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -4,6 +4,10 @@ version: 0.8.0 author: sekwah41 description: An advanced portals plugin for bukkit. api-version: 1.13 + +softdepend: + - WorldEdit + commands: advancedportals: description: The main command for the advanced portals