Fix compatibility with old type 2 plotworld cluster data

This commit is contained in:
Jesse Boyd 2016-02-17 23:38:36 +11:00
parent 11064ec814
commit 411a74eefa
6 changed files with 123 additions and 33 deletions

View File

@ -14,6 +14,7 @@ import java.net.URLConnection;
import java.nio.file.Files; import java.nio.file.Files;
import java.sql.Connection; import java.sql.Connection;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.ArrayDeque;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
@ -21,6 +22,7 @@ import java.util.Collections;
import java.util.Comparator; import java.util.Comparator;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
@ -617,7 +619,22 @@ public class PS {
*/ */
public void addPlotArea(final PlotArea plotarea) { public void addPlotArea(final PlotArea plotarea) {
HashMap<PlotId, Plot> plots = plots_tmp.remove(plotarea.toString()); HashMap<PlotId, Plot> plots = plots_tmp.remove(plotarea.toString());
if (plots == null) {
if (plotarea.TYPE == 2) {
plots = plots_tmp.get(plotarea.worldname);
if (plots != null) { if (plots != null) {
Iterator<Entry<PlotId, Plot>> iter = plots.entrySet().iterator();
while (iter.hasNext()) {
Entry<PlotId, Plot> next = iter.next();
PlotId id = next.getKey();
if (plotarea.contains(id)) {
next.getValue().setArea(plotarea);
iter.remove();
}
}
}
}
} else {
for (Entry<PlotId, Plot> entry : plots.entrySet()) { for (Entry<PlotId, Plot> entry : plots.entrySet()) {
Plot plot = entry.getValue(); Plot plot = entry.getValue();
plot.setArea(plotarea); plot.setArea(plotarea);
@ -625,7 +642,21 @@ public class PS {
} }
if (Settings.ENABLE_CLUSTERS) { if (Settings.ENABLE_CLUSTERS) {
Set<PlotCluster> clusters = clusters_tmp.remove(plotarea.toString()); Set<PlotCluster> clusters = clusters_tmp.remove(plotarea.toString());
if (clusters == null) {
if (plotarea.TYPE == 2) {
clusters = clusters_tmp.get(plotarea.worldname);
if (clusters != null) { if (clusters != null) {
Iterator<PlotCluster> 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) { for (PlotCluster cluster : clusters) {
cluster.setArea(plotarea); cluster.setArea(plotarea);
} }
@ -1442,17 +1473,21 @@ public class PS {
if (clusters == null) { if (clusters == null) {
throw new IllegalArgumentException("No cluster exists for world: " + world); throw new IllegalArgumentException("No cluster exists for world: " + world);
} }
ArrayDeque<PlotArea> toLoad = new ArrayDeque<>();
for (PlotCluster cluster : clusters) { for (PlotCluster cluster : clusters) {
PlotId pos1 = cluster.getP1(); // Cluster pos1 PlotId pos1 = cluster.getP1(); // Cluster pos1
PlotId pos2 = cluster.getP2(); // Cluster pos2 PlotId pos2 = cluster.getP2(); // Cluster pos2
String name = cluster.getName(); // Cluster name 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); log(C.PREFIX.s() + "&3 - " + name + "-" + pos1 + "-" + pos2);
GeneratorWrapper<?> areaGen = IMP.getGenerator(world, gen_string); GeneratorWrapper<?> areaGen = IMP.getGenerator(world, gen_string);
if (areaGen == null) { if (areaGen == null) {
throw new IllegalArgumentException("Invalid Generator: " + gen_string); throw new IllegalArgumentException("Invalid Generator: " + gen_string);
} }
PlotArea pa = areaGen.getPlotGenerator().getNewPlotArea(world, name, pos1, pos2); PlotArea pa = areaGen.getPlotGenerator().getNewPlotArea(world, name, pos1, pos2);
pa.setCompatibility("3.2.X");
pa.saveConfiguration(worldSection); pa.saveConfiguration(worldSection);
pa.loadDefaultConfiguration(worldSection); pa.loadDefaultConfiguration(worldSection);
try { try {
@ -1463,9 +1498,13 @@ public class PS {
log(C.PREFIX.s() + "&c | &9generator: &7" + baseGenerator + ">" + areaGen); log(C.PREFIX.s() + "&c | &9generator: &7" + baseGenerator + ">" + areaGen);
log(C.PREFIX.s() + "&c | &9plotworld: &7" + pa); log(C.PREFIX.s() + "&c | &9plotworld: &7" + pa);
log(C.PREFIX.s() + "&c | &9manager: &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.getPlotGenerator().initialize(pa);
areaGen.augment(pa); areaGen.augment(pa);
addPlotArea(pa); toLoad.add(pa);
}
for (PlotArea area : toLoad) {
addPlotArea(area);
} }
return; return;
} }

View File

@ -36,7 +36,7 @@ import com.intellectualcrafters.plot.util.TaskManager;
import com.plotsquared.general.commands.CommandDeclaration; import com.plotsquared.general.commands.CommandDeclaration;
@CommandDeclaration(command = "clear", description = "Clear a plot", permission = "plots.clear", category = CommandCategory.APPEARANCE, @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 { public class Clear extends SubCommand {
@Override @Override

View File

@ -352,4 +352,6 @@ public interface AbstractDB {
boolean deleteTables(); boolean deleteTables();
void close(); void close();
void replaceWorld(String oldWorld, String newWorld, PlotId min, PlotId max);
} }

View File

@ -474,6 +474,10 @@ public class DBFunc {
dbManager.setPosition(cluster, position); 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 * Replace all occurrences of a uuid in the database with another one
* @param old * @param old

View File

@ -3030,6 +3030,62 @@ public class SQLManager implements AbstractDB {
commit(); 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 @Override
public void replaceUUID(final UUID old, final UUID now) { public void replaceUUID(final UUID old, final UUID now) {
addGlobalTask(new Runnable() { addGlobalTask(new Runnable() {

View File

@ -20,6 +20,18 @@
//////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////
package com.intellectualcrafters.plot.object; 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.configuration.ConfigurationSection;
import com.intellectualcrafters.plot.PS; import com.intellectualcrafters.plot.PS;
import com.intellectualcrafters.plot.config.C; 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.WorldUtil;
import com.intellectualcrafters.plot.util.area.QuadMap; 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 * @author Jesse Boyd
*/ */
@ -91,11 +91,6 @@ public abstract class PlotArea {
public PlotGamemode GAMEMODE = PlotGamemode.CREATIVE; public PlotGamemode GAMEMODE = PlotGamemode.CREATIVE;
int hash; int hash;
private RegionWrapper region; private RegionWrapper region;
/**
* Please ignore
*/
@Deprecated
private int compatibility_id;
private ConcurrentHashMap<String, Object> meta; private ConcurrentHashMap<String, Object> meta;
private QuadMap<PlotCluster> clusters; private QuadMap<PlotCluster> clusters;
@ -188,16 +183,6 @@ public abstract class PlotArea {
return clusters == null ? new HashSet<PlotCluster>() : clusters.getAll(); return clusters == null ? new HashSet<PlotCluster>() : 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) { public boolean isCompatible(PlotArea plotarea) {
final ConfigurationSection section = PS.get().config.getConfigurationSection("worlds"); final ConfigurationSection section = PS.get().config.getConfigurationSection("worlds");
for (final ConfigurationNode setting : plotarea.getSettingNodes()) { for (final ConfigurationNode setting : plotarea.getSettingNodes()) {
@ -367,7 +352,7 @@ public abstract class PlotArea {
@Override @Override
public String toString() { public String toString() {
return compatibility_id == 1 || id == null ? worldname : worldname + ";" + id; return id == null ? worldname : worldname + ";" + id;
} }
@Override @Override
@ -431,6 +416,10 @@ public abstract class PlotArea {
return TYPE != 2 || getRegionAbs().isIn(x, 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) { public boolean contains(Location loc) {
return StringMan.isEqual(loc.getWorld(), worldname) && (getRegionAbs() == null || region.isIn(loc.getX(), loc.getZ())); return StringMan.isEqual(loc.getWorld(), worldname) && (getRegionAbs() == null || region.isIn(loc.getX(), loc.getZ()));
} }