From aa778af922bb1e046474d50ea4d916ff4b57443b Mon Sep 17 00:00:00 2001 From: Maddy Miller Date: Sun, 25 Jan 2026 16:40:31 +1000 Subject: [PATCH] Use a separate entity copy for //revolve -e (#2899) --- .../worldedit/command/ClipboardCommands.java | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/ClipboardCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/ClipboardCommands.java index cab135266f..b2c7fcec1a 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/ClipboardCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/ClipboardCommands.java @@ -32,6 +32,7 @@ import com.sk89q.worldedit.extent.clipboard.Clipboard; import com.sk89q.worldedit.function.block.BlockReplace; import com.sk89q.worldedit.function.mask.Mask; +import com.sk89q.worldedit.function.mask.Masks; import com.sk89q.worldedit.function.operation.ForwardExtentCopy; import com.sk89q.worldedit.function.operation.Operation; import com.sk89q.worldedit.function.operation.Operations; @@ -308,18 +309,35 @@ void revolve(Actor actor, LocalSession session, EditSession editSession, @Select // Offset this by half a block to ensure rotations are aligned properly AffineTransform offsetTransform = new AffineTransform().translate(0.5, 0.5, 0.5); + // Entities can't be offset like blocks, so we need a separate transform. Ideally can be fixed in WE8 by always + // offsetting block stuff in ExtentBlockCopy so we don't need the above to be offset. + AffineTransform entityTransform = copyEntities ? new AffineTransform() : null; + // Now paste it multiple times, rotating each time for (int i = 1; i < pasteCount; i++) { - holder.setTransform(offsetTransform.rotateY((reverse ? 1 : -1) * (360 * i) / (double) pasteCount)); + double theta = (reverse ? 1 : -1) * (360 * i) / (double) pasteCount; + holder.setTransform(offsetTransform.rotateY(theta)); Operation operation = holder .createPaste(editSession) .ignoreAirBlocks(true) - .copyEntities(copyEntities) + .copyEntities(false) .copyBiomes(copyBiomes) .to(pasteOrigin) .build(); Operations.complete(operation); + + if (copyEntities) { + // Paste entities separately with correct transform + holder.setTransform(entityTransform.rotateY(theta)); + Operation entityOperation = holder + .createPaste(editSession) + .maskSource(Masks.negate(Masks.alwaysTrue())) + .copyEntities(true) + .to(pasteOrigin) + .build(); + Operations.complete(entityOperation); + } } actor.printInfo(TranslatableComponent.of("worldedit.revolve.revolved", TextComponent.of(pasteCount)));