mirror of
https://github.com/plexusorg/Plex-FAWE.git
synced 2025-07-04 03:56:41 +00:00
Expanded the scope of item brushes (/br apply item, /br paint item).
They now additionally take a direction in which the simulated item usage should be facing. Also allow the item parser to parse "hand" and "offhand" as items, to allow platforms with NBT item support return items with NBT (since parsing is a slightly more complex task).
This commit is contained in:
@ -0,0 +1,119 @@
|
||||
/*
|
||||
* 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.argument;
|
||||
|
||||
import com.google.auto.value.AutoAnnotation;
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import com.google.common.collect.ImmutableSet;
|
||||
import com.sk89q.worldedit.UnknownDirectionException;
|
||||
import com.sk89q.worldedit.WorldEdit;
|
||||
import com.sk89q.worldedit.entity.Player;
|
||||
import com.sk89q.worldedit.internal.annotation.Direction;
|
||||
import com.sk89q.worldedit.internal.annotation.MultiDirection;
|
||||
import com.sk89q.worldedit.util.formatting.text.Component;
|
||||
import com.sk89q.worldedit.util.formatting.text.TextComponent;
|
||||
import org.enginehub.piston.CommandManager;
|
||||
import org.enginehub.piston.converter.ArgumentConverter;
|
||||
import org.enginehub.piston.converter.ConversionResult;
|
||||
import org.enginehub.piston.converter.FailedConversion;
|
||||
import org.enginehub.piston.converter.SuccessfulConversion;
|
||||
import org.enginehub.piston.inject.InjectedValueAccess;
|
||||
import org.enginehub.piston.inject.Key;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
import java.util.List;
|
||||
|
||||
import static org.enginehub.piston.converter.SuggestionHelper.limitByPrefix;
|
||||
|
||||
public abstract class AbstractDirectionConverter<D> implements ArgumentConverter<D> {
|
||||
|
||||
@AutoAnnotation
|
||||
private static Direction direction(boolean includeDiagonals) {
|
||||
return new AutoAnnotation_AbstractDirectionConverter_direction(includeDiagonals);
|
||||
}
|
||||
|
||||
@AutoAnnotation
|
||||
private static MultiDirection multiDirection(boolean includeDiagonals) {
|
||||
return new AutoAnnotation_AbstractDirectionConverter_multiDirection(includeDiagonals);
|
||||
}
|
||||
|
||||
protected static <D> void register(CommandManager commandManager, AbstractDirectionConverter<D> converter,
|
||||
Class<D> keyClass, boolean includeDiagonals) {
|
||||
commandManager.registerConverter(
|
||||
Key.of(keyClass, direction(includeDiagonals)),
|
||||
converter
|
||||
);
|
||||
commandManager.registerConverter(
|
||||
Key.of(keyClass, multiDirection(includeDiagonals)),
|
||||
CommaSeparatedValuesConverter.wrap(converter)
|
||||
);
|
||||
}
|
||||
|
||||
private static final ImmutableSet<String> ORTHOGONAL = ImmutableSet.of(
|
||||
"north", "south", "east", "west", "up", "down"
|
||||
);
|
||||
private static final ImmutableSet<String> RELATIVE = ImmutableSet.of(
|
||||
"me", "forward", "back", "left", "right"
|
||||
);
|
||||
private static final ImmutableSet<String> DIAGONAL = ImmutableSet.of(
|
||||
"northeast", "northwest", "southeast", "southwest"
|
||||
);
|
||||
|
||||
private final WorldEdit worldEdit;
|
||||
private final boolean includeDiagonals;
|
||||
private final ImmutableList<String> suggestions;
|
||||
|
||||
protected AbstractDirectionConverter(WorldEdit worldEdit, boolean includeDiagonals) {
|
||||
this.worldEdit = worldEdit;
|
||||
this.includeDiagonals = includeDiagonals;
|
||||
suggestions = ImmutableList.<String>builder()
|
||||
.addAll(ORTHOGONAL)
|
||||
.addAll(RELATIVE)
|
||||
.addAll(includeDiagonals ? DIAGONAL : ImmutableList.of())
|
||||
.build();
|
||||
}
|
||||
|
||||
@Override
|
||||
public ConversionResult<D> convert(String argument, InjectedValueAccess context) {
|
||||
Player player = context.injectedValue(Key.of(Player.class)).orElse(null);
|
||||
try {
|
||||
return SuccessfulConversion.fromSingle(convertDirection(argument, player, includeDiagonals));
|
||||
} catch (Exception e) {
|
||||
return FailedConversion.from(e);
|
||||
}
|
||||
}
|
||||
|
||||
protected abstract D convertDirection(String argument, @Nullable Player player, boolean includeDiagonals) throws UnknownDirectionException;
|
||||
|
||||
@Override
|
||||
public Component describeAcceptableArguments() {
|
||||
return TextComponent.of("`me` to use facing direction, or any "
|
||||
+ (includeDiagonals ? "direction" : "non-diagonal direction"));
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> getSuggestions(String input) {
|
||||
return limitByPrefix(suggestions.stream(), input);
|
||||
}
|
||||
|
||||
protected WorldEdit getWorldEdit() {
|
||||
return worldEdit;
|
||||
}
|
||||
}
|
@ -19,101 +19,37 @@
|
||||
|
||||
package com.sk89q.worldedit.command.argument;
|
||||
|
||||
import com.google.auto.value.AutoAnnotation;
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import com.google.common.collect.ImmutableSet;
|
||||
import com.sk89q.worldedit.UnknownDirectionException;
|
||||
import com.sk89q.worldedit.WorldEdit;
|
||||
import com.sk89q.worldedit.entity.Player;
|
||||
import com.sk89q.worldedit.internal.annotation.Direction;
|
||||
import com.sk89q.worldedit.internal.annotation.MultiDirection;
|
||||
import com.sk89q.worldedit.extension.platform.Actor;
|
||||
import com.sk89q.worldedit.math.BlockVector3;
|
||||
import com.sk89q.worldedit.util.formatting.text.Component;
|
||||
import com.sk89q.worldedit.util.formatting.text.TextComponent;
|
||||
import com.sk89q.worldedit.util.Direction;
|
||||
import org.enginehub.piston.CommandManager;
|
||||
import org.enginehub.piston.converter.ArgumentConverter;
|
||||
import org.enginehub.piston.converter.ConversionResult;
|
||||
import org.enginehub.piston.converter.FailedConversion;
|
||||
import org.enginehub.piston.converter.SuccessfulConversion;
|
||||
import org.enginehub.piston.inject.InjectedValueAccess;
|
||||
import org.enginehub.piston.inject.Key;
|
||||
|
||||
import java.util.List;
|
||||
import javax.annotation.Nullable;
|
||||
import java.util.Optional;
|
||||
|
||||
import static java.util.stream.Collectors.toList;
|
||||
import static org.enginehub.piston.converter.SuggestionHelper.limitByPrefix;
|
||||
public final class DirectionConverter extends AbstractDirectionConverter<Direction> {
|
||||
|
||||
public class DirectionConverter implements ArgumentConverter<BlockVector3> {
|
||||
|
||||
@AutoAnnotation
|
||||
private static Direction direction(boolean includeDiagonals) {
|
||||
return new AutoAnnotation_DirectionConverter_direction(includeDiagonals);
|
||||
}
|
||||
|
||||
@AutoAnnotation
|
||||
private static MultiDirection multiDirection(boolean includeDiagonals) {
|
||||
return new AutoAnnotation_DirectionConverter_multiDirection(includeDiagonals);
|
||||
private DirectionConverter(WorldEdit worldEdit, boolean includeDiagonals) {
|
||||
super(worldEdit, includeDiagonals);
|
||||
}
|
||||
|
||||
public static void register(WorldEdit worldEdit, CommandManager commandManager) {
|
||||
for (boolean includeDiagonals : new boolean[] { false, true }) {
|
||||
DirectionConverter directionConverter = new DirectionConverter(worldEdit, includeDiagonals);
|
||||
commandManager.registerConverter(
|
||||
Key.of(BlockVector3.class, direction(includeDiagonals)),
|
||||
directionConverter
|
||||
);
|
||||
commandManager.registerConverter(
|
||||
Key.of(BlockVector3.class, multiDirection(includeDiagonals)),
|
||||
CommaSeparatedValuesConverter.wrap(directionConverter)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
private static final ImmutableSet<String> NON_DIAGONALS = ImmutableSet.of(
|
||||
"north", "south", "east", "west", "up", "down"
|
||||
);
|
||||
private static final ImmutableSet<String> RELATIVE = ImmutableSet.of(
|
||||
"me", "forward", "back", "left", "right"
|
||||
);
|
||||
private static final ImmutableSet<String> DIAGONALS = ImmutableSet.of(
|
||||
"northeast", "northwest", "southeast", "southwest"
|
||||
);
|
||||
|
||||
private final WorldEdit worldEdit;
|
||||
private final boolean includeDiagonals;
|
||||
private final ImmutableList<String> suggestions;
|
||||
|
||||
private DirectionConverter(WorldEdit worldEdit, boolean includeDiagonals) {
|
||||
this.worldEdit = worldEdit;
|
||||
this.includeDiagonals = includeDiagonals;
|
||||
suggestions = ImmutableList.<String>builder()
|
||||
.addAll(NON_DIAGONALS)
|
||||
.addAll(RELATIVE)
|
||||
.addAll(includeDiagonals ? DIAGONALS : ImmutableList.of())
|
||||
.build();
|
||||
}
|
||||
|
||||
@Override
|
||||
public ConversionResult<BlockVector3> convert(String argument, InjectedValueAccess context) {
|
||||
Player player = context.injectedValue(Key.of(Player.class))
|
||||
.orElseThrow(() -> new IllegalStateException("No player available"));
|
||||
try {
|
||||
return SuccessfulConversion.fromSingle(includeDiagonals
|
||||
? worldEdit.getDiagonalDirection(player, argument)
|
||||
: worldEdit.getDirection(player, argument));
|
||||
} catch (Exception e) {
|
||||
return FailedConversion.from(e);
|
||||
register(commandManager, directionConverter, Direction.class, includeDiagonals);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Component describeAcceptableArguments() {
|
||||
return TextComponent.of("`me` to use facing direction, or any "
|
||||
+ (includeDiagonals ? "direction" : "non-diagonal direction"));
|
||||
protected Direction convertDirection(String argument, @Nullable Player player, boolean includeDiagonals) throws UnknownDirectionException {
|
||||
final BlockVector3 vec = includeDiagonals
|
||||
? getWorldEdit().getDiagonalDirection(player, argument)
|
||||
: getWorldEdit().getDirection(player, argument);
|
||||
return Optional.ofNullable(Direction.findClosest(vec.toVector3(), Direction.Flag.ALL))
|
||||
.orElseThrow(() -> new UnknownDirectionException(argument));
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> getSuggestions(String input) {
|
||||
return limitByPrefix(suggestions.stream(), input);
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,49 @@
|
||||
/*
|
||||
* 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.argument;
|
||||
|
||||
import com.sk89q.worldedit.UnknownDirectionException;
|
||||
import com.sk89q.worldedit.WorldEdit;
|
||||
import com.sk89q.worldedit.entity.Player;
|
||||
import com.sk89q.worldedit.math.BlockVector3;
|
||||
import org.enginehub.piston.CommandManager;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
public final class DirectionVectorConverter extends AbstractDirectionConverter<BlockVector3> {
|
||||
|
||||
private DirectionVectorConverter(WorldEdit worldEdit, boolean includeDiagonals) {
|
||||
super(worldEdit, includeDiagonals);
|
||||
}
|
||||
|
||||
public static void register(WorldEdit worldEdit, CommandManager commandManager) {
|
||||
for (boolean includeDiagonals : new boolean[] { false, true }) {
|
||||
DirectionVectorConverter directionConverter = new DirectionVectorConverter(worldEdit, includeDiagonals);
|
||||
register(commandManager, directionConverter, BlockVector3.class, includeDiagonals);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected BlockVector3 convertDirection(String argument, @Nullable Player player, boolean includeDiagonals) throws UnknownDirectionException {
|
||||
return includeDiagonals
|
||||
? getWorldEdit().getDiagonalDirection(player, argument)
|
||||
: getWorldEdit().getDirection(player, argument);
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user