From 9c635810b0cd5afb9e063890c0ca086565bdb823 Mon Sep 17 00:00:00 2001 From: boy0001 Date: Sun, 19 Jul 2015 23:12:48 +1000 Subject: [PATCH] Multiple changes Working on async schematic saving Default plot clearing is now properly async (and somewhat slower) Offline mode servers now default to lowercase (there has been ample time to update) Fixed some issues with plot expiry Fixed some issues with UUID caching Optimized UUID fetching from cache (marginal) --- pom.xml | 2 +- .../com/intellectualcrafters/plot/PS.java | 12 +- .../plot/commands/CreateRoadSchematic.java | 2 +- .../plot/commands/DebugExec.java | 1 + .../plot/commands/Download.java | 24 ++-- .../plot/config/Settings.java | 2 +- .../plot/generator/BukkitHybridUtils.java | 54 ++++---- .../plot/generator/HybridPlotManager.java | 123 ++++++++++-------- .../plot/generator/HybridUtils.java | 20 ++- .../plot/object/StringWrapper.java | 12 +- .../plot/util/BukkitSchematicHandler.java | 29 ++++- .../plot/util/ExpireManager.java | 2 +- .../plot/util/SchematicHandler.java | 62 +++++---- .../plot/util/bukkit/UUIDHandler.java | 5 +- 14 files changed, 210 insertions(+), 140 deletions(-) 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);