From dfdf71f8e34fcfb687ef70ff5ba75e8af90888ba Mon Sep 17 00:00:00 2001
From: Matthew Miller
Date: Thu, 23 Aug 2018 21:57:20 +1000
Subject: [PATCH] Try another method of queueing it up, and write a test
implementation for Drain.
---
.../bukkit/BukkitServerInterface.java | 4 +-
.../worldedit/bukkit/WorldEditPlugin.java | 2 +-
.../java/com/sk89q/worldedit/EditSession.java | 13 ++--
.../com/sk89q/worldedit/LocalSession.java | 46 -------------
.../java/com/sk89q/worldedit/WorldEdit.java | 29 ++++++++-
.../worldedit/command/UtilityCommands.java | 6 +-
.../operation/AffectedFutureOperation.java | 65 +++++++++++++++++++
.../operation/AffectingOperation.java | 30 +++++++++
.../function/operation/FlushOperation.java | 60 +++++++++++++++++
.../function/operation/OperationQueue.java | 29 ++++++++-
.../function/operation/Operations.java | 24 ++++++-
.../function/visitor/BreadthFirstSearch.java | 15 +++--
.../internal/command/WorldEditBinding.java | 19 +-----
.../worldedit/session/SessionManager.java | 11 +---
14 files changed, 259 insertions(+), 94 deletions(-)
create mode 100644 worldedit-core/src/main/java/com/sk89q/worldedit/function/operation/AffectedFutureOperation.java
create mode 100644 worldedit-core/src/main/java/com/sk89q/worldedit/function/operation/AffectingOperation.java
create mode 100644 worldedit-core/src/main/java/com/sk89q/worldedit/function/operation/FlushOperation.java
diff --git a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitServerInterface.java b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitServerInterface.java
index 94c0e43919..df5507d0d7 100644
--- a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitServerInterface.java
+++ b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitServerInterface.java
@@ -49,11 +49,13 @@ public class BukkitServerInterface implements MultiUserPlatform {
public WorldEditPlugin plugin;
private CommandRegistration dynamicCommands;
private boolean hookingEvents;
+ private Actor consoleSender;
public BukkitServerInterface(WorldEditPlugin plugin, Server server) {
this.plugin = plugin;
this.server = server;
dynamicCommands = new CommandRegistration(plugin);
+ this.consoleSender = plugin.wrapCommandSender(server.getConsoleSender());
}
boolean isHookingEvents() {
@@ -117,7 +119,7 @@ public BukkitWorld matchWorld(com.sk89q.worldedit.world.World world) {
@Override
public Actor getConsoleCommandSender() {
- return plugin.wrapCommandSender(Bukkit.getConsoleSender());
+ return consoleSender;
}
@Override
diff --git a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/WorldEditPlugin.java b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/WorldEditPlugin.java
index 576417648d..c2406a2117 100644
--- a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/WorldEditPlugin.java
+++ b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/WorldEditPlugin.java
@@ -105,7 +105,7 @@ public void onEnable() {
// platforms to be worried about... at the current time of writing
WorldEdit.getInstance().getEventBus().post(new PlatformReadyEvent());
- Bukkit.getScheduler().runTaskTimer(this, () -> WorldEdit.getInstance().getSessionManager().tickQueues(), 1, 1);
+ Bukkit.getScheduler().runTaskTimer(this, () -> WorldEdit.getInstance().tickOperationQueues(), 1, 1);
}
private void loadConfig() {
diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/EditSession.java b/worldedit-core/src/main/java/com/sk89q/worldedit/EditSession.java
index 76bc6ea1bf..093213f7ab 100644
--- a/worldedit-core/src/main/java/com/sk89q/worldedit/EditSession.java
+++ b/worldedit-core/src/main/java/com/sk89q/worldedit/EditSession.java
@@ -28,6 +28,7 @@
import com.sk89q.worldedit.entity.BaseEntity;
import com.sk89q.worldedit.entity.Entity;
import com.sk89q.worldedit.event.extent.EditSessionEvent;
+import com.sk89q.worldedit.extension.platform.Actor;
import com.sk89q.worldedit.extent.ChangeSetExtent;
import com.sk89q.worldedit.extent.Extent;
import com.sk89q.worldedit.extent.MaskingExtent;
@@ -60,6 +61,7 @@
import com.sk89q.worldedit.function.mask.Masks;
import com.sk89q.worldedit.function.mask.NoiseFilter2D;
import com.sk89q.worldedit.function.mask.RegionMask;
+import com.sk89q.worldedit.function.operation.AffectedFutureOperation;
import com.sk89q.worldedit.function.operation.ChangeSetExecutor;
import com.sk89q.worldedit.function.operation.ForwardExtentCopy;
import com.sk89q.worldedit.function.operation.Operation;
@@ -116,6 +118,7 @@
import java.util.List;
import java.util.Map;
import java.util.Set;
+import java.util.concurrent.CompletableFuture;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -1097,12 +1100,12 @@ public int moveCuboidRegion(Region region, Vector dir, int distance, boolean cop
/**
* Drain nearby pools of water or lava.
*
+ * @param actor The actor to run this action with, if applicable
* @param origin the origin to drain from, which will search a 3x3 area
* @param radius the radius of the removal, where a value should be 0 or greater
* @return number of blocks affected
- * @throws MaxChangedBlocksException thrown if too many blocks are changed
*/
- public int drainArea(Vector origin, double radius) throws MaxChangedBlocksException {
+ public CompletableFuture drainArea(@Nullable Actor actor, Vector origin, double radius) {
checkNotNull(origin);
checkArgument(radius >= 0, "radius >= 0 required");
@@ -1121,9 +1124,11 @@ public int drainArea(Vector origin, double radius) throws MaxChangedBlocksExcept
}
}
- Operations.completeLegacy(visitor);
+ CompletableFuture future = new CompletableFuture<>();
- return visitor.getAffected();
+ Operations.completeQueued(new AffectedFutureOperation(visitor, future), actor, this);
+
+ return future;
}
/**
diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/LocalSession.java b/worldedit-core/src/main/java/com/sk89q/worldedit/LocalSession.java
index af2f708f78..8def9437ea 100644
--- a/worldedit-core/src/main/java/com/sk89q/worldedit/LocalSession.java
+++ b/worldedit-core/src/main/java/com/sk89q/worldedit/LocalSession.java
@@ -36,8 +36,6 @@
import com.sk89q.worldedit.extension.platform.Actor;
import com.sk89q.worldedit.extent.inventory.BlockBag;
import com.sk89q.worldedit.function.mask.Mask;
-import com.sk89q.worldedit.function.operation.Operation;
-import com.sk89q.worldedit.function.operation.RunContext;
import com.sk89q.worldedit.internal.cui.CUIEvent;
import com.sk89q.worldedit.internal.cui.CUIRegion;
import com.sk89q.worldedit.internal.cui.SelectionShapeEvent;
@@ -94,8 +92,6 @@ public class LocalSession {
private transient Mask mask;
private transient TimeZone timezone = TimeZone.getDefault();
private transient Vector cuiTemporaryBlock;
- private transient LinkedList operationQueue = new LinkedList<>();
- private transient boolean operationQueuePaused = false;
// Saved properties
private String lastScript;
@@ -897,46 +893,4 @@ public Mask getMask() {
public void setMask(Mask mask) {
this.mask = mask;
}
-
- /**
- * Add a {@link Operation} to the queue.
- *
- * @param actor The actor, if present
- * @param operation The operation
- */
- public void enqeueOperation(@Nullable Actor actor, Operation operation) {
- checkNotNull(operation);
- operationQueue.addLast(operation);
- if (actor != null) {
- actor.print("Queued Operation");
- }
- }
-
- /**
- * Run the next item in the operation queue.
- *
- * @param actor The actor for feedback, if present
- */
- public void runQueue(@Nullable Actor actor) {
- if (isRunningOperations()) {
- Operation op = operationQueue.poll();
- try {
- op = op.resume(new RunContext());
- if (op != null) {
- operationQueue.addFirst(op);
- }
- } catch (WorldEditException e) {
- throw new RuntimeException(e);
- }
- }
- }
-
- /**
- * Checks if the operation queue is running
- *
- * @return If the session is performing a queue
- */
- public boolean isRunningOperations() {
- return !operationQueuePaused && !operationQueue.isEmpty();
- }
}
diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/WorldEdit.java b/worldedit-core/src/main/java/com/sk89q/worldedit/WorldEdit.java
index 0ac44dbff9..e9c26b821d 100644
--- a/worldedit-core/src/main/java/com/sk89q/worldedit/WorldEdit.java
+++ b/worldedit-core/src/main/java/com/sk89q/worldedit/WorldEdit.java
@@ -24,7 +24,6 @@
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
-import com.sk89q.worldedit.world.block.BaseBlock;
import com.sk89q.worldedit.blocks.BaseItem;
import com.sk89q.worldedit.entity.Player;
import com.sk89q.worldedit.event.platform.BlockInteractEvent;
@@ -39,6 +38,8 @@
import com.sk89q.worldedit.extension.platform.Platform;
import com.sk89q.worldedit.extension.platform.PlatformManager;
import com.sk89q.worldedit.extent.inventory.BlockBag;
+import com.sk89q.worldedit.function.operation.OperationQueue;
+import com.sk89q.worldedit.function.operation.RunContext;
import com.sk89q.worldedit.scripting.CraftScriptContext;
import com.sk89q.worldedit.scripting.CraftScriptEngine;
import com.sk89q.worldedit.scripting.RhinoCraftScriptEngine;
@@ -51,6 +52,7 @@
import com.sk89q.worldedit.util.io.file.FilenameResolutionException;
import com.sk89q.worldedit.util.io.file.InvalidFilenameException;
import com.sk89q.worldedit.util.logging.WorldEditPrefixHandler;
+import com.sk89q.worldedit.world.block.BaseBlock;
import com.sk89q.worldedit.world.block.BlockType;
import com.sk89q.worldedit.world.registry.BundledBlockData;
import com.sk89q.worldedit.world.registry.BundledItemData;
@@ -65,6 +67,7 @@
import java.util.Iterator;
import java.util.List;
import java.util.Map;
+import java.util.WeakHashMap;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -100,6 +103,8 @@ public class WorldEdit {
private final MaskFactory maskFactory = new MaskFactory(this);
private final PatternFactory patternFactory = new PatternFactory(this);
+ private final Map operationQueues = new WeakHashMap<>();
+
static {
WorldEditPrefixHandler.register("com.sk89q.worldedit");
getVersion();
@@ -309,6 +314,28 @@ private boolean checkFilename(String filename) {
return filename.matches("^[A-Za-z0-9_\\- \\./\\\\'\\$@~!%\\^\\*\\(\\)\\[\\]\\+\\{\\},\\?]+\\.[A-Za-z0-9]+$");
}
+ /**
+ * Gets an {@link OperationQueue} for the given actor.
+ *
+ * @param actor The actor
+ */
+ public OperationQueue getOperationQueue(Actor actor) {
+ return operationQueues.computeIfAbsent(actor, x -> new OperationQueue());
+ }
+
+ /**
+ * Tick all of the operation queues
+ */
+ public void tickOperationQueues() {
+ for (Map.Entry queueEntry : operationQueues.entrySet()) {
+ try {
+ queueEntry.getValue().resume(new RunContext());
+ } catch (WorldEditException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ }
+
/**
* Load the bundled mappings.
*/
diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/UtilityCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/UtilityCommands.java
index f20b54d510..d607d4f062 100644
--- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/UtilityCommands.java
+++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/UtilityCommands.java
@@ -152,9 +152,9 @@ public void drain(Player player, LocalSession session, EditSession editSession,
double radius = Math.max(0, args.getDouble(0));
we.checkMaxRadius(radius);
- int affected = editSession.drainArea(
- session.getPlacementPosition(player), radius);
- player.print(affected + " block(s) have been changed.");
+ editSession.drainArea(player, session.getPlacementPosition(player), radius).thenAccept(
+ affected -> player.print(affected + " block(s) have been changed.")
+ );
}
@Command(
diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/operation/AffectedFutureOperation.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/operation/AffectedFutureOperation.java
new file mode 100644
index 0000000000..c1e2b7f285
--- /dev/null
+++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/operation/AffectedFutureOperation.java
@@ -0,0 +1,65 @@
+/*
+ * WorldEdit, a Minecraft world manipulation toolkit
+ * Copyright (C) sk89q
+ * Copyright (C) WorldEdit team and contributors
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see .
+ */
+
+package com.sk89q.worldedit.function.operation;
+
+import com.sk89q.worldedit.WorldEditException;
+
+import java.util.List;
+import java.util.concurrent.CompletableFuture;
+
+public class AffectedFutureOperation implements Operation {
+
+ private Operation operation;
+ private CompletableFuture future;
+ private int affected = 0;
+
+ public AffectedFutureOperation(Operation operation, CompletableFuture future) {
+ this.operation = operation;
+ this.future = future;
+ }
+
+ @Override
+ public Operation resume(RunContext run) throws WorldEditException {
+ if (operation != null) {
+ Operation nextOp = operation.resume(run);
+ if (operation instanceof AffectingOperation) {
+ affected += ((AffectingOperation) operation).getAffected();
+ }
+ operation = nextOp;
+ }
+
+ if (operation != null) {
+ return this;
+ }
+
+ future.complete(affected);
+ return null;
+ }
+
+ @Override
+ public void cancel() {
+ }
+
+ @Override
+ public void addStatusMessages(List messages) {
+ messages.add("Affected " + affected);
+ operation.addStatusMessages(messages);
+ }
+}
diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/operation/AffectingOperation.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/operation/AffectingOperation.java
new file mode 100644
index 0000000000..cf7b0816c6
--- /dev/null
+++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/operation/AffectingOperation.java
@@ -0,0 +1,30 @@
+/*
+ * WorldEdit, a Minecraft world manipulation toolkit
+ * Copyright (C) sk89q
+ * Copyright (C) WorldEdit team and contributors
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see .
+ */
+
+package com.sk89q.worldedit.function.operation;
+
+public interface AffectingOperation extends Operation {
+
+ /**
+ * Get the number of affected objects.
+ *
+ * @return the number of affected
+ */
+ int getAffected();
+}
diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/operation/FlushOperation.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/operation/FlushOperation.java
new file mode 100644
index 0000000000..e4f437bbba
--- /dev/null
+++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/operation/FlushOperation.java
@@ -0,0 +1,60 @@
+/*
+ * WorldEdit, a Minecraft world manipulation toolkit
+ * Copyright (C) sk89q
+ * Copyright (C) WorldEdit team and contributors
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see .
+ */
+
+package com.sk89q.worldedit.function.operation;
+
+import com.sk89q.worldedit.EditSession;
+import com.sk89q.worldedit.LocalSession;
+import com.sk89q.worldedit.WorldEdit;
+import com.sk89q.worldedit.WorldEditException;
+import com.sk89q.worldedit.extension.platform.Actor;
+
+import java.util.List;
+
+public class FlushOperation implements Operation {
+
+ private Actor actor;
+ private EditSession editSession;
+
+ public FlushOperation(Actor actor, EditSession editSession) {
+ this.actor = actor;
+ this.editSession = editSession;
+ }
+
+ @Override
+ public Operation resume(RunContext run) throws WorldEditException {
+ LocalSession session = WorldEdit.getInstance().getSessionManager().get(actor);
+ session.remember(editSession);
+ editSession.flushQueue();
+
+ WorldEdit.getInstance().flushBlockBag(actor, editSession);
+
+ return null;
+ }
+
+ @Override
+ public void cancel() {
+
+ }
+
+ @Override
+ public void addStatusMessages(List messages) {
+
+ }
+}
diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/operation/OperationQueue.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/operation/OperationQueue.java
index 53e79fa3de..b397ded9a9 100644
--- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/operation/OperationQueue.java
+++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/operation/OperationQueue.java
@@ -34,9 +34,10 @@
*/
public class OperationQueue implements Operation {
- private final List operations = Lists.newArrayList();
+ private final List finishedOperations = Lists.newArrayList();
private final Deque queue = new ArrayDeque<>();
private Operation current;
+ private boolean paused;
/**
* Create a new queue containing no operations.
@@ -54,7 +55,6 @@ public OperationQueue(Collection operations) {
for (Operation operation : operations) {
offer(operation);
}
- this.operations.addAll(operations);
}
/**
@@ -81,11 +81,15 @@ public void offer(Operation operation) {
@Override
public Operation resume(RunContext run) throws WorldEditException {
+ if (isPaused()) {
+ return this; // Don't tick paused ones.
+ }
if (current == null && !queue.isEmpty()) {
current = queue.poll();
}
if (current != null) {
+ finishedOperations.add(current); // Add to the list of finished operations.
current = current.resume(run);
if (current == null) {
@@ -106,9 +110,28 @@ public void cancel() {
@Override
public void addStatusMessages(List messages) {
- for (Operation operation : operations) {
+ for (Operation operation : finishedOperations) {
operation.addStatusMessages(messages);
}
+ // We've grabbed the status messages, remove them now.
+ finishedOperations.clear();
}
+ /**
+ * Checks whether this queue is paused.
+ *
+ * @return If it's paused
+ */
+ public boolean isPaused() {
+ return this.paused;
+ }
+
+ /**
+ * Set whether this queue is paused.
+ *
+ * @param paused If it should be paused
+ */
+ public void setPaused(boolean paused) {
+ this.paused = paused;
+ }
}
diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/operation/Operations.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/operation/Operations.java
index c939c40507..2df4e663be 100644
--- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/operation/Operations.java
+++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/operation/Operations.java
@@ -21,6 +21,7 @@
import static com.google.common.base.Preconditions.checkNotNull;
+import com.sk89q.worldedit.EditSession;
import com.sk89q.worldedit.MaxChangedBlocksException;
import com.sk89q.worldedit.WorldEdit;
import com.sk89q.worldedit.WorldEditException;
@@ -87,20 +88,39 @@ public static void completeBlindly(Operation op) {
}
}
+ /**
+ * Complete a given operation in a queue until it completes.
+ *
+ *
+ * Uses default
+ *
+ *
+ * @param op operation to execute
+ */
+ public static void completeQueued(Operation op) {
+ completeQueued(op, null, null);
+ }
+
/**
* Complete a given operation in a queue until it completes.
*
* @param op operation to execute
* @param actor The actor to complete this with, or null for console
+ * @param editSession The edit session
*/
- public static void completeQueued(Operation op, @Nullable Actor actor) {
+ public static void completeQueued(Operation op, @Nullable Actor actor, @Nullable EditSession editSession) {
checkNotNull(op);
if (actor == null) {
actor = WorldEdit.getInstance().getPlatformManager().queryCapability(Capability.USER_COMMANDS).getConsoleCommandSender();
}
- WorldEdit.getInstance().getSessionManager().get(actor).enqeueOperation(actor, op);
+ actor.print("Added operation to queue.");
+ Operation operation = op;
+ if (editSession != null) {
+ operation = new OperationQueue(op, new FlushOperation(actor, editSession));
+ }
+ WorldEdit.getInstance().getOperationQueue(actor).offer(operation);
}
}
diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/BreadthFirstSearch.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/BreadthFirstSearch.java
index 1601caf40a..b590eb437d 100644
--- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/BreadthFirstSearch.java
+++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/BreadthFirstSearch.java
@@ -25,6 +25,7 @@
import com.sk89q.worldedit.Vector;
import com.sk89q.worldedit.WorldEditException;
import com.sk89q.worldedit.function.RegionFunction;
+import com.sk89q.worldedit.function.operation.AffectingOperation;
import com.sk89q.worldedit.function.operation.Operation;
import com.sk89q.worldedit.function.operation.RunContext;
@@ -47,7 +48,7 @@
* functionality that starts at certain points and extends outward from
* those points.
*/
-public abstract class BreadthFirstSearch implements Operation {
+public abstract class BreadthFirstSearch implements AffectingOperation {
private final RegionFunction function;
private final Queue queue = new ArrayDeque<>();
@@ -152,11 +153,6 @@ private void visit(Vector from, Vector to) {
*/
protected abstract boolean isVisitable(Vector from, Vector to);
- /**
- * Get the number of affected objects.
- *
- * @return the number of affected
- */
public int getAffected() {
return affected;
}
@@ -164,10 +160,17 @@ public int getAffected() {
@Override
public Operation resume(RunContext run) throws WorldEditException {
Vector position;
+
+ int counter = 0;
while ((position = queue.poll()) != null) {
if (function.apply(position)) {
affected++;
+ counter ++;
+
+ if (counter > 100) {
+ return this;
+ }
}
for (Vector dir : directions) {
diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/command/WorldEditBinding.java b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/command/WorldEditBinding.java
index 664af4c4ef..5d32c9ed81 100644
--- a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/command/WorldEditBinding.java
+++ b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/command/WorldEditBinding.java
@@ -273,12 +273,11 @@ public Vector getDirection(ArgumentStack context, Direction direction)
* @param context the context
* @return a pattern
* @throws ParameterException on error
- * @throws WorldEditException on error
*/
@BindingMatch(type = TreeType.class,
behavior = BindingBehavior.CONSUMES,
consumedCount = 1)
- public TreeType getTreeType(ArgumentStack context) throws ParameterException, WorldEditException {
+ public TreeType getTreeType(ArgumentStack context) throws ParameterException {
String input = context.next();
if (input != null) {
TreeType type = TreeGenerator.lookup(input);
@@ -299,27 +298,13 @@ public TreeType getTreeType(ArgumentStack context) throws ParameterException, Wo
* @param context the context
* @return a pattern
* @throws ParameterException on error
- * @throws WorldEditException on error
*/
@BindingMatch(type = BaseBiome.class,
behavior = BindingBehavior.CONSUMES,
consumedCount = 1)
- public BaseBiome getBiomeType(ArgumentStack context) throws ParameterException, WorldEditException {
+ public BaseBiome getBiomeType(ArgumentStack context) throws ParameterException {
String input = context.next();
if (input != null) {
- Actor actor = context.getContext().getLocals().get(Actor.class);
- World world;
- if (actor instanceof Entity) {
- Extent extent = ((Entity) actor).getExtent();
- if (extent instanceof World) {
- world = (World) extent;
- } else {
- throw new ParameterException("A world is required.");
- }
- } else {
- throw new ParameterException("An entity is required.");
- }
-
BiomeRegistry biomeRegistry = WorldEdit.getInstance().getPlatformManager()
.queryCapability(Capability.GAME_HOOKS).getRegistries().getBiomeRegistry();
List knownBiomes = biomeRegistry.getBiomes();
diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/session/SessionManager.java b/worldedit-core/src/main/java/com/sk89q/worldedit/session/SessionManager.java
index 6ffc18aada..929085bd58 100644
--- a/worldedit-core/src/main/java/com/sk89q/worldedit/session/SessionManager.java
+++ b/worldedit-core/src/main/java/com/sk89q/worldedit/session/SessionManager.java
@@ -256,15 +256,6 @@ protected UUID getKey(SessionKey key) {
}
}
- /**
- * Update the queues held inside this session manager.
- */
- public synchronized void tickQueues() {
- for (Map.Entry sessionEntry : sessions.entrySet()) {
- sessionEntry.getValue().session.runQueue(null);
- }
- }
-
/**
* Remove the session for the given owner if one exists.
*
@@ -297,7 +288,7 @@ private synchronized void saveChangedSessions() {
while (it.hasNext()) {
SessionHolder stored = it.next();
- if (stored.key.isActive() || stored.session.isRunningOperations()) {
+ if (stored.key.isActive()) {
stored.lastActive = now;
if (stored.session.compareAndResetDirty()) {