use of org.spongepowered.api.Sponge in project SpongeCommon by SpongePowered.
the class VolumeStreamTest method onGamePreInitialization.
@Listener
public void onGamePreInitialization(final RegisterCommandEvent<Command.Parameterized> event) throws IOException, CommandException {
this.schematicsDir = this.config.resolve("schematics");
Files.createDirectories(this.config);
final Parameter.Value<Biome> biomeKey = Parameter.registryElement(TypeToken.get(Biome.class), ImmutableList.of(VariableValueParameters.RegistryEntryBuilder.WORLD_FROM_LOCATABLE_HOLDER_PROVIDER, VariableValueParameters.RegistryEntryBuilder.WORLD_FROM_CAUSE_HOLDER_PROVIDER), RegistryTypes.BIOME, "minecraft").key("format").build();
event.register(this.plugin, Command.builder().shortDescription(Component.text("Sets the biome in a selected region")).permission(this.plugin.metadata().id() + ".command.setbiome").addParameter(biomeKey).executor(src -> {
if (!(src.cause().root() instanceof ServerPlayer)) {
src.sendMessage(Identity.nil(), Component.text("Player only.", NamedTextColor.RED));
return CommandResult.success();
}
final ServerPlayer player = (ServerPlayer) src.cause().root();
final PlayerData data = VolumeStreamTest.get(player);
if (data.getPos1() == null || data.getPos2() == null) {
player.sendMessage(Identity.nil(), Component.text("You must set both positions before copying", NamedTextColor.RED));
return CommandResult.success();
}
final Vector3i min = data.getPos1().min(data.getPos2());
final Vector3i max = data.getPos1().max(data.getPos2());
final Biome target = src.requireOne(biomeKey);
player.world().biomeStream(min, max, StreamOptions.forceLoadedAndCopied()).map((world, biome, x, y, z) -> target).apply(VolumeCollectors.of(player.world(), VolumePositionTranslators.identity(), VolumeApplicators.applyBiomes()));
return CommandResult.success();
}).build(), "setBiome");
event.register(this.plugin, Command.builder().shortDescription(Component.text("Copies a region of the world to your clipboard")).permission(this.plugin.metadata().id() + ".command.copy").executor(src -> {
if (!(src.cause().root() instanceof Player)) {
src.sendMessage(Identity.nil(), Component.text("Player only.", NamedTextColor.RED));
return CommandResult.success();
}
final Player player = (Player) src.cause().root();
final PlayerData data = VolumeStreamTest.get(player);
if (data.getPos1() == null || data.getPos2() == null) {
player.sendMessage(Identity.nil(), Component.text("You must set both positions before copying", NamedTextColor.RED));
return CommandResult.success();
}
final Vector3i min = data.getPos1().min(data.getPos2());
final Vector3i max = data.getPos1().max(data.getPos2());
data.setOrigin(player.blockPosition());
final ArchetypeVolume archetypeVolume = player.world().createArchetypeVolume(min, max, player.blockPosition());
data.setClipboard(archetypeVolume);
player.sendMessage(Identity.nil(), Component.text("Saved to clipboard.", VolumeStreamTest.GREEN));
return CommandResult.success();
}).build(), "copy");
event.register(this.plugin, Command.builder().shortDescription(Component.text("Pastes your clipboard to where you are standing")).permission(this.plugin.metadata().id() + ".command.paste").executor(src -> {
if (!(src.cause().root() instanceof ServerPlayer)) {
src.sendMessage(Identity.nil(), Component.text("Player only.", NamedTextColor.RED));
return CommandResult.success();
}
final ServerPlayer player = (ServerPlayer) src.cause().root();
final PlayerData data = VolumeStreamTest.get(player);
final ArchetypeVolume volume = data.getClipboard();
if (volume == null) {
player.sendMessage(Identity.nil(), Component.text("You must copy something before pasting", NamedTextColor.RED));
return CommandResult.success();
}
try (final CauseStackManager.StackFrame frame = Sponge.server().causeStackManager().pushCauseFrame()) {
frame.pushCause(this.plugin);
volume.applyToWorld(player.world(), player.blockPosition(), SpawnTypes.PLACEMENT::get);
}
src.sendMessage(Identity.nil(), Component.text("Pasted clipboard into world.", VolumeStreamTest.GREEN));
return CommandResult.success();
}).build(), "paste");
final Parameter.Value<String> fileName = Parameter.string().key("fileName").build();
event.register(this.plugin, Command.builder().shortDescription(Component.text("Pastes your clipboard to where you are standing")).permission(this.plugin.metadata().id() + ".command.paste").addParameter(fileName).executor(src -> {
if (!(src.cause().root() instanceof ServerPlayer)) {
src.sendMessage(Identity.nil(), Component.text("Player only.", NamedTextColor.RED));
return CommandResult.success();
}
final String file = src.requireOne(fileName);
final Path desiredFilePath = this.schematicsDir.resolve(file + VolumeStreamTest.FILE_ENDING);
if (Files.exists(desiredFilePath)) {
throw new CommandException(Component.text(file + " already exists, please delete the file first", NamedTextColor.RED));
}
if (Files.isDirectory(desiredFilePath)) {
throw new CommandException(Component.text(file + "is a directory, please use a file name", NamedTextColor.RED));
}
final ServerPlayer player = (ServerPlayer) src.cause().root();
final PlayerData data = VolumeStreamTest.get(player);
final ArchetypeVolume volume = data.getClipboard();
if (volume == null) {
player.sendMessage(Identity.nil(), Component.text("You must copy something before pasting", NamedTextColor.RED));
return CommandResult.success();
}
final Schematic schematic = Schematic.builder().volume(data.getClipboard()).metaValue(Schematic.METADATA_AUTHOR, player.name()).metaValue(Schematic.METADATA_NAME, file).build();
final DataContainer schematicData = Sponge.dataManager().translator(Schematic.class).orElseThrow(() -> new IllegalStateException("Sponge doesn't have a DataTranslator for Schematics!")).translate(schematic);
try {
final Path output = Files.createFile(desiredFilePath);
DataFormats.NBT.get().writeTo(new GZIPOutputStream(Files.newOutputStream(output)), schematicData);
player.sendMessage(Identity.nil(), Component.text("Saved schematic to " + output.toAbsolutePath(), VolumeStreamTest.SAVE));
} catch (final Exception e) {
e.printStackTrace();
final StringWriter writer = new StringWriter();
e.printStackTrace(new PrintWriter(writer));
final Component errorText = Component.text(writer.toString().replace("\t", " ").replace("\r\n", "\n").replace("\r", "\n"));
final TextComponent text = Component.text("Error saving schematic: " + e.getMessage(), NamedTextColor.RED).hoverEvent(HoverEvent.showText(errorText));
return CommandResult.builder().error(text).build();
}
return CommandResult.success();
}).build(), "save");
event.register(this.plugin, Command.builder().shortDescription(Component.text("Load a schematic from file")).permission(this.plugin.metadata().id() + ".command.load").addParameter(fileName).executor(src -> {
if (!(src.cause().root() instanceof ServerPlayer)) {
src.sendMessage(Identity.nil(), Component.text("Player only.", NamedTextColor.RED));
return CommandResult.success();
}
final ServerPlayer player = (ServerPlayer) src.cause().root();
final String file = src.requireOne(fileName);
final Path desiredFilePath = this.schematicsDir.resolve(file + VolumeStreamTest.FILE_ENDING);
if (!Files.isRegularFile(desiredFilePath)) {
throw new CommandException(Component.text("File " + file + " was not a normal schemaic file"));
}
final Schematic schematic;
final DataContainer schematicContainer;
try (final GZIPInputStream stream = new GZIPInputStream(Files.newInputStream(desiredFilePath))) {
schematicContainer = DataFormats.NBT.get().readFrom(stream);
} catch (IOException e) {
e.printStackTrace();
final StringWriter writer = new StringWriter();
e.printStackTrace(new PrintWriter(writer));
final Component errorText = Component.text(writer.toString().replace("\t", " ").replace("\r\n", "\n").replace("\r", "\n"));
final TextComponent text = Component.text("Error loading schematic: " + e.getMessage(), NamedTextColor.RED).hoverEvent(HoverEvent.showText(errorText));
return CommandResult.builder().error(text).build();
}
schematic = Sponge.dataManager().translator(Schematic.class).orElseThrow(() -> new IllegalStateException("Expected a DataTranslator for a Schematic")).translate(schematicContainer);
src.sendMessage(Identity.nil(), Component.text("Loaded schematic from " + file, TextColor.color(0x003434)));
final PlayerData data = VolumeStreamTest.get(player);
data.setClipboard(schematic);
data.setOrigin(player.blockPosition());
return CommandResult.success();
}).build(), "load");
final Parameter.Value<Rotation> rotation = Parameter.registryElement(TypeToken.get(Rotation.class), RegistryTypes.ROTATION).key("rotation").build();
event.register(this.plugin, Command.builder().shortDescription(Component.text("Rotate clipboard")).permission(this.plugin.metadata().id() + ".command.rotate").addParameter(rotation).executor(src -> {
if (!(src.cause().root() instanceof ServerPlayer)) {
src.sendMessage(Identity.nil(), Component.text("Player only.", NamedTextColor.RED));
return CommandResult.success();
}
final ServerPlayer player = (ServerPlayer) src.cause().root();
final Rotation desiredRotation = src.requireOne(rotation);
final Schematic schematic;
final PlayerData data = VolumeStreamTest.get(player);
if (data.clipboard == null) {
throw new CommandException(Component.text("Load a clipboard first before trying to rotate it"));
}
final ArchetypeVolume newClipboard = data.clipboard.transform(Transformation.builder().origin(data.clipboard.min().toDouble().add(data.clipboard.size().toDouble().div(2))).rotate(desiredRotation).build());
src.sendMessage(Identity.nil(), Component.text("Rotated clipboard " + desiredRotation.angle().degrees() + " degrees"));
data.setClipboard(newClipboard);
return CommandResult.success();
}).build(), "rotate");
}
use of org.spongepowered.api.Sponge in project SpongeCommon by SpongePowered.
the class SpongePlaceholderContextBuilder method associatedObject.
@Override
@SuppressWarnings("unchecked")
public PlaceholderContext.Builder associatedObject(@Nullable final Object associatedObject) {
if (associatedObject == null) {
this.associatedObjectSupplier = null;
} else if (associatedObject instanceof Supplier) {
return this.associatedObject((Supplier<Object>) associatedObject);
} else if (associatedObject instanceof SystemSubject) {
this.associatedObjectSupplier = Sponge::systemSubject;
} else if (associatedObject instanceof Server) {
this.associatedObjectSupplier = Sponge::server;
} else if (associatedObject instanceof Player) {
return this.associatedObject((Player) associatedObject);
} else if (associatedObject instanceof ServerWorld) {
final ResourceKey key = ((ServerWorld) associatedObject).key();
this.associatedObjectSupplier = () -> SpongeCommon.game().server().worldManager().world(key).orElse(null);
} else if (associatedObject instanceof Entity) {
final Entity entity = ((Entity) associatedObject);
final ResourceKey key = entity.serverLocation().world().key();
final UUID entityUuid = ((Entity) associatedObject).uniqueId();
this.associatedObjectSupplier = () -> SpongeCommon.game().server().worldManager().world(key).flatMap(x -> x.entity(entityUuid)).orElse(null);
} else {
// We create a weak reference here so we don't hold on to game objects.
final WeakReference<Object> objectWeakReference = new WeakReference<>(associatedObject);
this.associatedObjectSupplier = objectWeakReference::get;
}
return this;
}
use of org.spongepowered.api.Sponge in project SpongeCommon by SpongePowered.
the class CommandTest method onRegisterSpongeCommand.
@Listener
public void onRegisterSpongeCommand(final RegisterCommandEvent<Command.Parameterized> event) {
final Parameter.Value<ServerPlayer> playerKey = Parameter.player().key("player").usage(key -> "[any player]").build();
event.register(this.plugin, Command.builder().addParameter(playerKey).executor(context -> {
final ServerPlayer player = context.one(playerKey).orElse(context.cause().root() instanceof ServerPlayer ? ((ServerPlayer) context.cause().root()) : null);
this.logger.info(player.name());
return CommandResult.success();
}).build(), "getplayer");
final Parameter.Value<String> playerParameterKey = Parameter.string().key("name").optional().build();
event.register(this.plugin, Command.builder().addParameter(playerParameterKey).executor(context -> {
final Optional<String> result = context.one(playerParameterKey);
final Collection<GameProfile> collection;
if (result.isPresent()) {
// check to see if the string matches
collection = Sponge.game().server().userManager().streamOfMatches(result.get().toLowerCase(Locale.ROOT)).collect(Collectors.toList());
} else {
collection = Sponge.game().server().userManager().streamAll().collect(Collectors.toList());
}
collection.forEach(x -> this.logger.info("GameProfile - UUID: {}, Name - {}", x.uniqueId().toString(), x.name().orElse("---")));
return CommandResult.success();
}).build(), "checkuser");
final Parameter.Value<String> choicesKey = Parameter.choices("bacon", "eggs", "spam", "spam spam spam").key("choices").build();
event.register(this.plugin, Command.builder().addParameter(choicesKey).executor(context -> {
context.sendMessage(Identity.nil(), Component.text(context.requireOne(choicesKey)));
return CommandResult.success();
}).build(), "testchoices");
final Parameter.Key<String> testKey = Parameter.key("testKey", String.class);
final Parameter.Key<Component> requiredKey = Parameter.key("requiredKey", Component.class);
event.register(this.plugin, Command.builder().addFlag(Flag.builder().alias("f").alias("flag").build()).addFlag(Flag.builder().alias("t").alias("text").setParameter(Parameter.string().key(testKey).build()).build()).addParameter(Parameter.formattingCodeText().key(requiredKey).build()).executor(context -> {
context.sendMessage(Identity.nil(), Component.text(context.flagInvocationCount("flag")));
context.sendMessage(Identity.nil(), Component.text(context.flagInvocationCount("t")));
context.all(testKey).forEach(x -> context.sendMessage(Identity.nil(), Component.text(x)));
context.sendMessage(Identity.nil(), context.requireOne(requiredKey));
return CommandResult.success();
}).build(), "flagtest");
event.register(this.plugin, Command.builder().addFlag(Flag.builder().alias("t").alias("text").setParameter(Parameter.string().key(testKey).build()).build()).addParameter(Parameter.formattingCodeText().key(requiredKey).build()).executor(context -> {
context.sendMessage(Identity.nil(), Component.text("optional_test"));
context.sendMessage(Identity.nil(), Component.text(context.flagInvocationCount("t")));
context.all(testKey).forEach(x -> context.sendMessage(Identity.nil(), Component.text(x)));
context.sendMessage(Identity.nil(), context.requireOne(requiredKey));
return CommandResult.success();
}).build(), "optionalflagtest");
event.register(this.plugin, Command.builder().executor(x -> {
x.sendMessage(Identity.nil(), Component.text().content("Click Me").clickEvent(SpongeComponents.executeCallback(ctx -> ctx.sendMessage(Identity.nil(), Component.text("Hello")))).build());
return CommandResult.success();
}).build(), "testCallback");
event.register(this.plugin, Command.builder().executor(x -> {
final Collection<Entity> collection = Selector.builder().applySelectorType(SelectorTypes.ALL_ENTITIES.get()).addEntityType(EntityTypes.PLAYER.get(), false).addGameMode(GameModes.CREATIVE.get()).limit(1).includeSelf().build().select(x.cause());
for (final Entity entity : collection) {
x.sendMessage(Identity.nil(), Component.text(entity.toString()));
}
return CommandResult.success();
}).build(), "testselector");
final Parameter.Key<ServerLocation> serverLocationKey = Parameter.key("serverLocation", ServerLocation.class);
final Parameter.Value<ServerLocation> serverLocationParameter = Parameter.location().key(serverLocationKey).build();
event.register(this.plugin, Command.builder().addParameter(serverLocationParameter).executor(x -> {
x.sendMessage(Identity.nil(), Component.text(x.requireOne(serverLocationKey).toString()));
return CommandResult.success();
}).build(), "testlocation");
final Parameter.Key<ValueParameter<?>> commandParameterKey = Parameter.key("valueParameter", new TypeToken<ValueParameter<?>>() {
});
final TypeToken<ValueParameter<?>> typeToken = new TypeToken<ValueParameter<?>>() {
};
event.register(this.plugin, Command.builder().addParameter(serverLocationParameter).addParameter(Parameter.registryElement(typeToken, commandContext -> Sponge.game(), RegistryTypes.REGISTRY_KEYED_VALUE_PARAMETER, "sponge").key(commandParameterKey).build()).executor(x -> {
x.sendMessage(Identity.nil(), Component.text(x.requireOne(serverLocationKey).toString()));
x.sendMessage(Identity.nil(), Component.text(x.requireOne(commandParameterKey).toString()));
return CommandResult.success();
}).build(), "testcatalogcompletion");
final Parameter.Key<TestEnum> enumParameterKey = Parameter.key("enum", TestEnum.class);
final Parameter.Key<String> stringKey = Parameter.key("stringKey", String.class);
event.register(this.plugin, Command.builder().addParameter(Parameter.enumValue(TestEnum.class).key(enumParameterKey).build()).addParameter(Parameter.string().key(stringKey).completer((context, currentInput) -> Arrays.asList("bacon", "eggs", "spam").stream().map(CommandCompletion::of).collect(Collectors.toList())).build()).executor(x -> {
x.sendMessage(Identity.nil(), Component.text(x.one(enumParameterKey).orElse(TestEnum.ONE).name()));
return CommandResult.success();
}).build(), "testenum");
final Parameter.Key<ResourceKey> resourceKeyKey = Parameter.key("rk", ResourceKey.class);
event.register(this.plugin, Command.builder().addParameter(Parameter.resourceKey().key(resourceKeyKey).build()).executor(x -> {
x.sendMessage(Identity.nil(), Component.text(x.requireOne(resourceKeyKey).formatted()));
return CommandResult.success();
}).build(), "testrk");
final Parameter.Key<UUID> userKey = Parameter.key("user", UUID.class);
event.register(this.plugin, Command.builder().addParameter(Parameter.user().key(userKey).build()).executor(context -> {
Sponge.server().userManager().load(context.requireOne(userKey)).thenAcceptAsync(x -> context.sendMessage(Identity.nil(), Component.text(x.map(User::name).orElse("unknown"))), Sponge.server().scheduler().executor(this.plugin));
return CommandResult.success();
}).build(), "getuser");
final Parameter.Key<String> stringLiteralKey = Parameter.key("literal", String.class);
event.register(this.plugin, Command.builder().executor(context -> {
context.sendMessage(Identity.nil(), Component.text("Collected literals: " + String.join(", ", context.all(stringLiteralKey))));
return CommandResult.success();
}).terminal(true).addParameter(Parameter.firstOfBuilder(Parameter.literal(String.class, "1", "1").key(stringLiteralKey).build()).or(Parameter.literal(String.class, "2", "2").key(stringLiteralKey).build()).terminal().build()).addParameter(Parameter.seqBuilder(Parameter.literal(String.class, "3", "3").key(stringLiteralKey).build()).then(Parameter.literal(String.class, "4", "4").key(stringLiteralKey).build()).terminal().build()).addParameter(Parameter.literal(String.class, "5", "5").optional().key(stringLiteralKey).build()).addParameter(Parameter.literal(String.class, "6", "6").key(stringLiteralKey).build()).build(), "testnesting");
final Parameter.Value<SystemSubject> systemSubjectValue = Parameter.builder(SystemSubject.class).key("systemsubject").addParser(VariableValueParameters.literalBuilder(SystemSubject.class).literal(Collections.singleton("-")).returnValue(Sponge::systemSubject).build()).build();
event.register(this.plugin, Command.builder().addParameter(Parameter.firstOf(systemSubjectValue, CommonParameters.PLAYER)).addParameter(Parameter.remainingJoinedStrings().key(stringKey).build()).executor(context -> {
final Audience audience;
final String name;
if (context.hasAny(systemSubjectValue)) {
audience = context.requireOne(systemSubjectValue);
name = "Console";
} else {
final ServerPlayer player = context.requireOne(CommonParameters.PLAYER);
name = player.name();
audience = player;
}
final String message = context.requireOne(stringKey);
context.sendMessage(Identity.nil(), Component.text("To " + name + "> " + message));
final Object root = context.cause().root();
final Identity identity = root instanceof ServerPlayer ? ((ServerPlayer) root).identity() : Identity.nil();
audience.sendMessage(identity, Component.text("From " + name + "> " + message));
return CommandResult.success();
}).build(), "testmessage");
event.register(this.plugin, Command.builder().addParameter(CommonParameters.BOOLEAN).executor(ctx -> {
if (ctx.requireOne(CommonParameters.BOOLEAN)) {
// custom error
return CommandResult.error(Component.text("custom error"));
}
return CommandResult.builder().error(null).build();
}).build(), "errormessage");
final Command.Builder builder = Command.builder();
final ValueCompleter stringValueCompleter = (c, s) -> s.isEmpty() ? Collections.singletonList(CommandCompletion.of("x")) : Arrays.asList(s, s + "bar", "foo_" + s).stream().map(CommandCompletion::of).collect(Collectors.toList());
// final ValueCompleter stringValueCompleter = null;
final Parameter.Value<String> r_opt = Parameter.remainingJoinedStrings().key("r_def").optional().build();
final Parameter.Value<String> r_req = Parameter.remainingJoinedStrings().key("r_req").completer(stringValueCompleter).build();
final Parameter.Value<String> opt1 = Parameter.string().optional().key("opt1").build();
final Parameter.Value<String> opt2 = Parameter.string().optional().key("opt2").build();
final Parameter.Value<String> topt = Parameter.string().optional().key("topt").terminal().build();
final Parameter.Value<String> req1 = Parameter.string().key("req1").completer(stringValueCompleter).build();
final Parameter.Value<String> req2 = Parameter.string().key("req2").build();
final Parameter.Value<Boolean> lit1 = Parameter.literal(Boolean.class, true, "lit1").key("lit1").build();
final Parameter.Value<Boolean> lit2 = Parameter.literal(Boolean.class, true, "lit2").key("lit2").build();
final Parameter optSeq_lit_req1 = Parameter.seqBuilder(lit1).then(req1).optional().build();
final Parameter optSeq_lit_req2 = Parameter.seqBuilder(lit2).then(req2).optional().build();
final Parameter seq_req_2 = Parameter.seqBuilder(req1).then(req2).build();
final Parameter seq_opt_2 = Parameter.seqBuilder(opt1).then(opt2).build();
final Parameter seq_opt_2_req = Parameter.seqBuilder(opt1).then(opt2).then(req1).build();
// <req1>
builder.addChild(Command.builder().executor(context -> CommandTest.printParameters(context, req1)).addParameter(req1).build(), "required");
// subcommand|<r_def>
builder.addChild(Command.builder().executor(context -> CommandTest.printParameters(context, r_opt)).addParameter(r_opt).addChild(Command.builder().executor(c -> CommandTest.printParameters(c, r_opt)).build(), "subcommand").build(), "optional_or_subcmd");
// https://bugs.mojang.com/browse/MC-165562 usage does not show up after a space if there are no completions
// [def1] <r_req>
// TODO missing executed command when only providing a single value
builder.addChild(Command.builder().executor(context -> CommandTest.printParameters(context, opt1, r_req)).addParameters(opt1, r_req).build(), "optional_r_required");
// [opt1] [opt2] <r_req>
// TODO missing executed command when only providing a single value
builder.addChild(Command.builder().executor(context -> CommandTest.printParameters(context, opt1, opt2, r_req)).addParameters(opt1, opt2, r_req).build(), "optional_optional_required");
// [opt1] [opt2]
// TODO some redundancy in generated nodes because opt1 node can terminate early
builder.addChild(Command.builder().executor(context -> CommandTest.printParameters(context, opt1, opt2)).addParameters(opt1, opt2).build(), "optional_optional");
// [opt1] [literal <req1>]
// TODO completion does not include req1 when opt1/literal is ambigous
builder.addChild(Command.builder().executor(c -> CommandTest.printParameters(c, opt1, lit1, req1)).addParameters(opt1, optSeq_lit_req1).build(), "optional_optsequence_literal_required");
// [literal <req1>] [literal2 <req2>]
// TODO sequences are not optional
builder.addChild(Command.builder().executor(c -> CommandTest.printParameters(c, lit1, req1, lit2, req2)).addParameters(optSeq_lit_req1, optSeq_lit_req2).build(), "opt_sequence_2_literal_required");
// <<req1> <req2>>
builder.addChild(Command.builder().executor(c -> CommandTest.printParameters(c, req1, req2)).addParameters(seq_req_2).build(), "seq_required_required");
// <[opt1] [opt2]>
// TODO some redundancy in generated nodes because opt1 node can terminate early
builder.addChild(Command.builder().executor(c -> CommandTest.printParameters(c, opt1, opt2)).addParameters(seq_opt_2).build(), "seq_optional_optional");
// <[opt1] [opt2] <req>>
builder.addChild(Command.builder().executor(c -> CommandTest.printParameters(c, opt1, opt2, req1)).addParameters(seq_opt_2_req).build(), "seq_optional_optional_required");
// [opt1] <req> [opt2]
// TODO some redundancy in generated nodes because req1 node can terminate early
builder.addChild(Command.builder().executor(c -> CommandTest.printParameters(c, opt1, req1, opt2)).addParameters(opt1, req1, opt2).build(), "optional_required_optional");
// [opt1] [topt] !terminal
// or
// [opt1] [topt] <req1>
builder.addChild(Command.builder().executor(c -> CommandTest.printParameters(c, opt1, topt, req1)).addParameters(opt1, topt, req1).build(), "optional_toptional_optional");
event.register(this.plugin, builder.build(), "testcommand", "testcmd");
// Adapted from https://github.com/SpongePowered/Sponge/issues/3238#issuecomment-750456173
final Command.Parameterized firstSub = Command.builder().addParameter(CommonParameters.BOOLEAN).executor(c -> {
c.sendMessage(Identity.nil(), Component.text("first"));
return CommandResult.success();
}).build();
final Command.Parameterized secondSub = Command.builder().addParameter(CommonParameters.BOOLEAN).executor(c -> {
c.sendMessage(Identity.nil(), Component.text("second"));
return CommandResult.success();
}).build();
final Command.Parameterized parent = Command.builder().executor(c -> {
c.sendMessage(Identity.nil(), Component.text("parent"));
return CommandResult.success();
}).addParameters(CommonParameters.WORLD).addParameters(Parameter.firstOf(Parameter.subcommand(firstSub, "first"), Parameter.subcommand(secondSub, "second"))).terminal(true).build();
event.register(this.plugin, parent, "testterminal");
// exceptions
event.register(this.plugin, Command.builder().shortDescription(Component.text("test throwing execptions")).addChild(Command.builder().executor(ctx -> {
throw new CommandException(Component.text("Exit via exception"));
}).build(), "exception").addChild(Command.builder().executor(ctx -> {
return CommandResult.error(Component.text("Exit via failed result"));
}).build(), "failedresult").build(), "testfailure");
event.register(this.plugin, Command.builder().addParameter(Parameter.enumValue(TestEnum.class).modifier(new ValueParameterModifier<TestEnum>() {
@Override
@NotNull
public Optional<? extends TestEnum> modifyResult(final Parameter.@NotNull Key<? super TestEnum> parameterKey, final ArgumentReader.@NotNull Immutable reader, final CommandContext.@NotNull Builder context, @Nullable final TestEnum value) throws ArgumentParseException {
if (value == TestEnum.THREE) {
throw reader.createException(Component.text("Can't select three!"));
}
return Optional.ofNullable(value);
}
@Override
public List<CommandCompletion> modifyCompletion(@NotNull final CommandContext context, @NotNull final String currentInput, final List<CommandCompletion> completions) {
return completions.stream().filter(x -> !x.completion().equalsIgnoreCase(TestEnum.THREE.name())).collect(Collectors.toList());
}
@Override
@Nullable
public Component modifyExceptionMessage(@Nullable final Component exceptionMessage) {
if (exceptionMessage == null) {
return null;
}
return exceptionMessage.replaceText(builder -> {
builder.match(", three").replacement("").once();
});
}
}).key(enumParameterKey).build()).executor(x -> {
x.sendMessage(Identity.nil(), Component.text(x.one(enumParameterKey).orElse(TestEnum.ONE).name()));
return CommandResult.success();
}).build(), "testenummodified");
final Parameter.Value<String> testString = Parameter.string().key("string").build();
final Parameter.Value<Component> jsonTextParameter = Parameter.jsonText().key("text").build();
event.register(this.plugin, Command.builder().addParameter(jsonTextParameter).addParameter(testString).executor(ctx -> {
ctx.sendMessage(Identity.nil(), ctx.requireOne(jsonTextParameter));
ctx.sendMessage(Identity.nil(), Component.text(ctx.requireOne(testString)));
return CommandResult.success();
}).build(), "testcomponentjson");
final Parameter.Value<Integer> firstIntParameter = Parameter.integerNumber().key("int1").build();
final Parameter.Value<Integer> secondIntParameter = Parameter.integerNumber().key("int2").build();
final Parameter.Value<Operator> operatorParameter = Parameter.operator().key("operator").build();
event.register(this.plugin, Command.builder().addParameter(firstIntParameter).addParameter(operatorParameter).addParameter(secondIntParameter).executor(ctx -> {
final int first = ctx.requireOne(firstIntParameter);
final int second = ctx.requireOne(secondIntParameter);
final Operator operator = ctx.requireOne(operatorParameter);
ctx.sendMessage(Identity.nil(), Component.text(first));
ctx.sendMessage(Identity.nil(), RegistryTypes.OPERATOR.get().findValueKey(operator).map(key -> Component.text(key.asString())).orElse(Component.text("Not set")));
ctx.sendMessage(Identity.nil(), Component.text(second));
if (operator instanceof Operator.Simple) {
ctx.sendMessage(Identity.nil(), Component.text(((Operator.Simple) operator).apply(first, second)));
}
return CommandResult.success();
}).build(), "testoperator");
final Parameter.Value<Color> colorParameter = Parameter.color().key("color").build();
event.register(this.plugin, Command.builder().addParameter(colorParameter).executor(ctx -> {
final Color color = ctx.requireOne(colorParameter);
final TextColor textColor = TextColor.color(color);
final String colorString = color.toString();
ctx.sendMessage(Identity.nil(), Component.text().color(textColor).content(colorString).build());
return CommandResult.success();
}).build(), "textcolor");
final Parameter.Value<Integer> rangedInt1 = Parameter.rangedInteger(1, Integer.MAX_VALUE).key("quantity").build();
event.register(this.plugin, Command.builder().addParameter(Parameter.firstOf(playerKey, Parameter.user().key(userKey).build())).addParameter(choicesKey).addParameter(rangedInt1).executor(ctx -> {
if (ctx.hasAny(playerKey)) {
ctx.sendMessage(Identity.nil(), Component.text(ctx.requireOne(playerKey).name()));
} else {
ctx.sendMessage(Identity.nil(), Component.text(ctx.requireOne(userKey).toString()));
}
ctx.sendMessage(Identity.nil(), Component.text(ctx.requireOne(choicesKey)));
ctx.sendMessage(Identity.nil(), Component.text(ctx.requireOne(rangedInt1)));
return CommandResult.success();
}).build(), "firstoftest");
}
use of org.spongepowered.api.Sponge in project SpongeCommon by SpongePowered.
the class ServerLoginPacketListenerImplMixin method handleAcceptedLogin.
/**
* @author morph - April 27th, 2021
* @author dualspiral - July 17th, 2021
*
* @reason support async ban/whitelist service and user->player syncing.
*/
@Overwrite
public void handleAcceptedLogin() {
if (!this.gameProfile.isComplete()) {
this.gameProfile = this.shadow$createFakeProfile(this.gameProfile);
}
// Sponge start - avoid #tick calling handleAcceptedLogin more than once.
if (this.impl$accepted) {
return;
}
this.impl$accepted = true;
final PlayerList playerList = this.server.getPlayerList();
// Sponge end
// Sponge start - completable future
((PlayerListBridge) playerList).bridge$canPlayerLogin(this.connection.getRemoteAddress(), this.gameProfile).handle((componentOpt, throwable) -> {
if (throwable != null) {
// An error occurred during login checks so we ask to abort.
((ConnectionBridge) this.connection).bridge$setKickReason(new TextComponent("An error occurred checking ban/whitelist status."));
SpongeCommon.logger().error("An error occurred when checking the ban/whitelist status of {}.", this.gameProfile.getId().toString());
SpongeCommon.logger().error(throwable);
} else if (componentOpt != null) {
// We handle this later
((ConnectionBridge) this.connection).bridge$setKickReason(componentOpt);
}
try {
((SpongeServer) SpongeCommon.server()).userManager().handlePlayerLogin(this.gameProfile);
} catch (final IOException e) {
throw new CompletionException(e);
}
return null;
}).handleAsync((ignored, throwable) -> {
if (throwable != null) {
// We're just going to disconnect here, because something went horribly wrong.
if (throwable instanceof CompletionException) {
throw (CompletionException) throwable;
} else {
throw new CompletionException(throwable);
}
}
// Sponge end
this.state = ServerLoginPacketListenerImpl.State.ACCEPTED;
if (this.server.getCompressionThreshold() >= 0 && !this.connection.isMemoryConnection()) {
this.connection.send(new ClientboundLoginCompressionPacket(this.server.getCompressionThreshold()), (param0) -> this.connection.setupCompression(this.server.getCompressionThreshold()));
}
this.connection.send(new ClientboundGameProfilePacket(this.gameProfile));
final ServerPlayer var1 = this.server.getPlayerList().getPlayer(this.gameProfile.getId());
if (var1 != null) {
this.state = ServerLoginPacketListenerImpl.State.DELAY_ACCEPT;
this.delayedAcceptPlayer = this.server.getPlayerList().getPlayerForLogin(this.gameProfile);
} else {
// Sponge start - Also send the channel registrations using the minecraft channel, for compatibility
final ServerSideConnection connection = (ServerSideConnection) this;
((SpongeChannelManager) Sponge.channelManager()).sendChannelRegistrations(connection);
try {
this.server.getPlayerList().placeNewPlayer(this.connection, this.server.getPlayerList().getPlayerForLogin(this.gameProfile));
// invalidate just to be sure there is no user cached for the online player anymore
Sponge.server().userManager().removeFromCache(this.gameProfile.getId());
} catch (final Exception e) {
throw new RuntimeException(e);
}
}
return null;
}, SpongeCommon.server()).exceptionally(throwable -> {
// If a throwable exists, we're just going to disconnect the user, better than leaving them in limbo.
if (throwable != null) {
this.impl$disconnectError(throwable, this.state == ServerLoginPacketListenerImpl.State.ACCEPTED || this.state == ServerLoginPacketListenerImpl.State.READY_TO_ACCEPT);
}
return null;
// Sponge End
});
}
use of org.spongepowered.api.Sponge in project SpongeCommon by SpongePowered.
the class TimingsExport method reportTimings.
/**
* Builds an XML report of the timings to be uploaded for parsing.
*
* @param sender Who to report to
*/
static void reportTimings(CommandSource sender) {
Platform platform = SpongeImpl.getGame().getPlatform();
JsonObjectBuilder builder = JSONUtil.objectBuilder().add("version", platform.getContainer(IMPLEMENTATION).getVersion().orElse(platform.getMinecraftVersion().getName() + "-DEV")).add("maxplayers", SpongeImpl.getGame().getServer().getMaxPlayers()).add("start", TimingsManager.timingStart / 1000).add("end", System.currentTimeMillis() / 1000).add("sampletime", (System.currentTimeMillis() - TimingsManager.timingStart) / 1000);
if (!TimingsManager.privacy) {
builder.add("server", getServerName()).add("motd", Sponge.getServer().getMotd().toPlain()).add("online-mode", Sponge.getServer().getOnlineMode()).add("icon", SpongeImpl.getServer().getServerStatusResponse().getFavicon());
}
final Runtime runtime = Runtime.getRuntime();
RuntimeMXBean runtimeBean = ManagementFactory.getRuntimeMXBean();
builder.add("system", JSONUtil.objectBuilder().add("timingcost", getCost()).add("name", System.getProperty("os.name")).add("version", System.getProperty("os.version")).add("jvmversion", System.getProperty("java.version")).add("arch", System.getProperty("os.arch")).add("maxmem", runtime.maxMemory()).add("cpu", runtime.availableProcessors()).add("runtime", ManagementFactory.getRuntimeMXBean().getUptime()).add("flags", RUNTIME_FLAG_JOINER.join(runtimeBean.getInputArguments())).add("gc", JSONUtil.mapArrayToObject(ManagementFactory.getGarbageCollectorMXBeans(), (input) -> {
return JSONUtil.singleObjectPair(input.getName(), JSONUtil.arrayOf(input.getCollectionCount(), input.getCollectionTime()));
})));
Set<BlockType> blockTypeSet = Sets.newHashSet();
Set<EntityType> entityTypeSet = Sets.newHashSet();
int size = HISTORY.size();
TimingHistory[] history = new TimingHistory[size + 1];
int i = 0;
for (TimingHistory timingHistory : HISTORY) {
blockTypeSet.addAll(timingHistory.blockTypeSet);
entityTypeSet.addAll(timingHistory.entityTypeSet);
history[i++] = timingHistory;
}
// Current snapshot
history[i] = new TimingHistory();
blockTypeSet.addAll(history[i].blockTypeSet);
entityTypeSet.addAll(history[i].entityTypeSet);
JsonObjectBuilder handlersBuilder = JSONUtil.objectBuilder();
for (TimingIdentifier.TimingGroup group : TimingIdentifier.GROUP_MAP.values()) {
for (TimingHandler id : group.handlers) {
if (!id.timed && !id.isSpecial()) {
continue;
}
handlersBuilder.add(id.id, JSONUtil.arrayOf(group.id, id.name));
}
}
builder.add("idmap", JSONUtil.objectBuilder().add("groups", JSONUtil.mapArrayToObject(TimingIdentifier.GROUP_MAP.values(), (group) -> {
return JSONUtil.singleObjectPair(group.id, group.name);
})).add("handlers", handlersBuilder).add("worlds", JSONUtil.mapArrayToObject(TimingHistory.worldMap.entrySet(), (entry) -> {
return JSONUtil.singleObjectPair(entry.getValue(), entry.getKey());
})).add("tileentity", JSONUtil.mapArrayToObject(blockTypeSet, (blockType) -> {
return JSONUtil.singleObjectPair(Block.getIdFromBlock((Block) blockType), blockType.getId());
})).add("entity", JSONUtil.mapArrayToObject(entityTypeSet, (entityType) -> {
if (entityType == EntityTypes.UNKNOWN) {
return null;
}
return JSONUtil.singleObjectPair(TimingsPls.getEntityId(entityType), entityType.getId());
})));
// Information about loaded plugins
builder.add("plugins", JSONUtil.mapArrayToObject(SpongeImpl.getGame().getPluginManager().getPlugins(), (plugin) -> {
return JSONUtil.objectBuilder().add(plugin.getId(), JSONUtil.objectBuilder().add("version", plugin.getVersion().orElse("")).add("description", plugin.getDescription().orElse("")).add("website", plugin.getUrl().orElse("")).add("authors", AUTHOR_LIST_JOINER.join(plugin.getAuthors()))).build();
}));
// Information on the users Config
builder.add("config", JSONUtil.objectBuilder().add("sponge", serializeConfigNode(SpongeImpl.getGlobalConfig().getRootNode())));
new TimingsExport(sender, builder.build(), history).start();
}
Aggregations