diff --git a/build.gradle b/build.gradle index 198e19a0..6503c89e 100644 --- a/build.gradle +++ b/build.gradle @@ -10,7 +10,7 @@ buildscript { } group = 'com.boydti.fawe' -version = '3.3.20' +version = '3.3.21' description = """FastAsyncWorldEdit""" subprojects { diff --git a/bukkit/build/resources/main/plugin.yml b/bukkit/build/resources/main/plugin.yml index 0153138e..fc0da240 100644 --- a/bukkit/build/resources/main/plugin.yml +++ b/bukkit/build/resources/main/plugin.yml @@ -1,6 +1,6 @@ name: FastAsyncWorldEdit main: com.boydti.fawe.bukkit.FaweBukkit -version: 3.3.20 +version: 3.3.21 description: Fast Async WorldEdit plugin authors: [Empire92] loadbefore: [WorldEdit] 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 aa6a6d0c..a36ab31a 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 @@ -423,7 +423,9 @@ public class BukkitQueue_1_8 extends BukkitQueue_All { }, 1); return true; } catch (final Exception e) { - e.printStackTrace(); + if (Thread.currentThread() == Fawe.get().getMainThread()) { + e.printStackTrace(); + } } return false; } 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 a8efeee5..4ab80c10 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 @@ -212,7 +212,9 @@ public class BukkitQueue_1_9 extends BukkitQueue_All { } return true; } catch (final Throwable e) { - e.printStackTrace(); + if (Thread.currentThread() == Fawe.get().getMainThread()) { + e.printStackTrace(); + } } return false; } 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 ac095223..ad7364a8 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 @@ -185,7 +185,9 @@ public class BukkitQueue_1_9_R1 extends BukkitQueue_All { } return true; } catch (final Throwable e) { - e.printStackTrace(); + if (Thread.currentThread() == Fawe.get().getMainThread()) { + e.printStackTrace(); + } } return false; } diff --git a/bukkit/src/main/resources/plugin.yml b/bukkit/src/main/resources/plugin.yml index 0153138e..fc0da240 100644 --- a/bukkit/src/main/resources/plugin.yml +++ b/bukkit/src/main/resources/plugin.yml @@ -1,6 +1,6 @@ name: FastAsyncWorldEdit main: com.boydti.fawe.bukkit.FaweBukkit -version: 3.3.20 +version: 3.3.21 description: Fast Async WorldEdit plugin authors: [Empire92] loadbefore: [WorldEdit] 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 c94c589b..d0f38af6 100644 --- a/core/src/main/java/com/boydti/fawe/util/TaskManager.java +++ b/core/src/main/java/com/boydti/fawe/util/TaskManager.java @@ -56,4 +56,38 @@ public abstract class TaskManager { } }); } + + public T sync(final RunnableVal function) { + if (Fawe.get().getMainThread() == Thread.currentThread()) { + function.run(); + return function.value; + } + RunnableVal run = new RunnableVal() { + @Override + public void run(RuntimeException value) { + try { + function.run(); + } catch (RuntimeException e) { + this.value = e; + } catch (Throwable neverHappens) { + neverHappens.printStackTrace(); + } + synchronized (function) { + function.notifyAll(); + } + } + }; + TaskManager.IMP.task(run); + if (run.value != null) { + throw run.value; + } + try { + synchronized (function) { + function.wait(15000); + } + } catch (InterruptedException e) { + e.printStackTrace(); + } + return function.value; + } } diff --git a/core/src/main/java/com/boydti/fawe/wrappers/WorldWrapper.java b/core/src/main/java/com/boydti/fawe/wrappers/WorldWrapper.java index 329c4b14..ea0dec4a 100644 --- a/core/src/main/java/com/boydti/fawe/wrappers/WorldWrapper.java +++ b/core/src/main/java/com/boydti/fawe/wrappers/WorldWrapper.java @@ -90,28 +90,73 @@ public class WorldWrapper extends AbstractWorld { } @Override - public boolean generateTree(EditSession editSession, Vector pt) throws MaxChangedBlocksException { - return parent.generateTree(editSession, pt); + public boolean generateTree(final EditSession editSession, final Vector pt) throws MaxChangedBlocksException { + return TaskManager.IMP.sync(new RunnableVal() { + @Override + public void run(Boolean ignore) { + try { + this.value = parent.generateTree(editSession, pt); + } catch (MaxChangedBlocksException e) { + e.printStackTrace(); + } + } + }); } @Override - public boolean generateBigTree(EditSession editSession, Vector pt) throws MaxChangedBlocksException { - return parent.generateBigTree(editSession, pt); + public boolean generateBigTree(final EditSession editSession, final Vector pt) throws MaxChangedBlocksException { + return TaskManager.IMP.sync(new RunnableVal() { + @Override + public void run(Boolean ignore) { + try { + this.value = parent.generateBigTree(editSession, pt); + } catch (MaxChangedBlocksException e) { + e.printStackTrace(); + } + } + }); } @Override - public boolean generateBirchTree(EditSession editSession, Vector pt) throws MaxChangedBlocksException { - return parent.generateBirchTree(editSession, pt); + public boolean generateBirchTree(final EditSession editSession, final Vector pt) throws MaxChangedBlocksException { + return TaskManager.IMP.sync(new RunnableVal() { + @Override + public void run(Boolean ignore) { + try { + this.value = parent.generateBirchTree(editSession, pt); + } catch (MaxChangedBlocksException e) { + e.printStackTrace(); + } + } + }); } @Override - public boolean generateRedwoodTree(EditSession editSession, Vector pt) throws MaxChangedBlocksException { - return parent.generateRedwoodTree(editSession, pt); + public boolean generateRedwoodTree(final EditSession editSession, final Vector pt) throws MaxChangedBlocksException { + return TaskManager.IMP.sync(new RunnableVal() { + @Override + public void run(Boolean ignore) { + try { + this.value = parent.generateRedwoodTree(editSession, pt); + } catch (MaxChangedBlocksException e) { + e.printStackTrace(); + } + } + }); } @Override - public boolean generateTallRedwoodTree(EditSession editSession, Vector pt) throws MaxChangedBlocksException { - return parent.generateTallRedwoodTree(editSession, pt); + public boolean generateTallRedwoodTree(final EditSession editSession, final Vector pt) throws MaxChangedBlocksException { + return TaskManager.IMP.sync(new RunnableVal() { + @Override + public void run(Boolean ignore) { + try { + this.value = parent.generateTallRedwoodTree(editSession, pt); + } catch (MaxChangedBlocksException e) { + e.printStackTrace(); + } + } + }); } @Override @@ -293,8 +338,17 @@ public class WorldWrapper extends AbstractWorld { } @Override - public boolean generateTree(TreeGenerator.TreeType type, EditSession editSession, Vector position) throws MaxChangedBlocksException { - return parent.generateTree(type, editSession, position); + public boolean generateTree(final TreeGenerator.TreeType type, final EditSession editSession, final Vector position) throws MaxChangedBlocksException { + return TaskManager.IMP.sync(new RunnableVal() { + @Override + public void run(Boolean ignore) { + try { + this.value = parent.generateTree(editSession, position); + } catch (MaxChangedBlocksException e) { + e.printStackTrace(); + } + } + }); } @Override diff --git a/forge/src/main/java/com/boydti/fawe/forge/SpongeMain.java b/forge/src/main/java/com/boydti/fawe/forge/SpongeMain.java index 81521f77..a6634366 100644 --- a/forge/src/main/java/com/boydti/fawe/forge/SpongeMain.java +++ b/forge/src/main/java/com/boydti/fawe/forge/SpongeMain.java @@ -18,7 +18,7 @@ import org.spongepowered.api.plugin.PluginContainer; import org.spongepowered.api.profile.GameProfileManager; import org.spongepowered.api.world.World; -@Plugin(id = "com.boydti.fawe", name = "FastAsyncWorldEdit", description = "Lagless WorldEdit, Area restrictions, Memory mangement, Block logging", url = "https://github.com/boy0001/FastAsyncWorldedit", version = "3.3.20") +@Plugin(id = "com.boydti.fawe", name = "FastAsyncWorldEdit", description = "Lagless WorldEdit, Area restrictions, Memory mangement, Block logging", url = "https://github.com/boy0001/FastAsyncWorldedit", version = "3.3.21") public class SpongeMain { public PluginContainer plugin; diff --git a/pom.xml b/pom.xml index 8610c1b1..fa993689 100644 --- a/pom.xml +++ b/pom.xml @@ -8,7 +8,7 @@ UTF-8 FastAsyncWorldEdit - 3.3.20 + 3.3.21 FastAsyncWorldEdit jar