From 850bb533cb34404b8f3dd8abe3f59c838592ef19 Mon Sep 17 00:00:00 2001 From: Jesse Boyd Date: Thu, 29 Dec 2016 11:53:07 +1100 Subject: [PATCH] Fix packet sending for null chunk sections --- .../boydti/fawe/bukkit/v0/BukkitQueue_0.java | 3 + .../fawe/bukkit/v1_10/BukkitQueue_1_10.java | 34 +++++++- .../bukkit/v1_11/BukkitChunk_1_11_Copy.java | 4 +- .../fawe/bukkit/v1_11/BukkitQueue_1_11.java | 85 +++++++++---------- .../fawe/bukkit/v1_7/BukkitQueue17.java | 35 +++++++- .../fawe/bukkit/v1_8/BukkitQueue18R3.java | 34 +++++++- .../fawe/bukkit/v1_9/BukkitQueue_1_9_R1.java | 34 +++++++- .../com/boydti/fawe/example/NMSRelighter.java | 21 ++--- .../com/boydti/fawe/jnbt/anvil/MCAQueue.java | 7 ++ .../com/boydti/fawe/object/FaweQueue.java | 2 + .../fawe/object/changeset/FaweChangeSet.java | 64 +++++++------- .../boydti/fawe/util/DelegateFaweQueue.java | 5 ++ .../fawe/forge/v110/ForgeQueue_All.java | 36 +++++++- .../fawe/forge/v111/ForgeQueue_All.java | 37 +++++++- .../fawe/forge/v1710/ForgeQueue_All.java | 61 +++++++++---- .../fawe/forge/v189/ForgeQueue_All.java | 36 +++++++- .../fawe/forge/v194/ForgeQueue_All.java | 36 +++++++- .../optimization/queue/NukkitQueue.java | 13 +-- 18 files changed, 412 insertions(+), 135 deletions(-) diff --git a/bukkit/src/main/java/com/boydti/fawe/bukkit/v0/BukkitQueue_0.java b/bukkit/src/main/java/com/boydti/fawe/bukkit/v0/BukkitQueue_0.java index 1fda7bf5..554cc656 100644 --- a/bukkit/src/main/java/com/boydti/fawe/bukkit/v0/BukkitQueue_0.java +++ b/bukkit/src/main/java/com/boydti/fawe/bukkit/v0/BukkitQueue_0.java @@ -166,6 +166,9 @@ public abstract class BukkitQueue_0 extends NMSMa return world.isChunkLoaded(x, z); } + @Override + public void sendChunk(int x, int z, int bitMask) {} + @Override public void refreshChunk(FaweChunk fs) {} diff --git a/bukkit/src/main/java/com/boydti/fawe/bukkit/v1_10/BukkitQueue_1_10.java b/bukkit/src/main/java/com/boydti/fawe/bukkit/v1_10/BukkitQueue_1_10.java index e5ec88e9..792d436b 100644 --- a/bukkit/src/main/java/com/boydti/fawe/bukkit/v1_10/BukkitQueue_1_10.java +++ b/bukkit/src/main/java/com/boydti/fawe/bukkit/v1_10/BukkitQueue_1_10.java @@ -81,9 +81,11 @@ public class BukkitQueue_1_10 extends BukkitQueue_0> 4)); + combined[k] = (char) ((idsBytesArray[k] << 4) + (datasBytesArray[j] >> 4)); } return combined; } diff --git a/bukkit/src/main/java/com/boydti/fawe/bukkit/v1_11/BukkitQueue_1_11.java b/bukkit/src/main/java/com/boydti/fawe/bukkit/v1_11/BukkitQueue_1_11.java index aebe5b32..bf22535e 100644 --- a/bukkit/src/main/java/com/boydti/fawe/bukkit/v1_11/BukkitQueue_1_11.java +++ b/bukkit/src/main/java/com/boydti/fawe/bukkit/v1_11/BukkitQueue_1_11.java @@ -86,12 +86,13 @@ public class BukkitQueue_1_11 extends BukkitQueue_0 ID_CACHE = new ThreadLocal() { - @Override - protected byte[] initialValue() { - return new byte[4096]; - } - }; - - private static ThreadLocal DATA_CACHE = new ThreadLocal() { - @Override - protected NibbleArray initialValue() { - return new NibbleArray(); - } - }; - @Override public BukkitChunk_1_11 getPrevious(CharFaweChunk fs, ChunkSection[] sections, Map tilesGeneric, Collection[] entitiesGeneric, Set createdEntities, boolean all) throws Exception { Map tiles = (Map) tilesGeneric; Collection[] entities = (Collection[]) entitiesGeneric; // Copy blocks -// BukkitChunk_1_11_Copy previous = new BukkitChunk_1_11_Copy(this, fs.getX(), fs.getZ()); - BukkitChunk_1_11 previous = getFaweChunk(fs.getX(), fs.getZ()); - char[][] idPrevious = previous.getCombinedIdArrays(); + BukkitChunk_1_11_Copy previous = new BukkitChunk_1_11_Copy(this, fs.getX(), fs.getZ()); for (int layer = 0; layer < sections.length; layer++) { if (fs.getCount(layer) != 0 || all) { ChunkSection section = sections[layer]; if (section != null) { -// DataPaletteBlock blocks = section.getBlocks(); -// byte[] ids = ID_CACHE.get(); -// NibbleArray data = DATA_CACHE.get(); -// blocks.exportData(ids, data); -// previous.set(layer, ids, data.asBytes()); -// short solid = (short) fieldNonEmptyBlockCount.getInt(section); -// previous.count[layer] = solid; -// previous.air[layer] = (short) (4096 - solid); - short solid = 0; - char[] previousLayer = idPrevious[layer] = new char[4096]; DataPaletteBlock blocks = section.getBlocks(); - for (int j = 0; j < 4096; j++) { - int x = FaweCache.CACHE_X[0][j]; - int y = FaweCache.CACHE_Y[0][j]; - int z = FaweCache.CACHE_Z[0][j]; - IBlockData ibd = blocks.a(x, y, z); - Block block = ibd.getBlock(); - int combined = Block.getId(block); - if (FaweCache.hasData(combined)) { - combined = (combined << 4) + block.toLegacyData(ibd); - } else { - combined = combined << 4; - } - if (combined > 1) { - solid++; - } - previousLayer[j] = (char) combined; - } + byte[] ids = new byte[4096]; + NibbleArray data = new NibbleArray(); + blocks.exportData(ids, data); + previous.set(layer, ids, data.asBytes()); + short solid = (short) fieldNonEmptyBlockCount.getInt(section); previous.count[layer] = solid; previous.air[layer] = (short) (4096 - solid); } diff --git a/bukkit/src/main/java/com/boydti/fawe/bukkit/v1_7/BukkitQueue17.java b/bukkit/src/main/java/com/boydti/fawe/bukkit/v1_7/BukkitQueue17.java index 7bc0e2ea..c4ec9ab3 100644 --- a/bukkit/src/main/java/com/boydti/fawe/bukkit/v1_7/BukkitQueue17.java +++ b/bukkit/src/main/java/com/boydti/fawe/bukkit/v1_7/BukkitQueue17.java @@ -72,9 +72,12 @@ public class BukkitQueue17 extends BukkitQueue_0 packets = null; - int mask = fc.getBitMask(); if (mask == 0 || mask == 65535 && hasEntities(nmsChunk)) { for (EntityPlayer player : players) { int currentVersion = player.playerConnection.networkManager.getVersion(); @@ -404,6 +428,13 @@ public class BukkitQueue17 extends BukkitQueue_0 skyToRelight; private final Map> lightQueue; private final Object present = new Object(); - private final Set chunksToSend; + private final HashMap chunksToSend; private final int maxY; private volatile boolean relighting = false; @@ -37,7 +35,7 @@ public class NMSRelighter implements Relighter{ this.queue = queue; this.skyToRelight = new ConcurrentHashMap<>(); this.lightQueue = new ConcurrentHashMap<>(); - chunksToSend = new LinkedHashSet<>(); + chunksToSend = new HashMap<>(); this.maxY = queue.getMaxY(); } @@ -66,8 +64,10 @@ public class NMSRelighter implements Relighter{ while (iter.hasNext()) { Map.Entry entry = iter.next(); iter.remove(); - chunksToSend.add(entry.getKey()); RelightSkyEntry chunk = entry.getValue(); + long pair = entry.getKey(); + Integer existing = chunksToSend.get(pair); + chunksToSend.put(pair, chunk.bitmask | (existing != null ? existing : 0)); queue.ensureChunkLoaded(chunk.x, chunk.z); Object sections = queue.getCachedSections(queue.getWorld(), chunk.x, chunk.z); queue.removeLighting(sections, FaweQueue.RelightMode.ALL, queue.hasSky()); @@ -217,14 +217,15 @@ public class NMSRelighter implements Relighter{ } public void sendChunks() { - Iterator iter = chunksToSend.iterator(); + Iterator> iter = chunksToSend.entrySet().iterator(); while (iter.hasNext()) { - long pair = iter.next(); + Map.Entry entry = iter.next(); + long pair = entry.getKey(); + int bitMask = entry.getValue(); iter.remove(); int x = MathMan.unpairIntX(pair); int z = MathMan.unpairIntY(pair); - CharFaweChunk fc = (CharFaweChunk) queue.getFaweChunk(x, z); - queue.sendChunk(fc); + queue.sendChunk(x, z, bitMask); } } @@ -239,7 +240,7 @@ public class NMSRelighter implements Relighter{ while (iter.hasNext()) { Map.Entry entry = iter.next(); iter.remove(); - chunksToSend.add(entry.getKey()); + chunksToSend.put(entry.getKey(), entry.getValue().bitmask); chunksList.add(entry.getValue()); } Collections.sort(chunksList); 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 d5a282a7..557dc0a4 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 @@ -238,6 +238,13 @@ public class MCAQueue extends NMSMappedFaweQueue> 4; + this.layers = (this.world.getMaxY() + 1) >> 4; } public World getWorld() { @@ -221,41 +221,39 @@ public abstract class FaweChangeSet implements ChangeSet { // TODO } // Block changes - { - // Current blocks + // Current blocks // char[][] currentIds = next.getCombinedIdArrays(); - // Previous blocks in modified sections (i.e. we skip sections that weren't modified) + // Previous blocks in modified sections (i.e. we skip sections that weren't modified) // char[][] previousIds = previous.getCombinedIdArrays(); - for (int layer = 0; layer < layers; layer++) { - char[] currentLayer = next.getIdArray(layer); - char[] previousLayer = previous.getIdArray(layer); - if (currentLayer == null) { - continue; - } - int startY = layer << 4; - for (int y = 0; y < 16; y++) { - short[][] i1 = FaweCache.CACHE_J[y]; - int yy = y + startY; - for (int z = 0; z < 16; z++) { - int zz = z + bz; - short[] i2 = i1[z]; - for (int x = 0; x < 16; x++) { - int xx = x + bx; - int index = i2[x]; - int combinedIdCurrent = currentLayer[index]; - switch (combinedIdCurrent) { - case 0: - continue; - case 1: - combinedIdCurrent = 0; - default: - char combinedIdPrevious = previousLayer != null ? previousLayer[index] : 0; - if (combinedIdCurrent != combinedIdPrevious) { - synchronized (lockCombined) { - add(xx, yy, zz, combinedIdPrevious, combinedIdCurrent); - } + for (int layer = 0; layer < layers; layer++) { + char[] currentLayer = next.getIdArray(layer); + char[] previousLayer = previous.getIdArray(layer); + if (currentLayer == null) { + continue; + } + int startY = layer << 4; + for (int y = 0; y < 16; y++) { + short[][] i1 = FaweCache.CACHE_J[y]; + int yy = y + startY; + for (int z = 0; z < 16; z++) { + int zz = z + bz; + short[] i2 = i1[z]; + for (int x = 0; x < 16; x++) { + int xx = x + bx; + int index = i2[x]; + int combinedIdCurrent = currentLayer[index]; + switch (combinedIdCurrent) { + case 0: + continue; + case 1: + combinedIdCurrent = 0; + default: + char combinedIdPrevious = previousLayer != null ? previousLayer[index] : 0; + if (combinedIdCurrent != combinedIdPrevious) { + synchronized (lockCombined) { + add(xx, yy, zz, combinedIdPrevious, combinedIdCurrent); } - } + } } } } diff --git a/core/src/main/java/com/boydti/fawe/util/DelegateFaweQueue.java b/core/src/main/java/com/boydti/fawe/util/DelegateFaweQueue.java index e3df0dcf..f70ae0ce 100644 --- a/core/src/main/java/com/boydti/fawe/util/DelegateFaweQueue.java +++ b/core/src/main/java/com/boydti/fawe/util/DelegateFaweQueue.java @@ -34,6 +34,11 @@ public class DelegateFaweQueue extends FaweQueue { setWorld(parent.getWorldName()); } + @Override + public void sendChunk(int x, int z, int bitMask) { + parent.sendChunk(x, z, bitMask); + } + @Override public String getWorldName() { return parent.getWorldName(); diff --git a/forge110/src/main/java/com/boydti/fawe/forge/v110/ForgeQueue_All.java b/forge110/src/main/java/com/boydti/fawe/forge/v110/ForgeQueue_All.java index 5a08ffe2..8dc482d8 100644 --- a/forge110/src/main/java/com/boydti/fawe/forge/v110/ForgeQueue_All.java +++ b/forge110/src/main/java/com/boydti/fawe/forge/v110/ForgeQueue_All.java @@ -61,9 +61,11 @@ public class ForgeQueue_All extends NMSMappedFaweQueue converter = Class.forName("com.sk89q.worldedit.forge.NBTConverter"); methodFromNative = converter.getDeclaredMethod("toNative", Tag.class); methodToNative = converter.getDeclaredMethod("fromNative", NBTBase.class); @@ -354,11 +356,25 @@ public class ForgeQueue_All extends NMSMappedFaweQueue converter = Class.forName("com.sk89q.worldedit.forge.NBTConverter"); methodFromNative = converter.getDeclaredMethod("toNative", Tag.class); methodToNative = converter.getDeclaredMethod("fromNative", NBTBase.class); @@ -431,11 +432,25 @@ public class ForgeQueue_All extends NMSMappedFaweQueue converter = Class.forName("com.sk89q.worldedit.forge.NBTConverter"); - this.methodFromNative = converter.getDeclaredMethod("toNative", Tag.class); - this.methodToNative = converter.getDeclaredMethod("fromNative", NBTBase.class); - methodFromNative.setAccessible(true); - methodToNative.setAccessible(true); - } catch (Throwable e) { - throw new RuntimeException(e); - } + static { + try { + emptySection = new ExtendedBlockStorage(0, false); + Class converter = Class.forName("com.sk89q.worldedit.forge.NBTConverter"); + methodFromNative = converter.getDeclaredMethod("toNative", Tag.class); + methodToNative = converter.getDeclaredMethod("fromNative", NBTBase.class); + methodFromNative.setAccessible(true); + methodToNative.setAccessible(true); + } catch (Throwable e) { + throw new RuntimeException(e); } - getImpWorld(); } @Override @@ -236,11 +235,25 @@ public class ForgeQueue_All extends NMSMappedFaweQueue converter = Class.forName("com.sk89q.worldedit.forge.NBTConverter"); methodFromNative = converter.getDeclaredMethod("toNative", Tag.class); methodToNative = converter.getDeclaredMethod("fromNative", NBTBase.class); @@ -295,11 +297,25 @@ public class ForgeQueue_All extends NMSMappedFaweQueue converter = Class.forName("com.sk89q.worldedit.forge.NBTConverter"); methodFromNative = converter.getDeclaredMethod("toNative", Tag.class); methodToNative = converter.getDeclaredMethod("fromNative", NBTBase.class); @@ -352,11 +354,25 @@ public class ForgeQueue_All extends NMSMappedFaweQueue players = faweNukkit.getPlugin().getServer().getOnlinePlayers().values(); int view = faweNukkit.getPlugin().getServer().getViewDistance(); for (Player player : players) { Position pos = player.getPosition(); int pcx = pos.getFloorX() >> 4; int pcz = pos.getFloorZ() >> 4; - if (Math.abs(pcx - fs.getX()) > view || Math.abs(pcz - fs.getZ()) > view) { + if (Math.abs(pcx - x) > view || Math.abs(pcz - z) > view) { continue; } - world.requestChunk(fs.getX(), fs.getZ(), player); + world.requestChunk(x, z, player); } } + @Override + public void refreshChunk(FaweChunk fs) { + sendChunk(fs.getX(), fs.getZ(), fs.getBitMask()); + } + @Override public CharFaweChunk getPrevious(CharFaweChunk fs, BaseFullChunk sections, Map tiles, Collection[] entities, Set createdEntities, boolean all) throws Exception { return fs;