From 53ad3d3cd2e5ba3f362e2c68fa6b3a957a7d3b03 Mon Sep 17 00:00:00 2001 From: Jesse Boyd Date: Mon, 11 Nov 2019 21:06:10 +0000 Subject: [PATCH] Fix schem save order --- .../object/clipboard/LinearClipboard.java | 38 ++++++++++++------- .../extent/clipboard/BlockArrayClipboard.java | 18 +++++++++ .../worldedit/extent/clipboard/Clipboard.java | 5 +++ .../clipboard/io/SpongeSchematicWriter.java | 25 +++++++++--- .../worldedit/function/visitor/Order.java | 23 +++++++++++ 5 files changed, 89 insertions(+), 20 deletions(-) create mode 100644 worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/Order.java diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/clipboard/LinearClipboard.java b/worldedit-core/src/main/java/com/boydti/fawe/object/clipboard/LinearClipboard.java index d7c4c32fe..380ea5301 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/clipboard/LinearClipboard.java +++ b/worldedit-core/src/main/java/com/boydti/fawe/object/clipboard/LinearClipboard.java @@ -5,6 +5,7 @@ import com.boydti.fawe.jnbt.streamer.IntValueReader; import com.google.common.collect.ForwardingIterator; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.extent.clipboard.Clipboard; +import com.sk89q.worldedit.function.visitor.Order; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.regions.CuboidRegion; import com.sk89q.worldedit.regions.Region; @@ -57,25 +58,34 @@ public abstract class LinearClipboard extends SimpleClipboard implements Clipboa @Override public Iterator iterator() { + return iterator(Order.YZX); + } + + @Override + public Iterator iterator(Order order) { Region region = getRegion(); - if (region instanceof CuboidRegion) { - Iterator iter = ((CuboidRegion) region).iterator_old(); - LinearFilter filter = new LinearFilter(); + switch (order) { + case YZX: + if (region instanceof CuboidRegion) { + Iterator iter = ((CuboidRegion) region).iterator_old(); + LinearFilter filter = new LinearFilter(); - return new ForwardingIterator() { - @Override - protected Iterator delegate() { - return iter; - } + return new ForwardingIterator() { + @Override + protected Iterator delegate() { + return iter; + } - @Override - public BlockVector3 next() { - return filter.next(super.next()); + @Override + public BlockVector3 next() { + return filter.next(super.next()); + } + }; } - }; - } else { - return super.iterator(); + default: + return order.create(region); } + } private class LinearFilter extends AbstractFilterBlock { diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/BlockArrayClipboard.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/BlockArrayClipboard.java index a9a31ff64..b73b548b3 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/BlockArrayClipboard.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/BlockArrayClipboard.java @@ -19,12 +19,14 @@ package com.sk89q.worldedit.extent.clipboard; +import com.boydti.fawe.beta.Filter; import com.boydti.fawe.object.clipboard.DelegateClipboard; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.entity.BaseEntity; import com.sk89q.worldedit.entity.Entity; import com.sk89q.worldedit.extent.Extent; +import com.sk89q.worldedit.function.visitor.Order; import com.sk89q.worldedit.math.BlockVector2; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.regions.Region; @@ -38,6 +40,7 @@ import com.sk89q.worldedit.world.block.BlockTypes; import javax.annotation.Nullable; import java.io.Closeable; import java.io.IOException; +import java.util.Iterator; import java.util.List; import java.util.UUID; @@ -232,6 +235,21 @@ public class BlockArrayClipboard extends DelegateClipboard implements Clipboard, return getParent().getBiomeType(x, z); } + @Override + public Iterator iterator() { + return getParent().iterator(); + } + + @Override + public Iterator iterator2d() { + return getParent().iterator2d(); + } + + @Override + public Iterator iterator(Order order) { + return getParent().iterator(order); + } + /** * Stores entity data. */ diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/Clipboard.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/Clipboard.java index 4cb73a082..792197ffe 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/Clipboard.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/Clipboard.java @@ -41,6 +41,7 @@ import com.sk89q.worldedit.function.mask.Mask; import com.sk89q.worldedit.function.operation.ForwardExtentCopy; import com.sk89q.worldedit.function.operation.Operation; import com.sk89q.worldedit.function.operation.Operations; +import com.sk89q.worldedit.function.visitor.Order; import com.sk89q.worldedit.function.visitor.RegionVisitor; import com.sk89q.worldedit.math.BlockVector2; import com.sk89q.worldedit.math.BlockVector3; @@ -155,6 +156,10 @@ public interface Clipboard extends Extent, Iterable, Closeable { return getWidth() * getHeight() * getLength(); } + default Iterator iterator(Order order) { + return order.create(getRegion()); + } + default Iterator iterator() { return getRegion().iterator(); } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/SpongeSchematicWriter.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/SpongeSchematicWriter.java index 145247d8e..1cd78785e 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/SpongeSchematicWriter.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/SpongeSchematicWriter.java @@ -21,6 +21,7 @@ package com.sk89q.worldedit.extent.clipboard.io; import com.boydti.fawe.jnbt.streamer.IntValueReader; import com.boydti.fawe.object.FaweOutputStream; +import com.boydti.fawe.object.clipboard.LinearClipboard; import com.boydti.fawe.util.IOUtil; import com.google.common.collect.Maps; import com.sk89q.jnbt.CompoundTag; @@ -34,7 +35,9 @@ import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.entity.BaseEntity; import com.sk89q.worldedit.entity.Entity; import com.sk89q.worldedit.extension.platform.Capability; +import com.sk89q.worldedit.extent.clipboard.BlockArrayClipboard; import com.sk89q.worldedit.extent.clipboard.Clipboard; +import com.sk89q.worldedit.function.visitor.Order; import com.sk89q.worldedit.math.BlockVector2; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.regions.Region; @@ -55,6 +58,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; +import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Objects; @@ -144,8 +148,18 @@ public class SpongeSchematicWriter implements ClipboardWriter { Arrays.fill(palette, Character.MAX_VALUE); int paletteMax = 0; int numTiles = 0; - for (BlockVector3 pos : clipboard) { - BaseBlock block = pos.getFullBlock(clipboard); + Clipboard finalClipboard; + if (clipboard instanceof BlockArrayClipboard) { + finalClipboard = ((BlockArrayClipboard) clipboard).getParent(); + } else { + finalClipboard = clipboard; + } + System.out.println(finalClipboard.getClass()); + System.out.println(finalClipboard.getRegion()); + Iterator iterator = finalClipboard.iterator(Order.YZX); + while (iterator.hasNext()) { + BlockVector3 pos = iterator.next(); + BaseBlock block = pos.getFullBlock(finalClipboard); CompoundTag nbt = block.getNbtData(); if (nbt != null) { Map values = nbt.getValue(); @@ -208,12 +222,12 @@ public class SpongeSchematicWriter implements ClipboardWriter { out.writeNamedEmptyList("TileEntities"); } - if (clipboard.hasBiomes()) { - writeBiomes(clipboard, out); + if (finalClipboard.hasBiomes()) { + writeBiomes(finalClipboard, out); } List entities = new ArrayList<>(); - for (Entity entity : clipboard.getEntities()) { + for (Entity entity : finalClipboard.getEntities()) { BaseEntity state = entity.getState(); if (state != null) { @@ -267,7 +281,6 @@ public class SpongeSchematicWriter implements ClipboardWriter { } } }; - System.out.println("TODO Optimize biome write"); BlockVector3 min = clipboard.getMinimumPoint(); int width = clipboard.getRegion().getWidth(); int length = clipboard.getRegion().getLength(); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/Order.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/Order.java new file mode 100644 index 000000000..913d4a0b5 --- /dev/null +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/Order.java @@ -0,0 +1,23 @@ +package com.sk89q.worldedit.function.visitor; + +import com.sk89q.worldedit.math.BlockVector3; +import com.sk89q.worldedit.regions.CuboidRegion; +import com.sk89q.worldedit.regions.Region; + +import java.util.Iterator; + +public enum Order { + YZX() { + @Override + public Iterator create(Region region) { + if (!(region instanceof CuboidRegion)) { + region = new CuboidRegion(region.getMinimumPoint(), region.getMaximumPoint()); + } + return ((CuboidRegion) region).iterator_old(); + } + } + + ; + + public abstract Iterator create(Region region); +}