diff --git a/PlotSquared/pom.xml b/PlotSquared/pom.xml
index b5d2ed70b..011c30fa1 100644
--- a/PlotSquared/pom.xml
+++ b/PlotSquared/pom.xml
@@ -8,7 +8,7 @@
UTF-8
PlotSquared
- 2.10.2
+ 2.10.4
PlotSquared
jar
diff --git a/PlotSquared/src/main/java/com/intellectualcrafters/plot/BukkitMain.java b/PlotSquared/src/main/java/com/intellectualcrafters/plot/BukkitMain.java
index 779511ed9..dc82b4408 100644
--- a/PlotSquared/src/main/java/com/intellectualcrafters/plot/BukkitMain.java
+++ b/PlotSquared/src/main/java/com/intellectualcrafters/plot/BukkitMain.java
@@ -322,10 +322,20 @@ public class BukkitMain extends JavaPlugin implements Listener, IPlotMain {
@Override
final public ChunkGenerator getDefaultWorldGenerator(final String world, final String id) {
+ WorldEvents.lastWorld = world;
if (!PlotSquared.setupPlotWorld(world, id)) {
return null;
}
- return new HybridGen();
+ HybridGen result = new HybridGen();
+ TaskManager.runTaskLater(new Runnable() {
+ @Override
+ public void run() {
+ if (WorldEvents.lastWorld != null && WorldEvents.lastWorld.equals(world)) {
+ WorldEvents.lastWorld = null;
+ }
+ }
+ }, 20);
+ return result;
}
@Override
diff --git a/PlotSquared/src/main/java/com/intellectualcrafters/plot/PlotSquared.java b/PlotSquared/src/main/java/com/intellectualcrafters/plot/PlotSquared.java
index 31bd88321..528ffd3a4 100644
--- a/PlotSquared/src/main/java/com/intellectualcrafters/plot/PlotSquared.java
+++ b/PlotSquared/src/main/java/com/intellectualcrafters/plot/PlotSquared.java
@@ -97,7 +97,7 @@ public class PlotSquared {
private static LinkedHashMap> plots;
private static Database database;
public static Connection connection;
-
+
public static Database getDatabase() {
return database;
}
diff --git a/PlotSquared/src/main/java/com/intellectualcrafters/plot/commands/DebugFill.java b/PlotSquared/src/main/java/com/intellectualcrafters/plot/commands/DebugFill.java
index fc676c07c..f3b38ce1c 100644
--- a/PlotSquared/src/main/java/com/intellectualcrafters/plot/commands/DebugFill.java
+++ b/PlotSquared/src/main/java/com/intellectualcrafters/plot/commands/DebugFill.java
@@ -23,16 +23,12 @@ package com.intellectualcrafters.plot.commands;
import com.intellectualcrafters.plot.config.C;
import com.intellectualcrafters.plot.object.Location;
import com.intellectualcrafters.plot.object.Plot;
+import com.intellectualcrafters.plot.object.PlotBlock;
import com.intellectualcrafters.plot.object.PlotPlayer;
import com.intellectualcrafters.plot.util.MainUtil;
import com.intellectualcrafters.plot.util.Permissions;
import com.intellectualcrafters.plot.util.SetBlockQueue;
import com.intellectualcrafters.plot.util.TaskManager;
-import com.intellectualcrafters.plot.util.bukkit.UUIDHandler;
-import com.intellectualcrafters.plot.uuid.DefaultUUIDWrapper;
-import com.intellectualcrafters.plot.uuid.LowerOfflineUUIDWrapper;
-import com.intellectualcrafters.plot.uuid.OfflineUUIDWrapper;
-import com.intellectualcrafters.plot.uuid.UUIDWrapper;
public class DebugFill extends SubCommand {
public DebugFill() {
@@ -61,56 +57,72 @@ public class DebugFill extends SubCommand {
final Location bottom = MainUtil.getPlotBottomLoc(plot.world, plot.id).add(1, 0, 1);
final Location top = MainUtil.getPlotTopLoc(plot.world, plot.id);
MainUtil.sendMessage(player, "&cPreparing task");
- TaskManager.runTaskAsync(new Runnable() {
+ SetBlockQueue.addNotify(new Runnable() {
@Override
public void run() {
- MainUtil.sendMessage(player, "&7 - Starting");
- if (args[0].equalsIgnoreCase("all")) {
- for (int x = bottom.getX(); x <= top.getX(); x++) {
- for (int y = 0; y <= 255; y++) {
- for (int z = bottom.getZ(); z <= top.getZ(); z++) {
- SetBlockQueue.setBlock(plot.world, x, y, z, 7);
- }
- }
- }
- }
- else if (args[0].equals("outline")) {
- int x, z;
- z = bottom.getZ();
- for (x = bottom.getX(); x <= (top.getX() - 1); x++) {
- for (int y = 1; y <= 255; y++) {
- SetBlockQueue.setBlock(plot.world, x, y, z, 7);
- }
- }
- x = top.getX();
- for (z = bottom.getZ(); z <= (top.getZ() - 1); z++) {
- for (int y = 1; y <= 255; y++) {
- SetBlockQueue.setBlock(plot.world, x, y, z, 7);
- }
- }
- z = top.getZ();
- for (x = top.getX(); x >= (bottom.getX() + 1); x--) {
- for (int y = 1; y <= 255; y++) {
- SetBlockQueue.setBlock(plot.world, x, y, z, 7);
- }
- }
- x = bottom.getX();
- for (z = top.getZ(); z >= (bottom.getZ() + 1); z--) {
- for (int y = 1; y <= 255; y++) {
- SetBlockQueue.setBlock(plot.world, x, y, z, 7);
- }
- }
- int y = 255;
- for (x = bottom.getX(); x <= top.getX(); x++) {
- for (z = bottom.getZ(); z <= top.getZ(); z++) {
- SetBlockQueue.setBlock(plot.world, x, y, z, 7);
- }
- }
- }
- SetBlockQueue.addNotify(new Runnable() {
+ TaskManager.runTaskAsync(new Runnable() {
@Override
public void run() {
- MainUtil.sendMessage(player, "&aFill task complete!");
+ MainUtil.sendMessage(player, "&7 - Starting");
+ if (args[0].equalsIgnoreCase("all")) {
+ for (int x = bottom.getX(); x <= top.getX(); x++) {
+ for (int y = 0; y <= 255; y++) {
+ for (int z = bottom.getZ(); z <= top.getZ(); z++) {
+ SetBlockQueue.setBlock(plot.world, x, y, z, 7);
+ }
+ }
+ }
+ SetBlockQueue.addNotify(new Runnable() {
+ @Override
+ public void run() {
+ MainUtil.sendMessage(player, "&aFill task complete!");
+ }
+ });
+ }
+ else if (args[0].equals("outline")) {
+ int x, z;
+ z = bottom.getZ();
+ for (x = bottom.getX(); x <= (top.getX() - 1); x++) {
+ for (int y = 1; y <= 255; y++) {
+ SetBlockQueue.setBlock(plot.world, x, y, z, 7);
+ }
+ }
+ x = top.getX();
+ for (z = bottom.getZ(); z <= (top.getZ() - 1); z++) {
+ for (int y = 1; y <= 255; y++) {
+ SetBlockQueue.setBlock(plot.world, x, y, z, 7);
+ }
+ }
+ z = top.getZ();
+ for (x = top.getX(); x >= (bottom.getX() + 1); x--) {
+ for (int y = 1; y <= 255; y++) {
+ SetBlockQueue.setBlock(plot.world, x, y, z, 7);
+ }
+ }
+ x = bottom.getX();
+ for (z = top.getZ(); z >= (bottom.getZ() + 1); z--) {
+ for (int y = 1; y <= 255; y++) {
+ SetBlockQueue.setBlock(plot.world, x, y, z, 7);
+ }
+ }
+ SetBlockQueue.addNotify(new Runnable() {
+ @Override
+ public void run() {
+ MainUtil.sendMessage(player, "&aWalls complete! The ceiling will take a while :(");
+ bottom.setY(255);
+ top.add(1,0,1);
+ SetBlockQueue.setSlow(true);
+ MainUtil.setSimpleCuboidAsync(plot.world, bottom, top, new PlotBlock((short) 7, (byte) 0));
+ SetBlockQueue.addNotify(new Runnable() {
+ @Override
+ public void run() {
+ MainUtil.sendMessage(player, "&aFill task complete!");
+ SetBlockQueue.setSlow(false);
+ }
+ });
+ }
+ });
+ }
}
});
}
diff --git a/PlotSquared/src/main/java/com/intellectualcrafters/plot/listeners/WorldEvents.java b/PlotSquared/src/main/java/com/intellectualcrafters/plot/listeners/WorldEvents.java
index 01bdcc690..16a9a7229 100644
--- a/PlotSquared/src/main/java/com/intellectualcrafters/plot/listeners/WorldEvents.java
+++ b/PlotSquared/src/main/java/com/intellectualcrafters/plot/listeners/WorldEvents.java
@@ -13,17 +13,32 @@ import com.intellectualcrafters.plot.object.PlotGenerator;
import com.intellectualcrafters.plot.util.bukkit.UUIDHandler;
public class WorldEvents implements Listener {
+
+ public static String lastWorld = null;
+
+ public static String getName(World world) {
+ if (lastWorld != null) {
+ return lastWorld;
+ }
+ else {
+ return world.getName();
+ }
+ }
+
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public static void onWorldInit(final WorldInitEvent event) {
final World world = event.getWorld();
+ String name = getName(world);
final ChunkGenerator gen = world.getGenerator();
if (gen instanceof PlotGenerator) {
- PlotSquared.loadWorld(world.getName(), (PlotGenerator) gen);
+ //
+ PlotSquared.loadWorld(name, (PlotGenerator) gen);
} else {
- if (PlotSquared.config.contains("worlds." + world.getName())) {
- PlotSquared.loadWorld(world.getName(), null);
+ if (PlotSquared.config.contains("worlds." + name)) {
+ PlotSquared.loadWorld(name, null);
}
}
+ lastWorld = null;
}
@EventHandler
diff --git a/PlotSquared/src/main/java/com/intellectualcrafters/plot/object/PlotGenerator.java b/PlotSquared/src/main/java/com/intellectualcrafters/plot/object/PlotGenerator.java
index 1e5603760..d1281e294 100644
--- a/PlotSquared/src/main/java/com/intellectualcrafters/plot/object/PlotGenerator.java
+++ b/PlotSquared/src/main/java/com/intellectualcrafters/plot/object/PlotGenerator.java
@@ -31,6 +31,7 @@ import org.bukkit.generator.BlockPopulator;
import org.bukkit.generator.ChunkGenerator;
import com.intellectualcrafters.plot.PlotSquared;
+import com.intellectualcrafters.plot.listeners.WorldEvents;
import com.intellectualcrafters.plot.util.ChunkManager;
public abstract class PlotGenerator extends ChunkGenerator {
@@ -43,8 +44,8 @@ public abstract class PlotGenerator extends ChunkGenerator {
@SuppressWarnings("unchecked")
@Override
public List getDefaultPopulators(World world) {
- PlotSquared.loadWorld(world.getName(), this);
- PlotWorld plotworld = PlotSquared.getPlotWorld(world.getName());
+ PlotSquared.loadWorld(WorldEvents.getName(world), this);
+ PlotWorld plotworld = PlotSquared.getPlotWorld(WorldEvents.getName(world));
if (!plotworld.MOB_SPAWNING) {
if (!plotworld.SPAWN_EGGS) {
world.setSpawnFlags(false, false);
@@ -61,7 +62,7 @@ public abstract class PlotGenerator extends ChunkGenerator {
world.setMonsterSpawnLimit(-1);
world.setWaterAnimalSpawnLimit(-1);
}
- return (List)(List>) getPopulators(world.getName());
+ return (List)(List>) getPopulators(WorldEvents.getName(world));
}
@Override
diff --git a/PlotSquared/src/main/java/com/intellectualcrafters/plot/util/SetBlockQueue.java b/PlotSquared/src/main/java/com/intellectualcrafters/plot/util/SetBlockQueue.java
index 082b27a56..12ecc6677 100644
--- a/PlotSquared/src/main/java/com/intellectualcrafters/plot/util/SetBlockQueue.java
+++ b/PlotSquared/src/main/java/com/intellectualcrafters/plot/util/SetBlockQueue.java
@@ -2,7 +2,6 @@ package com.intellectualcrafters.plot.util;
import java.util.HashMap;
import java.util.HashSet;
-import java.util.Iterator;
import java.util.Map.Entry;
import com.intellectualcrafters.plot.PlotSquared;
@@ -16,6 +15,7 @@ public class SetBlockQueue {
private volatile static boolean running = false;
private volatile static boolean locked = false;
private volatile static HashSet runnables;
+ private volatile static boolean slow = false;
public synchronized static void allocate(int t) {
allocate = t;
@@ -25,15 +25,23 @@ public class SetBlockQueue {
return allocate;
}
+ public static void setSlow(boolean value) {
+ slow = value;
+ }
+
public synchronized static void addNotify(Runnable whenDone) {
if (runnables == null) {
TaskManager.runTask(whenDone);
+ slow = false;
+ locked = false;
}
else {
runnables.add(whenDone);
}
}
+ private static long last;
+
public synchronized static void init() {
if (blocks == null) {
if (AugmentedPopulator.x_loc == null) {
@@ -59,22 +67,48 @@ public class SetBlockQueue {
runnables = null;
blocks = null;
running = false;
+ slow = false;
return;
}
- long start = System.currentTimeMillis() + allocate;
- Iterator> i = blocks.entrySet().iterator();
- while (System.currentTimeMillis() < start && i.hasNext()) {
+ long newLast = System.currentTimeMillis();
+ last = Math.max(newLast - 100, last);
+ while (blocks.size() > 0 && (System.currentTimeMillis() - last < 100 + allocate)) {
if (locked) {
return;
}
- Entry n = i.next();
- i.remove();
+ Entry n = blocks.entrySet().iterator().next();
ChunkWrapper chunk = n.getKey();
+ PlotBlock[][] blocks = n.getValue();
int X = chunk.x << 4;
int Z = chunk.z << 4;
- PlotBlock[][] blocks = n.getValue();
String world = chunk.world;
-// ChunkManager.manager.setChunk(chunk, blocks);
+ if (slow) {
+ boolean once = false;
+ for (int j = 0; j < blocks.length; j++) {
+ PlotBlock[] blocksj = blocks[j];
+ if (blocksj != null) {
+ long start = System.currentTimeMillis();
+ for (int k = 0; k < blocksj.length; k++) {
+ if (once && (System.currentTimeMillis() - start > allocate)) {
+ SetBlockQueue.blocks.put(n.getKey(), blocks);
+ return;
+ }
+ PlotBlock block = blocksj[k];
+ if (block != null) {
+ int x = AugmentedPopulator.x_loc[j][k];
+ int y = AugmentedPopulator.y_loc[j][k];
+ int z = AugmentedPopulator.z_loc[j][k];
+ BlockManager.manager.functionSetBlock(world, X + x, y, Z + z, block.id, block.data);
+ blocks[j][k] = null;
+ once = true;
+ }
+ }
+ }
+ }
+ SetBlockQueue.blocks.remove(n.getKey());
+ return;
+ }
+ SetBlockQueue.blocks.remove(n.getKey());
for (int j = 0; j < blocks.length; j++) {
PlotBlock[] blocksj = blocks[j];
if (blocksj != null) {
@@ -108,11 +142,13 @@ public class SetBlockQueue {
z -= Z << 4;
ChunkWrapper wrap = new ChunkWrapper(world, X, Z);
- PlotBlock[][] result = blocks.get(wrap);
+ PlotBlock[][] result;
+ result = blocks.get(wrap);
if (!blocks.containsKey(wrap)) {
result = new PlotBlock[16][];
blocks.put(wrap, result);
}
+
if (result[y >> 4] == null) {
result[y >> 4] = new PlotBlock[4096];
}
@@ -132,9 +168,9 @@ public class SetBlockQueue {
int Z = z >> 4;
x -= X << 4;
z -= Z << 4;
-
ChunkWrapper wrap = new ChunkWrapper(world, X, Z);
- PlotBlock[][] result = blocks.get(wrap);
+ PlotBlock[][] result;
+ result = blocks.get(wrap);
if (!blocks.containsKey(wrap)) {
result = new PlotBlock[16][];
blocks.put(wrap, result);