From e80ade65c7a942945f448c7bc30a23040d456a35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20S=C3=B6derberg?= Date: Sat, 18 Jul 2020 11:05:16 +0200 Subject: [PATCH 1/5] Clean up PlotId --- .../plotsquared/bukkit/BukkitPlatform.java | 4 +- .../entity/ReplicatingEntityWrapper.java | 14 +- .../bukkit/entity/TeleportEntityWrapper.java | 4 +- .../bukkit/listener/PlayerEvents.java | 4 +- .../com/plotsquared/core/PlotSquared.java | 8 +- .../com/plotsquared/core/command/Area.java | 10 +- .../plotsquared/core/command/Argument.java | 2 +- .../com/plotsquared/core/command/Auto.java | 16 +- .../com/plotsquared/core/command/Cluster.java | 18 +- .../plotsquared/core/command/Condense.java | 10 +- .../core/command/DatabaseCommand.java | 4 +- .../core/command/DebugImportWorlds.java | 4 +- .../com/plotsquared/core/command/Info.java | 2 +- .../com/plotsquared/core/command/Save.java | 2 +- .../plotsquared/core/database/SQLManager.java | 92 ++++----- .../core/generator/HybridPlotManager.java | 6 +- .../core/generator/SquarePlotManager.java | 14 +- .../core/listener/PlotListener.java | 4 +- .../plotsquared/core/location/BlockLoc.java | 1 + .../plotsquared/core/location/Location.java | 29 ++- .../plotsquared/core/location/PlotLoc.java | 12 +- .../plotsquared/core/player/PlotPlayer.java | 6 +- .../java/com/plotsquared/core/plot/Plot.java | 131 ++++++------- .../com/plotsquared/core/plot/PlotArea.java | 81 ++++---- .../plotsquared/core/plot/PlotCluster.java | 27 +-- .../com/plotsquared/core/plot/PlotId.java | 182 ++++++++++-------- .../core/plot/schematic/PlotItem.java | 47 ----- .../core/plot/world/SinglePlotManager.java | 4 +- .../core/util/EventDispatcher.java | 2 +- .../com/plotsquared/core/util/MainUtil.java | 6 +- .../core/util/SchematicHandler.java | 6 +- Core/src/main/resources/furthest.js | 16 +- .../com/plotsquared/core/plot/FlagTest.java | 2 +- 33 files changed, 378 insertions(+), 392 deletions(-) delete mode 100644 Core/src/main/java/com/plotsquared/core/plot/schematic/PlotItem.java diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/BukkitPlatform.java b/Bukkit/src/main/java/com/plotsquared/bukkit/BukkitPlatform.java index 174f3e6a8..b7d87ec59 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/BukkitPlatform.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/BukkitPlatform.java @@ -832,7 +832,7 @@ import static com.plotsquared.core.util.ReflectionUtils.getRefClass; BukkitUtil.adapt(entity.getLocation()); PlotArea area = pLoc.getPlotArea(); if (area != null) { - PlotId currentPlotId = PlotId.of(area.getPlotAbs(pLoc)); + PlotId currentPlotId = area.getPlotAbs(pLoc).getId(); if (!originalPlotId.equals(currentPlotId) && ( currentPlotId == null || !area .getPlot(originalPlotId) @@ -851,7 +851,7 @@ import static com.plotsquared.core.util.ReflectionUtils.getRefClass; BukkitUtil.adapt(entity.getLocation()); PlotArea area = pLoc.getPlotArea(); if (area != null) { - PlotId currentPlotId = PlotId.of(area.getPlotAbs(pLoc)); + PlotId currentPlotId = area.getPlotAbs(pLoc).getId(); if (currentPlotId != null) { entity.setMetadata("shulkerPlot", new FixedMetadataValue( diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/entity/ReplicatingEntityWrapper.java b/Bukkit/src/main/java/com/plotsquared/bukkit/entity/ReplicatingEntityWrapper.java index 3522863ae..8cae4cef4 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/entity/ReplicatingEntityWrapper.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/entity/ReplicatingEntityWrapper.java @@ -152,16 +152,16 @@ public final class ReplicatingEntityWrapper extends EntityWrapper { this.stack = item.getItemStack(); return; case "ITEM_FRAME": - this.x = Math.floor(this.x); - this.y = Math.floor(this.y); + this.x = Math.floor(this.getX()); + this.y = Math.floor(this.getY()); this.z = Math.floor(this.z); ItemFrame itemFrame = (ItemFrame) entity; this.dataByte = getOrdinal(Rotation.values(), itemFrame.getRotation()); this.stack = itemFrame.getItem().clone(); return; case "PAINTING": - this.x = Math.floor(this.x); - this.y = Math.floor(this.y); + this.x = Math.floor(this.getX()); + this.y = Math.floor(this.getY()); this.z = Math.floor(this.z); Painting painting = (Painting) entity; Art art = painting.getArt(); @@ -407,8 +407,8 @@ public final class ReplicatingEntityWrapper extends EntityWrapper { this.lived.leashed = lived.isLeashed(); if (this.lived.leashed) { Location location = lived.getLeashHolder().getLocation(); - this.lived.leashX = (short) (this.x - location.getBlockX()); - this.lived.leashY = (short) (this.y - location.getBlockY()); + this.lived.leashX = (short) (this.getX() - location.getBlockX()); + this.lived.leashY = (short) (this.getY() - location.getBlockY()); this.lived.leashZ = (short) (this.z - location.getBlockZ()); } EntityEquipment equipment = lived.getEquipment(); @@ -460,7 +460,7 @@ public final class ReplicatingEntityWrapper extends EntityWrapper { } @Override public Entity spawn(World world, int xOffset, int zOffset) { - Location location = new Location(world, this.x + xOffset, this.y, this.z + zOffset); + Location location = new Location(world, this.getX() + xOffset, this.getY(), this.z + zOffset); location.setYaw(this.yaw); location.setPitch(this.pitch); if (!this.getType().isSpawnable()) { diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/entity/TeleportEntityWrapper.java b/Bukkit/src/main/java/com/plotsquared/bukkit/entity/TeleportEntityWrapper.java index 6a37571a3..dfa918c0b 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/entity/TeleportEntityWrapper.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/entity/TeleportEntityWrapper.java @@ -67,8 +67,8 @@ public class TeleportEntityWrapper extends EntityWrapper { // To account for offsets in the chunk manager this.oldLocation = oldLocation.clone(); - this.oldLocation.setX(this.x); - this.oldLocation.setY(this.y); + this.oldLocation.setX(this.getX()); + this.oldLocation.setY(this.getY()); this.oldLocation.setZ(this.z); this.gravityOld = this.getEntity().hasGravity(); diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/listener/PlayerEvents.java b/Bukkit/src/main/java/com/plotsquared/bukkit/listener/PlayerEvents.java index 17ab8f71d..f334e055b 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/listener/PlayerEvents.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/listener/PlayerEvents.java @@ -1005,7 +1005,7 @@ import java.util.regex.Pattern; } } String partial = ChatColor.translateAlternateColorCodes('&', - format.replace("%plot_id%", id.x + ";" + id.y).replace("%sender%", sender)); + format.replace("%plot_id%", id.getX() + ";" + id.getY()).replace("%sender%", sender)); if (plotPlayer.hasPermission("plots.chat.color")) { message = Captions.color(message); } @@ -1015,7 +1015,7 @@ import java.util.regex.Pattern; } if (!spies.isEmpty()) { String spyMessage = Captions.PLOT_CHAT_SPY_FORMAT.getTranslated() - .replace("%plot_id%", id.x + ";" + id.y).replace("%sender%", sender) + .replace("%plot_id%", id.getX() + ";" + id.getY()).replace("%sender%", sender) .replace("%msg%", message); for (Player player : spies) { player.sendMessage(spyMessage); diff --git a/Core/src/main/java/com/plotsquared/core/PlotSquared.java b/Core/src/main/java/com/plotsquared/core/PlotSquared.java index 9a3220f79..70ea59417 100644 --- a/Core/src/main/java/com/plotsquared/core/PlotSquared.java +++ b/Core/src/main/java/com/plotsquared/core/PlotSquared.java @@ -503,7 +503,7 @@ public class PlotSquared { } else { extra.add(plot); } - } else if (Math.abs(plot.getId().x) > 15446 || Math.abs(plot.getId().y) > 15446) { + } else if (Math.abs(plot.getId().getX()) > 15446 || Math.abs(plot.getId().getY()) > 15446) { extra.add(plot); } else { overflow.add(plot); @@ -578,7 +578,7 @@ public class PlotSquared { } else { extra.add(plot); } - } else if (Math.abs(plot.getId().x) > 15446 || Math.abs(plot.getId().y) > 15446) { + } else if (Math.abs(plot.getId().getX()) > 15446 || Math.abs(plot.getId().getY()) > 15446) { extra.add(plot); } else { overflow.add(plot); @@ -718,8 +718,8 @@ public class PlotSquared { } if (plot.getArea().removePlot(plot.getId())) { PlotId last = (PlotId) plot.getArea().getMeta("lastPlot"); - int last_max = Math.max(Math.abs(last.x), Math.abs(last.y)); - int this_max = Math.max(Math.abs(plot.getId().x), Math.abs(plot.getId().y)); + int last_max = Math.max(Math.abs(last.getX()), Math.abs(last.getY())); + int this_max = Math.max(Math.abs(plot.getId().getX()), Math.abs(plot.getId().getY())); if (this_max < last_max) { plot.getArea().setMeta("lastPlot", plot.getId()); } diff --git a/Core/src/main/java/com/plotsquared/core/command/Area.java b/Core/src/main/java/com/plotsquared/core/command/Area.java index 18f71b00f..969737766 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Area.java +++ b/Core/src/main/java/com/plotsquared/core/command/Area.java @@ -169,7 +169,7 @@ public class Area extends SubCommand { BlockVector3.at(playerSelectionMin.getX(), 0, playerSelectionMin.getZ()), BlockVector3.at(playerSelectionMax.getX(), 255, playerSelectionMax.getZ())); // There's only one plot in the area... - final PlotId plotId = new PlotId(1, 1); + final PlotId plotId = PlotId.of(1, 1); final HybridPlotWorld hybridPlotWorld = this.hybridPlotWorldFactory.create(player.getLocation().getWorldName(), args[1], Objects.requireNonNull(PlotSquared.platform()).getDefaultGenerator(), plotId, plotId); // Plot size is the same as the region width @@ -315,8 +315,8 @@ public class Area extends SubCommand { PlotAreaBuilder builder = PlotAreaBuilder.ofPlotArea(area) .plotManager(PlotSquared.platform().getPluginName()) .generatorName(PlotSquared.platform().getPluginName()) - .minimumId(new PlotId(1, 1)) - .maximumId(new PlotId(numX, numZ)); + .minimumId(PlotId.of(1, 1)) + .maximumId(PlotId.of(numX, numZ)); final String path = "worlds." + area.getWorldName() + ".areas." + area.getId() + '-' + builder.minimumId() + '-' + builder.maximumId(); @@ -542,7 +542,7 @@ public class Area extends SubCommand { PlotId min = area.getMin(); PlotId max = area.getMax(); name = area.getWorldName() + ';' + area.getId() + ';' + min + ';' + max; - int size = (max.x - min.x + 1) * (max.y - min.y + 1); + int size = (max.getX() - min.getX() + 1) * (max.getY() - min.getY() + 1); percent = claimed == 0 ? 0 : size / (double) claimed; region = area.getRegion().toString(); } else { @@ -595,7 +595,7 @@ public class Area extends SubCommand { PlotId max = area.getMax(); name = area.getWorldName() + ';' + area.getId() + ';' + min + ';' + max; - int size = (max.x - min.x + 1) * (max.y - min.y + 1); + int size = (max.getX() - min.getX() + 1) * (max.getY() - min.getY() + 1); percent = claimed == 0 ? 0 : size / (double) claimed; region = area.getRegion().toString(); } else { diff --git a/Core/src/main/java/com/plotsquared/core/command/Argument.java b/Core/src/main/java/com/plotsquared/core/command/Argument.java index 2bb203ac8..42a9858c8 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Argument.java +++ b/Core/src/main/java/com/plotsquared/core/command/Argument.java @@ -64,7 +64,7 @@ public abstract class Argument { } }; public static final Argument PlotID = - new Argument("PlotID", new PlotId(-6, 3)) { + new Argument("PlotID", PlotId.of(-6, 3)) { @Override public PlotId parse(String in) { return PlotId.fromString(in); } diff --git a/Core/src/main/java/com/plotsquared/core/command/Auto.java b/Core/src/main/java/com/plotsquared/core/command/Auto.java index 2c2f051e9..cfc7cd94d 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Auto.java +++ b/Core/src/main/java/com/plotsquared/core/command/Auto.java @@ -76,10 +76,6 @@ public class Auto extends SubCommand { this.eventDispatcher = eventDispatcher; this.econHandler = econHandler; } - - @Deprecated public static PlotId getNextPlotId(PlotId id, int step) { - return id.getNextId(step); - } public static boolean checkAllowedPlots(PlotPlayer player, PlotArea plotarea, @Nullable Integer allowedPlots, int sizeX, int sizeZ) { @@ -298,14 +294,14 @@ public class Auto extends SubCommand { return false; } while (true) { - PlotId start = plotarea.getMeta("lastPlot", new PlotId(0, 0)).getNextId(1); - PlotId end = new PlotId(start.x + size_x - 1, start.y + size_z - 1); + PlotId start = plotarea.getMeta("lastPlot", PlotId.of(0, 0)).getNextId(); + PlotId end = PlotId.of(start.getX() + size_x - 1, start.getY() + size_z - 1); if (plotarea.canClaim(player, start, end)) { plotarea.setMeta("lastPlot", start); - for (int i = start.x; i <= end.x; i++) { - for (int j = start.y; j <= end.y; j++) { - Plot plot = plotarea.getPlotAbs(new PlotId(i, j)); - boolean teleport = i == end.x && j == end.y; + for (int i = start.getX(); i <= end.getX(); i++) { + for (int j = start.getY(); j <= end.getY(); j++) { + Plot plot = plotarea.getPlotAbs(PlotId.of(i, j)); + boolean teleport = i == end.getX() && j == end.getY(); if (plot == null) { return false; } diff --git a/Core/src/main/java/com/plotsquared/core/command/Cluster.java b/Core/src/main/java/com/plotsquared/core/command/Cluster.java index 0902170bf..793225cf7 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Cluster.java +++ b/Core/src/main/java/com/plotsquared/core/command/Cluster.java @@ -137,9 +137,9 @@ public class Cluster extends SubCommand { MainUtil.sendMessage(player, Captions.ALIAS_IS_TAKEN); return false; } - if (pos2.x < pos1.x || pos2.y < pos1.y) { - PlotId tmp = new PlotId(Math.min(pos1.x, pos2.x), Math.min(pos1.y, pos2.y)); - pos2 = new PlotId(Math.max(pos1.x, pos2.x), Math.max(pos1.y, pos2.y)); + if (pos2.getX() < pos1.getX() || pos2.getY() < pos1.getY()) { + PlotId tmp = PlotId.of(Math.min(pos1.getX(), pos2.getX()), Math.min(pos1.getY(), pos2.getY())); + pos2 = PlotId.of(Math.max(pos1.getX(), pos2.getX()), Math.max(pos1.getY(), pos2.getY())); pos1 = tmp; } //check if overlap @@ -265,9 +265,9 @@ public class Cluster extends SubCommand { MainUtil.sendMessage(player, Captions.NOT_VALID_PLOT_ID); return false; } - if (pos2.x < pos1.x || pos2.y < pos1.y) { - pos1 = new PlotId(Math.min(pos1.x, pos2.x), Math.min(pos1.y, pos2.y)); - pos2 = new PlotId(Math.max(pos1.x, pos2.x), Math.max(pos1.y, pos2.y)); + if (pos2.getX() < pos1.getX() || pos2.getY() < pos1.getY()) { + pos1 = PlotId.of(Math.min(pos1.getX(), pos2.getX()), Math.min(pos1.getY(), pos2.getY())); + pos2 = PlotId.of(Math.max(pos1.getX(), pos2.getX()), Math.max(pos1.getY(), pos2.getY())); } // check if in cluster PlotArea area = player.getApplicablePlotArea(); @@ -326,7 +326,7 @@ public class Cluster extends SubCommand { } else { current = player.getPlayerClusterCount(player.getLocation().getWorldName()); } - current -= cluster.getArea() + (1 + pos2.x - pos1.x) * (1 + pos2.y - pos1.y); + current -= cluster.getArea() + (1 + pos2.getX() - pos1.getX()) * (1 + pos2.getY() - pos1.getY()); int allowed = Permissions.hasPermissionRange(player, Captions.PERMISSION_CLUSTER, Settings.Limit.MAX_PLOTS); if (current + cluster.getArea() > allowed) { @@ -648,8 +648,8 @@ public class Cluster extends SubCommand { owner = username; } String name = cluster.getName(); - String size = (cluster.getP2().x - cluster.getP1().x + 1) + "x" + ( - cluster.getP2().y - cluster.getP1().y + 1); + String size = (cluster.getP2().getX() - cluster.getP1().getX() + 1) + "x" + ( + cluster.getP2().getY() - cluster.getP1().getY() + 1); String rights = cluster.isAdded(player.getUUID()) + ""; String message = Captions.CLUSTER_INFO.getTranslated(); message = message.replaceAll("%id%", id); diff --git a/Core/src/main/java/com/plotsquared/core/command/Condense.java b/Core/src/main/java/com/plotsquared/core/command/Condense.java index 2b93b6839..c8168e41b 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Condense.java +++ b/Core/src/main/java/com/plotsquared/core/command/Condense.java @@ -138,13 +138,13 @@ public class Condense extends SubCommand { } List toMove = new ArrayList<>(getPlots(allPlots, radius)); final List free = new ArrayList<>(); - PlotId start = new PlotId(0, 0); - while (start.x <= minimumRadius && start.y <= minimumRadius) { + PlotId start = PlotId.of(0, 0); + while (start.getX() <= minimumRadius && start.getY() <= minimumRadius) { Plot plot = area.getPlotAbs(start); if (plot != null && !plot.hasOwner()) { free.add(plot.getId()); } - start = Auto.getNextPlotId(start, 1); + start = start.getNextId(); } if (free.isEmpty() || toMove.isEmpty()) { MainUtil.sendMessage(player, "NO FREE PLOTS FOUND"); @@ -249,8 +249,8 @@ public class Condense extends SubCommand { public Set getPlots(Collection plots, int radius) { HashSet outside = new HashSet<>(); for (Plot plot : plots) { - if (plot.getId().x > radius || plot.getId().x < -radius || plot.getId().y > radius - || plot.getId().y < -radius) { + if (plot.getId().getX() > radius || plot.getId().getX() < -radius || plot.getId().getY() > radius + || plot.getId().getY() < -radius) { outside.add(plot.getId()); } } diff --git a/Core/src/main/java/com/plotsquared/core/command/DatabaseCommand.java b/Core/src/main/java/com/plotsquared/core/command/DatabaseCommand.java index 424363e3f..96a0592d9 100644 --- a/Core/src/main/java/com/plotsquared/core/command/DatabaseCommand.java +++ b/Core/src/main/java/com/plotsquared/core/command/DatabaseCommand.java @@ -158,9 +158,7 @@ public class DatabaseCommand extends SubCommand { newId.toCommaSeparatedString()); worldFile.renameTo(newFile); } - id.x = newId.x; - id.y = newId.y; - id.recalculateHash(); + plot.setId(newId.copy()); plot.setArea(pa); plots.add(plot); continue; diff --git a/Core/src/main/java/com/plotsquared/core/command/DebugImportWorlds.java b/Core/src/main/java/com/plotsquared/core/command/DebugImportWorlds.java index 0f15c1528..203779679 100644 --- a/Core/src/main/java/com/plotsquared/core/command/DebugImportWorlds.java +++ b/Core/src/main/java/com/plotsquared/core/command/DebugImportWorlds.java @@ -70,7 +70,7 @@ public class DebugImportWorlds extends Command { return CompletableFuture.completedFuture(false); } SinglePlotArea area = ((SinglePlotAreaManager) this.plotAreaManager).getArea(); - PlotId id = new PlotId(0, 0); + PlotId id = PlotId.of(0, 0); File container = PlotSquared.platform().getWorldContainer(); if (container.equals(new File("."))) { player.sendMessage( @@ -92,7 +92,7 @@ public class DebugImportWorlds extends Command { UUID.nameUUIDFromBytes(("OfflinePlayer:" + name).getBytes(Charsets.UTF_8)); } while (new File(container, id.toCommaSeparatedString()).exists()) { - id = Auto.getNextPlotId(id, 1); + id = id.getNextId(); } File newDir = new File(container, id.toCommaSeparatedString()); if (folder.renameTo(newDir)) { diff --git a/Core/src/main/java/com/plotsquared/core/command/Info.java b/Core/src/main/java/com/plotsquared/core/command/Info.java index 125d0008d..fab3d412f 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Info.java +++ b/Core/src/main/java/com/plotsquared/core/command/Info.java @@ -118,7 +118,7 @@ public class Info extends SubCommand { // Unclaimed? if (!hasOwner && !containsEveryone && !trustedEveryone) { MainUtil.sendMessage(player, Captions.PLOT_INFO_UNCLAIMED, - plot.getId().x + ";" + plot.getId().y); + plot.getId().getX() + ";" + plot.getId().getY()); return true; } String info = Captions.PLOT_INFO_FORMAT.getTranslated(); diff --git a/Core/src/main/java/com/plotsquared/core/command/Save.java b/Core/src/main/java/com/plotsquared/core/command/Save.java index 3c814c655..bde167dd9 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Save.java +++ b/Core/src/main/java/com/plotsquared/core/command/Save.java @@ -94,7 +94,7 @@ public class Save extends SubCommand { PlotId id = plot.getId(); String world1 = plot.getArea().toString().replaceAll(";", "-") .replaceAll("[^A-Za-z0-9]", ""); - final String file = time + '_' + world1 + '_' + id.x + '_' + id.y + '_' + size; + final String file = time + '_' + world1 + '_' + id.getX() + '_' + id.getY() + '_' + size; UUID uuid = player.getUUID(); schematicHandler.upload(value, uuid, file, new RunnableVal() { @Override public void run(URL url) { diff --git a/Core/src/main/java/com/plotsquared/core/database/SQLManager.java b/Core/src/main/java/com/plotsquared/core/database/SQLManager.java index 051e4ac3b..cac8497dd 100644 --- a/Core/src/main/java/com/plotsquared/core/database/SQLManager.java +++ b/Core/src/main/java/com/plotsquared/core/database/SQLManager.java @@ -573,8 +573,8 @@ public class SQLManager implements AbstractDB { addPlotTask(plot, new UniqueStatement("setOwner") { @Override public void set(PreparedStatement statement) throws SQLException { statement.setString(1, uuid.toString()); - statement.setInt(2, plot.getId().x); - statement.setInt(3, plot.getId().y); + statement.setInt(2, plot.getId().getX()); + statement.setInt(3, plot.getId().getY()); statement.setString(4, plot.getArea().toString()); } @@ -610,7 +610,7 @@ public class SQLManager implements AbstractDB { int id = result.getInt("id"); int x = result.getInt("plot_id_x"); int y = result.getInt("plot_id_z"); - PlotId plotId = new PlotId(x, y); + PlotId plotId = PlotId.of(x, y); Plot plot = plotMap.get(plotId); idMap.put(plotId, id); if (plot != null) { @@ -759,8 +759,8 @@ public class SQLManager implements AbstractDB { @Override public void setMySQL(PreparedStatement stmt, int i, Plot plot) throws SQLException { - stmt.setInt(i * 5 + 1, plot.getId().x); - stmt.setInt(i * 5 + 2, plot.getId().y); + stmt.setInt(i * 5 + 1, plot.getId().getX()); + stmt.setInt(i * 5 + 2, plot.getId().getY()); try { stmt.setString(i * 5 + 3, plot.getOwnerAbs().toString()); } catch (SQLException ignored) { @@ -773,8 +773,8 @@ public class SQLManager implements AbstractDB { @Override public void setSQLite(PreparedStatement stmt, int i, Plot plot) throws SQLException { stmt.setNull(i * 6 + 1, 4); - stmt.setInt(i * 6 + 2, plot.getId().x); - stmt.setInt(i * 6 + 3, plot.getId().y); + stmt.setInt(i * 6 + 2, plot.getId().getX()); + stmt.setInt(i * 6 + 3, plot.getId().getY()); try { stmt.setString(i * 6 + 4, plot.getOwnerAbs().toString()); } catch (SQLException ignored) { @@ -785,8 +785,8 @@ public class SQLManager implements AbstractDB { } @Override public void setSQL(PreparedStatement stmt, Plot plot) throws SQLException { - stmt.setInt(1, plot.getId().x); - stmt.setInt(2, plot.getId().y); + stmt.setInt(1, plot.getId().getX()); + stmt.setInt(2, plot.getId().getY()); stmt.setString(3, plot.getOwnerAbs().toString()); stmt.setString(4, plot.getArea().toString()); stmt.setTimestamp(5, new Timestamp(plot.getTimestamp())); @@ -1016,14 +1016,14 @@ public class SQLManager implements AbstractDB { public void createPlotSafe(final Plot plot, final Runnable success, final Runnable failure) { addPlotTask(plot, new UniqueStatement("createPlotSafe_" + plot.hashCode()) { @Override public void set(PreparedStatement statement) throws SQLException { - statement.setInt(1, plot.getId().x); - statement.setInt(2, plot.getId().y); + statement.setInt(1, plot.getId().getX()); + statement.setInt(2, plot.getId().getY()); statement.setString(3, plot.getOwnerAbs().toString()); statement.setString(4, plot.getArea().toString()); statement.setTimestamp(5, new Timestamp(plot.getTimestamp())); statement.setString(6, plot.getArea().toString()); - statement.setInt(7, plot.getId().x); - statement.setInt(8, plot.getId().y); + statement.setInt(7, plot.getId().getX()); + statement.setInt(8, plot.getId().getY()); } @Override public PreparedStatement get() throws SQLException { @@ -1085,8 +1085,8 @@ public class SQLManager implements AbstractDB { @Override public void createPlotAndSettings(final Plot plot, Runnable whenDone) { addPlotTask(plot, new UniqueStatement("createPlotAndSettings_" + plot.hashCode()) { @Override public void set(PreparedStatement statement) throws SQLException { - statement.setInt(1, plot.getId().x); - statement.setInt(2, plot.getId().y); + statement.setInt(1, plot.getId().getX()); + statement.setInt(2, plot.getId().getY()); statement.setString(3, plot.getOwnerAbs().toString()); statement.setString(4, plot.getArea().toString()); statement.setTimestamp(5, new Timestamp(plot.getTimestamp())); @@ -1436,10 +1436,10 @@ public class SQLManager implements AbstractDB { try (PreparedStatement stmt = this.connection.prepareStatement( "SELECT `id` FROM `" + this.prefix + "cluster` WHERE `pos1_x` = ? AND `pos1_z` = ? AND `pos2_x` = ? AND `pos2_z` = ? AND `world` = ? ORDER BY `timestamp` ASC")) { - stmt.setInt(1, cluster.getP1().x); - stmt.setInt(2, cluster.getP1().y); - stmt.setInt(3, cluster.getP2().x); - stmt.setInt(4, cluster.getP2().y); + stmt.setInt(1, cluster.getP1().getX()); + stmt.setInt(2, cluster.getP1().getY()); + stmt.setInt(3, cluster.getP2().getX()); + stmt.setInt(4, cluster.getP2().getY()); stmt.setString(5, cluster.area.toString()); try (ResultSet resultSet = stmt.executeQuery()) { c_id = Integer.MAX_VALUE; @@ -1475,8 +1475,8 @@ public class SQLManager implements AbstractDB { try (PreparedStatement statement = this.connection.prepareStatement( "SELECT `id` FROM `" + this.prefix + "plot` WHERE `plot_id_x` = ? AND `plot_id_z` = ? AND world = ? ORDER BY `timestamp` ASC")) { - statement.setInt(1, plot.getId().x); - statement.setInt(2, plot.getId().y); + statement.setInt(1, plot.getId().getX()); + statement.setInt(2, plot.getId().getY()); statement.setString(3, plot.getArea().toString()); try (ResultSet resultSet = statement.executeQuery()) { id = Integer.MAX_VALUE; @@ -1745,7 +1745,7 @@ public class SQLManager implements AbstractDB { + this.prefix + "plot`")) { ArrayList toDelete = new ArrayList<>(); while (resultSet.next()) { - PlotId plot_id = new PlotId(resultSet.getInt("plot_id_x"), + PlotId plot_id = PlotId.of(resultSet.getInt("plot_id_x"), resultSet.getInt("plot_id_z")); id = resultSet.getInt("id"); String areaID = resultSet.getString("world"); @@ -2094,8 +2094,8 @@ public class SQLManager implements AbstractDB { @Override public void movePlot(final Plot original, final Plot newPlot) { addPlotTask(original, new UniqueStatement("movePlot") { @Override public void set(PreparedStatement statement) throws SQLException { - statement.setInt(1, newPlot.getId().x); - statement.setInt(2, newPlot.getId().y); + statement.setInt(1, newPlot.getId().getX()); + statement.setInt(2, newPlot.getId().getY()); statement.setString(3, newPlot.getArea().toString()); statement.setInt(4, getId(original)); } @@ -2245,7 +2245,7 @@ public class SQLManager implements AbstractDB { try (ResultSet r = stmt.executeQuery()) { ids = new HashSet<>(); while (r.next()) { - PlotId plot_id = new PlotId(r.getInt("plot_id_x"), r.getInt("plot_id_z")); + PlotId plot_id = PlotId.of(r.getInt("plot_id_x"), r.getInt("plot_id_z")); if (plots.contains(plot_id)) { ids.add(r.getInt("id")); } @@ -2259,7 +2259,7 @@ public class SQLManager implements AbstractDB { for (Iterator iterator = plots.iterator(); iterator.hasNext(); ) { PlotId plotId = iterator.next(); iterator.remove(); - PlotId id = new PlotId(plotId.x, plotId.y); + PlotId id = PlotId.of(plotId.getX(), plotId.getY()); area.removePlot(id); } }); @@ -2695,9 +2695,9 @@ public class SQLManager implements AbstractDB { int id; while (resultSet.next()) { PlotId pos1 = - new PlotId(resultSet.getInt("pos1_x"), resultSet.getInt("pos1_z")); + PlotId.of(resultSet.getInt("pos1_x"), resultSet.getInt("pos1_z")); PlotId pos2 = - new PlotId(resultSet.getInt("pos2_x"), resultSet.getInt("pos2_z")); + PlotId.of(resultSet.getInt("pos2_x"), resultSet.getInt("pos2_z")); id = resultSet.getInt("id"); String areaid = resultSet.getString("world"); if (!areas.contains(areaid)) { @@ -2854,10 +2854,10 @@ public class SQLManager implements AbstractDB { @Override public void createCluster(final PlotCluster cluster) { addClusterTask(cluster, new UniqueStatement("createCluster_" + cluster.hashCode()) { @Override public void set(PreparedStatement statement) throws SQLException { - statement.setInt(1, cluster.getP1().x); - statement.setInt(2, cluster.getP1().y); - statement.setInt(3, cluster.getP2().x); - statement.setInt(4, cluster.getP2().y); + statement.setInt(1, cluster.getP1().getX()); + statement.setInt(2, cluster.getP1().getY()); + statement.setInt(3, cluster.getP2().getX()); + statement.setInt(4, cluster.getP2().getY()); statement.setString(5, cluster.owner.toString()); statement.setString(6, cluster.area.toString()); } @@ -2895,17 +2895,17 @@ public class SQLManager implements AbstractDB { } @Override public void resizeCluster(final PlotCluster current, PlotId min, PlotId max) { - final PlotId pos1 = new PlotId(current.getP1().x, current.getP1().y); - final PlotId pos2 = new PlotId(current.getP2().x, current.getP2().y); + final PlotId pos1 = PlotId.of(current.getP1().getX(), current.getP1().getY()); + final PlotId pos2 = PlotId.of(current.getP2().getX(), current.getP2().getY()); current.setP1(min); current.setP2(max); addClusterTask(current, new UniqueStatement("resizeCluster") { @Override public void set(PreparedStatement statement) throws SQLException { - statement.setInt(1, pos1.x); - statement.setInt(2, pos1.y); - statement.setInt(3, pos2.x); - statement.setInt(4, pos2.y); + statement.setInt(1, pos1.getX()); + statement.setInt(2, pos1.getY()); + statement.setInt(3, pos2.getX()); + statement.setInt(4, pos2.getY()); statement.setInt(5, getClusterId(current)); } @@ -3141,10 +3141,10 @@ public class SQLManager implements AbstractDB { + "plot` SET `world` = ? WHERE `world` = ? AND `plot_id_x` BETWEEN ? AND ? AND `plot_id_z` BETWEEN ? AND ?")) { stmt.setString(1, newWorld); stmt.setString(2, oldWorld); - stmt.setInt(3, min.x); - stmt.setInt(4, max.x); - stmt.setInt(5, min.y); - stmt.setInt(6, max.y); + stmt.setInt(3, min.getX()); + stmt.setInt(4, max.getX()); + stmt.setInt(5, min.getY()); + stmt.setInt(6, max.getY()); stmt.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); @@ -3154,10 +3154,10 @@ public class SQLManager implements AbstractDB { + "cluster` SET `world` = ? WHERE `world` = ? AND `pos1_x` <= ? AND `pos1_z` <= ? AND `pos2_x` >= ? AND `pos2_z` >= ?")) { stmt.setString(1, newWorld); stmt.setString(2, oldWorld); - stmt.setInt(3, max.x); - stmt.setInt(4, max.y); - stmt.setInt(5, min.x); - stmt.setInt(6, min.y); + stmt.setInt(3, max.getX()); + stmt.setInt(4, max.getY()); + stmt.setInt(5, min.getX()); + stmt.setInt(6, min.getY()); stmt.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); diff --git a/Core/src/main/java/com/plotsquared/core/generator/HybridPlotManager.java b/Core/src/main/java/com/plotsquared/core/generator/HybridPlotManager.java index e7fd298a0..c23c63b6c 100644 --- a/Core/src/main/java/com/plotsquared/core/generator/HybridPlotManager.java +++ b/Core/src/main/java/com/plotsquared/core/generator/HybridPlotManager.java @@ -103,7 +103,7 @@ public class HybridPlotManager extends ClassicPlotManager { @Override public boolean createRoadEast(Plot plot) { super.createRoadEast(plot); PlotId id = plot.getId(); - PlotId id2 = new PlotId(id.x + 1, id.y); + PlotId id2 = PlotId.of(id.getX() + 1, id.getY()); Location bot = getPlotBottomLocAbs(id2); Location top = getPlotTopLocAbs(id); Location pos1 = Location.at(hybridPlotWorld.getWorldName(), top.getX() + 1, 0, bot.getZ() - 1); @@ -164,7 +164,7 @@ public class HybridPlotManager extends ClassicPlotManager { @Override public boolean createRoadSouth(Plot plot) { super.createRoadSouth(plot); PlotId id = plot.getId(); - PlotId id2 = new PlotId(id.x, id.y + 1); + PlotId id2 = PlotId.of(id.getX(), id.getY() + 1); Location bot = getPlotBottomLocAbs(id2); Location top = getPlotTopLocAbs(id); Location pos1 = Location.at(hybridPlotWorld.getWorldName(), bot.getX() - 1, 0, top.getZ() + 1); @@ -183,7 +183,7 @@ public class HybridPlotManager extends ClassicPlotManager { @Override public boolean createRoadSouthEast(Plot plot) { super.createRoadSouthEast(plot); PlotId id = plot.getId(); - PlotId id2 = new PlotId(id.x + 1, id.y + 1); + PlotId id2 = PlotId.of(id.getX() + 1, id.getY() + 1); Location pos1 = getPlotTopLocAbs(id).add(1, 0, 1).withY(0); Location pos2 = getPlotBottomLocAbs(id2).withY(Math.min(getWorldHeight(), 255)); LocalBlockQueue queue = hybridPlotWorld.getQueue(false); diff --git a/Core/src/main/java/com/plotsquared/core/generator/SquarePlotManager.java b/Core/src/main/java/com/plotsquared/core/generator/SquarePlotManager.java index 27e093f1b..be5380cce 100644 --- a/Core/src/main/java/com/plotsquared/core/generator/SquarePlotManager.java +++ b/Core/src/main/java/com/plotsquared/core/generator/SquarePlotManager.java @@ -77,8 +77,8 @@ public abstract class SquarePlotManager extends GridPlotManager { } @Override public Location getPlotTopLocAbs(PlotId plotId) { - int px = plotId.x; - int pz = plotId.y; + int px = plotId.getX(); + int pz = plotId.getY(); int x = (squarePlotWorld.ROAD_OFFSET_X + (px * (squarePlotWorld.ROAD_WIDTH + squarePlotWorld.PLOT_WIDTH))) - (int) Math.floor(squarePlotWorld.ROAD_WIDTH / 2) - 1; int z = (squarePlotWorld.ROAD_OFFSET_Z + (pz * (squarePlotWorld.ROAD_WIDTH @@ -126,7 +126,7 @@ public abstract class SquarePlotManager extends GridPlotManager { if (z <= pathWidthLower || z > end || x <= pathWidthLower || x > end) { return null; } else { - return new PlotId(idx, idz); + return PlotId.of(idx, idz); } } @@ -151,7 +151,7 @@ public abstract class SquarePlotManager extends GridPlotManager { } else { idz = (z / size) + 1; } - return new PlotId(idx, idz); + return PlotId.of(idx, idz); } @Override public PlotId getPlotId(int x, int y, int z) { @@ -190,7 +190,7 @@ public abstract class SquarePlotManager extends GridPlotManager { dz = (z / size) + 1; rz = z % size; } - PlotId id = new PlotId(dx, dz); + PlotId id = PlotId.of(dx, dz); boolean[] merged = new boolean[] {rz <= pathWidthLower, rx > end, rz > end, rx <= pathWidthLower}; int hash = MainUtil.hash(merged); @@ -240,8 +240,8 @@ public abstract class SquarePlotManager extends GridPlotManager { * Get the bottom plot loc (some basic math). */ @Override public Location getPlotBottomLocAbs(PlotId plotId) { - int px = plotId.x; - int pz = plotId.y; + int px = plotId.getX(); + int pz = plotId.getY(); int x = (squarePlotWorld.ROAD_OFFSET_X + (px * (squarePlotWorld.ROAD_WIDTH + squarePlotWorld.PLOT_WIDTH))) - squarePlotWorld.PLOT_WIDTH - (int) Math .floor(squarePlotWorld.ROAD_WIDTH / 2); diff --git a/Core/src/main/java/com/plotsquared/core/listener/PlotListener.java b/Core/src/main/java/com/plotsquared/core/listener/PlotListener.java index 911f65286..49610c8cb 100644 --- a/Core/src/main/java/com/plotsquared/core/listener/PlotListener.java +++ b/Core/src/main/java/com/plotsquared/core/listener/PlotListener.java @@ -266,8 +266,8 @@ public class PlotListener { Plot lastPlot = player.getMeta(PlotPlayer.META_LAST_PLOT); if ((lastPlot != null) && plot.getId().equals(lastPlot.getId())) { Map replacements = new HashMap<>(); - replacements.put("%x%", String.valueOf(lastPlot.getId().x)); - replacements.put("%z%", lastPlot.getId().y + ""); + replacements.put("%x%", String.valueOf(lastPlot.getId().getX())); + replacements.put("%z%", lastPlot.getId().getY() + ""); replacements.put("%world%", plot.getArea().toString()); replacements.put("%greeting%", greeting); replacements.put("%alias", plot.toString()); diff --git a/Core/src/main/java/com/plotsquared/core/location/BlockLoc.java b/Core/src/main/java/com/plotsquared/core/location/BlockLoc.java index 0fd25c48b..34ab4750d 100644 --- a/Core/src/main/java/com/plotsquared/core/location/BlockLoc.java +++ b/Core/src/main/java/com/plotsquared/core/location/BlockLoc.java @@ -117,4 +117,5 @@ public class BlockLoc { public float getPitch() { return pitch; } + } diff --git a/Core/src/main/java/com/plotsquared/core/location/Location.java b/Core/src/main/java/com/plotsquared/core/location/Location.java index 53db29ed7..60ba99f1d 100644 --- a/Core/src/main/java/com/plotsquared/core/location/Location.java +++ b/Core/src/main/java/com/plotsquared/core/location/Location.java @@ -25,13 +25,13 @@ */ package com.plotsquared.core.location; +import com.google.common.base.Objects; import com.google.common.base.Preconditions; import com.plotsquared.core.PlotSquared; import com.plotsquared.core.plot.Plot; import com.plotsquared.core.plot.PlotArea; import com.sk89q.worldedit.math.BlockVector2; import com.sk89q.worldedit.math.BlockVector3; -import lombok.EqualsAndHashCode; import lombok.Getter; import org.khelekore.prtree.MBR; import org.khelekore.prtree.SimpleMBR; @@ -42,8 +42,7 @@ import javax.annotation.Nullable; /** * An unmodifiable 6-tuple (world,x,y,z,yaw,pitch) */ -@EqualsAndHashCode @SuppressWarnings("unused") -public final class Location implements Comparable { +public final class Location extends BlockLoc implements Comparable { @Getter private final float yaw; @Getter private final float pitch; @@ -52,6 +51,7 @@ public final class Location implements Comparable { private Location(@Nonnull final World world, @Nonnull final BlockVector3 blockVector3, final float yaw, final float pitch) { + super(blockVector3.getX(), blockVector3.getY(), blockVector3.getZ(), yaw, pitch); this.world = Preconditions.checkNotNull(world, "World may not be null"); this.blockVector3 = Preconditions.checkNotNull(blockVector3, "Vector may not be null"); this.yaw = yaw; @@ -60,6 +60,7 @@ public final class Location implements Comparable { private Location(@Nonnull final String worldName, @Nonnull final BlockVector3 blockVector3, final float yaw, final float pitch) { + super(blockVector3.getX(), blockVector3.getY(), blockVector3.getZ(), yaw, pitch); Preconditions.checkNotNull(worldName, "World name may not be null"); if (worldName.isEmpty()) { this.world = World.nullWorld(); @@ -446,6 +447,28 @@ public final class Location implements Comparable { return 1; } + @Override public boolean equals(final Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + if (!super.equals(o)) { + return false; + } + final Location location = (Location) o; + return Float.compare(location.getYaw(), getYaw()) == 0 + && Float.compare(location.getPitch(), getPitch()) == 0 && Objects + .equal(getBlockVector3(), location.getBlockVector3()) && Objects + .equal(getWorld(), location.getWorld()); + } + + @Override public int hashCode() { + return Objects + .hashCode(super.hashCode(), getYaw(), getPitch(), getBlockVector3(), getWorld()); + } + @Override public String toString() { return "\"plotsquaredlocation\":{\"x\":" + this.getX() + ",\"y\":" + this.getY() + ",\"z\":" + this.getZ() + ",\"yaw\":" + this.yaw + ",\"pitch\":" + this.pitch + ",\"world\":\"" diff --git a/Core/src/main/java/com/plotsquared/core/location/PlotLoc.java b/Core/src/main/java/com/plotsquared/core/location/PlotLoc.java index 8301f23a7..76135262d 100644 --- a/Core/src/main/java/com/plotsquared/core/location/PlotLoc.java +++ b/Core/src/main/java/com/plotsquared/core/location/PlotLoc.java @@ -76,11 +76,11 @@ public final class PlotLoc { } public int getX() { - return this.x; + return this.getX(); } public int getY() { - return this.y; + return this.getY(); } public int getZ() { @@ -90,14 +90,14 @@ public final class PlotLoc { @Override public int hashCode() { final int prime = 31; int result = 1; - result = (prime * result) + this.x; - result = (prime * result) + this.y; + result = (prime * result) + this.getX(); + result = (prime * result) + this.getY(); result = (prime * result) + this.z; return result; } @Override public String toString() { - if (this.y == -1) { + if (this.getY() == -1) { return String.format("%d,%d", x, z); } return String.format("%d,%d,%d", x, y, z); @@ -111,6 +111,6 @@ public final class PlotLoc { return false; } final PlotLoc other = (PlotLoc) obj; - return (this.x == other.x) && (this.y == other.y) && (this.z == other.z); + return (this.getX() == other.getX()) && (this.getY() == other.getY()) && (this.z == other.z); } } diff --git a/Core/src/main/java/com/plotsquared/core/player/PlotPlayer.java b/Core/src/main/java/com/plotsquared/core/player/PlotPlayer.java index 7b4c8f530..6d2428d05 100644 --- a/Core/src/main/java/com/plotsquared/core/player/PlotPlayer.java +++ b/Core/src/main/java/com/plotsquared/core/player/PlotPlayer.java @@ -576,8 +576,8 @@ public abstract class PlotPlayer

implements CommandCaller, OfflinePlotPlayer if (plot != null && Settings.Enabled_Components.PERSISTENT_META && plot .getArea() instanceof SinglePlotArea) { PlotId id = plot.getId(); - int x = id.x; - int z = id.y; + int x = id.getX(); + int z = id.getY(); ByteBuffer buffer = ByteBuffer.allocate(13); buffer.putShort((short) x); buffer.putShort((short) z); @@ -677,7 +677,7 @@ public abstract class PlotPlayer

implements CommandCaller, OfflinePlotPlayer ByteBuffer quitWorld = ByteBuffer.wrap(arr); final int plotX = quitWorld.getShort(); final int plotZ = quitWorld.getShort(); - PlotId id = new PlotId(plotX, plotZ); + PlotId id = PlotId.of(plotX, plotZ); int x = quitWorld.getInt(); int y = quitWorld.get() & 0xFF; int z = quitWorld.getInt(); diff --git a/Core/src/main/java/com/plotsquared/core/plot/Plot.java b/Core/src/main/java/com/plotsquared/core/plot/Plot.java index ba2384661..ba18a5649 100644 --- a/Core/src/main/java/com/plotsquared/core/plot/Plot.java +++ b/Core/src/main/java/com/plotsquared/core/plot/Plot.java @@ -76,11 +76,11 @@ import com.sk89q.worldedit.regions.CuboidRegion; import com.sk89q.worldedit.world.biome.BiomeType; import com.sk89q.worldedit.world.block.BlockTypes; import lombok.Getter; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; import java.awt.geom.Area; import java.awt.geom.PathIterator; import java.awt.geom.Rectangle2D; @@ -131,7 +131,7 @@ public class Plot { private static Set connected_cache; private static Set regions_cache; - @Nonnull private final PlotId id; + @Nonnull private PlotId id; // These will be injected @Inject private EventDispatcher eventDispatcher; @@ -664,7 +664,7 @@ public class Plot { this.origin = this; PlotId min = this.id; for (Plot plot : this.getConnectedPlots()) { - if (plot.id.y < min.y || plot.id.y == min.y && plot.id.x < min.x) { + if (plot.id.getY() < min.getY() || plot.id.getY() == min.getY() && plot.id.getX() < min.getX()) { this.origin = plot; min = plot.id; } @@ -733,8 +733,10 @@ public class Plot { int i2 = 0; if (this.getSettings().getMerged(i2)) { if (this.getSettings().getMerged(i)) { - if (this.area.getPlotAbs(this.id.getRelative(i)).getMerged(i2)) { - return this.area.getPlotAbs(this.id.getRelative(i2)).getMerged(i); + if (this.area.getPlotAbs(this.id.getRelative(Direction.getFromIndex(i))) + .getMerged(i2)) { + return this.area.getPlotAbs(this.id.getRelative(Direction.getFromIndex(i2))) + .getMerged(i); } } } @@ -745,8 +747,9 @@ public class Plot { i = dir - 4; i2 = dir - 3; return this.getSettings().getMerged(i2) && this.getSettings().getMerged(i) - && this.area.getPlotAbs(this.id.getRelative(i)).getMerged(i2) && this.area - .getPlotAbs(this.id.getRelative(i2)).getMerged(i); + && this.area.getPlotAbs(this.id.getRelative(Direction.getFromIndex(i))) + .getMerged(i2) && this.area + .getPlotAbs(this.id.getRelative(Direction.getFromIndex(i2))).getMerged(i); } return false; @@ -1910,15 +1913,11 @@ public class Plot { return CompletableFuture.completedFuture(true); } // Swap cached - PlotId temp = new PlotId(this.getId().x, this.getId().y); - this.getId().x = plot.getId().x; - this.getId().y = plot.getId().y; - plot.getId().x = temp.x; - plot.getId().y = temp.y; + final PlotId temp = PlotId.of(this.getId().getX(), this.getId().getY()); + this.id = plot.getId().copy(); + plot.id = temp.copy(); this.area.removePlot(this.getId()); plot.area.removePlot(plot.getId()); - this.getId().recalculateHash(); - plot.getId().recalculateHash(); this.area.addPlotAbs(this); plot.area.addPlotAbs(plot); // Swap database @@ -1942,9 +1941,7 @@ public class Plot { return false; } this.area.removePlot(this.id); - this.getId().x = plot.getId().x; - this.getId().y = plot.getId().y; - this.getId().recalculateHash(); + this.id = plot.getId().copy(); this.area.addPlotAbs(this); DBFunc.movePlot(this, plot); TaskManager.runTaskLater(whenDone, TaskTime.ticks(1L)); @@ -2078,7 +2075,7 @@ public class Plot { if (this.settings != null && this.settings.getAlias().length() > 1) { return this.settings.getAlias(); } - return this.area + ";" + this.id.x + ";" + this.id.y; + return this.area + ";" + this.id.toString(); } @@ -2293,8 +2290,8 @@ public class Plot { if (value) { Plot other = this.getRelative(direction).getBasePlot(false); if (!other.equals(this.getBasePlot(false))) { - Plot base = other.id.y < this.id.y - || other.id.y == this.id.y && other.id.x < this.id.x ? other : this.origin; + Plot base = other.id.getY() < this.id.getY() + || other.id.getY() == this.id.getY() && other.id.getX() < this.id.getX() ? other : this.origin; this.origin.origin = base; other.origin = base; this.origin = base; @@ -2583,36 +2580,21 @@ public class Plot { * @return Plot */ public Plot getRelative(int x, int y) { - return this.area.getPlotAbs(this.id.getRelative(x, y)); + return this.area.getPlotAbs(PlotId.of(this.id.getX() + x, this.id.getY() + y)); } public Plot getRelative(PlotArea area, int x, int y) { - return area.getPlotAbs(this.id.getRelative(x, y)); - } - - /** - * Gets the plot in a relative direction
- * 0 = north
- * 1 = east
- * 2 = south
- * 3 = west
- * Note: May be null if the partial plot area does not include the relative location - * - * @param direction - * @return - */ - @Deprecated public Plot getRelative(int direction) { - return this.area.getPlotAbs(this.id.getRelative(direction)); + return area.getPlotAbs(PlotId.of(this.id.getX() + x, this.id.getY() + y)); } /** * Gets the plot in a relative direction * Note: May be null if the partial plot area does not include the relative location * - * @param direction + * @param direction Direction * @return the plot relative to this one */ - public Plot getRelative(Direction direction) { + @Nullable public Plot getRelative(@Nonnull Direction direction) { return this.area.getPlotAbs(this.id.getRelative(direction)); } @@ -2768,12 +2750,12 @@ public class Plot { continue; } boolean merge = true; - PlotId bot = new PlotId(current.getId().x, current.getId().y); - PlotId top = new PlotId(current.getId().x, current.getId().y); + PlotId bot = PlotId.of(current.getId().getX(), current.getId().getY()); + PlotId top = PlotId.of(current.getId().getX(), current.getId().getY()); while (merge) { merge = false; - ArrayList ids = MainUtil.getPlotSelectionIds(new PlotId(bot.x, bot.y - 1), - new PlotId(top.x, bot.y - 1)); + ArrayList ids = MainUtil.getPlotSelectionIds(PlotId.of(bot.getX(), bot.getY() - 1), + PlotId.of(top.getX(), bot.getY() - 1)); boolean tmp = true; for (PlotId id : ids) { Plot plot = this.area.getPlotAbs(id); @@ -2784,10 +2766,10 @@ public class Plot { } if (tmp) { merge = true; - bot.y--; + bot = PlotId.of(bot.getX(), bot.getY() - 1); } - ids = MainUtil.getPlotSelectionIds(new PlotId(top.x + 1, bot.y), - new PlotId(top.x + 1, top.y)); + ids = MainUtil.getPlotSelectionIds(PlotId.of(top.getX() + 1, bot.getY()), + PlotId.of(top.getX() + 1, top.getY())); tmp = true; for (PlotId id : ids) { Plot plot = this.area.getPlotAbs(id); @@ -2798,10 +2780,10 @@ public class Plot { } if (tmp) { merge = true; - top.x++; + top = PlotId.of(top.getX() + 1, top.getY()); } - ids = MainUtil.getPlotSelectionIds(new PlotId(bot.x, top.y + 1), - new PlotId(top.x, top.y + 1)); + ids = MainUtil.getPlotSelectionIds(PlotId.of(bot.getX(), top.getY() + 1), + PlotId.of(top.getX(), top.getY() + 1)); tmp = true; for (PlotId id : ids) { Plot plot = this.area.getPlotAbs(id); @@ -2812,10 +2794,10 @@ public class Plot { } if (tmp) { merge = true; - top.y++; + top = PlotId.of(top.getX(), top.getY() + 1); } - ids = MainUtil.getPlotSelectionIds(new PlotId(bot.x - 1, bot.y), - new PlotId(bot.x - 1, top.y)); + ids = MainUtil.getPlotSelectionIds(PlotId.of(bot.getX() - 1, bot.getY()), + PlotId.of(bot.getX() - 1, top.getY())); tmp = true; for (PlotId id : ids) { Plot plot = this.area.getPlotAbs(id); @@ -2826,14 +2808,14 @@ public class Plot { } if (tmp) { merge = true; - bot.x--; + bot = PlotId.of(bot.getX() - 1, bot.getX()); } } Location gtopabs = this.area.getPlotAbs(top).getTopAbs(); Location gbotabs = this.area.getPlotAbs(bot).getBottomAbs(); visited.addAll(MainUtil.getPlotSelectionIds(bot, top)); - for (int x = bot.x; x <= top.x; x++) { - Plot plot = this.area.getPlotAbs(new PlotId(x, top.y)); + for (int x = bot.getX(); x <= top.getX(); x++) { + Plot plot = this.area.getPlotAbs(PlotId.of(x, top.getY())); if (plot.getMerged(Direction.SOUTH)) { // south wedge Location toploc = plot.getExtendedTopAbs(); @@ -2852,8 +2834,8 @@ public class Plot { } } - for (int y = bot.y; y <= top.y; y++) { - Plot plot = this.area.getPlotAbs(new PlotId(top.x, y)); + for (int y = bot.getY(); y <= top.getY(); y++) { + Plot plot = this.area.getPlotAbs(PlotId.of(top.getX(), y)); if (plot.getMerged(Direction.EAST)) { // east wedge Location toploc = plot.getExtendedTopAbs(); @@ -3084,8 +3066,8 @@ public class Plot { public void mergePlot(Plot lesserPlot, boolean removeRoads) { Plot greaterPlot = this; lesserPlot.removeSign(); - if (lesserPlot.getId().x == greaterPlot.getId().x) { - if (lesserPlot.getId().y > greaterPlot.getId().y) { + if (lesserPlot.getId().getX() == greaterPlot.getId().getX()) { + if (lesserPlot.getId().getY() > greaterPlot.getId().getY()) { Plot tmp = lesserPlot; lesserPlot = greaterPlot; greaterPlot = tmp; @@ -3110,7 +3092,7 @@ public class Plot { } } } else { - if (lesserPlot.getId().x > greaterPlot.getId().x) { + if (lesserPlot.getId().getX() > greaterPlot.getId().getX()) { Plot tmp = lesserPlot; lesserPlot = greaterPlot; greaterPlot = tmp; @@ -3148,8 +3130,8 @@ public class Plot { */ public CompletableFuture move(final Plot destination, final Runnable whenDone, boolean allowSwap) { - final PlotId offset = new PlotId(destination.getId().x - this.getId().x, - destination.getId().y - this.getId().y); + final PlotId offset = PlotId.of(destination.getId().getX() - this.getId().getX(), + destination.getId().getY() - this.getId().getY()); Location db = destination.getBottomAbs(); Location ob = this.getBottomAbs(); final int offsetX = db.getX() - ob.getX(); @@ -3161,7 +3143,7 @@ public class Plot { AtomicBoolean occupied = new AtomicBoolean(false); Set plots = this.getConnectedPlots(); for (Plot plot : plots) { - Plot other = plot.getRelative(destination.getArea(), offset.x, offset.y); + Plot other = plot.getRelative(destination.getArea(), offset.getX(), offset.getY()); if (other.hasOwner()) { if (!allowSwap) { TaskManager.runTaskLater(whenDone, TaskTime.ticks(1L)); @@ -3184,7 +3166,7 @@ public class Plot { if (plotIterator.hasNext()) { while (plotIterator.hasNext()) { final Plot plot = plotIterator.next(); - final Plot other = plot.getRelative(destination.getArea(), offset.x, offset.y); + final Plot other = plot.getRelative(destination.getArea(), offset.getX(), offset.getY()); final CompletableFuture swapResult = plot.swapData(other); if (future == null) { future = swapResult; @@ -3227,7 +3209,7 @@ public class Plot { if (regions.isEmpty()) { Plot plot = destination.getRelative(0, 0); Plot originPlot = originArea - .getPlotAbs(new PlotId(plot.id.x - offset.x, plot.id.y - offset.y)); + .getPlotAbs(PlotId.of(plot.id.getX() - offset.getX(), plot.id.getY() - offset.getY())); final Runnable clearDone = () -> { for (final Plot current : plot.getConnectedPlots()) { getManager().claimPlot(current); @@ -3264,8 +3246,8 @@ public class Plot { * @return */ public boolean copy(final Plot destination, final Runnable whenDone) { - PlotId offset = new PlotId(destination.getId().x - this.getId().x, - destination.getId().y - this.getId().y); + PlotId offset = PlotId.of(destination.getId().getX() - this.getId().getX(), + destination.getId().getY() - this.getId().getY()); Location db = destination.getBottomAbs(); Location ob = this.getBottomAbs(); final int offsetX = db.getX() - ob.getX(); @@ -3276,7 +3258,7 @@ public class Plot { } Set plots = this.getConnectedPlots(); for (Plot plot : plots) { - Plot other = plot.getRelative(destination.getArea(), offset.x, offset.y); + Plot other = plot.getRelative(destination.getArea(), offset.getX(), offset.getY()); if (other.hasOwner()) { TaskManager.runTaskLater(whenDone, TaskTime.ticks(1L)); return false; @@ -3286,7 +3268,7 @@ public class Plot { destination.updateWorldBorder(); // copy data for (Plot plot : plots) { - Plot other = plot.getRelative(destination.getArea(), offset.x, offset.y); + Plot other = plot.getRelative(destination.getArea(), offset.getX(), offset.getY()); other.create(plot.getOwner(), false); if (!plot.getFlagContainer().getFlagMap().isEmpty()) { final Collection> existingFlags = other.getFlags(); @@ -3399,4 +3381,13 @@ public class Plot { return FlagContainer.castUnsafe(flagInstance).getValue(); } + /** + * Change the plot ID + * + * @param id new plot ID + */ + public void setId(@Nonnull final PlotId id) { + this.id = id; + } + } diff --git a/Core/src/main/java/com/plotsquared/core/plot/PlotArea.java b/Core/src/main/java/com/plotsquared/core/plot/PlotArea.java index 9ad26c0aa..027e73e0b 100644 --- a/Core/src/main/java/com/plotsquared/core/plot/PlotArea.java +++ b/Core/src/main/java/com/plotsquared/core/plot/PlotArea.java @@ -27,7 +27,6 @@ package com.plotsquared.core.plot; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; -import com.plotsquared.core.PlotSquared; import com.plotsquared.core.collection.QuadMap; import com.plotsquared.core.configuration.CaptionUtility; import com.plotsquared.core.configuration.Captions; @@ -66,11 +65,11 @@ import com.sk89q.worldedit.world.gamemode.GameModes; import lombok.AccessLevel; import lombok.Getter; import lombok.Setter; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -215,8 +214,8 @@ public abstract class PlotArea { * * @return the minimum value for a {@link PlotId} */ - public PlotId getMin() { - return this.min == null ? new PlotId(Integer.MIN_VALUE, Integer.MIN_VALUE) : this.min; + @Nonnull public PlotId getMin() { + return this.min == null ? PlotId.of(Integer.MIN_VALUE, Integer.MIN_VALUE) : this.min; } /** @@ -224,8 +223,8 @@ public abstract class PlotArea { * * @return the maximum value for a {@link PlotId} */ - public PlotId getMax() { - return this.max == null ? new PlotId(Integer.MAX_VALUE, Integer.MAX_VALUE) : this.max; + @Nonnull public PlotId getMax() { + return this.max == null ? PlotId.of(Integer.MAX_VALUE, Integer.MAX_VALUE) : this.max; } @Override public boolean equals(Object obj) { @@ -596,8 +595,8 @@ public abstract class PlotArea { } public boolean contains(@Nonnull final PlotId id) { - return this.min == null || (id.x >= this.min.x && id.x <= this.max.x && id.y >= this.min.y - && id.y <= this.max.y); + return this.min == null || (id.getX() >= this.min.getX() && id.getX() <= this.max.getX() && + id.getY() >= this.min.getY() && id.getY() <= this.max.getY()); } public boolean contains(@Nonnull final Location location) { @@ -661,8 +660,8 @@ public abstract class PlotArea { @Nullable public Plot getPlotAbs(@Nonnull final PlotId id) { Plot plot = getOwnedPlotAbs(id); if (plot == null) { - if (this.min != null && (id.x < this.min.x || id.x > this.max.x || id.y < this.min.y - || id.y > this.max.y)) { + if (this.min != null && (id.getX() < this.min.getX() || id.getX() > this.max.getX() || id.getY() < this.min.getY() + || id.getY() > this.max.getY())) { return null; } return new Plot(this, id); @@ -673,8 +672,8 @@ public abstract class PlotArea { @Nullable public Plot getPlot(@Nonnull final PlotId id) { final Plot plot = getOwnedPlotAbs(id); if (plot == null) { - if (this.min != null && (id.x < this.min.x || id.x > this.max.x || id.y < this.min.y - || id.y > this.max.y)) { + if (this.min != null && (id.getX() < this.min.getX() || id.getX() > this.max.getX() || id.getY() < this.min.getY() + || id.getY() > this.max.getY())) { return null; } return new Plot(this, id); @@ -696,7 +695,7 @@ public abstract class PlotArea { if (plot == null) { return null; } - return this.clusters != null ? this.clusters.get(plot.getId().x, plot.getId().y) : null; + return this.clusters != null ? this.clusters.get(plot.getId().getX(), plot.getId().getY()) : null; } @Nullable @@ -714,7 +713,7 @@ public abstract class PlotArea { } @Nullable PlotCluster getCluster(@Nonnull final PlotId id) { - return this.clusters != null ? this.clusters.get(id.x, id.y) : null; + return this.clusters != null ? this.clusters.get(id.getX(), id.getY()) : null; } /** @@ -800,22 +799,22 @@ public abstract class PlotArea { PlotId min = getMin(); PlotId max = getMax(); if (getType() == PlotAreaType.PARTIAL) { - center = new PlotId(MathMan.average(min.x, max.x), MathMan.average(min.y, max.y)); - plots = Math.max(max.x - min.x + 1, max.y - min.y + 1) + 1; + center = PlotId.of(MathMan.average(min.getX(), max.getX()), MathMan.average(min.getY(), max.getY())); + plots = Math.max(max.getX() - min.getX() + 1, max.getY() - min.getY() + 1) + 1; if (start != null) { - start = new PlotId(start.x - center.x, start.y - center.y); + start = PlotId.of(start.getX() - center.getX(), start.getY() - center.getY()); } } else { - center = new PlotId(0, 0); + center = PlotId.of(0, 0); plots = Integer.MAX_VALUE; } for (int i = 0; i < plots; i++) { if (start == null) { - start = getMeta("lastPlot", new PlotId(0, 0)); + start = getMeta("lastPlot", PlotId.of(0, 0)); } else { - start = start.getNextId(1); + start = start.getNextId(); } - PlotId currentId = new PlotId(center.x + start.x, center.y + start.y); + PlotId currentId = PlotId.of(center.getX() + start.getX(), center.getY() + start.getY()); Plot plot = getPlotAbs(currentId); if (plot != null && plot.canClaim(player)) { setMeta("lastPlot", start); @@ -888,7 +887,7 @@ public abstract class PlotArea { public boolean canClaim(@Nullable final PlotPlayer player, @Nonnull final PlotId pos1, @Nonnull final PlotId pos2) { - if (pos1.x == pos2.x && pos1.y == pos2.y) { + if (pos1.getX() == pos2.getX() && pos1.getY() == pos2.getY()) { if (getOwnedPlot(pos1) != null) { return false; } @@ -898,9 +897,9 @@ public abstract class PlotArea { } return plot.canClaim(player); } - for (int x = pos1.x; x <= pos2.x; x++) { - for (int y = pos1.y; y <= pos2.y; y++) { - final PlotId id = new PlotId(x, y); + for (int x = pos1.getX(); x <= pos2.getX(); x++) { + for (int y = pos1.getY(); y <= pos2.getY(); y++) { + final PlotId id = PlotId.of(x, y); final Plot plot = getPlotAbs(id); if (plot == null) { return false; @@ -930,9 +929,9 @@ public abstract class PlotArea { final Set trusted = new HashSet<>(); final Set members = new HashSet<>(); final Set denied = new HashSet<>(); - for (int x = pos1.x; x <= pos2.x; x++) { - for (int y = pos1.y; y <= pos2.y; y++) { - PlotId id = new PlotId(x, y); + for (int x = pos1.getX(); x <= pos2.getX(); x++) { + for (int y = pos1.getY(); y <= pos2.getY(); y++) { + PlotId id = PlotId.of(x, y); Plot plot = getPlotAbs(id); trusted.addAll(plot.getTrusted()); members.addAll(plot.getMembers()); @@ -945,11 +944,11 @@ public abstract class PlotArea { members.removeAll(trusted); denied.removeAll(trusted); denied.removeAll(members); - for (int x = pos1.x; x <= pos2.x; x++) { - for (int y = pos1.y; y <= pos2.y; y++) { - final boolean lx = x < pos2.x; - final boolean ly = y < pos2.y; - final PlotId id = new PlotId(x, y); + for (int x = pos1.getX(); x <= pos2.getX(); x++) { + for (int y = pos1.getY(); y <= pos2.getY(); y++) { + final boolean lx = x < pos2.getX(); + final boolean ly = y < pos2.getY(); + final PlotId id = PlotId.of(x, y); final Plot plot = getPlotAbs(id); plot.setTrusted(trusted); @@ -991,22 +990,22 @@ public abstract class PlotArea { * @return the plots in the selection which are owned */ public Set getPlotSelectionOwned(@Nonnull final PlotId pos1, @Nonnull final PlotId pos2) { - final int size = (1 + pos2.x - pos1.x) * (1 + pos2.y - pos1.y); + final int size = (1 + pos2.getX() - pos1.getX()) * (1 + pos2.getY() - pos1.getY()); final Set result = new HashSet<>(); if (size < 16 || size < getPlotCount()) { for (final PlotId pid : MainUtil.getPlotSelectionIds(pos1, pos2)) { final Plot plot = getPlotAbs(pid); if (plot.hasOwner()) { - if (plot.getId().x > pos1.x || plot.getId().y > pos1.y - || plot.getId().x < pos2.x || plot.getId().y < pos2.y) { + if (plot.getId().getX() > pos1.getX() || plot.getId().getY() > pos1.getY() + || plot.getId().getX() < pos2.getX() || plot.getId().getY() < pos2.getY()) { result.add(plot); } } } } else { for (final Plot plot : getPlots()) { - if (plot.getId().x > pos1.x || plot.getId().y > pos1.y || plot.getId().x < pos2.x - || plot.getId().y < pos2.y) { + if (plot.getId().getX() > pos1.getX() || plot.getId().getY() > pos1.getY() || plot.getId().getX() < pos2.getX() + || plot.getId().getY() < pos2.getY()) { result.add(plot); } } @@ -1026,8 +1025,8 @@ public abstract class PlotArea { if (this.clusters == null) { this.clusters = new QuadMap(Integer.MAX_VALUE, 0, 0, 62) { @Override public CuboidRegion getRegion(PlotCluster value) { - BlockVector2 pos1 = BlockVector2.at(value.getP1().x, value.getP1().y); - BlockVector2 pos2 = BlockVector2.at(value.getP2().x, value.getP2().y); + BlockVector2 pos1 = BlockVector2.at(value.getP1().getX(), value.getP1().getY()); + BlockVector2 pos2 = BlockVector2.at(value.getP2().getX(), value.getP2().getY()); return new CuboidRegion(pos1.toBlockVector3(), pos2.toBlockVector3(Plot.MAX_HEIGHT - 1)); } diff --git a/Core/src/main/java/com/plotsquared/core/plot/PlotCluster.java b/Core/src/main/java/com/plotsquared/core/plot/PlotCluster.java index ea7484129..f5ec63146 100644 --- a/Core/src/main/java/com/plotsquared/core/plot/PlotCluster.java +++ b/Core/src/main/java/com/plotsquared/core/plot/PlotCluster.java @@ -32,6 +32,7 @@ import com.plotsquared.core.util.MainUtil; import com.plotsquared.core.util.RegionUtil; import com.sk89q.worldedit.regions.CuboidRegion; import javax.annotation.Nonnull; +import javax.annotation.Nullable; import java.util.HashSet; import java.util.UUID; @@ -87,7 +88,8 @@ public class PlotCluster { } private void setRegion() { - this.region = RegionUtil.createRegion(this.pos1.x, this.pos2.x, this.pos1.y, this.pos2.y); + this.region = RegionUtil.createRegion(this.pos1.getX(), this.pos2.getX(), + this.pos1.getY(), this.pos2.getY()); } public CuboidRegion getRegion() { @@ -117,7 +119,7 @@ public class PlotCluster { * Get the area (in plots). */ public int getArea() { - return (1 + this.pos2.x - this.pos1.x) * (1 + this.pos2.y - this.pos1.y); + return (1 + this.pos2.getX() - this.pos1.getX()) * (1 + this.pos2.getY() - this.pos1.getY()); } public void setArea(PlotArea plotArea) { @@ -148,8 +150,7 @@ public class PlotCluster { } @Override public String toString() { - return this.area + ";" + this.pos1.x + ";" + this.pos1.y + ";" + this.pos2.x + ";" - + this.pos2.y; + return this.area + ";" + this.pos1.toString() + ";" + this.pos2.toString(); } public void getHome(@Nonnull final Consumer result) { @@ -180,13 +181,13 @@ public class PlotCluster { } } - public PlotId getCenterPlotId() { - PlotId bot = getP1(); - PlotId top = getP2(); - return new PlotId((bot.x + top.x) / 2, (bot.y + top.y) / 2); + @Nonnull public PlotId getCenterPlotId() { + final PlotId bot = getP1(); + final PlotId top = getP2(); + return PlotId.of((bot.getX() + top.getX()) / 2, (bot.getY() + top.getY()) / 2); } - public Plot getCenterPlot() { + @Nullable public Plot getCenterPlot() { return this.area.getPlotAbs(getCenterPlotId()); } @@ -201,12 +202,12 @@ public class PlotCluster { } public boolean intersects(PlotId pos1, PlotId pos2) { - return pos1.x <= this.pos2.x && pos2.x >= this.pos1.x && pos1.y <= this.pos2.y - && pos2.y >= this.pos1.y; + return pos1.getX() <= this.pos2.getX() && pos2.getX() >= this.pos1.getX() && + pos1.getY() <= this.pos2.getY() && pos2.getY() >= this.pos1.getY(); } public boolean contains(PlotId id) { - return this.pos1.x <= id.x && this.pos1.y <= id.y && this.pos2.x >= id.x - && this.pos2.y >= id.y; + return this.pos1.getX() <= id.getX() && this.pos1.getY() <= id.getY() && + this.pos2.getX() >= id.getX() && this.pos2.getY() >= id.getY(); } } diff --git a/Core/src/main/java/com/plotsquared/core/plot/PlotId.java b/Core/src/main/java/com/plotsquared/core/plot/PlotId.java index 3327c1473..64c28a2d5 100644 --- a/Core/src/main/java/com/plotsquared/core/plot/PlotId.java +++ b/Core/src/main/java/com/plotsquared/core/plot/PlotId.java @@ -26,14 +26,20 @@ package com.plotsquared.core.plot; import com.plotsquared.core.location.Direction; +import org.jetbrains.annotations.NotNull; + import javax.annotation.Nonnull; import javax.annotation.Nullable; +/** + * Plot (X,Y) tuples for plot locations + * within a plot area + */ public class PlotId { - @Deprecated public int x; - @Deprecated public int y; - private int hash; + private final int x; + private final int y; + private final int hash; /** * PlotId class (PlotId x,y values do not correspond to Block locations) @@ -41,9 +47,20 @@ public class PlotId { * @param x The plot x coordinate * @param y The plot y coordinate */ - public PlotId(int x, int y) { + private PlotId(int x, int y) { this.x = x; this.y = y; + this.hash = (this.getX() << 16) | (this.getY() & 0xFFFF); + } + + /** + * Create a new plot ID instance + * + * @param x The plot x coordinate + * @param y The plot y coordinate + */ + @Nonnull public static PlotId of(final int x, final int y) { + return PlotId.of(x, y); } /** @@ -60,6 +77,12 @@ public class PlotId { return plot; } + /** + * Attempt to parse a plot ID from a string + * + * @param string ID string + * @return Plot ID, or {@code null} if none could be parsed + */ @Nullable public static PlotId fromStringOrNull(@Nonnull String string) { String[] parts = string.split("[;,.]"); if (parts.length < 2) { @@ -73,101 +96,102 @@ public class PlotId { } catch (NumberFormatException ignored) { return null; } - return new PlotId(x, y); - } - - public static PlotId of(@Nullable Plot plot) { - return plot != null ? plot.getId() : null; + return of(x, y); } /** * Gets the PlotId from the HashCode
* Note: Only accurate for small x,z values (short) * - * @param hash - * @return + * @param hash ID hash + * @return Plot ID */ - public static PlotId unpair(int hash) { - return new PlotId(hash >> 16, hash & 0xFFFF); + @Nonnull public static PlotId unpair(final int hash) { + return PlotId.of(hash >> 16, hash & 0xFFFF); } + /** + * Get a copy of the plot ID + * + * @return Plot ID copy + */ + @NotNull public PlotId copy() { + return of(this.getX(), this.getY()); + } + + /** + * Get the ID X component + * + * @return X component + */ public int getX() { - return x; + return this.getX(); } + /** + * Get the ID Y component + * + * @return Y component + */ public int getY() { - return y; + return this.getY(); } - public PlotId getNextId(int step) { + /** + * Get the next plot ID for claiming purposes + * + * @return Next plot ID + */ + @Nonnull public PlotId getNextId() { int absX = Math.abs(x); int absY = Math.abs(y); if (absX > absY) { if (x > 0) { - return new PlotId(x, y + 1); + return PlotId.of(x, y + 1); } else { - return new PlotId(x, y - 1); + return PlotId.of(x, y - 1); } } else if (absY > absX) { if (y > 0) { - return new PlotId(x - 1, y); + return PlotId.of(x - 1, y); } else { - return new PlotId(x + 1, y); + return PlotId.of(x + 1, y); } } else { if (x == y && x > 0) { - return new PlotId(x, y + step); + return PlotId.of(x, y + 1); } if (x == absX) { - return new PlotId(x, y + 1); + return PlotId.of(x, y + 1); } if (y == absY) { - return new PlotId(x, y - 1); + return PlotId.of(x, y - 1); } - return new PlotId(x + 1, y); + return PlotId.of(x + 1, y); } } - public PlotId getRelative(Direction direction) { - return getRelative(direction.getIndex()); - } - /** * Get the PlotId in a relative direction - * 0 = north
- * 1 = east
- * 2 = south
- * 3 = west
* - * @param direction - * @return PlotId + * @param direction Direction + * @return Relative plot ID */ - public PlotId getRelative(int direction) { + @Nonnull public PlotId getRelative(@Nonnull final Direction direction) { switch (direction) { - case 0: - return new PlotId(this.x, this.y - 1); - case 1: - return new PlotId(this.x + 1, this.y); - case 2: - return new PlotId(this.x, this.y + 1); - case 3: - return new PlotId(this.x - 1, this.y); + case NORTH: + return PlotId.of(this.getX(), this.getY() - 1); + case EAST: + return PlotId.of(this.getX() + 1, this.getY()); + case SOUTH: + return PlotId.of(this.getX(), this.getY() + 1); + case WEST: + return PlotId.of(this.getX() - 1, this.getY()); } return this; } - /** - * Get the PlotId in a relative location - * - * @param x - * @param y - * @return PlotId - */ - public PlotId getRelative(int x, int y) { - return new PlotId(this.x + x, this.y + y); - } - - @Override public boolean equals(Object obj) { + @Override public boolean equals(final Object obj) { if (this == obj) { return true; } @@ -180,42 +204,42 @@ public class PlotId { if (getClass() != obj.getClass()) { return false; } - PlotId other = (PlotId) obj; - return this.x == other.x && this.y == other.y; + final PlotId other = (PlotId) obj; + return this.getX() == other.getX() && this.getY() == other.getY(); } /** - * e.g. - * 5;-6 + * Get a String representation of the plot ID where the + * components are separated by ";" * - * @return + * @return {@code x + ";" + y} */ - @Override public String toString() { - return this.x + ";" + this.y; - } - - public String toCommaSeparatedString() { - return this.x + "," + this.y; - } - - public String toDashSeparatedString() { - return this.x + "-" + this.y; + @Override @Nonnull public String toString() { + return this.getX() + ";" + this.getY(); } /** - * The PlotId object caches the hashcode for faster mapping/fetching/sorting
- * - Recalculation is required if the x/y values change - * TODO maybe make x/y values private and add this to the mutators + * Get a String representation of the plot ID where the + * components are separated by "," + * + * @return {@code x + "," + y} */ - public void recalculateHash() { - this.hash = 0; - hashCode(); + @Nonnull public String toCommaSeparatedString() { + return this.getX() + "," + this.getY(); + } + + /** + * Get a String representation of the plot ID where the + * components are separated by "-" + * + * @return {@code x + "-" + y} + */ + @Nonnull public String toDashSeparatedString() { + return this.getX() + "-" + this.getY(); } @Override public int hashCode() { - if (this.hash == 0) { - this.hash = (this.x << 16) | (this.y & 0xFFFF); - } return this.hash; } + } diff --git a/Core/src/main/java/com/plotsquared/core/plot/schematic/PlotItem.java b/Core/src/main/java/com/plotsquared/core/plot/schematic/PlotItem.java deleted file mode 100644 index c8e614c71..000000000 --- a/Core/src/main/java/com/plotsquared/core/plot/schematic/PlotItem.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * _____ _ _ _____ _ - * | __ \| | | | / ____| | | - * | |__) | | ___ | |_| (___ __ _ _ _ __ _ _ __ ___ __| | - * | ___/| |/ _ \| __|\___ \ / _` | | | |/ _` | '__/ _ \/ _` | - * | | | | (_) | |_ ____) | (_| | |_| | (_| | | | __/ (_| | - * |_| |_|\___/ \__|_____/ \__, |\__,_|\__,_|_| \___|\__,_| - * | | - * |_| - * PlotSquared plot management system for Minecraft - * Copyright (C) 2020 IntellectualSites - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package com.plotsquared.core.plot.schematic; - -import com.sk89q.worldedit.world.item.ItemType; - -public class PlotItem { - - public final int x; - public final int y; - public final int z; - // public final short[] id; - // public final byte[] data; - public final ItemType[] types; - public final byte[] amount; - - public PlotItem(short x, short y, short z, ItemType[] types, byte[] amount) { - this.x = x; - this.y = y; - this.z = z; - this.types = types; - this.amount = amount; - } -} diff --git a/Core/src/main/java/com/plotsquared/core/plot/world/SinglePlotManager.java b/Core/src/main/java/com/plotsquared/core/plot/world/SinglePlotManager.java index a386022a3..2335735fd 100644 --- a/Core/src/main/java/com/plotsquared/core/plot/world/SinglePlotManager.java +++ b/Core/src/main/java/com/plotsquared/core/plot/world/SinglePlotManager.java @@ -46,11 +46,11 @@ public class SinglePlotManager extends PlotManager { } @Override public PlotId getPlotIdAbs(int x, int y, int z) { - return new PlotId(0, 0); + return PlotId.of(0, 0); } @Override public PlotId getPlotId(int x, int y, int z) { - return new PlotId(0, 0); + return PlotId.of(0, 0); } @Override public Location getPlotBottomLocAbs(@Nonnull final PlotId plotId) { diff --git a/Core/src/main/java/com/plotsquared/core/util/EventDispatcher.java b/Core/src/main/java/com/plotsquared/core/util/EventDispatcher.java index 2dc715a09..47ae83d29 100644 --- a/Core/src/main/java/com/plotsquared/core/util/EventDispatcher.java +++ b/Core/src/main/java/com/plotsquared/core/util/EventDispatcher.java @@ -250,7 +250,7 @@ public class EventDispatcher { })); MainUtil.sendMessage(player, CaptionUtility.format(player, Captions.TELEPORTED_TO_ROAD.getTranslated()) - + " (on-login) " + "(" + plot.getId().x + ";" + plot.getId().y + ")"); + + " (on-login) " + "(" + plot.getId().getX() + ";" + plot.getId().getY() + ")"); } } diff --git a/Core/src/main/java/com/plotsquared/core/util/MainUtil.java b/Core/src/main/java/com/plotsquared/core/util/MainUtil.java index edfa3f902..793643907 100644 --- a/Core/src/main/java/com/plotsquared/core/util/MainUtil.java +++ b/Core/src/main/java/com/plotsquared/core/util/MainUtil.java @@ -363,9 +363,9 @@ public class MainUtil { */ public static ArrayList getPlotSelectionIds(PlotId pos1, PlotId pos2) { ArrayList myPlots = new ArrayList<>(); - for (int x = pos1.x; x <= pos2.x; x++) { - for (int y = pos1.y; y <= pos2.y; y++) { - myPlots.add(new PlotId(x, y)); + for (int x = pos1.getX(); x <= pos2.getX(); x++) { + for (int y = pos1.getY(); y <= pos2.getY(); y++) { + myPlots.add(PlotId.of(x, y)); } } return myPlots; diff --git a/Core/src/main/java/com/plotsquared/core/util/SchematicHandler.java b/Core/src/main/java/com/plotsquared/core/util/SchematicHandler.java index fde4a7008..83ac22219 100644 --- a/Core/src/main/java/com/plotsquared/core/util/SchematicHandler.java +++ b/Core/src/main/java/com/plotsquared/core/util/SchematicHandler.java @@ -139,11 +139,11 @@ public abstract class SchematicHandler { final String name; if (namingScheme == null) { name = - plot.getId().x + ";" + plot.getId().y + ',' + plot.getArea() + ',' + owner; + plot.getId().getX() + ";" + plot.getId().getY() + ',' + plot.getArea() + ',' + owner; } else { name = namingScheme.replaceAll("%id%", plot.getId().toString()) - .replaceAll("%idx%", plot.getId().x + "") - .replaceAll("%idy%", plot.getId().y + "") + .replaceAll("%idx%", plot.getId().getX() + "") + .replaceAll("%idy%", plot.getId().getY() + "") .replaceAll("%world%", plot.getArea().toString()); } diff --git a/Core/src/main/resources/furthest.js b/Core/src/main/resources/furthest.js index 046cc0535..2d18db025 100644 --- a/Core/src/main/resources/furthest.js +++ b/Core/src/main/resources/furthest.js @@ -34,20 +34,20 @@ if (PS.hasPlotArea("%s0")) { var maxplot; for (var i in plots) { var plot = plots[i]; - if (plot.x > max) { - max = plot.x; + if (plot.getX() > max) { + max = plot.getX(); maxplot = plot; } - if (plot.y > max) { - max = plot.y; + if (plot.getY() > max) { + max = plot.getY(); maxplot = plot; } - if (-plot.x > max) { - max = -plot.x; + if (-plot.getX() > max) { + max = -plot.getX(); maxplot = plot; } - if (-plot.y > max) { - max = -plot.y; + if (-plot.getY() > max) { + max = -plot.getY(); maxplot = plot; } } diff --git a/Core/src/test/java/com/plotsquared/core/plot/FlagTest.java b/Core/src/test/java/com/plotsquared/core/plot/FlagTest.java index 5f8d2859f..3a6683ef4 100644 --- a/Core/src/test/java/com/plotsquared/core/plot/FlagTest.java +++ b/Core/src/test/java/com/plotsquared/core/plot/FlagTest.java @@ -42,7 +42,7 @@ public class FlagTest { } // @Test public void flagTest() throws Exception { -// Plot plot = new Plot(null, new PlotId(0, 0)); +// Plot plot = new Plot(null, PlotId.of(0, 0)); // plot.owner = UUID.fromString("84499644-ad72-454b-a19d-f28c28df382b"); // //plot.setFlag(use, use.parseValue("33,33:1,6:4")); //TODO fix this so FlagTest will run during compile // Optional flag = plot.getFlag(use); From 39fdaa367ca52a04095fad9b5110e5dc541cadd3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20S=C3=B6derberg?= Date: Sat, 18 Jul 2020 16:18:23 +0200 Subject: [PATCH 2/5] Make PlotQuery iterable --- .../com/plotsquared/core/command/Cluster.java | 4 ++-- .../com/plotsquared/core/command/Target.java | 2 +- .../com/plotsquared/core/command/Trim.java | 2 +- .../com/plotsquared/core/util/MainUtil.java | 2 +- .../core/util/query/PlotQuery.java | 20 +++++++------------ 5 files changed, 12 insertions(+), 18 deletions(-) diff --git a/Core/src/main/java/com/plotsquared/core/command/Cluster.java b/Core/src/main/java/com/plotsquared/core/command/Cluster.java index 793225cf7..cfd416e8d 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Cluster.java +++ b/Core/src/main/java/com/plotsquared/core/command/Cluster.java @@ -454,7 +454,7 @@ public class Cluster extends SubCommand { cluster.getName()); } for (final Plot plot : PlotQuery.newQuery().inWorld(player2.getLocation() - .getWorldName()).ownedBy(uuid).asCollection()) { + .getWorldName()).ownedBy(uuid)) { PlotCluster current = plot.getCluster(); if (current != null && current.equals(cluster)) { plot.unclaim(); @@ -513,7 +513,7 @@ public class Cluster extends SubCommand { DBFunc.removeInvited(cluster, uuid); MainUtil.sendMessage(player, Captions.CLUSTER_REMOVED, cluster.getName()); for (final Plot plot : PlotQuery.newQuery().inWorld(player.getLocation().getWorldName()) - .ownedBy(uuid).asCollection()) { + .ownedBy(uuid)) { PlotCluster current = plot.getCluster(); if (current != null && current.equals(cluster)) { plot.unclaim(); diff --git a/Core/src/main/java/com/plotsquared/core/command/Target.java b/Core/src/main/java/com/plotsquared/core/command/Target.java index 6c1fdc6c6..3c0941c2c 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Target.java +++ b/Core/src/main/java/com/plotsquared/core/command/Target.java @@ -58,7 +58,7 @@ public class Target extends SubCommand { Plot target = null; if (StringMan.isEqualIgnoreCaseToAny(args[0], "near", "nearest")) { int distance = Integer.MAX_VALUE; - for (Plot plot : PlotQuery.newQuery().inWorld(location.getWorldName()).asCollection()) { + for (Plot plot : PlotQuery.newQuery().inWorld(location.getWorldName())) { double current = plot.getCenterSynchronous().getEuclideanDistanceSquared(location); if (current < distance) { distance = (int) current; diff --git a/Core/src/main/java/com/plotsquared/core/command/Trim.java b/Core/src/main/java/com/plotsquared/core/command/Trim.java index 3afe16c56..d8346fb00 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Trim.java +++ b/Core/src/main/java/com/plotsquared/core/command/Trim.java @@ -173,7 +173,7 @@ public class Trim extends SubCommand { int bz = cbz << 4; CuboidRegion region = RegionUtil.createRegion(bx, bx + 511, bz, bz + 511); - for (Plot plot : PlotQuery.newQuery().inWorld(world).asCollection()) { + for (Plot plot : PlotQuery.newQuery().inWorld(world)) { Location bot = plot.getBottomAbs(); Location top = plot.getExtendedTopAbs(); CuboidRegion plotReg = RegionUtil diff --git a/Core/src/main/java/com/plotsquared/core/util/MainUtil.java b/Core/src/main/java/com/plotsquared/core/util/MainUtil.java index 793643907..fb169c3e6 100644 --- a/Core/src/main/java/com/plotsquared/core/util/MainUtil.java +++ b/Core/src/main/java/com/plotsquared/core/util/MainUtil.java @@ -493,7 +493,7 @@ public class MainUtil { PlotArea area = null; String alias = null; - for (Plot plot : PlotQuery.newQuery().allPlots().asList()) { + for (Plot plot : PlotQuery.newQuery().allPlots()) { int count = 0; if (!uuids.isEmpty()) { for (UUID uuid : uuids) { diff --git a/Core/src/main/java/com/plotsquared/core/util/query/PlotQuery.java b/Core/src/main/java/com/plotsquared/core/util/query/PlotQuery.java index 03c41dd8e..bc89c6ea7 100644 --- a/Core/src/main/java/com/plotsquared/core/util/query/PlotQuery.java +++ b/Core/src/main/java/com/plotsquared/core/util/query/PlotQuery.java @@ -34,19 +34,20 @@ import com.plotsquared.core.plot.Rating; import com.plotsquared.core.plot.flag.implementations.DoneFlag; import com.plotsquared.core.plot.world.PlotAreaManager; import com.plotsquared.core.util.MathMan; -import javax.annotation.Nonnull; +import org.jetbrains.annotations.NotNull; +import javax.annotation.Nonnull; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.HashSet; +import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Set; import java.util.UUID; -import java.util.function.Consumer; import java.util.function.Predicate; import java.util.stream.Stream; @@ -57,7 +58,7 @@ import java.util.stream.Stream; * The queries can be reused as no results are stored * in the query itself */ -public final class PlotQuery { +public final class PlotQuery implements Iterable { private final Collection filters = new LinkedList<>(); private final PlotAreaManager plotAreaManager; @@ -381,16 +382,6 @@ public final class PlotQuery { return this.asList(); } - /** - * Perform an action on each plot returned by the query - * - * @param consumer Plot consumer - */ - public void forEach(@Nonnull final Consumer consumer) { - Preconditions.checkNotNull(consumer, "Consumer may not be null"); - this.asCollection().forEach(consumer); - } - /** * Get the amount of plots contained in the query result * @@ -429,5 +420,8 @@ public final class PlotQuery { return this; } + @NotNull @Override public Iterator iterator() { + return this.asCollection().iterator(); + } } From 5360df601235785d82636b77f072a2e66746251c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20S=C3=B6derberg?= Date: Sat, 18 Jul 2020 16:08:37 +0200 Subject: [PATCH 3/5] Add PlotRangeIterator for the many places where it'll be used. All one of them, in fact. This was not a waste of time. I am very happy I did this. This was worthwhile. Yup. --- .../entity/ReplicatingEntityWrapper.java | 6 +-- .../bukkit/entity/TeleportEntityWrapper.java | 2 +- .../com/plotsquared/core/command/Auto.java | 15 +++--- .../plotsquared/core/location/PlotLoc.java | 5 +- .../com/plotsquared/core/plot/PlotId.java | 50 +++++++++++++++++++ 5 files changed, 64 insertions(+), 14 deletions(-) diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/entity/ReplicatingEntityWrapper.java b/Bukkit/src/main/java/com/plotsquared/bukkit/entity/ReplicatingEntityWrapper.java index 8cae4cef4..74dfbdf07 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/entity/ReplicatingEntityWrapper.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/entity/ReplicatingEntityWrapper.java @@ -154,7 +154,7 @@ public final class ReplicatingEntityWrapper extends EntityWrapper { case "ITEM_FRAME": this.x = Math.floor(this.getX()); this.y = Math.floor(this.getY()); - this.z = Math.floor(this.z); + this.z = Math.floor(this.getZ()); ItemFrame itemFrame = (ItemFrame) entity; this.dataByte = getOrdinal(Rotation.values(), itemFrame.getRotation()); this.stack = itemFrame.getItem().clone(); @@ -162,7 +162,7 @@ public final class ReplicatingEntityWrapper extends EntityWrapper { case "PAINTING": this.x = Math.floor(this.getX()); this.y = Math.floor(this.getY()); - this.z = Math.floor(this.z); + this.z = Math.floor(this.getZ()); Painting painting = (Painting) entity; Art art = painting.getArt(); this.dataByte = getOrdinal(BlockFace.values(), painting.getFacing()); @@ -409,7 +409,7 @@ public final class ReplicatingEntityWrapper extends EntityWrapper { Location location = lived.getLeashHolder().getLocation(); this.lived.leashX = (short) (this.getX() - location.getBlockX()); this.lived.leashY = (short) (this.getY() - location.getBlockY()); - this.lived.leashZ = (short) (this.z - location.getBlockZ()); + this.lived.leashZ = (short) (this.getZ() - location.getBlockZ()); } EntityEquipment equipment = lived.getEquipment(); this.lived.equipped = equipment != null; diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/entity/TeleportEntityWrapper.java b/Bukkit/src/main/java/com/plotsquared/bukkit/entity/TeleportEntityWrapper.java index dfa918c0b..2393d2fa4 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/entity/TeleportEntityWrapper.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/entity/TeleportEntityWrapper.java @@ -69,7 +69,7 @@ public class TeleportEntityWrapper extends EntityWrapper { this.oldLocation = oldLocation.clone(); this.oldLocation.setX(this.getX()); this.oldLocation.setY(this.getY()); - this.oldLocation.setZ(this.z); + this.oldLocation.setZ(this.getZ()); this.gravityOld = this.getEntity().hasGravity(); this.getEntity().setGravity(false); diff --git a/Core/src/main/java/com/plotsquared/core/command/Auto.java b/Core/src/main/java/com/plotsquared/core/command/Auto.java index cfc7cd94d..fd66fa848 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Auto.java +++ b/Core/src/main/java/com/plotsquared/core/command/Auto.java @@ -298,16 +298,15 @@ public class Auto extends SubCommand { PlotId end = PlotId.of(start.getX() + size_x - 1, start.getY() + size_z - 1); if (plotarea.canClaim(player, start, end)) { plotarea.setMeta("lastPlot", start); - for (int i = start.getX(); i <= end.getX(); i++) { - for (int j = start.getY(); j <= end.getY(); j++) { - Plot plot = plotarea.getPlotAbs(PlotId.of(i, j)); - boolean teleport = i == end.getX() && j == end.getY(); - if (plot == null) { - return false; - } - plot.claim(player, teleport, null); + + for (final PlotId plotId : PlotId.PlotRangeIterator.range(start, end)) { + final Plot plot = plotarea.getPlot(plotId); + if (plot == null) { + return false; } + plot.claim(player, plotId.equals(end), null); } + ArrayList plotIds = MainUtil.getPlotSelectionIds(start, end); final PlotId pos1 = plotIds.get(0); final PlotAutoMergeEvent mergeEvent = this.eventDispatcher diff --git a/Core/src/main/java/com/plotsquared/core/location/PlotLoc.java b/Core/src/main/java/com/plotsquared/core/location/PlotLoc.java index 76135262d..4db83bace 100644 --- a/Core/src/main/java/com/plotsquared/core/location/PlotLoc.java +++ b/Core/src/main/java/com/plotsquared/core/location/PlotLoc.java @@ -92,7 +92,7 @@ public final class PlotLoc { int result = 1; result = (prime * result) + this.getX(); result = (prime * result) + this.getY(); - result = (prime * result) + this.z; + result = (prime * result) + this.getZ(); return result; } @@ -111,6 +111,7 @@ public final class PlotLoc { return false; } final PlotLoc other = (PlotLoc) obj; - return (this.getX() == other.getX()) && (this.getY() == other.getY()) && (this.z == other.z); + return (this.getX() == other.getX()) && (this.getY() == + other.getY()) && (this.getZ() == other.getZ()); } } diff --git a/Core/src/main/java/com/plotsquared/core/plot/PlotId.java b/Core/src/main/java/com/plotsquared/core/plot/PlotId.java index 64c28a2d5..27004ba3c 100644 --- a/Core/src/main/java/com/plotsquared/core/plot/PlotId.java +++ b/Core/src/main/java/com/plotsquared/core/plot/PlotId.java @@ -30,6 +30,7 @@ import org.jetbrains.annotations.NotNull; import javax.annotation.Nonnull; import javax.annotation.Nullable; +import java.util.Iterator; /** * Plot (X,Y) tuples for plot locations @@ -242,4 +243,53 @@ public class PlotId { return this.hash; } + + public static final class PlotRangeIterator implements Iterator, Iterable { + + private final PlotId start; + private final PlotId end; + + private int x; + private int y; + + private PlotRangeIterator(@Nonnull final PlotId start, @Nonnull final PlotId end) { + this.start = start; + this.end = end; + this.x = this.start.getX(); + this.y = this.start.getY(); + } + + public static PlotRangeIterator range(@Nonnull final PlotId start, @Nonnull final PlotId end) { + return new PlotRangeIterator(start, end); + } + + @Override public boolean hasNext() { + if (this.x < this.end.getX()) { + return true; + } else if (this.x == this.end.getX()) { + return this.y < this.end.getY(); + } else { + return false; + } + } + + @Override public PlotId next() { + if (!hasNext()) { + throw new IndexOutOfBoundsException("The iterator has no more entries"); + } + if (this.y == this.end.getY()) { + this.x++; + this.y = 0; + } else { + this.y++; + } + return PlotId.of(this.start.getX() + this.x, this.start.getY() + this.y); + } + + @Nonnull @Override public Iterator iterator() { + return this; + } + + } + } From 193054f1fc870861a889b82bb4542a2cc778b329 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20S=C3=B6derberg?= Date: Sun, 19 Jul 2020 14:23:55 +0200 Subject: [PATCH 4/5] Move shit out of MainUtil into more appropriate classes --- .../plotsquared/bukkit/BukkitPlatform.java | 16 +- .../bukkit/placeholder/Placeholders.java | 4 +- .../bukkit/util/BukkitRegionManager.java | 4 +- .../bukkit/uuid/SQLiteUUIDService.java | 6 +- .../com/plotsquared/core/PlotSquared.java | 12 +- .../com/plotsquared/core/command/Add.java | 9 +- .../com/plotsquared/core/command/Area.java | 3 +- .../com/plotsquared/core/command/Auto.java | 8 +- .../com/plotsquared/core/command/Buy.java | 5 +- .../com/plotsquared/core/command/Comment.java | 2 +- .../com/plotsquared/core/command/Copy.java | 2 +- .../core/command/DatabaseCommand.java | 5 +- .../plotsquared/core/command/DebugExec.java | 9 +- .../com/plotsquared/core/command/Deny.java | 9 +- .../com/plotsquared/core/command/Grant.java | 68 +- .../plotsquared/core/command/HomeCommand.java | 2 +- .../com/plotsquared/core/command/Info.java | 15 +- .../com/plotsquared/core/command/Kick.java | 3 +- .../com/plotsquared/core/command/ListCmd.java | 5 +- .../com/plotsquared/core/command/Move.java | 2 +- .../com/plotsquared/core/command/Owner.java | 5 +- .../com/plotsquared/core/command/Remove.java | 3 +- .../com/plotsquared/core/command/Swap.java | 2 +- .../com/plotsquared/core/command/Target.java | 2 +- .../plotsquared/core/command/Template.java | 13 +- .../com/plotsquared/core/command/Trust.java | 9 +- .../com/plotsquared/core/command/Visit.java | 5 +- .../core/configuration/ConfigurationUtil.java | 30 + .../plotsquared/core/database/SQLManager.java | 5 +- .../core/generator/HybridPlotManager.java | 29 +- .../core/generator/HybridPlotWorld.java | 10 +- .../core/generator/SquarePlotManager.java | 6 +- .../core/listener/PlotListener.java | 22 +- .../java/com/plotsquared/core/plot/Plot.java | 327 ++++++- .../com/plotsquared/core/plot/PlotArea.java | 9 +- .../plotsquared/core/plot/PlotCluster.java | 21 +- .../core/plot/expiration/ExpireManager.java | 3 +- .../plot/flag/implementations/KeepFlag.java | 5 +- .../core/plot/world/SinglePlotManager.java | 6 +- .../com/plotsquared/core/util/FileUtils.java | 67 ++ .../com/plotsquared/core/util/HashUtil.java | 57 ++ .../com/plotsquared/core/util/MainUtil.java | 867 +----------------- .../plotsquared/core/util/PlayerManager.java | 148 +++ .../com/plotsquared/core/util/RegionUtil.java | 38 + .../core/util/SchematicHandler.java | 102 ++- .../com/plotsquared/core/util/TimeUtil.java | 129 +++ .../com/plotsquared/core/util/WorldUtil.java | 20 +- .../core/util/query/SearchPlotProvider.java | 83 +- 48 files changed, 1142 insertions(+), 1070 deletions(-) create mode 100644 Core/src/main/java/com/plotsquared/core/util/FileUtils.java create mode 100644 Core/src/main/java/com/plotsquared/core/util/HashUtil.java create mode 100644 Core/src/main/java/com/plotsquared/core/util/TimeUtil.java diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/BukkitPlatform.java b/Bukkit/src/main/java/com/plotsquared/bukkit/BukkitPlatform.java index b7d87ec59..01cf8114e 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/BukkitPlatform.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/BukkitPlatform.java @@ -44,11 +44,11 @@ import com.plotsquared.bukkit.placeholder.PlaceholderFormatter; import com.plotsquared.bukkit.placeholder.Placeholders; import com.plotsquared.bukkit.player.BukkitPlayerManager; import com.plotsquared.bukkit.util.BukkitChatManager; -import com.plotsquared.bukkit.util.task.BukkitTaskManager; import com.plotsquared.bukkit.util.BukkitUtil; import com.plotsquared.bukkit.util.BukkitWorld; import com.plotsquared.bukkit.util.SetGenCB; import com.plotsquared.bukkit.util.UpdateUtility; +import com.plotsquared.bukkit.util.task.BukkitTaskManager; import com.plotsquared.bukkit.util.task.PaperTimeConverter; import com.plotsquared.bukkit.util.task.SpigotTimeConverter; import com.plotsquared.bukkit.uuid.BungeePermsUUIDService; @@ -67,6 +67,7 @@ import com.plotsquared.core.configuration.Captions; import com.plotsquared.core.configuration.ChatFormatter; import com.plotsquared.core.configuration.ConfigurationNode; import com.plotsquared.core.configuration.ConfigurationSection; +import com.plotsquared.core.configuration.ConfigurationUtil; import com.plotsquared.core.configuration.Settings; import com.plotsquared.core.configuration.file.YamlConfiguration; import com.plotsquared.core.database.DBFunc; @@ -88,6 +89,7 @@ import com.plotsquared.core.plot.PlotAreaTerrainType; import com.plotsquared.core.plot.PlotAreaType; import com.plotsquared.core.plot.PlotId; import com.plotsquared.core.plot.comment.CommentManager; +import com.plotsquared.core.plot.flag.implementations.ServerPlotFlag; import com.plotsquared.core.plot.message.PlainChatManager; import com.plotsquared.core.plot.world.PlotAreaManager; import com.plotsquared.core.plot.world.SinglePlotArea; @@ -99,7 +101,7 @@ import com.plotsquared.core.util.ChatManager; import com.plotsquared.core.util.ConsoleColors; import com.plotsquared.core.util.EconHandler; import com.plotsquared.core.util.EventDispatcher; -import com.plotsquared.core.util.MainUtil; +import com.plotsquared.core.util.FileUtils; import com.plotsquared.core.util.PermHandler; import com.plotsquared.core.util.PlatformWorldManager; import com.plotsquared.core.util.PremiumVerification; @@ -408,8 +410,8 @@ import static com.plotsquared.core.util.ReflectionUtils.getRefClass; final SQLiteUUIDService sqLiteUUIDService = new SQLiteUUIDService("user_cache.db"); final SQLiteUUIDService legacyUUIDService; - if (Settings.UUID.LEGACY_DATABASE_SUPPORT && MainUtil - .getFile(PlotSquared.platform().getDirectory(), "usercache.db").exists()) { + if (Settings.UUID.LEGACY_DATABASE_SUPPORT && + FileUtils.getFile(PlotSquared.platform().getDirectory(), "usercache.db").exists()) { legacyUUIDService = new SQLiteUUIDService("usercache.db"); } else { legacyUUIDService = null; @@ -569,7 +571,7 @@ import static com.plotsquared.core.util.ReflectionUtils.getRefClass; } final Plot plot = area.getOwnedPlot(id); if (plot != null) { - if (!MainUtil.isServerOwned(plot) || PlotPlayer.wrap(plot.getOwner()) == null) { + if (!plot.getFlag(ServerPlotFlag.class) || PlotPlayer.wrap(plot.getOwner()) == null) { if (world.getKeepSpawnInMemory()) { world.setKeepSpawnInMemory(false); return; @@ -1049,8 +1051,8 @@ import static com.plotsquared.core.util.ReflectionUtils.getRefClass; String manager = worldConfig.getString("generator.plugin", getPluginName()); PlotAreaBuilder builder = PlotAreaBuilder.newBuilder().plotManager(manager) .generatorName(worldConfig.getString("generator.init", manager)) - .plotAreaType(MainUtil.getType(worldConfig)) - .terrainType(MainUtil.getTerrain(worldConfig)) + .plotAreaType(ConfigurationUtil.getType(worldConfig)) + .terrainType(ConfigurationUtil.getTerrain(worldConfig)) .settingsNodesWrapper(new SettingsNodesWrapper(new ConfigurationNode[0], null)) .worldName(worldName); getInjector().getInstance(SetupUtils.class).setupWorld(builder); diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/placeholder/Placeholders.java b/Bukkit/src/main/java/com/plotsquared/bukkit/placeholder/Placeholders.java index 69a11523f..d79a7b4fb 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/placeholder/Placeholders.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/placeholder/Placeholders.java @@ -30,7 +30,7 @@ import com.plotsquared.core.player.PlotPlayer; import com.plotsquared.core.plot.Plot; import com.plotsquared.core.plot.flag.GlobalFlagContainer; import com.plotsquared.core.plot.flag.PlotFlag; -import com.plotsquared.core.util.MainUtil; +import com.plotsquared.core.util.PlayerManager; import me.clip.placeholderapi.PlaceholderAPIPlugin; import me.clip.placeholderapi.expansion.PlaceholderExpansion; import org.bukkit.Bukkit; @@ -122,7 +122,7 @@ public class Placeholders extends PlaceholderExpansion { } try { - return MainUtil.getName(plotOwner, false); + return PlayerManager.getName(plotOwner, false); } catch (final Exception ignored) {} final String name = Bukkit.getOfflinePlayer(plotOwner).getName(); diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/util/BukkitRegionManager.java b/Bukkit/src/main/java/com/plotsquared/bukkit/util/BukkitRegionManager.java index 660a42148..d3ed2b53c 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/util/BukkitRegionManager.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/util/BukkitRegionManager.java @@ -38,9 +38,9 @@ import com.plotsquared.core.plot.PlotManager; import com.plotsquared.core.queue.LocalBlockQueue; import com.plotsquared.core.queue.ScopedLocalBlockQueue; import com.plotsquared.core.util.ChunkManager; -import com.plotsquared.core.util.MainUtil; import com.plotsquared.core.util.RegionManager; import com.plotsquared.core.util.RegionUtil; +import com.plotsquared.core.util.WorldUtil; import com.plotsquared.core.util.entity.EntityCategories; import com.plotsquared.core.util.task.RunnableVal; import com.plotsquared.core.util.task.TaskManager; @@ -484,7 +484,7 @@ import static com.plotsquared.core.util.entity.EntityCategories.CAP_VEHICLE; @Override public void run(int[] value) { BlockVector2 loc = BlockVector2.at(value[0], value[1]); PlotSquared.platform().getChunkManager().loadChunk(world, loc, false).thenRun(() -> { - MainUtil.setBiome(world, value[2], value[3], value[4], value[5], biome); + WorldUtil.setBiome(world, value[2], value[3], value[4], value[5], biome); queue.refreshChunk(value[0], value[1]); }); } diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/uuid/SQLiteUUIDService.java b/Bukkit/src/main/java/com/plotsquared/bukkit/uuid/SQLiteUUIDService.java index b2f2a8707..d0ee06337 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/uuid/SQLiteUUIDService.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/uuid/SQLiteUUIDService.java @@ -27,11 +27,11 @@ package com.plotsquared.bukkit.uuid; import com.plotsquared.core.PlotSquared; import com.plotsquared.core.database.SQLite; -import com.plotsquared.core.util.MainUtil; +import com.plotsquared.core.util.FileUtils; import com.plotsquared.core.uuid.UUIDMapping; import com.plotsquared.core.uuid.UUIDService; -import javax.annotation.Nonnull; +import javax.annotation.Nonnull; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; @@ -51,7 +51,7 @@ public class SQLiteUUIDService implements UUIDService, Consumer future = new CompletableFuture<>(); - MainUtil.getUUIDsFromString(args[0], (uuids, throwable) -> { + PlayerManager.getUUIDsFromString(args[0], (uuids, throwable) -> { if (throwable != null) { if (throwable instanceof TimeoutException) { Captions.FETCHING_PLAYERS_TIMEOUT.send(player); @@ -91,17 +92,17 @@ public class Add extends Command { if (uuid == DBFunc.EVERYONE && !( Permissions.hasPermission(player, Captions.PERMISSION_TRUST_EVERYONE) || Permissions .hasPermission(player, Captions.PERMISSION_ADMIN_COMMAND_TRUST))) { - MainUtil.sendMessage(player, Captions.INVALID_PLAYER, MainUtil.getName(uuid)); + MainUtil.sendMessage(player, Captions.INVALID_PLAYER, PlayerManager.getName(uuid)); iterator.remove(); continue; } if (plot.isOwner(uuid)) { - MainUtil.sendMessage(player, Captions.ALREADY_ADDED, MainUtil.getName(uuid)); + MainUtil.sendMessage(player, Captions.ALREADY_ADDED, PlayerManager.getName(uuid)); iterator.remove(); continue; } if (plot.getMembers().contains(uuid)) { - MainUtil.sendMessage(player, Captions.ALREADY_ADDED, MainUtil.getName(uuid)); + MainUtil.sendMessage(player, Captions.ALREADY_ADDED, PlayerManager.getName(uuid)); iterator.remove(); continue; } diff --git a/Core/src/main/java/com/plotsquared/core/command/Area.java b/Core/src/main/java/com/plotsquared/core/command/Area.java index 969737766..aad920373 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Area.java +++ b/Core/src/main/java/com/plotsquared/core/command/Area.java @@ -47,6 +47,7 @@ import com.plotsquared.core.plot.PlotId; import com.plotsquared.core.plot.message.PlotMessage; import com.plotsquared.core.plot.world.PlotAreaManager; import com.plotsquared.core.setup.PlotAreaBuilder; +import com.plotsquared.core.util.FileUtils; import com.plotsquared.core.util.MainUtil; import com.plotsquared.core.util.MathMan; import com.plotsquared.core.util.Permissions; @@ -186,7 +187,7 @@ public class Area extends SubCommand { hybridPlotWorld.PLOT_HEIGHT = hybridPlotWorld.ROAD_HEIGHT = hybridPlotWorld.WALL_HEIGHT = playerSelectionMin.getBlockY(); // No sign plz hybridPlotWorld.setAllowSigns(false); - final File parentFile = MainUtil.getFile(PlotSquared.platform().getDirectory(), "schematics" + File.separator + + final File parentFile = FileUtils.getFile(PlotSquared.platform().getDirectory(), "schematics" + File.separator + "GEN_ROAD_SCHEMATIC" + File.separator + hybridPlotWorld.getWorldName() + File.separator + hybridPlotWorld.getId()); if (!parentFile.exists() && !parentFile.mkdirs()) { diff --git a/Core/src/main/java/com/plotsquared/core/command/Auto.java b/Core/src/main/java/com/plotsquared/core/command/Auto.java index fd66fa848..ea6a6cf6c 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Auto.java +++ b/Core/src/main/java/com/plotsquared/core/command/Auto.java @@ -25,6 +25,7 @@ */ package com.plotsquared.core.command; +import com.google.common.collect.Lists; import com.google.common.primitives.Ints; import com.google.inject.Inject; import com.plotsquared.core.PlotSquared; @@ -50,10 +51,10 @@ import com.plotsquared.core.util.Permissions; import com.plotsquared.core.util.task.AutoClaimFinishTask; import com.plotsquared.core.util.task.RunnableVal; import com.plotsquared.core.util.task.TaskManager; + import javax.annotation.Nonnull; import javax.annotation.Nullable; - -import java.util.ArrayList; +import java.util.List; import java.util.Set; @CommandDeclaration(command = "auto", @@ -307,7 +308,8 @@ public class Auto extends SubCommand { plot.claim(player, plotId.equals(end), null); } - ArrayList plotIds = MainUtil.getPlotSelectionIds(start, end); + final List plotIds = Lists.newArrayList((Iterable) + PlotId.PlotRangeIterator.range(start, end)); final PlotId pos1 = plotIds.get(0); final PlotAutoMergeEvent mergeEvent = this.eventDispatcher .callAutoMerge(plotarea.getPlotAbs(pos1), plotIds); diff --git a/Core/src/main/java/com/plotsquared/core/command/Buy.java b/Core/src/main/java/com/plotsquared/core/command/Buy.java index f62f24bc2..88f4dd4af 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Buy.java +++ b/Core/src/main/java/com/plotsquared/core/command/Buy.java @@ -36,12 +36,11 @@ import com.plotsquared.core.plot.flag.PlotFlag; import com.plotsquared.core.plot.flag.implementations.PriceFlag; import com.plotsquared.core.util.EconHandler; import com.plotsquared.core.util.EventDispatcher; -import com.plotsquared.core.util.MainUtil; import com.plotsquared.core.util.task.RunnableVal2; import com.plotsquared.core.util.task.RunnableVal3; -import javax.annotation.Nullable; import javax.annotation.Nonnull; +import javax.annotation.Nullable; import java.util.Set; import java.util.concurrent.CompletableFuture; @@ -72,7 +71,7 @@ public class Buy extends Command { final Plot plot; if (args.length != 0) { checkTrue(args.length == 1, Captions.COMMAND_SYNTAX, getUsage()); - plot = check(MainUtil.getPlotFromString(player, args[0], true), null); + plot = check(Plot.getPlotFromString(player, args[0], true), null); } else { plot = check(player.getCurrentPlot(), Captions.NOT_IN_PLOT); } diff --git a/Core/src/main/java/com/plotsquared/core/command/Comment.java b/Core/src/main/java/com/plotsquared/core/command/Comment.java index 455ec268c..952aa8b58 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Comment.java +++ b/Core/src/main/java/com/plotsquared/core/command/Comment.java @@ -56,7 +56,7 @@ public class Comment extends SubCommand { // Attempt to extract a plot out of the first argument Plot plot = null; if (!CommentManager.inboxes.containsKey(args[0].toLowerCase(Locale.ENGLISH))) { - plot = MainUtil.getPlotFromString(player, args[0], false); + plot = Plot.getPlotFromString(player, args[0], false); } int index; diff --git a/Core/src/main/java/com/plotsquared/core/command/Copy.java b/Core/src/main/java/com/plotsquared/core/command/Copy.java index 6743074ff..429a52da5 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Copy.java +++ b/Core/src/main/java/com/plotsquared/core/command/Copy.java @@ -56,7 +56,7 @@ public class Copy extends SubCommand { Captions.COMMAND_SYNTAX.send(player, getUsage()); return false; } - Plot plot2 = MainUtil.getPlotFromString(player, args[0], true); + Plot plot2 = Plot.getPlotFromString(player, args[0], true); if (plot2 == null) { return false; } diff --git a/Core/src/main/java/com/plotsquared/core/command/DatabaseCommand.java b/Core/src/main/java/com/plotsquared/core/command/DatabaseCommand.java index 96a0592d9..1379a0d38 100644 --- a/Core/src/main/java/com/plotsquared/core/command/DatabaseCommand.java +++ b/Core/src/main/java/com/plotsquared/core/command/DatabaseCommand.java @@ -42,6 +42,7 @@ import com.plotsquared.core.plot.PlotId; import com.plotsquared.core.plot.world.PlotAreaManager; import com.plotsquared.core.plot.world.SinglePlotArea; import com.plotsquared.core.util.EventDispatcher; +import com.plotsquared.core.util.FileUtils; import com.plotsquared.core.util.MainUtil; import com.plotsquared.core.util.query.PlotQuery; import com.plotsquared.core.util.task.TaskManager; @@ -125,7 +126,7 @@ public class DatabaseCommand extends SubCommand { .sendMessage(player, "/plot database import [prefix]"); return false; } - File file = MainUtil.getFile(PlotSquared.platform().getDirectory(), + File file = FileUtils.getFile(PlotSquared.platform().getDirectory(), args[1].endsWith(".db") ? args[1] : args[1] + ".db"); if (!file.exists()) { MainUtil.sendMessage(player, "&6Database does not exist: " + file); @@ -200,7 +201,7 @@ public class DatabaseCommand extends SubCommand { return MainUtil.sendMessage(player, "/plot database sqlite [file]"); } File sqliteFile = - MainUtil.getFile(PlotSquared.platform().getDirectory(), args[1] + ".db"); + FileUtils.getFile(PlotSquared.platform().getDirectory(), args[1] + ".db"); implementation = new SQLite(sqliteFile); break; default: diff --git a/Core/src/main/java/com/plotsquared/core/command/DebugExec.java b/Core/src/main/java/com/plotsquared/core/command/DebugExec.java index dbe3a526f..598baf510 100644 --- a/Core/src/main/java/com/plotsquared/core/command/DebugExec.java +++ b/Core/src/main/java/com/plotsquared/core/command/DebugExec.java @@ -50,6 +50,7 @@ import com.plotsquared.core.queue.GlobalBlockQueue; import com.plotsquared.core.util.ChunkManager; import com.plotsquared.core.util.EconHandler; import com.plotsquared.core.util.EventDispatcher; +import com.plotsquared.core.util.FileUtils; import com.plotsquared.core.util.MainUtil; import com.plotsquared.core.util.MathMan; import com.plotsquared.core.util.SchematicHandler; @@ -63,11 +64,11 @@ import com.plotsquared.core.util.task.RunnableVal3; import com.plotsquared.core.util.task.TaskManager; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.world.block.BlockState; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; import javax.script.Bindings; import javax.script.ScriptContext; import javax.script.ScriptEngine; @@ -327,7 +328,7 @@ public class DebugExec extends SubCommand { return false; case "addcmd": try { - final String cmd = StringMan.join(Files.readLines(MainUtil.getFile(new File( + final String cmd = StringMan.join(Files.readLines(FileUtils.getFile(new File( PlotSquared.platform().getDirectory() + File.separator + Settings.Paths.SCRIPTS), args[1]), StandardCharsets.UTF_8), System.getProperty("line.separator")); @@ -359,7 +360,7 @@ public class DebugExec extends SubCommand { async = true; case "run": try { - script = StringMan.join(Files.readLines(MainUtil.getFile(new File( + script = StringMan.join(Files.readLines(FileUtils.getFile(new File( PlotSquared.platform().getDirectory() + File.separator + Settings.Paths.SCRIPTS), args[1]), StandardCharsets.UTF_8), System.getProperty("line.separator")); diff --git a/Core/src/main/java/com/plotsquared/core/command/Deny.java b/Core/src/main/java/com/plotsquared/core/command/Deny.java index b97be84f7..e8008d6bb 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Deny.java +++ b/Core/src/main/java/com/plotsquared/core/command/Deny.java @@ -36,6 +36,7 @@ import com.plotsquared.core.plot.world.PlotAreaManager; import com.plotsquared.core.util.EventDispatcher; import com.plotsquared.core.util.MainUtil; import com.plotsquared.core.util.Permissions; +import com.plotsquared.core.util.PlayerManager; import com.plotsquared.core.util.TabCompletions; import com.plotsquared.core.util.WorldUtil; import com.sk89q.worldedit.world.gamemode.GameModes; @@ -84,7 +85,7 @@ public class Deny extends SubCommand { return true; } - MainUtil.getUUIDsFromString(args[0], (uuids, throwable) -> { + PlayerManager.getUUIDsFromString(args[0], (uuids, throwable) -> { if (throwable instanceof TimeoutException) { MainUtil.sendMessage(player, Captions.FETCHING_PLAYERS_TIMEOUT); } else if (throwable != null || uuids.isEmpty()) { @@ -94,12 +95,12 @@ public class Deny extends SubCommand { if (uuid == DBFunc.EVERYONE && !( Permissions.hasPermission(player, Captions.PERMISSION_DENY_EVERYONE) || Permissions .hasPermission(player, Captions.PERMISSION_ADMIN_COMMAND_DENY))) { - MainUtil.sendMessage(player, Captions.INVALID_PLAYER, MainUtil.getName(uuid)); + MainUtil.sendMessage(player, Captions.INVALID_PLAYER, PlayerManager.getName(uuid)); } else if (plot.isOwner(uuid)) { - MainUtil.sendMessage(player, Captions.CANT_REMOVE_OWNER, MainUtil.getName(uuid)); + MainUtil.sendMessage(player, Captions.CANT_REMOVE_OWNER, PlayerManager.getName(uuid)); return; } else if (plot.getDenied().contains(uuid)) { - MainUtil.sendMessage(player, Captions.ALREADY_ADDED, MainUtil.getName(uuid)); + MainUtil.sendMessage(player, Captions.ALREADY_ADDED, PlayerManager.getName(uuid)); return; } else { if (uuid != DBFunc.EVERYONE) { diff --git a/Core/src/main/java/com/plotsquared/core/command/Grant.java b/Core/src/main/java/com/plotsquared/core/command/Grant.java index 59c1453a8..ab1ef00d4 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Grant.java +++ b/Core/src/main/java/com/plotsquared/core/command/Grant.java @@ -33,13 +33,16 @@ import com.plotsquared.core.database.DBFunc; import com.plotsquared.core.player.PlotPlayer; import com.plotsquared.core.util.MainUtil; import com.plotsquared.core.util.Permissions; +import com.plotsquared.core.util.PlayerManager; import com.plotsquared.core.util.task.RunnableVal; import com.plotsquared.core.util.task.RunnableVal2; import com.plotsquared.core.util.task.RunnableVal3; +import java.util.Map; import java.util.UUID; import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeoutException; +import java.util.function.Consumer; @CommandDeclaration(command = "grant", category = CommandCategory.CLAIMING, @@ -70,44 +73,51 @@ public class Grant extends Command { if (args.length > 2) { break; } - MainUtil.getUUIDsFromString(args[1], (uuids, throwable) -> { + PlayerManager.getUUIDsFromString(args[1], (uuids, throwable) -> { if (throwable instanceof TimeoutException) { MainUtil.sendMessage(player, Captions.FETCHING_PLAYERS_TIMEOUT); } else if (throwable != null || uuids.size() != 1) { MainUtil.sendMessage(player, Captions.INVALID_PLAYER); } else { final UUID uuid = uuids.toArray(new UUID[0])[0]; - MainUtil.getPersistentMeta(uuid, - "grantedPlots", new RunnableVal() { - @Override public void run(byte[] array) { - if (arg0.equals("check")) { // check - int granted; - if (array == null) { - granted = 0; - } else { - granted = Ints.fromByteArray(array); - } - Captions.GRANTED_PLOTS.send(player, granted); - } else { // add - int amount; - if (array == null) { - amount = 1; - } else { - amount = 1 + Ints.fromByteArray(array); - } - boolean replace = array != null; - String key = "grantedPlots"; - byte[] rawData = Ints.toByteArray(amount); + final Consumer result = array -> { + if (arg0.equals("check")) { // check + int granted; + if (array == null) { + granted = 0; + } else { + granted = Ints.fromByteArray(array); + } + Captions.GRANTED_PLOTS.send(player, granted); + } else { // add + int amount; + if (array == null) { + amount = 1; + } else { + amount = 1 + Ints.fromByteArray(array); + } + boolean replace = array != null; + String key = "grantedPlots"; + byte[] rawData = Ints.toByteArray(amount); - PlotPlayer online = PlotSquared.platform().getPlayerManager().getPlayerIfExists(uuid); - if (online != null) { - online.setPersistentMeta(key, rawData); - } else { - DBFunc.addPersistentMeta(uuid, key, rawData, replace); - } + PlotPlayer online = PlotSquared.platform().getPlayerManager().getPlayerIfExists(uuid); + if (online != null) { + online.setPersistentMeta(key, rawData); + } else { + DBFunc.addPersistentMeta(uuid, key, rawData, replace); } } - }); + }; + PlotPlayer pp = PlotSquared.platform().getPlayerManager().getPlayerIfExists(uuid); + if (pp != null) { + result.accept(player.getPersistentMeta("grantedPlots")); + } else { + DBFunc.getPersistentMeta(uuid, new RunnableVal>() { + @Override public void run(Map value) { + result.accept(value.get("grantedPlots")); + } + }); + } } }); return CompletableFuture.completedFuture(true); diff --git a/Core/src/main/java/com/plotsquared/core/command/HomeCommand.java b/Core/src/main/java/com/plotsquared/core/command/HomeCommand.java index 3cc72188a..715767e73 100644 --- a/Core/src/main/java/com/plotsquared/core/command/HomeCommand.java +++ b/Core/src/main/java/com/plotsquared/core/command/HomeCommand.java @@ -127,7 +127,7 @@ public class HomeCommand extends Command { break; } // either plot id or alias - Plot fromId = MainUtil.getPlotFromString(player, identifier, false); + Plot fromId = Plot.getPlotFromString(player, identifier, false); if (fromId != null && fromId.isOwner(player.getUUID())) { // it was a valid plot id basePlotOnly = false; diff --git a/Core/src/main/java/com/plotsquared/core/command/Info.java b/Core/src/main/java/com/plotsquared/core/command/Info.java index fab3d412f..ebc8a482b 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Info.java +++ b/Core/src/main/java/com/plotsquared/core/command/Info.java @@ -32,7 +32,6 @@ import com.plotsquared.core.player.PlotPlayer; import com.plotsquared.core.plot.Plot; import com.plotsquared.core.plot.flag.implementations.HideInfoFlag; import com.plotsquared.core.util.MainUtil; -import com.plotsquared.core.util.task.RunnableVal; @CommandDeclaration(command = "info", aliases = "i", @@ -60,10 +59,10 @@ public class Info extends SubCommand { case "owner": case "rating": case "likes": - plot = MainUtil.getPlotFromString(player, null, false); + plot = Plot.getPlotFromString(player, null, false); break; default: - plot = MainUtil.getPlotFromString(player, arg, false); + plot = Plot.getPlotFromString(player, arg, false); if (args.length == 2) { arg = args[1]; } else { @@ -141,13 +140,9 @@ public class Info extends SubCommand { } else { full = false; } - MainUtil.format(info, plot, player, full, new RunnableVal() { - @Override public void run(String value) { - MainUtil.sendMessage(player, - Captions.PLOT_INFO_HEADER.getTranslated() + '\n' + value + '\n' - + Captions.PLOT_INFO_FOOTER.getTranslated(), false); - } - }); + plot.format(info, player, full).thenAcceptAsync(value -> + player.sendMessage(Captions.PLOT_INFO_HEADER.getTranslated() + '\n' + value + '\n' + + Captions.PLOT_INFO_FOOTER.getTranslated())); return true; } diff --git a/Core/src/main/java/com/plotsquared/core/command/Kick.java b/Core/src/main/java/com/plotsquared/core/command/Kick.java index 1b35df43c..2559900fc 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Kick.java +++ b/Core/src/main/java/com/plotsquared/core/command/Kick.java @@ -35,6 +35,7 @@ import com.plotsquared.core.plot.Plot; import com.plotsquared.core.plot.world.PlotAreaManager; import com.plotsquared.core.util.MainUtil; import com.plotsquared.core.util.Permissions; +import com.plotsquared.core.util.PlayerManager; import com.plotsquared.core.util.TabCompletions; import com.plotsquared.core.util.WorldUtil; import javax.annotation.Nonnull; @@ -77,7 +78,7 @@ public class Kick extends SubCommand { return false; } - MainUtil.getUUIDsFromString(args[0], (uuids, throwable) -> { + PlayerManager.getUUIDsFromString(args[0], (uuids, throwable) -> { if (throwable instanceof TimeoutException) { MainUtil.sendMessage(player, Captions.FETCHING_PLAYERS_TIMEOUT); } else if (throwable != null || uuids.isEmpty()) { diff --git a/Core/src/main/java/com/plotsquared/core/command/ListCmd.java b/Core/src/main/java/com/plotsquared/core/command/ListCmd.java index 57bbe624a..49fa42f40 100644 --- a/Core/src/main/java/com/plotsquared/core/command/ListCmd.java +++ b/Core/src/main/java/com/plotsquared/core/command/ListCmd.java @@ -42,6 +42,7 @@ import com.plotsquared.core.util.EconHandler; import com.plotsquared.core.util.MainUtil; import com.plotsquared.core.util.MathMan; import com.plotsquared.core.util.Permissions; +import com.plotsquared.core.util.PlayerManager; import com.plotsquared.core.util.StringComparison; import com.plotsquared.core.util.StringMan; import com.plotsquared.core.util.TabCompletions; @@ -378,11 +379,11 @@ public class ListCmd extends SubCommand { } PlotMessage trusted = new PlotMessage().text(Captions.color( Captions.PLOT_INFO_TRUSTED.getTranslated() - .replaceAll("%trusted%", MainUtil.getPlayerList(plot.getTrusted())))) + .replaceAll("%trusted%", PlayerManager.getPlayerList(plot.getTrusted())))) .color("$1"); PlotMessage members = new PlotMessage().text(Captions.color( Captions.PLOT_INFO_MEMBERS.getTranslated() - .replaceAll("%members%", MainUtil.getPlayerList(plot.getMembers())))) + .replaceAll("%members%", PlayerManager.getPlayerList(plot.getMembers())))) .color("$1"); message.text("[").color("$3").text(i + "") .command("/plot visit " + plot.getArea() + ";" + plot.getId()) diff --git a/Core/src/main/java/com/plotsquared/core/command/Move.java b/Core/src/main/java/com/plotsquared/core/command/Move.java index 2ae527f54..e53a727de 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Move.java +++ b/Core/src/main/java/com/plotsquared/core/command/Move.java @@ -81,7 +81,7 @@ public class Move extends SubCommand { PlotArea area = this.plotAreaManager.getPlotAreaByString(args[0]); Plot plot2; if (area == null) { - plot2 = MainUtil.getPlotFromString(player, args[0], true); + plot2 = Plot.getPlotFromString(player, args[0], true); if (plot2 == null) { return CompletableFuture.completedFuture(false); } diff --git a/Core/src/main/java/com/plotsquared/core/command/Owner.java b/Core/src/main/java/com/plotsquared/core/command/Owner.java index c4b0938fb..880dd5530 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Owner.java +++ b/Core/src/main/java/com/plotsquared/core/command/Owner.java @@ -37,6 +37,7 @@ import com.plotsquared.core.plot.Plot; import com.plotsquared.core.util.EventDispatcher; import com.plotsquared.core.util.MainUtil; import com.plotsquared.core.util.Permissions; +import com.plotsquared.core.util.PlayerManager; import com.plotsquared.core.util.task.TaskManager; import javax.annotation.Nonnull; @@ -102,9 +103,9 @@ public class Owner extends SetCommand { MainUtil.sendMessage(player, Captions.SET_OWNER); return; } - final PlotPlayer other = PlotSquared.platform().getPlayerManager().getPlayerIfExists(uuid); + final PlotPlayer other = PlotSquared.platform().getPlayerManager().getPlayerIfExists(uuid); if (plot.isOwner(uuid)) { - Captions.ALREADY_OWNER.send(player, MainUtil.getName(uuid)); + Captions.ALREADY_OWNER.send(player, PlayerManager.getName(uuid)); return; } if (!force && !Permissions diff --git a/Core/src/main/java/com/plotsquared/core/command/Remove.java b/Core/src/main/java/com/plotsquared/core/command/Remove.java index b20a4da3a..ff9c66b7b 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Remove.java +++ b/Core/src/main/java/com/plotsquared/core/command/Remove.java @@ -34,6 +34,7 @@ import com.plotsquared.core.plot.Plot; import com.plotsquared.core.util.EventDispatcher; import com.plotsquared.core.util.MainUtil; import com.plotsquared.core.util.Permissions; +import com.plotsquared.core.util.PlayerManager; import com.plotsquared.core.util.TabCompletions; import javax.annotation.Nonnull; @@ -74,7 +75,7 @@ public class Remove extends SubCommand { return true; } - MainUtil.getUUIDsFromString(args[0], (uuids, throwable) -> { + PlayerManager.getUUIDsFromString(args[0], (uuids, throwable) -> { int count = 0; if (throwable instanceof TimeoutException) { MainUtil.sendMessage(player, Captions.FETCHING_PLAYERS_TIMEOUT); diff --git a/Core/src/main/java/com/plotsquared/core/command/Swap.java b/Core/src/main/java/com/plotsquared/core/command/Swap.java index 9e7ce5208..ed97da1c0 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Swap.java +++ b/Core/src/main/java/com/plotsquared/core/command/Swap.java @@ -63,7 +63,7 @@ public class Swap extends SubCommand { Captions.COMMAND_SYNTAX.send(player, getUsage()); return CompletableFuture.completedFuture(false); } - Plot plot2 = MainUtil.getPlotFromString(player, args[0], true); + Plot plot2 = Plot.getPlotFromString(player, args[0], true); if (plot2 == null) { return CompletableFuture.completedFuture(false); } diff --git a/Core/src/main/java/com/plotsquared/core/command/Target.java b/Core/src/main/java/com/plotsquared/core/command/Target.java index 3c0941c2c..effb3a7ba 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Target.java +++ b/Core/src/main/java/com/plotsquared/core/command/Target.java @@ -69,7 +69,7 @@ public class Target extends SubCommand { MainUtil.sendMessage(player, Captions.FOUND_NO_PLOTS); return false; } - } else if ((target = MainUtil.getPlotFromString(player, args[0], true)) == null) { + } else if ((target = Plot.getPlotFromString(player, args[0], true)) == null) { return false; } target.getCenter(player::setCompassTarget); diff --git a/Core/src/main/java/com/plotsquared/core/command/Template.java b/Core/src/main/java/com/plotsquared/core/command/Template.java index 5e90d5a90..0f4e90897 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Template.java +++ b/Core/src/main/java/com/plotsquared/core/command/Template.java @@ -27,6 +27,7 @@ package com.plotsquared.core.command; import com.google.inject.Inject; import com.plotsquared.core.PlotSquared; +import com.plotsquared.core.configuration.ConfigurationUtil; import com.plotsquared.core.inject.annotations.WorldConfig; import com.plotsquared.core.inject.annotations.WorldFile; import com.plotsquared.core.configuration.Captions; @@ -44,6 +45,7 @@ import com.plotsquared.core.queue.GlobalBlockQueue; import com.plotsquared.core.setup.PlotAreaBuilder; import com.plotsquared.core.setup.SettingsNodesWrapper; import com.plotsquared.core.util.FileBytes; +import com.plotsquared.core.util.FileUtils; import com.plotsquared.core.util.MainUtil; import com.plotsquared.core.util.SetupUtils; import com.plotsquared.core.util.WorldUtil; @@ -90,7 +92,7 @@ public class Template extends SubCommand { public static boolean extractAllFiles(String world, String template) { try { File folder = - MainUtil.getFile(PlotSquared.platform().getDirectory(), Settings.Paths.TEMPLATES); + FileUtils.getFile(PlotSquared.platform().getDirectory(), Settings.Paths.TEMPLATES); if (!folder.exists()) { return false; } @@ -144,8 +146,7 @@ public class Template extends SubCommand { } public static void zipAll(String world, Set files) throws IOException { - File output = - MainUtil.getFile(PlotSquared.platform().getDirectory(), Settings.Paths.TEMPLATES); + File output = FileUtils.getFile(PlotSquared.platform().getDirectory(), Settings.Paths.TEMPLATES); output.mkdirs(); try (FileOutputStream fos = new FileOutputStream( output + File.separator + world + ".template"); @@ -194,7 +195,7 @@ public class Template extends SubCommand { .sendMessage(player, "&cInvalid template file: " + args[2] + ".template"); return false; } - File worldFile = MainUtil.getFile(PlotSquared.platform().getDirectory(), + File worldFile = FileUtils.getFile(PlotSquared.platform().getDirectory(), Settings.Paths.TEMPLATES + File.separator + "tmp-data.yml"); YamlConfiguration worldConfig = YamlConfiguration.loadConfiguration(worldFile); this.worldConfiguration.set("worlds." + world, worldConfig.get("")); @@ -208,8 +209,8 @@ public class Template extends SubCommand { worldConfig.getString("generator.plugin", PlotSquared.platform().getPluginName()); String generator = worldConfig.getString("generator.init", manager); PlotAreaBuilder builder = PlotAreaBuilder.newBuilder() - .plotAreaType(MainUtil.getType(worldConfig)) - .terrainType(MainUtil.getTerrain(worldConfig)) + .plotAreaType(ConfigurationUtil.getType(worldConfig)) + .terrainType(ConfigurationUtil.getTerrain(worldConfig)) .plotManager(manager) .generatorName(generator) .settingsNodesWrapper(new SettingsNodesWrapper(new ConfigurationNode[0], null)) diff --git a/Core/src/main/java/com/plotsquared/core/command/Trust.java b/Core/src/main/java/com/plotsquared/core/command/Trust.java index a84feffc3..0003e0a67 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Trust.java +++ b/Core/src/main/java/com/plotsquared/core/command/Trust.java @@ -33,6 +33,7 @@ import com.plotsquared.core.plot.Plot; import com.plotsquared.core.util.EventDispatcher; import com.plotsquared.core.util.MainUtil; import com.plotsquared.core.util.Permissions; +import com.plotsquared.core.util.PlayerManager; import com.plotsquared.core.util.TabCompletions; import com.plotsquared.core.util.task.RunnableVal2; import com.plotsquared.core.util.task.RunnableVal3; @@ -75,7 +76,7 @@ public class Trust extends Command { checkTrue(args.length == 1, Captions.COMMAND_SYNTAX, getUsage()); final CompletableFuture future = new CompletableFuture<>(); - MainUtil.getUUIDsFromString(args[0], (uuids, throwable) -> { + PlayerManager.getUUIDsFromString(args[0], (uuids, throwable) -> { if (throwable != null) { if (throwable instanceof TimeoutException) { Captions.FETCHING_PLAYERS_TIMEOUT.send(player); @@ -93,17 +94,17 @@ public class Trust extends Command { if (uuid == DBFunc.EVERYONE && !( Permissions.hasPermission(player, Captions.PERMISSION_TRUST_EVERYONE) || Permissions .hasPermission(player, Captions.PERMISSION_ADMIN_COMMAND_TRUST))) { - MainUtil.sendMessage(player, Captions.INVALID_PLAYER, MainUtil.getName(uuid)); + MainUtil.sendMessage(player, Captions.INVALID_PLAYER, PlayerManager.getName(uuid)); iterator.remove(); continue; } if (currentPlot.isOwner(uuid)) { - MainUtil.sendMessage(player, Captions.ALREADY_ADDED, MainUtil.getName(uuid)); + MainUtil.sendMessage(player, Captions.ALREADY_ADDED, PlayerManager.getName(uuid)); iterator.remove(); continue; } if (currentPlot.getTrusted().contains(uuid)) { - MainUtil.sendMessage(player, Captions.ALREADY_ADDED, MainUtil.getName(uuid)); + MainUtil.sendMessage(player, Captions.ALREADY_ADDED, PlayerManager.getName(uuid)); iterator.remove(); continue; } diff --git a/Core/src/main/java/com/plotsquared/core/command/Visit.java b/Core/src/main/java/com/plotsquared/core/command/Visit.java index 5982d9337..72b74efdd 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Visit.java +++ b/Core/src/main/java/com/plotsquared/core/command/Visit.java @@ -37,6 +37,7 @@ import com.plotsquared.core.plot.world.PlotAreaManager; import com.plotsquared.core.util.MainUtil; import com.plotsquared.core.util.MathMan; import com.plotsquared.core.util.Permissions; +import com.plotsquared.core.util.PlayerManager; import com.plotsquared.core.util.TabCompletions; import com.plotsquared.core.util.query.PlotQuery; import com.plotsquared.core.util.query.SortingStrategy; @@ -178,7 +179,7 @@ public class Visit extends Command { final PlotArea finalSortByArea = sortByArea; int finalPage1 = page; - MainUtil.getUUIDsFromString(args[0], (uuids, throwable) -> { + PlayerManager.getUUIDsFromString(args[0], (uuids, throwable) -> { if (throwable instanceof TimeoutException) { Captions.FETCHING_PLAYERS_TIMEOUT.send(player); } else if (throwable != null || uuids.size() != 1) { @@ -219,7 +220,7 @@ public class Visit extends Command { }); } else { // Try to parse a plot - final Plot plot = MainUtil.getPlotFromString(player, finalArgs[0], true); + final Plot plot = Plot.getPlotFromString(player, finalArgs[0], true); if (plot != null) { this.visit(player, PlotQuery.newQuery().withPlot(plot), null, confirm, whenDone, 1); } diff --git a/Core/src/main/java/com/plotsquared/core/configuration/ConfigurationUtil.java b/Core/src/main/java/com/plotsquared/core/configuration/ConfigurationUtil.java index a5dd65f8e..73f54f34b 100644 --- a/Core/src/main/java/com/plotsquared/core/configuration/ConfigurationUtil.java +++ b/Core/src/main/java/com/plotsquared/core/configuration/ConfigurationUtil.java @@ -26,6 +26,9 @@ package com.plotsquared.core.configuration; import com.plotsquared.core.plot.BlockBucket; +import com.plotsquared.core.plot.PlotAreaTerrainType; +import com.plotsquared.core.plot.PlotAreaType; +import com.plotsquared.core.util.MathMan; import com.sk89q.worldedit.function.pattern.Pattern; import com.sk89q.worldedit.world.biome.BiomeType; import com.sk89q.worldedit.world.biome.BiomeTypes; @@ -33,6 +36,10 @@ import com.sk89q.worldedit.world.block.BlockState; import lombok.Getter; import javax.annotation.Nonnull; +import java.util.Optional; +import java.util.function.Function; +import java.util.function.IntFunction; +import java.util.function.Supplier; /** @@ -101,6 +108,29 @@ public class ConfigurationUtil { } }; + private static T getValueFromConfig(ConfigurationSection config, String path, + IntFunction> intParser, Function> textualParser, + Supplier defaultValue) { + String value = config.getString(path); + if (value == null) { + return defaultValue.get(); + } + if (MathMan.isInteger(value)) { + return intParser.apply(Integer.parseInt(value)).orElseGet(defaultValue); + } + return textualParser.apply(value).orElseGet(defaultValue); + } + + public static PlotAreaType getType(ConfigurationSection config) { + return getValueFromConfig(config, "generator.type", PlotAreaType::fromLegacyInt, + PlotAreaType::fromString, () -> PlotAreaType.NORMAL); + } + + public static PlotAreaTerrainType getTerrain(ConfigurationSection config) { + return getValueFromConfig(config, "generator.terrain", PlotAreaTerrainType::fromLegacyInt, + PlotAreaTerrainType::fromString, () -> PlotAreaTerrainType.NONE); + } + public static final class UnknownBlockException extends IllegalArgumentException { diff --git a/Core/src/main/java/com/plotsquared/core/database/SQLManager.java b/Core/src/main/java/com/plotsquared/core/database/SQLManager.java index cac8497dd..e73080a60 100644 --- a/Core/src/main/java/com/plotsquared/core/database/SQLManager.java +++ b/Core/src/main/java/com/plotsquared/core/database/SQLManager.java @@ -47,6 +47,7 @@ import com.plotsquared.core.plot.flag.GlobalFlagContainer; import com.plotsquared.core.plot.flag.PlotFlag; import com.plotsquared.core.plot.flag.types.BlockTypeListFlag; import com.plotsquared.core.util.EventDispatcher; +import com.plotsquared.core.util.HashUtil; import com.plotsquared.core.util.MainUtil; import com.plotsquared.core.util.StringMan; import com.plotsquared.core.util.task.RunnableVal; @@ -934,7 +935,7 @@ public class SQLManager implements AbstractDB { preparedStatement.setString(7, legacySettings.settings.getAlias()); } boolean[] merged = legacySettings.settings.getMerged(); - int hash = MainUtil.hash(merged); + int hash = HashUtil.hash(merged); preparedStatement.setInt(8, hash); BlockLoc loc = legacySettings.settings.getPosition(); String position; @@ -2049,7 +2050,7 @@ public class SQLManager implements AbstractDB { plot.getSettings().setMerged(merged); addPlotTask(plot, new UniqueStatement("setMerged") { @Override public void set(PreparedStatement statement) throws SQLException { - int hash = MainUtil.hash(merged); + int hash = HashUtil.hash(merged); statement.setInt(1, hash); statement.setInt(2, getId(plot)); } diff --git a/Core/src/main/java/com/plotsquared/core/generator/HybridPlotManager.java b/Core/src/main/java/com/plotsquared/core/generator/HybridPlotManager.java index c23c63b6c..de73d3891 100644 --- a/Core/src/main/java/com/plotsquared/core/generator/HybridPlotManager.java +++ b/Core/src/main/java/com/plotsquared/core/generator/HybridPlotManager.java @@ -37,9 +37,10 @@ import com.plotsquared.core.plot.PlotId; import com.plotsquared.core.queue.LocalBlockQueue; import com.plotsquared.core.util.ChunkManager; import com.plotsquared.core.util.FileBytes; -import com.plotsquared.core.util.MainUtil; +import com.plotsquared.core.util.FileUtils; import com.plotsquared.core.util.MathMan; import com.plotsquared.core.util.RegionManager; +import com.plotsquared.core.util.WorldUtil; import com.plotsquared.core.util.task.RunnableVal; import com.sk89q.worldedit.function.pattern.Pattern; import com.sk89q.worldedit.world.biome.BiomeType; @@ -47,12 +48,13 @@ import com.sk89q.worldedit.world.block.BaseBlock; import com.sk89q.worldedit.world.block.BlockState; import com.sk89q.worldedit.world.block.BlockTypes; import lombok.Getter; -import javax.annotation.Nonnull; +import javax.annotation.Nonnull; import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.util.HashSet; +import java.util.Objects; public class HybridPlotManager extends ClassicPlotManager { @@ -77,7 +79,7 @@ public class HybridPlotManager extends ClassicPlotManager { .getWorldName() + File.separator; try { File sideRoad = - MainUtil.getFile(PlotSquared.platform().getDirectory(), dir + "sideroad.schem"); + FileUtils.getFile(PlotSquared.platform().getDirectory(), dir + "sideroad.schem"); String newDir = "schematics" + File.separator + "GEN_ROAD_SCHEMATIC" + File.separator + "__TEMP_DIR__" + File.separator; if (sideRoad.exists()) { @@ -85,12 +87,12 @@ public class HybridPlotManager extends ClassicPlotManager { Files.readAllBytes(sideRoad.toPath()))); } File intersection = - MainUtil.getFile(PlotSquared.platform().getDirectory(), dir + "intersection.schem"); + FileUtils.getFile(PlotSquared.platform().getDirectory(), dir + "intersection.schem"); if (intersection.exists()) { files.add(new FileBytes(newDir + "intersection.schem", Files.readAllBytes(intersection.toPath()))); } - File plot = MainUtil.getFile(PlotSquared.platform().getDirectory(), dir + "plot.schem"); + File plot = FileUtils.getFile(PlotSquared.platform().getDirectory(), dir + "plot.schem"); if (plot.exists()) { files.add(new FileBytes(newDir + "plot.schem", Files.readAllBytes(plot.toPath()))); } @@ -109,7 +111,7 @@ public class HybridPlotManager extends ClassicPlotManager { Location pos1 = Location.at(hybridPlotWorld.getWorldName(), top.getX() + 1, 0, bot.getZ() - 1); Location pos2 = Location.at(hybridPlotWorld.getWorldName(), bot.getX(), Math.min(getWorldHeight(), 255), top.getZ() + 1); - MainUtil.resetBiome(hybridPlotWorld, pos1, pos2); + this.resetBiome(hybridPlotWorld, pos1, pos2); if (!hybridPlotWorld.ROAD_SCHEMATIC_ENABLED) { return true; } @@ -119,6 +121,17 @@ public class HybridPlotManager extends ClassicPlotManager { return true; } + private void resetBiome(@Nonnull final HybridPlotWorld hybridPlotWorld, @Nonnull final Location pos1, + @Nonnull final Location pos2) { + BiomeType biome = hybridPlotWorld.getPlotBiome(); + if (!Objects.equals(PlotSquared.platform().getWorldUtil() + .getBiomeSynchronous(hybridPlotWorld.getWorldName(), (pos1.getX() + pos2.getX()) / 2, + (pos1.getZ() + pos2.getZ()) / 2), biome)) { + WorldUtil.setBiome(hybridPlotWorld.getWorldName(), pos1.getX(), pos1.getZ(), pos2.getX(), pos2.getZ(), + biome); + } + } + private void createSchemAbs(LocalBlockQueue queue, Location pos1, Location pos2, boolean isRoad) { int size = hybridPlotWorld.SIZE; @@ -170,7 +183,7 @@ public class HybridPlotManager extends ClassicPlotManager { Location pos1 = Location.at(hybridPlotWorld.getWorldName(), bot.getX() - 1, 0, top.getZ() + 1); Location pos2 = Location.at(hybridPlotWorld.getWorldName(), top.getX() + 1, Math.min(getWorldHeight(), 255), bot.getZ()); - MainUtil.resetBiome(hybridPlotWorld, pos1, pos2); + this.resetBiome(hybridPlotWorld, pos1, pos2); if (!hybridPlotWorld.ROAD_SCHEMATIC_ENABLED) { return true; } @@ -238,7 +251,7 @@ public class HybridPlotManager extends ClassicPlotManager { } /* Otherwise we need to set each component, as we don't want to regenerate the road or other plots that share the same chunk.*/ // Set the biome - MainUtil.setBiome(world, value[2], value[3], value[4], value[5], biome); + WorldUtil.setBiome(world, value[2], value[3], value[4], value[5], biome); // These two locations are for each component (e.g. bedrock, main block, floor, air) Location bot = Location.at(world, value[2], 0, value[3]); Location top = Location.at(world, value[4], 1, value[5]); diff --git a/Core/src/main/java/com/plotsquared/core/generator/HybridPlotWorld.java b/Core/src/main/java/com/plotsquared/core/generator/HybridPlotWorld.java index a4a0d3a28..063849ba5 100644 --- a/Core/src/main/java/com/plotsquared/core/generator/HybridPlotWorld.java +++ b/Core/src/main/java/com/plotsquared/core/generator/HybridPlotWorld.java @@ -39,7 +39,7 @@ import com.plotsquared.core.plot.PlotManager; import com.plotsquared.core.plot.schematic.Schematic; import com.plotsquared.core.queue.GlobalBlockQueue; import com.plotsquared.core.util.EconHandler; -import com.plotsquared.core.util.MainUtil; +import com.plotsquared.core.util.FileUtils; import com.plotsquared.core.util.MathMan; import com.plotsquared.core.util.RegionManager; import com.plotsquared.core.util.SchematicHandler; @@ -56,11 +56,11 @@ import com.sk89q.worldedit.util.Direction; import com.sk89q.worldedit.world.biome.BiomeType; import com.sk89q.worldedit.world.block.BaseBlock; import lombok.Getter; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; import javax.inject.Inject; import java.io.File; import java.lang.reflect.Field; @@ -219,9 +219,9 @@ public class HybridPlotWorld extends ClassicPlotWorld { // Try to determine root. This means that plot areas can have separate schematic // directories - if (!(root = MainUtil.getFile(PlotSquared.platform().getDirectory(), "schematics/GEN_ROAD_SCHEMATIC/" + + if (!(root = FileUtils.getFile(PlotSquared.platform().getDirectory(), "schematics/GEN_ROAD_SCHEMATIC/" + this.getWorldName() + "/" + this.getId())).exists()) { - root = MainUtil.getFile(PlotSquared.platform().getDirectory(), + root = FileUtils.getFile(PlotSquared.platform().getDirectory(), "schematics/GEN_ROAD_SCHEMATIC/" + this.getWorldName()); } diff --git a/Core/src/main/java/com/plotsquared/core/generator/SquarePlotManager.java b/Core/src/main/java/com/plotsquared/core/generator/SquarePlotManager.java index be5380cce..389214029 100644 --- a/Core/src/main/java/com/plotsquared/core/generator/SquarePlotManager.java +++ b/Core/src/main/java/com/plotsquared/core/generator/SquarePlotManager.java @@ -30,13 +30,13 @@ import com.plotsquared.core.location.Location; import com.plotsquared.core.plot.Plot; import com.plotsquared.core.plot.PlotArea; import com.plotsquared.core.plot.PlotId; -import com.plotsquared.core.util.MainUtil; +import com.plotsquared.core.util.HashUtil; import com.plotsquared.core.util.RegionManager; import com.sk89q.worldedit.regions.CuboidRegion; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.annotation.Nonnull; +import javax.annotation.Nonnull; import java.util.Iterator; import java.util.Set; @@ -193,7 +193,7 @@ public abstract class SquarePlotManager extends GridPlotManager { PlotId id = PlotId.of(dx, dz); boolean[] merged = new boolean[] {rz <= pathWidthLower, rx > end, rz > end, rx <= pathWidthLower}; - int hash = MainUtil.hash(merged); + int hash = HashUtil.hash(merged); // Not merged, and no need to check if it is if (hash == 0) { return id; diff --git a/Core/src/main/java/com/plotsquared/core/listener/PlotListener.java b/Core/src/main/java/com/plotsquared/core/listener/PlotListener.java index 49610c8cb..2579976a4 100644 --- a/Core/src/main/java/com/plotsquared/core/listener/PlotListener.java +++ b/Core/src/main/java/com/plotsquared/core/listener/PlotListener.java @@ -58,16 +58,16 @@ import com.plotsquared.core.plot.flag.types.TimedFlag; import com.plotsquared.core.util.EventDispatcher; import com.plotsquared.core.util.MainUtil; import com.plotsquared.core.util.Permissions; +import com.plotsquared.core.util.PlayerManager; import com.plotsquared.core.util.StringMan; -import com.plotsquared.core.util.task.RunnableVal; import com.plotsquared.core.util.task.TaskManager; import com.plotsquared.core.util.task.TaskTime; import com.sk89q.worldedit.world.gamemode.GameMode; import com.sk89q.worldedit.world.gamemode.GameModes; import com.sk89q.worldedit.world.item.ItemType; import com.sk89q.worldedit.world.item.ItemTypes; -import javax.annotation.Nullable; +import javax.annotation.Nullable; import java.util.HashMap; import java.util.Iterator; import java.util.Map; @@ -155,12 +155,8 @@ public class PlotListener { final String greeting = plot.getFlag(GreetingFlag.class); if (!greeting.isEmpty()) { - MainUtil.format(Captions.PREFIX_GREETING.getTranslated() + greeting, plot, player, - false, new RunnableVal() { - @Override public void run(String value) { - MainUtil.sendMessage(player, value); - } - }); + plot.format(Captions.PREFIX_GREETING.getTranslated() + greeting, player, false) + .thenAcceptAsync(player::sendMessage); } if (plot.getFlag(NotifyEnterFlag.class)) { @@ -271,7 +267,7 @@ public class PlotListener { replacements.put("%world%", plot.getArea().toString()); replacements.put("%greeting%", greeting); replacements.put("%alias", plot.toString()); - replacements.put("%s", MainUtil.getName(plot.getOwner())); + replacements.put("%s", PlayerManager.getName(plot.getOwner())); String main = StringMan .replaceFromMap(Captions.TITLE_ENTERED_PLOT.getTranslated(), replacements); @@ -331,12 +327,8 @@ public class PlotListener { final String farewell = plot.getFlag(FarewellFlag.class); if (!farewell.isEmpty()) { - MainUtil.format(Captions.PREFIX_FAREWELL.getTranslated() + farewell, plot, player, - false, new RunnableVal() { - @Override public void run(String value) { - MainUtil.sendMessage(player, value); - } - }); + plot.format(Captions.PREFIX_FAREWELL.getTranslated() + farewell, player, false) + .thenAcceptAsync(player::sendMessage); } if (plot.getFlag(NotifyLeaveFlag.class)) { diff --git a/Core/src/main/java/com/plotsquared/core/plot/Plot.java b/Core/src/main/java/com/plotsquared/core/plot/Plot.java index ba18a5649..918388008 100644 --- a/Core/src/main/java/com/plotsquared/core/plot/Plot.java +++ b/Core/src/main/java/com/plotsquared/core/plot/Plot.java @@ -26,9 +26,12 @@ package com.plotsquared.core.plot; import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Lists; import com.google.common.collect.Sets; import com.google.inject.Inject; import com.plotsquared.core.PlotSquared; +import com.plotsquared.core.command.Like; +import com.plotsquared.core.configuration.CaptionUtility; import com.plotsquared.core.configuration.Captions; import com.plotsquared.core.configuration.ConfigurationUtil; import com.plotsquared.core.configuration.Settings; @@ -45,6 +48,7 @@ import com.plotsquared.core.location.BlockLoc; import com.plotsquared.core.location.Direction; import com.plotsquared.core.location.Location; import com.plotsquared.core.location.PlotLoc; +import com.plotsquared.core.player.ConsolePlayer; import com.plotsquared.core.player.PlotPlayer; import com.plotsquared.core.plot.comment.PlotComment; import com.plotsquared.core.plot.expiration.ExpireManager; @@ -53,7 +57,10 @@ import com.plotsquared.core.plot.flag.FlagContainer; import com.plotsquared.core.plot.flag.GlobalFlagContainer; import com.plotsquared.core.plot.flag.InternalFlag; import com.plotsquared.core.plot.flag.PlotFlag; +import com.plotsquared.core.plot.flag.implementations.DescriptionFlag; import com.plotsquared.core.plot.flag.implementations.KeepFlag; +import com.plotsquared.core.plot.flag.implementations.ServerPlotFlag; +import com.plotsquared.core.plot.flag.types.DoubleFlag; import com.plotsquared.core.plot.schematic.Schematic; import com.plotsquared.core.queue.GlobalBlockQueue; import com.plotsquared.core.queue.LocalBlockQueue; @@ -61,9 +68,13 @@ import com.plotsquared.core.util.EventDispatcher; import com.plotsquared.core.util.MainUtil; import com.plotsquared.core.util.MathMan; import com.plotsquared.core.util.Permissions; +import com.plotsquared.core.util.PlayerManager; import com.plotsquared.core.util.RegionManager; +import com.plotsquared.core.util.RegionUtil; import com.plotsquared.core.util.SchematicHandler; +import com.plotsquared.core.util.TimeUtil; import com.plotsquared.core.util.WorldUtil; +import com.plotsquared.core.util.query.PlotQuery; import com.plotsquared.core.util.task.RunnableVal; import com.plotsquared.core.util.task.TaskManager; import com.plotsquared.core.util.task.TaskTime; @@ -86,6 +97,7 @@ import java.awt.geom.PathIterator; import java.awt.geom.Rectangle2D; import java.io.File; import java.net.URL; +import java.text.DecimalFormat; import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Collection; @@ -124,24 +136,18 @@ import static com.plotsquared.core.util.entity.EntityCategories.CAP_VEHICLE; */ public class Plot { - private static final Logger logger = LoggerFactory.getLogger("P2/" + Plot.class.getSimpleName()); - public static final int MAX_HEIGHT = 256; + private static final Logger logger = LoggerFactory.getLogger("P2/" + Plot.class.getSimpleName()); + private static final DecimalFormat FLAG_DECIMAL_FORMAT = new DecimalFormat("0"); + + static { + FLAG_DECIMAL_FORMAT.setMaximumFractionDigits(340); + } + private static Set connected_cache; private static Set regions_cache; - @Nonnull private PlotId id; - - // These will be injected - @Inject private EventDispatcher eventDispatcher; - @Inject private PlotListener plotListener; - @Inject private RegionManager regionManager; - @Inject private GlobalBlockQueue blockQueue; - @Inject private WorldUtil worldUtil; - @Inject private SchematicHandler schematicHandler; - @Inject @ImpromptuPipeline private UUIDPipeline impromptuPipeline; - /** * Plot flag container */ @@ -150,7 +156,6 @@ public class Plot { * Has the plot changed since the last save cycle? */ public boolean countsTowardsMax = true; - /** * Represents whatever the database manager needs it to:
* - A value of -1 usually indicates the plot will not be stored in the DB
@@ -159,6 +164,15 @@ public class Plot { * @deprecated magical */ @Deprecated public int temp; + @Nonnull private PlotId id; + // These will be injected + @Inject private EventDispatcher eventDispatcher; + @Inject private PlotListener plotListener; + @Inject private RegionManager regionManager; + @Inject private GlobalBlockQueue blockQueue; + @Inject private WorldUtil worldUtil; + @Inject private SchematicHandler schematicHandler; + @Inject @ImpromptuPipeline private UUIDPipeline impromptuPipeline; /** * plot owner * (Merged plots can have multiple owners) @@ -284,6 +298,72 @@ public class Plot { PlotSquared.platform().getInjector().injectMembers(this); } + /** + * Get the plot from a string. + * + * @param player Provides a context for what world to search in. Prefixing the term with 'world_name;' will override this context. + * @param arg The search term + * @param message If a message should be sent to the player if a plot cannot be found + * @return The plot if only 1 result is found, or null + */ + @Nullable public static Plot getPlotFromString(PlotPlayer player, String arg, + boolean message) { + if (arg == null) { + if (player == null) { + if (message) { + logger.info("[P2] No plot area string was supplied"); + } + return null; + } + return player.getCurrentPlot(); + } + PlotArea area; + if (player != null) { + area = PlotSquared.get().getPlotAreaManager().getPlotAreaByString(arg); + if (area == null) { + area = player.getApplicablePlotArea(); + } + } else { + area = ConsolePlayer.getConsole().getApplicablePlotArea(); + } + String[] split = arg.split(";|,"); + PlotId id; + if (split.length == 4) { + area = PlotSquared.get().getPlotAreaManager() + .getPlotAreaByString(split[0] + ';' + split[1]); + id = PlotId.fromString(split[2] + ';' + split[3]); + } else if (split.length == 3) { + area = PlotSquared.get().getPlotAreaManager().getPlotAreaByString(split[0]); + id = PlotId.fromString(split[1] + ';' + split[2]); + } else if (split.length == 2) { + id = PlotId.fromString(arg); + } else { + Collection plots; + if (area == null) { + plots = PlotQuery.newQuery().allPlots().asList(); + } else { + plots = area.getPlots(); + } + for (Plot p : plots) { + String name = p.getAlias(); + if (!name.isEmpty() && name.equalsIgnoreCase(arg)) { + return p; + } + } + if (message) { + MainUtil.sendMessage(player, Captions.NOT_VALID_PLOT_ID); + } + return null; + } + if (area == null) { + if (message) { + MainUtil.sendMessage(player, Captions.NOT_VALID_PLOT_WORLD); + } + return null; + } + return area.getPlotAbs(id); + } + /** * Gets a plot from a string e.g. [area];[id] * @@ -329,6 +409,13 @@ public class Plot { return null; } + @Nonnull private static Location[] getCorners(@Nonnull final String world, + @Nonnull final CuboidRegion region) { + final BlockVector3 min = region.getMinimumPoint(); + final BlockVector3 max = region.getMaximumPoint(); + return new Location[] {Location.at(world, min), Location.at(world, max)}; + } + /** * Get the owner of this exact plot, as it is * stored in the database. @@ -471,7 +558,7 @@ public class Plot { * @see #getOwnerAbs() getOwnerAbs() to get the owner as stored in the database */ public UUID getOwner() { - if (MainUtil.isServerOwned(this)) { + if (this.getFlag(ServerPlotFlag.class)) { return DBFunc.SERVER; } return this.getOwnerAbs(); @@ -578,6 +665,15 @@ public class Plot { return this.id; } + /** + * Change the plot ID + * + * @param id new plot ID + */ + public void setId(@Nonnull final PlotId id) { + this.id = id; + } + /** * Gets the plot world object for this plot
* - The generic PlotArea object can be casted to its respective class for more control (e.g. HybridPlotWorld) @@ -961,7 +1057,7 @@ public class Plot { if (queue.isEmpty()) { Runnable run = () -> { for (CuboidRegion region : regions) { - Location[] corners = MainUtil.getCorners(getWorldName(), region); + Location[] corners = getCorners(getWorldName(), region); regionManager.clearAllEntities(corners[0], corners[1]); } TaskManager.runTask(whenDone); @@ -1071,7 +1167,7 @@ public class Plot { blockQueue.addEmptyTask(() -> { TaskManager.runTaskAsync(() -> { for (Plot current : plots) { - current.setSign(MainUtil.getName(current.getOwnerAbs())); + current.setSign(PlayerManager.getName(current.getOwnerAbs())); } }); }); @@ -1859,6 +1955,8 @@ public class Plot { return this.setComponent(component, parsed.toPattern()); } + //TODO Better documentation needed. + /** * Retrieve the biome of the plot. */ @@ -1867,6 +1965,8 @@ public class Plot { .getBiome(location.getWorldName(), location.getX(), location.getZ(), result)); } + //TODO Better documentation needed. + /** * @deprecated May cause synchronous chunk loads */ @@ -1876,8 +1976,6 @@ public class Plot { .getBiomeSynchronous(location.getWorldName(), location.getX(), location.getZ()); } - //TODO Better documentation needed. - /** * Returns the top location for the plot. */ @@ -1885,8 +1983,6 @@ public class Plot { return this.getManager().getPlotTopLocAbs(this.id).withWorld(this.getWorldName()); } - //TODO Better documentation needed. - /** * Returns the bottom location for the plot. */ @@ -2001,7 +2097,7 @@ public class Plot { if (!this.isMerged()) { return new Location[] {this.getBottomAbs(), this.getTopAbs()}; } - return MainUtil.getCorners(this.getWorldName(), this.getRegions()); + return RegionUtil.getCorners(this.getWorldName(), this.getRegions()); } /** @@ -2078,7 +2174,6 @@ public class Plot { return this.area + ";" + this.id.toString(); } - /** * Remove a denied player (use DBFunc as well)
* Using the * uuid will remove all users @@ -2179,8 +2274,8 @@ public class Plot { } } else { TaskManager.runTaskAsync(() -> { - String name = Plot.this.id + "," + Plot.this.area + ',' + MainUtil - .getName(Plot.this.getOwnerAbs()); + String name = Plot.this.id + "," + Plot.this.area + ',' + + PlayerManager.getName(Plot.this.getOwnerAbs()); boolean result = schematicHandler.save(value, Settings.Paths.SCHEMATICS + File.separator + name + ".schem"); if (whenDone != null) { @@ -2754,8 +2849,9 @@ public class Plot { PlotId top = PlotId.of(current.getId().getX(), current.getId().getY()); while (merge) { merge = false; - ArrayList ids = MainUtil.getPlotSelectionIds(PlotId.of(bot.getX(), bot.getY() - 1), - PlotId.of(top.getX(), bot.getY() - 1)); + List ids = Lists.newArrayList((Iterable) + PlotId.PlotRangeIterator.range(PlotId.of(bot.getX(), bot.getY() - 1), + PlotId.of(top.getX(), bot.getY() - 1))); boolean tmp = true; for (PlotId id : ids) { Plot plot = this.area.getPlotAbs(id); @@ -2768,8 +2864,9 @@ public class Plot { merge = true; bot = PlotId.of(bot.getX(), bot.getY() - 1); } - ids = MainUtil.getPlotSelectionIds(PlotId.of(top.getX() + 1, bot.getY()), - PlotId.of(top.getX() + 1, top.getY())); + ids = Lists.newArrayList((Iterable) + PlotId.PlotRangeIterator.range(PlotId.of(top.getX() + 1, bot.getY()), + PlotId.of(top.getX() + 1, top.getY()))); tmp = true; for (PlotId id : ids) { Plot plot = this.area.getPlotAbs(id); @@ -2782,8 +2879,9 @@ public class Plot { merge = true; top = PlotId.of(top.getX() + 1, top.getY()); } - ids = MainUtil.getPlotSelectionIds(PlotId.of(bot.getX(), top.getY() + 1), - PlotId.of(top.getX(), top.getY() + 1)); + ids = Lists.newArrayList((Iterable) + PlotId.PlotRangeIterator.range(PlotId.of(bot.getX(), top.getY() + 1), + PlotId.of(top.getX(), top.getY() + 1))); tmp = true; for (PlotId id : ids) { Plot plot = this.area.getPlotAbs(id); @@ -2796,8 +2894,9 @@ public class Plot { merge = true; top = PlotId.of(top.getX(), top.getY() + 1); } - ids = MainUtil.getPlotSelectionIds(PlotId.of(bot.getX() - 1, bot.getY()), - PlotId.of(bot.getX() - 1, top.getY())); + ids = Lists.newArrayList((Iterable) + PlotId.PlotRangeIterator.range(PlotId.of(bot.getX() - 1, bot.getY()), + PlotId.of(bot.getX() - 1, top.getY()))); tmp = true; for (PlotId id : ids) { Plot plot = this.area.getPlotAbs(id); @@ -2813,7 +2912,8 @@ public class Plot { } Location gtopabs = this.area.getPlotAbs(top).getTopAbs(); Location gbotabs = this.area.getPlotAbs(bot).getBottomAbs(); - visited.addAll(MainUtil.getPlotSelectionIds(bot, top)); + visited.addAll(Lists.newArrayList((Iterable) + PlotId.PlotRangeIterator.range(bot, top))); for (int x = bot.getX(); x <= top.getX(); x++) { Plot plot = this.area.getPlotAbs(PlotId.of(x, top.getY())); if (plot.getMerged(Direction.SOUTH)) { @@ -3194,7 +3294,7 @@ public class Plot { TaskManager.runTask(whenDone); } else { CuboidRegion region = regions.poll(); - Location[] corners = MainUtil.getCorners(getWorldName(), region); + Location[] corners = getCorners(getWorldName(), region); Location pos1 = corners[0]; Location pos2 = corners[1]; Location pos3 = pos1.add(offsetX, 0, offsetZ).withWorld(destination.getWorldName()); @@ -3226,7 +3326,7 @@ public class Plot { } final Runnable task = this; CuboidRegion region = regions.poll(); - Location[] corners = MainUtil.getCorners(getWorldName(), region); + Location[] corners = getCorners(getWorldName(), region); final Location pos1 = corners[0]; final Location pos2 = corners[1]; Location newPos = pos1.add(offsetX, 0, offsetZ).withWorld(destination.getWorldName()); @@ -3320,7 +3420,7 @@ public class Plot { return; } CuboidRegion region = regions.poll(); - Location[] corners = MainUtil.getCorners(getWorldName(), region); + Location[] corners = getCorners(getWorldName(), region); Location pos1 = corners[0]; Location pos2 = corners[1]; Location newPos = pos1 .add(offsetX, 0, offsetZ).withWorld(destination.getWorldName()); @@ -3381,13 +3481,158 @@ public class Plot { return FlagContainer.castUnsafe(flagInstance).getValue(); } + public CompletableFuture format(final String iInfo, PlotPlayer player, final boolean full) { + final CompletableFuture future = new CompletableFuture<>(); + int num = this.getConnectedPlots().size(); + String alias = !this.getAlias().isEmpty() ? this.getAlias() : Captions.NONE.getTranslated(); + Location bot = this.getCorners()[0]; + PlotSquared.platform().getWorldUtil() + .getBiome(this.getWorldName(), bot.getX(), bot.getZ(), biome -> { + String info = iInfo; + String trusted = PlayerManager.getPlayerList(this.getTrusted()); + String members = PlayerManager.getPlayerList(this.getMembers()); + String denied = PlayerManager.getPlayerList(this.getDenied()); + String seen; + if (Settings.Enabled_Components.PLOT_EXPIRY && ExpireManager.IMP != null) { + if (this.isOnline()) { + seen = Captions.NOW.getTranslated(); + } else { + int time = (int) (ExpireManager.IMP.getAge(this) / 1000); + if (time != 0) { + seen = TimeUtil.secToTime(time); + } else { + seen = Captions.UNKNOWN.getTranslated(); + } + } + } else { + seen = Captions.NEVER.getTranslated(); + } + + String description = this.getFlag(DescriptionFlag.class); + if (description.isEmpty()) { + description = Captions.PLOT_NO_DESCRIPTION.getTranslated(); + } + + StringBuilder flags = new StringBuilder(); + Collection> flagCollection = this.getApplicableFlags(true); + if (flagCollection.isEmpty()) { + flags.append(Captions.NONE.getTranslated()); + } else { + String prefix = " "; + for (final PlotFlag flag : flagCollection) { + Object value; + if (flag instanceof DoubleFlag && !Settings.General.SCIENTIFIC) { + value = FLAG_DECIMAL_FORMAT.format(flag.getValue()); + } else { + value = flag.toString(); + } + flags.append(prefix).append(CaptionUtility + .format(player, Captions.PLOT_FLAG_LIST.getTranslated(), flag.getName(), + CaptionUtility.formatRaw(player, value.toString(), ""))); + prefix = ", "; + } + } + boolean build = this.isAdded(player.getUUID()); + String owner = this.getOwners().isEmpty() ? "unowned" : PlayerManager.getPlayerList(this.getOwners()); + if (this.getArea() != null) { + info = info.replace("%area%", + this.getArea().getWorldName() + (this.getArea().getId() == null ? + "" : + "(" + this.getArea().getId() + ")")); + } else { + info = info.replace("%area%", Captions.NONE.getTranslated()); + } + info = info.replace("%id%", this.getId().toString()); + info = info.replace("%alias%", alias); + info = info.replace("%num%", String.valueOf(num)); + info = info.replace("%desc%", description); + info = info.replace("%biome%", biome.toString().toLowerCase()); + info = info.replace("%owner%", owner); + info = info.replace("%members%", members); + info = info.replace("%player%", player.getName()); + info = info.replace("%trusted%", trusted); + info = info.replace("%helpers%", members); + info = info.replace("%denied%", denied); + info = info.replace("%seen%", seen); + info = info.replace("%flags%", flags); + info = info.replace("%build%", String.valueOf(build)); + if (info.contains("%rating%")) { + final String newInfo = info; + TaskManager.runTaskAsync(() -> { + String info1; + if (Settings.Ratings.USE_LIKES) { + info1 = newInfo.replaceAll("%rating%", + String.format("%.0f%%", Like.getLikesPercentage(this) * 100D)); + } else { + int max = 10; + if (Settings.Ratings.CATEGORIES != null && !Settings.Ratings.CATEGORIES + .isEmpty()) { + max = 8; + } + if (full && Settings.Ratings.CATEGORIES != null + && Settings.Ratings.CATEGORIES.size() > 1) { + double[] ratings = this.getAverageRatings(); + String rating = ""; + String prefix = ""; + for (int i = 0; i < ratings.length; i++) { + rating += + prefix + Settings.Ratings.CATEGORIES.get(i) + '=' + String + .format("%.1f", ratings[i]); + prefix = ","; + } + info1 = newInfo.replaceAll("%rating%", rating); + } else { + info1 = newInfo.replaceAll("%rating%", + String.format("%.1f", this.getAverageRating()) + '/' + max); + } + } + future.complete(info1); + }); + return; + } + future.complete(info); + }); + return future; + } + /** - * Change the plot ID + * If rating categories are enabled, get the average rating by category.
+ * - The index corresponds to the index of the category in the config * - * @param id new plot ID + * @return Average ratings in each category */ - public void setId(@Nonnull final PlotId id) { - this.id = id; + public double[] getAverageRatings() { + Map rating; + if (this.getSettings().getRatings() != null) { + rating = this.getSettings().getRatings(); + } else if (Settings.Enabled_Components.RATING_CACHE) { + rating = new HashMap<>(); + } else { + rating = DBFunc.getRatings(this); + } + int size = 1; + if (!Settings.Ratings.CATEGORIES.isEmpty()) { + size = Math.max(1, Settings.Ratings.CATEGORIES.size()); + } + double[] ratings = new double[size]; + if (rating == null || rating.isEmpty()) { + return ratings; + } + for (Entry entry : rating.entrySet()) { + int current = entry.getValue(); + if (Settings.Ratings.CATEGORIES.isEmpty()) { + ratings[0] += current; + } else { + for (int i = 0; i < Settings.Ratings.CATEGORIES.size(); i++) { + ratings[i] += current % 10 - 1; + current /= 10; + } + } + } + for (int i = 0; i < size; i++) { + ratings[i] /= rating.size(); + } + return ratings; } } diff --git a/Core/src/main/java/com/plotsquared/core/plot/PlotArea.java b/Core/src/main/java/com/plotsquared/core/plot/PlotArea.java index 027e73e0b..815bdeae2 100644 --- a/Core/src/main/java/com/plotsquared/core/plot/PlotArea.java +++ b/Core/src/main/java/com/plotsquared/core/plot/PlotArea.java @@ -27,6 +27,7 @@ package com.plotsquared.core.plot; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Lists; import com.plotsquared.core.collection.QuadMap; import com.plotsquared.core.configuration.CaptionUtility; import com.plotsquared.core.configuration.Captions; @@ -51,7 +52,6 @@ import com.plotsquared.core.queue.GlobalBlockQueue; import com.plotsquared.core.queue.LocalBlockQueue; import com.plotsquared.core.util.EconHandler; import com.plotsquared.core.util.Expression; -import com.plotsquared.core.util.MainUtil; import com.plotsquared.core.util.MathMan; import com.plotsquared.core.util.RegionUtil; import com.plotsquared.core.util.StringMan; @@ -271,8 +271,8 @@ public abstract class PlotArea { throw new IllegalArgumentException("Must extend GridPlotWorld to provide"); } if (config.contains("generator.terrain")) { - this.terrain = MainUtil.getTerrain(config); - this.type = MainUtil.getType(config); + this.terrain = ConfigurationUtil.getTerrain(config); + this.type = ConfigurationUtil.getType(config); } this.mobSpawning = config.getBoolean("natural_mob_spawning"); this.miscSpawnUnowned = config.getBoolean("misc_spawn_unowned"); @@ -993,7 +993,8 @@ public abstract class PlotArea { final int size = (1 + pos2.getX() - pos1.getX()) * (1 + pos2.getY() - pos1.getY()); final Set result = new HashSet<>(); if (size < 16 || size < getPlotCount()) { - for (final PlotId pid : MainUtil.getPlotSelectionIds(pos1, pos2)) { + for (final PlotId pid : Lists.newArrayList((Iterable) + PlotId.PlotRangeIterator.range(pos1, pos2))) { final Plot plot = getPlotAbs(pid); if (plot.hasOwner()) { if (plot.getId().getX() > pos1.getX() || plot.getId().getY() > pos1.getY() diff --git a/Core/src/main/java/com/plotsquared/core/plot/PlotCluster.java b/Core/src/main/java/com/plotsquared/core/plot/PlotCluster.java index f5ec63146..92821ead6 100644 --- a/Core/src/main/java/com/plotsquared/core/plot/PlotCluster.java +++ b/Core/src/main/java/com/plotsquared/core/plot/PlotCluster.java @@ -25,15 +25,15 @@ */ package com.plotsquared.core.plot; +import com.plotsquared.core.PlotSquared; import com.plotsquared.core.database.DBFunc; import com.plotsquared.core.location.BlockLoc; import com.plotsquared.core.location.Location; -import com.plotsquared.core.util.MainUtil; import com.plotsquared.core.util.RegionUtil; import com.sk89q.worldedit.regions.CuboidRegion; + import javax.annotation.Nonnull; import javax.annotation.Nullable; - import java.util.HashSet; import java.util.UUID; import java.util.function.Consumer; @@ -156,13 +156,16 @@ public class PlotCluster { public void getHome(@Nonnull final Consumer result) { final BlockLoc home = this.settings.getPosition(); Consumer locationConsumer = toReturn -> - MainUtil.getHighestBlock(this.area.getWorldName(), toReturn.getX(), toReturn.getZ(), - max -> { - if (max > toReturn.getY()) { - result.accept(toReturn.withY(1 + max)); - } else { - result.accept(toReturn); - } + PlotSquared.platform().getWorldUtil().getHighestBlock(this.area.getWorldName(), toReturn.getX(), toReturn.getZ(), + highest -> { + if (highest == 0) { + highest = 63; + } + if (highest > toReturn.getY()) { + result.accept(toReturn.withY(1 + highest)); + } else { + result.accept(toReturn); + } }); if (home.getY() == 0) { // default pos diff --git a/Core/src/main/java/com/plotsquared/core/plot/expiration/ExpireManager.java b/Core/src/main/java/com/plotsquared/core/plot/expiration/ExpireManager.java index 68f2c4b89..2a3514540 100644 --- a/Core/src/main/java/com/plotsquared/core/plot/expiration/ExpireManager.java +++ b/Core/src/main/java/com/plotsquared/core/plot/expiration/ExpireManager.java @@ -40,6 +40,7 @@ import com.plotsquared.core.plot.flag.GlobalFlagContainer; import com.plotsquared.core.plot.flag.PlotFlag; import com.plotsquared.core.plot.flag.implementations.AnalysisFlag; import com.plotsquared.core.plot.flag.implementations.KeepFlag; +import com.plotsquared.core.plot.flag.implementations.ServerPlotFlag; import com.plotsquared.core.plot.message.PlotMessage; import com.plotsquared.core.util.EventDispatcher; import com.plotsquared.core.util.MainUtil; @@ -215,7 +216,7 @@ public class ExpireManager { return new ArrayList<>(); } - if (MainUtil.isServerOwned(plot)) { + if (plot.getFlag(ServerPlotFlag.class)) { return new ArrayList<>(); } diff --git a/Core/src/main/java/com/plotsquared/core/plot/flag/implementations/KeepFlag.java b/Core/src/main/java/com/plotsquared/core/plot/flag/implementations/KeepFlag.java index 187237f2a..d4a1b263b 100644 --- a/Core/src/main/java/com/plotsquared/core/plot/flag/implementations/KeepFlag.java +++ b/Core/src/main/java/com/plotsquared/core/plot/flag/implementations/KeepFlag.java @@ -28,8 +28,9 @@ package com.plotsquared.core.plot.flag.implementations; import com.plotsquared.core.configuration.Captions; import com.plotsquared.core.plot.flag.FlagParseException; import com.plotsquared.core.plot.flag.PlotFlag; -import com.plotsquared.core.util.MainUtil; import com.plotsquared.core.util.MathMan; +import com.plotsquared.core.util.TimeUtil; + import javax.annotation.Nonnull; public class KeepFlag extends PlotFlag { @@ -60,7 +61,7 @@ public class KeepFlag extends PlotFlag { case "false": return flagOf(false); default: - return flagOf(MainUtil.timeToSec(input) * 1000 + System.currentTimeMillis()); + return flagOf(TimeUtil.timeToSec(input) * 1000 + System.currentTimeMillis()); } } diff --git a/Core/src/main/java/com/plotsquared/core/plot/world/SinglePlotManager.java b/Core/src/main/java/com/plotsquared/core/plot/world/SinglePlotManager.java index 2335735fd..82aaa7a3f 100644 --- a/Core/src/main/java/com/plotsquared/core/plot/world/SinglePlotManager.java +++ b/Core/src/main/java/com/plotsquared/core/plot/world/SinglePlotManager.java @@ -31,11 +31,11 @@ import com.plotsquared.core.plot.Plot; import com.plotsquared.core.plot.PlotArea; import com.plotsquared.core.plot.PlotId; import com.plotsquared.core.plot.PlotManager; -import com.plotsquared.core.util.MainUtil; +import com.plotsquared.core.util.FileUtils; import com.plotsquared.core.util.task.TaskManager; import com.sk89q.worldedit.function.pattern.Pattern; -import javax.annotation.Nonnull; +import javax.annotation.Nonnull; import java.io.File; import java.util.List; @@ -65,7 +65,7 @@ public class SinglePlotManager extends PlotManager { PlotSquared.platform().getSetupUtils().unload(plot.getWorldName(), false); final File worldFolder = new File(PlotSquared.platform().getWorldContainer(), plot.getWorldName()); TaskManager.getPlatformImplementation().taskAsync(() -> { - MainUtil.deleteDirectory(worldFolder); + FileUtils.deleteDirectory(worldFolder); if (whenDone != null) { whenDone.run(); } diff --git a/Core/src/main/java/com/plotsquared/core/util/FileUtils.java b/Core/src/main/java/com/plotsquared/core/util/FileUtils.java new file mode 100644 index 000000000..54e674b77 --- /dev/null +++ b/Core/src/main/java/com/plotsquared/core/util/FileUtils.java @@ -0,0 +1,67 @@ +/* + * _____ _ _ _____ _ + * | __ \| | | | / ____| | | + * | |__) | | ___ | |_| (___ __ _ _ _ __ _ _ __ ___ __| | + * | ___/| |/ _ \| __|\___ \ / _` | | | |/ _` | '__/ _ \/ _` | + * | | | | (_) | |_ ____) | (_| | |_| | (_| | | | __/ (_| | + * |_| |_|\___/ \__|_____/ \__, |\__,_|\__,_|_| \___|\__,_| + * | | + * |_| + * PlotSquared plot management system for Minecraft + * Copyright (C) 2020 IntellectualSites + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.plotsquared.core.util; + +import javax.annotation.Nonnull; +import java.io.File; +import java.nio.file.Paths; + +public final class FileUtils { + + private FileUtils() { + } + + /** + * Attempt to (recursively) delete a directory + * + * @param directory Directory to delete + * @throws RuntimeException If the deletion fails + */ + public static void deleteDirectory(@Nonnull final File directory) { + if (directory.exists()) { + final File[] files = directory.listFiles(); + if (null != files) { + for (final File file : files) { + if (file.isDirectory()) { + deleteDirectory(file); + } + } + } + } + if (!directory.delete()) { + throw new RuntimeException( + String.format("Failed to delete directory %s", directory.getName())); + } + } + + @Nonnull public static File getFile(@Nonnull final File base, @Nonnull final String path) { + if (Paths.get(path).isAbsolute()) { + return new File(path); + } + return new File(base, path); + } + +} diff --git a/Core/src/main/java/com/plotsquared/core/util/HashUtil.java b/Core/src/main/java/com/plotsquared/core/util/HashUtil.java new file mode 100644 index 000000000..99f45878c --- /dev/null +++ b/Core/src/main/java/com/plotsquared/core/util/HashUtil.java @@ -0,0 +1,57 @@ +/* + * _____ _ _ _____ _ + * | __ \| | | | / ____| | | + * | |__) | | ___ | |_| (___ __ _ _ _ __ _ _ __ ___ __| | + * | ___/| |/ _ \| __|\___ \ / _` | | | |/ _` | '__/ _ \/ _` | + * | | | | (_) | |_ ____) | (_| | |_| | (_| | | | __/ (_| | + * |_| |_|\___/ \__|_____/ \__, |\__,_|\__,_|_| \___|\__,_| + * | | + * |_| + * PlotSquared plot management system for Minecraft + * Copyright (C) 2020 IntellectualSites + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.plotsquared.core.util; + +import javax.annotation.Nonnull; + +public final class HashUtil { + + private HashUtil() { + } + + /** + * Hashcode of a boolean array.
+ * - Used for traversing mega plots quickly. + * + * @param array Booleans to hash + * @return hashcode + */ + public static int hash(@Nonnull final boolean[] array) { + if (array.length == 4) { + if (!array[0] && !array[1] && !array[2] && !array[3]) { + return 0; + } + return ((array[0] ? 1 : 0) << 3) + ((array[1] ? 1 : 0) << 2) + ((array[2] ? 1 : 0) << 1) + + (array[3] ? 1 : 0); + } + int n = 0; + for (boolean anArray : array) { + n = (n << 1) + (anArray ? 1 : 0); + } + return n; + } + +} diff --git a/Core/src/main/java/com/plotsquared/core/util/MainUtil.java b/Core/src/main/java/com/plotsquared/core/util/MainUtil.java index fb169c3e6..e81b54e6e 100644 --- a/Core/src/main/java/com/plotsquared/core/util/MainUtil.java +++ b/Core/src/main/java/com/plotsquared/core/util/MainUtil.java @@ -25,87 +25,23 @@ */ package com.plotsquared.core.util; -import com.plotsquared.core.PlotSquared; -import com.plotsquared.core.command.Like; import com.plotsquared.core.configuration.Caption; import com.plotsquared.core.configuration.CaptionUtility; import com.plotsquared.core.configuration.Captions; -import com.plotsquared.core.configuration.ConfigurationSection; -import com.plotsquared.core.configuration.Settings; -import com.plotsquared.core.database.DBFunc; -import com.plotsquared.core.location.Location; -import com.plotsquared.core.player.ConsolePlayer; import com.plotsquared.core.player.PlotPlayer; -import com.plotsquared.core.plot.Plot; -import com.plotsquared.core.plot.PlotArea; -import com.plotsquared.core.plot.PlotAreaTerrainType; -import com.plotsquared.core.plot.PlotAreaType; -import com.plotsquared.core.plot.PlotId; -import com.plotsquared.core.plot.expiration.ExpireManager; -import com.plotsquared.core.plot.flag.PlotFlag; -import com.plotsquared.core.plot.flag.implementations.DescriptionFlag; -import com.plotsquared.core.plot.flag.implementations.ServerPlotFlag; -import com.plotsquared.core.plot.flag.types.DoubleFlag; -import com.plotsquared.core.util.net.AbstractDelegateOutputStream; -import com.plotsquared.core.util.query.PlotQuery; -import com.plotsquared.core.util.task.RunnableVal; import com.plotsquared.core.util.task.TaskManager; -import com.plotsquared.core.uuid.UUIDMapping; -import com.sk89q.worldedit.math.BlockVector2; -import com.sk89q.worldedit.math.BlockVector3; -import com.sk89q.worldedit.regions.CuboidRegion; -import com.sk89q.worldedit.world.biome.BiomeType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.annotation.Nonnull; -import javax.annotation.Nullable; -import java.io.File; -import java.io.IOException; -import java.io.OutputStream; -import java.io.OutputStreamWriter; -import java.io.PrintWriter; -import java.net.HttpURLConnection; -import java.net.MalformedURLException; -import java.net.URL; -import java.net.URLConnection; -import java.nio.charset.StandardCharsets; -import java.nio.file.Paths; -import java.text.DecimalFormat; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Objects; -import java.util.Optional; -import java.util.Scanner; -import java.util.Set; -import java.util.UUID; -import java.util.concurrent.TimeUnit; -import java.util.function.BiConsumer; -import java.util.function.Function; -import java.util.function.IntConsumer; -import java.util.function.IntFunction; -import java.util.function.Supplier; -import java.util.stream.Collectors; -import java.util.stream.IntStream; /** * plot functions */ public class MainUtil { - private static final Logger logger = LoggerFactory.getLogger("P2/" + MainUtil.class.getSimpleName()); - private static final DecimalFormat FLAG_DECIMAL_FORMAT = new DecimalFormat("0"); - - static { - FLAG_DECIMAL_FORMAT.setMaximumFractionDigits(340); - } + private static final Logger logger = + LoggerFactory.getLogger("P2/" + MainUtil.class.getSimpleName()); /** * Cache of mapping x,y,z coordinates to the chunk array
@@ -154,482 +90,6 @@ public class MainUtil { } } - public static void upload(@Nullable UUID uuid, @Nullable final String file, - @Nonnull final String extension, @Nullable final RunnableVal writeTask, - @Nonnull final RunnableVal whenDone) { - if (writeTask == null) { - TaskManager.runTask(whenDone); - return; - } - final String filename; - final String website; - if (uuid == null) { - uuid = UUID.randomUUID(); - website = Settings.Web.URL + "upload.php?" + uuid; - filename = "plot." + extension; - } else { - website = Settings.Web.URL + "save.php?" + uuid; - filename = file + '.' + extension; - } - final URL url; - try { - url = new URL(Settings.Web.URL + "?key=" + uuid + "&type=" + extension); - } catch (MalformedURLException e) { - e.printStackTrace(); - whenDone.run(); - return; - } - TaskManager.runTaskAsync(() -> { - try { - String boundary = Long.toHexString(System.currentTimeMillis()); - URLConnection con = new URL(website).openConnection(); - con.setDoOutput(true); - con.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary); - try (OutputStream output = con.getOutputStream(); - PrintWriter writer = new PrintWriter( - new OutputStreamWriter(output, StandardCharsets.UTF_8), true)) { - String CRLF = "\r\n"; - writer.append("--" + boundary).append(CRLF); - writer.append("Content-Disposition: form-data; name=\"param\"").append(CRLF); - writer.append( - "Content-Type: text/plain; charset=" + StandardCharsets.UTF_8.displayName()) - .append(CRLF); - String param = "value"; - writer.append(CRLF).append(param).append(CRLF).flush(); - writer.append("--" + boundary).append(CRLF); - writer.append( - "Content-Disposition: form-data; name=\"schematicFile\"; filename=\"" - + filename + '"').append(CRLF); - writer - .append("Content-Type: " + URLConnection.guessContentTypeFromName(filename)) - .append(CRLF); - writer.append("Content-Transfer-Encoding: binary").append(CRLF); - writer.append(CRLF).flush(); - writeTask.value = new AbstractDelegateOutputStream(output) { - @Override public void close() { - } // Don't close - }; - writeTask.run(); - output.flush(); - writer.append(CRLF).flush(); - writer.append("--" + boundary + "--").append(CRLF).flush(); - } - String content; - try (Scanner scanner = new Scanner(con.getInputStream()).useDelimiter("\\A")) { - content = scanner.next().trim(); - } - if (!content.startsWith("<")) { - } - int responseCode = ((HttpURLConnection) con).getResponseCode(); - if (responseCode == 200) { - whenDone.value = url; - } - TaskManager.runTask(whenDone); - } catch (IOException e) { - e.printStackTrace(); - TaskManager.runTask(whenDone); - } - }); - } - - /** - * Resets the biome if it was modified - * - * @param area - * @param pos1 - * @param pos2 - * @return true if any changes were made - */ - public static boolean resetBiome(PlotArea area, Location pos1, Location pos2) { - BiomeType biome = area.getPlotBiome(); - if (!Objects.equals(PlotSquared.platform().getWorldUtil().getBiomeSynchronous(area.getWorldName(), (pos1.getX() + pos2.getX()) / 2, - (pos1.getZ() + pos2.getZ()) / 2), biome)) { - MainUtil - .setBiome(area.getWorldName(), pos1.getX(), pos1.getZ(), pos2.getX(), pos2.getZ(), - biome); - return true; - } - return false; - } - - public static String secToTime(long time) { - StringBuilder toreturn = new StringBuilder(); - if (time >= 33868800) { - int years = (int) (time / 33868800); - time -= years * 33868800; - toreturn.append(years + "y "); - } - if (time >= 604800) { - int weeks = (int) (time / 604800); - time -= weeks * 604800; - toreturn.append(weeks + "w "); - } - if (time >= 86400) { - int days = (int) (time / 86400); - time -= days * 86400; - toreturn.append(days + "d "); - } - if (time >= 3600) { - int hours = (int) (time / 3600); - time -= hours * 3600; - toreturn.append(hours + "h "); - } - if (time >= 60) { - int minutes = (int) (time / 60); - time -= minutes * 60; - toreturn.append(minutes + "m "); - } - if (toreturn.equals("") || time > 0) { - toreturn.append((time) + "s "); - } - return toreturn.toString().trim(); - } - - public static long timeToSec(String string) { - if (MathMan.isInteger(string)) { - return Long.parseLong(string); - } - string = string.toLowerCase().trim().toLowerCase(); - if (string.equalsIgnoreCase("false")) { - return 0; - } - String[] split = string.split(" "); - long time = 0; - for (String value : split) { - int nums = Integer.parseInt(value.replaceAll("[^\\d]", "")); - String letters = value.replaceAll("[^a-z]", ""); - switch (letters) { - case "week": - case "weeks": - case "wks": - case "w": - - time += 604800 * nums; - case "days": - case "day": - case "d": - time += 86400 * nums; - case "hour": - case "hr": - case "hrs": - case "hours": - case "h": - time += 3600 * nums; - case "minutes": - case "minute": - case "mins": - case "min": - case "m": - time += 60 * nums; - case "seconds": - case "second": - case "secs": - case "sec": - case "s": - time += nums; - } - } - return time; - } - - /** - * Hashcode of a boolean array.
- * - Used for traversing mega plots quickly. - * - * @param array - * @return hashcode - */ - public static int hash(boolean[] array) { - if (array.length == 4) { - if (!array[0] && !array[1] && !array[2] && !array[3]) { - return 0; - } - return ((array[0] ? 1 : 0) << 3) + ((array[1] ? 1 : 0) << 2) + ((array[2] ? 1 : 0) << 1) - + (array[3] ? 1 : 0); - } - int n = 0; - for (boolean anArray : array) { - n = (n << 1) + (anArray ? 1 : 0); - } - return n; - } - - /** - * Get a list of plot ids within a selection. - * - * @param pos1 - * @param pos2 - * @return - */ - public static ArrayList getPlotSelectionIds(PlotId pos1, PlotId pos2) { - ArrayList myPlots = new ArrayList<>(); - for (int x = pos1.getX(); x <= pos2.getX(); x++) { - for (int y = pos1.getY(); y <= pos2.getY(); y++) { - myPlots.add(PlotId.of(x, y)); - } - } - return myPlots; - } - - /** - * Get the name from a UUID. - * - * @param owner Owner UUID - * @return The player's name, None, Everyone or Unknown - */ - @Nonnull public static String getName(@Nullable UUID owner) { - return getName(owner, true); - } - - /** - * Get the name from a UUID. - * - * @param owner Owner UUID - * @param blocking Whether or not the operation can be blocking - * @return The player's name, None, Everyone or Unknown - */ - @Nonnull public static String getName(@Nullable final UUID owner, final boolean blocking) { - if (owner == null) { - return Captions.NONE.getTranslated(); - } - if (owner.equals(DBFunc.EVERYONE)) { - return Captions.EVERYONE.getTranslated(); - } - if (owner.equals(DBFunc.SERVER)) { - return Captions.SERVER.getTranslated(); - } - final String name; - if (blocking) { - name = PlotSquared.get().getImpromptuUUIDPipeline().getSingle(owner, Settings.UUID.BLOCKING_TIMEOUT); - } else { - final UUIDMapping uuidMapping = PlotSquared.get().getImpromptuUUIDPipeline().getImmediately(owner); - if (uuidMapping != null) { - name = uuidMapping.getUsername(); - } else { - name = null; - } - } - if (name == null) { - return Captions.UNKNOWN.getTranslated(); - } - return name; - } - - public static boolean isServerOwned(Plot plot) { - return plot.getFlag(ServerPlotFlag.class); - } - - @Nonnull public static Location[] getCorners(@Nonnull final String world, @Nonnull final CuboidRegion region) { - final BlockVector3 min = region.getMinimumPoint(); - final BlockVector3 max = region.getMaximumPoint(); - return new Location[] {Location.at(world, min), Location.at(world, max)}; - } - - /** - * Get the corner locations for a list of regions. - * - * @param world - * @param regions - * @return - * @see Plot#getCorners() - */ - @Nonnull public static Location[] getCorners(String world, Collection regions) { - Location min = null; - Location max = null; - for (CuboidRegion region : regions) { - Location[] corners = getCorners(world, region); - if (min == null) { - min = corners[0]; - max = corners[1]; - continue; - } - Location pos1 = corners[0]; - Location pos2 = corners[1]; - if (pos2.getX() > max.getX()) { - max = max.withX(pos2.getX()); - } - if (pos1.getX() < min.getX()) { - min = min.withX(pos1.getX()); - } - if (pos2.getZ() > max.getZ()) { - max = max.withZ(pos2.getZ()); - } - if (pos1.getZ() < min.getZ()) { - min = min.withZ(pos1.getZ()); - } - } - return new Location[] {min, max}; - } - - /** - * Fuzzy plot search with spaces separating terms. - * - Terms: type, alias, world, owner, trusted, member - * - * @param search - * @return - */ - public static List getPlotsBySearch(String search) { - String[] split = search.split(" "); - int size = split.length * 2; - - List uuids = new ArrayList<>(); - PlotId id = null; - - for (String term : split) { - try { - UUID uuid = PlotSquared.get().getImpromptuUUIDPipeline().getSingle(term, Settings.UUID.BLOCKING_TIMEOUT); - if (uuid == null) { - uuid = UUID.fromString(term); - } - uuids.add(uuid); - } catch (Exception ignored) { - id = PlotId.fromString(term); - } - } - - ArrayList> plotList = - IntStream.range(0, size).mapToObj(i -> new ArrayList()) - .collect(Collectors.toCollection(() -> new ArrayList<>(size))); - - PlotArea area = null; - String alias = null; - for (Plot plot : PlotQuery.newQuery().allPlots()) { - int count = 0; - if (!uuids.isEmpty()) { - for (UUID uuid : uuids) { - if (plot.isOwner(uuid)) { - count += 2; - } else if (plot.isAdded(uuid)) { - count++; - } - } - } - if (id != null) { - if (plot.getId().equals(id)) { - count++; - } - } - if (area != null && plot.getArea().equals(area)) { - count++; - } - if (alias != null && alias.equals(plot.getAlias())) { - count += 2; - } - if (count != 0) { - plotList.get(count - 1).add(plot); - } - } - - List plots = new ArrayList<>(); - for (int i = plotList.size() - 1; i >= 0; i--) { - if (!plotList.get(i).isEmpty()) { - plots.addAll(plotList.get(i)); - } - } - return plots; - } - - /** - * Get the plot from a string. - * - * @param player Provides a context for what world to search in. Prefixing the term with 'world_name;' will override this context. - * @param arg The search term - * @param message If a message should be sent to the player if a plot cannot be found - * @return The plot if only 1 result is found, or null - */ - @Nullable public static Plot getPlotFromString(PlotPlayer player, String arg, boolean message) { - if (arg == null) { - if (player == null) { - if (message) { - logger.info("[P2] No plot area string was supplied"); - } - return null; - } - return player.getCurrentPlot(); - } - PlotArea area; - if (player != null) { - area = PlotSquared.get().getPlotAreaManager().getPlotAreaByString(arg); - if (area == null) { - area = player.getApplicablePlotArea(); - } - } else { - area = ConsolePlayer.getConsole().getApplicablePlotArea(); - } - String[] split = arg.split(";|,"); - PlotId id; - if (split.length == 4) { - area = PlotSquared.get().getPlotAreaManager().getPlotAreaByString(split[0] + ';' + split[1]); - id = PlotId.fromString(split[2] + ';' + split[3]); - } else if (split.length == 3) { - area = PlotSquared.get().getPlotAreaManager().getPlotAreaByString(split[0]); - id = PlotId.fromString(split[1] + ';' + split[2]); - } else if (split.length == 2) { - id = PlotId.fromString(arg); - } else { - Collection plots; - if (area == null) { - plots = PlotQuery.newQuery().allPlots().asList(); - } else { - plots = area.getPlots(); - } - for (Plot p : plots) { - String name = p.getAlias(); - if (!name.isEmpty() && name.equalsIgnoreCase(arg)) { - return p; - } - } - if (message) { - MainUtil.sendMessage(player, Captions.NOT_VALID_PLOT_ID); - } - return null; - } - if (area == null) { - if (message) { - MainUtil.sendMessage(player, Captions.NOT_VALID_PLOT_WORLD); - } - return null; - } - return area.getPlotAbs(id); - } - - public static File getFile(File base, String path) { - if (Paths.get(path).isAbsolute()) { - return new File(path); - } - return new File(base, path); - } - - /** - * Synchronously set the biome in a selection. - * - * @param world - * @param p1x - * @param p1z - * @param p2x - * @param p2z - * @param biome - */ - public static void setBiome(String world, int p1x, int p1z, int p2x, int p2z, BiomeType biome) { - BlockVector3 pos1 = BlockVector2.at(p1x, p1z).toBlockVector3(); - BlockVector3 pos2 = BlockVector2.at(p2x, p2z).toBlockVector3(Plot.MAX_HEIGHT - 1); - CuboidRegion region = new CuboidRegion(pos1, pos2); - PlotSquared.platform().getWorldUtil().setBiomes(world, region, biome); - } - - /** - * Get the highest block at a location. - */ - public static void getHighestBlock(String world, int x, int z, IntConsumer result) { - PlotSquared.platform().getWorldUtil().getHighestBlock(world, x, z, highest -> { - if (highest == 0) { - result.accept(63); - } else { - result.accept(highest); - } - }); - } - /** * Send a message to the player. * @@ -637,7 +97,7 @@ public class MainUtil { * @param message Message to send * @return true Can be used in things such as commands (return PlayerFunctions.sendMessage(...)) */ - public static boolean sendMessage(PlotPlayer player, String message) { + public static boolean sendMessage(PlotPlayer player, String message) { return sendMessage(player, message, true); } @@ -659,7 +119,7 @@ public class MainUtil { * @param prefix If the message should be prefixed with the configured prefix * @return */ - public static boolean sendMessage(PlotPlayer player, @Nonnull String msg, boolean prefix) { + public static boolean sendMessage(PlotPlayer player, @Nonnull String msg, boolean prefix) { if (!msg.isEmpty()) { if (player == null) { String message = CaptionUtility @@ -680,7 +140,7 @@ public class MainUtil { * @param caption the message to send * @return boolean success */ - public static boolean sendMessage(PlotPlayer player, Caption caption, String... args) { + public static boolean sendMessage(PlotPlayer player, Caption caption, String... args) { return sendMessage(player, caption, (Object[]) args); } @@ -691,7 +151,7 @@ public class MainUtil { * @param caption the message to send * @return boolean success */ - public static boolean sendMessage(final PlotPlayer player, final Caption caption, + public static boolean sendMessage(final PlotPlayer player, final Caption caption, final Object... args) { if (caption.getTranslated().isEmpty()) { return true; @@ -707,319 +167,4 @@ public class MainUtil { return true; } - /** - * If rating categories are enabled, get the average rating by category.
- * - The index corresponds to the index of the category in the config - * - * @param plot - * @return - */ - public static double[] getAverageRatings(Plot plot) { - Map rating; - if (plot.getSettings().getRatings() != null) { - rating = plot.getSettings().getRatings(); - } else if (Settings.Enabled_Components.RATING_CACHE) { - rating = new HashMap<>(); - } else { - rating = DBFunc.getRatings(plot); - } - int size = 1; - if (!Settings.Ratings.CATEGORIES.isEmpty()) { - size = Math.max(1, Settings.Ratings.CATEGORIES.size()); - } - double[] ratings = new double[size]; - if (rating == null || rating.isEmpty()) { - return ratings; - } - for (Entry entry : rating.entrySet()) { - int current = entry.getValue(); - if (Settings.Ratings.CATEGORIES.isEmpty()) { - ratings[0] += current; - } else { - for (int i = 0; i < Settings.Ratings.CATEGORIES.size(); i++) { - ratings[i] += current % 10 - 1; - current /= 10; - } - } - } - for (int i = 0; i < size; i++) { - ratings[i] /= rating.size(); - } - return ratings; - } - - public static void getUUIDsFromString(final String list, final BiConsumer, Throwable> consumer) { - String[] split = list.split(","); - - final Set result = new HashSet<>(); - final List request = new LinkedList<>(); - - for (final String name : split) { - if (name.isEmpty()) { - consumer.accept(Collections.emptySet(), null); - return; - } else if ("*".equals(name)) { - result.add(DBFunc.EVERYONE); - } else if (name.length() > 16) { - try { - result.add(UUID.fromString(name)); - } catch (IllegalArgumentException ignored) { - consumer.accept(Collections.emptySet(), null); - return; - } - } else { - request.add(name); - } - } - - if (request.isEmpty()) { - consumer.accept(result, null); - } else { - PlotSquared.get().getImpromptuUUIDPipeline().getUUIDs(request, Settings.UUID.NON_BLOCKING_TIMEOUT) - .whenComplete((uuids, throwable) -> { - if (throwable != null) { - consumer.accept(null, throwable); - } else { - for (final UUIDMapping uuid : uuids) { - result.add(uuid.getUuid()); - } - consumer.accept(result, null); - } - }); - } - } - - /** - * Format a string with plot information. - * - * @param iInfo - * @param plot - * @param player - * @param full - * @param whenDone - */ - public static void format(final String iInfo, final Plot plot, PlotPlayer player, - final boolean full, final RunnableVal whenDone) { - int num = plot.getConnectedPlots().size(); - String alias = !plot.getAlias().isEmpty() ? plot.getAlias() : Captions.NONE.getTranslated(); - Location bot = plot.getCorners()[0]; - PlotSquared.platform().getWorldUtil().getBiome(plot.getWorldName(), bot.getX(), bot.getZ(), biome -> { - String info = iInfo; - String trusted = getPlayerList(plot.getTrusted()); - String members = getPlayerList(plot.getMembers()); - String denied = getPlayerList(plot.getDenied()); - String seen; - if (Settings.Enabled_Components.PLOT_EXPIRY && ExpireManager.IMP != null) { - if (plot.isOnline()) { - seen = Captions.NOW.getTranslated(); - } else { - int time = (int) (ExpireManager.IMP.getAge(plot) / 1000); - if (time != 0) { - seen = MainUtil.secToTime(time); - } else { - seen = Captions.UNKNOWN.getTranslated(); - } - } - } else { - seen = Captions.NEVER.getTranslated(); - } - - String description = plot.getFlag(DescriptionFlag.class); - if (description.isEmpty()) { - description = Captions.PLOT_NO_DESCRIPTION.getTranslated(); - } - - StringBuilder flags = new StringBuilder(); - Collection> flagCollection = plot.getApplicableFlags(true); - if (flagCollection.isEmpty()) { - flags.append(Captions.NONE.getTranslated()); - } else { - String prefix = " "; - for (final PlotFlag flag : flagCollection) { - Object value; - if (flag instanceof DoubleFlag && !Settings.General.SCIENTIFIC) { - value = FLAG_DECIMAL_FORMAT.format(flag.getValue()); - } else { - value = flag.toString(); - } - flags.append(prefix).append(CaptionUtility - .format(player, Captions.PLOT_FLAG_LIST.getTranslated(), flag.getName(), - CaptionUtility.formatRaw(player, value.toString(), ""))); - prefix = ", "; - } - } - boolean build = plot.isAdded(player.getUUID()); - String owner = plot.getOwners().isEmpty() ? "unowned" : getPlayerList(plot.getOwners()); - if (plot.getArea() != null) { - info = info.replace("%area%", - plot.getArea().getWorldName() + (plot.getArea().getId() == null ? - "" : - "(" + plot.getArea().getId() + ")")); - } else { - info = info.replace("%area%", Captions.NONE.getTranslated()); - } - info = info.replace("%id%", plot.getId().toString()); - info = info.replace("%alias%", alias); - info = info.replace("%num%", String.valueOf(num)); - info = info.replace("%desc%", description); - info = info.replace("%biome%", biome.toString().toLowerCase()); - info = info.replace("%owner%", owner); - info = info.replace("%members%", members); - info = info.replace("%player%", player.getName()); - info = info.replace("%trusted%", trusted); - info = info.replace("%helpers%", members); - info = info.replace("%denied%", denied); - info = info.replace("%seen%", seen); - info = info.replace("%flags%", flags); - info = info.replace("%build%", String.valueOf(build)); - if (info.contains("%rating%")) { - final String newInfo = info; - TaskManager.runTaskAsync(() -> { - String info1; - if (Settings.Ratings.USE_LIKES) { - info1 = newInfo.replaceAll("%rating%", - String.format("%.0f%%", Like.getLikesPercentage(plot) * 100D)); - } else { - int max = 10; - if (Settings.Ratings.CATEGORIES != null && !Settings.Ratings.CATEGORIES - .isEmpty()) { - max = 8; - } - if (full && Settings.Ratings.CATEGORIES != null - && Settings.Ratings.CATEGORIES.size() > 1) { - double[] ratings = MainUtil.getAverageRatings(plot); - String rating = ""; - String prefix = ""; - for (int i = 0; i < ratings.length; i++) { - rating += prefix + Settings.Ratings.CATEGORIES.get(i) + '=' + String - .format("%.1f", ratings[i]); - prefix = ","; - } - info1 = newInfo.replaceAll("%rating%", rating); - } else { - info1 = newInfo.replaceAll("%rating%", - String.format("%.1f", plot.getAverageRating()) + '/' + max); - } - } - whenDone.run(info1); - }); - return; - } - whenDone.run(info); - }); - } - - public static boolean deleteDirectory(File directory) { - if (directory.exists()) { - File[] files = directory.listFiles(); - if (null != files) { - for (File file : files) { - if (file.isDirectory()) { - deleteDirectory(file); - } - } - } - } - return (directory.delete()); - } - - /* - @Nonnull public static String getName(UUID owner) { - if (owner == null) { - return Captions.NONE.getTranslated(); - } - if (owner.equals(DBFunc.EVERYONE)) { - return Captions.EVERYONE.getTranslated(); - } - if (owner.equals(DBFunc.SERVER)) { - return Captions.SERVER.getTranslated(); - } - String name = PlotSquared.get().getImpromptuUUIDPipeline().getSingle(owner, Settings.UUID.BLOCKING_TIMEOUT); - if (name == null) { - return Captions.UNKNOWN.getTranslated(); - } - return name; - } - */ - - /** - * Get a list of names given a list of UUIDs. - * - Uses the format {@link Captions#PLOT_USER_LIST} for the returned string - */ - public static String getPlayerList(final Collection uuids) { - if (uuids.size() < 1) { - return Captions.NONE.getTranslated(); - } - - final List players = new LinkedList<>(); - final List users = new LinkedList<>(); - for (final UUID uuid : uuids) { - if (uuid == null) { - users.add(Captions.NONE.getTranslated()); - } else if (DBFunc.EVERYONE.equals(uuid)) { - users.add(Captions.EVERYONE.getTranslated()); - } else if (DBFunc.SERVER.equals(uuid)) { - users.add(Captions.SERVER.getTranslated()); - } else { - players.add(uuid); - } - } - - try { - for (final UUIDMapping mapping : PlotSquared.get().getImpromptuUUIDPipeline().getNames(players).get(Settings.UUID.BLOCKING_TIMEOUT, - TimeUnit.MILLISECONDS)) { - users.add(mapping.getUsername()); - } - } catch (final Exception e) { - e.printStackTrace(); - } - - String c = Captions.PLOT_USER_LIST.getTranslated(); - StringBuilder list = new StringBuilder(); - for (int x = 0; x < users.size(); x++) { - if (x + 1 == uuids.size()) { - list.append(c.replace("%user%", users.get(x)).replace(",", "")); - } else { - list.append(c.replace("%user%", users.get(x))); - } - } - return list.toString(); - } - - public static void getPersistentMeta(UUID uuid, final String key, - final RunnableVal result) { - PlotPlayer player = PlotSquared.platform().getPlayerManager().getPlayerIfExists(uuid); - if (player != null) { - result.run(player.getPersistentMeta(key)); - } else { - DBFunc.getPersistentMeta(uuid, new RunnableVal>() { - @Override public void run(Map value) { - result.run(value.get(key)); - } - }); - } - } - - private static T getValueFromConfig(ConfigurationSection config, String path, - IntFunction> intParser, Function> textualParser, - Supplier defaultValue) { - String value = config.getString(path); - if (value == null) { - return defaultValue.get(); - } - if (MathMan.isInteger(value)) { - return intParser.apply(Integer.parseInt(value)).orElseGet(defaultValue); - } - return textualParser.apply(value).orElseGet(defaultValue); - } - - public static PlotAreaType getType(ConfigurationSection config) { - return getValueFromConfig(config, "generator.type", PlotAreaType::fromLegacyInt, - PlotAreaType::fromString, () -> PlotAreaType.NORMAL); - } - - public static PlotAreaTerrainType getTerrain(ConfigurationSection config) { - return getValueFromConfig(config, "generator.terrain", PlotAreaTerrainType::fromLegacyInt, - PlotAreaTerrainType::fromString, () -> PlotAreaTerrainType.NONE); - } } diff --git a/Core/src/main/java/com/plotsquared/core/util/PlayerManager.java b/Core/src/main/java/com/plotsquared/core/util/PlayerManager.java index 4cba66d9a..e316d6c19 100644 --- a/Core/src/main/java/com/plotsquared/core/util/PlayerManager.java +++ b/Core/src/main/java/com/plotsquared/core/util/PlayerManager.java @@ -25,8 +25,14 @@ */ package com.plotsquared.core.util; +import com.plotsquared.core.PlotSquared; +import com.plotsquared.core.configuration.Captions; +import com.plotsquared.core.configuration.Settings; +import com.plotsquared.core.database.DBFunc; import com.plotsquared.core.player.OfflinePlotPlayer; import com.plotsquared.core.player.PlotPlayer; +import com.plotsquared.core.uuid.UUIDMapping; + import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -34,8 +40,14 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; import java.util.Map; +import java.util.Set; import java.util.UUID; +import java.util.concurrent.TimeUnit; +import java.util.function.BiConsumer; /** * Manages player instances @@ -45,6 +57,142 @@ public abstract class PlayerManager

, T> { private final Map playerMap = new HashMap<>(); private final Object playerLock = new Object(); + public static void getUUIDsFromString(@Nonnull final String list, + @Nonnull final BiConsumer, Throwable> consumer) { + String[] split = list.split(","); + + final Set result = new HashSet<>(); + final List request = new LinkedList<>(); + + for (final String name : split) { + if (name.isEmpty()) { + consumer.accept(Collections.emptySet(), null); + return; + } else if ("*".equals(name)) { + result.add(DBFunc.EVERYONE); + } else if (name.length() > 16) { + try { + result.add(UUID.fromString(name)); + } catch (IllegalArgumentException ignored) { + consumer.accept(Collections.emptySet(), null); + return; + } + } else { + request.add(name); + } + } + + if (request.isEmpty()) { + consumer.accept(result, null); + } else { + PlotSquared.get().getImpromptuUUIDPipeline() + .getUUIDs(request, Settings.UUID.NON_BLOCKING_TIMEOUT) + .whenComplete((uuids, throwable) -> { + if (throwable != null) { + consumer.accept(null, throwable); + } else { + for (final UUIDMapping uuid : uuids) { + result.add(uuid.getUuid()); + } + consumer.accept(result, null); + } + }); + } + } + + /** + * Get a list of names given a list of UUIDs. + * - Uses the format {@link Captions#PLOT_USER_LIST} for the returned string + * + * @param uuids UUIDs + * @return Name list + */ + @Nonnull public static String getPlayerList(@Nonnull final Collection uuids) { + if (uuids.size() < 1) { + return Captions.NONE.getTranslated(); + } + + final List players = new LinkedList<>(); + final List users = new LinkedList<>(); + for (final UUID uuid : uuids) { + if (uuid == null) { + users.add(Captions.NONE.getTranslated()); + } else if (DBFunc.EVERYONE.equals(uuid)) { + users.add(Captions.EVERYONE.getTranslated()); + } else if (DBFunc.SERVER.equals(uuid)) { + users.add(Captions.SERVER.getTranslated()); + } else { + players.add(uuid); + } + } + + try { + for (final UUIDMapping mapping : PlotSquared.get().getImpromptuUUIDPipeline() + .getNames(players).get(Settings.UUID.BLOCKING_TIMEOUT, TimeUnit.MILLISECONDS)) { + users.add(mapping.getUsername()); + } + } catch (final Exception e) { + e.printStackTrace(); + } + + String c = Captions.PLOT_USER_LIST.getTranslated(); + StringBuilder list = new StringBuilder(); + for (int x = 0; x < users.size(); x++) { + if (x + 1 == uuids.size()) { + list.append(c.replace("%user%", users.get(x)).replace(",", "")); + } else { + list.append(c.replace("%user%", users.get(x))); + } + } + return list.toString(); + } + + /** + * Get the name from a UUID. + * + * @param owner Owner UUID + * @return The player's name, None, Everyone or Unknown + */ + @Nonnull public static String getName(@Nullable final UUID owner) { + return getName(owner, true); + } + + /** + * Get the name from a UUID. + * + * @param owner Owner UUID + * @param blocking Whether or not the operation can be blocking + * @return The player's name, None, Everyone or Unknown + */ + @Nonnull public static String getName(@Nullable final UUID owner, final boolean blocking) { + if (owner == null) { + return Captions.NONE.getTranslated(); + } + if (owner.equals(DBFunc.EVERYONE)) { + return Captions.EVERYONE.getTranslated(); + } + if (owner.equals(DBFunc.SERVER)) { + return Captions.SERVER.getTranslated(); + } + final String name; + if (blocking) { + name = PlotSquared.get().getImpromptuUUIDPipeline() + .getSingle(owner, Settings.UUID.BLOCKING_TIMEOUT); + } else { + final UUIDMapping uuidMapping = + PlotSquared.get().getImpromptuUUIDPipeline().getImmediately(owner); + if (uuidMapping != null) { + name = uuidMapping.getUsername(); + } else { + name = null; + } + } + if (name == null) { + return Captions.UNKNOWN.getTranslated(); + } + return name; + } + /** * Remove a player from the player map * diff --git a/Core/src/main/java/com/plotsquared/core/util/RegionUtil.java b/Core/src/main/java/com/plotsquared/core/util/RegionUtil.java index ffce29963..4b11eb5f6 100644 --- a/Core/src/main/java/com/plotsquared/core/util/RegionUtil.java +++ b/Core/src/main/java/com/plotsquared/core/util/RegionUtil.java @@ -25,6 +25,7 @@ */ package com.plotsquared.core.util; +import com.plotsquared.core.location.Location; import com.plotsquared.core.plot.Plot; import com.sk89q.worldedit.math.BlockVector2; import com.sk89q.worldedit.math.BlockVector3; @@ -32,8 +33,45 @@ import com.sk89q.worldedit.regions.CuboidRegion; import javax.annotation.Nonnull; import java.awt.geom.Rectangle2D; +import java.util.Collection; public class RegionUtil { + + @Nonnull public static Location[] getCorners(@Nonnull final String world, + @Nonnull final CuboidRegion region) { + final BlockVector3 min = region.getMinimumPoint(); + final BlockVector3 max = region.getMaximumPoint(); + return new Location[] {Location.at(world, min), Location.at(world, max)}; + } + + @Nonnull public static Location[] getCorners(String world, Collection regions) { + Location min = null; + Location max = null; + for (CuboidRegion region : regions) { + Location[] corners = getCorners(world, region); + if (min == null) { + min = corners[0]; + max = corners[1]; + continue; + } + Location pos1 = corners[0]; + Location pos2 = corners[1]; + if (pos2.getX() > max.getX()) { + max = max.withX(pos2.getX()); + } + if (pos1.getX() < min.getX()) { + min = min.withX(pos1.getX()); + } + if (pos2.getZ() > max.getZ()) { + max = max.withZ(pos2.getZ()); + } + if (pos1.getZ() < min.getZ()) { + min = min.withZ(pos1.getZ()); + } + } + return new Location[] {min, max}; + } + public static CuboidRegion createRegion(int pos1x, int pos2x, int pos1z, int pos2z) { return createRegion(pos1x, pos2x, 0, Plot.MAX_HEIGHT - 1, pos1z, pos2z); } diff --git a/Core/src/main/java/com/plotsquared/core/util/SchematicHandler.java b/Core/src/main/java/com/plotsquared/core/util/SchematicHandler.java index 83ac22219..09aebcd84 100644 --- a/Core/src/main/java/com/plotsquared/core/util/SchematicHandler.java +++ b/Core/src/main/java/com/plotsquared/core/util/SchematicHandler.java @@ -33,6 +33,7 @@ import com.plotsquared.core.plot.Plot; import com.plotsquared.core.plot.PlotArea; import com.plotsquared.core.plot.schematic.Schematic; import com.plotsquared.core.queue.LocalBlockQueue; +import com.plotsquared.core.util.net.AbstractDelegateOutputStream; import com.plotsquared.core.util.task.RunnableVal; import com.plotsquared.core.util.task.TaskManager; import com.plotsquared.core.util.task.TaskTime; @@ -59,12 +60,13 @@ import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.regions.CuboidRegion; import com.sk89q.worldedit.world.biome.BiomeType; import com.sk89q.worldedit.world.block.BaseBlock; -import javax.annotation.Nonnull; import org.json.JSONArray; import org.json.JSONException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; import java.io.BufferedReader; import java.io.ByteArrayOutputStream; import java.io.File; @@ -75,10 +77,15 @@ import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.net.HttpURLConnection; +import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; import java.nio.channels.Channels; import java.nio.channels.ReadableByteChannel; +import java.nio.charset.StandardCharsets; import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Arrays; @@ -88,6 +95,7 @@ import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Scanner; import java.util.Set; import java.util.UUID; import java.util.stream.Collectors; @@ -108,6 +116,84 @@ public abstract class SchematicHandler { this.worldUtil = worldUtil; } + public static void upload(@Nullable UUID uuid, @Nullable final String file, + @Nonnull final String extension, @Nullable final RunnableVal writeTask, + @Nonnull final RunnableVal whenDone) { + if (writeTask == null) { + TaskManager.runTask(whenDone); + return; + } + final String filename; + final String website; + if (uuid == null) { + uuid = UUID.randomUUID(); + website = Settings.Web.URL + "upload.php?" + uuid; + filename = "plot." + extension; + } else { + website = Settings.Web.URL + "save.php?" + uuid; + filename = file + '.' + extension; + } + final URL url; + try { + url = new URL(Settings.Web.URL + "?key=" + uuid + "&type=" + extension); + } catch (MalformedURLException e) { + e.printStackTrace(); + whenDone.run(); + return; + } + TaskManager.runTaskAsync(() -> { + try { + String boundary = Long.toHexString(System.currentTimeMillis()); + URLConnection con = new URL(website).openConnection(); + con.setDoOutput(true); + con.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary); + try (OutputStream output = con.getOutputStream(); + PrintWriter writer = new PrintWriter( + new OutputStreamWriter(output, StandardCharsets.UTF_8), true)) { + String CRLF = "\r\n"; + writer.append("--" + boundary).append(CRLF); + writer.append("Content-Disposition: form-data; name=\"param\"").append(CRLF); + writer.append( + "Content-Type: text/plain; charset=" + StandardCharsets.UTF_8.displayName()) + .append(CRLF); + String param = "value"; + writer.append(CRLF).append(param).append(CRLF).flush(); + writer.append("--" + boundary).append(CRLF); + writer.append( + "Content-Disposition: form-data; name=\"schematicFile\"; filename=\"" + + filename + '"').append(CRLF); + writer + .append("Content-Type: " + URLConnection.guessContentTypeFromName(filename)) + .append(CRLF); + writer.append("Content-Transfer-Encoding: binary").append(CRLF); + writer.append(CRLF).flush(); + writeTask.value = new AbstractDelegateOutputStream(output) { + @Override public void close() { + } // Don't close + }; + writeTask.run(); + output.flush(); + writer.append(CRLF).flush(); + writer.append("--" + boundary + "--").append(CRLF).flush(); + } + String content; + try (Scanner scanner = new Scanner(con.getInputStream()).useDelimiter("\\A")) { + content = scanner.next().trim(); + } + if (!content.startsWith("<")) { + } + int responseCode = ((HttpURLConnection) con).getResponseCode(); + if (responseCode == 200) { + whenDone.value = url; + } + TaskManager.runTask(whenDone); + } catch (IOException e) { + e.printStackTrace(); + TaskManager.runTask(whenDone); + } + }); + } + public boolean exportAll(Collection collection, final File outputDir, final String namingScheme, final Runnable ifSuccess) { if (this.exportAll) { @@ -312,7 +398,7 @@ public abstract class SchematicHandler { */ public Schematic getSchematic(String name) throws UnsupportedFormatException { File parent = - MainUtil.getFile(PlotSquared.platform().getDirectory(), Settings.Paths.SCHEMATICS); + FileUtils.getFile(PlotSquared.platform().getDirectory(), Settings.Paths.SCHEMATICS); if (!parent.exists()) { if (!parent.mkdir()) { throw new RuntimeException("Could not create schematic parent directory"); @@ -321,10 +407,10 @@ public abstract class SchematicHandler { if (!name.endsWith(".schem") && !name.endsWith(".schematic")) { name = name + ".schem"; } - File file = MainUtil.getFile(PlotSquared.platform().getDirectory(), + File file = FileUtils.getFile(PlotSquared.platform().getDirectory(), Settings.Paths.SCHEMATICS + File.separator + name); if (!file.exists()) { - file = MainUtil.getFile(PlotSquared.platform().getDirectory(), + file = FileUtils.getFile(PlotSquared.platform().getDirectory(), Settings.Paths.SCHEMATICS + File.separator + name); } return getSchematic(file); @@ -337,7 +423,7 @@ public abstract class SchematicHandler { */ public Collection getSchematicNames() { final File parent = - MainUtil.getFile(PlotSquared.platform().getDirectory(), Settings.Paths.SCHEMATICS); + FileUtils.getFile(PlotSquared.platform().getDirectory(), Settings.Paths.SCHEMATICS); final List names = new ArrayList<>(); if (parent.exists()) { final String[] rawNames = @@ -436,7 +522,7 @@ public abstract class SchematicHandler { TaskManager.runTask(whenDone); return; } - MainUtil.upload(uuid, file, "schem", new RunnableVal() { + upload(uuid, file, "schem", new RunnableVal() { @Override public void run(OutputStream output) { try (NBTOutputStream nos = new NBTOutputStream( new GZIPOutputStream(output, true))) { @@ -460,7 +546,7 @@ public abstract class SchematicHandler { return false; } try { - File tmp = MainUtil.getFile(PlotSquared.platform().getDirectory(), path); + File tmp = FileUtils.getFile(PlotSquared.platform().getDirectory(), path); tmp.getParentFile().mkdirs(); try (NBTOutputStream nbtStream = new NBTOutputStream( new GZIPOutputStream(new FileOutputStream(tmp)))) { @@ -480,7 +566,7 @@ public abstract class SchematicHandler { // async TaskManager.runTaskAsync(() -> { // Main positions - Location[] corners = MainUtil.getCorners(world, regions); + Location[] corners = RegionUtil.getCorners(world, regions); final Location bot = corners[0]; final Location top = corners[1]; diff --git a/Core/src/main/java/com/plotsquared/core/util/TimeUtil.java b/Core/src/main/java/com/plotsquared/core/util/TimeUtil.java new file mode 100644 index 000000000..61b18653c --- /dev/null +++ b/Core/src/main/java/com/plotsquared/core/util/TimeUtil.java @@ -0,0 +1,129 @@ +/* + * _____ _ _ _____ _ + * | __ \| | | | / ____| | | + * | |__) | | ___ | |_| (___ __ _ _ _ __ _ _ __ ___ __| | + * | ___/| |/ _ \| __|\___ \ / _` | | | |/ _` | '__/ _ \/ _` | + * | | | | (_) | |_ ____) | (_| | |_| | (_| | | | __/ (_| | + * |_| |_|\___/ \__|_____/ \__, |\__,_|\__,_|_| \___|\__,_| + * | | + * |_| + * PlotSquared plot management system for Minecraft + * Copyright (C) 2020 IntellectualSites + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.plotsquared.core.util; + +import javax.annotation.Nonnegative; +import javax.annotation.Nonnull; + +public final class TimeUtil { + + private TimeUtil() { + } + + /** + * Format seconds into a string with the format + * #y #w #d #h #s + * + * @param time Time to format + * @return Formatted string + */ + @Nonnull public static String secToTime(@Nonnegative long time) { + StringBuilder toReturn = new StringBuilder(); + if (time >= 33868800) { + int years = (int) (time / 33868800); + time -= years * 33868800; + toReturn.append(years).append("y "); + } + if (time >= 604800) { + int weeks = (int) (time / 604800); + time -= weeks * 604800; + toReturn.append(weeks).append("w "); + } + if (time >= 86400) { + int days = (int) (time / 86400); + time -= days * 86400; + toReturn.append(days).append("d "); + } + if (time >= 3600) { + int hours = (int) (time / 3600); + time -= hours * 3600; + toReturn.append(hours).append("h "); + } + if (time >= 60) { + int minutes = (int) (time / 60); + time -= minutes * 60; + toReturn.append(minutes).append("m "); + } + if (toReturn.length() == 0 || time > 0) { + toReturn.append(time).append("s "); + } + return toReturn.toString().trim(); + } + + /** + * Parse a time string back into time + * + * @param string String to parse + * @return Parsed time + */ + @Nonnegative public static long timeToSec(@Nonnull String string) { + if (MathMan.isInteger(string)) { + return Long.parseLong(string); + } + string = string.toLowerCase().trim().toLowerCase(); + if (string.equalsIgnoreCase("false")) { + return 0; + } + final String[] split = string.split(" "); + long time = 0; + for (final String value : split) { + final int numbers = Integer.parseInt(value.replaceAll("[^\\d]", "")); + String letters = value.replaceAll("[^a-z]", ""); + switch (letters) { + case "week": + case "weeks": + case "wks": + case "w": + + time += 604800 * numbers; + case "days": + case "day": + case "d": + time += 86400 * numbers; + case "hour": + case "hr": + case "hrs": + case "hours": + case "h": + time += 3600 * numbers; + case "minutes": + case "minute": + case "mins": + case "min": + case "m": + time += 60 * numbers; + case "seconds": + case "second": + case "secs": + case "sec": + case "s": + time += numbers; + } + } + return time; + } + +} diff --git a/Core/src/main/java/com/plotsquared/core/util/WorldUtil.java b/Core/src/main/java/com/plotsquared/core/util/WorldUtil.java index c8c7a6662..81d5e2f11 100644 --- a/Core/src/main/java/com/plotsquared/core/util/WorldUtil.java +++ b/Core/src/main/java/com/plotsquared/core/util/WorldUtil.java @@ -36,6 +36,7 @@ import com.sk89q.jnbt.NBTInputStream; import com.sk89q.jnbt.NBTOutputStream; import com.sk89q.jnbt.Tag; import com.sk89q.worldedit.math.BlockVector2; +import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.regions.CuboidRegion; import com.sk89q.worldedit.world.biome.BiomeType; import com.sk89q.worldedit.world.block.BlockState; @@ -70,6 +71,23 @@ public abstract class WorldUtil { this.regionManager = regionManager; } + /** + * Set the biome in a region + * + * @param world World name + * @param p1x Min X + * @param p1z Min Z + * @param p2x Max X + * @param p2z Max Z + * @param biome Biome + */ + public static void setBiome(String world, int p1x, int p1z, int p2x, int p2z, BiomeType biome) { + BlockVector3 pos1 = BlockVector2.at(p1x, p1z).toBlockVector3(); + BlockVector3 pos2 = BlockVector2.at(p2x, p2z).toBlockVector3(Plot.MAX_HEIGHT - 1); + CuboidRegion region = new CuboidRegion(pos1, pos2); + PlotSquared.platform().getWorldUtil().setBiomes(world, region, biome); + } + /** * Check if a given world name corresponds to a real world * @@ -213,7 +231,7 @@ public abstract class WorldUtil { public void upload(@Nonnull final Plot plot, @Nullable final UUID uuid, @Nullable final String file, @Nonnull final RunnableVal whenDone) { - plot.getHome(home -> MainUtil.upload(uuid, file, "zip", new RunnableVal() { + plot.getHome(home -> SchematicHandler.upload(uuid, file, "zip", new RunnableVal() { @Override public void run(OutputStream output) { try (final ZipOutputStream zos = new ZipOutputStream(output)) { File dat = getDat(plot.getWorldName()); diff --git a/Core/src/main/java/com/plotsquared/core/util/query/SearchPlotProvider.java b/Core/src/main/java/com/plotsquared/core/util/query/SearchPlotProvider.java index f838dc807..8678a8734 100644 --- a/Core/src/main/java/com/plotsquared/core/util/query/SearchPlotProvider.java +++ b/Core/src/main/java/com/plotsquared/core/util/query/SearchPlotProvider.java @@ -25,11 +25,19 @@ */ package com.plotsquared.core.util.query; +import com.plotsquared.core.PlotSquared; +import com.plotsquared.core.configuration.Settings; import com.plotsquared.core.plot.Plot; -import com.plotsquared.core.util.MainUtil; -import javax.annotation.Nonnull; +import com.plotsquared.core.plot.PlotArea; +import com.plotsquared.core.plot.PlotId; +import javax.annotation.Nonnull; +import java.util.ArrayList; import java.util.Collection; +import java.util.List; +import java.util.UUID; +import java.util.stream.Collectors; +import java.util.stream.IntStream; class SearchPlotProvider implements PlotProvider { @@ -40,7 +48,76 @@ class SearchPlotProvider implements PlotProvider { } @Override public Collection getPlots() { - return MainUtil.getPlotsBySearch(this.searchTerm); + return getPlotsBySearch(this.searchTerm); + } + + /** + * Fuzzy plot search with spaces separating terms. + * - Terms: type, alias, world, owner, trusted, member + * + * @param search Search string + * @return Search results + */ + @Nonnull private static List getPlotsBySearch(@Nonnull final String search) { + String[] split = search.split(" "); + int size = split.length * 2; + + List uuids = new ArrayList<>(); + PlotId id = null; + + for (String term : split) { + try { + UUID uuid = PlotSquared.get().getImpromptuUUIDPipeline() + .getSingle(term, Settings.UUID.BLOCKING_TIMEOUT); + if (uuid == null) { + uuid = UUID.fromString(term); + } + uuids.add(uuid); + } catch (Exception ignored) { + id = PlotId.fromString(term); + } + } + + ArrayList> plotList = + IntStream.range(0, size).mapToObj(i -> new ArrayList()) + .collect(Collectors.toCollection(() -> new ArrayList<>(size))); + + PlotArea area = null; + String alias = null; + for (Plot plot : PlotQuery.newQuery().allPlots()) { + int count = 0; + if (!uuids.isEmpty()) { + for (UUID uuid : uuids) { + if (plot.isOwner(uuid)) { + count += 2; + } else if (plot.isAdded(uuid)) { + count++; + } + } + } + if (id != null) { + if (plot.getId().equals(id)) { + count++; + } + } + if (area != null && plot.getArea().equals(area)) { + count++; + } + if (alias != null && alias.equals(plot.getAlias())) { + count += 2; + } + if (count != 0) { + plotList.get(count - 1).add(plot); + } + } + + List plots = new ArrayList<>(); + for (int i = plotList.size() - 1; i >= 0; i--) { + if (!plotList.get(i).isEmpty()) { + plots.addAll(plotList.get(i)); + } + } + return plots; } } From 23783b8b0b2aa4e088d7471b00c9e70d54c2cbd3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20S=C3=B6derberg?= Date: Sun, 19 Jul 2020 14:24:42 +0200 Subject: [PATCH 5/5] add deprecations --- .../java/com/plotsquared/core/util/MainUtil.java | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/Core/src/main/java/com/plotsquared/core/util/MainUtil.java b/Core/src/main/java/com/plotsquared/core/util/MainUtil.java index e81b54e6e..010622813 100644 --- a/Core/src/main/java/com/plotsquared/core/util/MainUtil.java +++ b/Core/src/main/java/com/plotsquared/core/util/MainUtil.java @@ -37,8 +37,9 @@ import javax.annotation.Nonnull; /** * plot functions + * @deprecated Do not use */ -public class MainUtil { +@Deprecated public class MainUtil { private static final Logger logger = LoggerFactory.getLogger("P2/" + MainUtil.class.getSimpleName()); @@ -97,7 +98,7 @@ public class MainUtil { * @param message Message to send * @return true Can be used in things such as commands (return PlayerFunctions.sendMessage(...)) */ - public static boolean sendMessage(PlotPlayer player, String message) { + @Deprecated public static boolean sendMessage(PlotPlayer player, String message) { return sendMessage(player, message, true); } @@ -107,7 +108,7 @@ public class MainUtil { * @param caption * @param args */ - public static void sendConsoleMessage(Captions caption, String... args) { + @Deprecated public static void sendConsoleMessage(Captions caption, String... args) { sendMessage(null, caption, args); } @@ -119,7 +120,7 @@ public class MainUtil { * @param prefix If the message should be prefixed with the configured prefix * @return */ - public static boolean sendMessage(PlotPlayer player, @Nonnull String msg, boolean prefix) { + @Deprecated public static boolean sendMessage(PlotPlayer player, @Nonnull String msg, boolean prefix) { if (!msg.isEmpty()) { if (player == null) { String message = CaptionUtility @@ -140,7 +141,7 @@ public class MainUtil { * @param caption the message to send * @return boolean success */ - public static boolean sendMessage(PlotPlayer player, Caption caption, String... args) { + @Deprecated public static boolean sendMessage(PlotPlayer player, Caption caption, String... args) { return sendMessage(player, caption, (Object[]) args); } @@ -151,7 +152,7 @@ public class MainUtil { * @param caption the message to send * @return boolean success */ - public static boolean sendMessage(final PlotPlayer player, final Caption caption, + @Deprecated public static boolean sendMessage(final PlotPlayer player, final Caption caption, final Object... args) { if (caption.getTranslated().isEmpty()) { return true;