use of org.spongepowered.api.command.args.PatternMatchingCommandElement in project LanternServer by LanternPowered.
the class CommandParticle method completeSpec.
@Override
public void completeSpec(PluginContainer pluginContainer, CommandSpec.Builder specBuilder) {
specBuilder.arguments(new PatternMatchingCommandElement(Text.of("type")) {
@Override
protected Iterable<String> getChoices(CommandSource source) {
return Sponge.getGame().getRegistry().getAllOf(ParticleType.class).stream().filter(type -> ((LanternParticleType) type).getInternalType().isPresent()).map(CatalogType::getId).collect(Collectors.toList());
}
@Override
protected Object getValue(String choice) throws IllegalArgumentException {
final Optional<ParticleType> ret = Sponge.getGame().getRegistry().getType(ParticleType.class, choice);
if (!ret.isPresent() || !((LanternParticleType) ret.get()).getInternalType().isPresent()) {
throw new IllegalArgumentException("Invalid input " + choice + " was found");
}
return ret.get();
}
}, GenericArguments2.targetedVector3d(Text.of("position")), // The default value should be 0 for x, y and z
GenericArguments2.vector3d(Text.of("offset"), Vector3d.ZERO), GenericArguments2.doubleNum(Text.of("speed"), 1.0), GenericArguments.optional(GenericArguments2.integer(Text.of("count"), 1)), GenericArguments.optional(new CommandElement(Text.of("mode")) {
@Nullable
@Override
protected Object parseValue(CommandSource source, CommandArgs args) throws ArgumentParseException {
return args.next();
}
@Override
public List<String> complete(CommandSource src, CommandArgs args, CommandContext context) {
Optional<String> arg = args.nextIfPresent();
if (arg.isPresent()) {
return Stream.of("normal", "force").filter(new StartsWithPredicate(arg.get())).collect(Collectors.toList());
}
return Collections.emptyList();
}
}), GenericArguments.optional(GenericArguments.player(Text.of("player"))), GenericArguments.optional(new CommandElement(Text.of("params")) {
@Nullable
@Override
protected Object parseValue(CommandSource source, CommandArgs args) throws ArgumentParseException {
List<Integer> params = new ArrayList<>();
while (args.hasNext()) {
String arg = args.next();
try {
params.add(Integer.parseInt(arg));
} catch (NumberFormatException e) {
throw args.createError(t("Expected an integer, but input '%s' was not", arg));
}
}
return params.stream().mapToInt(i -> i).toArray();
}
@Override
public List<String> complete(CommandSource src, CommandArgs args, CommandContext context) {
return Collections.emptyList();
}
})).executor((src, args) -> {
final LanternParticleType particleType = args.<LanternParticleType>getOne("type").get();
final int particleId = particleType.getInternalType().getAsInt();
final Vector3f position = args.<Vector3d>getOne("position").get().toFloat();
final Vector3f offset = args.<Vector3d>getOne("offset").get().toFloat();
final float speed = args.<Double>getOne("speed").get().floatValue();
final int count = args.<Integer>getOne("count").orElse(1);
final boolean longDistance = args.<String>getOne("mode").map(mode -> mode.equalsIgnoreCase("force")).orElse(false);
final int[] params = args.<int[]>getOne("params").orElse(new int[0]);
final LanternWorld world = CommandHelper.getWorld(src, args);
final int dataLength;
if (particleType == ParticleTypes.BLOCK_CRACK || particleType == ParticleTypes.BLOCK_DUST || particleType == ParticleTypes.FALLING_DUST) {
dataLength = 1;
} else if (particleType == ParticleTypes.ITEM_CRACK) {
dataLength = 2;
} else {
dataLength = 0;
}
if (params.length != dataLength) {
throw new CommandException(t("Invalid parameters (%s), length mismatch (got %s, expected %s) for the particle type %s", Arrays.toString(params), params.length, dataLength, particleType.getId()));
}
final MessagePlayOutSpawnParticle message = new MessagePlayOutSpawnParticle(particleId, position, offset, speed, count, params, longDistance);
if (args.hasAny("player")) {
args.<LanternPlayer>getOne("player").get().getConnection().send(message);
} else {
for (LanternPlayer player : world.getRawPlayers()) {
player.getConnection().send(message);
}
}
src.sendMessage(t("commands.particle.success", particleType.getName(), count));
return CommandResult.success();
});
}
use of org.spongepowered.api.command.args.PatternMatchingCommandElement in project LanternServer by LanternPowered.
the class CommandWeather method completeSpec.
@Override
public void completeSpec(PluginContainer pluginContainer, CommandSpec.Builder specBuilder) {
specBuilder.arguments(GenericArguments.flags().valueFlag(GenericArguments.world(CommandHelper.WORLD_KEY), "-world", "w").buildWith(GenericArguments.none()), new PatternMatchingCommandElement(Text.of("type")) {
@Override
protected Iterable<String> getChoices(CommandSource source) {
Collection<Weather> weathers = Sponge.getRegistry().getAllOf(Weather.class);
ImmutableList.Builder<String> builder = ImmutableList.builder();
for (Weather weather : weathers) {
builder.add(weather.getId());
builder.addAll(((LanternWeather) weather).getAliases());
}
return builder.build();
}
@Override
protected Object getValue(String choice) throws IllegalArgumentException {
final Optional<Weather> optWeather = Sponge.getRegistry().getType(Weather.class, choice);
if (!optWeather.isPresent()) {
return Sponge.getRegistry().getAllOf(Weather.class).stream().filter(weather -> {
for (String alias : ((LanternWeather) weather).getAliases()) {
if (alias.equalsIgnoreCase(choice)) {
return true;
}
}
return false;
}).findAny().orElseThrow(() -> new IllegalArgumentException("Invalid input " + choice + " was found"));
}
return optWeather.get();
}
}, GenericArguments.optional(GenericArguments.integer(Text.of("duration")))).executor((src, args) -> {
LanternWorldProperties world = CommandHelper.getWorldProperties(src, args);
WeatherUniverse weatherUniverse = world.getWorld().get().getWeatherUniverse().orElse(null);
Weather type = args.<Weather>getOne("type").get();
if (weatherUniverse != null) {
if (args.hasAny("duration")) {
weatherUniverse.setWeather(type, args.<Integer>getOne("duration").get() * 20);
} else {
weatherUniverse.setWeather(type);
}
}
src.sendMessage(t("Changing to " + type.getName() + " weather"));
return CommandResult.success();
});
}
use of org.spongepowered.api.command.args.PatternMatchingCommandElement in project LanternServer by LanternPowered.
the class CommandSetData method completeSpec.
@Override
public void completeSpec(PluginContainer pluginContainer, CommandSpec.Builder specBuilder) {
final ThreadLocal<Key<?>> currentKey = new ThreadLocal<>();
specBuilder.arguments(GenericArguments.playerOrSource(Text.of("player")), new PatternMatchingCommandElement(Text.of("key")) {
@Override
protected Iterable<String> getChoices(CommandSource source) {
return Sponge.getGame().getRegistry().getAllOf(Key.class).stream().map(Key::getId).collect(Collectors.toList());
}
@Override
protected Object getValue(String choice) throws IllegalArgumentException {
final Optional<Key> ret = Sponge.getGame().getRegistry().getType(Key.class, choice);
if (!ret.isPresent()) {
throw new IllegalArgumentException("Invalid input " + choice + " was found");
}
currentKey.set(ret.get());
return ret.get();
}
}, new CommandElement(Text.of("data")) {
@Nullable
@Override
protected Object parseValue(CommandSource source, CommandArgs args) throws ArgumentParseException {
args.next();
final String content = args.getRaw().substring(args.getRawPosition()).trim();
while (args.hasNext()) {
args.next();
}
final Object data;
try {
// Don't be too strict
data = JsonDataFormat.read(content, true).orElse(null);
} catch (IOException e) {
throw args.createError(t("Invalid json data: %s\nError: %s", content, e.getMessage()));
}
final Key key = currentKey.get();
final TypeToken<?> typeToken = key.getElementToken();
if (content.isEmpty()) {
return null;
}
final DataTypeSerializer dataTypeSerializer = Lantern.getGame().getDataManager().getTypeSerializer(typeToken).orElse(null);
if (dataTypeSerializer == null) {
throw args.createError(Text.of("Unable to deserialize the data key value: {}, " + "no supported deserializer exists.", key.getId()));
} else {
final DataTypeSerializerContext context = Lantern.getGame().getDataManager().getTypeSerializerContext();
try {
// Put it in a holder object, the command element separates iterable objects
return new ValueHolder(dataTypeSerializer.deserialize(typeToken, context, data));
} catch (InvalidDataException e) {
throw args.createError(t("Invalid data: %s", e.getMessage()));
}
}
}
@Override
public List<String> complete(CommandSource src, CommandArgs args, CommandContext context) {
return new ArrayList<>();
}
}).executor((src, args) -> {
final Player target = args.<Player>getOne("player").get();
final Key key = args.<Key>getOne("key").get();
final Object data = args.<ValueHolder>getOne("data").get().data;
target.offer(key, data);
src.sendMessage(t("Successfully offered the data for the key %s to the player %s", key.getId(), target.getName()));
return CommandResult.success();
});
}
Aggregations