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()) {