Flush or disable buffers in tools

This commit is contained in:
Kenzie Togami 2018-10-20 18:54:58 -07:00
parent dd2fcbac23
commit 1fa1ff895b
No known key found for this signature in database
GPG Key ID: 5D200B325E157A81
10 changed files with 44 additions and 18 deletions

View File

@ -285,7 +285,7 @@ public class WorldEditPlugin extends JavaPlugin implements TabCompleter {
LocalSession session = WorldEdit.getInstance().getSessionManager().get(wePlayer); LocalSession session = WorldEdit.getInstance().getSessionManager().get(wePlayer);
session.remember(editSession); session.remember(editSession);
editSession.flushQueue(); editSession.flushSession();
WorldEdit.getInstance().flushBlockBag(wePlayer, editSession); WorldEdit.getInstance().flushBlockBag(wePlayer, editSession);
} }

View File

@ -298,13 +298,13 @@ public class EditSession implements Extent {
} }
/** /**
* Disable the queue. This will flush the queue. * Disable the queue. This will {@linkplain #flushSession() flush the session}.
*/ */
public void disableQueue() { public void disableQueue() {
if (isQueueEnabled()) { if (isQueueEnabled()) {
flushQueue(); flushSession();
} }
reorderExtent.setEnabled(true); reorderExtent.setEnabled(false);
} }
/** /**
@ -393,10 +393,21 @@ public class EditSession implements Extent {
return blockBagExtent.popMissing(); return blockBagExtent.popMissing();
} }
/**
* Returns chunk batching status.
*
* @return whether chunk batching is enabled
*/
public boolean isBatchingChunks() { public boolean isBatchingChunks() {
return chunkBatchingExtent != null && chunkBatchingExtent.isEnabled(); return chunkBatchingExtent != null && chunkBatchingExtent.isEnabled();
} }
/**
* Enable or disable chunk batching. Disabling will
* {@linkplain #flushSession() flush the session}.
*
* @param batchingChunks {@code true} to enable, {@code false} to disable
*/
public void setBatchingChunks(boolean batchingChunks) { public void setBatchingChunks(boolean batchingChunks) {
if (chunkBatchingExtent == null) { if (chunkBatchingExtent == null) {
if (batchingChunks) { if (batchingChunks) {
@ -405,11 +416,23 @@ public class EditSession implements Extent {
return; return;
} }
if (!batchingChunks) { if (!batchingChunks) {
flushQueue(); flushSession();
} }
chunkBatchingExtent.setEnabled(batchingChunks); chunkBatchingExtent.setEnabled(batchingChunks);
} }
/**
* Disable all buffering extents.
*
* @see #disableQueue()
* @see #setBatchingChunks(boolean)
*/
public void disableBuffering() {
// We optimize here to avoid double calls to flushSession.
reorderExtent.setEnabled(false);
setBatchingChunks(false);
}
/** /**
* Get the number of blocks changed, including repeated block changes. * Get the number of blocks changed, including repeated block changes.
* *
@ -569,7 +592,7 @@ public class EditSession implements Extent {
UndoContext context = new UndoContext(); UndoContext context = new UndoContext();
context.setExtent(editSession.bypassHistory); context.setExtent(editSession.bypassHistory);
Operations.completeBlindly(ChangeSetExecutor.createUndo(changeSet, context)); Operations.completeBlindly(ChangeSetExecutor.createUndo(changeSet, context));
editSession.flushQueue(); editSession.flushSession();
} }
/** /**
@ -581,7 +604,7 @@ public class EditSession implements Extent {
UndoContext context = new UndoContext(); UndoContext context = new UndoContext();
context.setExtent(editSession.bypassHistory); context.setExtent(editSession.bypassHistory);
Operations.completeBlindly(ChangeSetExecutor.createRedo(changeSet, context)); Operations.completeBlindly(ChangeSetExecutor.createRedo(changeSet, context));
editSession.flushQueue(); editSession.flushSession();
} }
/** /**
@ -614,9 +637,10 @@ public class EditSession implements Extent {
} }
/** /**
* Finish off the queue. * Communicate to the EditSession that all block changes are complete,
* and that it should apply them to the world.
*/ */
public void flushQueue() { public void flushSession() {
Operations.completeBlindly(commit()); Operations.completeBlindly(commit());
} }

View File

@ -628,7 +628,7 @@ public class WorldEdit {
logger.log(Level.WARNING, "Failed to execute script", e); logger.log(Level.WARNING, "Failed to execute script", e);
} finally { } finally {
for (EditSession editSession : scriptContext.getEditSessions()) { for (EditSession editSession : scriptContext.getEditSessions()) {
editSession.flushQueue(); editSession.flushSession();
session.remember(editSession); session.remember(editSession);
} }
} }

View File

@ -460,7 +460,7 @@ public class UtilityCommands {
if (editSession != null) { if (editSession != null) {
session.remember(editSession); session.remember(editSession);
editSession.flushQueue(); editSession.flushSession();
} }
} }
@ -520,7 +520,7 @@ public class UtilityCommands {
if (editSession != null) { if (editSession != null) {
session.remember(editSession); session.remember(editSession);
editSession.flushQueue(); editSession.flushSession();
} }
} }

View File

@ -83,7 +83,7 @@ public class AreaPickaxe implements BlockTool {
} catch (MaxChangedBlocksException e) { } catch (MaxChangedBlocksException e) {
player.printError("Max blocks change limit reached."); player.printError("Max blocks change limit reached.");
} finally { } finally {
editSession.flushQueue(); editSession.flushSession();
session.remember(editSession); session.remember(editSession);
} }

View File

@ -53,16 +53,17 @@ public class BlockReplacer implements DoubleActionBlockTool {
BlockBag bag = session.getBlockBag(player); BlockBag bag = session.getBlockBag(player);
EditSession editSession = session.createEditSession(player); EditSession editSession = session.createEditSession(player);
editSession.disableBuffering();
try { try {
Vector position = clicked.toVector(); Vector position = clicked.toVector();
editSession.setBlock(position, pattern.apply(position)); editSession.setBlock(position, pattern.apply(position));
} catch (MaxChangedBlocksException ignored) { } catch (MaxChangedBlocksException ignored) {
} finally { } finally {
session.remember(editSession);
if (bag != null) { if (bag != null) {
bag.flushChanges(); bag.flushChanges();
} }
session.remember(editSession);
} }
return true; return true;

View File

@ -193,10 +193,11 @@ public class BrushTool implements TraceTool {
} catch (MaxChangedBlocksException e) { } catch (MaxChangedBlocksException e) {
player.printError("Max blocks change limit reached."); player.printError("Max blocks change limit reached.");
} finally { } finally {
session.remember(editSession);
editSession.flushSession();
if (bag != null) { if (bag != null) {
bag.flushChanges(); bag.flushChanges();
} }
session.remember(editSession);
} }
return true; return true;

View File

@ -75,7 +75,7 @@ public class RecursivePickaxe implements BlockTool {
} catch (MaxChangedBlocksException e) { } catch (MaxChangedBlocksException e) {
player.printError("Max blocks change limit reached."); player.printError("Max blocks change limit reached.");
} finally { } finally {
editSession.flushQueue(); editSession.flushSession();
session.remember(editSession); session.remember(editSession);
} }

View File

@ -57,7 +57,7 @@ public class SinglePickaxe implements BlockTool {
} catch (MaxChangedBlocksException e) { } catch (MaxChangedBlocksException e) {
player.printError("Max blocks change limit reached."); player.printError("Max blocks change limit reached.");
} finally { } finally {
editSession.flushQueue(); editSession.flushSession();
} }
world.playEffect(clicked.toVector(), 2001, blockType.getLegacyId()); world.playEffect(clicked.toVector(), 2001, blockType.getLegacyId());

View File

@ -316,7 +316,7 @@ public final class CommandManager {
if (editSession != null) { if (editSession != null) {
session.remember(editSession); session.remember(editSession);
editSession.flushQueue(); editSession.flushSession();
if (config.profile) { if (config.profile) {
long time = System.currentTimeMillis() - start; long time = System.currentTimeMillis() - start;