diff --git a/build.gradle b/build.gradle index 884c99d6..47cba7b3 100644 --- a/build.gradle +++ b/build.gradle @@ -6,14 +6,21 @@ buildscript { } dependencies { classpath 'com.github.jengelman.gradle.plugins:shadow:1.2.3' + classpath 'org.ajoberstar:grgit:1.1.0' } + } apply plugin: 'java' clean { delete "target" } group = 'com.boydti.fawe' -version = '3.4.3' +def revision = "" +ext { + git = org.ajoberstar.grgit.Grgit.open(file(".git/")) + revision = "-${git.head().abbreviatedId}" +} +version = "3.5.0${revision}" description = """FastAsyncWorldEdit""" subprojects { 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 fae13b97..730e6c4e 100644 --- a/bukkit0/src/main/java/com/boydti/fawe/bukkit/FaweBukkit.java +++ b/bukkit0/src/main/java/com/boydti/fawe/bukkit/FaweBukkit.java @@ -191,6 +191,9 @@ public class FaweBukkit implements IFawe, Listener { try { return plugin.getQueue(world); } catch (Throwable ignore) {} + // Disable incompatible settings + Settings.PARALLEL_THREADS = 1; // BukkitAPI placer is too slow to parallel thread at the chunk level + Settings.COMBINE_HISTORY_STAGE = false; // Performing a chunk copy (if possible) wouldn't be faster using the BukkitAPI if (hasNMS) { debug("====== NO NMS BLOCK PLACER FOUND ======"); debug("FAWE couldn't find a fast block placer"); diff --git a/bukkit0/src/main/java/com/boydti/fawe/bukkit/v0/BukkitQueue_0.java b/bukkit0/src/main/java/com/boydti/fawe/bukkit/v0/BukkitQueue_0.java index 5392e4f9..bc8c641b 100644 --- a/bukkit0/src/main/java/com/boydti/fawe/bukkit/v0/BukkitQueue_0.java +++ b/bukkit0/src/main/java/com/boydti/fawe/bukkit/v0/BukkitQueue_0.java @@ -35,6 +35,14 @@ public abstract class BukkitQueue_0 extends NMSMa setupAdapter(null); } + public void checkVersion(String supported) { + String version = Bukkit.getServer().getClass().getPackage().getName(); + if (!version.contains(supported)) { + Fawe.debug("This version of FAWE is for: " + supported); + throw new IllegalStateException("Unsupported version: " + version + " (supports: " + supported + ")"); + } + } + public void setupAdapter(BukkitImplAdapter adapter) { try { WorldEditPlugin instance = (WorldEditPlugin) Bukkit.getPluginManager().getPlugin("WorldEdit"); @@ -58,7 +66,6 @@ public abstract class BukkitQueue_0 extends NMSMa } } } catch (Throwable e) { - e.printStackTrace(); Fawe.debug("====== NO NATIVE WORLDEDIT ADAPTER ======"); Fawe.debug("Try updating WorldEdit: "); Fawe.debug(" - http://builds.enginehub.org/job/worldedit?branch=master"); @@ -208,6 +215,7 @@ public abstract class BukkitQueue_0 extends NMSMa } if (more) { fc.addToQueue(); + return true; } // Biomes diff --git a/bukkit18/build.gradle b/bukkit18/build.gradle index c84fbbe5..b756423d 100644 --- a/bukkit18/build.gradle +++ b/bukkit18/build.gradle @@ -11,7 +11,7 @@ shadowJar { include(dependency(':bukkit0')) include(dependency(':core')) } - archiveName = "${parent.name}-${project.name}.jar" + archiveName = "${parent.name}-${project.name}-${parent.version}.jar" destinationDir = file '../target' } shadowJar.doLast { diff --git a/bukkit18/src/main/java/com/boydti/fawe/bukkit/v1_8/BukkitQueue18R3.java b/bukkit18/src/main/java/com/boydti/fawe/bukkit/v1_8/BukkitQueue18R3.java index a3d4ddfa..6b34a306 100644 --- a/bukkit18/src/main/java/com/boydti/fawe/bukkit/v1_8/BukkitQueue18R3.java +++ b/bukkit18/src/main/java/com/boydti/fawe/bukkit/v1_8/BukkitQueue18R3.java @@ -49,6 +49,7 @@ public class BukkitQueue18R3 extends BukkitQueue_0 fc = (CharFaweChunk) chunk; CraftChunk craftChunk = (CraftChunk) fc.getChunk(); @@ -395,13 +400,11 @@ public class BukkitQueue18R3 extends BukkitQueue_0= 4096 && fc.getAir(j) == 0)) { + if (((fc.getRelight(j) == 0) && mode == RelightMode.MINIMAL) || (fc.getCount(j) == 0 && mode != RelightMode.ALL) || ((fc.getCount(j) >= 4096) && (fc.getAir(j) == 0)) || fc.getAir(j) == 4096) { continue; } char[] array = section.getIdArray(); - int l = PseudoRandom.random.random(2); - for (int k = 0; k < array.length; k++) { - int i = array[k]; - if (i < 16) { - continue; + if (mode == RelightMode.ALL) { + for (int k = array.length - 1; k >= 0; k--) { + final int x = FaweCache.CACHE_X[j][k]; + final int y = FaweCache.CACHE_Y[j][k]; + final int z = FaweCache.CACHE_Z[j][k]; + if (isSurrounded(sections, x, y, z)) { + continue; + } + pos.c(X + x, y, Z + z); + nmsWorld.x(pos); } - short id = (short) (i >> 4); + continue; + } + for (int k = array.length - 1; k >= 0; k--) { + final int i = array[k]; + final short id = (short) (i >> 4); switch (id) { // Lighting + case 0: + continue; default: if (mode == RelightMode.MINIMAL) { continue; } - if ((k & 1) == l) { - l = 1 - l; + if (PseudoRandom.random.random(3) != 0) { continue; } case 10: @@ -456,9 +469,9 @@ public class BukkitQueue18R3 extends BukkitQueue_0 { @@ -55,20 +54,19 @@ public class BukkitQueue_1_9_R1 extends BukkitQueue_0= 0; j--) { final Object section = sections[j]; if (section == null) { continue; } - if (((bc.getRelight(j) == 0) && mode == RelightMode.MINIMAL) || (bc.getCount(j) == 0 && mode != RelightMode.ALL) || ((bc.getCount(j) >= 4096) && (bc.getAir(j) == 0))) { + if (((bc.getRelight(j) == 0) && mode == RelightMode.MINIMAL) || (bc.getCount(j) == 0 && mode != RelightMode.ALL) || ((bc.getCount(j) >= 4096) && (bc.getAir(j) == 0)) || bc.getAir(j) == 4096) { continue; } final char[] array = bc.getIdArray(j); if (array == null) { continue; } - int l = PseudoRandom.random.random(2); - for (int k = 0; k < array.length; k++) { - final int i = array[k]; - if (i < 16) { - continue; + if (mode == RelightMode.ALL) { + for (int k = array.length - 1; k >= 0; k--) { + final int x = FaweCache.CACHE_X[j][k]; + final int y = FaweCache.CACHE_Y[j][k]; + final int z = FaweCache.CACHE_Z[j][k]; + if (this.isSurrounded(bc.getCombinedIdArrays(), x, y, z)) { + continue; + } + pos.c(X + x, y, Z + z); + w.w(pos); } + continue; + } + for (int k = array.length - 1; k >= 0; k--) { + final int i = array[k]; final short id = (short) (i >> 4); switch (id) { // Lighting case 0: @@ -162,8 +170,7 @@ public class BukkitQueue_1_9_R1 extends BukkitQueue_0 extends FaweQueue { public abstract boolean regenerateChunk(WORLD world, int x, int z); - public abstract void sendChunk(FaweChunk chunk); - public abstract boolean setComponents(FaweChunk fc, RunnableVal changeTask); @Override @@ -344,13 +341,6 @@ public abstract class MappedFaweQueue extends FaweQueue { chunks.add((FaweChunk) chunk); } - public Collection sendChunk(Collection fcs) { - for (final FaweChunk fc : fcs) { - sendChunk(fc); - } - return new ArrayList<>(); - } - public int lastChunkX = Integer.MIN_VALUE; public int lastChunkZ = Integer.MIN_VALUE; public int lastChunkY = Integer.MIN_VALUE; diff --git a/core/src/main/java/com/boydti/fawe/example/NMSMappedFaweQueue.java b/core/src/main/java/com/boydti/fawe/example/NMSMappedFaweQueue.java index aa89e0b7..adbf9cc9 100644 --- a/core/src/main/java/com/boydti/fawe/example/NMSMappedFaweQueue.java +++ b/core/src/main/java/com/boydti/fawe/example/NMSMappedFaweQueue.java @@ -15,16 +15,20 @@ public abstract class NMSMappedFaweQueue ex } @Override - public void sendChunk(final FaweChunk fc) { + public void sendChunk(final FaweChunk fc, RelightMode mode) { + if (mode == null) { + mode = Settings.FIX_ALL_LIGHTING ? FaweQueue.RelightMode.OPTIMAL : FaweQueue.RelightMode.MINIMAL; + } + final RelightMode finalMode = mode; TaskManager.IMP.taskSyncSoon(new Runnable() { @Override public void run() { - final boolean result = fixLighting(fc, Settings.FIX_ALL_LIGHTING ? FaweQueue.RelightMode.OPTIMAL : FaweQueue.RelightMode.MINIMAL) || !Settings.ASYNC_LIGHTING; + final boolean result = finalMode == RelightMode.NONE || fixLighting(fc, finalMode); TaskManager.IMP.taskSyncNow(new Runnable() { @Override public void run() { if (!result) { - fixLighting(fc, Settings.FIX_ALL_LIGHTING ? FaweQueue.RelightMode.OPTIMAL : FaweQueue.RelightMode.MINIMAL); + fixLighting(fc, finalMode); } CHUNK chunk = (CHUNK) fc.getChunk(); refreshChunk(getWorld(), chunk); diff --git a/core/src/main/java/com/boydti/fawe/object/clipboard/DiskOptimizedClipboard.java b/core/src/main/java/com/boydti/fawe/object/clipboard/DiskOptimizedClipboard.java index db25ec50..6c8916eb 100644 --- a/core/src/main/java/com/boydti/fawe/object/clipboard/DiskOptimizedClipboard.java +++ b/core/src/main/java/com/boydti/fawe/object/clipboard/DiskOptimizedClipboard.java @@ -55,26 +55,22 @@ public class DiskOptimizedClipboard extends FaweClipboard { this(width, height, length, new File(Fawe.imp().getDirectory(), "clipboard" + File.separator + uuid)); } - public DiskOptimizedClipboard(File file) { + public DiskOptimizedClipboard(File file) throws IOException { nbtMap = new HashMap<>(); entities = new HashSet<>();this.buffer = new byte[2]; this.file = file; this.lastAccessed = System.currentTimeMillis(); - try { - this.raf = new BufferedRandomAccessFile(file, "rw", Settings.BUFFER_SIZE); - raf.setLength(file.length()); - long size = (raf.length() - HEADER_SIZE) >> 1; - raf.seek(0); - last = -1; - raf.read(buffer); - width = (((buffer[1] & 0xFF) << 8) + ((buffer[0] & 0xFF))); - raf.read(buffer); - length = (((buffer[1] & 0xFF) << 8) + ((buffer[0] & 0xFF))); - height = (int) (size / (width * length)); - area = width * length; - } catch (IOException e) { - e.printStackTrace(); - } + this.raf = new BufferedRandomAccessFile(file, "rw", Settings.BUFFER_SIZE); + raf.setLength(file.length()); + long size = (raf.length() - HEADER_SIZE) >> 1; + raf.seek(0); + last = -1; + raf.read(buffer); + width = (((buffer[1] & 0xFF) << 8) + ((buffer[0] & 0xFF))); + raf.read(buffer); + length = (((buffer[1] & 0xFF) << 8) + ((buffer[0] & 0xFF))); + height = (int) (size / (width * length)); + area = width * length; autoCloseTask(); } diff --git a/core/src/main/java/com/boydti/fawe/util/FaweQueue.java b/core/src/main/java/com/boydti/fawe/util/FaweQueue.java index aa3aaffd..3a4299e9 100644 --- a/core/src/main/java/com/boydti/fawe/util/FaweQueue.java +++ b/core/src/main/java/com/boydti/fawe/util/FaweQueue.java @@ -22,6 +22,7 @@ public abstract class FaweQueue { } public enum RelightMode { + NONE, MINIMAL, OPTIMAL, ALL, @@ -124,6 +125,8 @@ public abstract class FaweQueue { // Unload chunks } + public abstract void sendChunk(FaweChunk chunk, RelightMode mode); + /** * This method is called when the server is < 1% available memory */ diff --git a/forge1710/build.gradle b/forge1710/build.gradle index 4efa2409..74d0d679 100644 --- a/forge1710/build.gradle +++ b/forge1710/build.gradle @@ -52,7 +52,7 @@ shadowJar { include(dependency(':core')) include(dependency('org.yaml:snakeyaml:1.16')) } - archiveName = "${parent.name}-${project.name}.jar" + archiveName = "${parent.name}-${project.name}-${parent.version}.jar" destinationDir = file '../target' } shadowJar.doLast { diff --git a/forge189/build.gradle b/forge189/build.gradle index 89b63c58..8381e62b 100644 --- a/forge189/build.gradle +++ b/forge189/build.gradle @@ -61,7 +61,7 @@ shadowJar { include(dependency(':core')) include(dependency('org.yaml:snakeyaml:1.16')) } - archiveName = "${parent.name}-${project.name}.jar" + archiveName = "${parent.name}-${project.name}-${parent.version}.jar" destinationDir = file '../target' } shadowJar.doLast { diff --git a/sponge/build.gradle b/sponge/build.gradle index 35f67203..f3ef23fb 100644 --- a/sponge/build.gradle +++ b/sponge/build.gradle @@ -67,7 +67,7 @@ shadowJar { include(dependency(':core')) include(dependency('org.yaml:snakeyaml:1.16')) } - archiveName = "${parent.name}-${project.name}.jar" + archiveName = "${parent.name}-${project.name}-${parent.version}.jar" destinationDir = file '../target' } shadowJar.doLast {