From 411a74eefa3454f50db328aff950c32db807a714 Mon Sep 17 00:00:00 2001 From: Jesse Boyd Date: Wed, 17 Feb 2016 23:38:36 +1100 Subject: [PATCH] Fix compatibility with old type 2 plotworld cluster data --- .../com/intellectualcrafters/plot/PS.java | 47 ++++++++++++++-- .../plot/commands/Clear.java | 2 +- .../plot/database/AbstractDB.java | 2 + .../plot/database/DBFunc.java | 4 ++ .../plot/database/SQLManager.java | 56 +++++++++++++++++++ .../plot/object/PlotArea.java | 45 ++++++--------- 6 files changed, 123 insertions(+), 33 deletions(-) diff --git a/src/main/java/com/intellectualcrafters/plot/PS.java b/src/main/java/com/intellectualcrafters/plot/PS.java index 51b9185a2..f58b74d1e 100644 --- a/src/main/java/com/intellectualcrafters/plot/PS.java +++ b/src/main/java/com/intellectualcrafters/plot/PS.java @@ -14,6 +14,7 @@ import java.net.URLConnection; import java.nio.file.Files; import java.sql.Connection; import java.sql.SQLException; +import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -21,6 +22,7 @@ import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; +import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -617,7 +619,22 @@ public class PS { */ public void addPlotArea(final PlotArea plotarea) { HashMap plots = plots_tmp.remove(plotarea.toString()); - if (plots != null) { + if (plots == null) { + if (plotarea.TYPE == 2) { + plots = plots_tmp.get(plotarea.worldname); + if (plots != null) { + Iterator> iter = plots.entrySet().iterator(); + while (iter.hasNext()) { + Entry next = iter.next(); + PlotId id = next.getKey(); + if (plotarea.contains(id)) { + next.getValue().setArea(plotarea); + iter.remove(); + } + } + } + } + } else { for (Entry entry : plots.entrySet()) { Plot plot = entry.getValue(); plot.setArea(plotarea); @@ -625,7 +642,21 @@ public class PS { } if (Settings.ENABLE_CLUSTERS) { Set clusters = clusters_tmp.remove(plotarea.toString()); - if (clusters != null) { + if (clusters == null) { + if (plotarea.TYPE == 2) { + clusters = clusters_tmp.get(plotarea.worldname); + if (clusters != null) { + Iterator iter = clusters.iterator(); + while (iter.hasNext()) { + PlotCluster next = iter.next(); + if (next.intersects(plotarea.getMin(), plotarea.getMax())) { + next.setArea(plotarea); + iter.remove(); + } + } + } + } + } else { for (PlotCluster cluster : clusters) { cluster.setArea(plotarea); } @@ -1442,17 +1473,21 @@ public class PS { if (clusters == null) { throw new IllegalArgumentException("No cluster exists for world: " + world); } + ArrayDeque toLoad = new ArrayDeque<>(); for (PlotCluster cluster : clusters) { PlotId pos1 = cluster.getP1(); // Cluster pos1 PlotId pos2 = cluster.getP2(); // Cluster pos2 String name = cluster.getName(); // Cluster name + String fullId = name + "-" + pos1 + "-" + pos2; + worldSection.createSection("areas." + fullId); + DBFunc.replaceWorld(world, world + ";" + name, pos1, pos2); // NPE + log(C.PREFIX.s() + "&3 - " + name + "-" + pos1 + "-" + pos2); GeneratorWrapper areaGen = IMP.getGenerator(world, gen_string); if (areaGen == null) { throw new IllegalArgumentException("Invalid Generator: " + gen_string); } PlotArea pa = areaGen.getPlotGenerator().getNewPlotArea(world, name, pos1, pos2); - pa.setCompatibility("3.2.X"); pa.saveConfiguration(worldSection); pa.loadDefaultConfiguration(worldSection); try { @@ -1463,9 +1498,13 @@ public class PS { log(C.PREFIX.s() + "&c | &9generator: &7" + baseGenerator + ">" + areaGen); log(C.PREFIX.s() + "&c | &9plotworld: &7" + pa); log(C.PREFIX.s() + "&c | &9manager: &7" + pa); + log(C.PREFIX.s() + "&cNote: &7Area created for cluster:" + name + " (invalid or old configuration?)"); areaGen.getPlotGenerator().initialize(pa); areaGen.augment(pa); - addPlotArea(pa); + toLoad.add(pa); + } + for (PlotArea area : toLoad) { + addPlotArea(area); } return; } diff --git a/src/main/java/com/intellectualcrafters/plot/commands/Clear.java b/src/main/java/com/intellectualcrafters/plot/commands/Clear.java index b8a3e4336..de7960a52 100644 --- a/src/main/java/com/intellectualcrafters/plot/commands/Clear.java +++ b/src/main/java/com/intellectualcrafters/plot/commands/Clear.java @@ -36,7 +36,7 @@ import com.intellectualcrafters.plot.util.TaskManager; import com.plotsquared.general.commands.CommandDeclaration; @CommandDeclaration(command = "clear", description = "Clear a plot", permission = "plots.clear", category = CommandCategory.APPEARANCE, - usage = "/plot clear [id]") + usage = "/plot clear [id]", aliases = "reset") public class Clear extends SubCommand { @Override diff --git a/src/main/java/com/intellectualcrafters/plot/database/AbstractDB.java b/src/main/java/com/intellectualcrafters/plot/database/AbstractDB.java index 8c9fc9d29..0b9bf3551 100644 --- a/src/main/java/com/intellectualcrafters/plot/database/AbstractDB.java +++ b/src/main/java/com/intellectualcrafters/plot/database/AbstractDB.java @@ -352,4 +352,6 @@ public interface AbstractDB { boolean deleteTables(); void close(); + + void replaceWorld(String oldWorld, String newWorld, PlotId min, PlotId max); } diff --git a/src/main/java/com/intellectualcrafters/plot/database/DBFunc.java b/src/main/java/com/intellectualcrafters/plot/database/DBFunc.java index 72b28fef8..5b686b63e 100644 --- a/src/main/java/com/intellectualcrafters/plot/database/DBFunc.java +++ b/src/main/java/com/intellectualcrafters/plot/database/DBFunc.java @@ -474,6 +474,10 @@ public class DBFunc { dbManager.setPosition(cluster, position); } + public static void replaceWorld(String oldWorld, String newWorld, PlotId min, PlotId max) { + dbManager.replaceWorld(oldWorld, newWorld, min, max); + } + /** * Replace all occurrences of a uuid in the database with another one * @param old diff --git a/src/main/java/com/intellectualcrafters/plot/database/SQLManager.java b/src/main/java/com/intellectualcrafters/plot/database/SQLManager.java index 3a2554174..d6adfc034 100644 --- a/src/main/java/com/intellectualcrafters/plot/database/SQLManager.java +++ b/src/main/java/com/intellectualcrafters/plot/database/SQLManager.java @@ -3030,6 +3030,62 @@ public class SQLManager implements AbstractDB { commit(); } + @Override + public void replaceWorld(final String oldWorld, final String newWorld, final PlotId min, final PlotId max) { + addGlobalTask(new Runnable() { + @Override + public void run() { + if (min == null) { + try (PreparedStatement stmt = connection.prepareStatement("UPDATE `" + prefix + "plot` SET `world` = ? WHERE `world` = ?")) { + stmt.setString(1, newWorld); + stmt.setString(2, oldWorld); + stmt.executeUpdate(); + stmt.close(); + } catch (SQLException e) { + e.printStackTrace(); + } + try (PreparedStatement stmt = connection.prepareStatement("UPDATE `" + prefix + "cluster` SET `world` = ? WHERE `world` = ?")) { + stmt.setString(1, newWorld); + stmt.setString(2, oldWorld); + stmt.executeUpdate(); + stmt.close(); + } catch (SQLException e) { + e.printStackTrace(); + } + } else { + try (PreparedStatement stmt = connection.prepareStatement("UPDATE `" + + prefix + + "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.executeUpdate(); + stmt.close(); + } catch (SQLException e) { + e.printStackTrace(); + } + try (PreparedStatement stmt = connection.prepareStatement("UPDATE `" + + prefix + + "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.executeUpdate(); + stmt.close(); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + }); + } + @Override public void replaceUUID(final UUID old, final UUID now) { addGlobalTask(new Runnable() { diff --git a/src/main/java/com/intellectualcrafters/plot/object/PlotArea.java b/src/main/java/com/intellectualcrafters/plot/object/PlotArea.java index 2be6df560..9f1e182e2 100644 --- a/src/main/java/com/intellectualcrafters/plot/object/PlotArea.java +++ b/src/main/java/com/intellectualcrafters/plot/object/PlotArea.java @@ -20,6 +20,18 @@ //////////////////////////////////////////////////////////////////////////////////////////////////// package com.intellectualcrafters.plot.object; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; + import com.intellectualcrafters.configuration.ConfigurationSection; import com.intellectualcrafters.plot.PS; import com.intellectualcrafters.plot.config.C; @@ -38,18 +50,6 @@ import com.intellectualcrafters.plot.util.StringMan; import com.intellectualcrafters.plot.util.WorldUtil; import com.intellectualcrafters.plot.util.area.QuadMap; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; -import java.util.UUID; -import java.util.concurrent.ConcurrentHashMap; - /** * @author Jesse Boyd */ @@ -91,11 +91,6 @@ public abstract class PlotArea { public PlotGamemode GAMEMODE = PlotGamemode.CREATIVE; int hash; private RegionWrapper region; - /** - * Please ignore - */ - @Deprecated - private int compatibility_id; private ConcurrentHashMap meta; private QuadMap clusters; @@ -188,16 +183,6 @@ public abstract class PlotArea { return clusters == null ? new HashSet() : clusters.getAll(); } - public void setCompatibility(String version) { - switch (version) { - case "3.2.X": - compatibility_id = 1; - break; - default: - throw new IllegalArgumentException("Not valid version"); - } - } - public boolean isCompatible(PlotArea plotarea) { final ConfigurationSection section = PS.get().config.getConfigurationSection("worlds"); for (final ConfigurationNode setting : plotarea.getSettingNodes()) { @@ -367,7 +352,7 @@ public abstract class PlotArea { @Override public String toString() { - return compatibility_id == 1 || id == null ? worldname : worldname + ";" + id; + return id == null ? worldname : worldname + ";" + id; } @Override @@ -430,6 +415,10 @@ public abstract class PlotArea { public boolean contains(int x, int z) { return TYPE != 2 || getRegionAbs().isIn(x, z); } + + public boolean contains(PlotId id) { + return min == null || (id.x >= min.x && id.x <= max.x && id.y >= min.y && id.y <= max.y); + } public boolean contains(Location loc) { return StringMan.isEqual(loc.getWorld(), worldname) && (getRegionAbs() == null || region.isIn(loc.getX(), loc.getZ()));