From 2b1a7ed9433b3b3a9e45bc8b82ca56159e3c131b Mon Sep 17 00:00:00 2001 From: wizjany Date: Sat, 9 Nov 2019 11:33:55 -0500 Subject: [PATCH] Make lrbuild tool use history. --- .../command/tool/LongRangeBuildTool.java | 68 ++++++++++++------- 1 file changed, 42 insertions(+), 26 deletions(-) diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/LongRangeBuildTool.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/LongRangeBuildTool.java index 66366f0e3..f82d6961f 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/LongRangeBuildTool.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/LongRangeBuildTool.java @@ -26,6 +26,7 @@ import com.sk89q.worldedit.MaxChangedBlocksException; import com.sk89q.worldedit.entity.Player; import com.sk89q.worldedit.extension.platform.Actor; import com.sk89q.worldedit.extension.platform.Platform; +import com.sk89q.worldedit.extent.inventory.BlockBag; import com.sk89q.worldedit.function.mask.Mask; import com.sk89q.worldedit.function.pattern.Pattern; import com.sk89q.worldedit.math.BlockVector3; @@ -55,41 +56,56 @@ public class LongRangeBuildTool extends BrushTool implements DoubleActionTraceTo public boolean actSecondary(Platform server, LocalConfiguration config, Player player, LocalSession session) { Location pos = getTargetFace(player); if (pos == null) return false; - try (EditSession eS = session.createEditSession(player)) { - eS.disableBuffering(); - BlockVector3 blockPoint = pos.toVector().toBlockPoint(); - BaseBlock applied = secondary.apply(blockPoint); - if (applied.getBlockType().getMaterial().isAir()) { - eS.setBlock(blockPoint, secondary); - } else { - eS.setBlock(pos.toVector().subtract(pos.getDirection()).toBlockPoint(), secondary); - } - return true; - } catch (MaxChangedBlocksException ignored) { - // one block? eat it - } - return false; + BlockBag bag = session.getBlockBag(player); + try (EditSession editSession = session.createEditSession(player)) { + try { + editSession.disableBuffering(); + BlockVector3 blockPoint = pos.toVector().toBlockPoint(); + BaseBlock applied = secondary.apply(blockPoint); + if (applied.getBlockType().getMaterial().isAir()) { + editSession.setBlock(blockPoint, secondary); + } else { + editSession.setBlock(pos.toVector().subtract(pos.getDirection()).toBlockPoint(), secondary); + } + } catch (MaxChangedBlocksException ignored) { + } finally { + session.remember(editSession); + } + } finally { + if (bag != null) { + bag.flushChanges(); + } + } + return true; } @Override public boolean actPrimary(Platform server, LocalConfiguration config, Player player, LocalSession session) { Location pos = getTargetFace(player); if (pos == null) return false; - try (EditSession eS = session.createEditSession(player)) { - eS.disableBuffering(); - BlockVector3 blockPoint = pos.toVector().toBlockPoint(); - BaseBlock applied = primary.apply(blockPoint); - if (applied.getBlockType().getMaterial().isAir()) { - eS.setBlock(blockPoint, primary); - } else { - eS.setBlock(pos.toVector().subtract(pos.getDirection()).toBlockPoint(), primary); + BlockBag bag = session.getBlockBag(player); + + try (EditSession editSession = session.createEditSession(player)) { + try { + editSession.disableBuffering(); + BlockVector3 blockPoint = pos.toVector().toBlockPoint(); + BaseBlock applied = primary.apply(blockPoint); + if (applied.getBlockType().getMaterial().isAir()) { + editSession.setBlock(blockPoint, primary); + } else { + editSession.setBlock(pos.toVector().subtract(pos.getDirection()).toBlockPoint(), primary); + } + } catch (MaxChangedBlocksException ignored) { + } finally { + session.remember(editSession); + } + } finally { + if (bag != null) { + bag.flushChanges(); } - return true; - } catch (MaxChangedBlocksException ignored) { - // one block? eat it } - return false; + return true; } private Location getTargetFace(Player player) {