diff --git a/bukkit0/src/main/java/com/boydti/fawe/bukkit/FaweBukkit.java b/bukkit0/src/main/java/com/boydti/fawe/bukkit/FaweBukkit.java index 476d91d7..9dd649e9 100644 --- a/bukkit0/src/main/java/com/boydti/fawe/bukkit/FaweBukkit.java +++ b/bukkit0/src/main/java/com/boydti/fawe/bukkit/FaweBukkit.java @@ -175,9 +175,7 @@ public class FaweBukkit implements IFawe, Listener { } try { return plugin.getQueue(world); - } catch (Throwable ignore) { - ignore.printStackTrace(); - } + } catch (Throwable ignore) {} // Disable incompatible settings Settings.QUEUE.PARALLEL_THREADS = 1; // BukkitAPI placer is too slow to parallel thread at the chunk level Settings.HISTORY.COMBINE_STAGES = false; // Performing a chunk copy (if possible) wouldn't be faster using the BukkitAPI diff --git a/core/src/main/java/com/boydti/fawe/example/DefaultFaweQueueMap.java b/core/src/main/java/com/boydti/fawe/example/DefaultFaweQueueMap.java index 8c9d6454..74568ff9 100644 --- a/core/src/main/java/com/boydti/fawe/example/DefaultFaweQueueMap.java +++ b/core/src/main/java/com/boydti/fawe/example/DefaultFaweQueueMap.java @@ -64,6 +64,15 @@ public class DefaultFaweQueueMap implements IFaweQueueMap { return chunk; } + @Override + public FaweChunk getCachedFaweChunk(int cx, int cz) { + if (cx == lastX && cz == lastZ) { + return lastWrappedChunk; + } + long pair = MathMan.pairInt(cx, cz); + return this.blocks.get(pair); + } + @Override public void add(FaweChunk chunk) { long pair = MathMan.pairInt(chunk.getX(), chunk.getZ()); diff --git a/core/src/main/java/com/boydti/fawe/example/IFaweQueueMap.java b/core/src/main/java/com/boydti/fawe/example/IFaweQueueMap.java index c9506007..a3e1b5be 100644 --- a/core/src/main/java/com/boydti/fawe/example/IFaweQueueMap.java +++ b/core/src/main/java/com/boydti/fawe/example/IFaweQueueMap.java @@ -12,6 +12,8 @@ public interface IFaweQueueMap { FaweChunk getFaweChunk(int cx, int cz); + FaweChunk getCachedFaweChunk(int cx, int cz); + void add(FaweChunk chunk); void clear(); diff --git a/core/src/main/java/com/boydti/fawe/jnbt/anvil/MCAChunk.java b/core/src/main/java/com/boydti/fawe/jnbt/anvil/MCAChunk.java index bea93d47..90e25bb2 100644 --- a/core/src/main/java/com/boydti/fawe/jnbt/anvil/MCAChunk.java +++ b/core/src/main/java/com/boydti/fawe/jnbt/anvil/MCAChunk.java @@ -371,7 +371,8 @@ public class MCAChunk extends FaweChunk { int layer = y >> 4; byte[] idsLayer = ids[layer]; if (idsLayer == null) { - return; + idsLayer = this.ids[layer] = new byte[4096]; + this.data[layer] = new byte[2048]; } int j = FaweCache.CACHE_J[y][z & 15][x & 15]; idsLayer[j] = (byte) id; diff --git a/core/src/main/java/com/boydti/fawe/jnbt/anvil/MCAFile.java b/core/src/main/java/com/boydti/fawe/jnbt/anvil/MCAFile.java index fa76de21..c6b624da 100644 --- a/core/src/main/java/com/boydti/fawe/jnbt/anvil/MCAFile.java +++ b/core/src/main/java/com/boydti/fawe/jnbt/anvil/MCAFile.java @@ -95,6 +95,9 @@ public class MCAFile { int i = ((cx & 31) << 2) + ((cz & 31) << 7); int offset = (((locations[i] & 0xFF) << 16) + ((locations[i + 1] & 0xFF) << 8) + ((locations[i+ 2] & 0xFF))) << 12; int size = (locations[i + 3] & 0xFF) << 12; + if (offset == 0) { + return null; + } NBTInputStream nis = getChunkIS(offset); MCAChunk chunk = new MCAChunk(nis, queue, cx, cz, size); int pair = MathMan.pair((short) (cx & 31), (short) (cz & 31)); @@ -180,6 +183,9 @@ public class MCAFile { } public void streamChunk(int offset, RunnableVal addReaders) throws IOException { + if (offset == 0) { + return; + } NBTInputStream is = getChunkIS(offset); NBTStreamer ns = new NBTStreamer(is); addReaders.run(ns); @@ -200,6 +206,9 @@ public class MCAFile { } private NBTStreamer getChunkReader(int offset) throws Exception { + if (offset == 0) { + return null; + } return new NBTStreamer(getChunkIS(offset)); } @@ -307,9 +316,6 @@ public class MCAFile { } } else { newBytes = getChunkBytes(cx, cz); - if (newBytes == null) { - System.out.println("This shouldn't be null?"); - } } } if (newBytes == null) { diff --git a/core/src/main/java/com/boydti/fawe/jnbt/anvil/MCAQueue.java b/core/src/main/java/com/boydti/fawe/jnbt/anvil/MCAQueue.java index 5d5e6794..ad04f8e4 100644 --- a/core/src/main/java/com/boydti/fawe/jnbt/anvil/MCAQueue.java +++ b/core/src/main/java/com/boydti/fawe/jnbt/anvil/MCAQueue.java @@ -13,15 +13,19 @@ import java.util.Map; import java.util.Set; import java.util.UUID; -public class MCAQueue extends NMSMappedFaweQueue { +public class MCAQueue extends NMSMappedFaweQueue { private FaweQueue parent; + private NMSMappedFaweQueue parentNMS; private final boolean hasSky; private final File saveFolder; public MCAQueue(FaweQueue parent) { super(parent.getWorldName(), new MCAQueueMap()); this.parent = parent; + if (parent instanceof NMSMappedFaweQueue) { + parentNMS = (NMSMappedFaweQueue) parent; + } ((MCAQueueMap) getFaweQueueMap()).setParentQueue(parent); hasSky = parent.hasSky(); saveFolder = parent.getSaveFolder(); @@ -60,7 +64,7 @@ public class MCAQueue extends NMSMappedFaweQueue tiles, Collection[] entities, Set createdEntities, boolean all) throws Exception { + public CharFaweChunk getPrevious(CharFaweChunk fs, FaweChunk sections, Map tiles, Collection[] entities, Set createdEntities, boolean all) throws Exception { throw new UnsupportedOperationException("Not supported"); } @@ -75,27 +79,55 @@ public class MCAQueue extends NMSMappedFaweQueue> 5; + int mcaZ = cz >> 5; + long pair = MathMan.pairInt(mcaX, mcaZ); + MCAFile file = mcaFileMap.get(pair); + if (file != null) { + return file.getCachedChunk(cx, cz); + } + return null; + } + @Override public void add(FaweChunk chunk) { throw new UnsupportedOperationException("Not supported");