diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/SchematicCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/SchematicCommands.java index 7f7b5f7d21..f6981f257d 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/SchematicCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/SchematicCommands.java @@ -32,7 +32,6 @@ import com.sk89q.worldedit.extension.platform.Actor; import com.sk89q.worldedit.extension.platform.Capability; import com.sk89q.worldedit.extent.clipboard.Clipboard; -import com.sk89q.worldedit.extent.clipboard.ClipboardTransformBaker; import com.sk89q.worldedit.extent.clipboard.io.BuiltInClipboardFormat; import com.sk89q.worldedit.extent.clipboard.io.ClipboardFormat; import com.sk89q.worldedit.extent.clipboard.io.ClipboardFormats; @@ -379,14 +378,7 @@ private static class SchematicSaveTask implements Callable { private void writeToOutputStream(OutputStream outputStream) throws Exception { Clipboard clipboard = holder.getClipboard(); Transform transform = holder.getTransform(); - Clipboard target; - - // If we have a transform, bake it into the copy - if (transform.isIdentity()) { - target = clipboard; - } else { - target = ClipboardTransformBaker.bakeTransform(clipboard, transform); - } + Clipboard target = clipboard.transform(transform); try (Closer closer = Closer.create()) { OutputStream stream = closer.register(outputStream); @@ -430,9 +422,10 @@ private static class SchematicShareTask implements Callable { @Override public URL call() throws Exception { - ClipboardShareMetadata metadata = new ClipboardShareMetadata(); - metadata.author = this.actor.getName(); - metadata.name = name == null ? actor.getName() + "-" + System.currentTimeMillis() : name; + ClipboardShareMetadata metadata = new ClipboardShareMetadata( + this.actor.getName(), + name == null ? actor.getName() + "-" + System.currentTimeMillis() : name + ); return destination.share(holder, format, metadata); } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/argument/ClipboardFormatConverter.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/argument/ClipboardFormatConverter.java index b7418c412e..cfa0a1ed46 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/argument/ClipboardFormatConverter.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/argument/ClipboardFormatConverter.java @@ -34,8 +34,8 @@ import java.util.List; import java.util.Set; -import java.util.stream.Collectors; -import java.util.stream.Stream; + +import static org.enginehub.piston.converter.SuggestionHelper.limitByPrefix; public class ClipboardFormatConverter implements ArgumentConverter { @@ -56,20 +56,14 @@ public Component describeAcceptableArguments() { return this.choices; } - private Stream getFormats() { - return ClipboardFormats.getAll().stream(); - } - @Override public List getSuggestions(String input, InjectedValueAccess context) { ClipboardShareDestination destination = context.injectedValue(Key.of(ClipboardShareDestination.class)).orElse(null); - return getFormats() + return limitByPrefix(ClipboardFormats.getAll().stream() .filter(format -> destination == null || destination.supportsFormat(format)) .map(ClipboardFormat::getAliases) - .flatMap(Set::stream) - .filter(format -> format.startsWith(input)) - .collect(Collectors.toList()); + .flatMap(Set::stream), input); } @Override diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/argument/ClipboardShareDestinationConverter.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/argument/ClipboardShareDestinationConverter.java index 25ccd3b114..5af81bb1d2 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/argument/ClipboardShareDestinationConverter.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/argument/ClipboardShareDestinationConverter.java @@ -33,8 +33,8 @@ import java.util.List; import java.util.Set; -import java.util.stream.Collectors; -import java.util.stream.Stream; + +import static org.enginehub.piston.converter.SuggestionHelper.limitByPrefix; public class ClipboardShareDestinationConverter implements ArgumentConverter { @@ -55,17 +55,11 @@ public Component describeAcceptableArguments() { return this.choices; } - private Stream getDestinations() { - return ClipboardShareDestinations.getAll().stream(); - } - @Override public List getSuggestions(String input, InjectedValueAccess context) { - return getDestinations() + return limitByPrefix(ClipboardShareDestinations.getAll().stream() .map(ClipboardShareDestination::getAliases) - .flatMap(Set::stream) - .filter(destination -> destination.startsWith(input)) - .collect(Collectors.toList()); + .flatMap(Set::stream), input); } @Override 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 d5d413e917..74c8db8ac8 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 @@ -19,8 +19,11 @@ package com.sk89q.worldedit.extent.clipboard; +import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.Extent; +import com.sk89q.worldedit.internal.util.ClipboardTransformBaker; import com.sk89q.worldedit.math.BlockVector3; +import com.sk89q.worldedit.math.transform.Transform; import com.sk89q.worldedit.regions.Region; /** @@ -68,4 +71,19 @@ public interface Clipboard extends Extent { default boolean hasBiomes() { return false; } + + /** + * Returns a new clipboard with a given transform baked in. + * + *

+ * Note: There is no guarantee that a copy will be returned + *

+ * + * @param transform The transform + * @return The new clipboard + * @throws WorldEditException If it failed to copy + */ + default Clipboard transform(Transform transform) throws WorldEditException { + return ClipboardTransformBaker.bakeTransform(this, transform); + } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/share/BuiltInClipboardShareDestinations.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/share/BuiltInClipboardShareDestinations.java index 1a6e8fecf7..26e4b99467 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/share/BuiltInClipboardShareDestinations.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/share/BuiltInClipboardShareDestinations.java @@ -21,7 +21,6 @@ import com.google.common.collect.ImmutableSet; import com.sk89q.worldedit.extent.clipboard.Clipboard; -import com.sk89q.worldedit.extent.clipboard.ClipboardTransformBaker; import com.sk89q.worldedit.extent.clipboard.io.BuiltInClipboardFormat; import com.sk89q.worldedit.extent.clipboard.io.ClipboardFormat; import com.sk89q.worldedit.extent.clipboard.io.ClipboardWriter; @@ -57,14 +56,7 @@ public URL share(ClipboardHolder holder, ClipboardFormat format, ClipboardShareM ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); Clipboard clipboard = holder.getClipboard(); Transform transform = holder.getTransform(); - Clipboard target; - - // If we have a transform, bake it into the copy - if (transform.isIdentity()) { - target = clipboard; - } else { - target = ClipboardTransformBaker.bakeTransform(clipboard, transform); - } + Clipboard target = clipboard.transform(transform); try (Closer closer = Closer.create()) { OutputStream stream = closer.register(outputStream); @@ -74,9 +66,9 @@ public URL share(ClipboardHolder holder, ClipboardFormat format, ClipboardShareM } PasteMetadata pasteMetadata = new PasteMetadata(); - pasteMetadata.author = metadata.author; + pasteMetadata.author = metadata.author(); pasteMetadata.extension = "schem"; - pasteMetadata.name = metadata.name; + pasteMetadata.name = metadata.name(); EngineHubPaste pasteService = new EngineHubPaste(); return pasteService.paste(new String(Base64.getEncoder().encode(outputStream.toByteArray()), StandardCharsets.UTF_8), pasteMetadata).call(); } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/share/ClipboardShareDestinations.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/share/ClipboardShareDestinations.java index 227c082609..2dad47197a 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/share/ClipboardShareDestinations.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/share/ClipboardShareDestinations.java @@ -30,6 +30,7 @@ import java.util.Map; import javax.annotation.Nullable; +import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkNotNull; public class ClipboardShareDestinations { @@ -39,6 +40,7 @@ public class ClipboardShareDestinations { public static void registerClipboardShareDestination(ClipboardShareDestination destination) { checkNotNull(destination); + checkArgument(destination.supportsFormat(destination.getDefaultFormat()), "Destination must accept its default format"); for (String key : destination.getAliases()) { String lowKey = key.toLowerCase(Locale.ROOT); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/share/ClipboardShareMetadata.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/share/ClipboardShareMetadata.java index c056eb20b4..7a6398e26e 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/share/ClipboardShareMetadata.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/share/ClipboardShareMetadata.java @@ -23,6 +23,19 @@ * Items of metadata about shared clipboards. */ public class ClipboardShareMetadata { - public String name; - public String author; + private final String name; + private final String author; + + public ClipboardShareMetadata(String name, String author) { + this.name = name; + this.author = author; + } + + public String name() { + return this.name; + } + + public String author() { + return this.author; + } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/ClipboardTransformBaker.java b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/util/ClipboardTransformBaker.java similarity index 95% rename from worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/ClipboardTransformBaker.java rename to worldedit-core/src/main/java/com/sk89q/worldedit/internal/util/ClipboardTransformBaker.java index 3326558279..deb092be4e 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/ClipboardTransformBaker.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/util/ClipboardTransformBaker.java @@ -17,10 +17,12 @@ * along with this program. If not, see . */ -package com.sk89q.worldedit.extent.clipboard; +package com.sk89q.worldedit.internal.util; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.Extent; +import com.sk89q.worldedit.extent.clipboard.BlockArrayClipboard; +import com.sk89q.worldedit.extent.clipboard.Clipboard; import com.sk89q.worldedit.extent.transform.BlockTransformExtent; import com.sk89q.worldedit.function.operation.ForwardExtentCopy; import com.sk89q.worldedit.function.operation.Operation; @@ -130,6 +132,9 @@ private Operation copyTo(Extent target) { * @throws WorldEditException if an error occurred during copy */ public static Clipboard bakeTransform(Clipboard original, Transform transform) throws WorldEditException { + if (transform.isIdentity()) { + return original; + } ClipboardTransformBaker baker = new ClipboardTransformBaker(original, transform); Clipboard target = new BlockArrayClipboard(baker.getTransformedRegion()); target.setOrigin(original.getOrigin());