diff --git a/bukkit/src/main/java/com/boydti/fawe/bukkit/v1_8/BukkitQueue_1_8.java b/bukkit/src/main/java/com/boydti/fawe/bukkit/v1_8/BukkitQueue_1_8.java index 9191cd4e..13ebc854 100644 --- a/bukkit/src/main/java/com/boydti/fawe/bukkit/v1_8/BukkitQueue_1_8.java +++ b/bukkit/src/main/java/com/boydti/fawe/bukkit/v1_8/BukkitQueue_1_8.java @@ -108,7 +108,7 @@ public class BukkitQueue_1_8 extends BukkitQueue_0 { bukkitWorld = Bukkit.getServer().getWorld(world); } if (!bukkitWorld.isChunkLoaded(loc.x, loc.z)) { - bukkitWorld.loadChunk(loc.x, loc.z); + bukkitWorld.loadChunk(loc.x, loc.z, true); } } loadQueue.notifyAll(); @@ -177,29 +177,39 @@ public class BukkitQueue_1_8 extends BukkitQueue_0 { return new ArrayList<>(); } - public void sendChunk(FaweChunk fc) { - fixLighting(fc, Settings.FIX_ALL_LIGHTING); - Chunk chunk = fc.getChunk(); - World world = chunk.getWorld(); - final int view = Bukkit.getServer().getViewDistance(); - int cx = chunk.getX(); - int cz = chunk.getZ(); - for (final Player player : Bukkit.getOnlinePlayers()) { - if (!player.getWorld().equals(world)) { - continue; + public void sendChunk(final FaweChunk fc) { + TaskManager.IMP.task(new Runnable() { + @Override + public void run() { + fixLighting(fc, Settings.FIX_ALL_LIGHTING); + TaskManager.IMP.task(new Runnable() { + @Override + public void run() { + Chunk chunk = fc.getChunk(); + World world = chunk.getWorld(); + final int view = Bukkit.getServer().getViewDistance(); + int cx = chunk.getX(); + int cz = chunk.getZ(); + for (final Player player : Bukkit.getOnlinePlayers()) { + if (!player.getWorld().equals(world)) { + continue; + } + final Location loc = player.getLocation(); + final int px = loc.getBlockX() >> 4; + final int pz = loc.getBlockZ() >> 4; + if ((Math.abs(cx - px) > view) || (Math.abs(cz - pz) > view)) { + continue; + } + final Object entity = methodGetHandlePlayer.of(player).call(); + final RefExecutor con = send.of(connection.of(entity).get()); + final Object c = methodGetHandleChunk.of(fc.getChunk()).call(); + Object packet = MapChunk.create(c, false, 65535); + con.call(packet); + } + } + }, false); } - final Location loc = player.getLocation(); - final int px = loc.getBlockX() >> 4; - final int pz = loc.getBlockZ() >> 4; - if ((Math.abs(cx - px) > view) || (Math.abs(cz - pz) > view)) { - continue; - } - final Object entity = this.methodGetHandlePlayer.of(player).call(); - final RefExecutor con = this.send.of(this.connection.of(entity).get()); - final Object c = this.methodGetHandleChunk.of(fc.getChunk()).call(); - Object packet = this.MapChunk.create(c, false, 65535); - con.call(packet); - } + }, Settings.ASYNC_LIGHTING); } @Override diff --git a/bukkit/src/main/java/com/boydti/fawe/bukkit/v1_9/BukkitQueue_1_9.java b/bukkit/src/main/java/com/boydti/fawe/bukkit/v1_9/BukkitQueue_1_9.java index 9df73a7b..c38773fd 100644 --- a/bukkit/src/main/java/com/boydti/fawe/bukkit/v1_9/BukkitQueue_1_9.java +++ b/bukkit/src/main/java/com/boydti/fawe/bukkit/v1_9/BukkitQueue_1_9.java @@ -98,7 +98,7 @@ public class BukkitQueue_1_9 extends BukkitQueue_0 { bukkitWorld = Bukkit.getServer().getWorld(world); } if (!bukkitWorld.isChunkLoaded(loc.x, loc.z)) { - bukkitWorld.loadChunk(loc.x, loc.z); + bukkitWorld.loadChunk(loc.x, loc.z, true); } } loadQueue.notifyAll(); @@ -166,10 +166,20 @@ public class BukkitQueue_1_9 extends BukkitQueue_0 { return new ArrayList<>(); } - public void sendChunk(FaweChunk fc) { - fixLighting(fc, Settings.FIX_ALL_LIGHTING); - final Chunk chunk = fc.getChunk(); - chunk.getWorld().refreshChunk(fc.getX(), fc.getZ()); + public void sendChunk(final FaweChunk fc) { + TaskManager.IMP.task(new Runnable() { + @Override + public void run() { + fixLighting(fc, Settings.FIX_ALL_LIGHTING); + TaskManager.IMP.task(new Runnable() { + @Override + public void run() { + final Chunk chunk = fc.getChunk(); + chunk.getWorld().refreshChunk(fc.getX(), fc.getZ()); + } + }, false); + } + }, Settings.ASYNC_LIGHTING); } @Override diff --git a/bukkit/src/main/java/com/boydti/fawe/bukkit/v1_9/BukkitQueue_1_9_R1.java b/bukkit/src/main/java/com/boydti/fawe/bukkit/v1_9/BukkitQueue_1_9_R1.java index 43ad13b5..50edfad0 100644 --- a/bukkit/src/main/java/com/boydti/fawe/bukkit/v1_9/BukkitQueue_1_9_R1.java +++ b/bukkit/src/main/java/com/boydti/fawe/bukkit/v1_9/BukkitQueue_1_9_R1.java @@ -60,7 +60,7 @@ public class BukkitQueue_1_9_R1 extends BukkitQueue_0 { bukkitWorld = Bukkit.getServer().getWorld(world); } if (!bukkitWorld.isChunkLoaded(loc.x, loc.z)) { - bukkitWorld.loadChunk(loc.x, loc.z); + bukkitWorld.loadChunk(loc.x, loc.z, true); } } loadQueue.notifyAll(); @@ -117,6 +117,9 @@ public class BukkitQueue_1_9_R1 extends BukkitQueue_0 { ChunkSection nibble = chunkSections[cy]; lastSection = nibble != null ? nibble.getBlocks() : null; } else if (cy != lcy) { + if (chunkSections == null) { + return 0; + } ChunkSection nibble = chunkSections[cy]; lastSection = nibble != null ? nibble.getBlocks() : null; } @@ -146,10 +149,20 @@ public class BukkitQueue_1_9_R1 extends BukkitQueue_0 { return new ArrayList<>(); } - public void sendChunk(FaweChunk fc) { - fixLighting(fc, Settings.FIX_ALL_LIGHTING); - final Chunk chunk = fc.getChunk(); - chunk.getWorld().refreshChunk(fc.getX(), fc.getZ()); + public void sendChunk(final FaweChunk fc) { + TaskManager.IMP.task(new Runnable() { + @Override + public void run() { + fixLighting(fc, Settings.FIX_ALL_LIGHTING); + TaskManager.IMP.task(new Runnable() { + @Override + public void run() { + final Chunk chunk = fc.getChunk(); + chunk.getWorld().refreshChunk(fc.getX(), fc.getZ()); + } + }, false); + } + }, Settings.ASYNC_LIGHTING); } @Override @@ -375,6 +388,8 @@ public class BukkitQueue_1_9_R1 extends BukkitQueue_0 { int data = lastId & 0xF; IBlockData ibd = Block.getById(id).fromLegacyData(data); lastBit = palette.a(ibd); + palette = (DataPalette) fieldPalette.get(nibble); + bits = (DataBits) fieldBits.get(nibble); } bits.a(i, lastBit); } @@ -390,20 +405,21 @@ public class BukkitQueue_1_9_R1 extends BukkitQueue_0 { case 0: int existingBit = bits.a(k); if (existingBit != lastBit) { + palette = (DataPalette) fieldPalette.get(nibble); + bits = (DataBits) fieldBits.get(nibble); lastBit = existingBit; IBlockData ibd = palette.a(existingBit); - if (ibd != null) { - Block block = ibd.getBlock(); - int id = Block.getId(block); - if (FaweCache.hasData(id)) { - lastId = (id << 4) + block.toLegacyData(ibd); - } else { - lastId = id << 4; - } - } else { + if (ibd == null) { fill = false; continue; } + Block block = ibd.getBlock(); + int id = Block.getId(block); + if (FaweCache.hasData(id)) { + lastId = (id << 4) + block.toLegacyData(ibd); + } else { + lastId = id << 4; + } } if (lastId != 0) { nonEmptyBlockCount++; @@ -420,6 +436,8 @@ public class BukkitQueue_1_9_R1 extends BukkitQueue_0 { int data = lastId & 0xF; IBlockData ibd = Block.getById(id).fromLegacyData(data); lastBit = palette.a(ibd); + palette = (DataPalette) fieldPalette.get(nibble); + bits = (DataBits) fieldBits.get(nibble); } bits.a(k, lastBit); continue; @@ -433,6 +451,8 @@ public class BukkitQueue_1_9_R1 extends BukkitQueue_0 { int data = lastId & 0xF; IBlockData ibd = Block.getById(id).fromLegacyData(data); lastBit = palette.a(ibd); + palette = (DataPalette) fieldPalette.get(nibble); + bits = (DataBits) fieldBits.get(nibble); } bits.a(k, lastBit); continue; diff --git a/core/src/main/java/com/boydti/fawe/config/Settings.java b/core/src/main/java/com/boydti/fawe/config/Settings.java index 5b2b19dd..9d33d3bf 100644 --- a/core/src/main/java/com/boydti/fawe/config/Settings.java +++ b/core/src/main/java/com/boydti/fawe/config/Settings.java @@ -16,7 +16,6 @@ import java.util.Map.Entry; public class Settings { public static boolean REQUIRE_SELECTION = false; - public static boolean FIX_ALL_LIGHTING = true; public static boolean COMMAND_PROCESSOR = false; public static List WE_BLACKLIST = Arrays.asList("cs", ".s", "restore", "snapshot", "delchunks", "listchunks"); public static long MEM_FREE = 95; @@ -33,6 +32,9 @@ public class Settings { public static int QUEUE_DISCARD_AFTER = 60000; public static List ALLOWED_3RDPARTY_EXTENTS; + public static boolean FIX_ALL_LIGHTING = true; + public static boolean ASYNC_LIGHTING = true; + public static HashMap limits; public static FaweLimit getLimit(FawePlayer player) { @@ -71,7 +73,8 @@ public class Settings { options.put("command-processor", COMMAND_PROCESSOR); options.put("max-memory-percent", MEM_FREE); options.put("crash-mitigation", ENABLE_HARD_LIMIT); - options.put("fix-all-lighting", FIX_ALL_LIGHTING); + options.put("lighting.fix-all", FIX_ALL_LIGHTING); + options.put("lighting.async", ASYNC_LIGHTING); options.put("history.use-disk", STORE_HISTORY_ON_DISK); options.put("history.compress", false); options.put("history.chunk-wait-ms", CHUNK_WAIT); @@ -99,7 +102,8 @@ public class Settings { config.set(node.getKey(), node.getValue()); } } - FIX_ALL_LIGHTING = config.getBoolean("fix-all-lighting"); + FIX_ALL_LIGHTING = config.getBoolean("lighting.fix-all"); + ASYNC_LIGHTING = config.getBoolean("lighting.async"); COMMAND_PROCESSOR = config.getBoolean("command-processor"); MEM_FREE = config.getInt("max-memory-percent"); REQUIRE_SELECTION = config.getBoolean("require-selection-in-mask"); diff --git a/core/src/main/java/com/boydti/fawe/util/TaskManager.java b/core/src/main/java/com/boydti/fawe/util/TaskManager.java index 8bd55f09..c94c589b 100644 --- a/core/src/main/java/com/boydti/fawe/util/TaskManager.java +++ b/core/src/main/java/com/boydti/fawe/util/TaskManager.java @@ -1,5 +1,6 @@ package com.boydti.fawe.util; +import com.boydti.fawe.Fawe; import com.boydti.fawe.object.RunnableVal; import java.util.Collection; import java.util.Iterator; @@ -16,6 +17,20 @@ public abstract class TaskManager { public abstract void task(final Runnable r); + public void task(final Runnable r, boolean async) { + if (async) { + async(r); + } else { + if (Fawe.get().getMainThread() == Thread.currentThread()) { + if (r != null) { + r.run(); + } + } else { + task(r); + } + } + } + public abstract void later(final Runnable r, final int delay); public abstract void laterAsync(final Runnable r, final int delay);