Add a clipboard apply function to apply command & brush · EngineHub/WorldEdit@ef4f3e2 · GitHub
Skip to content

Commit ef4f3e2

Browse files
committed
Add a clipboard apply function to apply command & brush
1 parent d2a0f2f commit ef4f3e2

5 files changed

Lines changed: 231 additions & 19 deletions

File tree

‎worldedit-core/src/main/java/com/sk89q/worldedit/command/ApplyBrushCommands.java‎

Lines changed: 38 additions & 0 deletions

‎worldedit-core/src/main/java/com/sk89q/worldedit/command/ApplyCommands.java‎

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import com.sk89q.worldedit.LocalSession;
2626
import com.sk89q.worldedit.WorldEditException;
2727
import com.sk89q.worldedit.blocks.BaseItem;
28+
import com.sk89q.worldedit.command.factory.ClipboardPasteFactory;
2829
import com.sk89q.worldedit.command.factory.ItemUseFactory;
2930
import com.sk89q.worldedit.command.util.CommandPermissions;
3031
import com.sk89q.worldedit.command.util.CommandPermissionsConditionGenerator;
@@ -38,6 +39,7 @@
3839
import com.sk89q.worldedit.function.mask.Mask;
3940
import com.sk89q.worldedit.function.operation.Operations;
4041
import com.sk89q.worldedit.function.visitor.RegionVisitor;
42+
import com.sk89q.worldedit.internal.annotation.ClipboardMask;
4143
import com.sk89q.worldedit.internal.annotation.Direction;
4244
import com.sk89q.worldedit.internal.annotation.Selection;
4345
import com.sk89q.worldedit.internal.command.CommandRegistrationHandler;
@@ -52,6 +54,8 @@
5254
import org.enginehub.piston.annotation.Command;
5355
import org.enginehub.piston.annotation.CommandContainer;
5456
import org.enginehub.piston.annotation.param.Arg;
57+
import org.enginehub.piston.annotation.param.ArgFlag;
58+
import org.enginehub.piston.annotation.param.Switch;
5559
import org.enginehub.piston.inject.Key;
5660
import org.enginehub.piston.part.ArgAcceptingCommandFlag;
5761
import org.enginehub.piston.part.SubCommandPart;
@@ -114,6 +118,38 @@ private int apply(CommandParameters parameters, Actor actor, EditSession editSes
114118
return visitor.getAffected();
115119
}
116120

121+
@Command(
122+
name = "clipboard",
123+
desc = "Paste the clipboard at every block"
124+
)
125+
@CommandPermissions("worldedit.clipboard.paste")
126+
@Logging(REGION)
127+
public int clipboard(CommandParameters parameters, Actor actor, EditSession editSession,
128+
LocalSession localSession, @Selection Region region,
129+
@Switch(name = 'a', desc = "Don't paste air from the clipboard")
130+
boolean ignoreAir,
131+
@Switch(name = 'v', desc = "Include structure void blocks")
132+
boolean pasteStructureVoid,
133+
@Switch(name = 'o', desc = "Paste starting at each block, instead of centering on it")
134+
boolean usingOrigin,
135+
@Switch(name = 'e', desc = "Paste entities if available")
136+
boolean pasteEntities,
137+
@Switch(name = 'b', desc = "Paste biomes if available")
138+
boolean pasteBiomes,
139+
@ArgFlag(name = 'm', desc = "Only paste clipboard blocks matching this mask")
140+
@ClipboardMask
141+
Mask sourceMask) throws WorldEditException {
142+
return apply(parameters, actor, editSession, localSession, region, new ClipboardPasteFactory(
143+
localSession.getClipboard(),
144+
ignoreAir,
145+
!pasteStructureVoid,
146+
usingOrigin,
147+
pasteEntities,
148+
pasteBiomes,
149+
sourceMask
150+
));
151+
}
152+
117153
@Command(
118154
name = "item",
119155
desc = "Use an item"
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
/*
2+
* WorldEdit, a Minecraft world manipulation toolkit
3+
* Copyright (C) sk89q <http://www.sk89q.com>
4+
* Copyright (C) WorldEdit team and contributors
5+
*
6+
* This program is free software: you can redistribute it and/or modify
7+
* it under the terms of the GNU General Public License as published by
8+
* the Free Software Foundation, either version 3 of the License, or
9+
* (at your option) any later version.
10+
*
11+
* This program is distributed in the hope that it will be useful,
12+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14+
* GNU General Public License for more details.
15+
*
16+
* You should have received a copy of the GNU General Public License
17+
* along with this program. If not, see <https://www.gnu.org/licenses/>.
18+
*/
19+
20+
package com.sk89q.worldedit.command.factory;
21+
22+
import com.sk89q.worldedit.function.ClipboardPaste;
23+
import com.sk89q.worldedit.function.Contextual;
24+
import com.sk89q.worldedit.function.EditContext;
25+
import com.sk89q.worldedit.function.RegionFunction;
26+
import com.sk89q.worldedit.function.mask.Mask;
27+
import com.sk89q.worldedit.session.ClipboardHolder;
28+
29+
public final class ClipboardPasteFactory implements Contextual<RegionFunction> {
30+
31+
private final ClipboardHolder holder;
32+
private final boolean ignoreAirBlocks;
33+
private final boolean ignoreStructureVoidBlocks;
34+
private final boolean usingOrigin;
35+
private final boolean pasteEntities;
36+
private final boolean pasteBiomes;
37+
private final Mask sourceMask;
38+
39+
public ClipboardPasteFactory(ClipboardHolder holder, boolean ignoreAirBlocks,
40+
boolean ignoreStructureVoidBlocks, boolean usingOrigin,
41+
boolean pasteEntities, boolean pasteBiomes, Mask sourceMask) {
42+
this.holder = new ClipboardHolder(holder.getClipboard());
43+
this.holder.setTransform(holder.getTransform());
44+
this.ignoreAirBlocks = ignoreAirBlocks;
45+
this.ignoreStructureVoidBlocks = ignoreStructureVoidBlocks;
46+
this.usingOrigin = usingOrigin;
47+
this.pasteEntities = pasteEntities;
48+
this.pasteBiomes = pasteBiomes;
49+
this.sourceMask = sourceMask;
50+
}
51+
52+
@Override
53+
public RegionFunction createFromContext(EditContext context) {
54+
return new ClipboardPaste(
55+
context.getDestination(),
56+
holder,
57+
ignoreAirBlocks,
58+
ignoreStructureVoidBlocks,
59+
usingOrigin,
60+
pasteEntities,
61+
pasteBiomes,
62+
sourceMask
63+
);
64+
}
65+
66+
@Override
67+
public String toString() {
68+
return "paste clipboard";
69+
}
70+
}

‎worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/brush/ClipboardBrush.java‎

Lines changed: 11 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,10 @@
2222
import com.google.errorprone.annotations.InlineMe;
2323
import com.sk89q.worldedit.EditSession;
2424
import com.sk89q.worldedit.MaxChangedBlocksException;
25-
import com.sk89q.worldedit.extent.clipboard.Clipboard;
25+
import com.sk89q.worldedit.function.ClipboardPaste;
2626
import com.sk89q.worldedit.function.mask.Mask;
27-
import com.sk89q.worldedit.function.operation.Operation;
28-
import com.sk89q.worldedit.function.operation.Operations;
2927
import com.sk89q.worldedit.function.pattern.Pattern;
3028
import com.sk89q.worldedit.math.BlockVector3;
31-
import com.sk89q.worldedit.regions.Region;
3229
import com.sk89q.worldedit.session.ClipboardHolder;
3330

3431
public class ClipboardBrush implements Brush {
@@ -65,21 +62,16 @@ public ClipboardBrush(ClipboardHolder holder, boolean ignoreAirBlocks, boolean i
6562

6663
@Override
6764
public void build(EditSession editSession, BlockVector3 position, Pattern pattern, double size) throws MaxChangedBlocksException {
68-
Clipboard clipboard = holder.getClipboard();
69-
Region region = clipboard.getRegion();
70-
BlockVector3 centerOffset = region.getCenter().toBlockPoint().subtract(clipboard.getOrigin());
71-
72-
Operation operation = holder
73-
.createPaste(editSession)
74-
.to(usingOrigin ? position : position.subtract(centerOffset))
75-
.ignoreAirBlocks(ignoreAirBlocks)
76-
.ignoreStructureVoidBlocks(ignoreStructureVoidBlocks)
77-
.copyEntities(pasteEntities)
78-
.copyBiomes(pasteBiomes)
79-
.maskSource(sourceMask)
80-
.build();
81-
82-
Operations.completeLegacy(operation);
65+
new ClipboardPaste(
66+
editSession,
67+
holder,
68+
ignoreAirBlocks,
69+
ignoreStructureVoidBlocks,
70+
usingOrigin,
71+
pasteEntities,
72+
pasteBiomes,
73+
sourceMask
74+
).apply(position);
8375
}
8476

8577
}
Lines changed: 76 additions & 0 deletions

0 commit comments

Comments
 (0)