Skip to content

Commit

Permalink
Port generation commands
Browse files Browse the repository at this point in the history
  • Loading branch information
octylFractal committed Apr 23, 2019
1 parent 51be16a commit 31486cd
Show file tree
Hide file tree
Showing 7 changed files with 321 additions and 174 deletions.

Large diffs are not rendered by default.

@@ -0,0 +1,68 @@
package com.sk89q.worldedit.command.argument;

import com.google.common.base.Splitter;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables;
import org.enginehub.piston.converter.ArgumentConverter;
import org.enginehub.piston.converter.ConversionResult;
import org.enginehub.piston.converter.SuccessfulConversion;
import org.enginehub.piston.inject.InjectedValueAccess;

import java.util.List;

import static com.google.common.base.Preconditions.checkArgument;

public class CommaSeparatedValuesConverter<T> implements ArgumentConverter<T> {

public static <T> CommaSeparatedValuesConverter<T> wrap(ArgumentConverter<T> delegate) {
return wrapAndLimit(delegate, -1);
}

public static <T> CommaSeparatedValuesConverter<T> wrapAndLimit(ArgumentConverter<T> delegate, int maximum) {
return new CommaSeparatedValuesConverter<>(delegate, maximum);
}

private static final Splitter COMMA = Splitter.on(',');

private final ArgumentConverter<T> delegate;
private final int maximum;

private CommaSeparatedValuesConverter(ArgumentConverter<T> delegate, int maximum) {
checkArgument(maximum == -1 || maximum > 1,
"Maximum must be bigger than 1, or exactly -1");
this.delegate = delegate;
this.maximum = maximum;
}

@Override
public String describeAcceptableArguments() {
StringBuilder result = new StringBuilder();
if (maximum > -1) {
result.append("up to ").append(maximum).append(' ');
}
result.append("comma separated values of ")
.append(delegate.describeAcceptableArguments());
result.setCharAt(0, Character.toUpperCase(result.charAt(0)));
return result.toString();
}

@Override
public List<String> getSuggestions(String input) {
String lastInput = Iterables.getLast(COMMA.split(input));
return delegate.getSuggestions(lastInput);
}

@Override
public ConversionResult<T> convert(String argument, InjectedValueAccess context) {
ImmutableList.Builder<T> result = ImmutableList.builder();
for (String input : COMMA.split(argument)) {
ConversionResult<T> temp = delegate.convert(input, context);
if (!temp.isSuccessful()) {
return temp;
}
result.addAll(temp.get());
}
return SuccessfulConversion.from(result.build());
}

}
Expand Up @@ -19,8 +19,6 @@

package com.sk89q.worldedit.command.argument;

import com.sk89q.minecraft.util.commands.CommandException;
import com.sk89q.minecraft.util.commands.CommandLocals;
import com.sk89q.worldedit.LocalSession;
import com.sk89q.worldedit.WorldEdit;
import com.sk89q.worldedit.entity.Entity;
Expand All @@ -29,23 +27,30 @@
import com.sk89q.worldedit.extension.platform.Actor;
import com.sk89q.worldedit.extent.Extent;
import com.sk89q.worldedit.function.pattern.Pattern;
import com.sk89q.worldedit.util.command.argument.CommandArgs;
import com.sk89q.worldedit.util.command.composition.SimpleCommand;
import com.sk89q.worldedit.world.World;
import org.enginehub.piston.CommandManager;
import org.enginehub.piston.converter.ArgumentConverter;
import org.enginehub.piston.converter.ConversionResult;
import org.enginehub.piston.converter.SuccessfulConversion;
import org.enginehub.piston.inject.InjectedValueAccess;
import org.enginehub.piston.inject.Key;

public class PatternParser extends SimpleCommand<Pattern> {
public class PatternConverter implements ArgumentConverter<Pattern> {

private final StringParser stringParser;
public static void register(WorldEdit worldEdit, CommandManager commandManager) {
commandManager.registerConverter(Key.of(Pattern.class), new PatternConverter(worldEdit));
}

private final WorldEdit worldEdit;

public PatternParser(String name) {
stringParser = addParameter(new StringParser(name, "The pattern"));
private PatternConverter(WorldEdit worldEdit) {
this.worldEdit = worldEdit;
}

@Override
public Pattern call(CommandArgs args, CommandLocals locals) throws CommandException {
String patternString = stringParser.call(args, locals);

Actor actor = locals.get(Actor.class);
public ConversionResult<Pattern> convert(String argument, InjectedValueAccess context) {
Actor actor = context.injectedValue(Key.of(Actor.class))
.orElseThrow(() -> new IllegalStateException("No actor"));
LocalSession session = WorldEdit.getInstance().getSessionManager().get(actor);

ParserContext parserContext = new ParserContext();
Expand All @@ -59,20 +64,16 @@ public Pattern call(CommandArgs args, CommandLocals locals) throws CommandExcept
parserContext.setSession(session);

try {
return WorldEdit.getInstance().getPatternFactory().parseFromInput(patternString, parserContext);
return SuccessfulConversion.fromSingle(
worldEdit.getPatternFactory().parseFromInput(argument, parserContext)
);
} catch (InputParseException e) {
throw new CommandException(e.getMessage(), e);
throw new IllegalArgumentException(e);
}
}

@Override
public String getDescription() {
return "Choose a pattern";
public String describeAcceptableArguments() {
return "any pattern";
}

@Override
public boolean testPermission0(CommandLocals locals) {
return true;
}

}
Expand Up @@ -35,12 +35,14 @@

public class ReplaceParser extends SimpleCommand<Contextual<? extends RegionFunction>> {

private final PatternParser fillArg = addParameter(new PatternParser("fillPattern"));
// TODO rewrite for new system
// private final PatternParser fillArg = addParameter(new PatternParser("fillPattern"));

@Override
public Contextual<RegionFunction> call(CommandArgs args, CommandLocals locals) throws CommandException {
Pattern fill = fillArg.call(args, locals);
return new ReplaceFactory(fill);
// Pattern fill = fillArg.call(args, locals);
// return new ReplaceFactory(fill);
return null;
}

@Override
Expand Down
@@ -0,0 +1,16 @@
package com.sk89q.worldedit.extension.platform;

import com.google.auto.value.AutoAnnotation;
import com.sk89q.worldedit.internal.annotation.Radii;

/**
* Holder for generated annotation classes.
*/
class Annotations {

@AutoAnnotation
static Radii radii(int value) {
return new AutoAnnotation_Annotations_radii(value);
}

}
Expand Up @@ -20,6 +20,7 @@
package com.sk89q.worldedit.extension.platform;

import com.google.common.collect.ImmutableList;
import com.google.common.reflect.TypeToken;
import com.sk89q.worldedit.EditSession;
import com.sk89q.worldedit.IncompleteRegionException;
import com.sk89q.worldedit.LocalConfiguration;
Expand All @@ -35,11 +36,15 @@
import com.sk89q.worldedit.command.ClipboardCommandsRegistration;
import com.sk89q.worldedit.command.GeneralCommands;
import com.sk89q.worldedit.command.GeneralCommandsRegistration;
import com.sk89q.worldedit.command.GenerationCommands;
import com.sk89q.worldedit.command.GenerationCommandsRegistration;
import com.sk89q.worldedit.command.SchematicCommands;
import com.sk89q.worldedit.command.SchematicCommandsRegistration;
import com.sk89q.worldedit.command.argument.Arguments;
import com.sk89q.worldedit.command.argument.CommaSeparatedValuesConverter;
import com.sk89q.worldedit.command.argument.DirectionConverter;
import com.sk89q.worldedit.command.argument.MaskConverter;
import com.sk89q.worldedit.command.argument.PatternConverter;
import com.sk89q.worldedit.command.util.CommandPermissionsConditionGenerator;
import com.sk89q.worldedit.command.util.PermissionCondition;
import com.sk89q.worldedit.entity.Entity;
Expand All @@ -65,6 +70,7 @@
import org.enginehub.piston.Command;
import org.enginehub.piston.CommandManager;
import org.enginehub.piston.DefaultCommandManagerService;
import org.enginehub.piston.converter.ArgumentConverters;
import org.enginehub.piston.exception.CommandException;
import org.enginehub.piston.exception.CommandExecutionException;
import org.enginehub.piston.exception.ConditionFailedException;
Expand Down Expand Up @@ -171,6 +177,14 @@ private void initialize() {
private void registerArgumentConverters() {
DirectionConverter.register(worldEdit, commandManager);
MaskConverter.register(worldEdit, commandManager);
PatternConverter.register(worldEdit, commandManager);
for (int count = 2; count <= 3; count++) {
commandManager.registerConverter(Key.of(double.class, Annotations.radii(count)),
CommaSeparatedValuesConverter.wrapAndLimit(ArgumentConverters.get(
TypeToken.of(double.class)
), count)
);
}
}

private void registerAlwaysInjectedValues() {
Expand Down Expand Up @@ -258,13 +272,17 @@ private void registerAllCommands() {
GeneralCommandsRegistration.builder(),
new GeneralCommands(worldEdit)
);
register(
commandManager,
GenerationCommandsRegistration.builder(),
new GenerationCommands(worldEdit)
);

// Unported commands are below. Delete once they're added to the main manager above.
/*
dispatcher = new CommandGraph()
.builder(builder)
.commands()
.registerMethods(new GenerationCommands(worldEdit))
.registerMethods(new HistoryCommands(worldEdit))
.registerMethods(new NavigationCommands(worldEdit))
.registerMethods(new RegionCommands(worldEdit))
Expand Down
@@ -0,0 +1,40 @@
/*
* 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.internal.annotation;

import org.enginehub.piston.inject.InjectAnnotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
* Annotates a {@code double} parameter to inject multiple radii values.
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.PARAMETER)
@InjectAnnotation
public @interface Radii {
/**
* Number of radii values to inject at maximum. May inject less.
*/
int value();
}

0 comments on commit 31486cd

Please sign in to comment.