diff --git a/pom.xml b/pom.xml index e7d7125e1..3815728a3 100644 --- a/pom.xml +++ b/pom.xml @@ -8,7 +8,7 @@ UTF-8 PlotSquared - 2.12.13 + 2.12.14 PlotSquared jar diff --git a/src/main/java/com/intellectualcrafters/plot/PS.java b/src/main/java/com/intellectualcrafters/plot/PS.java index f656d340e..ef7699f32 100644 --- a/src/main/java/com/intellectualcrafters/plot/PS.java +++ b/src/main/java/com/intellectualcrafters/plot/PS.java @@ -1222,16 +1222,16 @@ public class PS { options.put("clear.auto.calibration.changes", 1); options.put("clear.auto.calibration.faces", 2); options.put("clear.auto.calibration.data", 32); - options.put("clear.auto.calibration.air", 32); + options.put("clear.auto.calibration.air", 0); options.put("clear.auto.calibration.variety", 1); options.put("clear.auto.calibration.changes_sd", 64); options.put("clear.auto.calibration.faces_sd", 32); options.put("clear.auto.calibration.data_sd", 1); - options.put("clear.auto.calibration.air_sd", 32); + options.put("clear.auto.calibration.air_sd", 0); options.put("clear.auto.calibration.variety_sd", 1); - int keep = config.getInt("keep-if-modified"); - int ignore = config.getInt("ignore-if-modified"); + int keep = config.getInt("clear.keep-if-modified"); + int ignore = config.getInt("clear.ignore-if-modified"); if (keep > 0 || ignore > 0) { options.put("clear.auto.threshold", 1); log("&cIMPORTANT MESSAGE ABOUT THIS UPDATE!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); @@ -1247,8 +1247,8 @@ public class PS { else { options.put("clear.auto.threshold", Settings.CLEAR_THRESHOLD); } - config.set("keep-if-modified", null); - config.set("ignore-if-modified", null); + config.set("clear.keep-if-modified", null); + config.set("clear.ignore-if-modified", null); // Schematics options.put("schematics.save_path", Settings.SCHEMATIC_SAVE_PATH); diff --git a/src/main/java/com/intellectualcrafters/plot/commands/CreateRoadSchematic.java b/src/main/java/com/intellectualcrafters/plot/commands/CreateRoadSchematic.java index 32661bf60..781af514d 100644 --- a/src/main/java/com/intellectualcrafters/plot/commands/CreateRoadSchematic.java +++ b/src/main/java/com/intellectualcrafters/plot/commands/CreateRoadSchematic.java @@ -45,7 +45,7 @@ public class CreateRoadSchematic extends SubCommand { return sendMessage(player, C.NOT_IN_PLOT_WORLD); } HybridUtils.manager.setupRoadSchematic(plot); - MainUtil.sendMessage(player, "&6Saved new road schematic"); + MainUtil.sendMessage(player, "&6Saved new road schematic (see console for more information)"); return true; } } diff --git a/src/main/java/com/intellectualcrafters/plot/commands/DebugExec.java b/src/main/java/com/intellectualcrafters/plot/commands/DebugExec.java index 438a2759b..84d852af5 100644 --- a/src/main/java/com/intellectualcrafters/plot/commands/DebugExec.java +++ b/src/main/java/com/intellectualcrafters/plot/commands/DebugExec.java @@ -74,6 +74,7 @@ public class DebugExec extends SubCommand { PlotAnalysis analysis = plot.getComplexity(); if (analysis != null) { int complexity = analysis.getComplexity(); + MainUtil.sendMessage(player, "Changes: " + analysis.changes); MainUtil.sendMessage(player, "Complexity: " + complexity); return true; } diff --git a/src/main/java/com/intellectualcrafters/plot/commands/Download.java b/src/main/java/com/intellectualcrafters/plot/commands/Download.java index 6d213e58d..e7a49088e 100644 --- a/src/main/java/com/intellectualcrafters/plot/commands/Download.java +++ b/src/main/java/com/intellectualcrafters/plot/commands/Download.java @@ -8,6 +8,7 @@ import com.intellectualcrafters.plot.config.C; import com.intellectualcrafters.plot.config.Settings; import com.intellectualcrafters.plot.object.Plot; import com.intellectualcrafters.plot.object.PlotPlayer; +import com.intellectualcrafters.plot.object.RunnableVal; import com.intellectualcrafters.plot.util.MainUtil; import com.intellectualcrafters.plot.util.SchematicHandler; import com.intellectualcrafters.plot.util.TaskManager; @@ -37,17 +38,22 @@ public class Download extends SubCommand { } MainUtil.runners.put(plot, 1); MainUtil.sendMessage(plr, C.GENERATING_LINK); - final CompoundTag tag = SchematicHandler.manager.getCompoundTag(plot.world, plot.id); - TaskManager.runTaskAsync(new Runnable() { + SchematicHandler.manager.getCompoundTag(plot.world, plot.id, new RunnableVal() { @Override public void run() { - URL url = SchematicHandler.manager.upload(tag); - if (url == null) { - MainUtil.sendMessage(plr, C.GENERATING_LINK_FAILED); - return; - } - MainUtil.sendMessage(plr, url.toString()); - MainUtil.runners.remove(plot); + TaskManager.runTaskAsync(new Runnable() { + @Override + public void run() { + URL url = SchematicHandler.manager.upload(value); + if (url == null) { + MainUtil.sendMessage(plr, C.GENERATING_LINK_FAILED); + MainUtil.runners.remove(plot); + return; + } + MainUtil.sendMessage(plr, url.toString()); + MainUtil.runners.remove(plot); + } + }); } }); return true; diff --git a/src/main/java/com/intellectualcrafters/plot/config/Settings.java b/src/main/java/com/intellectualcrafters/plot/config/Settings.java index 44bcf5dec..98d33ebc8 100644 --- a/src/main/java/com/intellectualcrafters/plot/config/Settings.java +++ b/src/main/java/com/intellectualcrafters/plot/config/Settings.java @@ -177,7 +177,7 @@ public class Settings { */ public static boolean TWIN_MODE_UUID = false; public static boolean OFFLINE_MODE = false; - public static boolean UUID_LOWERCASE = false; + public static boolean UUID_LOWERCASE = true; /** * Command confirmation */ diff --git a/src/main/java/com/intellectualcrafters/plot/generator/BukkitHybridUtils.java b/src/main/java/com/intellectualcrafters/plot/generator/BukkitHybridUtils.java index 7c2380877..9c4c0cc0d 100644 --- a/src/main/java/com/intellectualcrafters/plot/generator/BukkitHybridUtils.java +++ b/src/main/java/com/intellectualcrafters/plot/generator/BukkitHybridUtils.java @@ -80,30 +80,30 @@ public class BukkitHybridUtils extends HybridUtils { final int ctz = tz >> 4; final Random r = new Random(); AugmentedPopulator.initCache(); - final int width = tx - bx + 1; final int length = tz - bz + 1; + System.gc(); + System.gc(); final short[][][] oldblocks = new short[256][width][length]; final short[][][] newblocks = new short[256][width][length]; - final List chunks = new ArrayList<>(); - final List processed_chunks = new ArrayList<>(); + final List chunks = new ArrayList<>(); + final List processed_chunks = new ArrayList<>(); for (int X = cbx; X <= ctx; X++) { for (int Z = cbz; Z <= ctz; Z++) { - Chunk chunk = world.getChunkAt(X, Z); - chunks.add(chunk); +// Chunk chunk = world.getChunkAt(X, Z); + chunks.add(new ChunkLoc(X, Z)); } } - final Runnable run = new Runnable() { @Override public void run() { - for (Chunk chunk : processed_chunks) { - short[][] result = gen.generateExtBlockSections(world, r, chunk.getX(), chunk.getZ(), base); - int X = chunk.getX(); - int Z = chunk.getZ(); + for (ChunkLoc chunk : processed_chunks) { + short[][] result = gen.generateExtBlockSections(world, r, chunk.x, chunk.z, base); + int X = chunk.x; + int Z = chunk.z; int xb = ((X) << 4) - bx; int zb = ((Z) << 4) - bz; for (int i = 0; i < result.length; i++) { @@ -128,7 +128,6 @@ public class BukkitHybridUtils extends HybridUtils { } } } - int size = width * length; int[] changes = new int[size]; int[] faces = new int[size]; @@ -176,7 +175,6 @@ public class BukkitHybridUtils extends HybridUtils { i++; } } - // analyze plot // put in analysis obj @@ -206,18 +204,16 @@ public class BukkitHybridUtils extends HybridUtils { result.add(analysis.data_sd); result.add(analysis.air_sd); result.add(analysis.variety_sd); - Flag flag = new Flag(FlagManager.getFlag("analysis"), result); FlagManager.addPlotFlag(plot, flag); - + System.gc(); + System.gc(); whenDone.value = analysis; whenDone.run(); } }; - System.gc(); AugmentedPopulator.initCache(); - TaskManager.index.increment(); final Integer currentIndex = TaskManager.index.toInteger(); final Integer task = TaskManager.runTaskRepeat(new Runnable() { @@ -229,10 +225,11 @@ public class BukkitHybridUtils extends HybridUtils { TaskManager.runTaskAsync(run); return; } - Chunk chunk = chunks.remove(0); + ChunkLoc chunk = chunks.remove(0); + world.loadChunk(chunk.x, chunk.z); processed_chunks.add(chunk); - int X = chunk.getX(); - int Z = chunk.getZ(); + int X = chunk.x; + int Z = chunk.z; int minX; int minZ; int maxX; @@ -246,19 +243,24 @@ public class BukkitHybridUtils extends HybridUtils { if (Z == ctz) maxZ = MathMan.mod(tz); else maxZ = 16; - int xb = ((X) << 4) - bx; - int zb = ((Z) << 4) - bz; - + int cbx = X << 4; + int cbz = Z << 4; + + int xb = (cbx) - bx; + int zb = (cbz) - bz; for (int x = minX; x <= maxX; x++) { + int xx = cbx + cbz; for (int z = minZ; z <= maxZ; z++) { + int zz = cbz + z; for (int y = 0; y < 256; y++) { - Block block = chunk.getBlock(x, y, z); - int xx = xb + x; - int zz = zb + z; - newblocks[y][xx][zz] = (short) block.getTypeId(); + Block block = world.getBlockAt(xx, y, zz); + int xr = xb + x; + int zr = zb + z; + newblocks[y][xr][zr] = (short) block.getTypeId(); } } } + world.unloadChunkRequest(chunk.x, chunk.z, true); } }, 1); TaskManager.tasks.put(currentIndex, task); diff --git a/src/main/java/com/intellectualcrafters/plot/generator/HybridPlotManager.java b/src/main/java/com/intellectualcrafters/plot/generator/HybridPlotManager.java index 99eb32bc0..ef4e0417b 100644 --- a/src/main/java/com/intellectualcrafters/plot/generator/HybridPlotManager.java +++ b/src/main/java/com/intellectualcrafters/plot/generator/HybridPlotManager.java @@ -23,12 +23,14 @@ package com.intellectualcrafters.plot.generator; import java.io.File; import java.io.IOException; import java.nio.file.Files; +import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; import com.intellectualcrafters.plot.PS; import com.intellectualcrafters.plot.commands.Template; +import com.intellectualcrafters.plot.object.ChunkLoc; import com.intellectualcrafters.plot.object.FileBytes; import com.intellectualcrafters.plot.object.Location; import com.intellectualcrafters.plot.object.Plot; @@ -173,68 +175,85 @@ public class HybridPlotManager extends ClassicPlotManager { final Location pos2 = MainUtil.getPlotTopLocAbs(world, plot.id); setWallFilling(dpw, plot.id, new PlotBlock[] { dpw.WALL_FILLING }); - int p1x = pos1.getX(); - int p1z = pos1.getZ(); - int p2x = pos2.getX(); - int p2z = pos2.getZ(); - int bcx = p1x >> 4; - int bcz = p1z >> 4; - int tcx = p2x >> 4; - int tcz = p2z >> 4; + final int p1x = pos1.getX(); + final int p1z = pos1.getZ(); + final int p2x = pos2.getX(); + final int p2z = pos2.getZ(); + final int bcx = p1x >> 4; + final int bcz = p1z >> 4; + final int tcx = p2x >> 4; + final int tcz = p2z >> 4; - boolean canRegen = plotworld.TYPE == 0 && plotworld.TERRAIN == 0; + final boolean canRegen = plotworld.TYPE == 0 && plotworld.TERRAIN == 0; final PlotBlock[] plotfloor = dpw.TOP_BLOCK; final PlotBlock[] filling = dpw.MAIN_BLOCK; final PlotBlock[] bedrock = (dpw.PLOT_BEDROCK ? new PlotBlock[] { new PlotBlock((short) 7, (byte) 0) } : filling); - PlotBlock air = new PlotBlock((short) 0, (byte) 0); + final PlotBlock air = new PlotBlock((short) 0, (byte) 0); + + final ArrayList chunks = new ArrayList(); for (int x = bcx; x <= tcx; x++) { for (int z = bcz; z <= tcz; z++) { - int xxb = x << 4; - int zzb = z << 4; - int xxt = xxb + 15; - int zzt = zzb + 15; - if (canRegen) { - if (xxb >= p1x && xxt <= p2x && zzb >= p1z && zzt <= p2z) { - BukkitUtil.regenerateChunk(world, x, z); - if (!MainUtil.canSendChunk) { -// BukkitUtil.refreshChunk(world, x, z); - } - continue; - } - } - if (x == bcx) { - xxb = p1x; - } - if (x == tcx) { - xxt = p2x; - } - if (z == bcz) { - zzb = p1z; - } - if (z == tcz) { - zzt = p2z; - } - BukkitUtil.setBiome(plot.world, xxb, zzb, xxt, zzt, dpw.PLOT_BIOME); - Location bot = new Location(world, xxb, 0, zzb); - Location top = new Location(world, xxt + 1, 1, zzt + 1); - MainUtil.setCuboidAsync(world, bot, top, bedrock); - bot.setY(1); - top.setY(dpw.PLOT_HEIGHT); - MainUtil.setCuboidAsync(world, bot, top, filling); - bot.setY(dpw.PLOT_HEIGHT); - top.setY(dpw.PLOT_HEIGHT + 1); - MainUtil.setCuboidAsync(world, bot, top, plotfloor); - bot.setY(dpw.PLOT_HEIGHT + 1); - top.setY(256); - MainUtil.setSimpleCuboidAsync(world, bot, top, air); + chunks.add(new ChunkLoc(x, z)); } } - pastePlotSchematic(dpw, pos1, pos2); - final PlotBlock wall = isDelete ? dpw.WALL_BLOCK : dpw.CLAIMED_WALL_BLOCK; - setWall(dpw, plot.id, new PlotBlock[] { wall }); - SetBlockQueue.addNotify(whenDone); + + TaskManager.runTask(new Runnable() { + @Override + public void run() { + long start = System.currentTimeMillis(); + while (chunks.size() > 0 && System.currentTimeMillis() - start < 20) { + ChunkLoc chunk = chunks.remove(0); + int x = chunk.x; + int z = chunk.z; + int xxb = x << 4; + int zzb = z << 4; + int xxt = xxb + 15; + int zzt = zzb + 15; + if (canRegen) { + if (xxb >= p1x && xxt <= p2x && zzb >= p1z && zzt <= p2z) { + BukkitUtil.regenerateChunk(world, x, z); + continue; + } + } + if (x == bcx) { + xxb = p1x; + } + if (x == tcx) { + xxt = p2x; + } + if (z == bcz) { + zzb = p1z; + } + if (z == tcz) { + zzt = p2z; + } + BukkitUtil.setBiome(plot.world, xxb, zzb, xxt, zzt, dpw.PLOT_BIOME); + Location bot = new Location(world, xxb, 0, zzb); + Location top = new Location(world, xxt + 1, 1, zzt + 1); + MainUtil.setCuboidAsync(world, bot, top, bedrock); + bot.setY(1); + top.setY(dpw.PLOT_HEIGHT); + MainUtil.setCuboidAsync(world, bot, top, filling); + bot.setY(dpw.PLOT_HEIGHT); + top.setY(dpw.PLOT_HEIGHT + 1); + MainUtil.setCuboidAsync(world, bot, top, plotfloor); + bot.setY(dpw.PLOT_HEIGHT + 1); + top.setY(256); + MainUtil.setSimpleCuboidAsync(world, bot, top, air); + } + if (chunks.size() != 0) { + TaskManager.runTaskLater(this, 1); + } + else { + pastePlotSchematic(dpw, pos1, pos2); + final PlotBlock wall = isDelete ? dpw.WALL_BLOCK : dpw.CLAIMED_WALL_BLOCK; + setWall(dpw, plot.id, new PlotBlock[] { wall }); + SetBlockQueue.addNotify(whenDone); + } + } + }); return true; } diff --git a/src/main/java/com/intellectualcrafters/plot/generator/HybridUtils.java b/src/main/java/com/intellectualcrafters/plot/generator/HybridUtils.java index b2f1ba61b..31c61f33a 100644 --- a/src/main/java/com/intellectualcrafters/plot/generator/HybridUtils.java +++ b/src/main/java/com/intellectualcrafters/plot/generator/HybridUtils.java @@ -50,13 +50,21 @@ public abstract class HybridUtils { final int ty = get_ey(world, bx, tx, bz, tz, by); final Location pos3 = new Location(world, bx, by, bz); final Location pos4 = new Location(world, tx, ty, tz); - final CompoundTag sideroad = SchematicHandler.manager.getCompoundTag(world, pos1, pos2); - final CompoundTag intersection = SchematicHandler.manager.getCompoundTag(world, pos3, pos4); final String dir = PS.get().IMP.getDirectory() + File.separator + "schematics" + File.separator + "GEN_ROAD_SCHEMATIC" + File.separator + plot.world + File.separator; - SchematicHandler.manager.save(sideroad, dir + "sideroad.schematic"); - SchematicHandler.manager.save(intersection, dir + "intersection.schematic"); - plotworld.ROAD_SCHEMATIC_ENABLED = true; - plotworld.setupSchematics(); + SchematicHandler.manager.getCompoundTag(world, pos1, pos2, new RunnableVal() { + @Override + public void run() { + SchematicHandler.manager.save(value, dir + "sideroad.schematic"); + SchematicHandler.manager.getCompoundTag(world, pos3, pos4, new RunnableVal() { + @Override + public void run() { + SchematicHandler.manager.save(value, dir + "intersection.schematic"); + plotworld.ROAD_SCHEMATIC_ENABLED = true; + plotworld.setupSchematics(); + } + }); + } + }); return true; } diff --git a/src/main/java/com/intellectualcrafters/plot/object/StringWrapper.java b/src/main/java/com/intellectualcrafters/plot/object/StringWrapper.java index cf2f92ce5..d6b9688b1 100644 --- a/src/main/java/com/intellectualcrafters/plot/object/StringWrapper.java +++ b/src/main/java/com/intellectualcrafters/plot/object/StringWrapper.java @@ -53,11 +53,14 @@ public class StringWrapper { if (getClass() != obj.getClass()) { return false; } + if (obj.hashCode() != hashCode()) { + return false; + } final StringWrapper other = (StringWrapper) obj; if ((other.value == null) || (this.value == null)) { return false; } - return other.value.toLowerCase().equals(this.value.toLowerCase()); + return other.value.equalsIgnoreCase(this.value.toLowerCase()); } /** @@ -70,6 +73,8 @@ public class StringWrapper { return this.value; } + private int hash; + /** * Get the hash value * @@ -80,6 +85,9 @@ public class StringWrapper { if (this.value == null) { return 0; } - return this.value.toLowerCase().hashCode(); + if (this.hash == 0) { + this.hash = this.value.toLowerCase().hashCode(); + } + return hash; } } diff --git a/src/main/java/com/intellectualcrafters/plot/util/BukkitSchematicHandler.java b/src/main/java/com/intellectualcrafters/plot/util/BukkitSchematicHandler.java index c6c6b29f6..43ca0fce4 100644 --- a/src/main/java/com/intellectualcrafters/plot/util/BukkitSchematicHandler.java +++ b/src/main/java/com/intellectualcrafters/plot/util/BukkitSchematicHandler.java @@ -41,6 +41,7 @@ import com.intellectualcrafters.jnbt.Tag; import com.intellectualcrafters.plot.PS; import com.intellectualcrafters.plot.object.ChunkLoc; import com.intellectualcrafters.plot.object.Location; +import com.intellectualcrafters.plot.object.RunnableVal; import com.intellectualcrafters.plot.object.schematic.StateWrapper; /** @@ -52,8 +53,14 @@ import com.intellectualcrafters.plot.object.schematic.StateWrapper; public class BukkitSchematicHandler extends SchematicHandler { @Override - public CompoundTag getCompoundTag(final String world, final Location pos1, final Location pos2) { - // loading chunks + public void getCompoundTag(final String world, final Location pos1, final Location pos2, RunnableVal whenDone) { + + // create schematic one chunk at a time + // load chunk sync + // get blocks async + // add to schematic async + // save final async + int i = 0; int j = 0; try { @@ -62,13 +69,15 @@ public class BukkitSchematicHandler extends SchematicHandler { boolean result = ChunkManager.manager.loadChunk(world, new ChunkLoc(i, j)); if (!result) { PS.log("&cIllegal selection. Cannot save non-existent chunk at " + (i / 16) + ", " + (j / 16)); - return null; + whenDone.run(); + return; } } } } catch (final Exception e) { PS.log("&cIllegal selection. Cannot save corrupt chunk at " + (i / 16) + ", " + (j / 16)); - return null; + whenDone.run(); + return; } final int width = (pos2.getX() - pos1.getX()) + 1; final int height = (pos2.getY() - pos1.getY()) + 1; @@ -93,18 +102,20 @@ public class BukkitSchematicHandler extends SchematicHandler { pos2.getZ(); final int sy = pos1.getY(); pos2.getY(); - List tileEntities = new ArrayList(); World worldObj = Bukkit.getWorld(world); + for (int y = 0; y < height; y++) { int i1 = (y * width * length); + int syy = sy + y; for (int z = 0; z < length; z++) { int i2 = i1 + (z * width); + int szz = sz + z; for (int x = 0; x < width; x++) { final int index = i2 + x; - Block block = worldObj.getBlockAt(sx + x, sy + y, sz + z); + Block block = worldObj.getBlockAt(sx + x, syy, szz); int id = block.getTypeId(); switch(id) { case 0: @@ -249,6 +260,7 @@ public class BukkitSchematicHandler extends SchematicHandler { } } + schematic.put("Blocks", new ByteArrayTag("Blocks", blocks)); schematic.put("Data", new ByteArrayTag("Data", blockData)); schematic.put("Entities", new ListTag("Entities", CompoundTag.class, new ArrayList())); @@ -257,7 +269,10 @@ public class BukkitSchematicHandler extends SchematicHandler { if (addBlocks != null) { schematic.put("AddBlocks", new ByteArrayTag("AddBlocks", addBlocks)); } - return new CompoundTag("Schematic", schematic); + + + whenDone.value = new CompoundTag("Schematic", schematic); + whenDone.run(); } diff --git a/src/main/java/com/intellectualcrafters/plot/util/ExpireManager.java b/src/main/java/com/intellectualcrafters/plot/util/ExpireManager.java index ecd8e7ce9..7b4f6fc07 100644 --- a/src/main/java/com/intellectualcrafters/plot/util/ExpireManager.java +++ b/src/main/java/com/intellectualcrafters/plot/util/ExpireManager.java @@ -125,8 +125,8 @@ public class ExpireManager { if (Settings.CLEAR_THRESHOLD != -1 && plotworld.TYPE == 0 && changed != null) { if (changed.getComplexity() > Settings.CLEAR_THRESHOLD) { PS.log("$2[&5Expire&dManager$2] &bIgnoring modified plot: " + plot + " : " + changed.getComplexity() + " - " + changed.changes); - FlagManager.addPlotFlag(plot, new Flag(FlagManager.getFlag("modified-blocks"), value)); expiredPlots.get(world).remove(plot); + FlagManager.addPlotFlag(plot, new Flag(FlagManager.getFlag("analysis"), value)); return; } } diff --git a/src/main/java/com/intellectualcrafters/plot/util/SchematicHandler.java b/src/main/java/com/intellectualcrafters/plot/util/SchematicHandler.java index de09f95ed..9be1f351a 100644 --- a/src/main/java/com/intellectualcrafters/plot/util/SchematicHandler.java +++ b/src/main/java/com/intellectualcrafters/plot/util/SchematicHandler.java @@ -38,6 +38,7 @@ import com.intellectualcrafters.plot.config.Settings; import com.intellectualcrafters.plot.object.Location; import com.intellectualcrafters.plot.object.Plot; import com.intellectualcrafters.plot.object.PlotId; +import com.intellectualcrafters.plot.object.RunnableVal; import com.intellectualcrafters.plot.object.schematic.PlotItem; import com.intellectualcrafters.plot.object.schematic.StateWrapper; import com.intellectualcrafters.plot.util.bukkit.BukkitUtil; @@ -57,15 +58,11 @@ public abstract class SchematicHandler { } exportAll = true; final ArrayList plots = new ArrayList(collection); - TaskManager.index.increment(); - final Integer currentIndex = TaskManager.index.toInteger(); - final int task = TaskManager.runTaskRepeat(new Runnable() { + TaskManager.runTask(new Runnable() { @Override public void run() { if (plots.size() == 0) { exportAll = false; - Bukkit.getScheduler().cancelTask(TaskManager.tasks.get(currentIndex)); - TaskManager.tasks.remove(currentIndex); TaskManager.runTask(ifSuccess); return; } @@ -94,27 +91,38 @@ public abstract class SchematicHandler { new WorldEditSchematic().saveSchematic(directory + File.separator + name + ".schematic", plot.world, plot.id); } else { - final CompoundTag sch = SchematicHandler.manager.getCompoundTag(plot.world, plot.id); - if (sch == null) { - MainUtil.sendMessage(null, "&7 - Skipped plot &c" + plot.id); - } else { - TaskManager.runTaskAsync(new Runnable() { - @Override - public void run() { - MainUtil.sendMessage(null, "&6ID: " + plot.id); - final boolean result = SchematicHandler.manager.save(sch, directory + File.separator + name + ".schematic"); - if (!result) { - MainUtil.sendMessage(null, "&7 - Failed to save &c" + plot.id); - } else { - MainUtil.sendMessage(null, "&7 - &a success: " + plot.id); - } + final Runnable THIS = this; + SchematicHandler.manager.getCompoundTag(plot.world, plot.id, new RunnableVal() { + @Override + public void run() { + if (value == null) { + MainUtil.sendMessage(null, "&7 - Skipped plot &c" + plot.id); } - }); - } + else { + TaskManager.runTaskAsync(new Runnable() { + @Override + public void run() { + MainUtil.sendMessage(null, "&6ID: " + plot.id); + final boolean result = SchematicHandler.manager.save(value, directory + File.separator + name + ".schematic"); + if (!result) { + MainUtil.sendMessage(null, "&7 - Failed to save &c" + plot.id); + } else { + MainUtil.sendMessage(null, "&7 - &a success: " + plot.id); + } + TaskManager.runTask(new Runnable() { + @Override + public void run() { + THIS.run(); + } + }); + } + }); + } + } + }); } } - }, 20); - TaskManager.tasks.put(currentIndex, task); + }); return true; } @@ -409,16 +417,16 @@ public abstract class SchematicHandler { * * @return tag */ - public CompoundTag getCompoundTag(final String world, final PlotId id) { + public void getCompoundTag(final String world, final PlotId id, RunnableVal whenDone) { if (!PS.get().getPlots(world).containsKey(id)) { - return null; + whenDone.run(); } final Location pos1 = MainUtil.getPlotBottomLoc(world, id).add(1, 0, 1); final Location pos2 = MainUtil.getPlotTopLoc(world, id); - return getCompoundTag(world, pos1, pos2); + getCompoundTag(world, pos1, pos2, whenDone); } - public abstract CompoundTag getCompoundTag(final String world, final Location pos1, final Location pos2); + public abstract void getCompoundTag(final String world, final Location pos1, final Location pos2, RunnableVal whenDone); public boolean pastePart(final String world, final DataCollection[] blocks, final Location l1, final int x_offset, final int z_offset, final int i1, final int i2, final int WIDTH, final int LENGTH) { int length = 0; diff --git a/src/main/java/com/intellectualcrafters/plot/util/bukkit/UUIDHandler.java b/src/main/java/com/intellectualcrafters/plot/util/bukkit/UUIDHandler.java index 74c4fb548..119bd7343 100644 --- a/src/main/java/com/intellectualcrafters/plot/util/bukkit/UUIDHandler.java +++ b/src/main/java/com/intellectualcrafters/plot/util/bukkit/UUIDHandler.java @@ -210,7 +210,10 @@ public class UUIDHandler { String name = (String) bukkit.get("lastKnownName"); long last = (long) bukkit.get("lastPlayed"); if (Settings.OFFLINE_MODE) { - if (!Settings.UUID_LOWERCASE || !name.toLowerCase().equals(name)) { + if (Settings.UUID_LOWERCASE && !name.toLowerCase().equals(name)) { + uuid = uuidWrapper.getUUID(name); + } + else { long most = (long) compound.get("UUIDMost"); long least = (long) compound.get("UUIDLeast"); uuid = new UUID(most, least);