Skip to content

Commit bb880d3

Browse files
committed
WIP
1 parent 1b3ac21 commit bb880d3

File tree

4 files changed

+68
-17
lines changed

4 files changed

+68
-17
lines changed

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

+10
Original file line numberDiff line numberDiff line change
@@ -431,6 +431,16 @@ public World getWorld() {
431431
return world;
432432
}
433433

434+
/**
435+
* Get the actor associated with this EditSession.
436+
*
437+
* @return the actor
438+
*/
439+
@Nullable
440+
public Actor getActor() {
441+
return actor;
442+
}
443+
434444
/**
435445
* Get the underlying {@link ChangeSet}.
436446
*

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

+29-5
Original file line numberDiff line numberDiff line change
@@ -61,11 +61,15 @@
6161
import com.sk89q.worldedit.function.operation.Operation;
6262
import com.sk89q.worldedit.function.pattern.Pattern;
6363
import com.sk89q.worldedit.internal.annotation.ClipboardMask;
64+
import com.sk89q.worldedit.internal.annotation.Selection;
6465
import com.sk89q.worldedit.internal.annotation.VertHeight;
6566
import com.sk89q.worldedit.math.BlockVector3;
67+
import com.sk89q.worldedit.math.Vector3;
68+
import com.sk89q.worldedit.regions.Region;
6669
import com.sk89q.worldedit.regions.factory.CylinderRegionFactory;
6770
import com.sk89q.worldedit.regions.factory.RegionFactory;
6871
import com.sk89q.worldedit.session.ClipboardHolder;
72+
import com.sk89q.worldedit.session.Placement;
6973
import com.sk89q.worldedit.session.request.RequestExtent;
7074
import com.sk89q.worldedit.util.HandSide;
7175
import com.sk89q.worldedit.util.TreeGenerator;
@@ -505,14 +509,34 @@ public void deform(Player player, LocalSession localSession,
505509
boolean usePlacement,
506510
@Switch(name = 'l', desc = "Fetch from the clipboard instead of the world")
507511
boolean useClipboard) throws WorldEditException {
508-
Deform deform = new Deform(expression);
512+
Placement placement = localSession.getPlacement();
513+
514+
// bake placement
515+
switch (placement.getPlacementType()) {
516+
case PLAYER: // Shouldn't be baked, because people can just use "//placement here" instead
517+
case WORLD: // Doesn't need to be baked
518+
break;
519+
520+
case POS1:
521+
case MIN:
522+
case MAX:
523+
placement = placement.bake(localSession.getRegionSelector(player.getWorld()), player);
524+
525+
default:
526+
throw new IllegalStateException("PlacementType " + placement.getPlacementType() + " not implemented");
527+
}
528+
529+
final Deform.Mode mode;
509530
if (useRawCoords) {
510-
deform.setMode(Deform.Mode.RAW_COORD);
531+
mode = Deform.Mode.RAW_COORD;
511532
} else if (usePlacement) {
512-
deform.setMode(Deform.Mode.OFFSET);
513-
deform.setOffset(localSession.getPlacementPosition(player).toVector3());
533+
mode = Deform.Mode.OFFSET;
534+
} else {
535+
mode = Deform.Mode.UNIT_CUBE;
514536
}
515-
deform.setUseClipboard(useClipboard);
537+
538+
final Deform deform = new Deform(placement, expression, mode);
539+
516540
setOperationBasedBrush(player, localSession, radius,
517541
deform, shape, "worldedit.brush.deform");
518542
}

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

+25-12
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,15 @@
3434
import com.sk89q.worldedit.function.operation.RunContext;
3535
import com.sk89q.worldedit.internal.expression.Expression;
3636
import com.sk89q.worldedit.internal.expression.ExpressionException;
37+
import com.sk89q.worldedit.math.BlockVector3;
3738
import com.sk89q.worldedit.math.Vector3;
3839
import com.sk89q.worldedit.math.transform.Identity;
3940
import com.sk89q.worldedit.math.transform.SimpleTransform;
4041
import com.sk89q.worldedit.math.transform.Transform;
4142
import com.sk89q.worldedit.regions.NullRegion;
4243
import com.sk89q.worldedit.regions.Region;
44+
import com.sk89q.worldedit.session.Placement;
45+
import com.sk89q.worldedit.session.PlacementType;
4346
import com.sk89q.worldedit.util.formatting.text.Component;
4447
import com.sk89q.worldedit.util.formatting.text.TextComponent;
4548
import com.sk89q.worldedit.util.formatting.text.TranslatableComponent;
@@ -54,7 +57,7 @@ public class Deform implements Contextual<Operation> {
5457
private Region region;
5558
private final Expression expression;
5659
private Mode mode;
57-
private Vector3 offset = Vector3.ZERO;
60+
Placement placement;
5861
private boolean useClipboard;
5962

6063
public Deform(String expression) {
@@ -81,6 +84,17 @@ public Deform(Extent destination, Region region, String expression, Mode mode) {
8184
this.mode = mode;
8285
}
8386

87+
public Deform(Placement placement, String expression, Mode mode) {
88+
checkNotNull(mode, "mode");
89+
checkNotNull(expression, "expression");
90+
91+
this.placement = placement;
92+
this.expression = Expression.compile(expression, "x", "y", "z");
93+
this.expression.optimize();
94+
this.mode = mode;
95+
}
96+
97+
8498
public Extent getDestination() {
8599
return destination;
86100
}
@@ -108,21 +122,17 @@ public void setMode(Mode mode) {
108122
this.mode = mode;
109123
}
110124

111-
public boolean getUseClipboard() {
112-
return useClipboard;
113-
}
114-
115-
public void setUseClipboard(boolean useClipboard) {
116-
this.useClipboard = useClipboard;
117-
}
118-
125+
@Deprecated
119126
public Vector3 getOffset() {
120-
return offset;
127+
if (this.placement.getPlacementType() != PlacementType.WORLD) {
128+
throw new IllegalStateException("Deform.getOffset is deprecated and only supported after using setOffset.");
129+
}
130+
return placement.getOffset().toVector3();
121131
}
122132

123133
public void setOffset(Vector3 offset) {
124134
checkNotNull(offset, "offset");
125-
this.offset = offset;
135+
this.placement = new Placement(PlacementType.WORLD, offset.toBlockPoint());
126136
}
127137

128138
@Override
@@ -176,11 +186,14 @@ public Operation resume(RunContext run) throws WorldEditException {
176186

177187
final Vector3 min = region.getMinimumPoint().toVector3();
178188
final Vector3 max = region.getMaximumPoint().toVector3();
179-
final Transform outputTransform = createTransform(min, max, Deform.this.offset);
180189

181190
final LocalSession session = context.getSession();
182191
final EditSession editSession = (EditSession) context.getDestination();
183192

193+
// TODO: deal with session == null
194+
final BlockVector3 placement = Deform.this.placement.getPlacementPosition(session.getRegionSelector(editSession.getWorld()), editSession.getActor());
195+
final Transform outputTransform = createTransform(min, max, placement.toVector3());
196+
184197
final InputExtent inputExtent;
185198
final Transform inputTransform;
186199
if (Deform.this.useClipboard && session != null) {

worldedit-core/src/main/java/com/sk89q/worldedit/session/Placement.java

+4
Original file line numberDiff line numberDiff line change
@@ -65,4 +65,8 @@ public Component getInfo() {
6565
);
6666
}
6767
}
68+
69+
public Placement bake(RegionSelector selector, Actor actor) throws IncompleteRegionException {
70+
return new Placement(PlacementType.WORLD, getPlacementPosition(selector, actor));
71+
}
6872
}

0 commit comments

Comments
 (0)