Remove FAWE-Piston

Disables a lot of previous functionality in FAWE until replacements can be made. This commit was untested and may cause major issues.
This commit is contained in:
MattBDev 2020-02-05 00:37:42 -05:00
parent 3452fd5a63
commit 75653087b9
46 changed files with 3643 additions and 3867 deletions

View File

@ -8,18 +8,6 @@ plugins {
repositories { repositories {
jcenter() jcenter()
gradlePluginPortal() gradlePluginPortal()
// maven {
// name = "Forge Maven"
// url = uri("https://files.minecraftforge.net/maven")
// }
// maven {
// name = "Fabric"
// url = uri("https://maven.fabricmc.net/")
// }
// maven {
// name = "sponge"
// url = uri("https://repo.spongepowered.org/maven")
// }
} }
configurations.all { configurations.all {
@ -43,15 +31,10 @@ val mixinVersion: String = properties.getProperty("mixin.version")
dependencies { dependencies {
implementation(gradleApi()) implementation(gradleApi())
// implementation("gradle.plugin.net.minecrell:licenser:0.4.1")
implementation("org.ajoberstar.grgit:grgit-gradle:3.1.1") implementation("org.ajoberstar.grgit:grgit-gradle:3.1.1")
implementation("com.github.jengelman.gradle.plugins:shadow:5.1.0") implementation("com.github.jengelman.gradle.plugins:shadow:5.1.0")
implementation("net.ltgt.apt-eclipse:net.ltgt.apt-eclipse.gradle.plugin:0.21") implementation("net.ltgt.apt-eclipse:net.ltgt.apt-eclipse.gradle.plugin:0.21")
implementation("net.ltgt.apt-idea:net.ltgt.apt-idea.gradle.plugin:0.21") implementation("net.ltgt.apt-idea:net.ltgt.apt-idea.gradle.plugin:0.21")
implementation("org.jfrog.buildinfo:build-info-extractor-gradle:4.9.7") implementation("org.jfrog.buildinfo:build-info-extractor-gradle:4.9.7")
// implementation("gradle.plugin.org.spongepowered:spongegradle:0.9.0")
// implementation("net.minecraftforge.gradle:ForgeGradle:3.0.143")
// implementation("net.fabricmc:fabric-loom:$loomVersion")
// implementation("net.fabricmc:sponge-mixin:$mixinVersion")
implementation("gradle.plugin.com.mendhak.gradlecrowdin:plugin:0.1.0") implementation("gradle.plugin.com.mendhak.gradlecrowdin:plugin:0.1.0")
} }

View File

@ -13,7 +13,6 @@ fun Project.applyCommonConfiguration() {
maven { url = uri("https://oss.sonatype.org/content/repositories/snapshots/") } maven { url = uri("https://oss.sonatype.org/content/repositories/snapshots/") }
maven { url = uri("http://empcraft.com/maven2") } maven { url = uri("http://empcraft.com/maven2") }
maven { url = uri("https://repo.destroystokyo.com/repository/maven-public") } maven { url = uri("https://repo.destroystokyo.com/repository/maven-public") }
maven { url = uri("https://ci.athion.net/job/FAWE-Piston/ws/") }
ivy { url = uri("https://ci.athion.net/job") ivy { url = uri("https://ci.athion.net/job")
patternLayout { patternLayout {
artifact("/[organisation]/[revision]/artifact/[module].[ext]") artifact("/[organisation]/[revision]/artifact/[module].[ext]")

View File

@ -3,7 +3,7 @@ import org.gradle.api.Project
object Versions { object Versions {
const val TEXT = "3.0.1" const val TEXT = "3.0.1"
const val TEXT_EXTRAS = "3.0.2" const val TEXT_EXTRAS = "3.0.2"
const val PISTON = "0.5.3-SNAPSHOT" const val PISTON = "0.5.2"
const val AUTO_VALUE = "1.6.5" const val AUTO_VALUE = "1.6.5"
const val JUNIT = "5.5.0" const val JUNIT = "5.5.0"
const val MOCKITO = "3.0.0" const val MOCKITO = "3.0.0"

View File

@ -2,7 +2,6 @@ package com.boydti.fawe.bukkit.listener;
import com.boydti.fawe.beta.IQueueExtent; import com.boydti.fawe.beta.IQueueExtent;
import com.boydti.fawe.bukkit.util.image.BukkitImageViewer; import com.boydti.fawe.bukkit.util.image.BukkitImageViewer;
import com.boydti.fawe.command.CFICommands;
import com.boydti.fawe.object.brush.BrushSettings; import com.boydti.fawe.object.brush.BrushSettings;
import com.boydti.fawe.object.brush.visualization.cfi.HeightMapMCAGenerator; import com.boydti.fawe.object.brush.visualization.cfi.HeightMapMCAGenerator;
import com.boydti.fawe.util.EditSessionBuilder; import com.boydti.fawe.util.EditSessionBuilder;
@ -57,31 +56,32 @@ public class BukkitImageListener implements Listener {
Bukkit.getPluginManager().registerEvents(this, plugin); Bukkit.getPluginManager().registerEvents(this, plugin);
} }
@EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) //TODO Fix along with CFI code 2020-02-04
public void onPlayerInteractEntity(AsyncPlayerChatEvent event) { // @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true)
Set<Player> recipients = event.getRecipients(); // public void onPlayerInteractEntity(AsyncPlayerChatEvent event) {
Iterator<Player> iter = recipients.iterator(); // Set<Player> recipients = event.getRecipients();
while (iter.hasNext()) { // Iterator<Player> iter = recipients.iterator();
Player player = iter.next(); // while (iter.hasNext()) {
BukkitPlayer bukkitPlayer = BukkitAdapter.adapt(player); // Player player = iter.next();
CFICommands.CFISettings settings = bukkitPlayer.getMeta("CFISettings"); // BukkitPlayer bukkitPlayer = BukkitAdapter.adapt(player);
if (player.equals(event.getPlayer()) || !bukkitPlayer.hasMeta() || settings == null || !settings.hasGenerator()) { // CFICommands.CFISettings settings = bukkitPlayer.getMeta("CFISettings");
continue; // if (player.equals(event.getPlayer()) || !bukkitPlayer.hasMeta() || settings == null || !settings.hasGenerator()) {
} // continue;
// }
String name = player.getName().toLowerCase(); //
if (!event.getMessage().toLowerCase().contains(name)) { // String name = player.getName().toLowerCase();
ArrayDeque<String> buffered = bukkitPlayer.getMeta("CFIBufferedMessages"); // if (!event.getMessage().toLowerCase().contains(name)) {
if (buffered == null) { // ArrayDeque<String> buffered = bukkitPlayer.getMeta("CFIBufferedMessages");
bukkitPlayer.setMeta("CFIBufferedMessaged", buffered = new ArrayDeque<>()); // if (buffered == null) {
} // bukkitPlayer.setMeta("CFIBufferedMessaged", buffered = new ArrayDeque<>());
String full = String.format(event.getFormat(), event.getPlayer().getDisplayName(), // }
event.getMessage()); // String full = String.format(event.getFormat(), event.getPlayer().getDisplayName(),
buffered.add(full); // event.getMessage());
iter.remove(); // buffered.add(full);
} // iter.remove();
} // }
} // }
// }
@EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST) @EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST)
public void onHangingBreakByEntity(HangingBreakByEntityEvent event) { public void onHangingBreakByEntity(HangingBreakByEntityEvent event) {
@ -184,126 +184,127 @@ public class BukkitImageListener implements Listener {
} }
private void handleInteract(Event event, Player player, Entity entity, boolean primary) { private void handleInteract(Event event, Player player, Entity entity, boolean primary) {
if (!(entity instanceof ItemFrame)) { //todo fix with cfi code 2020-02-04
return; // if (!(entity instanceof ItemFrame)) {
} // return;
ItemFrame itemFrame = (ItemFrame) entity; // }
// ItemFrame itemFrame = (ItemFrame) entity;
BukkitPlayer bukkitPlayer = BukkitAdapter.adapt(player); //
CFICommands.CFISettings settings = bukkitPlayer.getMeta("CFISettings"); // BukkitPlayer bukkitPlayer = BukkitAdapter.adapt(player);
HeightMapMCAGenerator generator = settings == null ? null : settings.getGenerator(); // CFICommands.CFISettings settings = bukkitPlayer.getMeta("CFISettings");
BukkitImageViewer viewer = get(generator); // HeightMapMCAGenerator generator = settings == null ? null : settings.getGenerator();
if (viewer == null) { // BukkitImageViewer viewer = get(generator);
return; // if (viewer == null) {
} // return;
// }
if (itemFrame.getRotation() != Rotation.NONE) { //
itemFrame.setRotation(Rotation.NONE); // if (itemFrame.getRotation() != Rotation.NONE) {
} // itemFrame.setRotation(Rotation.NONE);
// }
LocalSession session = bukkitPlayer.getSession(); //
BrushTool tool; // LocalSession session = bukkitPlayer.getSession();
try { // BrushTool tool;
tool = session.getBrushTool(bukkitPlayer, false); // try {
} catch (InvalidToolBindException e) { // tool = session.getBrushTool(bukkitPlayer, false);
return; // } catch (InvalidToolBindException e) {
} // return;
// }
ItemFrame[][] frames = viewer.getItemFrames(); //
if (frames == null || tool == null) { // ItemFrame[][] frames = viewer.getItemFrames();
viewer.selectFrame(itemFrame); // if (frames == null || tool == null) {
player.updateInventory(); // viewer.selectFrame(itemFrame);
TaskManager.IMP.laterAsync(() -> viewer.view(generator), 1); // player.updateInventory();
return; // TaskManager.IMP.laterAsync(() -> viewer.view(generator), 1);
} // return;
// }
BrushSettings context = primary ? tool.getPrimary() : tool.getSecondary(); //
Brush brush = context.getBrush(); // BrushSettings context = primary ? tool.getPrimary() : tool.getSecondary();
if (brush == null) { // Brush brush = context.getBrush();
return; // if (brush == null) {
} // return;
tool.setContext(context); // }
// tool.setContext(context);
if (event instanceof Cancellable) { //
((Cancellable) event).setCancelled(true); // if (event instanceof Cancellable) {
} // ((Cancellable) event).setCancelled(true);
// }
Location target = itemFrame.getLocation(); //
Location source = player.getLocation(); // Location target = itemFrame.getLocation();
// Location source = player.getLocation();
double yawRad = Math.toRadians(source.getYaw() + 90d); //
double pitchRad = Math.toRadians(-source.getPitch()); // double yawRad = Math.toRadians(source.getYaw() + 90d);
// double pitchRad = Math.toRadians(-source.getPitch());
double a = Math.cos(pitchRad); //
double xRat = Math.cos(yawRad) * a; // double a = Math.cos(pitchRad);
double zRat = Math.sin(yawRad) * a; // double xRat = Math.cos(yawRad) * a;
// double zRat = Math.sin(yawRad) * a;
BlockFace facing = itemFrame.getFacing(); //
double thickness = 1 / 32D + 1 / 128D; // BlockFace facing = itemFrame.getFacing();
double modX = facing.getModX(); // double thickness = 1 / 32D + 1 / 128D;
double modZ = facing.getModZ(); // double modX = facing.getModX();
double dx = source.getX() - target.getX() - modX * thickness; // double modZ = facing.getModZ();
double dy = source.getY() + player.getEyeHeight() - target.getY(); // double dx = source.getX() - target.getX() - modX * thickness;
double dz = source.getZ() - target.getZ() - modZ * thickness; // double dy = source.getY() + player.getEyeHeight() - target.getY();
// double dz = source.getZ() - target.getZ() - modZ * thickness;
double offset; //
double localX; // double offset;
if (modX != 0) { // double localX;
offset = dx / xRat; // if (modX != 0) {
localX = (-modX) * (dz - offset * zRat); // offset = dx / xRat;
} else { // localX = (-modX) * (dz - offset * zRat);
offset = dz / zRat; // } else {
localX = (modZ) * (dx - offset * xRat); // offset = dz / zRat;
} // localX = (modZ) * (dx - offset * xRat);
double localY = dy - offset * Math.sin(pitchRad); // }
int localPixelX = (int) ((localX + 0.5) * 128); // double localY = dy - offset * Math.sin(pitchRad);
int localPixelY = (int) ((localY + 0.5) * 128); // int localPixelX = (int) ((localX + 0.5) * 128);
// int localPixelY = (int) ((localY + 0.5) * 128);
UUID uuid = itemFrame.getUniqueId(); //
for (int blockX = 0; blockX < frames.length; blockX++) { // UUID uuid = itemFrame.getUniqueId();
for (int blockY = 0; blockY < frames[0].length; blockY++) { // for (int blockX = 0; blockX < frames.length; blockX++) {
if (uuid.equals(frames[blockX][blockY].getUniqueId())) { // for (int blockY = 0; blockY < frames[0].length; blockY++) {
int pixelX = localPixelX + blockX * 128; // if (uuid.equals(frames[blockX][blockY].getUniqueId())) {
int pixelY = (128 * frames[0].length) - (localPixelY + blockY * 128 + 1); // int pixelX = localPixelX + blockX * 128;
// int pixelY = (128 * frames[0].length) - (localPixelY + blockY * 128 + 1);
int width = generator.getWidth(); //
int length = generator.getLength(); // int width = generator.getWidth();
int worldX = (int) (pixelX * width / (frames.length * 128d)); // int length = generator.getLength();
int worldZ = (int) (pixelY * length / (frames[0].length * 128d)); // int worldX = (int) (pixelX * width / (frames.length * 128d));
// int worldZ = (int) (pixelY * length / (frames[0].length * 128d));
if (worldX < 0 || worldX > width || worldZ < 0 || worldZ > length) { //
return; // if (worldX < 0 || worldX > width || worldZ < 0 || worldZ > length) {
} // return;
// }
bukkitPlayer.runAction(() -> { //
BlockVector3 wPos = BlockVector3.at(worldX, 0, worldZ); // bukkitPlayer.runAction(() -> {
viewer.refresh(); // BlockVector3 wPos = BlockVector3.at(worldX, 0, worldZ);
int topY = generator // viewer.refresh();
.getNearestSurfaceTerrainBlock(wPos.getBlockX(), wPos.getBlockZ(), 255, // int topY = generator
0, 255); // .getNearestSurfaceTerrainBlock(wPos.getBlockX(), wPos.getBlockZ(), 255,
wPos = wPos.withY(topY); // 0, 255);
// wPos = wPos.withY(topY);
EditSession es = new EditSessionBuilder(bukkitPlayer.getWorld()).player(bukkitPlayer) //
.combineStages(false).autoQueue(false).blockBag(null).limitUnlimited() // EditSession es = new EditSessionBuilder(bukkitPlayer.getWorld()).player(bukkitPlayer)
.build(); // .combineStages(false).autoQueue(false).blockBag(null).limitUnlimited()
ExtentTraverser last = new ExtentTraverser(es.getExtent()).last(); // .build();
Extent extent = last.get(); // ExtentTraverser last = new ExtentTraverser(es.getExtent()).last();
if (extent instanceof IQueueExtent) { // Extent extent = last.get();
last = last.previous(); // if (extent instanceof IQueueExtent) {
} // last = last.previous();
last.setNext(generator); // }
try { // last.setNext(generator);
brush.build(es, wPos, context.getMaterial(), context.getSize()); // try {
} catch (WorldEditException e) { // brush.build(es, wPos, context.getMaterial(), context.getSize());
e.printStackTrace(); // } catch (WorldEditException e) {
} // e.printStackTrace();
es.flushQueue(); // }
viewer.view(generator); // es.flushQueue();
}, true, true); // viewer.view(generator);
// }, true, true);
return; //
} // return;
} // }
} // }
// }
} }
} }

View File

@ -1,7 +1,6 @@
package com.boydti.fawe.bukkit.listener; package com.boydti.fawe.bukkit.listener;
import com.boydti.fawe.FaweCache; import com.boydti.fawe.FaweCache;
import com.boydti.fawe.command.CFICommands;
import com.boydti.fawe.object.RunnableVal3; import com.boydti.fawe.object.RunnableVal3;
import com.boydti.fawe.object.brush.visualization.VirtualWorld; import com.boydti.fawe.object.brush.visualization.VirtualWorld;
import com.comphenix.protocol.PacketType; import com.comphenix.protocol.PacketType;
@ -262,10 +261,10 @@ public class CFIPacketListener implements Listener {
BukkitPlayer bukkitPlayer = BukkitAdapter.adapt(player); BukkitPlayer bukkitPlayer = BukkitAdapter.adapt(player);
VirtualWorld vw = bukkitPlayer.getSession().getVirtualWorld(); VirtualWorld vw = bukkitPlayer.getSession().getVirtualWorld();
if (vw != null) return vw; if (vw != null) return vw;
CFICommands.CFISettings settings = bukkitPlayer.getMeta("CFISettings"); // CFICommands.CFISettings settings = bukkitPlayer.getMeta("CFISettings");
if (settings != null && settings.hasGenerator() && settings.getGenerator().hasPacketViewer()) { // if (settings != null && settings.hasGenerator() && settings.getGenerator().hasPacketViewer()) {
return settings.getGenerator(); // return settings.getGenerator();
} // }
return null; return null;
} }

View File

@ -15,7 +15,6 @@ import com.boydti.fawe.util.TextureUtil;
import com.boydti.fawe.util.WEManager; import com.boydti.fawe.util.WEManager;
import com.github.luben.zstd.util.Native; import com.github.luben.zstd.util.Native;
import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.WorldEdit;
import com.sk89q.worldedit.extension.factory.DefaultTransformParser;
import com.sk89q.worldedit.extension.platform.Actor; import com.sk89q.worldedit.extension.platform.Actor;
import com.sk89q.worldedit.session.request.Request; import com.sk89q.worldedit.session.request.Request;
import java.io.BufferedReader; import java.io.BufferedReader;
@ -92,7 +91,8 @@ public class Fawe {
private FaweVersion version; private FaweVersion version;
private VisualQueue visualQueue; private VisualQueue visualQueue;
private TextureUtil textures; private TextureUtil textures;
private DefaultTransformParser transformParser; // TODO: Ping @MattBDev to reimplement 2020-02-04
// private DefaultTransformParser transformParser;
private QueueHandler queueHandler; private QueueHandler queueHandler;
@ -184,7 +184,8 @@ public class Fawe {
// Delayed worldedit setup // Delayed worldedit setup
TaskManager.IMP.later(() -> { TaskManager.IMP.later(() -> {
try { try {
transformParser = new DefaultTransformParser(getWorldEdit()); // TODO: Ping @MattBDev to reimplement 2020-02-04
// transformParser = new DefaultTransformParser(getWorldEdit());
visualQueue = new VisualQueue(3); visualQueue = new VisualQueue(3);
WEManager.IMP.managers.addAll(Fawe.this.IMP.getMaskManagers()); WEManager.IMP.managers.addAll(Fawe.this.IMP.getMaskManagers());
WEManager.IMP.managers.add(new PlotSquaredFeature()); WEManager.IMP.managers.add(new PlotSquaredFeature());
@ -209,9 +210,10 @@ public class Fawe {
return queueHandler; return queueHandler;
} }
public DefaultTransformParser getTransformParser() { // TODO: Ping @MattBDev to reimplement 2020-02-04
return transformParser; // public DefaultTransformParser getTransformParser() {
} // return transformParser;
// }
public TextureUtil getCachedTextureUtil(boolean randomize, int min, int max) { public TextureUtil getCachedTextureUtil(boolean randomize, int min, int max) {
// TODO NOT IMPLEMENTED - optimize this by caching the default true/0/100 texture util // TODO NOT IMPLEMENTED - optimize this by caching the default true/0/100 texture util

View File

@ -1,88 +1,89 @@
package com.boydti.fawe.command; // TODO: Ping @MattBDev to reimplement 2020-02-04
//package com.boydti.fawe.command;
import static com.sk89q.worldedit.util.formatting.text.TextComponent.newline; //
//import static com.sk89q.worldedit.util.formatting.text.TextComponent.newline;
import com.boydti.fawe.command.CFICommands.CFISettings; //
import com.boydti.fawe.object.brush.visualization.cfi.HeightMapMCAGenerator; //import com.boydti.fawe.command.CFICommands.CFISettings;
import com.boydti.fawe.object.changeset.CFIChangeSet; //import com.boydti.fawe.object.brush.visualization.cfi.HeightMapMCAGenerator;
import com.sk89q.worldedit.LocalSession; //import com.boydti.fawe.object.changeset.CFIChangeSet;
import com.sk89q.worldedit.entity.Player; //import com.sk89q.worldedit.LocalSession;
import com.sk89q.worldedit.util.formatting.text.TextComponent; //import com.sk89q.worldedit.entity.Player;
import java.io.IOException; //import com.sk89q.worldedit.util.formatting.text.TextComponent;
import java.util.ArrayList; //import java.io.IOException;
import java.util.List; //import java.util.ArrayList;
import org.enginehub.piston.CommandManager; //import java.util.List;
import org.enginehub.piston.exception.StopExecutionException; //import org.enginehub.piston.CommandManager;
import org.enginehub.piston.inject.InjectedValueAccess; //import org.enginehub.piston.exception.StopExecutionException;
import org.enginehub.piston.inject.Key; //import org.enginehub.piston.inject.InjectedValueAccess;
//import org.enginehub.piston.inject.Key;
public class CFICommand extends CommandProcessor<Object, Object> { //
//public class CFICommand extends CommandProcessor<Object, Object> {
public CFICommand(CommandManager manager) { //
super(manager); // public CFICommand(CommandManager manager) {
} // super(manager);
// }
@Override //
public List<String> preprocess(InjectedValueAccess context, List<String> args) { // @Override
Player player = context.injectedValue(Key.of(Player.class)).orElseThrow(() -> new IllegalStateException("No player")); // public List<String> preprocess(InjectedValueAccess context, List<String> args) {
CFICommands.CFISettings settings = CFICommands.getSettings(player); // Player player = context.injectedValue(Key.of(Player.class)).orElseThrow(() -> new IllegalStateException("No player"));
settings.popMessages(player); // CFICommands.CFISettings settings = CFICommands.getSettings(player);
args = dispatch(player, settings, args, context); // settings.popMessages(player);
HeightMapMCAGenerator gen = settings.getGenerator(); // args = dispatch(player, settings, args, context);
if (gen != null && gen.isModified()) { // HeightMapMCAGenerator gen = settings.getGenerator();
try { // if (gen != null && gen.isModified()) {
gen.update(); // try {
CFIChangeSet set = new CFIChangeSet(gen, player.getUniqueId()); // gen.update();
LocalSession session = player.getSession(); // CFIChangeSet set = new CFIChangeSet(gen, player.getUniqueId());
session.remember(player, gen, set, player.getLimit()); // LocalSession session = player.getSession();
} catch (IOException e) { // session.remember(player, gen, set, player.getLimit());
throw new StopExecutionException(TextComponent.of(e.getMessage())); // } catch (IOException e) {
} // throw new StopExecutionException(TextComponent.of(e.getMessage()));
} // }
return args; // }
} // return args;
// }
@Override //
public Object process(InjectedValueAccess context, List<String> args, Object result) { // @Override
return result; // public Object process(InjectedValueAccess context, List<String> args, Object result) {
} // return result;
// }
private List<String> dispatch(Player player, CFISettings settings, List<String> args, InjectedValueAccess context) { //
if (!settings.hasGenerator()) { // private List<String> dispatch(Player player, CFISettings settings, List<String> args, InjectedValueAccess context) {
if (args.size() == 0) { // if (!settings.hasGenerator()) {
String hmCmd = "/cfi "; // if (args.size() == 0) {
if (settings.image == null) { // String hmCmd = "/cfi ";
hmCmd += "image"; // if (settings.image == null) {
} else { // hmCmd += "image";
hmCmd = "heightmap" + " " + settings.imageArg; // } else {
} // hmCmd = "heightmap" + " " + settings.imageArg;
TextComponent build = TextComponent.builder("What do you want to use as the base?") // }
.append(newline()) // TextComponent build = TextComponent.builder("What do you want to use as the base?")
.append("[HeightMap]")/* TODO .cmdTip(hmCmd).*/.append(" - A heightmap like ") // .append(newline())
.append("[this]")//TODO .linkTip("http://i.imgur.com/qCd30MR.jpg") // .append("[HeightMap]")/* TODO .cmdTip(hmCmd).*/.append(" - A heightmap like ")
.append(newline()) // .append("[this]")//TODO .linkTip("http://i.imgur.com/qCd30MR.jpg")
.append("[Empty]")//TODO .cmdTip(CFICommands.alias() + " empty") // .append(newline())
.append("- An empty map of a specific size").build(); // .append("[Empty]")//TODO .cmdTip(CFICommands.alias() + " empty")
player.print(build); // .append("- An empty map of a specific size").build();
} else { // player.print(build);
args = new ArrayList<>(args); // } else {
switch (args.size()) { // args = new ArrayList<>(args);
case 1: // switch (args.size()) {
args.add(0, "heightmap"); // case 1:
break; // args.add(0, "heightmap");
case 2: // break;
args.add(0, "empty"); // case 2:
break; // args.add(0, "empty");
} // break;
return args; // }
} // return args;
} else { // }
if (args.isEmpty()) { // } else {
settings.setCategory(null); // if (args.isEmpty()) {
CFICommands.mainMenu(player); // settings.setCategory(null);
return null; // CFICommands.mainMenu(player);
} // return null;
} // }
return args; // }
} // return args;
} // }
//}

View File

@ -1,93 +0,0 @@
package com.boydti.fawe.command;
import com.google.common.collect.ImmutableSet;
import org.enginehub.piston.Command;
import org.enginehub.piston.CommandManager;
import org.enginehub.piston.CommandParseResult;
import org.enginehub.piston.converter.ArgumentConverter;
import org.enginehub.piston.inject.InjectedValueAccess;
import org.enginehub.piston.inject.Key;
import org.enginehub.piston.suggestion.Suggestion;
import java.util.List;
import java.util.Optional;
import java.util.function.Consumer;
import java.util.stream.Stream;
public abstract class CommandProcessor<I, O> implements CommandManager {
private final CommandManager parent;
public CommandProcessor(CommandManager parent) {
this.parent = parent;
}
@Override
public final Command.Builder newCommand(String s) {
return parent.newCommand(s);
}
@Override
public final void register(Command command) {
parent.register(command);
}
@Override
public final void register(String name, Consumer<Command.Builder> registrationProcess) {
parent.register(name, registrationProcess);
}
@Override
public final void registerManager(CommandManager manager) {
parent.registerManager(manager);
}
@Override
public final Stream<Command> getAllCommands() {
return parent.getAllCommands();
}
@Override
public final boolean containsCommand(String name) {
return parent.containsCommand(name);
}
@Override
public final Optional<Command> getCommand(String s) {
return parent.getCommand(s);
}
@Override
public final ImmutableSet<Suggestion> getSuggestions(InjectedValueAccess injectedValueAccess, List<String> list) {
return parent.getSuggestions(injectedValueAccess, list);
}
@Override
public final CommandParseResult parse(InjectedValueAccess injectedValueAccess, List<String> list) {
return parent.parse(injectedValueAccess, list);
}
@Override
public final Object execute(InjectedValueAccess context, List<String> args) {
args = preprocess(context, args);
if (args != null) {
Object result = parent.execute(context, args);
return process(context, args, result); // TODO NOT IMPLEMENTED (recompile piston)
} else {
return null;
}
}
@Override
public final <T> void registerConverter(Key<T> key, ArgumentConverter<T> argumentConverter) {
parent.registerConverter(key, argumentConverter);
}
@Override
public final <T> Optional<ArgumentConverter<T>> getConverter(Key<T> key) {
return parent.getConverter(key);
}
public abstract List<String> preprocess(InjectedValueAccess context, List<String> args);
public abstract Object process(InjectedValueAccess context, List<String> args, Object result);
}

View File

@ -1,113 +1,114 @@
package com.boydti.fawe.command; // TODO: Ping @MattBDev to reimplement 2020-02-04
//package com.boydti.fawe.command;
import com.boydti.fawe.util.StringMan; //
import com.sk89q.worldedit.WorldEdit; //import com.boydti.fawe.util.StringMan;
import com.sk89q.worldedit.extension.input.InputParseException; //import com.sk89q.worldedit.WorldEdit;
import com.sk89q.worldedit.extension.input.ParserContext; //import com.sk89q.worldedit.extension.input.InputParseException;
import com.sk89q.worldedit.extension.platform.PlatformCommandManager; //import com.sk89q.worldedit.extension.input.ParserContext;
import com.sk89q.worldedit.internal.registry.InputParser; //import com.sk89q.worldedit.extension.platform.PlatformCommandManager;
import org.enginehub.piston.inject.InjectedValueAccess; //import com.sk89q.worldedit.internal.registry.InputParser;
//import org.enginehub.piston.inject.InjectedValueAccess;
import java.util.*; //
//import java.util.*;
public abstract class FaweParser<T> extends InputParser<T> { //
//public abstract class FaweParser<T> extends InputParser<T> {
private final String prefix; //
// private final String prefix;
protected FaweParser(WorldEdit worldEdit, String prefix) { //
super(worldEdit); // protected FaweParser(WorldEdit worldEdit, String prefix) {
this.prefix = prefix; // super(worldEdit);
} // this.prefix = prefix;
// }
public PlatformCommandManager getPlatform() { //
return PlatformCommandManager.getInstance(); // public PlatformCommandManager getPlatform() {
} // return PlatformCommandManager.getInstance();
// }
public T parse(String input, ParserContext context) { //
input = prefix + " " + input; // public T parse(String input, ParserContext context) {
InjectedValueAccess injected = context.getInjected(); // input = prefix + " " + input;
if (injected != null) { // InjectedValueAccess injected = context.getInjected();
return getPlatform().parseCommand(input, injected); // if (injected != null) {
} else { // return getPlatform().parseCommand(input, injected);
return getPlatform().parseCommand(input, context.getActor()); // } else {
} // return getPlatform().parseCommand(input, context.getActor());
} // }
// }
public T catchSuggestion(String currentInput, String nextInput, ParserContext context) throws InputParseException { //
try { // public T catchSuggestion(String currentInput, String nextInput, ParserContext context) throws InputParseException {
return parseFromInput(nextInput, context); // try {
} catch (SuggestInputParseException e) { // return parseFromInput(nextInput, context);
e.prepend(currentInput.substring(0, currentInput.length() - nextInput.length())); // } catch (SuggestInputParseException e) {
throw e; // e.prepend(currentInput.substring(0, currentInput.length() - nextInput.length()));
} // throw e;
} // }
// }
protected static class ParseEntry { //
public boolean and; // protected static class ParseEntry {
public String input; // public boolean and;
public String full; // public String input;
// public String full;
public ParseEntry(String full, String input, boolean type) { //
this.full = full; // public ParseEntry(String full, String input, boolean type) {
this.input = input; // this.full = full;
this.and = type; // this.input = input;
} // this.and = type;
// }
@Override //
public String toString() { // @Override
return input + " | " + and; // public String toString() {
} // return input + " | " + and;
} // }
// }
public static List<Map.Entry<ParseEntry, List<String>>> parse(String toParse) throws InputParseException { //
List<Map.Entry<ParseEntry, List<String>>> keys = new ArrayList<>(); // public static List<Map.Entry<ParseEntry, List<String>>> parse(String toParse) throws InputParseException {
List<String> inputs = new ArrayList<>(); // List<Map.Entry<ParseEntry, List<String>>> keys = new ArrayList<>();
List<Boolean> and = new ArrayList<>(); // List<String> inputs = new ArrayList<>();
int last = 0; // List<Boolean> and = new ArrayList<>();
outer: // int last = 0;
for (int i = 0; i < toParse.length(); i++) { // outer:
char c = toParse.charAt(i); // for (int i = 0; i < toParse.length(); i++) {
switch (c) { // char c = toParse.charAt(i);
case ',': // switch (c) {
case '&': // case ',':
String result = toParse.substring(last, i); // case '&':
if (!result.isEmpty()) { // String result = toParse.substring(last, i);
inputs.add(result); // if (!result.isEmpty()) {
and.add(c == '&'); // inputs.add(result);
} else { // and.add(c == '&');
throw new InputParseException("Invalid dangling character " + c); // } else {
} // throw new InputParseException("Invalid dangling character " + c);
last = i + 1; // }
continue outer; // last = i + 1;
default: // continue outer;
if (c == '[' && StringMan.getMatchingBracket(c) != c) { // default:
int next = StringMan.findMatchingBracket(toParse, i); // if (c == '[' && StringMan.getMatchingBracket(c) != c) {
if (next != -1) { // int next = StringMan.findMatchingBracket(toParse, i);
i = next; // if (next != -1) {
} else { // i = next;
toParse += "]"; // } else {
i = toParse.length(); // toParse += "]";
} // i = toParse.length();
continue outer; // }
} // continue outer;
} // }
} // }
inputs.add(toParse.substring(last)); // }
for (int i = 0; i < inputs.size(); i++) { // inputs.add(toParse.substring(last));
String full = inputs.get(i); // for (int i = 0; i < inputs.size(); i++) {
String command = full; // String full = inputs.get(i);
List<String> args = new ArrayList<>(); // String command = full;
while (!command.isEmpty() && command.charAt(command.length() - 1) == ']') { // List<String> args = new ArrayList<>();
int startPos = StringMan.findMatchingBracket(command, command.length() - 1); // while (!command.isEmpty() && command.charAt(command.length() - 1) == ']') {
if (startPos == -1) break; // int startPos = StringMan.findMatchingBracket(command, command.length() - 1);
String arg = command.substring(startPos + 1, command.length() - 1); // if (startPos == -1) break;
args.add(arg); // String arg = command.substring(startPos + 1, command.length() - 1);
command = full.substring(0, startPos); // args.add(arg);
} // command = full.substring(0, startPos);
Collections.reverse(args); // }
ParseEntry entry = new ParseEntry(full, command, i > 0 ? and.get(i - 1) : false); // Collections.reverse(args);
keys.add(new AbstractMap.SimpleEntry<>(entry, args)); // ParseEntry entry = new ParseEntry(full, command, i > 0 ? and.get(i - 1) : false);
} // keys.add(new AbstractMap.SimpleEntry<>(entry, args));
return keys; // }
} // return keys;
} // }
//}

View File

@ -1,82 +1,83 @@
package com.boydti.fawe.command; // TODO: Ping @MattBDev to reimplement 2020-02-04
//package com.boydti.fawe.command;
import com.boydti.fawe.command.CFICommands.CFISettings; //
import com.boydti.fawe.object.RunnableVal; //import com.boydti.fawe.command.CFICommands.CFISettings;
import com.boydti.fawe.util.TaskManager; //import com.boydti.fawe.object.RunnableVal;
import com.github.intellectualsites.plotsquared.plot.PlotSquared; //import com.boydti.fawe.util.TaskManager;
import com.github.intellectualsites.plotsquared.plot.commands.Auto; //import com.github.intellectualsites.plotsquared.plot.PlotSquared;
import com.github.intellectualsites.plotsquared.plot.config.Captions; //import com.github.intellectualsites.plotsquared.plot.commands.Auto;
import com.github.intellectualsites.plotsquared.plot.config.Settings; //import com.github.intellectualsites.plotsquared.plot.config.Captions;
import com.github.intellectualsites.plotsquared.plot.database.DBFunc; //import com.github.intellectualsites.plotsquared.plot.config.Settings;
import com.github.intellectualsites.plotsquared.plot.object.Plot; //import com.github.intellectualsites.plotsquared.plot.database.DBFunc;
import com.github.intellectualsites.plotsquared.plot.object.PlotArea; //import com.github.intellectualsites.plotsquared.plot.object.Plot;
import com.github.intellectualsites.plotsquared.plot.object.PlotId; //import com.github.intellectualsites.plotsquared.plot.object.PlotArea;
import com.github.intellectualsites.plotsquared.plot.object.PlotPlayer; //import com.github.intellectualsites.plotsquared.plot.object.PlotId;
import com.github.intellectualsites.plotsquared.plot.object.worlds.PlotAreaManager; //import com.github.intellectualsites.plotsquared.plot.object.PlotPlayer;
import com.github.intellectualsites.plotsquared.plot.object.worlds.SinglePlotArea; //import com.github.intellectualsites.plotsquared.plot.object.worlds.PlotAreaManager;
import com.github.intellectualsites.plotsquared.plot.object.worlds.SinglePlotAreaManager; //import com.github.intellectualsites.plotsquared.plot.object.worlds.SinglePlotArea;
import com.sk89q.worldedit.extension.platform.Actor; //import com.github.intellectualsites.plotsquared.plot.object.worlds.SinglePlotAreaManager;
import java.io.File; //import com.sk89q.worldedit.extension.platform.Actor;
import java.io.IOException; //import java.io.File;
import java.util.function.Function; //import java.io.IOException;
//import java.util.function.Function;
public class PlotLoader { //
//public class PlotLoader {
@Deprecated //
public static void autoClaimFromDatabase(PlotPlayer player, PlotArea area, PlotId start, // @Deprecated
com.github.intellectualsites.plotsquared.plot.object.RunnableVal<Plot> whenDone) { // public static void autoClaimFromDatabase(PlotPlayer player, PlotArea area, PlotId start,
final Plot plot = area.getNextFreePlot(player, start); // com.github.intellectualsites.plotsquared.plot.object.RunnableVal<Plot> whenDone) {
if (plot == null) { // final Plot plot = area.getNextFreePlot(player, start);
whenDone.run(null); // if (plot == null) {
return; // whenDone.run(null);
} // return;
whenDone.value = plot; // }
plot.owner = player.getUUID(); // whenDone.value = plot;
DBFunc.createPlotSafe(plot, whenDone, // plot.owner = player.getUUID();
() -> autoClaimFromDatabase(player, area, plot.getId(), whenDone)); // DBFunc.createPlotSafe(plot, whenDone,
} // () -> autoClaimFromDatabase(player, area, plot.getId(), whenDone));
// }
public void load(Actor actor, CFISettings settings, Function<File, Boolean> createTask) throws IOException { //
PlotAreaManager manager = PlotSquared.get().getPlotAreaManager(); // public void load(Actor actor, CFISettings settings, Function<File, Boolean> createTask) throws IOException {
if (manager instanceof SinglePlotAreaManager) { // PlotAreaManager manager = PlotSquared.get().getPlotAreaManager();
SinglePlotAreaManager sManager = (SinglePlotAreaManager) manager; // if (manager instanceof SinglePlotAreaManager) {
SinglePlotArea area = sManager.getArea(); // SinglePlotAreaManager sManager = (SinglePlotAreaManager) manager;
PlotPlayer player = PlotPlayer.get(actor.getName()); // SinglePlotArea area = sManager.getArea();
// PlotPlayer player = PlotPlayer.get(actor.getName());
actor.print("Claiming world"); //
Plot plot = TaskManager.IMP.sync(new RunnableVal<Plot>() { // actor.print("Claiming world");
@Override // Plot plot = TaskManager.IMP.sync(new RunnableVal<Plot>() {
public void run(Plot o) { // @Override
int currentPlots = Settings.Limit.GLOBAL ? player.getPlotCount() // public void run(Plot o) {
: player.getPlotCount(area.worldname); // int currentPlots = Settings.Limit.GLOBAL ? player.getPlotCount()
int diff = player.getAllowedPlots() - currentPlots; // : player.getPlotCount(area.worldname);
if (diff < 1) { // int diff = player.getAllowedPlots() - currentPlots;
Captions.CANT_CLAIM_MORE_PLOTS_NUM.send(player, -diff); // if (diff < 1) {
return; // Captions.CANT_CLAIM_MORE_PLOTS_NUM.send(player, -diff);
} // return;
// }
if (area.getMeta("lastPlot") == null) { //
area.setMeta("lastPlot", new PlotId(0, 0)); // if (area.getMeta("lastPlot") == null) {
} // area.setMeta("lastPlot", new PlotId(0, 0));
PlotId lastId = (PlotId) area.getMeta("lastPlot"); // }
do { // PlotId lastId = (PlotId) area.getMeta("lastPlot");
lastId = Auto.getNextPlotId(lastId, 1); // do {
} while (!area.canClaim(player, lastId, lastId)); // lastId = Auto.getNextPlotId(lastId, 1);
area.setMeta("lastPlot", lastId); // } while (!area.canClaim(player, lastId, lastId));
this.value = area.getPlot(lastId); // area.setMeta("lastPlot", lastId);
this.value.setOwner(player.getUUID()); // this.value = area.getPlot(lastId);
} // this.value.setOwner(player.getUUID());
}); // }
if (plot != null) { // });
// if (plot != null) {
File folder = CFICommands.getFolder(plot.getWorldName()); //
Boolean result = createTask.apply(folder); // File folder = CFICommands.getFolder(plot.getWorldName());
if (result == Boolean.TRUE) { // Boolean result = createTask.apply(folder);
TaskManager.IMP.sync(() -> plot.teleportPlayer(player)); // if (result == Boolean.TRUE) {
} // TaskManager.IMP.sync(() -> plot.teleportPlayer(player));
return; // }
} // return;
} // }
createTask.apply(null); // }
} // createTask.apply(null);
} // }
//}

View File

@ -58,65 +58,66 @@ public class BrushSettings {
this.constructor.put(SettingType.PERMISSIONS, permissions); this.constructor.put(SettingType.PERMISSIONS, permissions);
} }
public static BrushSettings get(BrushTool tool, Player player, LocalSession session, Map<String, Object> settings) throws InputParseException { // TODO: Ping @MattBDev to reimplement 2020-02-04
PlatformCommandManager manager = PlatformCommandManager.getInstance(); // public static BrushSettings get(BrushTool tool, Player player, LocalSession session, Map<String, Object> settings) throws InputParseException {
String constructor = (String) settings.get(SettingType.BRUSH.name()); // PlatformCommandManager manager = PlatformCommandManager.getInstance();
if (constructor == null) { // String constructor = (String) settings.get(SettingType.BRUSH.name());
return new BrushSettings(); // if (constructor == null) {
} // return new BrushSettings();
BrushSettings bs = manager.parseCommand(constructor, player); // }
bs.constructor.put(SettingType.BRUSH, constructor); // BrushSettings bs = manager.parseCommand(constructor, player);
if (settings.containsKey(SettingType.PERMISSIONS.name())) { // bs.constructor.put(SettingType.BRUSH, constructor);
bs.permissions.addAll((Collection<? extends String>) settings.get(SettingType.PERMISSIONS.name())); // if (settings.containsKey(SettingType.PERMISSIONS.name())) {
} // bs.permissions.addAll((Collection<? extends String>) settings.get(SettingType.PERMISSIONS.name()));
if (settings.containsKey(SettingType.SIZE.name())) { // }
try { // if (settings.containsKey(SettingType.SIZE.name())) {
bs.size = Expression.compile((String) settings.getOrDefault(SettingType.SIZE.name(), -1)); // try {
bs.size.optimize(); // bs.size = Expression.compile((String) settings.getOrDefault(SettingType.SIZE.name(), -1));
} catch (ExpressionException e) { // bs.size.optimize();
throw new RuntimeException(e); // } catch (ExpressionException e) {
} // throw new RuntimeException(e);
} // }
// }
ParserContext parserContext = new ParserContext(); //
parserContext.setActor(player); // ParserContext parserContext = new ParserContext();
parserContext.setWorld(player.getWorld()); // parserContext.setActor(player);
parserContext.setSession(session); // parserContext.setWorld(player.getWorld());
// parserContext.setSession(session);
if (settings.containsKey(SettingType.MASK.name())) { //
String maskArgs = (String) settings.get(SettingType.MASK.name()); // if (settings.containsKey(SettingType.MASK.name())) {
Mask mask = WorldEdit.getInstance().getMaskFactory().parseFromInput(maskArgs, parserContext); // String maskArgs = (String) settings.get(SettingType.MASK.name());
bs.setMask(mask); // Mask mask = WorldEdit.getInstance().getMaskFactory().parseFromInput(maskArgs, parserContext);
bs.constructor.put(SettingType.MASK, maskArgs); // bs.setMask(mask);
} // bs.constructor.put(SettingType.MASK, maskArgs);
if (settings.containsKey(SettingType.SOURCE_MASK.name())) { // }
String maskArgs = (String) settings.get(SettingType.SOURCE_MASK.name()); // if (settings.containsKey(SettingType.SOURCE_MASK.name())) {
Mask mask = WorldEdit.getInstance().getMaskFactory().parseFromInput(maskArgs, parserContext); // String maskArgs = (String) settings.get(SettingType.SOURCE_MASK.name());
bs.setSourceMask(mask); // Mask mask = WorldEdit.getInstance().getMaskFactory().parseFromInput(maskArgs, parserContext);
bs.constructor.put(SettingType.SOURCE_MASK, maskArgs); // bs.setSourceMask(mask);
} // bs.constructor.put(SettingType.SOURCE_MASK, maskArgs);
if (settings.containsKey(SettingType.TRANSFORM.name())) { // }
String transformArgs = (String) settings.get(SettingType.TRANSFORM.name()); // if (settings.containsKey(SettingType.TRANSFORM.name())) {
ResettableExtent extent = Fawe.get().getTransformParser().parseFromInput(transformArgs, parserContext); // String transformArgs = (String) settings.get(SettingType.TRANSFORM.name());
bs.setTransform(extent); // ResettableExtent extent = Fawe.get().getTransformParser().parseFromInput(transformArgs, parserContext);
bs.constructor.put(SettingType.TRANSFORM, transformArgs); // bs.setTransform(extent);
} // bs.constructor.put(SettingType.TRANSFORM, transformArgs);
if (settings.containsKey(SettingType.FILL.name())) { // }
String fillArgs = (String) settings.get(SettingType.FILL.name()); // if (settings.containsKey(SettingType.FILL.name())) {
Pattern pattern = WorldEdit.getInstance().getPatternFactory().parseFromInput(fillArgs, parserContext); // String fillArgs = (String) settings.get(SettingType.FILL.name());
bs.setFill(pattern); // Pattern pattern = WorldEdit.getInstance().getPatternFactory().parseFromInput(fillArgs, parserContext);
bs.constructor.put(SettingType.FILL, fillArgs); // bs.setFill(pattern);
} // bs.constructor.put(SettingType.FILL, fillArgs);
if (settings.containsKey(SettingType.SCROLL_ACTION.name())) { // }
String actionArgs = (String) settings.get(SettingType.SCROLL_ACTION.name()); // if (settings.containsKey(SettingType.SCROLL_ACTION.name())) {
Scroll action = Scroll.fromArguments(tool, player, session, actionArgs, false); // String actionArgs = (String) settings.get(SettingType.SCROLL_ACTION.name());
if (action != null) { // Scroll action = Scroll.fromArguments(tool, player, session, actionArgs, false);
bs.setScrollAction(action); // if (action != null) {
bs.constructor.put(SettingType.SCROLL_ACTION, actionArgs); // bs.setScrollAction(action);
} // bs.constructor.put(SettingType.SCROLL_ACTION, actionArgs);
} // }
return bs; // }
} // return bs;
// }
public BrushSettings setBrush(Brush brush) { public BrushSettings setBrush(Brush brush) {
Brush tmp = this.brush; Brush tmp = this.brush;

View File

@ -41,23 +41,24 @@ public final class BrushCache {
CompoundTag nbt = item.getNbtData(); CompoundTag nbt = item.getNbtData();
if (nbt == null) return null; if (nbt == null) return null;
StringTag json = (StringTag) nbt.getValue().get("weBrushJson"); StringTag json = (StringTag) nbt.getValue().get("weBrushJson");
if (json != null) { // TODO: Ping @MattBDev to reimplement 2020-02-04
try { // if (json != null) {
if (RECURSION.get() != null) return null; // try {
RECURSION.set(true); // if (RECURSION.get() != null) return null;
// RECURSION.set(true);
BrushTool tool = BrushTool.fromString(player, session, json.getValue()); //
tool.setHolder(item); // BrushTool tool = BrushTool.fromString(player, session, json.getValue());
brushCache.put(key, tool); // tool.setHolder(item);
return tool; // brushCache.put(key, tool);
} catch (Exception throwable) { // return tool;
getLogger(BrushCache.class).debug("Invalid brush for " + player + " holding " + item.getType() + ": " + json.getValue(), throwable); // } catch (Exception throwable) {
item.setNbtData(null); // getLogger(BrushCache.class).debug("Invalid brush for " + player + " holding " + item.getType() + ": " + json.getValue(), throwable);
brushCache.remove(key); // item.setNbtData(null);
} finally { // brushCache.remove(key);
RECURSION.remove(); // } finally {
} // RECURSION.remove();
} // }
// }
return null; return null;
} }

View File

@ -155,6 +155,15 @@ public class BrushCommands {
this.worldEdit = worldEdit; this.worldEdit = worldEdit;
} }
@Command(
name = "none",
aliases = "unbind",
desc = "Unbind a bound brush from your current item"
)
void none(Player player, LocalSession session) throws WorldEditException {
ToolCommands.setToolNone(player, session, true);
}
@Command( @Command(
name = "blendball", name = "blendball",
aliases = {"bb", "blend"}, aliases = {"bb", "blend"},
@ -984,38 +993,39 @@ public class BrushCommands {
} }
} }
@Command( // TODO: Ping @MattBDev to reimplement 2020-02-04
name = "loadbrush", // @Command(
aliases = {"load"}, // name = "loadbrush",
desc = "Load a brush" // aliases = {"load"},
) // desc = "Load a brush"
@CommandPermissions("worldedit.brush.load") // )
public void loadBrush(Player player, LocalSession session, @Arg(desc = "String name") String name) // @CommandPermissions("worldedit.brush.load")
throws WorldEditException, IOException { // public void loadBrush(Player player, LocalSession session, @Arg(desc = "String name") String name)
name = FileSystems.getDefault().getPath(name).getFileName().toString(); // throws WorldEditException, IOException {
File folder = MainUtil.getFile(Fawe.imp().getDirectory(), "brushes"); // name = FileSystems.getDefault().getPath(name).getFileName().toString();
name = name.endsWith(".jsgz") ? name : name + ".jsgz"; // File folder = MainUtil.getFile(Fawe.imp().getDirectory(), "brushes");
File file = new File(folder, player.getUniqueId() + File.separator + name); // name = name.endsWith(".jsgz") ? name : name + ".jsgz";
if (!file.exists()) { // File file = new File(folder, player.getUniqueId() + File.separator + name);
file = new File(folder, name); // if (!file.exists()) {
} // file = new File(folder, name);
if (!file.exists()) { // }
File[] files = folder.listFiles(pathname -> false); // if (!file.exists()) {
player.print(Caption.of("fawe.error.brush.not.found" , name)); // File[] files = folder.listFiles(pathname -> false);
return; // player.print(Caption.of("fawe.error.brush.not.found" , name));
} // return;
try (DataInputStream in = new DataInputStream( // }
new GZIPInputStream(new FileInputStream(file)))) { // try (DataInputStream in = new DataInputStream(
String json = in.readUTF(); // new GZIPInputStream(new FileInputStream(file)))) {
BrushTool tool = BrushTool.fromString(player, session, json); // String json = in.readUTF();
BaseItem item = player.getItemInHand(HandSide.MAIN_HAND); // BrushTool tool = BrushTool.fromString(player, session, json);
session.setTool(item, tool, player); // BaseItem item = player.getItemInHand(HandSide.MAIN_HAND);
player.print(Caption.of("fawe.worldedit.brush.brush.equipped" , name)); // session.setTool(item, tool, player);
} catch (Throwable e) { // player.print(Caption.of("fawe.worldedit.brush.brush.equipped" , name));
e.printStackTrace(); // } catch (Throwable e) {
player.printError(TranslatableComponent.of("fawe.error.brush.incompatible")); // e.printStackTrace();
} // player.printError(TranslatableComponent.of("fawe.error.brush.incompatible"));
} // }
// }
@Command( @Command(
name = "/listbrush", name = "/listbrush",

View File

@ -1,448 +1,449 @@
package com.sk89q.worldedit.command; // TODO: Ping @MattBDev to reimplement (or remove because this class is stupid) 2020-02-04
//package com.sk89q.worldedit.command;
import com.boydti.fawe.object.mask.AdjacentAnyMask; //
import com.boydti.fawe.object.mask.AdjacentMask; //import com.boydti.fawe.object.mask.AdjacentAnyMask;
import com.boydti.fawe.object.mask.AngleMask; //import com.boydti.fawe.object.mask.AdjacentMask;
import com.boydti.fawe.object.mask.BiomeMask; //import com.boydti.fawe.object.mask.AngleMask;
import com.boydti.fawe.object.mask.BlockLightMask; //import com.boydti.fawe.object.mask.BiomeMask;
import com.boydti.fawe.object.mask.BrightnessMask; //import com.boydti.fawe.object.mask.BlockLightMask;
import com.boydti.fawe.object.mask.DataMask; //import com.boydti.fawe.object.mask.BrightnessMask;
import com.boydti.fawe.object.mask.ExtremaMask; //import com.boydti.fawe.object.mask.DataMask;
import com.boydti.fawe.object.mask.IdDataMask; //import com.boydti.fawe.object.mask.ExtremaMask;
import com.boydti.fawe.object.mask.IdMask; //import com.boydti.fawe.object.mask.IdDataMask;
import com.boydti.fawe.object.mask.LightMask; //import com.boydti.fawe.object.mask.IdMask;
import com.boydti.fawe.object.mask.OpacityMask; //import com.boydti.fawe.object.mask.LightMask;
import com.boydti.fawe.object.mask.ROCAngleMask; //import com.boydti.fawe.object.mask.OpacityMask;
import com.boydti.fawe.object.mask.RadiusMask; //import com.boydti.fawe.object.mask.ROCAngleMask;
import com.boydti.fawe.object.mask.RandomMask; //import com.boydti.fawe.object.mask.RadiusMask;
import com.boydti.fawe.object.mask.SimplexMask; //import com.boydti.fawe.object.mask.RandomMask;
import com.boydti.fawe.object.mask.SkyLightMask; //import com.boydti.fawe.object.mask.SimplexMask;
import com.boydti.fawe.object.mask.SurfaceMask; //import com.boydti.fawe.object.mask.SkyLightMask;
import com.boydti.fawe.object.mask.WallMask; //import com.boydti.fawe.object.mask.SurfaceMask;
import com.boydti.fawe.object.mask.XAxisMask; //import com.boydti.fawe.object.mask.WallMask;
import com.boydti.fawe.object.mask.YAxisMask; //import com.boydti.fawe.object.mask.XAxisMask;
import com.boydti.fawe.object.mask.ZAxisMask; //import com.boydti.fawe.object.mask.YAxisMask;
import com.sk89q.worldedit.IncompleteRegionException; //import com.boydti.fawe.object.mask.ZAxisMask;
import com.sk89q.worldedit.LocalSession; //import com.sk89q.worldedit.IncompleteRegionException;
import com.sk89q.worldedit.WorldEdit; //import com.sk89q.worldedit.LocalSession;
import com.sk89q.worldedit.command.util.CommandPermissionsConditionGenerator; //import com.sk89q.worldedit.WorldEdit;
import com.sk89q.worldedit.entity.Player; //import com.sk89q.worldedit.command.util.CommandPermissionsConditionGenerator;
import com.sk89q.worldedit.extent.Extent; //import com.sk89q.worldedit.entity.Player;
import com.sk89q.worldedit.function.mask.BlockMaskBuilder; //import com.sk89q.worldedit.extent.Extent;
import com.sk89q.worldedit.function.mask.ExistingBlockMask; //import com.sk89q.worldedit.function.mask.BlockMaskBuilder;
import com.sk89q.worldedit.function.mask.ExpressionMask; //import com.sk89q.worldedit.function.mask.ExistingBlockMask;
import com.sk89q.worldedit.function.mask.Mask; //import com.sk89q.worldedit.function.mask.ExpressionMask;
import com.sk89q.worldedit.function.mask.MaskIntersection; //import com.sk89q.worldedit.function.mask.Mask;
import com.sk89q.worldedit.function.mask.MaskUnion; //import com.sk89q.worldedit.function.mask.MaskIntersection;
import com.sk89q.worldedit.function.mask.Masks; //import com.sk89q.worldedit.function.mask.MaskUnion;
import com.sk89q.worldedit.function.mask.OffsetMask; //import com.sk89q.worldedit.function.mask.Masks;
import com.sk89q.worldedit.function.mask.RegionMask; //import com.sk89q.worldedit.function.mask.OffsetMask;
import com.sk89q.worldedit.function.mask.SolidBlockMask; //import com.sk89q.worldedit.function.mask.RegionMask;
import com.sk89q.worldedit.internal.expression.Expression; //import com.sk89q.worldedit.function.mask.SolidBlockMask;
import com.sk89q.worldedit.internal.expression.ExpressionEnvironment; //import com.sk89q.worldedit.internal.expression.Expression;
import com.sk89q.worldedit.internal.expression.ExpressionException; //import com.sk89q.worldedit.internal.expression.ExpressionEnvironment;
import com.sk89q.worldedit.math.BlockVector3; //import com.sk89q.worldedit.internal.expression.ExpressionException;
import com.sk89q.worldedit.math.Vector3; //import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.regions.shape.WorldEditExpressionEnvironment; //import com.sk89q.worldedit.math.Vector3;
import com.sk89q.worldedit.session.request.RequestSelection; //import com.sk89q.worldedit.regions.shape.WorldEditExpressionEnvironment;
import com.sk89q.worldedit.world.biome.BiomeType; //import com.sk89q.worldedit.session.request.RequestSelection;
import org.enginehub.piston.annotation.Command; //import com.sk89q.worldedit.world.biome.BiomeType;
import org.enginehub.piston.annotation.CommandContainer; //import org.enginehub.piston.annotation.Command;
import org.enginehub.piston.annotation.param.Arg; //import org.enginehub.piston.annotation.CommandContainer;
import org.enginehub.piston.annotation.param.Switch; //import org.enginehub.piston.annotation.param.Arg;
//import org.enginehub.piston.annotation.param.Switch;
//@Command(aliases = {"masks"}, //
// desc = "Help for the various masks. [More Info](https://git.io/v9r4K)", ////@Command(aliases = {"masks"},
// descFooter = "Masks determine if a block can be placed\n" + //// desc = "Help for the various masks. [More Info](https://git.io/v9r4K)",
// " - Use [brackets] for arguments\n" + //// descFooter = "Masks determine if a block can be placed\n" +
// " - Use , to OR multiple\n" + //// " - Use [brackets] for arguments\n" +
// " - Use & to AND multiple\n" + //// " - Use , to OR multiple\n" +
// "e.g. >[stone,dirt],#light[0][5],$jungle\n" + //// " - Use & to AND multiple\n" +
// "More Info: https://git.io/v9r4K" //// "e.g. >[stone,dirt],#light[0][5],$jungle\n" +
//// "More Info: https://git.io/v9r4K"
////)
//@CommandContainer//(superTypes = CommandPermissionsConditionGenerator.Registration.class)
//public class MaskCommands {
// private final WorldEdit worldEdit;
//
// public MaskCommands(WorldEdit worldEdit) {
// this.worldEdit = worldEdit;
// }
//
// @Command(
// name = "#simplex",
// desc = "Use simplex noise as the mask"
// )
// public Mask simplex(@Arg(desc = "double scale") double scale, @Arg(name="mine", desc = "min light") double minInt, @Arg(name="mine", desc = "max light") double maxInt) {
// scale = 1d / Math.max(1, scale);
// minInt = (minInt - 50) / 50;
// maxInt = (maxInt - 50) / 50;
// return new SimplexMask(scale, minInt, maxInt);
// }
//
// @Command(
// name = "#light",
// desc = "Restrict to specific light levels"
// )
// public Mask light(Extent extent, @Arg(name="mine", desc = "min light") double minInt, @Arg(name="mine", desc = "max light") double maxInt) {
// return new LightMask(extent, (int) minInt, (int) maxInt);
// }
//
// @Command(
// name = "#false",
// desc = "Always false"
// )
// public Mask falseMask(Extent extent) {
// return Masks.alwaysFalse();
// }
//
// @Command(
// name = "#true",
// desc = "Always true"
// )
// public Mask trueMask(Extent extent) {
// return Masks.alwaysTrue();
// }
//
// @Command(
// name = "#skylight",
// desc = "Restrict to specific sky light levels"
// )
// public Mask skylight(Extent extent, @Arg(name="mine", desc = "min light") double minInt, @Arg(name="mine", desc = "max light") double maxInt) {
// return new SkyLightMask(extent, (int) minInt, (int) maxInt);
// }
//
// @Command(
// name = "#blocklight",
// aliases = {"#emittedlight"},
// desc = "Restrict to specific block light levels"
// )
// public Mask blocklight(Extent extent, @Arg(name="mine", desc = "min light") double minInt, @Arg(name="mine", desc = "max light") double maxInt) {
// return new BlockLightMask(extent, (int) minInt, (int) maxInt);
// }
//
// @Command(
// name = "#opacity",
// desc = "Restrict to specific opacity levels"
// )
// public Mask opacity(Extent extent, @Arg(name="mine", desc = "min light") double minInt, @Arg(name="mine", desc = "max light") double maxInt) {
// return new OpacityMask(extent, (int) minInt, (int) maxInt);
// }
//
// @Command(
// name = "#brightness",
// desc = "Restrict to specific block brightness"
// )
// public Mask brightness(Extent extent, @Arg(name="mine", desc = "min light") double minInt, @Arg(name="mine", desc = "max light") double maxInt) {
// return new BrightnessMask(extent, (int) minInt, (int) maxInt);
// }
//
// @Command(
// name = "#offset",
// desc = "Offset a mask"
// )
// public Mask offset(@Arg(desc = "double x") double x, @Arg(desc = "double y") double y, @Arg(desc = "double z") double z, @Arg(desc = "Mask") Mask mask) {
// return new OffsetMask(mask, BlockVector3.at(x, y, z));
// }
//
// @Command(
// name = "#haslight",
// desc = "Restricts to blocks with light (sky or emitted)"
// )
// public Mask haslight(Extent extent) {
// return new LightMask(extent, 1, Integer.MAX_VALUE);
// }
//
// @Command(
// name = "#nolight",
// desc = "Restrict to blocks without light (sky or emitted)"
// )
// public Mask nolight(Extent extent) {
// return new LightMask(extent, 0, 0);
// }
//
// @Command(
// name = "#existing",
// desc = "If there is a non air block"
// )
// public Mask existing(Extent extent) {
// return new ExistingBlockMask(extent);
// }
//
// @Command(
// name = "#solid",
// desc = "If there is a solid block"
// )
// public Mask solid(Extent extent) {
// return new SolidBlockMask(extent);
// }
//
// @Command(
// name = "#liquid",
// desc = "If there is a solid block"
// )
// public Mask liquid(Extent extent) {
// return new BlockMaskBuilder().addAll(b -> b.getMaterial().isLiquid()).build(extent);
// }
//
// @Command(
// name = "#dregion",
// aliases = {"#dselection", "#dsel"},
// desc = "inside the player's selection"
// )
// public Mask dregion() {
// return new RegionMask(new RequestSelection());
// }
//
// @Command(
// name = "#region",
// aliases = {"#selection", "#sel"},
// desc = "inside the provided selection"
// )
// public Mask selection(Player player, LocalSession session) throws IncompleteRegionException {
// return new RegionMask(session.getSelection(player.getWorld()).clone());
// }
//
// @Command(
// name = "#xaxis",
// desc = "Restrict to initial x axis"
// )
// public Mask xaxis() {
// return new XAxisMask();
// }
//
// @Command(
// name = "#yaxis",
// desc = "Restrict to initial y axis"
// )
// public Mask yaxis() {
// return new YAxisMask();
// }
//
// @Command(
// name = "#zaxis",
// desc = "Restrict to initial z axis"
// )
// public Mask zaxis() {
// return new ZAxisMask();
// }
//
// @Command(
// name = "#id",
// desc = "Restrict to initial id"
// )
// public Mask id(Extent extent) {
// return new IdMask(extent);
// }
//
// @Command(
// name = "#data",
// desc = "Restrict to initial data"
// )
// public Mask data(Extent extent) {
// return new DataMask(extent);
// }
//
// @Command(
// name = "#iddata",
// desc = "Restrict to initial block id and data"
// )
// public Mask iddata(Extent extent) {
// return new IdDataMask(extent);
// }
//
// @Command(
// name = "#air",
// desc = "Restrict to types of air"
// )
// public Mask air(Extent extent) {
// return new BlockMaskBuilder().addAll(b -> b.getMaterial().isAir()).build(extent);
// }
//
// @Command(
// name = "#wall",
// desc = "Restrict to walls (any block n,e,s,w of air)"
// )
// public Mask wall(Extent extent) {
// Mask blockMask = air(extent);
// return new MaskUnion(new ExistingBlockMask(extent), new WallMask(blockMask, 1, 8));
// }
//
// @Command(
// name = "#surface",
// desc = "Restrict to surfaces (any solid block touching air)"
// )
// public Mask surface(Extent extent) {
// return new SurfaceMask(extent);
// }
//
// @Command(
// name = "\\",
// aliases = {"/", "#angle", "#\\", "#/"},
// desc = "Restrict to specific terrain angle",
// descFooter = "Restrict to specific terrain angle\n" +
// "The -o flag will only overlay\n" +
// "Example: /[0d][45d]\n" +
// "Explanation: Allows any block where the adjacent block is between 0 and 45 degrees.\n" +
// "Example: /[3][20]\n" +
// "Explanation: Allows any block where the adjacent block is between 3 and 20 blocks below"
//) //)
@CommandContainer//(superTypes = CommandPermissionsConditionGenerator.Registration.class) // public Mask angle(Extent extent, @Arg(name="min", desc = "min angle") String minStr, @Arg(name="max", desc = "max angle") String maxStr, @Switch(name = 'o', desc = "TODO") boolean overlay, @Arg(name = "distance", desc = "int", def = "1") int distanceOpt) throws ExpressionException {
public class MaskCommands { // double y1, y2;
private final WorldEdit worldEdit; // boolean override;
// if (maxStr.endsWith("d")) {
public MaskCommands(WorldEdit worldEdit) { // double y1d = Expression.compile(minStr.substring(0, minStr.length() - 1)).evaluate();
this.worldEdit = worldEdit; // double y2d = Expression.compile(maxStr.substring(0, maxStr.length() - 1)).evaluate();
} // y1 = Math.tan(y1d * (Math.PI / 180));
// y2 = Math.tan(y2d * (Math.PI / 180));
@Command( // } else {
name = "#simplex", // y1 = Expression.compile(minStr).evaluate();
desc = "Use simplex noise as the mask" // y2 = Expression.compile(maxStr).evaluate();
) // }
public Mask simplex(@Arg(desc = "double scale") double scale, @Arg(name="mine", desc = "min light") double minInt, @Arg(name="mine", desc = "max light") double maxInt) { // return new AngleMask(extent, y1, y2, overlay, distanceOpt);
scale = 1d / Math.max(1, scale); // }
minInt = (minInt - 50) / 50; //
maxInt = (maxInt - 50) / 50; // @Command(
return new SimplexMask(scale, minInt, maxInt); // name = "(",
} // aliases = {")", "#roc", "#(", "#)"},
// desc = "Restrict to near specific terrain slope rate of change",
@Command( // descFooter = "Restrict to near specific terrain slope rate of change\n" +
name = "#light", // "The -o flag will only overlay\n" +
desc = "Restrict to specific light levels" // "Example: ([0d][45d][5]\n" +
) // "Explanation: Restrict near where the angle changes between 0-45 degrees within 5 blocks\n" +
public Mask light(Extent extent, @Arg(name="mine", desc = "min light") double minInt, @Arg(name="mine", desc = "max light") double maxInt) { // "Note: Use negatives for decreasing slope"
return new LightMask(extent, (int) minInt, (int) maxInt); //)
} // public Mask roc(Extent extent, @Arg(name="min", desc = "min angle") String minStr, @Arg(name="max", desc = "max angle") String maxStr, @Switch(name = 'o', desc = "TODO") boolean overlay, @Arg(name = "distance", desc = "int", def = "4") int distanceOpt) throws ExpressionException {
// double y1, y2;
@Command( // boolean override;
name = "#false", // if (maxStr.endsWith("d")) {
desc = "Always false" // double y1d = Expression.compile(minStr.substring(0, minStr.length() - 1)).evaluate();
) // double y2d = Expression.compile(maxStr.substring(0, maxStr.length() - 1)).evaluate();
public Mask falseMask(Extent extent) { // y1 = Math.tan(y1d * (Math.PI / 180));
return Masks.alwaysFalse(); // y2 = Math.tan(y2d * (Math.PI / 180));
} // } else {
// y1 = Expression.compile(minStr).evaluate();
@Command( // y2 = Expression.compile(maxStr).evaluate();
name = "#true", // }
desc = "Always true" // return new ROCAngleMask(extent, y1, y2, overlay, distanceOpt);
) // }
public Mask trueMask(Extent extent) { //
return Masks.alwaysTrue(); // @Command(
} // name = "^",
// aliases = {"#extrema", "#^"},
@Command( // desc = "Restrict to near specific terrain extrema",
name = "#skylight", // descFooter = "Restrict to near specific terrain extrema\n" +
desc = "Restrict to specific sky light levels" // "The -o flag will only overlay\n" +
) // "Example: ([0d][45d][5]\n" +
public Mask skylight(Extent extent, @Arg(name="mine", desc = "min light") double minInt, @Arg(name="mine", desc = "max light") double maxInt) { // "Explanation: Restrict to near 45 degrees of local maxima\n" +
return new SkyLightMask(extent, (int) minInt, (int) maxInt); // "Note: Use negatives for local minima"
} //)
// public Mask extrema(Extent extent, @Arg(name="min", desc = "min angle") String minStr, @Arg(name="max", desc = "max angle") String maxStr, @Switch(name = 'o', desc = "TODO") boolean overlay, @Arg(name = "distance", desc = "int", def = "4") int distanceOpt) throws ExpressionException {
@Command( // double y1, y2;
name = "#blocklight", // boolean override;
aliases = {"#emittedlight"}, // if (maxStr.endsWith("d")) {
desc = "Restrict to specific block light levels" // double y1d = Expression.compile(minStr.substring(0, minStr.length() - 1)).evaluate();
) // double y2d = Expression.compile(maxStr.substring(0, maxStr.length() - 1)).evaluate();
public Mask blocklight(Extent extent, @Arg(name="mine", desc = "min light") double minInt, @Arg(name="mine", desc = "max light") double maxInt) { // y1 = Math.tan(y1d * (Math.PI / 180));
return new BlockLightMask(extent, (int) minInt, (int) maxInt); // y2 = Math.tan(y2d * (Math.PI / 180));
} // } else {
// y1 = Expression.compile(minStr).evaluate();
@Command( // y2 = Expression.compile(maxStr).evaluate();
name = "#opacity", // }
desc = "Restrict to specific opacity levels" // return new ExtremaMask(extent, y1, y2, overlay, distanceOpt);
) // }
public Mask opacity(Extent extent, @Arg(name="mine", desc = "min light") double minInt, @Arg(name="mine", desc = "max light") double maxInt) { //
return new OpacityMask(extent, (int) minInt, (int) maxInt); // @Command(
} // name = "{",
// aliases = {"#{"},
@Command( // desc = "Restricts blocks to within a specific radius range of the initial block"
name = "#brightness", //)
desc = "Restrict to specific block brightness" // public Mask radius(@Arg(name="mine", desc = "min light") double minInt, @Arg(name="mine", desc = "max light") double maxInt) throws ExpressionException {
) // return new RadiusMask((int) minInt, (int) maxInt);
public Mask brightness(Extent extent, @Arg(name="mine", desc = "min light") double minInt, @Arg(name="mine", desc = "max light") double maxInt) { // }
return new BrightnessMask(extent, (int) minInt, (int) maxInt); //
} // @Command(
// name = "|",
@Command( // aliases = {"#|", "#side"},
name = "#offset", // desc = "sides with a specific number of other blocks"
desc = "Offset a mask" //)
) // public Mask wall(@Arg(desc = "Mask") Mask mask, @Arg(name="mine", desc = "min light") double minInt, @Arg(name="mine", desc = "max light") double maxInt) throws ExpressionException {
public Mask offset(@Arg(desc = "double x") double x, @Arg(desc = "double y") double y, @Arg(desc = "double z") double z, @Arg(desc = "Mask") Mask mask) { // return new WallMask(mask, (int) minInt, (int) maxInt);
return new OffsetMask(mask, BlockVector3.at(x, y, z)); // }
} //
// @Command(
@Command( // name = "~",
name = "#haslight", // aliases = {"#~", "#adjacent"},
desc = "Restricts to blocks with light (sky or emitted)" // desc = "Adjacent to a specific number of other blocks"
) //)
public Mask haslight(Extent extent) { // public Mask adjacent(@Arg(desc = "Mask") Mask mask, @Arg(name = "min", desc = "double", def = "-1") double min, @Arg(name = "max", desc = "double", def = "-1") double max) throws ExpressionException {
return new LightMask(extent, 1, Integer.MAX_VALUE); // if (min == -1 && max == -1) {
} // min = 1;
// max = 8;
@Command( // } else if (max == -1) max = min;
name = "#nolight", // if (max >= 8 && min == 1) {
desc = "Restrict to blocks without light (sky or emitted)" // return new AdjacentAnyMask(mask);
) // }
public Mask nolight(Extent extent) { // return new AdjacentMask(mask, (int) min, (int) max);
return new LightMask(extent, 0, 0); // }
} //
// @Command(
@Command( // name = "<",
name = "#existing", // aliases = {"#<", "#below"},
desc = "If there is a non air block" // desc = "below a specific block"
) //)
public Mask existing(Extent extent) { // public Mask below(@Arg(desc = "Mask") Mask mask) throws ExpressionException {
return new ExistingBlockMask(extent); // OffsetMask offsetMask = new OffsetMask(mask, BlockVector3.at(0, 1, 0));
} // return new MaskIntersection(offsetMask, Masks.negate(mask));
// }
@Command( //
name = "#solid", // @Command(
desc = "If there is a solid block" // name = ">",
) // aliases = {"#>", "#above"},
public Mask solid(Extent extent) { // desc = "above a specific block"
return new SolidBlockMask(extent); //)
} // public Mask above(@Arg(desc = "Mask") Mask mask) throws ExpressionException {
// OffsetMask offsetMask = new OffsetMask(mask, BlockVector3.at(0, -1, 0));
@Command( // return new MaskIntersection(offsetMask, Masks.negate(mask));
name = "#liquid", // }
desc = "If there is a solid block" //
) // @Command(
public Mask liquid(Extent extent) { // name = "$",
return new BlockMaskBuilder().addAll(b -> b.getMaterial().isLiquid()).build(extent); // aliases = {"#biome", "#$"},
} // desc = "in a specific biome",
// descFooter = "in a specific biome. For a list of biomes use //biomelist"
@Command( //)
name = "#dregion", // public Mask biome(Extent extent, @Arg(desc = "BiomeType") BiomeType biome) throws ExpressionException {
aliases = {"#dselection", "#dsel"}, // return new BiomeMask(extent, biome);
desc = "inside the player's selection" // }
) //
public Mask dregion() { // @Command(
return new RegionMask(new RequestSelection()); // name = "%",
} // aliases = {"#%", "#percent"},
// desc = "percentage chance"
@Command( //)
name = "#region", // public Mask random(@Arg(desc = "double chance") double chance) throws ExpressionException {
aliases = {"#selection", "#sel"}, // chance = chance / 100;
desc = "inside the provided selection" // return new RandomMask(chance);
) // }
public Mask selection(Player player, LocalSession session) throws IncompleteRegionException { //
return new RegionMask(session.getSelection(player.getWorld()).clone()); // @Command(
} // name = "=",
// aliases = {"#=", "#expression"},
@Command( // desc = "expression mask"
name = "#xaxis", //)
desc = "Restrict to initial x axis" // public Mask expression(Extent extent, @Arg(desc = "String expression") String input) throws ExpressionException {
) // Expression exp = Expression.compile(input, "x", "y", "z");
public Mask xaxis() { // ExpressionEnvironment env = new WorldEditExpressionEnvironment(extent, Vector3.ONE, Vector3.ZERO);
return new XAxisMask(); // exp.setEnvironment(env);
} // return new ExpressionMask(exp);
// }
@Command( //
name = "#yaxis", // @Command(
desc = "Restrict to initial y axis" // name = "!",
) // aliases = {"#not", "#negate", "#!"},
public Mask yaxis() { // desc = "Negate another mask"
return new YAxisMask(); //)
} // public Mask negate(@Arg(desc = "Mask") Mask mask) throws ExpressionException {
// return Masks.negate(mask);
@Command( // }
name = "#zaxis", //}
desc = "Restrict to initial z axis"
)
public Mask zaxis() {
return new ZAxisMask();
}
@Command(
name = "#id",
desc = "Restrict to initial id"
)
public Mask id(Extent extent) {
return new IdMask(extent);
}
@Command(
name = "#data",
desc = "Restrict to initial data"
)
public Mask data(Extent extent) {
return new DataMask(extent);
}
@Command(
name = "#iddata",
desc = "Restrict to initial block id and data"
)
public Mask iddata(Extent extent) {
return new IdDataMask(extent);
}
@Command(
name = "#air",
desc = "Restrict to types of air"
)
public Mask air(Extent extent) {
return new BlockMaskBuilder().addAll(b -> b.getMaterial().isAir()).build(extent);
}
@Command(
name = "#wall",
desc = "Restrict to walls (any block n,e,s,w of air)"
)
public Mask wall(Extent extent) {
Mask blockMask = air(extent);
return new MaskUnion(new ExistingBlockMask(extent), new WallMask(blockMask, 1, 8));
}
@Command(
name = "#surface",
desc = "Restrict to surfaces (any solid block touching air)"
)
public Mask surface(Extent extent) {
return new SurfaceMask(extent);
}
@Command(
name = "\\",
aliases = {"/", "#angle", "#\\", "#/"},
desc = "Restrict to specific terrain angle",
descFooter = "Restrict to specific terrain angle\n" +
"The -o flag will only overlay\n" +
"Example: /[0d][45d]\n" +
"Explanation: Allows any block where the adjacent block is between 0 and 45 degrees.\n" +
"Example: /[3][20]\n" +
"Explanation: Allows any block where the adjacent block is between 3 and 20 blocks below"
)
public Mask angle(Extent extent, @Arg(name="min", desc = "min angle") String minStr, @Arg(name="max", desc = "max angle") String maxStr, @Switch(name = 'o', desc = "TODO") boolean overlay, @Arg(name = "distance", desc = "int", def = "1") int distanceOpt) throws ExpressionException {
double y1, y2;
boolean override;
if (maxStr.endsWith("d")) {
double y1d = Expression.compile(minStr.substring(0, minStr.length() - 1)).evaluate();
double y2d = Expression.compile(maxStr.substring(0, maxStr.length() - 1)).evaluate();
y1 = Math.tan(y1d * (Math.PI / 180));
y2 = Math.tan(y2d * (Math.PI / 180));
} else {
y1 = Expression.compile(minStr).evaluate();
y2 = Expression.compile(maxStr).evaluate();
}
return new AngleMask(extent, y1, y2, overlay, distanceOpt);
}
@Command(
name = "(",
aliases = {")", "#roc", "#(", "#)"},
desc = "Restrict to near specific terrain slope rate of change",
descFooter = "Restrict to near specific terrain slope rate of change\n" +
"The -o flag will only overlay\n" +
"Example: ([0d][45d][5]\n" +
"Explanation: Restrict near where the angle changes between 0-45 degrees within 5 blocks\n" +
"Note: Use negatives for decreasing slope"
)
public Mask roc(Extent extent, @Arg(name="min", desc = "min angle") String minStr, @Arg(name="max", desc = "max angle") String maxStr, @Switch(name = 'o', desc = "TODO") boolean overlay, @Arg(name = "distance", desc = "int", def = "4") int distanceOpt) throws ExpressionException {
double y1, y2;
boolean override;
if (maxStr.endsWith("d")) {
double y1d = Expression.compile(minStr.substring(0, minStr.length() - 1)).evaluate();
double y2d = Expression.compile(maxStr.substring(0, maxStr.length() - 1)).evaluate();
y1 = Math.tan(y1d * (Math.PI / 180));
y2 = Math.tan(y2d * (Math.PI / 180));
} else {
y1 = Expression.compile(minStr).evaluate();
y2 = Expression.compile(maxStr).evaluate();
}
return new ROCAngleMask(extent, y1, y2, overlay, distanceOpt);
}
@Command(
name = "^",
aliases = {"#extrema", "#^"},
desc = "Restrict to near specific terrain extrema",
descFooter = "Restrict to near specific terrain extrema\n" +
"The -o flag will only overlay\n" +
"Example: ([0d][45d][5]\n" +
"Explanation: Restrict to near 45 degrees of local maxima\n" +
"Note: Use negatives for local minima"
)
public Mask extrema(Extent extent, @Arg(name="min", desc = "min angle") String minStr, @Arg(name="max", desc = "max angle") String maxStr, @Switch(name = 'o', desc = "TODO") boolean overlay, @Arg(name = "distance", desc = "int", def = "4") int distanceOpt) throws ExpressionException {
double y1, y2;
boolean override;
if (maxStr.endsWith("d")) {
double y1d = Expression.compile(minStr.substring(0, minStr.length() - 1)).evaluate();
double y2d = Expression.compile(maxStr.substring(0, maxStr.length() - 1)).evaluate();
y1 = Math.tan(y1d * (Math.PI / 180));
y2 = Math.tan(y2d * (Math.PI / 180));
} else {
y1 = Expression.compile(minStr).evaluate();
y2 = Expression.compile(maxStr).evaluate();
}
return new ExtremaMask(extent, y1, y2, overlay, distanceOpt);
}
@Command(
name = "{",
aliases = {"#{"},
desc = "Restricts blocks to within a specific radius range of the initial block"
)
public Mask radius(@Arg(name="mine", desc = "min light") double minInt, @Arg(name="mine", desc = "max light") double maxInt) throws ExpressionException {
return new RadiusMask((int) minInt, (int) maxInt);
}
@Command(
name = "|",
aliases = {"#|", "#side"},
desc = "sides with a specific number of other blocks"
)
public Mask wall(@Arg(desc = "Mask") Mask mask, @Arg(name="mine", desc = "min light") double minInt, @Arg(name="mine", desc = "max light") double maxInt) throws ExpressionException {
return new WallMask(mask, (int) minInt, (int) maxInt);
}
@Command(
name = "~",
aliases = {"#~", "#adjacent"},
desc = "Adjacent to a specific number of other blocks"
)
public Mask adjacent(@Arg(desc = "Mask") Mask mask, @Arg(name = "min", desc = "double", def = "-1") double min, @Arg(name = "max", desc = "double", def = "-1") double max) throws ExpressionException {
if (min == -1 && max == -1) {
min = 1;
max = 8;
} else if (max == -1) max = min;
if (max >= 8 && min == 1) {
return new AdjacentAnyMask(mask);
}
return new AdjacentMask(mask, (int) min, (int) max);
}
@Command(
name = "<",
aliases = {"#<", "#below"},
desc = "below a specific block"
)
public Mask below(@Arg(desc = "Mask") Mask mask) throws ExpressionException {
OffsetMask offsetMask = new OffsetMask(mask, BlockVector3.at(0, 1, 0));
return new MaskIntersection(offsetMask, Masks.negate(mask));
}
@Command(
name = ">",
aliases = {"#>", "#above"},
desc = "above a specific block"
)
public Mask above(@Arg(desc = "Mask") Mask mask) throws ExpressionException {
OffsetMask offsetMask = new OffsetMask(mask, BlockVector3.at(0, -1, 0));
return new MaskIntersection(offsetMask, Masks.negate(mask));
}
@Command(
name = "$",
aliases = {"#biome", "#$"},
desc = "in a specific biome",
descFooter = "in a specific biome. For a list of biomes use //biomelist"
)
public Mask biome(Extent extent, @Arg(desc = "BiomeType") BiomeType biome) throws ExpressionException {
return new BiomeMask(extent, biome);
}
@Command(
name = "%",
aliases = {"#%", "#percent"},
desc = "percentage chance"
)
public Mask random(@Arg(desc = "double chance") double chance) throws ExpressionException {
chance = chance / 100;
return new RandomMask(chance);
}
@Command(
name = "=",
aliases = {"#=", "#expression"},
desc = "expression mask"
)
public Mask expression(Extent extent, @Arg(desc = "String expression") String input) throws ExpressionException {
Expression exp = Expression.compile(input, "x", "y", "z");
ExpressionEnvironment env = new WorldEditExpressionEnvironment(extent, Vector3.ONE, Vector3.ZERO);
exp.setEnvironment(env);
return new ExpressionMask(exp);
}
@Command(
name = "!",
aliases = {"#not", "#negate", "#!"},
desc = "Negate another mask"
)
public Mask negate(@Arg(desc = "Mask") Mask mask) throws ExpressionException {
return Masks.negate(mask);
}
}

View File

@ -1,403 +1,404 @@
package com.sk89q.worldedit.command; // TODO: Ping @MattBDev to reimplement 2020-02-04
//package com.sk89q.worldedit.command;
import com.boydti.fawe.object.DataAnglePattern; //
import com.boydti.fawe.object.clipboard.MultiClipboardHolder; //import com.boydti.fawe.object.DataAnglePattern;
import com.boydti.fawe.object.collection.RandomCollection; //import com.boydti.fawe.object.clipboard.MultiClipboardHolder;
import com.boydti.fawe.object.pattern.AngleColorPattern; //import com.boydti.fawe.object.collection.RandomCollection;
import com.boydti.fawe.object.pattern.AverageColorPattern; //import com.boydti.fawe.object.pattern.AngleColorPattern;
import com.boydti.fawe.object.pattern.BiomePattern; //import com.boydti.fawe.object.pattern.AverageColorPattern;
import com.boydti.fawe.object.pattern.BufferedPattern; //import com.boydti.fawe.object.pattern.BiomePattern;
import com.boydti.fawe.object.pattern.BufferedPattern2D; //import com.boydti.fawe.object.pattern.BufferedPattern;
import com.boydti.fawe.object.pattern.DataPattern; //import com.boydti.fawe.object.pattern.BufferedPattern2D;
import com.boydti.fawe.object.pattern.DesaturatePattern; //import com.boydti.fawe.object.pattern.DataPattern;
import com.boydti.fawe.object.pattern.ExistingPattern; //import com.boydti.fawe.object.pattern.DesaturatePattern;
import com.boydti.fawe.object.pattern.ExpressionPattern; //import com.boydti.fawe.object.pattern.ExistingPattern;
import com.boydti.fawe.object.pattern.FullClipboardPattern; //import com.boydti.fawe.object.pattern.ExpressionPattern;
import com.boydti.fawe.object.pattern.IdDataMaskPattern; //import com.boydti.fawe.object.pattern.FullClipboardPattern;
import com.boydti.fawe.object.pattern.IdPattern; //import com.boydti.fawe.object.pattern.IdDataMaskPattern;
import com.boydti.fawe.object.pattern.Linear2DBlockPattern; //import com.boydti.fawe.object.pattern.IdPattern;
import com.boydti.fawe.object.pattern.Linear3DBlockPattern; //import com.boydti.fawe.object.pattern.Linear2DBlockPattern;
import com.boydti.fawe.object.pattern.LinearBlockPattern; //import com.boydti.fawe.object.pattern.Linear3DBlockPattern;
import com.boydti.fawe.object.pattern.MaskedPattern; //import com.boydti.fawe.object.pattern.LinearBlockPattern;
import com.boydti.fawe.object.pattern.NoXPattern; //import com.boydti.fawe.object.pattern.MaskedPattern;
import com.boydti.fawe.object.pattern.NoYPattern; //import com.boydti.fawe.object.pattern.NoXPattern;
import com.boydti.fawe.object.pattern.NoZPattern; //import com.boydti.fawe.object.pattern.NoYPattern;
import com.boydti.fawe.object.pattern.OffsetPattern; //import com.boydti.fawe.object.pattern.NoZPattern;
import com.boydti.fawe.object.pattern.PropertyPattern; //import com.boydti.fawe.object.pattern.OffsetPattern;
import com.boydti.fawe.object.pattern.RandomFullClipboardPattern; //import com.boydti.fawe.object.pattern.PropertyPattern;
import com.boydti.fawe.object.pattern.RandomOffsetPattern; //import com.boydti.fawe.object.pattern.RandomFullClipboardPattern;
import com.boydti.fawe.object.pattern.RelativePattern; //import com.boydti.fawe.object.pattern.RandomOffsetPattern;
import com.boydti.fawe.object.pattern.SaturatePattern; //import com.boydti.fawe.object.pattern.RelativePattern;
import com.boydti.fawe.object.pattern.ShadePattern; //import com.boydti.fawe.object.pattern.SaturatePattern;
import com.boydti.fawe.object.pattern.SolidRandomOffsetPattern; //import com.boydti.fawe.object.pattern.ShadePattern;
import com.boydti.fawe.object.pattern.SurfaceRandomOffsetPattern; //import com.boydti.fawe.object.pattern.SolidRandomOffsetPattern;
import com.boydti.fawe.object.random.SimplexRandom; //import com.boydti.fawe.object.pattern.SurfaceRandomOffsetPattern;
import com.boydti.fawe.util.ColorUtil; //import com.boydti.fawe.object.random.SimplexRandom;
import com.boydti.fawe.util.TextureUtil; //import com.boydti.fawe.util.ColorUtil;
import com.sk89q.worldedit.EmptyClipboardException; //import com.boydti.fawe.util.TextureUtil;
import com.sk89q.worldedit.LocalSession; //import com.sk89q.worldedit.EmptyClipboardException;
import com.sk89q.worldedit.entity.Player; //import com.sk89q.worldedit.LocalSession;
import com.sk89q.worldedit.extension.input.InputParseException; //import com.sk89q.worldedit.entity.Player;
import com.sk89q.worldedit.extension.platform.Actor; //import com.sk89q.worldedit.extension.input.InputParseException;
import com.sk89q.worldedit.extent.Extent; //import com.sk89q.worldedit.extension.platform.Actor;
import com.sk89q.worldedit.extent.clipboard.Clipboard; //import com.sk89q.worldedit.extent.Extent;
import com.sk89q.worldedit.extent.clipboard.io.ClipboardFormats; //import com.sk89q.worldedit.extent.clipboard.Clipboard;
import com.sk89q.worldedit.function.mask.Mask; //import com.sk89q.worldedit.extent.clipboard.io.ClipboardFormats;
import com.sk89q.worldedit.function.pattern.ClipboardPattern; //import com.sk89q.worldedit.function.mask.Mask;
import com.sk89q.worldedit.function.pattern.Pattern; //import com.sk89q.worldedit.function.pattern.ClipboardPattern;
import com.sk89q.worldedit.function.pattern.RandomPattern; //import com.sk89q.worldedit.function.pattern.Pattern;
import com.sk89q.worldedit.internal.expression.Expression; //import com.sk89q.worldedit.function.pattern.RandomPattern;
import com.sk89q.worldedit.internal.expression.ExpressionException; //import com.sk89q.worldedit.internal.expression.Expression;
import com.sk89q.worldedit.math.Vector3; //import com.sk89q.worldedit.internal.expression.ExpressionException;
import com.sk89q.worldedit.regions.shape.WorldEditExpressionEnvironment; //import com.sk89q.worldedit.math.Vector3;
import com.sk89q.worldedit.session.ClipboardHolder; //import com.sk89q.worldedit.regions.shape.WorldEditExpressionEnvironment;
import com.sk89q.worldedit.world.biome.BiomeType; //import com.sk89q.worldedit.session.ClipboardHolder;
import java.awt.Color; //import com.sk89q.worldedit.world.biome.BiomeType;
import java.io.IOException; //import java.awt.Color;
import java.util.Collections; //import java.io.IOException;
import java.util.List; //import java.util.Collections;
import java.util.Set; //import java.util.List;
import org.enginehub.piston.annotation.Command; //import java.util.Set;
import org.enginehub.piston.annotation.CommandContainer; //import org.enginehub.piston.annotation.Command;
import org.enginehub.piston.annotation.param.Arg; //import org.enginehub.piston.annotation.CommandContainer;
import org.jetbrains.annotations.Range; //import org.enginehub.piston.annotation.param.Arg;
//import org.jetbrains.annotations.Range;
//@Command(aliases = {"patterns"}, //
// desc = "Help for the various patterns. [More Info](https://git.io/vSPmA)", ////@Command(aliases = {"patterns"},
// descFooter = "Patterns determine what blocks are placed\n" + //// desc = "Help for the various patterns. [More Info](https://git.io/vSPmA)",
// " - Use [brackets] for arguments\n" + //// descFooter = "Patterns determine what blocks are placed\n" +
// " - Use , to OR multiple\n" + //// " - Use [brackets] for arguments\n" +
// "e.g., #surfacespread[10][#existing],andesite\n" + //// " - Use , to OR multiple\n" +
// "More Info: https://git.io/vSPmA" //// "e.g., #surfacespread[10][#existing],andesite\n" +
//// "More Info: https://git.io/vSPmA"
////)
//@CommandContainer//(superTypes = CommandPermissionsConditionGenerator.Registration.class)
//public class PatternCommands {
//
// @Command(
// name = "#existing",
// aliases = {"#*", "*", ".*"},
// desc = "Use the block that is already there"
// )
// public Pattern existing(Extent extent, @Arg(desc = "String", def = "") String properties) { // TODO FIXME , @Arg(name = "properties", desc = "String", def = "") String properties
// if (properties == null) return new ExistingPattern(extent);
// return new PropertyPattern(extent).addRegex(".*[" + properties + "]");
// }
//
// @Command(
// name = "#clipboard",
// aliases = {"#copy"},
// desc = "Use the blocks in your clipboard as the pattern")
// public Pattern clipboard(LocalSession session) throws EmptyClipboardException {
// ClipboardHolder holder = session.getClipboard();
// Clipboard clipboard = holder.getClipboard();
// return new ClipboardPattern(clipboard);
// }
//
// @Command(
// name = "#simplex",
// desc = "Use simplex noise to randomize blocks. Tutorial: https://imgur.com/a/rwVAE"
//) //)
@CommandContainer//(superTypes = CommandPermissionsConditionGenerator.Registration.class) // public Pattern simplex(@Arg(desc = "scale factor") double scale, @Arg(desc = "Pattern") Pattern other) {
public class PatternCommands { // if (other instanceof RandomPattern) {
// scale = (1d / Math.max(1, scale));
@Command( // RandomCollection<Pattern> collection = ((RandomPattern) other).getCollection();
name = "#existing", // collection.setRandom(new SimplexRandom(scale));
aliases = {"#*", "*", ".*"}, // }
desc = "Use the block that is already there" // return other;
) // }
public Pattern existing(Extent extent, @Arg(desc = "String", def = "") String properties) { // TODO FIXME , @Arg(name = "properties", desc = "String", def = "") String properties //
if (properties == null) return new ExistingPattern(extent); // @Command(
return new PropertyPattern(extent).addRegex(".*[" + properties + "]"); // name = "#color",
} // desc = "Use the block closest to a specific color"
//)
@Command( // public Pattern color(TextureUtil textureUtil, @Arg(desc = "String color") String color) {
name = "#clipboard", // Color colorObj = ColorUtil.parseColor(color);
aliases = {"#copy"}, // return textureUtil.getNearestBlock(colorObj.getRGB()).getDefaultState();
desc = "Use the blocks in your clipboard as the pattern") // }
public Pattern clipboard(LocalSession session) throws EmptyClipboardException { //
ClipboardHolder holder = session.getClipboard(); // @Command(
Clipboard clipboard = holder.getClipboard(); // name = "#anglecolor",
return new ClipboardPattern(clipboard); // desc = "A darker block based on the existing terrain angle"
} //)
// public Pattern anglecolor(Extent extent, LocalSession session, @Arg(desc = "int", def = "1") int distance) {
@Command( // return new AngleColorPattern(extent, session, distance);
name = "#simplex", // }
desc = "Use simplex noise to randomize blocks. Tutorial: https://imgur.com/a/rwVAE" //
) // @Command(
public Pattern simplex(@Arg(desc = "scale factor") double scale, @Arg(desc = "Pattern") Pattern other) { // name = "#angledata",
if (other instanceof RandomPattern) { // desc = "Block data based on the existing terrain angle"
scale = (1d / Math.max(1, scale)); // )
RandomCollection<Pattern> collection = ((RandomPattern) other).getCollection(); // public Pattern angledata(Extent extent, @Arg(desc = "int", def = "1") int distance) {
collection.setRandom(new SimplexRandom(scale)); // return new DataAnglePattern(extent, distance);
} // }
return other; //
} // @Command(
// name = "#saturate",
@Command( // desc = "Saturate the existing block with a color"
name = "#color", //)
desc = "Use the block closest to a specific color" // public Pattern saturate(Extent extent, LocalSession session, @Arg(desc = "Color code") String colorStr) {
) // Color color = ColorUtil.parseColor(colorStr);
public Pattern color(TextureUtil textureUtil, @Arg(desc = "String color") String color) { // return new SaturatePattern(extent, color.getRGB(), session);
Color colorObj = ColorUtil.parseColor(color); // }
return textureUtil.getNearestBlock(colorObj.getRGB()).getDefaultState(); //
} // @Command(
// name = "#averagecolor",
@Command( // desc = "Average between the existing block and a color"
name = "#anglecolor", //)
desc = "A darker block based on the existing terrain angle" // public Pattern averagecolor(Extent extent, LocalSession session, @Arg(desc = "Color code") String colorStr) {
) // Color color = ColorUtil.parseColor(colorStr);
public Pattern anglecolor(Extent extent, LocalSession session, @Arg(desc = "int", def = "1") int distance) { // return new AverageColorPattern(extent, color.getRGB(), session);
return new AngleColorPattern(extent, session, distance); // }
} //
// @Command(
@Command( // name = "#desaturate",
name = "#angledata", // desc = "Desaturated color of the existing block"
desc = "Block data based on the existing terrain angle" //)
) // public Pattern desaturate(Extent extent, LocalSession session, @Arg(desc = "double", def = "100") double percent) {
public Pattern angledata(Extent extent, @Arg(desc = "int", def = "1") int distance) { // return new DesaturatePattern(extent, percent / 100d, session);
return new DataAnglePattern(extent, distance); // }
} //
// @Command(
@Command( // name = "#lighten",
name = "#saturate", // desc = "Lighten the existing block"
desc = "Saturate the existing block with a color" //)
) // public Pattern lighten(Extent extent, TextureUtil util) {
public Pattern saturate(Extent extent, LocalSession session, @Arg(desc = "Color code") String colorStr) { // return new ShadePattern(extent, false, util);
Color color = ColorUtil.parseColor(colorStr); // }
return new SaturatePattern(extent, color.getRGB(), session); //
} // @Command(
// name = "#darken",
@Command( // desc = "Darken the existing block"
name = "#averagecolor", //)
desc = "Average between the existing block and a color" // public Pattern darken(Extent extent, TextureUtil util) {
) // return new ShadePattern(extent, true, util);
public Pattern averagecolor(Extent extent, LocalSession session, @Arg(desc = "Color code") String colorStr) { // }
Color color = ColorUtil.parseColor(colorStr); //
return new AverageColorPattern(extent, color.getRGB(), session); // @Command(
} // name = "#fullcopy",
// desc = "Places your full clipboard at each block"
@Command( //)
name = "#desaturate", // public Pattern fullcopy(Player player, Extent extent, LocalSession session, @Arg(desc = "String", def = "#copy") String location, @Arg(desc = "boolean", def = "false") boolean rotate, @Arg(desc = "boolean", def = "false") boolean flip) throws EmptyClipboardException, InputParseException, IOException {
desc = "Desaturated color of the existing block" // List<ClipboardHolder> clipboards;
) // switch (location.toLowerCase()) {
public Pattern desaturate(Extent extent, LocalSession session, @Arg(desc = "double", def = "100") double percent) { // case "#copy":
return new DesaturatePattern(extent, percent / 100d, session); // case "#clipboard":
} // ClipboardHolder clipboard = session.getExistingClipboard();
// if (clipboard == null) {
@Command( // throw new InputParseException("To use #fullcopy, please first copy something to your clipboard");
name = "#lighten", // }
desc = "Lighten the existing block" // if (!rotate && !flip) {
) // return new FullClipboardPattern(extent, clipboard.getClipboard());
public Pattern lighten(Extent extent, TextureUtil util) { // }
return new ShadePattern(extent, false, util); // clipboards = Collections.singletonList(clipboard);
} // break;
// default:
@Command( // MultiClipboardHolder multi = ClipboardFormats.loadAllFromInput(player, location, null, true);
name = "#darken", // clipboards = multi != null ? multi.getHolders() : null;
desc = "Darken the existing block" // break;
) // }
public Pattern darken(Extent extent, TextureUtil util) { // if (clipboards == null) {
return new ShadePattern(extent, true, util); // throw new InputParseException("#fullcopy:<source>");
} // }
// return new RandomFullClipboardPattern(extent, clipboards, rotate, flip);
@Command( // }
name = "#fullcopy", //
desc = "Places your full clipboard at each block" // @Command(
) // name = "#buffer",
public Pattern fullcopy(Player player, Extent extent, LocalSession session, @Arg(desc = "String", def = "#copy") String location, @Arg(desc = "boolean", def = "false") boolean rotate, @Arg(desc = "boolean", def = "false") boolean flip) throws EmptyClipboardException, InputParseException, IOException { // desc = "Only place a block once while a pattern is in use",
List<ClipboardHolder> clipboards; // descFooter = "Only place a block once while a pattern is in use\n" +
switch (location.toLowerCase()) { // "Use with a brush when you don't want to apply to the same spot twice"
case "#copy": //)
case "#clipboard": // public Pattern buffer(Actor actor, @Arg(desc = "Pattern")Pattern pattern) {
ClipboardHolder clipboard = session.getExistingClipboard(); // return new BufferedPattern(actor, pattern);
if (clipboard == null) { // }
throw new InputParseException("To use #fullcopy, please first copy something to your clipboard"); //
} // @Command(
if (!rotate && !flip) { // name = "#buffer2d",
return new FullClipboardPattern(extent, clipboard.getClipboard()); // desc = "Only place a block once in a column while a pattern is in use"
} //)
clipboards = Collections.singletonList(clipboard); // public Pattern buffer2d(Actor actor, @Arg(desc = "Pattern")Pattern pattern) {
break; // return new BufferedPattern2D(actor, pattern);
default: // }
MultiClipboardHolder multi = ClipboardFormats.loadAllFromInput(player, location, null, true); //
clipboards = multi != null ? multi.getHolders() : null; // @Command(
break; // name = "#iddatamask",
} // desc = "Use the pattern's id and the existing blocks data with the provided mask",
if (clipboards == null) { // descFooter = "Use the pattern's id and the existing blocks data with the provided mask\n" +
throw new InputParseException("#fullcopy:<source>"); // " - Use to replace slabs or where the data values needs to be shifted instead of set"
} //)
return new RandomFullClipboardPattern(extent, clipboards, rotate, flip); // public Pattern iddatamask(Extent extent, @Range(from = 0, to = 15) @Arg(desc = "bit mask") int bitmask, @Arg(desc = "Pattern")Pattern pattern) {
} //
// return new IdDataMaskPattern(extent, pattern, bitmask);
@Command( // }
name = "#buffer", //
desc = "Only place a block once while a pattern is in use", // @Command(
descFooter = "Only place a block once while a pattern is in use\n" + // name = "#id",
"Use with a brush when you don't want to apply to the same spot twice" // desc = "Only change the block id"
) //)
public Pattern buffer(Actor actor, @Arg(desc = "Pattern")Pattern pattern) { // public Pattern id(Extent extent, @Arg(desc = "Pattern")Pattern pattern) {
return new BufferedPattern(actor, pattern); //
} // return new IdPattern(extent, pattern);
// }
@Command( //
name = "#buffer2d", // @Command(
desc = "Only place a block once in a column while a pattern is in use" // name = "#data",
) // desc = "Only change the block data"
public Pattern buffer2d(Actor actor, @Arg(desc = "Pattern")Pattern pattern) { //)
return new BufferedPattern2D(actor, pattern); // public Pattern data(Extent extent, @Arg(desc = "Pattern")Pattern pattern) {
} //
// return new DataPattern(extent, pattern);
@Command( // }
name = "#iddatamask", //
desc = "Use the pattern's id and the existing blocks data with the provided mask", // @Command(
descFooter = "Use the pattern's id and the existing blocks data with the provided mask\n" + // name = "#biome",
" - Use to replace slabs or where the data values needs to be shifted instead of set" // aliases = {"$"},
) // desc = "Set the biome"
public Pattern iddatamask(Extent extent, @Range(from = 0, to = 15) @Arg(desc = "bit mask") int bitmask, @Arg(desc = "Pattern")Pattern pattern) { //)
// public Pattern biome(Extent extent, @Arg(desc = "Biome type") BiomeType biome) {
return new IdDataMaskPattern(extent, pattern, bitmask); //
} // return new BiomePattern(extent, biome);
// }
@Command( //
name = "#id", // @Command(
desc = "Only change the block id" // name = "#relative",
) // aliases = {"#~", "#r", "#rel"},
public Pattern id(Extent extent, @Arg(desc = "Pattern")Pattern pattern) { // desc = "Offset the pattern to where you click"
//)
return new IdPattern(extent, pattern); // public Pattern relative(@Arg(desc = "Pattern")Pattern pattern) {
} //
// return new RelativePattern(pattern);
@Command( // }
name = "#data", //
desc = "Only change the block data" // @Command(
) // name = "#!x",
public Pattern data(Extent extent, @Arg(desc = "Pattern")Pattern pattern) { // aliases = {"#nx", "#nox"},
// desc = "The pattern will not be provided the x axis info",
return new DataPattern(extent, pattern); // descFooter = "The pattern will not be provided the z axis info.\n" +
} // "Example: #!x[#!z[#~[#l3d[pattern]]]]"
//)
@Command( // public Pattern nox(@Arg(desc = "Pattern")Pattern pattern) {
name = "#biome", //
aliases = {"$"}, // return new NoXPattern(pattern);
desc = "Set the biome" // }
) //
public Pattern biome(Extent extent, @Arg(desc = "Biome type") BiomeType biome) { // @Command(
// name = "#!y",
return new BiomePattern(extent, biome); // aliases = {"#ny", "#noy"},
} // desc = "The pattern will not be provided the y axis info"
//)
@Command( // public Pattern noy(@Arg(desc = "Pattern")Pattern pattern) {
name = "#relative", //
aliases = {"#~", "#r", "#rel"}, // return new NoYPattern(pattern);
desc = "Offset the pattern to where you click" // }
) //
public Pattern relative(@Arg(desc = "Pattern")Pattern pattern) { // @Command(
// name = "#!z",
return new RelativePattern(pattern); // aliases = {"#nz", "#noz"},
} // desc = "The pattern will not be provided the z axis info"
//)
@Command( // public Pattern noz(@Arg(desc = "Pattern")Pattern pattern) {
name = "#!x", //
aliases = {"#nx", "#nox"}, // return new NoZPattern(pattern);
desc = "The pattern will not be provided the x axis info", // }
descFooter = "The pattern will not be provided the z axis info.\n" + //
"Example: #!x[#!z[#~[#l3d[pattern]]]]" // @Command(
) // name = "#mask",
public Pattern nox(@Arg(desc = "Pattern")Pattern pattern) { // desc = "Apply a pattern depending on a mask"
//)
return new NoXPattern(pattern); // public Pattern mask(@Arg(desc = "Mask") Mask mask, @Arg(desc = "Pattern")Pattern pass, @Arg(desc = "Pattern")Pattern fail) {
} // return new MaskedPattern(mask, pass, fail);
// }
@Command( //
name = "#!y", // @Command(
aliases = {"#ny", "#noy"}, // name = "#offset",
desc = "The pattern will not be provided the y axis info" // desc = "Offset a pattern"
) //)
public Pattern noy(@Arg(desc = "Pattern")Pattern pattern) { // public Pattern offset(@Arg(desc = "x offset") double x, @Arg(desc = "y offset") double y, @Arg(desc = "z offset") double z, @Arg(desc = "Pattern")Pattern pattern) {
//
return new NoYPattern(pattern); // return new OffsetPattern(pattern, (int) x, (int) y, (int) z);
} // }
//
@Command( // @Command(
name = "#!z", // name = "#surfacespread",
aliases = {"#nz", "#noz"}, // desc = "Applies to only blocks on a surface. Selects a block from provided pattern with a given randomized offset `[0, <distance>)`. e.g., Use `#existing` to randomly offset blocks in the world, or `#copy` to offset blocks in your clipboard"
desc = "The pattern will not be provided the z axis info" //)
) // public Pattern surfacespread(@Arg(desc = "spread distance (blocks)") double distance, @Arg(desc = "Pattern")Pattern pattern) {
public Pattern noz(@Arg(desc = "Pattern")Pattern pattern) { //
// return new SurfaceRandomOffsetPattern(pattern, (int) distance);
return new NoZPattern(pattern); // }
} //
// @Command(
@Command( // name = "#solidspread",
name = "#mask", // desc = "Randomly spread solid blocks"
desc = "Apply a pattern depending on a mask" //)
) // public Pattern solidspread(@Arg(desc = "x offset") double x, @Arg(desc = "y offset") double y, @Arg(desc = "z offset") double z, @Arg(desc = "Pattern")Pattern pattern) {
public Pattern mask(@Arg(desc = "Mask") Mask mask, @Arg(desc = "Pattern")Pattern pass, @Arg(desc = "Pattern")Pattern fail) { //
return new MaskedPattern(mask, pass, fail); // return new SolidRandomOffsetPattern(pattern, (int) x, (int) y, (int) z);
} // }
//
@Command( // @Command(
name = "#offset", // name = "#spread",
desc = "Offset a pattern" // aliases = {"#randomoffset"},
) // desc = "Randomly spread blocks"
public Pattern offset(@Arg(desc = "x offset") double x, @Arg(desc = "y offset") double y, @Arg(desc = "z offset") double z, @Arg(desc = "Pattern")Pattern pattern) { //)
// public Pattern spread(@Arg(desc = "x offset") double x, @Arg(desc = "y offset") double y, @Arg(desc = "z offset") double z, @Arg(desc = "Pattern")Pattern pattern) {
return new OffsetPattern(pattern, (int) x, (int) y, (int) z); //
} // return new RandomOffsetPattern(pattern, (int) x, (int) y, (int) z);
// }
@Command( //
name = "#surfacespread", // @Command(
desc = "Applies to only blocks on a surface. Selects a block from provided pattern with a given randomized offset `[0, <distance>)`. e.g., Use `#existing` to randomly offset blocks in the world, or `#copy` to offset blocks in your clipboard" // name = "#linear",
) // aliases = {"#l"},
public Pattern surfacespread(@Arg(desc = "spread distance (blocks)") double distance, @Arg(desc = "Pattern")Pattern pattern) { // desc = "Sequentially set blocks from a list of patterns"
//)
return new SurfaceRandomOffsetPattern(pattern, (int) distance); // public Pattern linear(@Arg(desc = "Pattern") Pattern other) {
} //
// if (other instanceof RandomPattern) {
@Command( // Set<Pattern> patterns = ((RandomPattern) other).getPatterns();
name = "#solidspread", // return new LinearBlockPattern(patterns.toArray(new Pattern[patterns.size()]));
desc = "Randomly spread solid blocks" // }
) // return other;
public Pattern solidspread(@Arg(desc = "x offset") double x, @Arg(desc = "y offset") double y, @Arg(desc = "z offset") double z, @Arg(desc = "Pattern")Pattern pattern) { // }
//
return new SolidRandomOffsetPattern(pattern, (int) x, (int) y, (int) z); // @Command(
} // name = "#linear3d",
// aliases = {"#l3d"},
@Command( // desc = "Use the x,y,z coordinate to pick a block from the list"
name = "#spread", //)
aliases = {"#randomoffset"}, // public Pattern linear3d(@Arg(desc = "Pattern") Pattern other) {
desc = "Randomly spread blocks" //
) // if (other instanceof RandomPattern) {
public Pattern spread(@Arg(desc = "x offset") double x, @Arg(desc = "y offset") double y, @Arg(desc = "z offset") double z, @Arg(desc = "Pattern")Pattern pattern) { // Set<Pattern> patterns = ((RandomPattern) other).getPatterns();
// return new Linear3DBlockPattern(patterns.toArray(new Pattern[patterns.size()]));
return new RandomOffsetPattern(pattern, (int) x, (int) y, (int) z); // }
} // return other;
// }
@Command( //
name = "#linear", // @Command(
aliases = {"#l"}, // name = "#linear2d",
desc = "Sequentially set blocks from a list of patterns" // aliases = {"#l2d"},
) // desc = "Use the x,z coordinate to pick a block from the list"
public Pattern linear(@Arg(desc = "Pattern") Pattern other) { //)
// public Pattern linear2d(@Arg(desc = "Pattern") Pattern other) {
if (other instanceof RandomPattern) { //
Set<Pattern> patterns = ((RandomPattern) other).getPatterns(); // if (other instanceof RandomPattern) {
return new LinearBlockPattern(patterns.toArray(new Pattern[patterns.size()])); // Set<Pattern> patterns = ((RandomPattern) other).getPatterns();
} // return new Linear2DBlockPattern(patterns.toArray(new Pattern[patterns.size()]));
return other; // }
} // return other;
// }
@Command( //
name = "#linear3d", // @Command(
aliases = {"#l3d"}, // name = "=",
desc = "Use the x,y,z coordinate to pick a block from the list" // aliases = {"#=", "#expression"},
) // desc = "Expression pattern: http://wiki.sk89q.com/wiki/WorldEdit/Expression_syntax"
public Pattern linear3d(@Arg(desc = "Pattern") Pattern other) { //)
// public Pattern expression(Extent extent, @Arg(desc = "Expression") String input) throws ExpressionException {
if (other instanceof RandomPattern) { //
Set<Pattern> patterns = ((RandomPattern) other).getPatterns(); // Expression exp = Expression.compile(input, "x", "y", "z");
return new Linear3DBlockPattern(patterns.toArray(new Pattern[patterns.size()])); // WorldEditExpressionEnvironment env = new WorldEditExpressionEnvironment(extent, Vector3.ONE, Vector3.ZERO);
} // exp.setEnvironment(env);
return other; // return new ExpressionPattern(exp);
} // }
//}
@Command(
name = "#linear2d",
aliases = {"#l2d"},
desc = "Use the x,z coordinate to pick a block from the list"
)
public Pattern linear2d(@Arg(desc = "Pattern") Pattern other) {
if (other instanceof RandomPattern) {
Set<Pattern> patterns = ((RandomPattern) other).getPatterns();
return new Linear2DBlockPattern(patterns.toArray(new Pattern[patterns.size()]));
}
return other;
}
@Command(
name = "=",
aliases = {"#=", "#expression"},
desc = "Expression pattern: http://wiki.sk89q.com/wiki/WorldEdit/Expression_syntax"
)
public Pattern expression(Extent extent, @Arg(desc = "Expression") String input) throws ExpressionException {
Expression exp = Expression.compile(input, "x", "y", "z");
WorldEditExpressionEnvironment env = new WorldEditExpressionEnvironment(extent, Vector3.ONE, Vector3.ZERO);
exp.setEnvironment(env);
return new ExpressionPattern(exp);
}
}

View File

@ -84,7 +84,6 @@ public class ToolUtilCommands {
if (maskOpt == null) { if (maskOpt == null) {
player.printInfo(TranslatableComponent.of("worldedit.tool.mask.disabled")); player.printInfo(TranslatableComponent.of("worldedit.tool.mask.disabled"));
tool.setMask(null); tool.setMask(null);
return;
} else { } else {
BrushSettings settings = offHand ? tool.getOffHand() : tool.getContext(); BrushSettings settings = offHand ? tool.getOffHand() : tool.getContext();
String lastArg = Iterables.getLast(CommandArgParser.spaceSplit(arguments.get())) String lastArg = Iterables.getLast(CommandArgParser.spaceSplit(arguments.get()))
@ -151,17 +150,6 @@ public class ToolUtilCommands {
player.printInfo(TranslatableComponent.of("worldedit.tool.size.set")); player.printInfo(TranslatableComponent.of("worldedit.tool.size.set"));
} }
//todo none should be moved to the same class where it is in upstream
@Command(
name = "none",
aliases = {"/none"},
desc = "Unbind a bound tool from your current item"
)
public void none(Player player, LocalSession session) throws WorldEditException {
session.setTool(player, null);
player.print(TranslatableComponent.of("fawe.worldedit.tool.tool.none"));
}
@Command( @Command(
name = "tracemask", name = "tracemask",
aliases = {"tarmask", "tm", "targetmask"}, aliases = {"tarmask", "tm", "targetmask"},
@ -368,31 +356,32 @@ public class ToolUtilCommands {
player.print(TranslatableComponent.of("fawe.worldedit.brush.brush.source.mask")); player.print(TranslatableComponent.of("fawe.worldedit.brush.brush.source.mask"));
} }
@Command( // TODO: Ping @MattBDev to reimplement 2020-02-04
name = "transform", // @Command(
desc = "Set the brush transform" // name = "transform",
) // desc = "Set the brush transform"
@CommandPermissions({"worldedit.brush.options.transform", "worldedit.transform.brush"}) // )
public void transform(Player player, LocalSession session, EditSession editSession, // @CommandPermissions({"worldedit.brush.options.transform", "worldedit.transform.brush"})
@Arg(desc = "The transform", def = "") ResettableExtent transform, // public void transform(Player player, LocalSession session, EditSession editSession,
@Switch(name = 'h', desc = "TODO") // @Arg(desc = "The transform", def = "") ResettableExtent transform,
boolean offHand, // @Switch(name = 'h', desc = "TODO")
Arguments arguments) throws WorldEditException { // boolean offHand,
BrushTool tool = session.getBrushTool(player, false); // Arguments arguments) throws WorldEditException {
if (tool == null) { // BrushTool tool = session.getBrushTool(player, false);
player.print(TranslatableComponent.of("fawe.worldedit.brush.brush.none")); // if (tool == null) {
return; // player.print(TranslatableComponent.of("fawe.worldedit.brush.brush.none"));
} // return;
if (transform == null) { // }
player.print(TranslatableComponent.of("fawe.worldedit.brush.brush.transform.disabled")); // if (transform == null) {
tool.setTransform(null); // player.print(TranslatableComponent.of("fawe.worldedit.brush.brush.transform.disabled"));
return; // tool.setTransform(null);
} // return;
BrushSettings settings = offHand ? tool.getOffHand() : tool.getContext(); // }
String lastArg = Iterables.getLast(CommandArgParser.spaceSplit(arguments.get())).getSubstring(); // BrushSettings settings = offHand ? tool.getOffHand() : tool.getContext();
settings.addSetting(BrushSettings.SettingType.TRANSFORM, lastArg); // String lastArg = Iterables.getLast(CommandArgParser.spaceSplit(arguments.get())).getSubstring();
settings.setTransform(transform); // settings.addSetting(BrushSettings.SettingType.TRANSFORM, lastArg);
tool.update(); // settings.setTransform(transform);
player.print(TranslatableComponent.of("fawe.worldedit.brush.brush.transform")); // tool.update();
} // player.print(TranslatableComponent.of("fawe.worldedit.brush.brush.transform"));
// }
} }

View File

@ -1,104 +1,105 @@
package com.sk89q.worldedit.command; // TODO: Ping @MattBDev to reimplement 2020-02-04
//package com.sk89q.worldedit.command;
import com.boydti.fawe.object.extent.Linear3DTransform; //
import com.boydti.fawe.object.extent.LinearTransform; //import com.boydti.fawe.object.extent.Linear3DTransform;
import com.boydti.fawe.object.extent.OffsetExtent; //import com.boydti.fawe.object.extent.LinearTransform;
import com.boydti.fawe.object.extent.PatternTransform; //import com.boydti.fawe.object.extent.OffsetExtent;
import com.boydti.fawe.object.extent.RandomOffsetTransform; //import com.boydti.fawe.object.extent.PatternTransform;
import com.boydti.fawe.object.extent.RandomTransform; //import com.boydti.fawe.object.extent.RandomOffsetTransform;
import com.boydti.fawe.object.extent.ResettableExtent; //import com.boydti.fawe.object.extent.RandomTransform;
import com.boydti.fawe.object.extent.ScaleTransform; //import com.boydti.fawe.object.extent.ResettableExtent;
import com.boydti.fawe.object.extent.TransformExtent; //import com.boydti.fawe.object.extent.ScaleTransform;
import com.boydti.fawe.util.ExtentTraverser; //import com.boydti.fawe.object.extent.TransformExtent;
import com.sk89q.worldedit.LocalSession; //import com.boydti.fawe.util.ExtentTraverser;
import com.sk89q.worldedit.command.util.CommandPermissionsConditionGenerator; //import com.sk89q.worldedit.LocalSession;
import com.sk89q.worldedit.entity.Player; //import com.sk89q.worldedit.command.util.CommandPermissionsConditionGenerator;
import com.sk89q.worldedit.extension.platform.Actor; //import com.sk89q.worldedit.entity.Player;
import com.sk89q.worldedit.extent.transform.BlockTransformExtent; //import com.sk89q.worldedit.extension.platform.Actor;
import com.sk89q.worldedit.function.pattern.Pattern; //import com.sk89q.worldedit.extent.transform.BlockTransformExtent;
import com.sk89q.worldedit.math.transform.AffineTransform; //import com.sk89q.worldedit.function.pattern.Pattern;
import java.util.Set; //import com.sk89q.worldedit.math.transform.AffineTransform;
import org.enginehub.piston.annotation.Command; //import java.util.Set;
import org.enginehub.piston.annotation.CommandContainer; //import org.enginehub.piston.annotation.Command;
import org.enginehub.piston.annotation.param.Arg; //import org.enginehub.piston.annotation.CommandContainer;
//import org.enginehub.piston.annotation.param.Arg;
@CommandContainer//(superTypes = CommandPermissionsConditionGenerator.Registration.class) //
public class TransformCommands { //@CommandContainer//(superTypes = CommandPermissionsConditionGenerator.Registration.class)
//public class TransformCommands {
@Command( //
name = "#linear", // @Command(
aliases = {"#l"}, // name = "#linear",
desc = "Sequentially pick from a list of transform" // aliases = {"#l"},
) // desc = "Sequentially pick from a list of transform"
public ResettableExtent linear(Actor actor, LocalSession session, @Arg(name = "other", desc = "ResettableExtent", def = "#null") ResettableExtent other) { // )
if (other instanceof RandomTransform) { // public ResettableExtent linear(Actor actor, LocalSession session, @Arg(name = "other", desc = "ResettableExtent", def = "#null") ResettableExtent other) {
Set<ResettableExtent> extents = ((RandomTransform) other).getExtents(); // if (other instanceof RandomTransform) {
return new LinearTransform(extents.toArray(new ResettableExtent[0])); // Set<ResettableExtent> extents = ((RandomTransform) other).getExtents();
} // return new LinearTransform(extents.toArray(new ResettableExtent[0]));
return other; // }
} // return other;
// }
@Command( //
name = "#linear3d", // @Command(
aliases = {"#l3d"}, // name = "#linear3d",
desc = "Use the x,y,z coordinate to pick a transform from the list" // aliases = {"#l3d"},
) // desc = "Use the x,y,z coordinate to pick a transform from the list"
public ResettableExtent linear3d(Actor actor, LocalSession session, @Arg(name = "other", desc = "ResettableExtent", def = "#null") ResettableExtent other) { // )
if (other instanceof RandomTransform) { // public ResettableExtent linear3d(Actor actor, LocalSession session, @Arg(name = "other", desc = "ResettableExtent", def = "#null") ResettableExtent other) {
Set<ResettableExtent> extents = ((RandomTransform) other).getExtents(); // if (other instanceof RandomTransform) {
return new Linear3DTransform(extents.toArray(new ResettableExtent[0])); // Set<ResettableExtent> extents = ((RandomTransform) other).getExtents();
} // return new Linear3DTransform(extents.toArray(new ResettableExtent[0]));
return other; // }
} // return other;
// }
@Command( //
name = "#pattern", // @Command(
desc = "Always use a specific pattern" // name = "#pattern",
) // desc = "Always use a specific pattern"
public ResettableExtent pattern(Actor actor, LocalSession session, @Arg(desc = "Pattern") Pattern pattern, @Arg(name = "other", desc = "ResettableExtent", def = "#null") ResettableExtent other) { // )
return new PatternTransform(other, pattern); // public ResettableExtent pattern(Actor actor, LocalSession session, @Arg(desc = "Pattern") Pattern pattern, @Arg(name = "other", desc = "ResettableExtent", def = "#null") ResettableExtent other) {
} // return new PatternTransform(other, pattern);
// }
@Command( //
name = "#offset", // @Command(
desc = "Offset transform" // name = "#offset",
) // desc = "Offset transform"
public ResettableExtent offset(Actor actor, LocalSession session, double x, double y, double z, @Arg(name = "other", desc = "ResettableExtent", def = "#null") ResettableExtent other) { // )
return new OffsetExtent(other, (int) x, (int) y, (int) z); // public ResettableExtent offset(Actor actor, LocalSession session, double x, double y, double z, @Arg(name = "other", desc = "ResettableExtent", def = "#null") ResettableExtent other) {
} // return new OffsetExtent(other, (int) x, (int) y, (int) z);
// }
@Command( //
name = "#spread", // @Command(
aliases = {"#randomoffset"}, // name = "#spread",
desc = "Random offset transform" // aliases = {"#randomoffset"},
) // desc = "Random offset transform"
public ResettableExtent randomOffset(Actor actor, LocalSession session, double x, double y, double z, @Arg(name = "other", desc = "ResettableExtent", def = "#null") ResettableExtent other) { //)
return new RandomOffsetTransform(other, (int) x, (int) y, (int) z); // public ResettableExtent randomOffset(Actor actor, LocalSession session, double x, double y, double z, @Arg(name = "other", desc = "ResettableExtent", def = "#null") ResettableExtent other) {
} // return new RandomOffsetTransform(other, (int) x, (int) y, (int) z);
// }
@Command( //
name = "#scale", // @Command(
desc = "All changes will be scaled" // name = "#scale",
) // desc = "All changes will be scaled"
public ResettableExtent scale(Actor actor, LocalSession session, double x, double y, double z, @Arg(name = "other", desc = "ResettableExtent", def = "#null") ResettableExtent other) { // )
return new ScaleTransform(other, x, y, z); // public ResettableExtent scale(Actor actor, LocalSession session, double x, double y, double z, @Arg(name = "other", desc = "ResettableExtent", def = "#null") ResettableExtent other) {
} // return new ScaleTransform(other, x, y, z);
// }
@Command( //
name = "#rotate", // @Command(
desc = "All changes will be rotate around the initial position" // name = "#rotate",
) // desc = "All changes will be rotate around the initial position"
public ResettableExtent rotate(Player player, LocalSession session, double x, double y, double z, @Arg(name = "other", desc = "ResettableExtent", def = "#null") ResettableExtent other) { // )
ExtentTraverser<TransformExtent> traverser = new ExtentTraverser<>(other).find(TransformExtent.class); // public ResettableExtent rotate(Player player, LocalSession session, double x, double y, double z, @Arg(name = "other", desc = "ResettableExtent", def = "#null") ResettableExtent other) {
BlockTransformExtent affine = traverser != null ? traverser.get() : null; // ExtentTraverser<TransformExtent> traverser = new ExtentTraverser<>(other).find(TransformExtent.class);
if (affine == null) { // BlockTransformExtent affine = traverser != null ? traverser.get() : null;
other = affine = new TransformExtent(other); // if (affine == null) {
} // other = affine = new TransformExtent(other);
AffineTransform transform = (AffineTransform) affine.getTransform(); // }
transform = transform.rotateX(x); // AffineTransform transform = (AffineTransform) affine.getTransform();
transform = transform.rotateY(y); // transform = transform.rotateX(x);
transform = transform.rotateZ(z); // transform = transform.rotateY(y);
affine.setTransform(transform); // transform = transform.rotateZ(z);
return other; // affine.setTransform(transform);
} // return other;
} // }
//}

View File

@ -104,7 +104,6 @@ public final class RegistryConverter<V extends Keyed> implements ArgumentConvert
: SuccessfulConversion.fromSingle(result); : SuccessfulConversion.fromSingle(result);
} }
@Override
public List<String> getSuggestions(String input) { public List<String> getSuggestions(String input) {
return SuggestionHelper.getRegistrySuggestions(registry, input).collect(Collectors.toList()); return SuggestionHelper.getRegistrySuggestions(registry, input).collect(Collectors.toList());
} }

View File

@ -125,38 +125,39 @@ public class BrushTool implements DoubleActionTraceTool, ScrollTool, MovableTool
public BrushTool() { public BrushTool() {
} }
public static BrushTool fromString(Player player, LocalSession session, String json) throws CommandException, InputParseException { // TODO: Ping @MattBDev to reimplement 2020-02-04
Gson gson = new Gson(); // public static BrushTool fromString(Player player, LocalSession session, String json) throws CommandException, InputParseException {
Type type = new TypeToken<Map<String, Object>>() { // Gson gson = new Gson();
}.getType(); // Type type = new TypeToken<Map<String, Object>>() {
Map<String, Object> root = gson.fromJson(json, type); // }.getType();
if (root == null) { // Map<String, Object> root = gson.fromJson(json, type);
getLogger(BrushTool.class).debug("Failed to load " + json); // if (root == null) {
return new BrushTool(); // getLogger(BrushTool.class).debug("Failed to load " + json);
} // return new BrushTool();
Map<String, Object> primary = (Map<String, Object>) root.get("primary"); // }
Map<String, Object> secondary = (Map<String, Object>) root.getOrDefault("secondary", primary); // Map<String, Object> primary = (Map<String, Object>) root.get("primary");
// Map<String, Object> secondary = (Map<String, Object>) root.getOrDefault("secondary", primary);
VisualMode visual = VisualMode.valueOf((String) root.getOrDefault("visual", "NONE")); //
TargetMode target = TargetMode.valueOf((String) root.getOrDefault("target", "TARGET_BLOCK_RANGE")); // VisualMode visual = VisualMode.valueOf((String) root.getOrDefault("visual", "NONE"));
int range = ((Number) root.getOrDefault("range", -1)).intValue(); // TargetMode target = TargetMode.valueOf((String) root.getOrDefault("target", "TARGET_BLOCK_RANGE"));
int offset = ((Number) root.getOrDefault("offset", 0)).intValue(); // int range = ((Number) root.getOrDefault("range", -1)).intValue();
// int offset = ((Number) root.getOrDefault("offset", 0)).intValue();
BrushTool tool = new BrushTool(); //
tool.visualMode = visual; // BrushTool tool = new BrushTool();
tool.targetMode = target; // tool.visualMode = visual;
tool.range = range; // tool.targetMode = target;
tool.targetOffset = offset; // tool.range = range;
// tool.targetOffset = offset;
BrushSettings primarySettings = BrushSettings.get(tool, player, session, primary); //
tool.setPrimary(primarySettings); // BrushSettings primarySettings = BrushSettings.get(tool, player, session, primary);
if (primary != secondary) { // tool.setPrimary(primarySettings);
BrushSettings secondarySettings = BrushSettings.get(tool, player, session, secondary); // if (primary != secondary) {
tool.setSecondary(secondarySettings); // BrushSettings secondarySettings = BrushSettings.get(tool, player, session, secondary);
} // tool.setSecondary(secondarySettings);
// }
return tool; //
} // return tool;
// }
public void setHolder(BaseItem holder) { public void setHolder(BaseItem holder) {
this.holder = holder; this.holder = holder;

View File

@ -103,7 +103,7 @@ public final class AsyncCommandBuilder<T> {
public AsyncCommandBuilder<T> onSuccess(@Nullable String message, @Nullable Consumer<T> consumer) { public AsyncCommandBuilder<T> onSuccess(@Nullable String message, @Nullable Consumer<T> consumer) {
checkArgument(message != null || consumer != null, "Can't have null message AND consumer"); checkArgument(message != null || consumer != null, "Can't have null message AND consumer");
this.successMessage = message == null ? null : TextComponent.of(message, TextColor.GRAY); this.successMessage = message == null ? null : TextComponent.of(message, TextColor.LIGHT_PURPLE);
this.consumer = consumer; this.consumer = consumer;
return this; return this;
} }

View File

@ -19,7 +19,6 @@
package com.sk89q.worldedit.command.util; package com.sk89q.worldedit.command.util;
import com.boydti.fawe.util.StringMan;
import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSet;
import org.enginehub.piston.Command; import org.enginehub.piston.Command;
import org.enginehub.piston.gen.CommandConditionGenerator; import org.enginehub.piston.gen.CommandConditionGenerator;

View File

@ -1,83 +0,0 @@
package com.sk89q.worldedit.command.util;
import com.google.common.collect.ImmutableSet;
import org.enginehub.piston.Command;
import org.enginehub.piston.CommandManager;
import org.enginehub.piston.CommandParseResult;
import org.enginehub.piston.converter.ArgumentConverter;
import org.enginehub.piston.inject.InjectedValueAccess;
import org.enginehub.piston.inject.Key;
import org.enginehub.piston.suggestion.Suggestion;
import java.util.List;
import java.util.Optional;
import java.util.function.Consumer;
import java.util.stream.Stream;
public class DelegateCommandManager implements CommandManager {
@Override
public Command.Builder newCommand(String s) {
return parent.newCommand(s);
}
@Override
public void register(Command command) {
parent.register(command);
}
@Override
public void register(String name, Consumer<Command.Builder> registrationProcess) {
parent.register(name, registrationProcess);
}
@Override
public void registerManager(CommandManager manager) {
parent.registerManager(manager);
}
@Override
public Stream<Command> getAllCommands() {
return parent.getAllCommands();
}
@Override
public boolean containsCommand(String name) {
return parent.containsCommand(name);
}
@Override
public Optional<Command> getCommand(String s) {
return parent.getCommand(s);
}
@Override
public ImmutableSet<Suggestion> getSuggestions(InjectedValueAccess injectedValueAccess, List<String> list) {
return parent.getSuggestions(injectedValueAccess, list);
}
@Override
public CommandParseResult parse(InjectedValueAccess injectedValueAccess, List<String> list) {
return parent.parse(injectedValueAccess, list);
}
@Override
public Object execute(InjectedValueAccess context, List<String> args) {
return parent.execute(context, args);
}
@Override
public <T> void registerConverter(Key<T> key, ArgumentConverter<T> argumentConverter) {
parent.registerConverter(key, argumentConverter);
}
@Override
public <T> Optional<ArgumentConverter<T>> getConverter(Key<T> key) {
return parent.getConverter(key);
}
private final CommandManager parent;
public DelegateCommandManager(CommandManager parent) {
this.parent = parent;
}
}

View File

@ -24,9 +24,9 @@ import com.sk89q.worldedit.entity.metadata.EntityProperties;
import com.sk89q.worldedit.function.EntityFunction; import com.sk89q.worldedit.function.EntityFunction;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.util.regex.Pattern;
import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkNotNull;
import java.util.regex.Pattern;
/** /**
* The implementation of /remove. * The implementation of /remove.

View File

@ -1,24 +0,0 @@
/*
* WorldEdit, a Minecraft world manipulation toolkit
* Copyright (C) sk89q <http://www.sk89q.com>
* Copyright (C) WorldEdit team and contributors
*
* This program is free software: you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by the
* Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
* for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.sk89q.worldedit.command.util;
public enum HookMode {
ACTIVE, INACTIVE
}

View File

@ -19,7 +19,6 @@
package com.sk89q.worldedit.command.util; package com.sk89q.worldedit.command.util;
import com.boydti.fawe.util.StringMan;
import com.sk89q.worldedit.extension.platform.Actor; import com.sk89q.worldedit.extension.platform.Actor;
import org.enginehub.piston.Command; import org.enginehub.piston.Command;
import org.enginehub.piston.inject.InjectedValueAccess; import org.enginehub.piston.inject.InjectedValueAccess;

View File

@ -32,14 +32,15 @@ import com.sk89q.worldedit.util.formatting.component.CommandUsageBox;
import com.sk89q.worldedit.util.formatting.component.InvalidComponentException; import com.sk89q.worldedit.util.formatting.component.InvalidComponentException;
import com.sk89q.worldedit.util.formatting.text.TextComponent; import com.sk89q.worldedit.util.formatting.text.TextComponent;
import com.sk89q.worldedit.util.formatting.text.TranslatableComponent; import com.sk89q.worldedit.util.formatting.text.TranslatableComponent;
import org.enginehub.piston.Command;
import org.enginehub.piston.CommandManager;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Optional; import java.util.Optional;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.Stream; import java.util.stream.Stream;
import org.enginehub.piston.Command;
import org.enginehub.piston.CommandManager;
/** /**
* Implementation of the //help command. * Implementation of the //help command.

View File

@ -19,9 +19,6 @@
package com.sk89q.worldedit.command.util; package com.sk89q.worldedit.command.util;
import static org.enginehub.piston.converter.SuggestionHelper.byPrefix;
import static org.enginehub.piston.converter.SuggestionHelper.limitByPrefix;
import com.sk89q.worldedit.registry.Keyed; import com.sk89q.worldedit.registry.Keyed;
import com.sk89q.worldedit.registry.NamespacedRegistry; import com.sk89q.worldedit.registry.NamespacedRegistry;
import com.sk89q.worldedit.registry.Registry; import com.sk89q.worldedit.registry.Registry;
@ -40,6 +37,9 @@ import java.util.function.Predicate;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.Stream; import java.util.stream.Stream;
import static org.enginehub.piston.converter.SuggestionHelper.byPrefix;
import static org.enginehub.piston.converter.SuggestionHelper.limitByPrefix;
/** /**
* Internal class for generating common command suggestions. * Internal class for generating common command suggestions.
*/ */

View File

@ -1,135 +1,136 @@
package com.sk89q.worldedit.extension.factory; // TODO: Ping @MattBDev to reimplement 2020-02-04
//package com.sk89q.worldedit.extension.factory;
import com.boydti.fawe.command.FaweParser; //
import com.boydti.fawe.command.SuggestInputParseException; //import com.boydti.fawe.command.FaweParser;
import com.boydti.fawe.object.extent.MultiTransform; //import com.boydti.fawe.command.SuggestInputParseException;
import com.boydti.fawe.object.extent.RandomTransform; //import com.boydti.fawe.object.extent.MultiTransform;
import com.boydti.fawe.object.extent.ResettableExtent; //import com.boydti.fawe.object.extent.RandomTransform;
import com.boydti.fawe.object.random.TrueRandom; //import com.boydti.fawe.object.extent.ResettableExtent;
import com.boydti.fawe.util.StringMan; //import com.boydti.fawe.object.random.TrueRandom;
import com.google.common.collect.Iterables; //import com.boydti.fawe.util.StringMan;
import com.sk89q.minecraft.util.commands.CommandLocals; //import com.google.common.collect.Iterables;
import com.sk89q.worldedit.WorldEdit; //import com.sk89q.minecraft.util.commands.CommandLocals;
//import com.sk89q.worldedit.command.TransformCommands; //import com.sk89q.worldedit.WorldEdit;
import com.sk89q.worldedit.extension.input.InputParseException; ////import com.sk89q.worldedit.command.TransformCommands;
import com.sk89q.worldedit.extension.input.NoMatchException; //import com.sk89q.worldedit.extension.input.InputParseException;
import com.sk89q.worldedit.extension.input.ParserContext; //import com.sk89q.worldedit.extension.input.NoMatchException;
import com.sk89q.worldedit.extension.platform.Actor; //import com.sk89q.worldedit.extension.input.ParserContext;
import com.sk89q.worldedit.internal.expression.Expression; //import com.sk89q.worldedit.extension.platform.Actor;
import java.util.ArrayList; //import com.sk89q.worldedit.internal.expression.Expression;
import java.util.List; //import java.util.ArrayList;
import java.util.Map; //import java.util.List;
//import java.util.Map;
public class DefaultTransformParser extends FaweParser<ResettableExtent> { //
//public class DefaultTransformParser extends FaweParser<ResettableExtent> {
public DefaultTransformParser(WorldEdit worldEdit) { //
super(worldEdit, "transforms"); // public DefaultTransformParser(WorldEdit worldEdit) {
} // super(worldEdit, "transforms");
// }
@Override //
public ResettableExtent parseFromInput(String input, ParserContext context) throws InputParseException { // @Override
if (input.isEmpty()) return null; // public ResettableExtent parseFromInput(String input, ParserContext context) throws InputParseException {
// if (input.isEmpty()) return null;
List<Double> unionChances = new ArrayList<>(); //
List<Double> intersectionChances = new ArrayList<>(); // List<Double> unionChances = new ArrayList<>();
// List<Double> intersectionChances = new ArrayList<>();
List<ResettableExtent> intersection = new ArrayList<>(); //
List<ResettableExtent> union = new ArrayList<>(); // List<ResettableExtent> intersection = new ArrayList<>();
final CommandLocals locals = new CommandLocals(); // List<ResettableExtent> union = new ArrayList<>();
Actor actor = context != null ? context.getActor() : null; // final CommandLocals locals = new CommandLocals();
if (actor != null) { // Actor actor = context != null ? context.getActor() : null;
locals.put(Actor.class, actor); // if (actor != null) {
} // locals.put(Actor.class, actor);
try { // }
List<Map.Entry<ParseEntry, List<String>>> parsed = parse(input); // try {
for (Map.Entry<ParseEntry, List<String>> entry : parsed) { // List<Map.Entry<ParseEntry, List<String>>> parsed = parse(input);
ParseEntry pe = entry.getKey(); // for (Map.Entry<ParseEntry, List<String>> entry : parsed) {
String command = pe.input; // ParseEntry pe = entry.getKey();
ResettableExtent transform = null; // String command = pe.input;
double chance = 1; // ResettableExtent transform;
if (command.isEmpty()) { // double chance = 1;
transform = parseFromInput(StringMan.join(entry.getValue(), ','), context); // if (command.isEmpty()) {
} else { // transform = parseFromInput(StringMan.join(entry.getValue(), ','), context);
List<String> args = entry.getValue(); // } else {
String cmdArgs = ((args.isEmpty()) ? "" : " " + StringMan.join(args, " ")); // List<String> args = entry.getValue();
try { // String cmdArgs = ((args.isEmpty()) ? "" : " " + StringMan.join(args, " "));
transform = parse(command + cmdArgs, context); // try {
} catch (SuggestInputParseException rethrow) { // transform = parse(command + cmdArgs, context);
throw rethrow; // } catch (SuggestInputParseException rethrow) {
} catch (Throwable e) { // throw rethrow;
throw new NoMatchException("See: //transforms"); // } catch (Throwable e) {
} // throw new NoMatchException("See: //transforms");
if (transform == null) { // }
// Legacy syntax // if (transform == null) {
int percentIndex = command.indexOf('%'); // // Legacy syntax
if (percentIndex != -1) { // Legacy percent pattern // int percentIndex = command.indexOf('%');
chance = Expression.compile(command.substring(0, percentIndex)).evaluate(); // if (percentIndex != -1) { // Legacy percent pattern
command = command.substring(percentIndex + 1); // chance = Expression.compile(command.substring(0, percentIndex)).evaluate();
if (!entry.getValue().isEmpty()) { // command = command.substring(percentIndex + 1);
if (!command.isEmpty()) command += " "; // if (!entry.getValue().isEmpty()) {
command += StringMan.join(entry.getValue(), " "); // if (!command.isEmpty()) command += " ";
} // command += StringMan.join(entry.getValue(), " ");
transform = parseFromInput(command, context); // }
} else { // transform = parseFromInput(command, context);
throw new NoMatchException("See: //transforms"); // } else {
} // throw new NoMatchException("See: //transforms");
} // }
if (pe.and) { // & // }
intersectionChances.add(chance); // if (pe.and) { // &
intersection.add(transform); // intersectionChances.add(chance);
} else { // intersection.add(transform);
if (!intersection.isEmpty()) { // } else {
if (intersection.size() == 1) { // if (!intersection.isEmpty()) {
throw new InputParseException("Error, floating &"); // if (intersection.size() == 1) {
} // throw new InputParseException("Error, floating &");
MultiTransform multi = new MultiTransform(); // }
double total = 0; // MultiTransform multi = new MultiTransform();
for (int i = 0; i < intersection.size(); i++) { // double total = 0;
Double value = intersectionChances.get(i); // for (int i = 0; i < intersection.size(); i++) {
total += value; // Double value = intersectionChances.get(i);
multi.add(intersection.get(i), value); // total += value;
} // multi.add(intersection.get(i), value);
union.add(multi); // }
unionChances.add(total); // union.add(multi);
intersection.clear(); // unionChances.add(total);
intersectionChances.clear(); // intersection.clear();
} // intersectionChances.clear();
unionChances.add(chance); // }
union.add(transform); // unionChances.add(chance);
} // union.add(transform);
} // }
} // }
} catch (Throwable e) { // }
throw new InputParseException(e.getMessage(), e); // } catch (Throwable e) {
} // throw new InputParseException(e.getMessage(), e);
if (!intersection.isEmpty()) { // }
if (intersection.size() == 1) { // if (!intersection.isEmpty()) {
throw new InputParseException("Error, floating &"); // if (intersection.size() == 1) {
} // throw new InputParseException("Error, floating &");
MultiTransform multi = new MultiTransform(); // }
double total = 0; // MultiTransform multi = new MultiTransform();
for (int i = 0; i < intersection.size(); i++) { // double total = 0;
Double value = intersectionChances.get(i); // for (int i = 0; i < intersection.size(); i++) {
total += value; // Double value = intersectionChances.get(i);
multi.add(intersection.get(i), value); // total += value;
} // multi.add(intersection.get(i), value);
union.add(multi); // }
unionChances.add(total); // union.add(multi);
intersection.clear(); // unionChances.add(total);
intersectionChances.clear(); // intersection.clear();
} // intersectionChances.clear();
if (union.isEmpty()) { // }
throw new NoMatchException("See: //transforms"); // if (union.isEmpty()) {
} else if (union.size() == 1) { // throw new NoMatchException("See: //transforms");
return union.get(0); // } else if (union.size() == 1) {
} else { // return union.get(0);
RandomTransform random = new RandomTransform(new TrueRandom()); // } else {
for (int i = 0; i < union.size(); i++) { // RandomTransform random = new RandomTransform(new TrueRandom());
random.add(union.get(i), unionChances.get(i)); // for (int i = 0; i < union.size(); i++) {
} // random.add(union.get(i), unionChances.get(i));
return random; // }
} // return random;
} // }
// }
//
} //
//}

View File

@ -20,8 +20,18 @@
package com.sk89q.worldedit.extension.factory; package com.sk89q.worldedit.extension.factory;
import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.WorldEdit;
import com.sk89q.worldedit.extension.factory.parser.mask.BiomeMaskParser;
import com.sk89q.worldedit.extension.factory.parser.mask.BlockCategoryMaskParser; import com.sk89q.worldedit.extension.factory.parser.mask.BlockCategoryMaskParser;
import com.sk89q.worldedit.extension.factory.parser.mask.DefaultMaskParser; import com.sk89q.worldedit.extension.factory.parser.mask.BlockStateMaskParser;
import com.sk89q.worldedit.extension.factory.parser.mask.BlocksMaskParser;
import com.sk89q.worldedit.extension.factory.parser.mask.ExistingMaskParser;
import com.sk89q.worldedit.extension.factory.parser.mask.ExpressionMaskParser;
import com.sk89q.worldedit.extension.factory.parser.mask.LazyRegionMaskParser;
import com.sk89q.worldedit.extension.factory.parser.mask.NegateMaskParser;
import com.sk89q.worldedit.extension.factory.parser.mask.NoiseMaskParser;
import com.sk89q.worldedit.extension.factory.parser.mask.OffsetMaskParser;
import com.sk89q.worldedit.extension.factory.parser.mask.RegionMaskParser;
import com.sk89q.worldedit.extension.factory.parser.mask.SolidMaskParser;
import com.sk89q.worldedit.extension.input.InputParseException; import com.sk89q.worldedit.extension.input.InputParseException;
import com.sk89q.worldedit.extension.input.NoMatchException; import com.sk89q.worldedit.extension.input.NoMatchException;
import com.sk89q.worldedit.extension.input.ParserContext; import com.sk89q.worldedit.extension.input.ParserContext;
@ -49,8 +59,6 @@ public final class MaskFactory extends AbstractFactory<Mask> {
* @param worldEdit the WorldEdit instance * @param worldEdit the WorldEdit instance
*/ */
public MaskFactory(WorldEdit worldEdit) { public MaskFactory(WorldEdit worldEdit) {
super(worldEdit, new DefaultMaskParser(worldEdit));
/*
super(worldEdit, new BlocksMaskParser(worldEdit)); super(worldEdit, new BlocksMaskParser(worldEdit));
register(new ExistingMaskParser(worldEdit)); register(new ExistingMaskParser(worldEdit));
@ -62,11 +70,8 @@ public final class MaskFactory extends AbstractFactory<Mask> {
register(new BlockStateMaskParser(worldEdit)); register(new BlockStateMaskParser(worldEdit));
register(new NegateMaskParser(worldEdit)); register(new NegateMaskParser(worldEdit));
register(new ExpressionMaskParser(worldEdit)); register(new ExpressionMaskParser(worldEdit));
*/
register(new BlockCategoryMaskParser(worldEdit)); register(new BlockCategoryMaskParser(worldEdit));
/*
register(new BiomeMaskParser(worldEdit)); register(new BiomeMaskParser(worldEdit));
*/
} }

View File

@ -21,7 +21,11 @@ package com.sk89q.worldedit.extension.factory;
import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.WorldEdit;
import com.sk89q.worldedit.extension.factory.parser.pattern.BlockCategoryPatternParser; import com.sk89q.worldedit.extension.factory.parser.pattern.BlockCategoryPatternParser;
import com.sk89q.worldedit.extension.factory.parser.pattern.DefaultPatternParser; import com.sk89q.worldedit.extension.factory.parser.pattern.ClipboardPatternParser;
import com.sk89q.worldedit.extension.factory.parser.pattern.RandomPatternParser;
import com.sk89q.worldedit.extension.factory.parser.pattern.RandomStatePatternParser;
import com.sk89q.worldedit.extension.factory.parser.pattern.SingleBlockPatternParser;
import com.sk89q.worldedit.extension.factory.parser.pattern.TypeOrStateApplyingPatternParser;
import com.sk89q.worldedit.function.pattern.Pattern; import com.sk89q.worldedit.function.pattern.Pattern;
import com.sk89q.worldedit.internal.registry.AbstractFactory; import com.sk89q.worldedit.internal.registry.AbstractFactory;
@ -40,8 +44,6 @@ public final class PatternFactory extends AbstractFactory<Pattern> {
* @param worldEdit the WorldEdit instance * @param worldEdit the WorldEdit instance
*/ */
public PatternFactory(WorldEdit worldEdit) { public PatternFactory(WorldEdit worldEdit) {
super(worldEdit, new DefaultPatternParser(worldEdit));
/*
super(worldEdit, new SingleBlockPatternParser(worldEdit)); super(worldEdit, new SingleBlockPatternParser(worldEdit));
// split and parse each sub-pattern // split and parse each sub-pattern
@ -51,7 +53,6 @@ public final class PatternFactory extends AbstractFactory<Pattern> {
register(new ClipboardPatternParser(worldEdit)); register(new ClipboardPatternParser(worldEdit));
register(new TypeOrStateApplyingPatternParser(worldEdit)); register(new TypeOrStateApplyingPatternParser(worldEdit));
register(new RandomStatePatternParser(worldEdit)); register(new RandomStatePatternParser(worldEdit));
*/
register(new BlockCategoryPatternParser(worldEdit)); register(new BlockCategoryPatternParser(worldEdit));
} }

View File

@ -43,6 +43,7 @@ import com.sk89q.worldedit.extension.input.InputParseException;
import com.sk89q.worldedit.extension.input.NoMatchException; import com.sk89q.worldedit.extension.input.NoMatchException;
import com.sk89q.worldedit.extension.input.ParserContext; import com.sk89q.worldedit.extension.input.ParserContext;
import com.sk89q.worldedit.extension.platform.Actor; import com.sk89q.worldedit.extension.platform.Actor;
import com.sk89q.worldedit.extension.platform.Capability;
import com.sk89q.worldedit.extent.inventory.BlockBag; import com.sk89q.worldedit.extent.inventory.BlockBag;
import com.sk89q.worldedit.extent.inventory.SlottableBlockBag; import com.sk89q.worldedit.extent.inventory.SlottableBlockBag;
import com.sk89q.worldedit.internal.registry.InputParser; import com.sk89q.worldedit.internal.registry.InputParser;
@ -289,8 +290,17 @@ public class DefaultBlockParser extends InputParser<BaseBlock> {
if (typeString.isEmpty()) { if (typeString.isEmpty()) {
throw new InputParseException("Invalid format"); throw new InputParseException("Invalid format");
} }
// PosX if ("hand".equalsIgnoreCase(typeString)) {
if (typeString.matches("pos[0-9]+")) { // Get the block type from the item in the user's hand.
final BaseBlock blockInHand = getBlockInHand(context.requireActor(), HandSide.MAIN_HAND);
state = blockInHand.toBlockState();
nbt = blockInHand.getNbtData();
} else if ("offhand".equalsIgnoreCase(typeString)) {
// Get the block type from the item in the user's off hand.
final BaseBlock blockInHand = getBlockInHand(context.requireActor(), HandSide.OFF_HAND);
state = blockInHand.toBlockState();
nbt = blockInHand.getNbtData();
} else if (typeString.matches("pos[0-9]+")) {
int index = Integer.parseInt(typeString.replaceAll("[a-z]+", "")); int index = Integer.parseInt(typeString.replaceAll("[a-z]+", ""));
// Get the block type from the "primary position" // Get the block type from the "primary position"
final World world = context.requireWorld(); final World world = context.requireWorld();
@ -301,45 +311,34 @@ public class DefaultBlockParser extends InputParser<BaseBlock> {
throw new InputParseException("Your selection is not complete."); throw new InputParseException("Your selection is not complete.");
} }
state = world.getBlock(primaryPosition); state = world.getBlock(primaryPosition);
} else if (typeString.matches("slot[0-9]+")) {
int slot = Integer.parseInt(typeString.substring(4)) - 1;
Actor actor = context.requireActor();
if (!(actor instanceof Player)) {
throw new InputParseException("The user is not a player!");
}
Player player = (Player) actor;
BlockBag bag = player.getInventoryBlockBag();
if (bag == null || !(bag instanceof SlottableBlockBag)) {
throw new InputParseException("Unsupported!");
}
SlottableBlockBag slottable = (SlottableBlockBag) bag;
BaseItem item = slottable.getItem(slot);
if (!item.getType().hasBlockType()) {
throw new InputParseException("You're not holding a block!");
}
state = item.getType().getBlockType().getDefaultState();
nbt = item.getNbtData();
} else { } else {
if ("hand".equalsIgnoreCase(typeString)) { BlockType type = BlockTypes.parse(typeString.toLowerCase(Locale.ROOT));
// Get the block type from the item in the user's hand.
BaseBlock block = getBlockInHand(context.requireActor(), HandSide.MAIN_HAND);
state = block.toBlockState();
nbt = block.getNbtData();
} else if ("offhand".equalsIgnoreCase(typeString)) {
// Get the block type from the item in the user's off hand.
BaseBlock block = getBlockInHand(context.requireActor(), HandSide.OFF_HAND);
state = block.toBlockState();
nbt = block.getNbtData();
} else if (typeString.matches("slot[0-9]+")) {
int slot = Integer.parseInt(typeString.substring(4)) - 1;
Actor actor = context.requireActor();
if (!(actor instanceof Player)) {
throw new InputParseException("The user is not a player!");
}
Player player = (Player) actor;
BlockBag bag = player.getInventoryBlockBag();
if (bag == null || !(bag instanceof SlottableBlockBag)) {
throw new InputParseException("Unsupported!");
}
SlottableBlockBag slottable = (SlottableBlockBag) bag;
BaseItem item = slottable.getItem(slot);
if (!item.getType().hasBlockType()) { if (type != null) {
throw new InputParseException("You're not holding a block!"); state = type.getDefaultState();
} }
state = item.getType().getBlockType().getDefaultState(); if (state == null) {
nbt = item.getNbtData(); throw new NoMatchException(
} else { "Does not match a valid block type: '" + input + "'");
BlockType type = BlockTypes.parse(typeString.toLowerCase(Locale.ROOT));
if (type != null) {
state = type.getDefaultState();
}
if (state == null) {
throw new NoMatchException("Does not match a valid block type: '" + input + "'");
}
} }
} }
if (nbt == null) nbt = state.getNbtData(); if (nbt == null) nbt = state.getNbtData();
@ -351,15 +350,15 @@ public class DefaultBlockParser extends InputParser<BaseBlock> {
if (stateString == null || stateString.isEmpty()) { if (stateString == null || stateString.isEmpty()) {
state = new FuzzyBlockState(state); state = new FuzzyBlockState(state);
} else { } else {
BlockType type = state.getBlockType(); BlockType blockType = state.getBlockType();
FuzzyBlockState.Builder fuzzyBuilder = FuzzyBlockState.builder(); FuzzyBlockState.Builder fuzzyBuilder = FuzzyBlockState.builder();
fuzzyBuilder.type(type); fuzzyBuilder.type(blockType);
String[] entries = stateString.split(","); String[] entries = stateString.split(",");
for (String entry : entries) { for (String entry : entries) {
String[] split = entry.split("="); String[] split = entry.split("=");
String key = split[0]; String key = split[0];
String val = split[1]; String val = split[1];
Property<Object> prop = type.getProperty(key); Property<Object> prop = blockType.getProperty(key);
fuzzyBuilder.withProperty(prop, prop.getValueFor(val)); fuzzyBuilder.withProperty(prop, prop.getValueFor(val));
} }
state = fuzzyBuilder.build(); state = fuzzyBuilder.build();
@ -398,9 +397,17 @@ public class DefaultBlockParser extends InputParser<BaseBlock> {
// Allow setting mob spawn type // Allow setting mob spawn type
if (blockAndExtraData.length > 1) { if (blockAndExtraData.length > 1) {
String mobName = blockAndExtraData[1]; String mobName = blockAndExtraData[1];
EntityType mobType = EntityTypes.parse(mobName); EntityType ent = EntityTypes.get(mobName.toLowerCase(Locale.ROOT));
if (ent == null) {
throw new NoMatchException("Unknown entity type '" + mobName + "'");
}
mobName = ent.getId();
if (!worldEdit.getPlatformManager().queryCapability(Capability.USER_COMMANDS).isValidMobType(mobName)) {
throw new NoMatchException("Unknown mob type '" + mobName + "'");
}
return validate(context, new MobSpawnerBlock(state, mobName)); return validate(context, new MobSpawnerBlock(state, mobName));
} else { } else {
//noinspection ConstantConditions
return validate(context, new MobSpawnerBlock(state, EntityTypes.PIG.getId())); return validate(context, new MobSpawnerBlock(state, EntityTypes.PIG.getId()));
} }
} else if (blockType == BlockTypes.PLAYER_HEAD || blockType == BlockTypes.PLAYER_WALL_HEAD) { } else if (blockType == BlockTypes.PLAYER_HEAD || blockType == BlockTypes.PLAYER_WALL_HEAD) {

View File

@ -29,8 +29,6 @@ import com.sk89q.worldedit.internal.registry.InputParser;
import java.util.stream.Stream; import java.util.stream.Stream;
import java.util.stream.Stream;
public class BlockStateMaskParser extends InputParser<Mask> { public class BlockStateMaskParser extends InputParser<Mask> {
public BlockStateMaskParser(WorldEdit worldEdit) { public BlockStateMaskParser(WorldEdit worldEdit) {

View File

@ -1,206 +1,207 @@
/* // TODO: Ping @MattBDev to reimplement 2020-02-04
* WorldEdit, a Minecraft world manipulation toolkit ///*
* Copyright (C) sk89q <http://www.sk89q.com> // * WorldEdit, a Minecraft world manipulation toolkit
* Copyright (C) WorldEdit team and contributors // * Copyright (C) sk89q <http://www.sk89q.com>
* // * Copyright (C) WorldEdit team and contributors
* This program is free software: you can redistribute it and/or modify it // *
* under the terms of the GNU Lesser General Public License as published by the // * This program is free software: you can redistribute it and/or modify it
* Free Software Foundation, either version 3 of the License, or // * under the terms of the GNU Lesser General Public License as published by the
* (at your option) any later version. // * Free Software Foundation, either version 3 of the License, or
* // * (at your option) any later version.
* This program is distributed in the hope that it will be useful, but WITHOUT // *
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // * This program is distributed in the hope that it will be useful, but WITHOUT
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License // * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* for more details. // * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
* // * for more details.
* You should have received a copy of the GNU Lesser General Public License // *
* along with this program. If not, see <http://www.gnu.org/licenses/>. // * You should have received a copy of the GNU Lesser General Public License
*/ // * along with this program. If not, see <http://www.gnu.org/licenses/>.
// */
package com.sk89q.worldedit.extension.factory.parser.mask; //
//package com.sk89q.worldedit.extension.factory.parser.mask;
import com.boydti.fawe.command.FaweParser; //
import com.boydti.fawe.command.SuggestInputParseException; //import com.boydti.fawe.command.FaweParser;
import com.boydti.fawe.config.Caption; //import com.boydti.fawe.command.SuggestInputParseException;
import com.boydti.fawe.util.StringMan; //import com.boydti.fawe.config.Caption;
import com.sk89q.minecraft.util.commands.CommandLocals; //import com.boydti.fawe.util.StringMan;
import com.sk89q.worldedit.WorldEdit; //import com.sk89q.minecraft.util.commands.CommandLocals;
import com.sk89q.worldedit.extension.input.InputParseException; //import com.sk89q.worldedit.WorldEdit;
import com.sk89q.worldedit.extension.input.ParserContext; //import com.sk89q.worldedit.extension.input.InputParseException;
import com.sk89q.worldedit.extension.platform.Actor; //import com.sk89q.worldedit.extension.input.ParserContext;
import com.sk89q.worldedit.extent.Extent; //import com.sk89q.worldedit.extension.platform.Actor;
import com.sk89q.worldedit.function.mask.BlockMaskBuilder; //import com.sk89q.worldedit.extent.Extent;
import com.sk89q.worldedit.function.mask.Mask; //import com.sk89q.worldedit.function.mask.BlockMaskBuilder;
import com.sk89q.worldedit.function.mask.MaskIntersection; //import com.sk89q.worldedit.function.mask.Mask;
import com.sk89q.worldedit.function.mask.MaskUnion; //import com.sk89q.worldedit.function.mask.MaskIntersection;
import com.sk89q.worldedit.session.request.Request; //import com.sk89q.worldedit.function.mask.MaskUnion;
import com.sk89q.worldedit.world.block.BaseBlock; //import com.sk89q.worldedit.session.request.Request;
import com.sk89q.worldedit.world.block.BlockStateHolder; //import com.sk89q.worldedit.world.block.BaseBlock;
import com.sk89q.worldedit.world.block.BlockTypes; //import com.sk89q.worldedit.world.block.BlockStateHolder;
//import com.sk89q.worldedit.world.block.BlockTypes;
import java.util.ArrayList; //
import java.util.List; //import java.util.ArrayList;
import java.util.Map; //import java.util.List;
import java.util.stream.Collectors; //import java.util.Map;
import java.util.stream.Stream; //import java.util.stream.Collectors;
//import java.util.stream.Stream;
public class DefaultMaskParser extends FaweParser<Mask> { //
public DefaultMaskParser(WorldEdit worldEdit) { //public class DefaultMaskParser extends FaweParser<Mask> {
super(worldEdit, "masks"); // public DefaultMaskParser(WorldEdit worldEdit) {
} // super(worldEdit, "masks");
// }
@Override //
public Mask parseFromInput(String input, ParserContext context) throws InputParseException { // @Override
if (input.isEmpty()) { // public Mask parseFromInput(String input, ParserContext context) throws InputParseException {
throw new SuggestInputParseException("No input provided", "", () -> Stream.concat(Stream.of("#", ",", "&"), BlockTypes.getNameSpaces().stream().map(n -> n + ":")).collect(Collectors.toList())); // if (input.isEmpty()) {
} // throw new SuggestInputParseException("No input provided", "", () -> Stream.concat(Stream.of("#", ",", "&"), BlockTypes.getNameSpaces().stream().map(n -> n + ":")).collect(Collectors.toList()));
Extent extent = Request.request().getExtent(); // }
if (extent == null) extent = context.getExtent(); // Extent extent = Request.request().getExtent();
List<List<Mask>> masks = new ArrayList<>(); // if (extent == null) extent = context.getExtent();
masks.add(new ArrayList<>()); // List<List<Mask>> masks = new ArrayList<>();
// masks.add(new ArrayList<>());
final CommandLocals locals = new CommandLocals(); //
Actor actor = context != null ? context.getActor() : null; // final CommandLocals locals = new CommandLocals();
if (actor != null) { // Actor actor = context != null ? context.getActor() : null;
locals.put(Actor.class, actor); // if (actor != null) {
} // locals.put(Actor.class, actor);
try { // }
List<Map.Entry<ParseEntry, List<String>>> parsed = parse(input); // try {
for (Map.Entry<ParseEntry, List<String>> entry : parsed) { // List<Map.Entry<ParseEntry, List<String>>> parsed = parse(input);
ParseEntry pe = entry.getKey(); // for (Map.Entry<ParseEntry, List<String>> entry : parsed) {
final String command = pe.input; // ParseEntry pe = entry.getKey();
String full = pe.full; // final String command = pe.input;
Mask mask = null; // String full = pe.full;
if (command.isEmpty()) { // Mask mask = null;
mask = parseFromInput(StringMan.join(entry.getValue(), ','), context); // if (command.isEmpty()) {
} else { // mask = parseFromInput(StringMan.join(entry.getValue(), ','), context);
List<String> args = entry.getValue(); // } else {
String cmdArgs = ((args.isEmpty()) ? "" : " " + StringMan.join(args, " ")); // List<String> args = entry.getValue();
try { // String cmdArgs = ((args.isEmpty()) ? "" : " " + StringMan.join(args, " "));
mask = parse(command + cmdArgs, context); // try {
} catch (SuggestInputParseException rethrow) { // mask = parse(command + cmdArgs, context);
throw rethrow; // } catch (SuggestInputParseException rethrow) {
} catch (Throwable e) { // throw rethrow;
// TODO NOT IMPLEMENTED // } catch (Throwable e) {
// throw SuggestInputParseException.of(e, full, () -> { // // TODO NOT IMPLEMENTED
// try { //// throw SuggestInputParseException.of(e, full, () -> {
// List<String> suggestions = dispatcher.get(command).getCallable().getSuggestions(cmdArgs, locals); //// try {
// if (suggestions.size() <= 2) { //// List<String> suggestions = dispatcher.get(command).getCallable().getSuggestions(cmdArgs, locals);
// for (int i = 0; i < suggestions.size(); i++) { //// if (suggestions.size() <= 2) {
// String suggestion = suggestions.get(i); //// for (int i = 0; i < suggestions.size(); i++) {
// if (suggestion.indexOf(' ') != 0) { //// String suggestion = suggestions.get(i);
// String[] split = suggestion.split(" "); //// if (suggestion.indexOf(' ') != 0) {
// suggestion = "[" + StringMan.join(split, "][") + "]"; //// String[] split = suggestion.split(" ");
// suggestions.set(i, suggestion); //// suggestion = "[" + StringMan.join(split, "][") + "]";
// } //// suggestions.set(i, suggestion);
//// }
//// }
//// }
//// return suggestions;
//// } catch (CommandException e1) {
//// throw new InputParseException(e1.getMessage());
//// } catch (Throwable e2) {
//// e2.printStackTrace();
//// throw new InputParseException(e2.getMessage());
//// }
//// });
// }
// if (mask == null) {
// // Legacy patterns
// char char0 = command.charAt(0);
// boolean charMask = input.length() > 1 && input.charAt(1) != '[';
// if (charMask && input.charAt(0) == '=') {
// return parseFromInput(char0 + "[" + input.substring(1) + "]", context);
// }
// if (char0 == '#' || char0 == '?') {
// // TODO NOT IMPLEMENTED
//// throw new SuggestInputParseException(new NoMatchException("Unknown mask: " + full + ", See: //masks"), full,
//// () -> {
//// if (full.length() == 1) return new ArrayList<>(dispatcher.getPrimaryAliases());
//// return dispatcher.getAliases().stream().filter(
//// s -> s.startsWith(command.toLowerCase())
//// ).collect(Collectors.toList());
//// }
//// );
// }
// // Legacy syntax
// if (charMask) {
// switch (char0) {
// case '\\': //
// case '/': //
// case '{': //
// case '$': //
// case '%': {
// String value = command.substring(1) + ((entry.getValue().isEmpty()) ? "" : "[" + StringMan.join(entry.getValue(), "][") + "]");
// if (value.contains(":")) {
// if (value.charAt(0) == ':') value.replaceFirst(":", "");
// value = value.replaceAll(":", "][");
// } // }
// mask = parseFromInput("#" + char0 + "[" + value + "]", context);
// break;
// } // }
// return suggestions; // case '|':
// } catch (CommandException e1) { // case '~':
// throw new InputParseException(e1.getMessage()); // case '<':
// } catch (Throwable e2) { // case '>':
// e2.printStackTrace(); // case '!':
// throw new InputParseException(e2.getMessage()); // input = input.substring(input.indexOf(char0) + 1);
// } // mask = parseFromInput(char0 + "[" + input + "]", context);
// }); // if (actor != null) {
} // actor.print(Caption.of("fawe.worldedit.help.command.clarifying.bracket" , char0 + "[" + input + "]"));
if (mask == null) {
// Legacy patterns
char char0 = command.charAt(0);
boolean charMask = input.length() > 1 && input.charAt(1) != '[';
if (charMask && input.charAt(0) == '=') {
return parseFromInput(char0 + "[" + input.substring(1) + "]", context);
}
if (char0 == '#' || char0 == '?') {
// TODO NOT IMPLEMENTED
// throw new SuggestInputParseException(new NoMatchException("Unknown mask: " + full + ", See: //masks"), full,
// () -> {
// if (full.length() == 1) return new ArrayList<>(dispatcher.getPrimaryAliases());
// return dispatcher.getAliases().stream().filter(
// s -> s.startsWith(command.toLowerCase())
// ).collect(Collectors.toList());
// } // }
// ); // return mask;
} // }
// Legacy syntax // }
if (charMask) { // }
switch (char0) { // if (mask == null) {
case '\\': // // if (command.startsWith("[")) {
case '/': // // int end = command.lastIndexOf(']');
case '{': // // mask = parseFromInput(command.substring(1, end == -1 ? command.length() : end), context);
case '$': // // } else {
case '%': { // List<String> entries = entry.getValue();
String value = command.substring(1) + ((entry.getValue().isEmpty()) ? "" : "[" + StringMan.join(entry.getValue(), "][") + "]"); // BlockMaskBuilder builder = new BlockMaskBuilder();
if (value.contains(":")) { //// if (StringMan.containsAny(full, "\\^$.|?+(){}<>~$!%^&*+-/"))
if (value.charAt(0) == ':') value.replaceFirst(":", ""); // {
value = value.replaceAll(":", "]["); // try {
} // builder.addRegex(full);
mask = parseFromInput("#" + char0 + "[" + value + "]", context); // } catch (InputParseException ignore) {}
break; // }
} // if (mask == null) {
case '|': // context.setPreferringWildcard(false);
case '~': // context.setRestricted(false);
case '<': // BaseBlock block = worldEdit.getBlockFactory().parseFromInput(full, context);
case '>': // builder.add(block);
case '!': // mask = builder.build(extent);
input = input.substring(input.indexOf(char0) + 1); // }
mask = parseFromInput(char0 + "[" + input + "]", context); // }
if (actor != null) { // }
actor.print(Caption.of("fawe.worldedit.help.command.clarifying.bracket" , char0 + "[" + input + "]")); // }
} // if (pe.and) {
return mask; // masks.add(new ArrayList<>());
} // }
} // masks.get(masks.size() - 1).add(mask);
} // }
if (mask == null) { // } catch (InputParseException rethrow) {
if (command.startsWith("[")) { // throw rethrow;
int end = command.lastIndexOf(']'); // } catch (Throwable e) {
mask = parseFromInput(command.substring(1, end == -1 ? command.length() : end), context); // e.printStackTrace();
} else { // throw new InputParseException(e.getMessage(), e);
List<String> entries = entry.getValue(); // }
BlockMaskBuilder builder = new BlockMaskBuilder(); // List<Mask> maskUnions = new ArrayList<>();
// if (StringMan.containsAny(full, "\\^$.|?+(){}<>~$!%^&*+-/")) // for (List<Mask> maskList : masks) {
{ // if (maskList.size() == 1) {
try { // maskUnions.add(maskList.get(0));
builder.addRegex(full); // } else if (maskList.size() != 0) {
} catch (InputParseException ignore) {} // maskUnions.add(new MaskUnion(maskList));
} // }
if (mask == null) { // }
context.setPreferringWildcard(false); // if (maskUnions.size() == 1) {
context.setRestricted(false); // return maskUnions.get(0);
BaseBlock block = worldEdit.getBlockFactory().parseFromInput(full, context); // } else if (maskUnions.size() != 0) {
builder.add(block); // return new MaskIntersection(maskUnions);
mask = builder.build(extent); // } else {
} // return null;
} // }
} //
} // }
if (pe.and) { //}
masks.add(new ArrayList<>());
}
masks.get(masks.size() - 1).add(mask);
}
} catch (InputParseException rethrow) {
throw rethrow;
} catch (Throwable e) {
e.printStackTrace();
throw new InputParseException(e.getMessage(), e);
}
List<Mask> maskUnions = new ArrayList<>();
for (List<Mask> maskList : masks) {
if (maskList.size() == 1) {
maskUnions.add(maskList.get(0));
} else if (maskList.size() != 0) {
maskUnions.add(new MaskUnion(maskList));
}
}
if (maskUnions.size() == 1) {
return maskUnions.get(0);
} else if (maskUnions.size() != 0) {
return new MaskIntersection(maskUnions);
} else {
return null;
}
}
}

View File

@ -1,184 +1,185 @@
/* // TODO: Ping @MattBDev to reimplement (or remove because this class is stupid) 2020-02-04
* WorldEdit, a Minecraft world manipulation toolkit ///*
* Copyright (C) sk89q <http://www.sk89q.com> // * WorldEdit, a Minecraft world manipulation toolkit
* Copyright (C) WorldEdit team and contributors // * Copyright (C) sk89q <http://www.sk89q.com>
* // * Copyright (C) WorldEdit team and contributors
* This program is free software: you can redistribute it and/or modify it // *
* under the terms of the GNU Lesser General Public License as published by the // * This program is free software: you can redistribute it and/or modify it
* Free Software Foundation, either version 3 of the License, or // * under the terms of the GNU Lesser General Public License as published by the
* (at your option) any later version. // * Free Software Foundation, either version 3 of the License, or
* // * (at your option) any later version.
* This program is distributed in the hope that it will be useful, but WITHOUT // *
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // * This program is distributed in the hope that it will be useful, but WITHOUT
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License // * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* for more details. // * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
* // * for more details.
* You should have received a copy of the GNU Lesser General Public License // *
* along with this program. If not, see <http://www.gnu.org/licenses/>. // * You should have received a copy of the GNU Lesser General Public License
*/ // * along with this program. If not, see <http://www.gnu.org/licenses/>.
// */
package com.sk89q.worldedit.extension.factory.parser.pattern; //
//package com.sk89q.worldedit.extension.factory.parser.pattern;
import com.boydti.fawe.command.FaweParser; //
import com.boydti.fawe.command.SuggestInputParseException; //import com.boydti.fawe.command.FaweParser;
import com.boydti.fawe.object.random.TrueRandom; //import com.boydti.fawe.command.SuggestInputParseException;
import com.boydti.fawe.util.StringMan; //import com.boydti.fawe.object.random.TrueRandom;
import com.google.common.collect.Iterables; //import com.boydti.fawe.util.StringMan;
import com.sk89q.minecraft.util.commands.CommandLocals; //import com.google.common.collect.Iterables;
import com.sk89q.worldedit.WorldEdit; //import com.sk89q.minecraft.util.commands.CommandLocals;
import com.sk89q.worldedit.extension.input.InputParseException; //import com.sk89q.worldedit.WorldEdit;
import com.sk89q.worldedit.extension.input.NoMatchException; //import com.sk89q.worldedit.extension.input.InputParseException;
import com.sk89q.worldedit.extension.input.ParserContext; //import com.sk89q.worldedit.extension.input.NoMatchException;
import com.sk89q.worldedit.extension.platform.Actor; //import com.sk89q.worldedit.extension.input.ParserContext;
import com.sk89q.worldedit.extension.platform.PlatformCommandManager; //import com.sk89q.worldedit.extension.platform.Actor;
import com.sk89q.worldedit.function.pattern.Pattern; //import com.sk89q.worldedit.extension.platform.PlatformCommandManager;
import com.sk89q.worldedit.function.pattern.RandomPattern; //import com.sk89q.worldedit.function.pattern.Pattern;
import com.sk89q.worldedit.internal.expression.Expression; //import com.sk89q.worldedit.function.pattern.RandomPattern;
import com.sk89q.worldedit.world.block.BlockTypes; //import com.sk89q.worldedit.internal.expression.Expression;
//import com.sk89q.worldedit.world.block.BlockTypes;
import java.util.ArrayList; //
import java.util.List; //import java.util.ArrayList;
import java.util.Map; //import java.util.List;
import java.util.stream.Collectors; //import java.util.Map;
import java.util.stream.Stream; //import java.util.stream.Collectors;
//import java.util.stream.Stream;
public class DefaultPatternParser extends FaweParser<Pattern> { //
//public class DefaultPatternParser extends FaweParser<Pattern> {
public DefaultPatternParser(WorldEdit worldEdit) { //
super(worldEdit, "patterns"); // public DefaultPatternParser(WorldEdit worldEdit) {
} // super(worldEdit, "patterns");
// }
@Override //
public Pattern parseFromInput(String input, ParserContext context) throws InputParseException { // @Override
if (input.isEmpty()) { // public Pattern parseFromInput(String input, ParserContext context) throws InputParseException {
throw new SuggestInputParseException("No input provided", "", () -> Stream.concat(Stream.of("#", ",", "&"), BlockTypes.getNameSpaces().stream().map(n -> n + ":")).collect(Collectors.toList())); // if (input.isEmpty()) {
} // throw new SuggestInputParseException("No input provided", "", () -> Stream.concat(Stream.of("#", ",", "&"), BlockTypes.getNameSpaces().stream().map(n -> n + ":")).collect(Collectors.toList()));
List<Double> chances = new ArrayList<>(); // }
List<Pattern> patterns = new ArrayList<>(); // List<Double> chances = new ArrayList<>();
final CommandLocals locals = new CommandLocals(); // List<Pattern> patterns = new ArrayList<>();
Actor actor = context != null ? context.getActor() : null; // final CommandLocals locals = new CommandLocals();
if (actor != null) { // Actor actor = context != null ? context.getActor() : null;
locals.put(Actor.class, actor); // if (actor != null) {
} // locals.put(Actor.class, actor);
try { // }
for (Map.Entry<ParseEntry, List<String>> entry : parse(input)) { // try {
ParseEntry pe = entry.getKey(); // for (Map.Entry<ParseEntry, List<String>> entry : parse(input)) {
final String command = pe.input; // ParseEntry pe = entry.getKey();
String full = pe.full; // final String command = pe.input;
Pattern pattern = null; // String full = pe.full;
double chance = 1; // Pattern pattern = null;
if (command.isEmpty()) { // double chance = 1;
pattern = parseFromInput(StringMan.join(entry.getValue(), ','), context); // if (command.isEmpty()) {
} else { // pattern = parseFromInput(StringMan.join(entry.getValue(), ','), context);
List<String> args = entry.getValue(); // } else {
String cmdArgs = ((args.isEmpty()) ? "" : " " + StringMan.join(args, " ")); // List<String> args = entry.getValue();
try { // String cmdArgs = ((args.isEmpty()) ? "" : " " + StringMan.join(args, " "));
pattern = parse(command + cmdArgs, context); // try {
} catch (SuggestInputParseException rethrow) { // pattern = parse(command + cmdArgs, context);
throw rethrow; // } catch (SuggestInputParseException rethrow) {
} catch (Throwable e) { // throw rethrow;
// TODO NOT IMPLEMENTED // } catch (Throwable e) {
// throw SuggestInputParseException.of(e, full, () -> { // // TODO NOT IMPLEMENTED
// try { //// throw SuggestInputParseException.of(e, full, () -> {
// List<String> suggestions = dispatcher.get(command).getCallable().getSuggestions(cmdArgs, locals); //// try {
// if (suggestions.size() <= 2) { //// List<String> suggestions = dispatcher.get(command).getCallable().getSuggestions(cmdArgs, locals);
// for (int i = 0; i < suggestions.size(); i++) { //// if (suggestions.size() <= 2) {
// String suggestion = suggestions.get(i); //// for (int i = 0; i < suggestions.size(); i++) {
// if (suggestion.indexOf(' ') != 0) { //// String suggestion = suggestions.get(i);
// String[] split = suggestion.split(" "); //// if (suggestion.indexOf(' ') != 0) {
// suggestion = "[" + StringMan.join(split, "][") + "]"; //// String[] split = suggestion.split(" ");
// suggestions.set(i, suggestion); //// suggestion = "[" + StringMan.join(split, "][") + "]";
// } //// suggestions.set(i, suggestion);
//// }
//// }
//// }
//// return suggestions;
//// } catch (CommandException e1) {
//// throw new InputParseException(e1.getMessage());
//// } catch (Throwable e2) {
//// e2.printStackTrace();
//// throw new InputParseException(e2.getMessage());
//// }
//// });
// }
// if (pattern == null) {
// // Legacy patterns
// char char0 = command.charAt(0);
// boolean charMask = input.length() > 1 && input.charAt(1) != '[';
// if (charMask && input.charAt(0) == '=') {
// return parseFromInput(char0 + "[" + input.substring(1) + "]", context);
// }
// if (char0 == '#') {
// // TODO NOT IMPLEMENTED
//// throw new SuggestInputParseException(new NoMatchException("Unknown pattern: " + full + ", See: //patterns"), full,
//// () -> {
//// if (full.length() == 1) return new ArrayList<>(dispatcher.getPrimaryAliases());
//// return dispatcher.getAliases().stream().filter(
//// s -> s.startsWith(command.toLowerCase(Locale.ROOT))
//// ).collect(Collectors.toList());
//// }
//// );
// }
//
//
// if (charMask) {
// if (char0 == '$') {
// String value = command.substring(1) + ((entry.getValue().isEmpty()) ? ""
// : "[" + StringMan.join(entry.getValue(), "][") + "]");
// if (value.contains(":")) {
// if (value.charAt(0) == ':') {
// value.replaceFirst(":", "");
// }
// value = value.replaceAll(":", "][");
// }
// pattern = parseFromInput(char0 + "[" + value + "]", context);
// }
// }
// if (pattern == null) {
// if (command.startsWith("[")) {
// int end = command.lastIndexOf(']');
// pattern = parseFromInput(command.substring(1, end == -1 ? command.length() : end), context);
// } else {
// int percentIndex = command.indexOf('%');
// if (percentIndex != -1) { // Legacy percent pattern
// chance = Expression.compile(command.substring(0, percentIndex)).evaluate();
// String value = command.substring(percentIndex + 1);
// if (!entry.getValue().isEmpty()) {
// if (!value.isEmpty()) value += " ";
// value += StringMan.join(entry.getValue(), " ");
// }
// pattern = parseFromInput(value, context);
// } else { // legacy block pattern
// try {
// pattern = worldEdit.getBlockFactory().parseFromInput(pe.full, context);
// } catch (NoMatchException e) {
// throw new NoMatchException(e.getMessage() + " See: //patterns");
// } // }
// } // }
// return suggestions;
// } catch (CommandException e1) {
// throw new InputParseException(e1.getMessage());
// } catch (Throwable e2) {
// e2.printStackTrace();
// throw new InputParseException(e2.getMessage());
// } // }
// }); // }
} // }
if (pattern == null) { // }
// Legacy patterns // if (pattern != null) {
char char0 = command.charAt(0); // patterns.add(pattern);
boolean charMask = input.length() > 1 && input.charAt(1) != '['; // chances.add(chance);
if (charMask && input.charAt(0) == '=') { // }
return parseFromInput(char0 + "[" + input.substring(1) + "]", context); // }
} // } catch (InputParseException rethrow) {
if (char0 == '#') { // throw rethrow;
// TODO NOT IMPLEMENTED // } catch (Throwable e) {
// throw new SuggestInputParseException(new NoMatchException("Unknown pattern: " + full + ", See: //patterns"), full, // e.printStackTrace();
// () -> { // throw new InputParseException(e.getMessage(), e);
// if (full.length() == 1) return new ArrayList<>(dispatcher.getPrimaryAliases()); // }
// return dispatcher.getAliases().stream().filter( // if (patterns.isEmpty()) {
// s -> s.startsWith(command.toLowerCase(Locale.ROOT)) // return null;
// ).collect(Collectors.toList()); // }
// } // if (patterns.size() == 1) {
// ); // return patterns.get(0);
} // }
// RandomPattern random = new RandomPattern(new TrueRandom());
// for (int i = 0; i < patterns.size(); i++) {
if (charMask) { // random.add(patterns.get(i), chances.get(i));
if (char0 == '$') { // }
String value = command.substring(1) + ((entry.getValue().isEmpty()) ? "" // return random;
: "[" + StringMan.join(entry.getValue(), "][") + "]"); // }
if (value.contains(":")) { //}
if (value.charAt(0) == ':') {
value.replaceFirst(":", "");
}
value = value.replaceAll(":", "][");
}
pattern = parseFromInput(char0 + "[" + value + "]", context);
}
}
if (pattern == null) {
if (command.startsWith("[")) {
int end = command.lastIndexOf(']');
pattern = parseFromInput(command.substring(1, end == -1 ? command.length() : end), context);
} else {
int percentIndex = command.indexOf('%');
if (percentIndex != -1) { // Legacy percent pattern
chance = Expression.compile(command.substring(0, percentIndex)).evaluate();
String value = command.substring(percentIndex + 1);
if (!entry.getValue().isEmpty()) {
if (!value.isEmpty()) value += " ";
value += StringMan.join(entry.getValue(), " ");
}
pattern = parseFromInput(value, context);
} else { // legacy block pattern
try {
pattern = worldEdit.getBlockFactory().parseFromInput(pe.full, context);
} catch (NoMatchException e) {
throw new NoMatchException(e.getMessage() + " See: //patterns");
}
}
}
}
}
}
if (pattern != null) {
patterns.add(pattern);
chances.add(chance);
}
}
} catch (InputParseException rethrow) {
throw rethrow;
} catch (Throwable e) {
e.printStackTrace();
throw new InputParseException(e.getMessage(), e);
}
if (patterns.isEmpty()) {
return null;
}
if (patterns.size() == 1) {
return patterns.get(0);
}
RandomPattern random = new RandomPattern(new TrueRandom());
for (int i = 0; i < patterns.size(); i++) {
random.add(patterns.get(i), chances.get(i));
}
return random;
}
}

View File

@ -24,12 +24,8 @@ import static com.google.common.base.Preconditions.checkNotNull;
import com.boydti.fawe.Fawe; import com.boydti.fawe.Fawe;
import com.boydti.fawe.command.AnvilCommands; import com.boydti.fawe.command.AnvilCommands;
import com.boydti.fawe.command.AnvilCommandsRegistration; import com.boydti.fawe.command.AnvilCommandsRegistration;
import com.boydti.fawe.command.CFICommands;
import com.boydti.fawe.command.CFICommandsRegistration;
import com.boydti.fawe.config.Caption; import com.boydti.fawe.config.Caption;
import com.boydti.fawe.config.Settings; import com.boydti.fawe.config.Settings;
import com.boydti.fawe.object.brush.visualization.cfi.HeightMapMCAGenerator;
import com.boydti.fawe.object.changeset.CFIChangeSet;
import com.boydti.fawe.object.exception.FaweException; import com.boydti.fawe.object.exception.FaweException;
import com.boydti.fawe.object.task.ThrowableSupplier; import com.boydti.fawe.object.task.ThrowableSupplier;
import com.boydti.fawe.util.StringMan; import com.boydti.fawe.util.StringMan;
@ -62,13 +58,9 @@ import com.sk89q.worldedit.command.HistoryCommands;
import com.sk89q.worldedit.command.HistoryCommandsRegistration; import com.sk89q.worldedit.command.HistoryCommandsRegistration;
import com.sk89q.worldedit.command.HistorySubCommands; import com.sk89q.worldedit.command.HistorySubCommands;
import com.sk89q.worldedit.command.HistorySubCommandsRegistration; import com.sk89q.worldedit.command.HistorySubCommandsRegistration;
import com.sk89q.worldedit.command.MaskCommands;
import com.sk89q.worldedit.command.MaskCommandsRegistration;
import com.sk89q.worldedit.command.NavigationCommands; import com.sk89q.worldedit.command.NavigationCommands;
import com.sk89q.worldedit.command.NavigationCommandsRegistration; import com.sk89q.worldedit.command.NavigationCommandsRegistration;
import com.sk89q.worldedit.command.PaintBrushCommands; import com.sk89q.worldedit.command.PaintBrushCommands;
import com.sk89q.worldedit.command.PatternCommands;
import com.sk89q.worldedit.command.PatternCommandsRegistration;
import com.sk89q.worldedit.command.RegionCommands; import com.sk89q.worldedit.command.RegionCommands;
import com.sk89q.worldedit.command.RegionCommandsRegistration; import com.sk89q.worldedit.command.RegionCommandsRegistration;
import com.sk89q.worldedit.command.SchematicCommands; import com.sk89q.worldedit.command.SchematicCommands;
@ -87,8 +79,6 @@ import com.sk89q.worldedit.command.ToolCommands;
import com.sk89q.worldedit.command.ToolCommandsRegistration; import com.sk89q.worldedit.command.ToolCommandsRegistration;
import com.sk89q.worldedit.command.ToolUtilCommands; import com.sk89q.worldedit.command.ToolUtilCommands;
import com.sk89q.worldedit.command.ToolUtilCommandsRegistration; import com.sk89q.worldedit.command.ToolUtilCommandsRegistration;
import com.sk89q.worldedit.command.TransformCommands;
import com.sk89q.worldedit.command.TransformCommandsRegistration;
import com.sk89q.worldedit.command.UtilityCommands; import com.sk89q.worldedit.command.UtilityCommands;
import com.sk89q.worldedit.command.UtilityCommandsRegistration; import com.sk89q.worldedit.command.UtilityCommandsRegistration;
import com.sk89q.worldedit.command.WorldEditCommands; import com.sk89q.worldedit.command.WorldEditCommands;
@ -304,9 +294,10 @@ public final class PlatformCommandManager {
}); });
}); });
*/ */
globalInjectedValues.injectValue(Key.of(CFICommands.CFISettings.class), // TODO: Ping @MattBDev to reimplement 2020-02-04
context -> context.injectedValue(Key.of(Actor.class)) // globalInjectedValues.injectValue(Key.of(CFICommands.CFISettings.class),
.orElseThrow(() -> new IllegalStateException("No CFI Settings")).getMeta("CFISettings")); // context -> context.injectedValue(Key.of(Actor.class))
// .orElseThrow(() -> new IllegalStateException("No CFI Settings")).getMeta("CFISettings"));
globalInjectedValues.injectValue(Key.of(World.class), globalInjectedValues.injectValue(Key.of(World.class),
context -> { context -> {
LocalSession localSession = context.injectedValue(Key.of(LocalSession.class)) LocalSession localSession = context.injectedValue(Key.of(LocalSession.class))
@ -321,7 +312,6 @@ public final class PlatformCommandManager {
} else { } else {
throw new MissingWorldException(); throw new MissingWorldException();
} }
} catch (MissingWorldException e) { } catch (MissingWorldException e) {
exceptionConverter.convert(e); exceptionConverter.convert(e);
throw new AssertionError("Should have thrown a new exception.", e); throw new AssertionError("Should have thrown a new exception.", e);
@ -332,13 +322,13 @@ public final class PlatformCommandManager {
} }
private <CI> void registerSubCommands(String name, List<String> aliases, String desc, private <CI> void registerSubCommands(String name, List<String> aliases, String desc,
CommandRegistration<CI> registration, CI instance) { CommandRegistration<CI> registration, CI instance) {
registerSubCommands(name, aliases, desc, registration, instance, m -> {}); registerSubCommands(name, aliases, desc, registration, instance, m -> {});
} }
private <CI> void registerSubCommands(String name, List<String> aliases, String desc, private <CI> void registerSubCommands(String name, List<String> aliases, String desc,
CommandRegistration<CI> registration, CI instance, CommandRegistration<CI> registration, CI instance,
Consumer<CommandManager> additionalConfig) { Consumer<CommandManager> additionalConfig) {
commandManager.register(name, cmd -> { commandManager.register(name, cmd -> {
cmd.aliases(aliases); cmd.aliases(aliases);
cmd.description(TextComponent.of(desc)); cmd.description(TextComponent.of(desc));
@ -396,27 +386,28 @@ public final class PlatformCommandManager {
public void registerAllCommands() { public void registerAllCommands() {
if (Settings.IMP.ENABLED_COMPONENTS.COMMANDS) { if (Settings.IMP.ENABLED_COMPONENTS.COMMANDS) {
registerSubCommands( // TODO: Ping @MattBDev to reimplement (or remove) 2020-02-04
"patterns", // registerSubCommands(
ImmutableList.of(), // "patterns",
"Patterns determine what blocks are placed", // ImmutableList.of(),
PatternCommandsRegistration.builder(), // "Patterns determine what blocks are placed",
new PatternCommands() // PatternCommandsRegistration.builder(),
); // new PatternCommands()
registerSubCommands( // );
"masks", // registerSubCommands(
ImmutableList.of(), // "masks",
"Masks determine which blocks are placed", // ImmutableList.of(),
MaskCommandsRegistration.builder(), // "Masks determine which blocks are placed",
new MaskCommands(worldEdit) // MaskCommandsRegistration.builder(),
); // new MaskCommands(worldEdit)
registerSubCommands( // );
"transforms", // registerSubCommands(
ImmutableList.of(), // "transforms",
"Transforms modify how a block is placed", // ImmutableList.of(),
TransformCommandsRegistration.builder(), // "Transforms modify how a block is placed",
new TransformCommands() // TransformCommandsRegistration.builder(),
); // new TransformCommands()
// );
registerSubCommands( registerSubCommands(
"schematic", "schematic",
ImmutableList.of("schem", "/schematic", "/schem"), ImmutableList.of("schem", "/schematic", "/schem"),
@ -460,13 +451,14 @@ public final class PlatformCommandManager {
WorldEditCommandsRegistration.builder(), WorldEditCommandsRegistration.builder(),
new WorldEditCommands(worldEdit) new WorldEditCommands(worldEdit)
); );
registerSubCommands( // TODO: Ping @MattBDev to reimplement 2020-02-04
"cfi", // registerSubCommands(
ImmutableList.of("/cfi"), // "cfi",
"CFI commands", // ImmutableList.of("/cfi"),
CFICommandsRegistration.builder(), // "CFI commands",
new CFICommands(worldEdit) // CFICommandsRegistration.builder(),
); // new CFICommands(worldEdit)
// );
registerSubCommands( registerSubCommands(
"/anvil", "/anvil",
ImmutableList.of(), ImmutableList.of(),
@ -608,16 +600,6 @@ public final class PlatformCommandManager {
return CommandArgParser.forArgString(input).parseArgs(); return CommandArgParser.forArgString(input).parseArgs();
} }
public <T> T parseCommand(String args, Actor actor) {
InjectedValueAccess context;
if (actor == null) {
context = globalInjectedValues;
} else {
context = initializeInjectedValues(args::toString, actor, null);
}
return parseCommand(args, context);
}
public <T> T parseConverter(String args, InjectedValueAccess access, Class<T> clazz) { public <T> T parseConverter(String args, InjectedValueAccess access, Class<T> clazz) {
ArgumentConverter<T> converter = commandManager.getConverter(Key.of(clazz)).orElse(null); ArgumentConverter<T> converter = commandManager.getConverter(Key.of(clazz)).orElse(null);
if (converter != null) { if (converter != null) {
@ -630,14 +612,6 @@ public final class PlatformCommandManager {
return null; return null;
} }
public <T> T parseCommand(String args, InjectedValueAccess access) {
if (args.isEmpty()) return null;
String[] split = parseArgs(args)
.map(Substring::getSubstring)
.toArray(String[]::new);
return (T) commandManager.execute(access, ImmutableList.copyOf(split));
}
@Subscribe @Subscribe
public void handleCommand(CommandEvent event) { public void handleCommand(CommandEvent event) {
Request.reset(); Request.reset();
@ -771,19 +745,20 @@ public final class PlatformCommandManager {
worldEdit.flushBlockBag(actor, editSession); worldEdit.flushBlockBag(actor, editSession);
} }
CFICommands.CFISettings cfi = actor.getMeta("CFISettings"); // TODO: Ping @MattBDev to reimplement 2020-02-04
if (cfi != null) { // CFICommands.CFISettings cfi = actor.getMeta("CFISettings");
HeightMapMCAGenerator gen = cfi.getGenerator(); // if (cfi != null) {
if (gen != null && gen.isModified()) { // HeightMapMCAGenerator gen = cfi.getGenerator();
try { // if (gen != null && gen.isModified()) {
gen.update(); // try {
CFIChangeSet set = new CFIChangeSet(gen, actor.getUniqueId()); // gen.update();
session.remember(actor, gen, set, actor.getLimit()); // CFIChangeSet set = new CFIChangeSet(gen, actor.getUniqueId());
} catch (IOException e) { // session.remember(actor, gen, set, actor.getLimit());
e.printStackTrace(); // } catch (IOException e) {
} // e.printStackTrace();
} // }
} // }
// }
Request.reset(); Request.reset();
} }

View File

@ -1,15 +1,7 @@
package com.sk89q.worldedit.extension.platform.binding; package com.sk89q.worldedit.extension.platform.binding;
import com.boydti.fawe.Fawe;
import com.boydti.fawe.object.extent.NullExtent;
import com.boydti.fawe.object.extent.ResettableExtent;
import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.WorldEdit;
import com.sk89q.worldedit.entity.Entity;
import com.sk89q.worldedit.extension.factory.DefaultTransformParser;
import com.sk89q.worldedit.extension.input.InputParseException; import com.sk89q.worldedit.extension.input.InputParseException;
import com.sk89q.worldedit.extension.input.ParserContext;
import com.sk89q.worldedit.extension.platform.Actor;
import com.sk89q.worldedit.extent.Extent;
import com.sk89q.worldedit.internal.expression.EvaluationException; import com.sk89q.worldedit.internal.expression.EvaluationException;
import com.sk89q.worldedit.internal.expression.Expression; import com.sk89q.worldedit.internal.expression.Expression;
import com.sk89q.worldedit.internal.expression.ExpressionException; import com.sk89q.worldedit.internal.expression.ExpressionException;
@ -17,7 +9,6 @@ import com.sk89q.worldedit.math.BlockVector2;
import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.math.Vector2; import com.sk89q.worldedit.math.Vector2;
import com.sk89q.worldedit.math.Vector3; import com.sk89q.worldedit.math.Vector3;
import com.sk89q.worldedit.world.World;
import java.util.Locale; import java.util.Locale;
import javax.annotation.Nullable; import javax.annotation.Nullable;
@ -44,29 +35,31 @@ public class PrimitiveBindings extends Bindings {
} }
} }
/** // TODO: Ping @MattBDev to reimplement 2020-02-04
* Gets an {@link Extent} from a {@link Binding}. //
* // /**
* @param argument the context // * Gets an {@link Extent} from a {@link Binding}.
* @return an extent // *
* @throws InputParseException on other error // * @param argument the context
*/ // * @return an extent
@Binding // * @throws InputParseException on other error
public ResettableExtent getResettableExtent(Actor actor, String argument) throws InputParseException { // */
if (argument.equalsIgnoreCase("#null")) { // @Binding
return new NullExtent(); // public ResettableExtent getResettableExtent(Actor actor, String argument) throws InputParseException {
} // if (argument.equalsIgnoreCase("#null")) {
DefaultTransformParser parser = Fawe.get().getTransformParser(); // return new NullExtent();
ParserContext parserContext = new ParserContext(); // }
if (actor instanceof Entity) { // DefaultTransformParser parser = Fawe.get().getTransformParser();
Extent extent = ((Entity) actor).getExtent(); // ParserContext parserContext = new ParserContext();
if (extent instanceof World) { // if (actor instanceof Entity) {
parserContext.setWorld((World) extent); // Extent extent = ((Entity) actor).getExtent();
} // if (extent instanceof World) {
} // parserContext.setWorld((World) extent);
parserContext.setSession(WorldEdit.getInstance().getSessionManager().get(actor)); // }
return parser.parseFromInput(argument, parserContext); // }
} // parserContext.setSession(WorldEdit.getInstance().getSessionManager().get(actor));
// return parser.parseFromInput(argument, parserContext);
// }
/** /**
* Gets a type from a {@link Binding}. * Gets a type from a {@link Binding}.

View File

@ -1,6 +1,5 @@
package com.sk89q.worldedit.extension.platform.binding; package com.sk89q.worldedit.extension.platform.binding;
import com.boydti.fawe.command.CFICommands;
import com.boydti.fawe.config.Caption; import com.boydti.fawe.config.Caption;
import com.boydti.fawe.database.DBHandler; import com.boydti.fawe.database.DBHandler;
import com.boydti.fawe.database.RollbackDatabase; import com.boydti.fawe.database.RollbackDatabase;

View File

@ -19,7 +19,6 @@
package com.sk89q.worldedit.internal.command; package com.sk89q.worldedit.internal.command;
import static com.google.common.base.Preconditions.checkNotNull;
import com.sk89q.worldedit.IncompleteRegionException; import com.sk89q.worldedit.IncompleteRegionException;
import com.sk89q.worldedit.LocalSession; import com.sk89q.worldedit.LocalSession;
import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.WorldEdit;
@ -40,6 +39,8 @@ import java.util.logging.Logger;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.Stream; import java.util.stream.Stream;
import static com.google.common.base.Preconditions.checkNotNull;
/** /**
* Logs called commands to a logger. * Logs called commands to a logger.
*/ */

View File

@ -31,7 +31,6 @@ public class CommandRegistrationHandler {
private static final CommandPermissionsConditionGenerator PERM_GEN = new CommandPermissionsConditionGenerator(); private static final CommandPermissionsConditionGenerator PERM_GEN = new CommandPermissionsConditionGenerator();
private final List<CommandCallListener> callListeners; private final List<CommandCallListener> callListeners;
public CommandRegistrationHandler(List<CommandCallListener> callListeners) { public CommandRegistrationHandler(List<CommandCallListener> callListeners) {

View File

@ -54,13 +54,13 @@ public class CommandUtil {
private static Component makeDeprecatedFooter(String reason, Component newCommand) { private static Component makeDeprecatedFooter(String reason, Component newCommand) {
return TextComponent.builder() return TextComponent.builder()
.append(DEPRECATION_MARKER) .append(DEPRECATION_MARKER)
.append(" " + reason + ".") .append(" " + reason + ".")
.append(TextComponent.newline()) .append(TextComponent.newline())
.append(TextComponent.of("Use ", TextColor.GOLD, TextDecoration.ITALIC)) .append(TextComponent.of("Use ", TextColor.GOLD, TextDecoration.ITALIC))
.append(newCommand) .append(newCommand)
.append(TextComponent.of(" instead.", TextColor.GOLD, TextDecoration.ITALIC)) .append(TextComponent.of(" instead.", TextColor.GOLD, TextDecoration.ITALIC))
.build(); .build();
} }
public interface NewCommandGenerator { public interface NewCommandGenerator {
@ -72,45 +72,45 @@ public class CommandUtil {
public static Command deprecate(Command command, String reason, public static Command deprecate(Command command, String reason,
NewCommandGenerator newCommandGenerator) { NewCommandGenerator newCommandGenerator) {
Component deprecatedWarning = makeDeprecatedFooter( Component deprecatedWarning = makeDeprecatedFooter(
reason, reason,
newCommandSuggestion(newCommandGenerator, newCommandSuggestion(newCommandGenerator,
NoInputCommandParameters.builder().build(), NoInputCommandParameters.builder().build(),
command) command)
); );
return command.toBuilder() return command.toBuilder()
.action(parameters -> .action(parameters ->
deprecatedCommandWarning(parameters, command, reason, newCommandGenerator)) deprecatedCommandWarning(parameters, command, reason, newCommandGenerator))
.footer(command.getFooter() .footer(command.getFooter()
.map(existingFooter -> existingFooter .map(existingFooter -> existingFooter
.append(TextComponent.newline()).append(deprecatedWarning)) .append(TextComponent.newline()).append(deprecatedWarning))
.orElse(deprecatedWarning)) .orElse(deprecatedWarning))
.build(); .build();
} }
public static Optional<Component> footerWithoutDeprecation(Command command) { public static Optional<Component> footerWithoutDeprecation(Command command) {
return command.getFooter() return command.getFooter()
.filter(footer -> anyComponent(footer, Predicate.isEqual(DEPRECATION_MARKER))) .filter(footer -> anyComponent(footer, Predicate.isEqual(DEPRECATION_MARKER)))
.map(footer -> Optional.of( .map(footer -> Optional.of(
replaceDeprecation(footer) replaceDeprecation(footer)
)) ))
.orElseGet(command::getFooter); .orElseGet(command::getFooter);
} }
public static Optional<Component> deprecationWarning(Command command) { public static Optional<Component> deprecationWarning(Command command) {
return command.getFooter() return command.getFooter()
.map(CommandUtil::extractDeprecation) .map(CommandUtil::extractDeprecation)
.orElseGet(command::getFooter); .orElseGet(command::getFooter);
} }
public static boolean isDeprecated(Command command) { public static boolean isDeprecated(Command command) {
return command.getFooter() return command.getFooter()
.filter(footer -> anyComponent(footer, Predicate.isEqual(DEPRECATION_MARKER))) .filter(footer -> anyComponent(footer, Predicate.isEqual(DEPRECATION_MARKER)))
.isPresent(); .isPresent();
} }
private static boolean anyComponent(Component component, Predicate<Component> test) { private static boolean anyComponent(Component component, Predicate<Component> test) {
return test.test(component) || component.children().stream() return test.test(component) || component.children().stream()
.anyMatch(x -> anyComponent(x, test)); .anyMatch(x -> anyComponent(x, test));
} }
private static Component replaceDeprecation(Component component) { private static Component replaceDeprecation(Component component) {
@ -118,9 +118,9 @@ public class CommandUtil {
return TextComponent.empty(); return TextComponent.empty();
} }
return component.children( return component.children(
component.children().stream() component.children().stream()
.map(CommandUtil::replaceDeprecation) .map(CommandUtil::replaceDeprecation)
.collect(toList()) .collect(toList())
); );
} }
@ -129,26 +129,26 @@ public class CommandUtil {
return Optional.of(component); return Optional.of(component);
} }
return component.children().stream() return component.children().stream()
.map(CommandUtil::extractDeprecation) .map(CommandUtil::extractDeprecation)
.filter(Optional::isPresent) .filter(Optional::isPresent)
.map(Optional::get) .map(Optional::get)
.findAny(); .findAny();
} }
private static Object deprecatedCommandWarning( private static int deprecatedCommandWarning(
CommandParameters parameters, CommandParameters parameters,
Command command, Command command,
String reason, String reason,
NewCommandGenerator generator NewCommandGenerator generator
) throws Exception { ) throws Exception {
parameters.injectedValue(Key.of(Actor.class)) parameters.injectedValue(Key.of(Actor.class))
.ifPresent(actor -> { .ifPresent(actor -> {
Component suggestion = newCommandSuggestion(generator, parameters, command); Component suggestion = newCommandSuggestion(generator, parameters, command);
actor.print(TextComponent.of(reason + ". Please use ", TextColor.GOLD) actor.print(TextComponent.of(reason + ". Please use ", TextColor.GOLD)
.append(suggestion) .append(suggestion)
.append(TextComponent.of(" instead.")) .append(TextComponent.of(" instead."))
); );
}); });
return command.getAction().run(parameters); return command.getAction().run(parameters);
} }
@ -157,15 +157,15 @@ public class CommandUtil {
Command command) { Command command) {
String suggestedCommand = generator.newCommand(command, parameters); String suggestedCommand = generator.newCommand(command, parameters);
return TextComponent.of(suggestedCommand) return TextComponent.of(suggestedCommand)
.decoration(TextDecoration.UNDERLINED, true) .decoration(TextDecoration.UNDERLINED, true)
.clickEvent(ClickEvent.suggestCommand(suggestedCommand)); .clickEvent(ClickEvent.suggestCommand(suggestedCommand));
} }
public static Map<String, Command> getSubCommands(Command currentCommand) { public static Map<String, Command> getSubCommands(Command currentCommand) {
return currentCommand.getParts().stream() return currentCommand.getParts().stream()
.filter(p -> p instanceof SubCommandPart) .filter(p -> p instanceof SubCommandPart)
.flatMap(p -> ((SubCommandPart) p).getCommands().stream()) .flatMap(p -> ((SubCommandPart) p).getCommands().stream())
.collect(Collectors.toMap(Command::getName, Function.identity())); .collect(Collectors.toMap(Command::getName, Function.identity()));
} }
private static String clean(String input) { private static String clean(String input) {
@ -173,7 +173,7 @@ public class CommandUtil {
} }
private static final Comparator<Command> BY_CLEAN_NAME = private static final Comparator<Command> BY_CLEAN_NAME =
Comparator.comparing(c -> clean(c.getName())); Comparator.comparing(c -> clean(c.getName()));
public static Comparator<Command> byCleanName() { public static Comparator<Command> byCleanName() {
return BY_CLEAN_NAME; return BY_CLEAN_NAME;
@ -184,15 +184,15 @@ public class CommandUtil {
*/ */
public static List<String> fixSuggestions(String arguments, List<Substring> suggestions) { public static List<String> fixSuggestions(String arguments, List<Substring> suggestions) {
Substring lastArg = Iterables.getLast( Substring lastArg = Iterables.getLast(
CommandArgParser.spaceSplit(arguments) CommandArgParser.spaceSplit(arguments)
); );
return suggestions.stream() return suggestions.stream()
// Re-map suggestions to only operate on the last non-quoted word // Re-map suggestions to only operate on the last non-quoted word
.map(suggestion -> onlyOnLastQuotedWord(lastArg, suggestion)) .map(suggestion -> onlyOnLastQuotedWord(lastArg, suggestion))
.map(suggestion -> suggestLast(lastArg, suggestion)) .map(suggestion -> suggestLast(lastArg, suggestion))
.filter(Optional::isPresent) .filter(Optional::isPresent)
.map(Optional::get) .map(Optional::get)
.collect(toList()); .collect(toList());
} }
private static Substring onlyOnLastQuotedWord(Substring lastArg, Substring suggestion) { private static Substring onlyOnLastQuotedWord(Substring lastArg, Substring suggestion) {
@ -228,7 +228,7 @@ public class CommandUtil {
return Optional.empty(); return Optional.empty();
} }
checkState(end <= builder.length(), checkState(end <= builder.length(),
"Suggestion ends too late, last=%s, suggestion=", last, suggestion); "Suggestion ends too late, last=%s, suggestion=", last, suggestion);
builder.replace(start, end, suggestion.getSubstring()); builder.replace(start, end, suggestion.getSubstring());
return Optional.of(builder.toString()); return Optional.of(builder.toString());
} }
@ -259,7 +259,7 @@ public class CommandUtil {
public static <T> T requireIV(Key<T> type, String name, InjectedValueAccess injectedValueAccess) { public static <T> T requireIV(Key<T> type, String name, InjectedValueAccess injectedValueAccess) {
return injectedValueAccess.injectedValue(type).orElseThrow(() -> return injectedValueAccess.injectedValue(type).orElseThrow(() ->
new IllegalStateException("No injected value for " + name + " (type " + type + ")") new IllegalStateException("No injected value for " + name + " (type " + type + ")")
); );
} }

View File

@ -22,6 +22,7 @@ package com.sk89q.worldedit.internal.command;
import com.sk89q.worldedit.command.util.annotation.Confirm; import com.sk89q.worldedit.command.util.annotation.Confirm;
import com.sk89q.worldedit.extension.platform.Actor; import com.sk89q.worldedit.extension.platform.Actor;
import com.sk89q.worldedit.util.formatting.text.TextComponent; import com.sk89q.worldedit.util.formatting.text.TextComponent;
import java.util.Optional;
import org.enginehub.piston.CommandParameters; import org.enginehub.piston.CommandParameters;
import org.enginehub.piston.exception.StopExecutionException; import org.enginehub.piston.exception.StopExecutionException;
import org.enginehub.piston.gen.CommandCallListener; import org.enginehub.piston.gen.CommandCallListener;
@ -39,7 +40,12 @@ public class ConfirmHandler implements CommandCallListener {
if (confirmAnnotation == null) { if (confirmAnnotation == null) {
return; return;
} }
Actor actor = parameters.injectedValue(Key.of(Actor.class)).get(); Optional<Actor> actorOpt = parameters.injectedValue(Key.of(Actor.class));
if (!actorOpt.isPresent()) {
return;
}
Actor actor = actorOpt.get();
if (!confirmAnnotation.value().passes(actor, parameters, 1)) { if (!confirmAnnotation.value().passes(actor, parameters, 1)) {
throw new StopExecutionException(TextComponent.empty()); throw new StopExecutionException(TextComponent.empty());
} }

View File

@ -40,11 +40,12 @@ import com.sk89q.worldedit.util.formatting.text.TextComponent;
import com.sk89q.worldedit.util.io.file.FileSelectionAbortedException; import com.sk89q.worldedit.util.io.file.FileSelectionAbortedException;
import com.sk89q.worldedit.util.io.file.FilenameResolutionException; import com.sk89q.worldedit.util.io.file.FilenameResolutionException;
import com.sk89q.worldedit.util.io.file.InvalidFilenameException; import com.sk89q.worldedit.util.io.file.InvalidFilenameException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.enginehub.piston.exception.CommandException; import org.enginehub.piston.exception.CommandException;
import org.enginehub.piston.exception.UsageException; import org.enginehub.piston.exception.UsageException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkNotNull;
/** /**

View File

@ -1,9 +1,6 @@
applyLibrariesConfiguration() applyLibrariesConfiguration()
dependencies { dependencies {
"shade"("FAWE-Piston:core/build/libs/core-${Versions.PISTON}:lastSuccessfulBuild@jar")
"shade"("FAWE-Piston:core-ap/annotations/build/libs/annotations-${Versions.PISTON}:lastSuccessfulBuild@jar")
"shade"("FAWE-Piston:core-ap/processor/build/libs/processor-${Versions.PISTON}:lastSuccessfulBuild@jar")
"shade"("org.enginehub.piston.core-ap:annotations:${Versions.PISTON}") "shade"("org.enginehub.piston.core-ap:annotations:${Versions.PISTON}")
"shade"("org.enginehub.piston.core-ap:processor:${Versions.PISTON}") "shade"("org.enginehub.piston.core-ap:processor:${Versions.PISTON}")
} }

View File

@ -8,10 +8,10 @@ dependencies {
"shade"("com.sk89q:jchronic:0.2.4a") { "shade"("com.sk89q:jchronic:0.2.4a") {
exclude(group = "junit", module = "junit") exclude(group = "junit", module = "junit")
} }
"shade"("com.thoughtworks.paranamer:paranamer:2.6")
"shade"("com.github.luben:zstd-jni:1.4.3-1") "shade"("com.github.luben:zstd-jni:1.4.3-1")
"shade"("com.sk89q.lib:jlibnoise:1.0.0") "shade"("com.sk89q.lib:jlibnoise:1.0.0")
"shade"("FAWE-Piston:core/build/libs/core-${Versions.PISTON}:lastSuccessfulBuild@jar") "shade"("org.enginehub.piston:core:${Versions.PISTON}")
"shade"("FAWE-Piston:core-ap/runtime/build/libs/runtime-${Versions.PISTON}:lastSuccessfulBuild@jar") "shade"("org.enginehub.piston.core-ap:runtime:${Versions.PISTON}")
"shade"("FAWE-Piston:default-impl/build/libs/default-impl-${Versions.PISTON}:lastSuccessfulBuild@jar") "shade"("org.enginehub.piston:default-impl:${Versions.PISTON}")
} }