Skip to content

Commit adbee4e

Browse files
committed
Add clipboard to //brush deform
1 parent 5561523 commit adbee4e

File tree

3 files changed

+48
-4
lines changed

3 files changed

+48
-4
lines changed

worldedit-core/src/main/java/com/sk89q/worldedit/LocalSession.java

+10
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@
6969
import java.util.List;
7070
import java.util.Map;
7171
import java.util.Objects;
72+
import java.util.Optional;
7273
import java.util.TimeZone;
7374
import java.util.concurrent.atomic.AtomicBoolean;
7475
import java.util.function.Consumer;
@@ -451,6 +452,15 @@ public ClipboardHolder getClipboard() throws EmptyClipboardException {
451452
return clipboard;
452453
}
453454

455+
/**
456+
* Gets the clipboard.
457+
*
458+
* @return clipboard
459+
*/
460+
public Optional<ClipboardHolder> getClipboardOptional() {
461+
return Optional.ofNullable(clipboard);
462+
}
463+
454464
/**
455465
* Sets the clipboard.
456466
*

worldedit-core/src/main/java/com/sk89q/worldedit/command/BrushCommands.java

+4-1
Original file line numberDiff line numberDiff line change
@@ -506,14 +506,17 @@ public void deform(Player player, LocalSession localSession,
506506
@Switch(name = 'r', desc = "Use the game's coordinate origin")
507507
boolean useRawCoords,
508508
@Switch(name = 'o', desc = "Use the placement position as the origin")
509-
boolean usePlacement) throws WorldEditException {
509+
boolean usePlacement,
510+
@Switch(name = 'l', desc = "Fetch from the clipboard instead of the world")
511+
boolean useClipboard) throws WorldEditException {
510512
Deform deform = new Deform(expression);
511513
if (useRawCoords) {
512514
deform.setMode(Deform.Mode.RAW_COORD);
513515
} else if (usePlacement) {
514516
deform.setMode(Deform.Mode.OFFSET);
515517
deform.setOffset(localSession.getPlacementPosition(player).toVector3());
516518
}
519+
deform.setUseClipboard(useClipboard);
517520
setOperationBasedBrush(player, localSession, radius,
518521
deform, shape, "worldedit.brush.deform");
519522
}

worldedit-core/src/main/java/com/sk89q/worldedit/function/factory/Deform.java

+34-3
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import com.sk89q.worldedit.extent.Extent;
2828
import com.sk89q.worldedit.extent.InputExtent;
2929
import com.sk89q.worldedit.extent.NullExtent;
30+
import com.sk89q.worldedit.extent.clipboard.Clipboard;
3031
import com.sk89q.worldedit.function.Contextual;
3132
import com.sk89q.worldedit.function.EditContext;
3233
import com.sk89q.worldedit.function.operation.Operation;
@@ -38,11 +39,14 @@
3839
import com.sk89q.worldedit.math.transform.Transform;
3940
import com.sk89q.worldedit.regions.NullRegion;
4041
import com.sk89q.worldedit.regions.Region;
42+
import com.sk89q.worldedit.session.ClipboardHolder;
4143
import com.sk89q.worldedit.util.formatting.text.Component;
4244
import com.sk89q.worldedit.util.formatting.text.TextComponent;
4345
import com.sk89q.worldedit.util.formatting.text.TranslatableComponent;
4446
import com.sk89q.worldedit.util.formatting.text.format.TextColor;
4547

48+
import java.util.Optional;
49+
4650
import static com.google.common.base.Preconditions.checkNotNull;
4751
import static com.sk89q.worldedit.util.GuavaUtil.firstNonNull;
4852

@@ -53,6 +57,7 @@ public class Deform implements Contextual<Operation> {
5357
private final Expression expression;
5458
private Mode mode;
5559
private Vector3 offset = Vector3.ZERO;
60+
private boolean useClipboard;
5661

5762
public Deform(String expression) {
5863
this(new NullExtent(), new NullRegion(), expression);
@@ -114,6 +119,14 @@ public void setOffset(Vector3 offset) {
114119
this.offset = offset;
115120
}
116121

122+
public boolean useClipboard() {
123+
return useClipboard;
124+
}
125+
126+
public void setUseClipboard(boolean useClipboard) {
127+
this.useClipboard = useClipboard;
128+
}
129+
117130
@Override
118131
public String toString() {
119132
return "deformation of " + expression.getSource();
@@ -126,11 +139,29 @@ public Operation createFromContext(final EditContext context) {
126139
final Vector3 min = region.getMinimumPoint().toVector3();
127140
final Vector3 max = region.getMaximumPoint().toVector3();
128141

129-
final Transform transform = TransformUtil.createTransformForExpressionCommand(mode, min, max, offset);
130142
LocalSession session = context.getSession();
131143
EditSession editSession = (EditSession) context.getDestination();
132-
return new DeformOperation(context.getDestination(), region, transform, expression,
133-
session == null ? WorldEdit.getInstance().getConfiguration().calculationTimeout : session.getTimeout(), editSession.getWorld(), transform);
144+
final Optional<Clipboard> clipboardOptional = Optional.ofNullable(session)
145+
.flatMap(LocalSession::getClipboardOptional)
146+
.map(ClipboardHolder::getClipboard);
147+
148+
final Transform targetTransform = TransformUtil.createTransformForExpressionCommand(mode, min, max, offset);
149+
final InputExtent sourceExtent;
150+
final Transform sourceTransform;
151+
if (useClipboard && clipboardOptional.isPresent()) {
152+
final Clipboard clipboard = clipboardOptional.get();
153+
final Vector3 clipboardMin = clipboard.getMinimumPoint().toVector3();
154+
final Vector3 clipboardMax = clipboard.getMaximumPoint().toVector3();
155+
156+
sourceExtent = clipboard;
157+
sourceTransform = TransformUtil.createTransformForExpressionCommand(mode, clipboardMin, clipboardMax, offset);
158+
} else {
159+
sourceExtent = editSession.getWorld();
160+
sourceTransform = targetTransform;
161+
}
162+
163+
return new DeformOperation(context.getDestination(), region, targetTransform, expression,
164+
session == null ? WorldEdit.getInstance().getConfiguration().calculationTimeout : session.getTimeout(), sourceExtent, sourceTransform);
134165
}
135166

136167
private record DeformOperation(

0 commit comments

Comments
 (0)